Я несколько недель боролся с проблемой вкл / выкл с моей 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 ... но он даже не вызывает файл сервера.
Я на правильном пути?