POST-данные с использованием модуля GSM900 - PullRequest
0 голосов
/ 01 сентября 2018

Я несколько недель боролся с проблемой вкл / выкл с моей Raspberry Pi (под управлением Node.js) и надстройкой GSM900 v2.0. Я хотел бы передать небольшой JPEG размером около 40 КБ на центральный сервер вместе с некоторой дополнительной информацией (идентификатор, назначенный IP-адрес и метка времени). На другом конце у меня есть PHP-файл. На данный момент он просто отправляет все, что получает, в файл ... и это хорошо для целей тестирования. Когда передача заканчивается, сервер создал на сервере красивый пустой JPEG-файл - данные никогда не записываются.

Это может быть неправильный формат POST-запроса - если да, можете ли вы помочь мне исправить это? Это не важно, если изображение передается в двоичном формате или используется base64-кодировка (JSON / non-JSON), если оно работает.

Я попробовал два метода: CIPSEND и HTTP и проверил (на что это похоже) сотни страниц ... но ни одна из них, похоже, не касается передачи "больших" порций данных, только простые параметры, такие как a = 0 & b = 1 и т. Д. Каждая команда будет приятно стоять в очереди, благодаря библиотеке serial-at.

console.log(await port.at('AT+CGATT=1'));
console.log(await port.at('AT+SAPBR=3,1,"APN","internet"'));
console.log(await port.at('AT+SAPBR=1,1'));
console.log(await port.at('AT+HTTPINIT'));
console.log(await port.at('AT+HTTPPARA="CID",1'));
//console.log(await port.at('AT+HTTPPARA="CONTENT","multipart/form-data; boundary=myboundary"'));
console.log(await port.at('AT+HTTPPARA="CONTENT","application/x-www-form-urlencoded"'));
console.log(await port.at('AT+HTTPPARA="URL","http://www.myserver.com/index.php"'));
var data = 'POST / HTTP/1.1 \r\n \
            Host: XXX.XXX.XXX.XXX \r\n \ <- I was unable to obtain the IP, except when using AT+CIFSR 
            Content-Type: text/html; charset=utf-8 \r\n \
            Content-Length: 14 \r\n \ <- the length of the content, not including header. "\r\n" counts as two characters, I have read.
            \r\n \
            image=123456\r\n'; <- 14... 12 + 2 special characters. It doesn't transmit the bitmap at the moment, only these simple data.

    console.log(await port.at('AT+HTTPDATA='+data.length+',30000'));
    console.log(await port.at(data));
    console.log(await port.at('AT+HTTPACTION=1'));
    console.log(await port.at('HTTPTERM'));
    console.log(await port.at('AT+SAPBR=0,1'));

Он отвечает так:

AT+CGATT=1
OK
AT+SAPBR=3,1,"APN","internet"
OK
AT+SAPBR=1,1
OK
AT+CIFSR
ERROR
AT+HTTPINIT
OK
AT+HTTPPARA="CID",1
OK
AT+HTTPPARA="CONTENT","application/x-www-form-urlencoded"
OK
AT+HTTPPARA="URL","http://www.myserver.com/index.php"
OK
AT+HTTPDATA=149,10000 <- the complete length of the query with header and all
DOWNLOAD
OK
AT+HTTPACTION=1
OK
HTTPTERM
+HTTPACTION: 1,200,120 <- seems like "POST", "OK" and 120 which might be a "informational status" of some kind
AT+SAPBR=0,1
OK

Серверный файл состоит только из этого:

<?php
    file_put_contents("detections/test.jpg", $_REQUEST['image']); // yes, yes - no validation or anything... yet.
?>

Как уже упоминалось, я также использовал другой метод (AT + CIPSEND) для его отправки, используя TCP ... но он даже не вызывает файл сервера.

Я на правильном пути?

...