ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
23 ноября
762683 Топик полностью
Гудвин, волшебник (15.06.2017 11:33 - 12:11, просмотров: 236) ответил Лагунов на а как реально это будет выглядеть? С точки зрения модема - какими командами? А на том конце сервер - какой? Детские вопросы, но я тоже на распутье - надо уходить от СМС. Email требует SSL. Не всякий модем поддерживает.
С UDP есть конечно закавыка - необходим сервер с белым IP. Недавно экспериментировал и тут задавал вопросы насчет "облачной машины". Завел таковую на Vscale занедорого (linux). Накропал вот такую тестовую шнягу на ЦЭ, слушающюю определенный UDP порт и посылающую подтверждение приема. В модеме устанавливаем UDP соединение, шлем данные, принимаем ответы... Например для копеешного "Neoway M590" за 90 руб на ALI: // устанавливаем параметры UDP соединения: AT+UDPSETUP=1,78.155.219.245,777$0D // IP адрес, порт // Посылаем 10 байт данных at+udpsend=1,10$0D 1234567890$0D //... ждем ответа //Закрываем UDP соединение AT+UDPCLOSE=1$0D Гарантий доставки при UDP никаких, зато трафик полностью под контролем. В отличии от TCP. Фуй его знает, что там напосылает встроенный TCP стек модема, совокупленный с сетями опсосов и пр. тырнета. А тут не дождался ответа за определенное время, сам решаешь - отослать заново, или дело швах - попробовать позже... Шняга на сервере: #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <string.h> #include <stdio.h> #include <errno.h> #include <unistd.h> #include <stdlib.h> #define BUF_LEN 2000 int main() { int sockfd; // Дескриптор сокета int clilen, n; // Переменные для различных длин и количества символов char line[BUF_LEN]; // Массив для принятой и отсылаемой строки struct sockaddr_in servaddr, cliaddr; // Структуры для адресов сервера и клиента // Заполняем структуру для адреса сервера: семейство протоколов TCP/IP, сетевой интерфейс – любой, номер порта //51000. Поскольку в структуре содержится дополнительное не //нужное нам поле, которое должно быть нулевым, перед //заполнением обнуляем ее всю bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_port = htons(777); servaddr.sin_addr.s_addr = htonl(INADDR_ANY); // Создаем UDP сокет if((sockfd = socket(PF_INET, SOCK_DGRAM, 0)) < 0){ perror(NULL); // Печатаем сообщение об ошибке exit(1); } // Bind сокет if(bind(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0){ perror(NULL); close(sockfd); exit(1); } printf("Server started \r\n"); while(1) { // Основной цикл обслуживания // В переменную clilen заносим максимальную длину для ожидаемого адреса клиента clilen = sizeof(cliaddr); // Ожидаем прихода запроса от клиента и читаем его. Максимальная допустимая длина датаграммы – 1999 // символов, адрес отправителя помещаем в структуру cliaddr, его реальная длина будет занесена в переменную clilen if((n = recvfrom(sockfd, line, BUF_LEN, 0,(struct sockaddr *) &cliaddr, &clilen)) < 0){ perror(NULL); close(sockfd); exit(1); } line[n] = 0; // Печатаем принятый текст на экране printf("%s %d [%s] \n", line, n, inet_ntoa(cliaddr.sin_addr)); // Принятый текст отправляем обратно по адресу отправителя if(sendto(sockfd, line, strlen(line), 0,(struct sockaddr *) &cliaddr, clilen) < 0){ perror(NULL); close(sockfd); exit(1); } } return 0; }