Гудвин, волшебник (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;
}