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.
Верно, в библиотеке нет её, написал, в скетче выше она есть.