Сообщение HTTP через GPRS (SIM808) в приложении логики конечной точки HTTP Azure не работает.

Я использую SIM808 с atmega2560.

Я настроил конечную точку в Azure, и это работает, когда я пытаюсь отправить сообщение http через почтальона и/или онлайн-инструмент публикации HTTP (в результате я получаю 202 и вижу данные, поступающие в Azure)

Я хочу отправить пакет json в конечную точку HTTP Azure (умное приложение) с помощью функции httpPOST в библиотеке SIMCom от itead.

Я подключаюсь к сети:

логи (все что написано в GSM я распечатал):

AT+CIFSR
DB:STARTING NEW CONNECTION
AT+CIPSHUT
DB:SHUTTED OK
AT+CSTT="provider.net","","" DB:APN OK
AT+CIICR
DB:CONNECTION OK
AT+CIFSR
DB:ASSIGNED AN IP
GPRS status=ATTACHED
AT+CIPSTART="TCP","prod-13.westeurope.logic.azure.com",443
DB:RECVD CMD
DB:OK TCP

Затем вызовите функцию httpPost из библиотеки со следующими переменными:

const char server[35] = "prod-13.westeurope.logic.azure.com";
const int port = 443;
const char path[200] = "/workflows/someazureID/triggers/manual/paths/invoke?api-version=2016-10-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=someazuretoken";
const char parameters[100] = "{\"device\":\"alive\",\"timestamp\":\"09270845\"}";

Часть функции httpPost из библиотеки для отправки данных

    int InetGSM::httpPOST(const char* server, int port, const char* path, const char* parameters, char* result, int resultlength)
         ....
    gsm.SimpleWrite("POST ");
    gsm.SimpleWrite(path);
    gsm.SimpleWrite(" HTTP/1.1\r\nHost: ");
    gsm.SimpleWrite(server);
    gsm.SimpleWrite("\r\n");
    gsm.SimpleWrite("User-Agent: Arduino\r\n");
    gsm.SimpleWrite("Content-Type: application/json\r\n");
    gsm.SimpleWrite("Content-Length: ");
    itoa(strlen(parameters),itoaBuffer,10);
    gsm.SimpleWrite(itoaBuffer);
    gsm.SimpleWrite("\r\n\r\n");
    gsm.SimpleWrite(parameters);
    gsm.SimpleWrite("\r\n\r\n");
    gsm.SimpleWrite(end_c);
....

Что дает такой вывод на последовательном мониторе (все что написано в GSM я распечатал):

AT+CIPSEND
DB:>
POST /workflows/someazureID/triggers/manual/paths/invoke?api-version=2016-10-01&sp=%2Ftriggers%2Fmanual%2Frun&sv=1.0&sig=someazuretoken HTTP/1.1
Host: prod-13.westeurope.logic.azure.com
User-Agent: Arduino
Content-Type: application/json
Content-Length: 55

{"device":"alive","timestamp":"09270845"}

DB:SENT

И затем он ждет ответа:

Starting read..
Waiting for Data............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................ 
CLOSED 

Done..
response:
10

CLOSED

Какой тайм-аут, я думаю.

И я не вижу, чтобы в Azure ничего появилось.

(Я получаю данные, когда пытаюсь выполнить httpGet на случайном сайте. Значит, оборудование, SIM-карта и сеть работают нормально, я думаю)

Есть идеи? спасибо!

, 👍0

Обсуждение

разве Azure не использует https?, @Juraj

да, я подключаюсь к порту 443 'const char server[35] = "prod-13.westeurope.logic.azure.com"; const int порт = 443;' Но, честно говоря, я никогда этого не делал, возможно, я что-то забыл/упустил., @Jeroen

Я не знаю AT-команд для модуля GSM, но не похоже, что вы справитесь с SSL., @Juraj


1 ответ


1

Комментарии Юрая направили меня на правильный путь: для SSL вам нужно сделать больше, чем просто выбрать порт.

Я немного поискал и заставил его работать, используя другую библиотеку GSM, которая также поддерживает SSL: tinyGSM

в сочетании с ArduinoHttpClient

Йерун

РЕДАКТИРОВАТЬ: Это работает, но есть большой недостаток. Похоже, есть большие накладные расходы: каждое сообщение использует 13 КБ данных...? Я подозреваю, что это происходит из данных, возвращаемых конечной точкой. Это слишком сильно по сравнению с GPRS, поэтому теперь изучаем MQTT.

,