SIM800L для работы с сервером

zhukovivan
Offline
Зарегистрирован: 27.09.2017

Здравствуйте! Занимаюсь проектом, в котором нужно реализовать управление несколькими устройствами с помощью приложения на смартфоне. На устройстве для связи имеется 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>

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

sim800 каждые X минут/секунд делает POST/GET запрос, анализирует ответ от сервера в котором и будет команда для МК

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

после 70 строки не хватает команды AT+HTTPREAD для чтения, потом производите анализ ответа,

так же не хватает команды завершения Http сессии AT+HTTPTERM

ЗЫ. Вы используете такой код с delay в реальных устройствах? и даже не анализируете ответы от модема :(

zhukovivan
Offline
Зарегистрирован: 27.09.2017

Команда AT+HTTPREAD выдает в контроллер HTML разметку, и то рубленную

 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

zhukovivan пишет:

Команда AT+HTTPREAD выдает в контроллер HTML разметку, и то рубленную

 

круто, не знал, это где написано?  особенно интересно, как модем определяет в ответе сервера HTML разметку и выборочно ее выдает :)

а я получаю этой командой и анализирую ответ от PHP сервера - что я делаю не так?

Upd: не поленился, нашел скрин реальной своей железки - ответ от сервера, что то я не вижу там разметки HTTP

zhukovivan
Offline
Зарегистрирован: 27.09.2017

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

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Ваш код смысла нет исправлять и пытаться исправить, основная проблема в том что весь ответ http сервера никогда в жизни не влезет в память МК потому и прочитать вы его не можете.
Читать в гугле до просветления: циклический буфер, лексический анализатор.

В качестве разминки вот вам пример, конечно кривоватенький, но рабочий

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017
b707
Offline
Зарегистрирован: 26.05.2017

zhukovivan пишет:

Я говорю не как где написано, а как у меня выдает ответ.

у тебя так выдает ответ, потому что твой код кривой. Команда HTTPREAD не виновата.

Саша Федоров
Offline
Зарегистрирован: 04.01.2019

Serial.println(ReadGSM()); что это за функция, откуда она взялась?

ReadGSM такого нету в модуле или библиотеке

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Саша Федоров пишет:

что это за функция, откуда она взялась?

Эта функция написана прямо в скетче в первом посте, строки 74-83.

zhukovivan
Offline
Зарегистрирован: 27.09.2017

Верно, в библиотеке нет её, написал, в скетче выше она есть.