Отправлять большие объемы данных в 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-модуль не сможет обработать заданный объем данных.
Знаете ли вы, как я могу отправлять большие объемы данных одновременно? В целях энергосбережения я бы предпочел, чтобы это было возможно только за один запрос.
@Cowboy_Patrick, 👍1
Обсуждение1 ответ
Знаете ли вы, как я могу отправлять большие объемы данных одновременно? В целях энергосбережения я бы предпочел, чтобы это было возможно только за один запрос.
Выполните 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
- SIM800l не отвечает на arduino micro
- SIM900 3G? Или SIM900A умеет подключаться к 3G?
- Клиент MQTT на Arduino + SIM900
- Программирование Arduino Micro через RX/TX
- SIM800L GSM-модуль, нет сигнала сети RSSI
- Arduino : отправка данных через спутник (или другие решения ? без GSM)
- Работает ли SIM800L в США?
- Как использовать I2C от Arduino Uno, когда у меня установлен GSM-shield?
«Я получаю строку, содержащую ровно 63 символа», - я думаю, вы используете SoftwareSerial и используете глупый способ ожидания ответа с задержкой (1000), который я вижу повсюду...?, @Majenko