Отправка SMS сообщений — различия между версиями
(→Отправка SMS сообщений с помощью 3G/GSM модема) |
(→Отправка SMS сообщений с помощью 3G/GSM модема) |
||
Строка 47: | Строка 47: | ||
Также, аналогично можно реализовать чтение входящих СМС сообщений и, как следствие, возможно организовать управление WebHMI с помощью СМС-сообщений. | Также, аналогично можно реализовать чтение входящих СМС сообщений и, как следствие, возможно организовать управление WebHMI с помощью СМС-сообщений. | ||
+ | |||
+ | В случае проблем с работой скрипта, можно для диагностики добавить функции чтения из порта ответов модема: | ||
+ | <syntaxhighlight lang = lua> | ||
+ | function createDevices () | ||
+ | addDevice({name = "SMS", shift = 0, base = 10, xtraFields = {1, 5}}); | ||
+ | end | ||
+ | |||
+ | function readRegister (reg, device, unitId) | ||
+ | return "Ok"; -- можно поставить заглушку "Ок", чтобы выполнялась функция чтения | ||
+ | end | ||
+ | |||
+ | function writeRegister (reg, device, unitId, newValue) | ||
+ | local replyTmp = "" | ||
+ | |||
+ | DEBUG("entered sms protocol for value "..newValue) | ||
+ | --sendString("AT+CPIN=\"0000\"\r"); | ||
+ | sendString("AT+CMGF=1\r"); -- перевести модем в текстовый режим | ||
+ | -- прочитать ответ из порта | ||
+ | replyTmp = ReadModemReply() | ||
+ | if (replyTmp ~= "") then | ||
+ | DEBUG("modem replied with "..replyTmp) | ||
+ | end | ||
+ | |||
+ | sendString("AT+CSMP=17,167,0,0\r"); | ||
+ | replyTmp = ReadModemReply() | ||
+ | if (replyTmp ~= "") then | ||
+ | DEBUG("modem replied with "..replyTmp) | ||
+ | end | ||
+ | -- при передаче номера телефона как аргумента надо не забыть правильно преобразовать reg.internalAddress в строку, заключенную в кавычки используя escape - символ "\" | ||
+ | sendString("AT+CMGS=".."\"+380631040159\"".."\r") | ||
+ | replyTmp = ReadModemReply() | ||
+ | if (replyTmp ~= "") then | ||
+ | DEBUG("modem replied with "..replyTmp) | ||
+ | end | ||
+ | sendString(newValue..string.char(26)) | ||
+ | replyTmp = ReadModemReply() | ||
+ | if (replyTmp ~= "") then | ||
+ | DEBUG("modem replied with "..replyTmp) | ||
+ | end | ||
+ | return true; | ||
+ | end | ||
+ | |||
+ | function ReadModemReply() | ||
+ | |||
+ | local CR = "\r" | ||
+ | local one_char_tmp = "" | ||
+ | local readStringTmp = "" | ||
+ | repeat | ||
+ | one_char_tmp = readString(1) | ||
+ | if (one_char_tmp ~= false) then | ||
+ | readStringTmp = readStringTmp..one_char_tmp | ||
+ | else | ||
+ | DEBUG("can't readString") | ||
+ | return "" | ||
+ | end | ||
+ | until (one_char_tmp == CR) | ||
+ | readString(1) -- read rest symbol | ||
+ | |||
+ | return readStringTmp | ||
+ | |||
+ | end | ||
+ | |||
+ | </syntaxhighlight> |
Версия 18:41, 6 февраля 2018
В WebHMI есть инструмент сигнализации о различных событиях путем отправки смс-сообщений (смс-нотификация).
Для этого необходимо запросить у поставщика ключ API для отправки SMS и активировать функцию в меню Settins, раздел WebHMI Cloud.
SMS отправляется путем вызова скрипта. Для примера создадим скрипт для дешборда (который можно будет "привязать" к кнопке и проверить путем ее нажатия). В блоке send sms указывается номер телефона и текст сообщения.
На дешборде создадим кнопку с свойством вызова скрипта по нажатию:
Отправка SMS сообщений с помощью 3G/GSM модема
При необходимости отправлять СМС-сообщений без использования сторонних сервисов, можно реализовать такую возможность с помощью обычный GSM или 3G модемов. Для этого потребуется создание собственного протокола (см. Пользовательские протоколы).
Данная возможность работает в прошивках начиная с версии 2.0.
Отправка сообщения — это простой набор AT-команд, которые необходимо передать модему в управляющий порт.
Простой пример такого протокола показан ниже.
function createDevices ()
addDevice({name = "SMS", shift = 0, base = 10, xtraFields = {1, 5}});
end
function readRegister (reg, device, unitId)
return {}; -- можно поставить заглушку "Ок", чтобы выполнялась функция чтения
end
function writeRegister (reg, device, unitId, newValue)
sendString("AT+CPIN=\"0000\"\r");
sendString("AT+CMGF=1\r");
sendString("AT+CSMP=17,167,0,0\r");
sendString("AT+CMGS=\"+" .. reg.internalAddr .. "\"\r");
sendString(newValue);
sendString(string.char(26));
return true;
end
В данном примере для отправки сообщения необходимо создать регистр. В качестве адреса указывается номер телефона в виде SMS380671234567. При записи строки в такой регистр произойдет отправка соответствующего текста на указанный номер.
При необходимости отправлять сообщения с кириллицей, потребуется реализовать соответсвующие преобразования текста согласно поддерживаемым вашим модемом кодировкам.
Также, аналогично можно реализовать чтение входящих СМС сообщений и, как следствие, возможно организовать управление WebHMI с помощью СМС-сообщений.
В случае проблем с работой скрипта, можно для диагностики добавить функции чтения из порта ответов модема:
function createDevices ()
addDevice({name = "SMS", shift = 0, base = 10, xtraFields = {1, 5}});
end
function readRegister (reg, device, unitId)
return "Ok"; -- можно поставить заглушку "Ок", чтобы выполнялась функция чтения
end
function writeRegister (reg, device, unitId, newValue)
local replyTmp = ""
DEBUG("entered sms protocol for value "..newValue)
--sendString("AT+CPIN=\"0000\"\r");
sendString("AT+CMGF=1\r"); -- перевести модем в текстовый режим
-- прочитать ответ из порта
replyTmp = ReadModemReply()
if (replyTmp ~= "") then
DEBUG("modem replied with "..replyTmp)
end
sendString("AT+CSMP=17,167,0,0\r");
replyTmp = ReadModemReply()
if (replyTmp ~= "") then
DEBUG("modem replied with "..replyTmp)
end
-- при передаче номера телефона как аргумента надо не забыть правильно преобразовать reg.internalAddress в строку, заключенную в кавычки используя escape - символ "\"
sendString("AT+CMGS=".."\"+380631040159\"".."\r")
replyTmp = ReadModemReply()
if (replyTmp ~= "") then
DEBUG("modem replied with "..replyTmp)
end
sendString(newValue..string.char(26))
replyTmp = ReadModemReply()
if (replyTmp ~= "") then
DEBUG("modem replied with "..replyTmp)
end
return true;
end
function ReadModemReply()
local CR = "\r"
local one_char_tmp = ""
local readStringTmp = ""
repeat
one_char_tmp = readString(1)
if (one_char_tmp ~= false) then
readStringTmp = readStringTmp..one_char_tmp
else
DEBUG("can't readString")
return ""
end
until (one_char_tmp == CR)
readString(1) -- read rest symbol
return readStringTmp
end