Отправка SMS сообщений

Материал из WebHMI Wiki
Перейти к: навигация, поиск

В WebHMI есть инструменты сигнализации о различных событиях путем отправки смс-сообщений (смс-нотификация).

Отправка сообщений используя сервисы Level2

Для этого необходимо запросить у поставщика ключ API для интеграции с системой Level2, в меню "Конфигурация / Настройки", вкладка Level2.
API key set.png

SMS отправляется путем вызова соответствующей функции внутри скрипта (программы) - SendSMS. Для примера создадим скрипт для дешборда (который можно будет "привязать" к кнопке и проверить путем ее нажатия). В блоке send sms указывается номер телефона и текст сообщения.
SMS send script.png
На дешборде создадим кнопку с свойством вызова скрипта по нажатию:
Sms dash 3.png

Отправка 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