Отправка SMS сообщений — различия между версиями
(→Отправка SMS сообщений с помощью 3G/GSM модема) |
|||
(не показано 8 промежуточных версий 2 участников) | |||
Строка 4: | Строка 4: | ||
}} | }} | ||
− | В WebHMI есть | + | В WebHMI есть инструменты сигнализации о различных событиях путем отправки смс-сообщений (смс-нотификация). <br> |
− | Для этого необходимо запросить у поставщика ключ API для | + | |
− | [[Файл: | + | == Отправка сообщений используя сервисы Level2 == |
− | SMS отправляется путем вызова скрипта. Для примера создадим скрипт для дешборда (который можно будет "привязать" к кнопке и проверить путем ее нажатия). В блоке send sms указывается номер телефона и текст сообщения. <br> | + | Для этого необходимо запросить у поставщика ключ API для интеграции с системой Level2, в меню "Конфигурация / Настройки", вкладка Level2.<br> |
− | [[Файл: | + | [[Файл:API key set.png|1024 px]]<br><br> |
+ | SMS отправляется путем вызова соответствующей функции внутри скрипта (программы) - '''SendSMS'''. Для примера создадим скрипт для дешборда (который можно будет "привязать" к кнопке и проверить путем ее нажатия). В блоке send sms указывается номер телефона и текст сообщения. <br> | ||
+ | [[Файл:SMS send script.png|1024px]]<br> | ||
На дешборде создадим кнопку с свойством вызова скрипта по нажатию: <br> | На дешборде создадим кнопку с свойством вызова скрипта по нажатию: <br> | ||
− | [[Файл:Sms dash 3.png| | + | [[Файл:Sms dash 3.png|1024px]] |
+ | |||
+ | == Отправка SMS сообщений с помощью 3G/GSM модема == | ||
+ | При необходимости отправлять СМС-сообщений без использования сторонних сервисов, можно реализовать такую возможность с помощью обычный GSM или 3G модемов. Для этого потребуется создание собственного протокола (см. [[Пользовательские протоколы]]). | ||
+ | |||
+ | Данная возможность работает в прошивках начиная с версии 2.0. | ||
+ | |||
+ | Отправка сообщения — это простой набор AT-команд, которые необходимо передать модему в управляющий порт. | ||
+ | |||
+ | Простой пример такого протокола показан ниже. | ||
+ | |||
+ | <syntaxhighlight lang="lua"> | ||
+ | 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=\"+" .. string.sub(reg.addr, 4) .. "\"\r"); | ||
+ | sendString(newValue); | ||
+ | sendString(string.char(26)); | ||
+ | return true; | ||
+ | end | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | В данном примере для отправки сообщения необходимо создать регистр. В качестве адреса указывается номер телефона в виде SMS380671234567. При записи строки в такой регистр произойдет отправка соответствующего текста на указанный номер. | ||
+ | |||
+ | При необходимости отправлять сообщения с кириллицей, потребуется реализовать соответсвующие преобразования текста согласно поддерживаемым вашим модемом кодировкам. | ||
+ | |||
+ | Также, аналогично можно реализовать чтение входящих СМС сообщений и, как следствие, возможно организовать управление 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=\"+" .. string.sub(reg.addr, 4) .. "\"\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> |
Текущая версия на 11:09, 16 ноября 2018
В WebHMI есть инструменты сигнализации о различных событиях путем отправки смс-сообщений (смс-нотификация).
Отправка сообщений используя сервисы Level2
Для этого необходимо запросить у поставщика ключ API для интеграции с системой Level2, в меню "Конфигурация / Настройки", вкладка Level2.
SMS отправляется путем вызова соответствующей функции внутри скрипта (программы) - SendSMS. Для примера создадим скрипт для дешборда (который можно будет "привязать" к кнопке и проверить путем ее нажатия). В блоке 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=\"+" .. string.sub(reg.addr, 4) .. "\"\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=\"+" .. string.sub(reg.addr, 4) .. "\"\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