I want to send data to my php server using sim900 module but I am unable to initialize http service on sim900.
code:
#include <SoftwareSerial.h>
SoftwareSerial gprsSerial(8, 9);
void setup()
{
gprsSerial.begin(9600);
Serial.begin(9600);
Serial.println("Con");
delay(2000);
Serial.println("Done!...");
gprsSerial.flush();
Serial.flush();
// See if the SIM900 is ready
gprsSerial.println("AT");
delay(1000);
toSerial();
// SIM card inserted and unlocked?
gprsSerial.println("AT+CPIN?");
delay(1000);
toSerial();
// Is the SIM card registered?
gprsSerial.println("AT+CREG?");
delay(1000);
toSerial();
// Is GPRS attached?
gprsSerial.println("AT+CGATT?");
delay(1000);
toSerial();
// Check signal strength
gprsSerial.println("AT+CSQ ");
delay(1000);
toSerial();
// Set connection type to GPRS
gprsSerial.println("AT+SAPBR=3,1,"Contype","GPRS"");
delay(2000);
toSerial();
// Set the APN
gprsSerial.println("AT+SAPBR=3,1,"APN","web"");
delay(2000);
toSerial();
// Enable GPRS
gprsSerial.println("AT+SAPBR=1,1");
delay(10000);
toSerial();
// Check to see if connection is correct and get your IP address
gprsSerial.println("AT+SAPBR=2,1");
delay(2000);
toSerial();
}
void loop()
{
// initialize http service
gprsSerial.println("AT+HTTPINIT");
delay(2000);
toSerial();
// set http param value
// ToDO : send dynamic value
gprsSerial.println("AT+HTTPPARA="URL","http://www.fohoraayo.000webhostapp.com/?lat=1111&lon=1111"");
delay(4000);
toSerial();
// set http action type 0 = GET, 1 = POST, 2 = HEAD
gprsSerial.println("AT+HTTPACTION=0");
delay(6000);
toSerial();
// read server response
gprsSerial.println("AT+HTTPREAD");
delay(1000);
toSerial();
//gprsSerial.println("");
gprsSerial.println("AT+HTTPTERM");
toSerial();
delay(300);
gprsSerial.println("");
delay(10000);
}
void toSerial()
{
while(gprsSerial.available()!=0)
{
Serial.write(gprsSerial.read());
}
}
output:
Config SIM900...
Done!...
AT
OK
AT+CPIN?
+CPIN: READY
OK
AT+CREG?
+CREG: 0,1
OK
AT+CGATT?
+CGATT: 1
OK
AT+CSQ
+CSQ: 31,0
OK
AT+SAPBR=3,1,"Contype","GPRS"
OK
AT+SAPBR=3,1,"APN","web"
OK
AT+SAPBR=1,1
ERROR
AT+SAPBR=2,1
+SAPBR: 1,1,"xx.xxx.x.x"
OK
AT+HTTPINIT
ERROR
AT+HTTPPARA="URL","http://www.fohoraayo.000webhostapp.com/?lat=AT+HTTPACTION=0
ERROR
AT+HTTPREAD
ERROR
AT+HTTPTERM
ERROR
Предшествующие материалы: GSM модем SIM900, AT-команды GSM модема SIM900.
В продолжение серии статей по GSM модему SIM900, а точнее по его AT командам, расскажу, как работать с GPRS его составляющей.
GSM GPRS модуль SIM900
Модуль всё также подключен через UART. В него установлена SIM карта, он видит сеть, на нём есть деньги, оператор поддерживает GPRS соединение и эта услуга включена.
Не забывайте, что неправильно настроенный GPRS или большой трафик по лимитному тарифу может влететь в копеечку.
Приступим.
Настройка GPRS соединения
Настройки GPRS подключения и само подключение к интернету производиться через одну команду AT+SAPBR с множеством параметров.
Количество входных параметров может доходить до 4-х:
1 параметр — тип выполняемой операции
- 0 – закрыть соединение
- 1 – открыть соединение
- 2 – запросить сведения о соединение
- 3 – передать параметры соединения
- 4 – запросить параметры соединения
- 5 – сохранить настройки в энергонезависимую память модуля
2 параметр – CID или идентификатор профиля
Оставшиеся 2 параметра могут применять различные значения в зависимости от запроса.
Команда |
Описание |
AT+SAPBR=1,1 OK |
Устанавливаем GPRS соединение |
AT+SAPBR=2,1 +SAPBR: 1,1,»xxx.xxx.xxx.xxx» OK |
Получаем сведения о соединении и IP адрес В ответе: Второй параметр: 0 – соединение устанавливается 1 – соединение установлено 2 – соединение закрывается 3 – нет соединения Третий параметр – IP адрес |
AT+SAPBR=0,1 OK |
Закрываем GPRS соединение |
AT+SAPBR=3,1,»CONTYPE»,»GPRS» OK AT+SAPBR=3,1,»APN»,»internet.mts.ru» OK AT+SAPBR=3,1,»USER»,»mts» OK AT+SAPBR=3,1,»PWD»,»mts» OK |
Установка настроек подключения CONTYPE – тип подключения GPRS или CSD APN – точка подключения USER – имя пользователя PWD – пароль PHONENUM – номер телефона (для CSD) RATE – скорость соединения (для CSD) |
AT+SAPBR=4,1 +SAPBR: CONTYPE: GPRS APN: internet.mts.ru PHONENUM: USER: mts PWD: mts RATE: 2 OK |
Узнать текущие настройки подключения |
Настройки GPRS автоматически не сохраняются в памяти модуля, но текущие настройки можно сохранить командой – AT+SAPBR=5,1.
Модуль позволяет использовать не только GPRS соединение для выхода в интернет, но и осуществлять передачу данных напрямую между модулями, но это рассматривать не буду.
Пример запроса для настройки GPRS соединения и подключения к итеренету:
AT+SAPBR=3,1,"CONTYPE","GPRS"
OK
AT+SAPBR=3,1,"APN","internet.mts.ru"
OK
AT+SAPBR=3,1,"USER","mts"
OK
AT+SAPBR=3,1,"PWD","mts"
OK
AT+SAPBR=1,1
OK
В первой строке указываем, что используем GPRS соединение, далее точку доступа оператора, далее пользователя и пароль, для соединения. Завершаем запрос установлением подключения.
Во время нахождения в Интернете можно производить следующие операции: читать страницы (осуществлять html запросы), посещать ftp, со всеми вытекающими последствиями, обмениваться TCP и UDP пакетами, проверять электронную почту (требуется специальная прошивка, читайте в следующих статьях) и возможно многое другое. Начнём по порядку.
HTML запросы
Команда |
Описание |
AT+HTTPINIT OK |
Инициализация http сервиса |
AT+HTTPPARA=»CID»,1 OK |
Установка CID параметра для http сессии |
AT+HTTPPARA=»URL»,»https://alex-exe.ru/links/links.html» OK |
Указание адреса страницы |
AT+HTTPACTION=0 OK |
Старт сессии, на обмен данными данных Параметр, метод запроса: 0 – GET 1 – POST 2 – HEAD |
+HTTPACTION:0,200,1647 | Возвращаются данные о запрошенной страницы: Первый параметр – тип запроса, с.м. предыдущий пункт Второй параметр – HTTP код – статус о выполнение операции или код ошибки 100 – соединение 200 – Ок 204 – нет контента 404 – страницы не найдено Третий параметр – размер доступных данных (байт) |
AT+HTTPREAD | Чтение данных Первый параметр – адрес, с которого начать чтение Второй параметр – количество байт, которые нужно прочитать |
+HTTPREAD:1647 …………………….. |
В ответ приходит информация о количестве прочитанных байт и прочитанные данные |
AT+HTTPDATA=10,10000 DOWNLOAD 1234567890 OK |
Передача данных HTTP серверу Первый параметр – количество передаваемых байт Второй параметр – время ожидания данных, загружаемых в UART После отправки команды вернётся сообщение DOWNLOAD – приглашение на ввод данных. После удачной передачи данных вернётся OK, иначе error. |
AT+HTTPTERM OK |
Завершить работу HTTP службы |
Пример HTTP запроса:
AT+HTTPINIT
OK
AT+HTTPPARA="CID",1
OK
AT+HTTPPARA="URL","https://alex-exe.ru/links/links.html"
OK
AT+HTTPACTION=0
OK
+HTTPACTION:0,200,1647
AT+HTTPREAD
+HTTPREAD:1647
<html>
<head>
<title>Alex_EXE - Сайты</title>
<link rel="StyleSheet" href="http://alex-exe.net.ru/wp-content/themes/redplanet-10/style.css" type="text/css"/>
</head>
<body>
<center>
<table border=1 cellspacing=0 cellpadding=0>
………………………………………………………
</html>
OK
AT+HTTPTERM
OK
В запросе: сначала на модуле запускаем HTTP службу, далее указываем страницу с которой будем работать. Работать со страницей можно по разному: можно только узнать, существует ли она и её размер (HEAD), можно передать данные (POST), а можно, банально, прочитать (GET), что и продемонстрировано в примере. После указания своих намерений и получения ответа в виде существования страницы и её размера можем приступить к её чтению. По завершению работы закрываем HTTP службу.
FTP запросы
Команда |
Описание |
AT+FTPCID=1 OK |
Установка CID параметра FTP сессии |
AT+FTPSERV=»xxx.xxx.xxx.xxx» OK |
Адрес ftp сервера из 32 бит формата xxx.xxx.xxx.xxx или в виде текстовой ASCII строки, длиной до 49 символов. |
AT+FTPUN=»anonymous» OK AT+FTPPW=»password» OK |
Аутентификация на сервере |
AT+FTPGETNAME=»README» OK |
Имя файла |
AT+FTPGETPATH=»/pub/site/» OK |
Путь к файлу |
AT+FTPGET=1 OK +FTPGET:1,1 |
Открыть FTP сессию для получения данных Параметр указывает – на открытие FTP сессии В ответе возвращается: первый параметр – см выше, а второй параметр – состояние открытой сессии или код ошибки: 1 – сессия открыта 61 – нет подключения 64 – время сессии истекло 71 – неправильное им пользователя 72 – неправильно введен пароль В случае успешно открытой сессии сообщение 1,1 будет возвращаться в течении всей сессии, каждые 2 секунды, пока сессия не будет закрыта или выйдет её ремя с кодом ошибки 1,64. |
AT+FTPGET=2,1024 +FTPGET:2,175 …………………….. |
Чтение данных с FTP сервера Первый параметр – указывает на чтение данных с FTP сервера Второй параметр указывает на количество читаемых байт |
AT+FTPPUT=1 +FTPPUT=1,1,1280 |
Открыть FTP сессию для отправки данных Параметр указывает – на открытие FTP сессии В ответе: Первый параметр – см. выше Второй параметр – состояние открытой сессии или код ошибки: 1 – сессия открыта Третий параметр – в случае успешно открытой сессии – максимальное количество возможных принятых данных за одну сессию |
AT+FTPPUT=2,100 +FTPPUT=2,100 …………………….. OK |
Отправка данных Первый параметр – указывает на отправку данных на FTP Второй параметр – количество отправляемых данных После подтверждение приёма команды нужно передать данные по UART |
AT+FTPPUT=2,0 OK |
Уведомляем сервер, что данных для передачи больше нет. Или закрытие сессии по передаче данных на FTP сервер. |
Пример FTP запроса:
AT+FTPCID=1
OK
AT+FTPSERV="149.20.4.69"
OK
AT+FTPUN="anonymous"
OK
AT+FTPPW="password"
OK
AT+FTPGETNAME="README"
OK
AT+FTPGETPATH="/pub/site/"
OK
AT+FTPGET=1
OK
+FTPGET:1,1
AT+FTPGET=2,1024
+FTPGET:2,175
This directory contains files related to the operation of the
kernel.org file itself.
The file sample_mirror_script.pl is a sample script for mirroring
kernel.org via rsync.
OK
В запросе зашли на FTP сервер ftp://kernel.org/ (можно зайти как по IP адресу, как в примере, а можно указать адрес в виде имени — kernel.org) под анонимным пользователем (имя и пароль для входа на открытые ресурсы по умолчанию). Указали имя файла, который собирались прочитать и путь к нему. Далее открыли FTP сессию и убедились, что всё сделали верно: интернет есть, сервер существует, путь к файлу и параметры аутентификации верны и файл доступен для чтения. Теперь, пока сессия не закончилась, мы можем прочитать доступный файл – читаем 1024 байта из файла. Прочитан весь файл в 175 байт и его содержимое выведено в терминал.
.
AT Command | |
Description |
AT+HTTPINIT AT command initializes the HTTP service. This is a proprietary Simcom AT command.This command should be sent first before starting HTTP service. |
Support | Simcom Module Tutorial |
Examples |
AT+HTTPINIT |
Keywords | AT+HTTPINIT syntax, examples, parameters, error, input, response. |
AT+HTTPINIT function is used to initialize the HTTP service for Simcom modules.
With Online AT Command Tester tool, you can test Simcom HTTP feature.
Send batch of AT commands in the script mode,
//Check the registration status
AT+CREG?
//Check whether bearer 1 is open.
AT+SAPBR=2,1
//Enable bearer 1
AT+SAPBR=1,1
//Wait untial bearer is activated
WAIT=6
//Initialize HTTP service
AT+HTTPINIT
//Set the HTTP URL
AT+HTTPPARA="URL","https://www.m2msupport.net/m2msupport/http_get_test.php"
//Set the context ID
AT+HTTPPARA="CID",1
//Set up the HTTP action
AT+HTTPACTION=0
//Do a HTTP read
AT+HTTPREAD
//Wait for the HTTP response
WAIT=6
//Terminate the HTTP service
AT+HTTPTERM
В текущей статье рассмотим как с помощью GSM модуля SIM800L и платы Arduino UNO R3 отправлять данные на Ваш сайт. Будем отправлять изменения состояния магнитного датчика (геркона), изменилось состояние датчика отправили сайт время и состояние датчика. Получится прототип сигнализации и ведением журнала на открывание/закрываение двери или окна. Для работы нам дополнительно понадобится наличие своего сайта с возможностью работы с PHP.
Постановка задачи
- Мониторить состояние магнитоного датчика (геркона) и при изменении его состояния отправлять на сайт время и состояние датчика
- На сайте сохранять принятые данные в файл журнала
Подготовка и подключение
- Собираем устройство согласно схеме на картинке
Учитывая, что напряжение уровней модуля должны быть 2.8В, то следует сделать делители напряжений для контактов идущих от RX/TX модуля к 2,3-му на Ардуине. В моем случае работало без проблем и так. - Заливаем в Arduino скетч. Вместо сайта «mysite.ru» вписывайте свой адрес сайта
- Создаем файл PHP скрипта и закачиваем его на сервер
Скетч (для клиента)
#include <SoftwareSerial.h> SoftwareSerial GSMport(2, 3); // 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.tele2.ru"", "AT+SAPBR=3,1,"USER","tele2"", "AT+SAPBR=3,1,"PWD","tele2"", "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 скрипт (для сервера)
Сохраняем на сервере в файл index.php
<?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=$paramrn-----------------rn"); //запись данных в файл
fclose($f); //закрываем файл
?>
<p>GPRS data read page</p>
Проверка
Подавать питание рекомендую сперва GSM модулю, потом соединять Ардуину с ПК. Включаем монитор порта и наблюдаем.
Инициализация
Должны пробежать двойные строчки с АТ командами. Если показываются по одной АТ команде, значит нет связи с SIM800L. После инициализации при успешном создании GPRS сеанса светодиод на GSM модуле начнет часто моргать.
GPRS test GPRG init start AT+SAPBR=3,1,"CONTYPE","GPRS" AT+SAPBR=3,1,"CONTYPE","GPRS" OK AT+SAPBR=3,1,"APN","internet.tele2.ru" AT+SAPBR=3,1,"APN","internet.tele2.ru" OK AT+SAPBR=3,1,"USER","tele2" AT+SAPBR=3,1,"USER","tele2" OK AT+SAPBR=3,1,"PWD","tele2" AT+SAPBR=3,1,"PWD","tele2" OK AT+SAPBR=1,1 AT+SAPBR=1,1 OK AT+HTTPINIT AT+HTTPINIT OK AT+HTTPPARA="CID",1 AT+HTTPPARA="CID",1 OK GPRG init complete
Сработка датчика и отправка на сервер
Отправка через открытый GET запрос с передачей параметра в URL строке. Значение состояния датчика передаем через переменную «а». «?a=0» — передана переменная «а» со значением «0».
sensor changed to: 0 Send start setup url AT+HTTPPARA="URL","http://mysite.ru/?a=0 ERROR GET url AT+HTTPACTION=0 OK Send done +HTTPACTION: 0,200,26
Проверяем сервер
На сервере должен появиться файл со следующим содержимым:
2015.09.02 13:26:51; 176.59.197.176; SIMCOM_MODULE; sensor=0 ----------------- 2015.09.02 13:27:14; 176.59.199.8; SIMCOM_MODULE; sensor=1 -----------------
Теперь вы можете самостоятельно сделать свой GPS трекер на авто или метео станцию со сбором данных.
Иногда спрашивают, а как бы через интернет поуправлять Ардуиной с GSM модулем? Одним из решений считаю на сервере сделать скрипт, который бы при запросе от SIM800L возвращал нужные команды и далее можно их анализировать в коде скетча.
На этом все. Вопросы и пожелания пишите в комментариях.
AT - Данную команду необходимо вводить при первом подключении к модулю. Основные команды AT+CCLK? - Вернет текущую дату и время. AT+CCLK="гг/мм/дд,чч:мм:сс+пп" - Ввод даты и время + часовой пояс. AT+GSV - Вернет данные о модуле, прошивке и серийном номере AT+CSQ - Вернет уровень приема сети от 0 до 31. 99 - нет сети. AT+COPS? - Вернет оператора к которому подключился модуль AT+CMGS="89161234567" "Enter" - Отправит SMS с текстом "Некий текст" на номер > Некий текст "Ctrl + Z" 89161234567 ATD89161234567; - Позвонит на номер 89161234567 (точка с запятой обязательно) ATD#102# - Узнать баланс. Работает с МТС и Билайн. С Мегафоном не работает. AT+CBC - Вернет уровень заряда батареи. (Как я понял в мВ) AT+CPOWD=0/1 - Выключит модуль. Если с 0, то просто выключает. Если с 1, то вернет сообщение о нормальном выключении. Команды для работы с HTTP Передача данных методом GET Если требуется передать на сервер какие-то данные и обработать их скриптом, то эти команды то что нужно. AT+HTTPINIT - Вернет Ок если нормально проинициализировалось. AT+HTTPPARA="URL","www.server.ru/script.php?data=param"- Что и куда будем передавать. AT+HTTPACTION=0 - Старт сессии (в этот момент модуль передаст данные на сервер). И вернет ответ от сервера. AT+HTTPREAD - Как я понял, должен прочитать данные с сервера. AT+HTTPTERM - Закрыть сессию. Получение/передача данных из/в файла из/в FTP сервера. AT+SAPBR=1,1 - Открытие GPRS соединения. AT+SAPBR=0,1 - Закрытие GPRS соединения. AT+SAPBR=2,1 - Запрос состояния GPRS соединения. Ответ: AT+SAPBR:<Идентификатор профиля>,<Состояние соединения>,"IP" <Идентификатор профиля> 0 - Закрыть соединение 1 - Открыть соединение 2 - Запрос соединения 3 - Установить параметры соединения 4 - Получить параметры соединения 5 - Сохранить значение параметров в NVRAM <Состояние соединения> 0 - Идет установка соединения 1 - Соединение установлено 2 - Соединение закрывается 4 - Соединение закрыто "IP" IP адрес присвоенный провайдером AT+FTPCID=1 Установка CID для FTP сессии AT+FTPSERV="www.server.ru" Адрес FTP сервера AT+FTPPORT=хххх Номер порта FTP сервера AT+FTPUN="login" Имя пользователя FTP сервера AT+FTPPW="password" Пароль для пользователя FTP сервера AT+FTPGETPATH="/" Директория в которой находится требуемый файл. AT+FTPGETNAME="file.txt" Имя файла котрый необходимо прочитать AT+FTPGET=1 Открытие FTP сессии для получения данных. Ответ: +FTPGET:<Режим>,<Ответ состояния> <Режим> 1 - Попытка открыть FTP сессию <Ответ состояния> 1 - Удачная открытая сессия. Ошибки: 61 - Ошибка сети (Нед подключения) 62 - Ошибка DNS 63 - Ошибка соединения 64 - Ошибка по таймауту (Закончилось время ожидания ответа от FTP сервера) 65 - Ошибка сервера 66 - Не позволительная операция 70 - Повтор ошибки 71 - Неверное имя пользователя 72 - Неверный пароль пользователя AT+FTPGET=2,<Количество получаемых байт> Команда чтения данных файла из FTP. <Количество получаемых байт> Количество байт для чтения из FTP сервера Ответ: +FTPGET=2,<Количество принятых байт> <Количество принятых байт> Количество принятых байт из FTP сервера. AT+FTPPUT=1 Запись данных на FTP сервер Ответ: +FTPPUT=<Состояние>,<Максимальное кол-во передаваемых байт> <Состояние> 1 - Передача прошла удачно. Ошибки: Смотри ошибки FTPGET <Максимальное кол-во передаваемых байт> В случае удачного подключения указывает на максимальное количество передаваемых байт за одну сессию. AT+FTPPUT=2,<Количество передаваемых байт> Ответ: +FTPPUT=2,<Количество переданных байт> <Количество переданных байт> Количество байт которые были переданы на FTP сервер. AT+FTPPUT=2,0 Команда о прекращении передачи данных на FTP сервер Пример получения данных из файла file.txt находящегося на FTP сервере в директории /mydir/file.txt Адрес FTP сервера www.ftpserver.ru, порт 21, логин user, пароль password. AT+SAPBR=1,1 // Подключились к GPRS OK AT+FTPCID=1 // Выбрали CID OK AT+FTPSERV="www.ftpserver.ru" // Передали адрес FTP сервера ОК AT+FTPUN="user" // Передали имя пользователя OK AT+FTPPW="password" // Передали пароль пользователя OK AT+FTPGETPATH="/mydir/" // Передали директорию где лежит файл OK AT+FTPGETNAME="file.txt" // Передали имя файла OK AT+FTPGET=1 // Отправили команду на подключение к серверу +FTPGET=1,1 // Данный ответ говорит об удачном подключении к серверу. Если второй параметр отличный от 1, значит возникла ошибка. описание ошибки смотрим выше. AT+FTPGET=2,100 // Передаем команду на получение не более 100 байт из файла. OK +FTPGET:2,5 // Ответ о том что получили из файла 5 байт 12345 // То что было в файле OK AT+SAPBR=0,1 // Заканчиваем работу с GPRS
You need to setup the connection to the bearer. Here are the minimum setup commands that have worked for me (based on trial/error and searching around on the internet).
AT+SAPBR=3,1,"APN","wap.cingular"
AT+SAPBR=1,1
The correct value for the APN may be different for you, depending on your network and service provider. I’m using AT&T prepaid SIM cards. Once that’s working, then you can do the HTTP setup commands as you already have…
AT+HTTPINIT
AT+HTTPPARA="URL","http://www.google.com"
AT+HTTPACTION=0
Status codes above 600 (and some in the 500 range) are unassigned in the HTTP standard. In the AT command manual for the SIM908, status meanings are given in the notes on the HTTPACTION
command:
600 Not HTTP PDU
601 Network Error
602 No memory
603 DNS Error
604 Stack Busy
You can query the bearer connection status of CID 1 with AT+SAPBR=2,1
and the related parameters with AT+SAPBR=4,1
. You can also check that you’re attached to the GPRS network with AT+CGATT?
. If everything indicates that you are connected and you are still getting a 601 status code, then check that your service plan has data and that it hasn’t run out. I have found that even when my account has a few hundred k of data showing on the balance that I start to get a 601 status until I add more data to my prepaid phone plan. If the SIM module has been on the whole time and you add more data, you’ll need to close and re-open your connection (AT+SAPBR=0,1
followed by AT+SAPBR=1,1
) and then your HTTP*
commands will start working again without having to set the HTTPPARA
settings again and without having to restart with HTTPINIT
.
Hi Olivier , I modified the code as you asked:
My results:
v⸮⸮&��R⸮⸮⸮⸮⸮⸮B⸮SIM800L : Reset
SIM800L : Prepare internal buffer of 200 bytes
SIM800L : Prepare reception buffer of 512 bytes
SIM800L : Send "AT"
SIM800L : Receive timeout
Problem to initialize AT command, retry in 1 sec
SIM800L : Send "AT"
SIM800L : End of transmission
SIM800L : Receive "AT
OK
"
Setup Complete!
SIM800L : Send "AT+CSQ"
SIM800L : End of transmission
SIM800L : Receive "AT+CSQ
+CSQ: 0,0
"
SIM800L : Send "AT+CSQ"
SIM800L : End of transmission
SIM800L : Receive "AT+CSQ
+CSQ: 13,0
"
Signal OK (strenght: 13)
SIM800L : Send "AT+CREG?"
SIM800L : End of transmission
SIM800L : Receive "AT+CREG?
+CREG: 0,2
"
SIM800L : Send "AT+CREG?"
SIM800L : End of transmission
SIM800L : Receive "AT+CREG?
+CREG: 0,1
"
Network registration OK
SIM800L : Send "AT+SAPBR=3,1,"Contype","GPRS""
SIM800L : End of transmission
SIM800L : Receive "AT+SAPBR=3,1,"Contype","GPRS"
OK
"
SIM800L : Send "AT+SAPBR=3,1,"APN","data.uk""
SIM800L : End of transmission
SIM800L : Receive "AT+SAPBR=3,1,"APN","data.uk"
OK
"
GPRS config OK
SIM800L : Send "AT+SAPBR=1,1"
SIM800L : End of transmission
SIM800L : Receive "AT+SAPBR=1,1
OK
"
GPRS connected !
Start HTTP GET...
SIM800L : Send "AT+HTTPINIT"
SIM800L : End of transmission
SIM800L : Receive "AT+HTTPINIT
OK
"
SIM800L : Send "AT+HTTPPARA="CID",1"
SIM800L : End of transmission
SIM800L : Receive "AT+HTTPPARA="CID",1
OK
"
SIM800L : Send "AT+HTTPPARA="URL","www.google.com""
SIM800L : End of transmission
SIM800L : Receive "AT+HTTPPARA="URL","www.google.com"
OK
"
SIM800L : Send "AT+HTTPSSL=0"
SIM800L : End of transmission
SIM800L : Receive "AT+HTTPSSL=0
ERROR
"
SIM800L : initiateHTTP() - Unable to switch to HTTP
HTTP GET error 702
SIM800L : Send "AT+SAPBR=0,1"
SIM800L : End of transmission
SIM800L : Receive "AT+SAPBR=0,1
OK
"
GPRS disconnected !
SIM800L : Send "AT+CFUN?"
SIM800L : End of transmission
SIM800L : Receive "AT+CFUN?
+CFUN: 1
"
SIM800L : Send "AT+CFUN=0"
SIM800L : Send "AT+CFUN?"
SIM800L : End of transmission
SIM800L : Receive "AT+CFUN=0
AT+CFUN?
+CFUN: 0
"
Доброго времени, Уважаемые
Столкнулся с проблемой выхода в интернет для вышеупомянутой сборки. Плата — Arduino Mega(китайская),
шилд, тоже копия.. С платы можно звонить и слать смс.. т.е это работает
void DialVoiceCall() { Serial1.println("ATD + +79161234567;");//dial the number delay(100); Serial1.println(); }
void SendTextMessage() { // Устанавливает текстовый режим для SMS-сообщений Serial1.print("AT+CMGF=1r"); delay(100); // даём время на усваивание команды // Устанавливаем адресата: телефонный номер в международном формате Serial1.println("AT + CMGS = "+79161234567""); delay(100); // Пишем текст сообщения Serial1.println("789"); delay(100); // Отправляем Ctrl+Z, обозначая, что сообщение готово Serial1.println((char)26); }
а вот с со следующим кодом результата нет.. «AT+SAPBR=1,1» — ответ ERROR.. плюс ко всему через терминал идет очень много
мусора..
void setup() { Serial.begin(19200); // USB port Serial1.begin(19200); // serial port delay(2500); void setint() { Serial1.println("AT+CSQ"); delay(100); ShowSerialData(); Serial1.println("AT+CGATT=1"); delay(100); ShowSerialData(); Serial1.println("AT+SAPBR=3,1,"CONTYPE","GPRS""); delay(4000); ShowSerialData(); Serial1.println("AT+SAPBR=3,1,"APN","internet.mts.ru""); delay(2000); ShowSerialData(); Serial1.println("AT+SAPBR=3,1,"USER","mts""); delay(2000); ShowSerialData(); Serial1.println("AT+SAPBR=3,1,"PWD","mts""); delay(2000); ShowSerialData(); Serial1.println("AT+SAPBR=1,1"); delay(2000); ShowSerialData(); Serial1.println("AT+HTTPINIT"); delay(2000); ShowSerialData(); Serial1.println("AT+HTTPPARA="CID",1"); delay(2000); ShowSerialData(); Serial1.println("AT+HTTPPARA="URL","http://pustota.su/d7t.php? c=ZAZ_276<=55.4&lg=31.7&v1=401&v2=402&v3=403&v4=404&v5=405&v6=406&v7=407&v8=408&v9=409&v10=410&v11=411&v12=412" "); delay(2000); ShowSerialData(); Serial1.println("AT+HTTPACTION=0"); delay(1000); ShowSerialData(); Serial1.println("AT+HTTPTERM"); delay(1000); ShowSerialData(); } void ShowSerialData() { if (Serial1.available()) // if date is comming from softwareserial port ==> data is comming from gprs shield { while(Serial1.available()) // reading data into char array { buffer[count++]=Serial1.read(); // writing data into array if(count == 64)break; } Serial.write(buffer,count); // if no data transmission ends, write buffer to hardware serial port clearBufferArray(); // call clearBufferArray function to clear the storaged data from the array count = 0; // set counter of while loop to zero } } void loop() { ShowSerialData(); if (Serial.available()) { while(Serial.available()) // reading data into char array { buffer[count++]=Serial.read(); // writing data into array if(count == 64)break; } clearBufferArray(); // call clearBufferArray function to clear the storaged data from the array count = 0; okornot(); setint(); } }
терминал
AT OK UHшAT+CSQ +CSQ: 20,0 OK TQQх1 AT+CGATT=1 ю OK APBR=3,1,"CONTYPE","GPRS" AT+SAPBR=ымЧьPе‰,"internet.mts.ru" AT+SAPBR=3,1,"APN","iояPBR=3,1,"USER","mts" AT+SAPBR=3,1,"USER","mts" ERROR APBR=3,1,"PWD","mts" AT+SAPBR=3,1,"PWDв,‘[Ч‰ ERROR (%Iх1,1 )*ЉХAT+SAPBR=1<эяAT+HTTPINIT ERROR KD",1 AT+HTTPPARA="CID",1 ERROR Iх"URL","http://pustota.su/d7t.php?c=ZAZ_276<=55.4&lg=31O=0 AT+HTTPPARA="URL","http://puыOMMнAT+HtяCЎ”%хI5TTPTERM AT+HTTPTERM ERROR
Питание внешнее.. Выход в интернет нужен для передачи данных на сервер, пока в максимально простом виде.. но и это не идет.
Ваши предложения..
Мониторинг температуры через интернет с помощью GSM-модуля SIM900. Урок 3.
В предыдущем уроке мы собрали устройство, которое будет измерять температуру и передавать эту информацию на сервер. Теперь мы переходим к разбору алгоритма работы управляющего контроллера, его взаимодействию с другими узлами передающего устройства. Этот урок будет посвящён теоретическому разбору программы контроллера, без рассмотрения самого кода.
Некоторым читателям может показаться, что теория без практики слишком скучна. В этом случае можете переходить сразу к следующему уроку, «залить» программу в контроллер и испробовать его в работе, а потом вернутся сюда и изучить теорию.
Алгоритм работы передающего устройства
На представленной ниже диаграмме последовательности показан общий алгоритм работы передающего устройства:
Рис. 1. Общий алгоритм работы передающего устройства
После включения устройства контроллер производит начальную инициализацию всех программных структур и переменных. Затем он посылает модему последовательности команд, выполняя которые, SIM900 сначала подключается к GPRS, а после открывает встроенный HTTP-сервис.
Все последующие инструкции программы выполняются в бесконечном цикле:
- Контроллер даёт модему команду «Отправить запрос на сервер» и указывает содержание запроса. Модем посылает запрос и ждёт ответ от сервера.
- После того, как ответ от сервера получен, модем передаёт его контроллеру.
- В ответе от сервера, кроме служебной информации, содержится текущая команда для выходного реле. Контроллер принимает эту команду и выполняет её.
- Далее контроллер производит цифровой обмен с термодатчиком и получает от него текущее значение температуры.
- Если параметры системы (состояние выходного реле или температура) изменились по сравнению с предыдущим кругом цикла, контроллер передаст эти параметры в следующем запросе на сервер.
Настройка COM-порта Arduino
Обмен контроллера и модема происходит через последовательный порт.
Рис. 2. Соединение контроллера и модема через последовательный порт
Заводские настройки порта модема следующие:
- Скорость обмена: 19200 бит/с
- 8 бит данных
- Проверка чётности : нет
- 1 стоп-бит
Подключение SIM900 к GPRS
Для того чтобы модем выполнил подключение к интернету по GPRS, контроллер посылает ему следующие команды:
№ |
Команда |
Описание |
1 | AT+SAPBR=3,1,“CONTYPE“,“GPRS“ | Тип подключения : GPRS |
2 | AT+SAPBR=3,1,“APN“,“internet“ |
Точка доступа (APN). Для большинства операторов подходит “internet“ (в противном случае нужно запросить APN у Вашего оператора) |
3 | AT+SAPBR=1,1 | Выполнить подключение |
Таб. 1. Команды для подключения модема к GPRS
Если команда выполнена успешно, модем отвечает «ОК», в противном случае – «ERROR».
Инициализация HTTP-сервиса SIM900
Модем SIM900 имеет реализованный его внутренней логикой протокол HTTP. Это «своеобразный браузер», встроенный в чип модема. Пользователю остаётся инициализировать его, после чего можно передавать через него GET- и POST-запросы, так же, как это происходит в обычном браузере.
Для инициализации HTTP-сокета, контроллер посылает модему следующие команды:
№ | Команда | Описание |
1 | AT+HTTPINIT | Инициализация HTTP сервиса |
2 | AT+HTTPPARA=“CID“,1 | Установка CID параметра для HTTP сессии оператора. |
Таб. 2. Команды для инициализации HTTP
Если команда выполнена успешно, модем отвечает «ОК», в противном случае – «ERROR».
Отправка GET-запроса на сервер
Для реализации обмена данными с сервером используются GET-запросы (один из типов запроса стандарта HTTP).
GET-запрос имеет следующий вид:
«GET /device_status.php?LOG= 1111&PAS=2222 HTTP/1.1»
«HOST: t.lazysmart.ru»
В запросе:
- «GET» – тип запроса
- «/device_status.php» – URI (путь к запрашиваемому скрипту на сервере)
- После знака «?» идут передаваемые на сервер параметры и их значения. В данном примере параметры LOG и PAS – это логин и пароль для авторизации устройства на сервере. Эти параметры присваиваются устройству при его регистрации на сервере и не могут быть изменены. Посмотреть их можно через веб-приложение LS Cloud по адресу t.lazysmart.ru в меню «Настройки» этого устройства. В процессе работы устройства в запрос могут добавляться другие параметры, отражающие состояние системы (текущую температуру и состояние выходного реле).
- «HTTP/1.1» — версия протокола
- «HOST:…» — адрес сервера, к которому адресован запрос
Этот же запрос можно выразить в виде URL:
«http://t.lazysmart.ru /device_status.php?LOG=1111&PAS=2222»
Чтобы передать температуру на сервер, контроллер добавляет к запросу параметр «BT», а для передачи состояния выходного реле параметр «CSt». BT содержит значение температуры, умноженное на 10, а CSt принимает значение 0 или 1, где 0 – реле выключено, а 1 – включено.
Например, в запросе «http://t.lazysmart.ru/device_status.php?LOG=1111&PAS=2222&BT=127&CSt=1» передаваемые параметры означают, что температура равна 12,7 °С, а реле включено.
Передача запроса на сервер
Для отправки запроса на сервер, контроллер посылает модему следующие команды:
№ | Команда | Описание |
1 | AT+HTTPPARA=“URL“,“http:// t.lazysmart.ru /device_status.php?LOG=1111&PAS=2222“ | Указание содержание запроса |
2 | AT+HTTPACTION=0 | Старт обмена данными Параметр, метод запроса: 0 – GET 1 – POST 2 – HEAD |
Таб. 3. Команды для передачи запроса на сервер
Если команда выполнена успешно, модем отвечает «ОК», в противном случае – «ERROR».
Получение ответа от сервера
Как только ответ от сервера получен, модем посылает контроллеру строку вида:
+HTTPACTION:0,200, <…> ,
где 0 – тип запроса GET, 200 – код успешного ответа, <…> — количество полученных байт.
Если код ответа не 200 – значит, при передаче запроса произошла ошибка.
Если от сервера получен «успешный» ответ, контроллер посылает модему команду «AT+HTTPREAD». В ответ на эту команду модем начинает передавать контроллеру содержание ответа сервера.
Ответ от сервера состоит из заголовков, содержащих служебную информацию, и тела ответа.
Тело представляет собой строку вида:
“COMMAND <…> EOC”,
где <…> — команда для выходного реле (1 – включить, 0 – выключить).
Анализ состояния системы
После того, как команда для реле от сервера получена, контроллер выполняет её. Если команда реле поменялась, — контроллер добавляет к новому запросу на сервер соответствующий параметр (см. «GET-запрос»). Благодаря этому сервер получит подтверждение о том, что устройство получило и выполнило команду.
Затем контроллер производит информационный обмен с датчиком температуры DS18B20. Если температура изменилась – эта информация также добавляется в новый запрос на сервер.
Алгоритм «выживания»
Алгоритм выживания используется для предотвращения непредвиденных ситуаций в обмене с модемом. Сбои в программной логике модема, «мусор» полученный от сети и другие ситуации — могут привести к зависанию модема или его неадекватной работе. Применяется простейший алгоритм «выживания» в таких ситуациях: если в течение трёх минут от сервера не получено никаких полезных данных – контроллер перезагружает модем.
Предотвращение зависания
Для предотвращения зависания контроллера в самом начале программы инициализируется сторожевой таймер. Этот таймер должен быть сброшен программно, раньше, чем он переполнится. Для этого на каждом цикле программы выполняется оператор его сброса. При зависании программы таймер не будет сброшен и произойдёт аппаратная перезагрузка контроллера.
Облачный сервис для мониторинга «LS Cloud»
Данные, передаваемые устройством на сервер, сохраняются в базе данных и доступны пользователю через веб-приложение “LS Cloud” по адресу t.lazysmart.ru.
Этот сервис мы создали для того, чтобы Вы уже на этом этапе смогли опробовать работу своего устройства. Ну а для тех, кто хочет понять, как сервер устроен «внутри», следите за выходом следующих уроков. В одном из них мы покажем, как самостоятельно создать веб-сервис.
Основные элементы интерфейса приложения показаны на рисунках 3 и 4.
Рис. 3. Экран мониторинга основных параметров устройства
На экране мониторинга основных параметров устройства (рис. 3) отображается информация о текущей температуре, а так же исторические данные о температуре за весь период работы устройства. Панель «Реле» позволяет управлять выходным реле устройства, а в «Журнал» заносятся события, происходящие с устройством.
Рис. 4. Экран настроек прибора
На экране настроек прибора (рис. 4) можно изменить основные настройки прибора:
- Имя
- Верхний предупредительный (тревожный) порог температуры – при его превышении генерируется тревожное событие в журнал.
- Верхний аварийный порог температуры – при его превышении генерируется аварийное событие в журнал.
- Нижний предупредительный (тревожный) порог температуры – если температура опустится ниже него, будет сгенерировано тревожное событие в журнал.
- Верхний аварийный порог температуры – если температура опустится ниже него, будет сгенерировано аварийное событие в журнал.
- Таймаут (задаётся в секундах) – если в течение этого времени устройство ни разу не вышло на связь, генерируется событие «потеря связи с устройством».
- Оповещение при тревоге — при активации этой настройки пользователь будет получать сообщения о тревожных событиях по email и SMS.
- Оповещение при тревоге — при активации этой настройки пользователь будет получать сообщения о тревожных событиях по email и SMS.
- Оповещение при обрывах связи с устройством — при активации этой настройки пользователь будет получать сообщения о событиях обрыва связи с устройством по email и SMS.
Заключение
На этом мы заканчиваем третий урок! Надеемся, что он был полезен! В следующем уроке мы прошьём программу в контроллер и запустим устройство. До скорой встречи на LAZY SMART! Чтобы не пропустить новую статью, вступай в нашу группу Вконтакте, а также подписывайся на наш канал YouTube.