SIM800L для работы с сервером
- Войдите на сайт для отправки комментариев
Здравствуйте! Занимаюсь проектом, в котором нужно реализовать управление несколькими устройствами с помощью приложения на смартфоне. На устройстве для связи имеется SIM800L. Все устройства находятся в спящем режиме, по звонку просыпаются и передают нужные данные на сервер где PHP скрипт раскладывает данные в отдельный файл. На этом этапе проблем нет, но далее требуется управление этими устройствами со смартфона, получается что сервер принимает данные со смартфона и должен отправить команды на SIM800L, собственно в этом и вопрос - как реализовать двустороннюю связь GSM модуля и сервера со сматфоном. Передачу данных делал по примеру. Скетч передает состояние датчика на сервер (1 или 0).
#include <SoftwareSerial.h> SoftwareSerial GSMport(12, 11); // RX, TX int char_; int SensorPin = 10; int SensorState; int SensorLastState = HIGH; void setup() { delay(3000); //дадим время на инициализацию GSM модулю pinMode(SensorPin, INPUT); digitalWrite(SensorPin, HIGH); //вкл. подтягивающий резистор 20ом Serial.begin(9600); //скорость порта Serial.println("GPRS test"); GSMport.begin(9600); gprs_init(); } void loop() { SensorState = digitalRead(SensorPin); if (SensorState != SensorLastState) { //если смена состояния датчика Serial.print("sensor changed to: "); Serial.println(SensorState); SensorLastState = SensorState; gprs_send(String(SensorState)); delay(100); } if (GSMport.available()) { //если GSM модуль что-то послал нам, то Serial.println(ReadGSM()); //печатаем в монитор порта пришедшую строку } delay(100); } void gprs_init() { //Процедура начальной инициализации GSM модуля int d = 500; int ATsCount = 7; String ATs[] = { //массив АТ команд "AT+SAPBR=3,1,\"CONTYPE\",\"GPRS\"", //Установка настроек подключения "AT+SAPBR=3,1,\"APN\",\"internet\"", "AT+SAPBR=3,1,\"USER\",\"gdata\"", "AT+SAPBR=3,1,\"PWD\",\"gdata\"", "AT+SAPBR=1,1", //Устанавливаем GPRS соединение "AT+HTTPINIT", //Инициализация http сервиса "AT+HTTPPARA=\"CID\",1" //Установка CID параметра для http сессии }; int ATsDelays[] = {6, 1, 1, 1, 3, 3, 1}; //массив задержек Serial.println("GPRG init start"); for (int i = 0; i < ATsCount; i++) { Serial.println(ATs[i]); //посылаем в монитор порта GSMport.println(ATs[i]); //посылаем в GSM модуль delay(d * ATsDelays[i]); Serial.println(ReadGSM()); //показываем ответ от GSM модуля delay(d); } Serial.println("GPRG init complete"); } void gprs_send(String data) { //Процедура отправки данных на сервер //отправка данных на сайт int d = 400; Serial.println("Send start"); Serial.println("setup url"); GSMport.println("AT+HTTPPARA=\"URL\",\"http://mysite.ru/?a=" + data + "\""); delay(d * 2); Serial.println(ReadGSM()); delay(d); Serial.println("GET url"); GSMport.println("AT+HTTPACTION=0"); delay(d * 2); Serial.println(ReadGSM()); delay(d); Serial.println("Send done"); } String ReadGSM() { //функция чтения данных от GSM модуля int c; String v; while (GSMport.available()) { //сохраняем входную строку в переменную v c = GSMport.read(); v += char(c); delay(10); } return v; }
Скрипт для сервера:
<?php $ip = $_SERVER['REMOTE_ADDR']; //получаем IP адрес клиента $client = $_SERVER['HTTP_USER_AGENT']; //получаем идентификатор HTTP клиента $today = date("Y.m.d H:i:s"); //получаем текущие дату и время $f = fopen("log.csv","a"); //открываем файл для добавления данных $param = $_REQUEST['a']; //получаем значение посланной переменной "а" fwrite($f,"$today; $ip; $client; sensor=$param\r\n-----------------\r\n"); //запись данных в файл fclose($f); //закрываем файл ?> <p>GPRS data read page</p>
sim800 каждые X минут/секунд делает POST/GET запрос, анализирует ответ от сервера в котором и будет команда для МК
после 70 строки не хватает команды AT+HTTPREAD для чтения, потом производите анализ ответа,
так же не хватает команды завершения Http сессии AT+HTTPTERM
ЗЫ. Вы используете такой код с delay в реальных устройствах? и даже не анализируете ответы от модема :(
Команда AT+HTTPREAD выдает в контроллер HTML разметку, и то рубленную
Команда AT+HTTPREAD выдает в контроллер HTML разметку, и то рубленную
круто, не знал, это где написано? особенно интересно, как модем определяет в ответе сервера HTML разметку и выборочно ее выдает :)
а я получаю этой командой и анализирую ответ от PHP сервера - что я делаю не так?
Upd: не поленился, нашел скрин реальной своей железки - ответ от сервера, что то я не вижу там разметки HTTP
Я говорю не как где написано, а как у меня выдает ответ. Умный какой нашелся, так помоги или нечего трепаться, не с потолка же вопрос появился. Этот кусок на ответ для анализа никак не похож, это кусок заголовка который отображается на сайте.
Ваш код смысла нет исправлять и пытаться исправить, основная проблема в том что весь ответ http сервера никогда в жизни не влезет в память МК потому и прочитать вы его не можете.
Читать в гугле до просветления: циклический буфер, лексический анализатор.
В качестве разминки вот вам пример, конечно кривоватенький, но рабочий
http://arduino.ru/forum/apparatnye-voprosy/vse-o-sim800l-i-vse-chto-s-ni...
Я говорю не как где написано, а как у меня выдает ответ.
у тебя так выдает ответ, потому что твой код кривой. Команда HTTPREAD не виновата.
Serial
.println(ReadGSM()); что это за функция, откуда она взялась?
ReadGSM такого нету в модуле или библиотеке
что это за функция, откуда она взялась?
Эта функция написана прямо в скетче в первом посте, строки 74-83.
Верно, в библиотеке нет её, написал, в скетче выше она есть.