Отправлять большие объемы данных в PHP-скрипт через GSM-модуль SIM800L.

Я ищу способ передать большое количество сенсорных данных из моего Arduino Micro в PHP-скрипт. Моя текущая попытка использует следующие AT-команды:

Sent: [AT+HTTPPARA=URL,www.example.com/newData.php?data=t0_20.75,l_0.00,m_584,h_42,td_22,d_21x44x54]
Res: [AT+HTTPPARA=URL,www.example.com/newData.php?data=t0_20.75,l_]

Как видите, я отправляю на свой сервер длинный GET-параметр с сокращенными именами параметров, например t0 для датчика температуры с нулевым номером, l для освещения и так далее.

В ответ от моего SIM800l я получаю строку длиной ровно 63 символа, поэтому я предполагаю, что на SIM-модуле есть какое-то ограничение по длине.

После этой команды, когда она пытается завершить HTTP-запрос, я получаю множество ошибок в ответах на AT-команды, и в мой скрипт не поступает данных GET.


Я проверяю, поступили данные или нет, с помощью следующей функции на моем сервере:

ob_start();
echo "Var_dump of GET\n";
var_dump($_GET);

echo "Var_dump of POST\n";
var_dump($_POST);
$vd_res = ob_get_clean();

file_put_contents('postdump.log', $vd_res."\n",FILE_APPEND);

При вводе некоторых данных непосредственно в браузер он сохраняет отправленные данные в postdump.log, поэтому я почти уверен, что SIM-модуль не сможет обработать заданный объем данных.

Знаете ли вы, как я могу отправлять большие объемы данных одновременно? В целях энергосбережения я бы предпочел, чтобы это было возможно только за один запрос.

, 👍1

Обсуждение

«Я получаю строку, содержащую ровно 63 символа», - я думаю, вы используете SoftwareSerial и используете глупый способ ожидания ответа с задержкой (1000), который я вижу повсюду...?, @Majenko


1 ответ


2

Знаете ли вы, как я могу отправлять большие объемы данных одновременно? В целях энергосбережения я бы предпочел, чтобы это было возможно только за один запрос.

Выполните POST-запрос. Вы можете отправлять огромные объемы данных в теле.

В ответ от моего SIM800l я получаю строку длиной ровно 63 символа, поэтому я предполагаю, что на SIM-модуле есть какое-то ограничение по длине.

Нет.

Я думаю, вы делаете что-то вроде:

sendCommand("AT+HTTPPARA=URL,www.example.com/newData.php?data=t0_20.75,l_0.00,m_584,h_42,td_22,d_21x44x54");
delay(1000);
printResponse();

Проблема в том, что вы полагаетесь на внутренний буфер SoftwareSerial (или HardwareSerial, если вы используете настоящий последовательный порт). Вы ожидаете прибытия символов в течение заранее определенного времени, а затем по истечении этого времени распечатываете их. Последовательный код имеет буфер размером 64 байта.

Я вижу такой код повсюду, и это худший способ чтения сериалов. Того, кто разместил первый экземпляр такого кода и запустил эту цепочку зла, следует вывести на улицу и расстрелять.

Вместо этого вы должны правильно прочитать сериал. Такая ленивость не работает.

Прочитайте эту публикацию в блоге, чтобы узнать больше о правильном чтении последовательных данных.

,

Большое спасибо. На самом деле моя проблема заключалась в ограничении буфера. Я придумал обходной путь, при котором каждый параметр GET добавлялся в функцию отдельно, и только в конце я делал фиксацию, написав \r\n, чтобы она интерпретировалась как одна большая команда., @Cowboy_Patrick

@The_javascript_King, ответ был не о буфере TX, @Juraj

Под «пределом буфера» я имел в виду предел, заданный SoftwareSerial., @Cowboy_Patrick