Error sending sms message asterisk

Модератор: april22

Модератор: april22

Re: Asterisk 11.12.0 sms отправка sms

нужно что бы все работало в одном приложении

kostiksky
 
Сообщений: 8
Зарегистрирован: 29 сен 2014, 14:30

Re: Asterisk 11.12.0 sms отправка sms

Сообщение ded » 29 сен 2014, 16:48

Настраивайте всё в одном приложении, я не против (если кто-то спросит вдруг — «а может ded против?», отвечайте — с ним согласовано!). А от Вас —

kostiksky писал(а): конкретно хотелось бы услышить более конкретики

ded
 
Сообщений: 15465
Зарегистрирован: 26 авг 2010, 19:00

Re: Asterisk 11.12.0 sms отправка sms

Сообщение SolarW » 29 сен 2014, 19:56

Ну как-бы ded все уже написал — внутри своего астериска обменивайтесь текстовыми сообщениями сколько угодно.
http://habrahabr.ru/post/207622/ — примерный мануал по настройке.
Используется для этого как и было сказано SIP метод: MESSAGE
Ну а как это состыковать с отправкой СМС через GSM оператора — мне такого солюшина пока не попадалось.
Если что-то найдете — расскажете и нам, а то как видите местным завсегдатаям такого решения не попадалось.
Предполагаю что вероятно каким-то образом можно текстовое сообщение из Астериска можно выцепить и попробовать отправить через chan_dongle / GSM-VoIP шлюз / внешнего оператора типа упомянутого turbosms.ua в виде СМС.
И это будет только отправка исходящего сообщения.
Со входящими количество вопросов возрастает и первый из них — куда будет слать сообщение ваш корреспондент чтобы оно попало на ваш номер внутри вашей АТС?

Аватар пользователя
SolarW
 
Сообщений: 1331
Зарегистрирован: 01 сен 2010, 14:21
Откуда: Днепропетровск, Украина

Re: Asterisk 11.12.0 sms отправка sms

Сообщение SolarW » 29 сен 2014, 20:03

http://callcenters.by/materialy/sms-modul-asterisk — модуль для Elastix’а умеющий отправлять СМС по SMPP протоколу (turbosms.ua его поддерживает) или через bash-скрипт.
Но отправка только из веб-интерфейса, никакой интеграции с SIP messaging нету.

Аватар пользователя
SolarW
 
Сообщений: 1331
Зарегистрирован: 01 сен 2010, 14:21
Откуда: Днепропетровск, Украина

Re: Asterisk 11.12.0 sms отправка sms

Сообщение kostiksky » 29 сен 2014, 21:43

Со входящими количество вопросов возрастает и первый из них — куда будет слать сообщение ваш корреспондент чтобы оно попало на ваш номер внутри вашей АТС?

до этого пока задача не ставилась ) нужно пока с отправкой что то придумать веть думаю можно что то придумать ) :geek:

kostiksky
 
Сообщений: 8
Зарегистрирован: 29 сен 2014, 14:30

Re: Asterisk 11.12.0 sms отправка sms

Сообщение marsik » 30 сен 2014, 00:59

kostiksky писал(а):Asterisk 11.12.0 sms отправка sms

Добрый день кто что может подсказать по решени интересует отправка смс по Украине чере Asterisk 11.12.0

для организации отправки sms смотрите в сторону

http://www.kannel.org

то в какой регион земного шара будут отправляться sms, тут думаю малого кого заботит, так как схема отправки в другой регион будет одинакова.

marsik
 
Сообщений: 16
Зарегистрирован: 25 июн 2013, 11:57

Re: Asterisk 11.12.0 sms отправка sms

Сообщение SolarW » 30 сен 2014, 01:42

kostiksky писал(а):веть думаю можно что то придумать ) :geek:

Судя по тому что до сих пор никто и ничего не придумал — не так это просто.

Аватар пользователя
SolarW
 
Сообщений: 1331
Зарегистрирован: 01 сен 2010, 14:21
Откуда: Днепропетровск, Украина

Re: Asterisk 11.12.0 sms отправка sms

Сообщение kostiksky » 30 сен 2014, 09:16

пока да покая я посках )

kostiksky
 
Сообщений: 8
Зарегистрирован: 29 сен 2014, 14:30


Вернуться в Конфигурация и настройка Asterisk

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

File: /etc/asterisk/extensions.conf (don’t use odbc as this becomes db intensive on a large number of messages) [websms] exten => _X.,1,NoOp(SMS receiving dialplan invoked) exten => _X.,n,NoOp(To ${MESSAGE(to)}) exten => _X.,n,NoOp(From ${MESSAGE(from)}) exten => _X.,n,NoOp(Body ${MESSAGE(body)}) exten => _X.,n,Set(ACTUALTO=${CUT(MESSAGE(to),@,1)}) exten => _X.,n,ExecIf($[«${ACTUALTO}» != «sip:${EXTEN}»]?Set(ACTUALTO=sip:${EXTEN})) exten => _X.,n,MessageSend(${ACTUALTO},${MESSAGE(from)}) exten => _X.,n,NoOp(Send status is ${MESSAGE_SEND_STATUS}) exten => _X.,n,GotoIf($[«${MESSAGE_SEND_STATUS}» != «SUCCESS»]?sendfailedmsg) exten => _X.,n,Hangup() ; ; Handle failed messaging exten => _X.,n(sendfailedmsg),NoOp(Sending error to user) exten => _X.,n,Set(SRC=${MESSAGE(from)}) exten => _X.,n,Set(DST=${MESSAGE(to)}) exten => _X.,n,Set(MSG=${MESSAGE(body)}) exten => _X.,n,Set(MESSAGE(body)=»[${STRFTIME(${EPOCH},,%d%m%Y-%H:%M:%S)}] Your message to ${EXTEN} has failed. Sending when extension becomes available again») exten => _X.,n,Set(ME_1=${CUT(MESSAGE(from),<,2)}) exten => _X.,n,Set(ACTUALFROM=${CUT(ME_1,@,1)}) exten => _X.,n,MessageSend(${ACTUALFROM},${SRC}) exten => _X.,n,GotoIf($[«${INQUEUE}» != «1»]?startq) exten => _X.,n,Hangup() ; exten => _X.,n(startq),NoOp(Queueing messaging for offline extensions) exten => _X.,n,Set(MSGTIME=${STRFTIME(${EPOCH},,%d%m%Y-%H:%M:%S)}) exten => _X.,n,SYSTEM(/var/lib/asterisk/agi-bin/astqueue.sh -SRC ‘${SRC}’ -DST ‘${DST}’ -MSG ‘${MSG}’) exten => _X.,n,Hangup() [app-fakeanswer] exten => _X.,1,NoCDR exten => _X.,n,Set(DESTDEV=${EXTEN}) exten => _X.,n,Set(THISDEVSTATE=${DEVICE_STATE(SIP/${DESTDEV})}) exten => _X.,n,GotoIf($[«${THISDEVSTATE}» = «UNAVAILABLE»]?hang) exten => _X.,n,GotoIf($[«${THISDEVSTATE}» = «UNKNOWN»]?hang) exten => _X.,n,Answer exten => _X.,n,Hangup() exten => _X.,n(hang),Hangup() File: /var/lib/asterisk/agi-bin/astqueue.sh #!/bin/bash #VARIABLES maxretry=100 retryint=30 # #CONSTANTS ERRORCODE=0 d_unique=`date +%s` d_friendly=`date +%T_%D` astbin=`which asterisk` myrandom=$[ ( $RANDOM % 1000 ) + 1 ] # function bail(){ echo «SMS:[$ERRORCODE] $MSGOUT. Runtime:$d_friendly. UniqueCode:$d_unique» exit $ERRORCODE } while test -n «$1»; do case «$1» in -SRC) source=»$2″ shift ;; -DST) dest=»$2″ shift ;; -MSG) message=»$2″ shift ;; -TIME) originaltime=»$2″ shift ;; esac shift done # # if [[ «$source» == «» ]]; then echo «ERROR: No source. Quitting.» ERRORCODE=1 bail fi if [[ «$dest» == «» ]]; then echo «ERROR: No usable destination. Quitting.» ERRORCODE=1 bail fi if [[ «$message» == «» ]]; then echo «ERROR: No message specified.Quitting.» ERRORCODE=1 bail fi # # generate call file mydate=`date +%d%m%y` logdate=`date` # # Check to see if extension exists destexten=`echo $dest | cut -d @ -f1 | cut -d : -f2` ifexist=`$astbin -rx «sip show peers» | grep -c $destexten`if [[ «$ifexist» == «0» ]]; then echo «Destination extension don’t exist, exiting..» ERRORCODE=1 bail fi # If that conditions passes, then we will queue the message, # Todo: write other conditions too to keep the sanity of the looping filename=»$destexten-$d_unique.$myrandom.call» echo -e «Channel: Local/$destexten@app-fakeanswer CallerID: $source Maxretries: $maxretry RetryTime: $retryint Context: websms Extension: $destexten Priority: 1 Set: MESSAGE(body)=$message Set: MESSAGE(to)=$dest Set: MESSAGE(from)=$source Set: INQUEUE=1 «> /var/spool/asterisk/tmp/$filename # move files chown asterisk:asterisk /var/spool/asterisk/tmp/$filename chmod 777 /var/spool/asterisk/tmp/$filename sleep 3 mv /var/spool/asterisk/tmp/$filename /var/spool/asterisk/outgoing/ # ERRORCODE=0 bail

Данная настройка поможет осуществить отправку сообщений абонентам, которые в данное время не подключены к серверу.
После отправки сообщения абоненту, который находится оффлайн, вы получите уведомление о том что он недоступен. И при следующем входе абонента, он получит сообщение автоматически.

Данную схему использовал на

Elastix 4.0.76

,

Asterisk 11.25.3

.

Редактируем конфиги.

В файл sip_general_custom.conf добавляем следующие строки:

accept_outofcall_message = yes
outofcall_message_context = messages
auth_message_requests = yes

В файл extensions_custom.conf:

[messages]
exten => _X.,1,NoOp(SMS receiving dialplan invoked)
exten => _X.,n,NoOp(To ${MESSAGE(to)})
exten => _X.,n,NoOp(From ${MESSAGE(from)})
exten => _X.,n,NoOp(Body ${MESSAGE(body)})
exten => _X.,n,Set(ACTUALTO=${CUT(MESSAGE(to),@,1)})
exten => _X.,n,ExecIf($["${ACTUALTO}" != "sip:${EXTEN}"]?Set(ACTUALTO=sip:${EXTEN}))
exten => _X.,n,MessageSend(${ACTUALTO},${MESSAGE(from)})
exten => _X.,n,NoOp(Send status is ${MESSAGE_SEND_STATUS})
exten => _X.,n,GotoIf($["${MESSAGE_SEND_STATUS}" != "SUCCESS"]?sendfailedmsg)
exten => _X.,n,Hangup()
;
; Handle failed messaging
exten => _X.,n(sendfailedmsg),NoOp(Sending error to user)
exten => _X.,n,Set(SRC=${MESSAGE(from)})
exten => _X.,n,Set(DST=${MESSAGE(to)})
exten => _X.,n,Set(MSG=${MESSAGE(body)}) 
exten => _X.,n,Set(DESTDEV=${EXTEN})
exten => _X.,n,Set(THISDEVSTATE=${DEVICE_STATE(SIP/${DESTDEV})})
exten => _X.,n,Set(MESSAGE(body)="[${STRFTIME(${EPOCH},,%d%m%Y-%H:%M:%S)}] В данное время абонент ${EXTEN} недоступен.")
exten => _X.,n,Set(ME_1=${CUT(MESSAGE(from),<,2)})
exten => _X.,n,Set(ACTUALFROM=${CUT(ME_1,@,1)})
exten => _X.,n,MessageSend(${ACTUALFROM},SupportBot)
exten => _X.,n,GotoIf($["${INQUEUE}" != "1"]?startq)
exten => _X.,n,Hangup()
;
exten => _X.,n(startq),NoOp(Queueing messaging for offline)
exten => _X.,n,Set(MSGTIME=${STRFTIME(${EPOCH},,%d%m%Y-%H:%M:%S)})
exten => _X.,n,SYSTEM(/var/lib/asterisk/agi-bin/astqueue.sh –SRC '${SRC}' –DST '${DST}' –MSG '${MSG}')
exten => _X.,n,Hangup()

[app-fakeanswer]
exten => _X.,1,NoCDR
exten => _X.,n,Set(DESTDEV=${EXTEN})
exten => _X.,n,Set(THISDEVSTATE=${DEVICE_STATE(SIP/${DESTDEV})})
exten => _X.,n,GotoIf($["${THISDEVSTATE}" = "UNAVAILABLE"]?hang)
exten => _X.,n,GotoIf($["${THISDEVSTATE}" = "UNKNOWN"]?hang)
exten => _X.,n,Answer
exten => _X.,n,Hangup()
exten => _X.,n(hang),Hangup()

Создаем скрипт обработки.

Временная папка:

mkdir /var/spool/asterisk/temp
chown -R asterisk:asterisk /var/spool/asterisk/temp

Сам скрипт:

nano /var/lib/asterisk/agi-bin/astqueue.sh

Содержимое фала скрипта:

#!/bin/bash
# v0.2
# copyleft Sanjay Willie sanjayws@gmail.com
# SCRIPT PURPOSE: GENERATE SMS OFFLINE QUEUE
# GEN INFO: Change variables sections
###########################################
#
#VARIABLES
maxretry=2880
retryint=30
#
#CONSTANTS
ERRORCODE=0
d_unique=`date +%s`
d_friendly=`date +%T_%D`
myrandom=$[ ( $RANDOM % 1000 ) + 1 ]
#
function bail(){
      echo "SMS:[$ERRORCODE] $MSGOUT. Runtime:$d_friendly. UniqueCode:$d_unique"
    exit $ERRORCODE
}
source=$2
dest=$4
message=$6
#
#
if [[ "$source" == "" ]]; then
    echo "ERROR: No source. Quitting."
    ERRORCODE=1
    bail
fi
if [[ "$dest" == "" ]]; then
    echo "ERROR: No usable destination. Quitting."
    ERRORCODE=1
    bail
fi
if [[ "$message" == "" ]]; then
    echo "ERROR: No message specified.Quitting."
    ERRORCODE=1
    bail
fi
#
# generate call file
mydate=`date +%d%m%y`
logdate=`date`
#
# Check to see if extension exist
destexten=`echo $dest | cut -d @ -f1 | cut -d : -f2`
ifexist=`asterisk -rx "sip show peers" | grep -c $destexten`
if [[ "$ifexist" == "0" ]]; then
    echo "Destination extension don't exist, exiting.."
    ERRORCODE=1
    bail
fi
# If that conditions pass, then we will queue, 
# you can write other conditions too to keep the sanity of the looping
filename="$destexten-$d_unique.$myrandom.call"
echo -e "Channel: Local/$destexten@app-fakeanswer
CallerID: $source
Maxretries: $maxretry
RetryTime: $retryint
Context: messages
Extension: $destexten
Priority: 1  
Set: MESSAGE(body)=$message
Set: MESSAGE(to)=$dest
Set: MESSAGE(from)=$source
Set: INQUEUE=1 "> /var/spool/asterisk/temp/$filename
# move files
chown asterisk:asterisk /var/spool/asterisk/temp/$filename
chmod 777 /var/spool/asterisk/temp/$filename
sleep 3
mv /var/spool/asterisk/temp/$filename /var/spool/asterisk/outgoing/
#
ERRORCODE=0
bail

maxretry — максимальное количество повторов отправки сообщения.
retryint — интервал между повторами

Поправим права на файл:

chown asterisk:asterisk /var/lib/asterisk/agi-bin/astqueue.sh
chmod +X /var/lib/asterisk/agi-bin/astqueue.sh

Оригинал: highsecurity.blogspot.com/2013/01/asterisk-10-or-11-messaging-smssip.html
Thanks SANJAY WILLIE’S for this script.

Железо, Сетевое оборудование, Блог компании АртТел


Рекомендация: подборка платных и бесплатных курсов Java — https://katalog-kursov.ru/

Так как мы занимаемся продажами VoIP оборудования, к нам часто обращаются с различными техническими вопросами. Иногда доходит до того, что клиенты просят примеры кода на конкретных языках программирования. Работа с SMS и интеграция их в бизнес процессы — как раз один из таких регулярных вопросов, поэтому и хочется остановится на нём и рассмотреть более подробно.

Почему GoIP и Yeastar

В действительности, я бы хотел рассказать еще и про OpenVox, но на хабре уже есть статья именно про их шлюзы, да и в наличии на момент написания этого материала их не было. Так же подобные шлюзы делает Dinstar, но обращений по этим шлюзам у нас так катастрофически мало, так что их я решил тоже не рассматривать.

GoIP

GSM шлюзы GoIP производятся в Китае под брендами нескольких компаний и относятся к низшей ценовой категории, отчасти поэтому они самые популярные. Всё нижеописанное мною применительно к GoIP 4 фирмы DBL, в теории оно же должно работать и на шлюзах Hybertone, но ручаться за это не буду, так как возможны отличия в прошивках.

▪ Web интерфейс

Самый простой способ отправить SMS — это зайти на страничку шлюза, выбрать раздел Send SMS, указать линию, с которой необходимо отправить сообщение, номер получателя и непосредственно текст сообщения. Вариант простой, но годится разве что для теста, не более того. Однако есть возможность отправлять смски с помощью GET и POST запросов.

→ GET

Для типа GET используем запрос вида:
http://192.168.1.190/default/en_US/send.html?u=admin&p=admin&l=1&n=89991234567&m=test

u=admin – имя пользователя
p=admin – пароль
l=1 – канал, с которого надо отправить сообщение
n=89991234567 – номер получателя (надо указывать начиная с «8», при использовании «+7» или «7» получим ошибку)
m=test – текст сообщения

Если что то пошло не так, то в ответ мы получим сообщение вида: «ERROR, описание проблемы», в противном случае: «Sending, L1 Send SMS to 89991234567; ID:55c489da». Думаю, тут все и так ясно: статус, номер линии, номер получателя, и присвоенный индификатор, чтобы впоследствии можно было отследить статус отправления.

→ POST

Отправка с помощью POST запроса — это тоже самое, что отправка через форму в web интерфейсе, отличается тем, что мы сами должны указывать индификатор SMS, в определенных случаях это может быть удобнее. Так же через POST мы можем отправить USSD запрос, что тоже может быть полезно.

Простой пример на perl с использованием фреймворка Mojolicious:

#!/usr/bin/perl -w

use utf8;
use Mojo::UserAgent;

my $ua = Mojo::UserAgent->new;

$ua->post('http://admin:admin@192.168.1.190/default/en_US/sms_info.html?type=sms' 
                    => {Accept => '*/*'}
                    => form => {
                            line    => '1',
                            smskey  => '57867a25',
                            action  => 'SMS',
                            telnum  => '89991234567',
                            smscontent => 'Привет!',
                            send    => 'Send'
                        });

Для отправки USSD придется немного изменить запрос:

$ua->post('http://admin:admin@192.168.1.190/default/en_US/sms_info.html?type=ussd' 
                => {Accept => '*/*'}
                => form => {
                        line1 => '1',
                        smskey => '57876006',
                        action => 'USSD',
                        telnum => '*100#',
                        send => 'Send'
                    });

Для получения результата придется делать отдельный GET запрос статуса сообщений.

→ Статус сообщений

Отслеживать статусы необходимо хотя бы потому, что мы можем попытаться отправить сообщение в момент, когда линия занята отправкой другого сообщения и, как результат, ничего не выйдет. Плюс к этому, разработчики GoIP не стали заморачиваться с созданием отдельного средства получения результатов USSD запросов, а просто пишут их в виде расшифровок ошибок.

Статусы отправлений можно отслеживать по адресу:
http://192.168.1.190/default/en_US/send_status.xml?u=admin&p=admin

В ответ мы получим XML, в которой отображается статус одного последнего отправления на канал, у меня под рукой был GoIP 4, а у него единая прошивка с восьмым, поэтому в статусах 8 каналов, хотя физически их было 4:

<?xml version="1.0" encoding="utf-8"?>
<send-sms-status>
    <id1>57867a25</id1>
    <status1>DONE</status1>
    <error1></error1>
    <id2>57867277</id2>
    <status2>ERRORDONE</status2>
    <error2>send, but provider not reply.</error2>
    <id3>57876006</id3>
    <status3>DONE</status3>
    <error3>Ваш баланс: 57.2 р.</error3>
    <id4></id4>
    <status4>DONE</status4>
    <error4></error4>
    <id5></id5>
    <status5></status5>
    <error5></error5>
    <id6></id6>
    <status6></status6>
    <error6></error6>
    <id7></id7>
    <status7></status7>
    <error7></error7>
    <id8></id8>
    <status8></status8>
    <error8></error8>
</send-sms-status>

▪ Протокол SMPP

SMPP (Short message peer-to-peer protocol) – специальный протокол, используемый для передачи SMS и USSD сообщений между клиентом и сервером. Это, наверное, единственный «нормальный» способ получать сообщения. Да, в web интерфейсе отображаются последние пять сообщений для каждого канала, но вариант периодически лезть на него и проверять, не появилось ли что то новое, я не могу отнести к адекватным.

Настройка SMPP

Хотя и с SMPP все не так гладко. Во первых, сообщения приходят в кодировке UTF-16BE. Сначала мне об этом информация нигде не попадалась и пришлось изрядно попрыгать с бубном, чтобы понять, в какой же кодировке принимаются смски. Правда после этого нашёлся параметр (data_coding), который как раз и указывает на то, как закодировано сообщение.

Во вторых, в качестве destination_addr всегда будет system_id, с которым мы подключаемся к GoIP-у, т. е. нет возможности понять, на какую именно симку пришло сообщение. Это можно обойти – необходимо подключаться с system_id + 0 + номер канала, тогда мы будем получать сообщения только для заданного канала, естественно минус такого решения в том, что необходимо держать несколько коннектов.

Простейший пример получения сообщений с использованием библиотеки Net::SMPP:

#!/usr/bin/perl -w 

use utf8;
use strict;
use Net::SMPP;
use Encode;
use feature 'say';

my $smpp = Net::SMPP->new_transceiver('192.168.1.190',
                system_id => 'arttel', # Если хотим слушать только первый канал то – arttel01, второй – arttel02 и т.д.
                password => 'arttel',
                port => '7777',
                smpp_version=> 0x34
) or die "Can't connect to SMSC: $!";

while (1) {
    my $pdu = $smpp->read_pdu();
    # Меняем кодировку на системную
    my $short_message =  Encode::decode("UTF-16BE", $pdu->{short_message});

    say $short_message;
}

С отправкой такая же история, если необходимо отправить SMS с конкретной SIM карты, то подключаемся с id нужного канала:

#!/usr/bin/perl -w 

use utf8;
use strict;
use Net::SMPP;

my $smpp = Net::SMPP->new_transceiver('192.168.4.107',
                system_id => 'arttel01',
                password => 'arttel',
                port => '7777',
                smpp_version=> 0x34
) or die "Can't connect to SMSC: $!";

&send_message('89991234567', 'Привет!!!');

sub send_message {
    my ($sm_dest_addr, $sm_message) = @_;
    my $result = eval {

        my $pru = $smpp->submit_sm(
            source_addr_ton => 0x05, # Тип номера отправителя
            source_addr_npi => 0x01, # Идентификатор плана нумерации отправителя
            source_addr => '',
            dest_addr_ton => 0x01, # Тип номера получателя
            dest_addr_npi => 0x01, # Идентификатор плана нумерации получателя
            destination_addr => $sm_dest_addr,
            data_coding => 0x01, # Определяет схему кодировки пользовательских данных короткого сообщения
            short_message => $sm_message
        ) or return 1;

        return 0;
    };

    if ($result == 1){
        print "Can't send message: $!";
    }
}

#Разрываем соединение с SMSC
$smpp->unbind();

Описание параметров отправки

Параметр Описание Значения
source_addr_ton Тип номера отправителя 0x00 — Неизвестный (Unknown)
0x01 — Международный (International)
0x02 — Государственный (National)
0x03 — Сетевой Специальный (Network Specific)
0x04 — Номер Абонента (Subscriber Number)
0x05 — Алфавитно-цифровой (Alphanumeric)
0x06 — Сокращенный (Abbreviated)
source_addr_npi Идентификатор плана нумерации отправителя 0x00 — Unknown 0x01 — ISDN (E163/E164)
0x02 — Data (X.121)
0x03 — Telex (F.69)
0x04 — Land Mobile (E.212)
0x05 — National
0x06 — Private
0x07 — ERMES
0x08 — Internet (IP)
0x09 — WAP Client Id (его должен определять WAP Forum)
dest_addr_ton Тип номера получателя 0x01 — Международный (International)
dest_addr_npi Идентификатор плана нумерации получателя 0x01 — ISDN (E163/E164) (для номеров)
0x02 — National (для остального)
data_coding Определяет схему кодировки пользовательских данных короткого сообщения 0x01 — IA5(CCITT T.50)/ASCII (ANSI X3.4) латинский алфавит 7 бит на 1 символ максимальная длина одного сообщения 160 символов
0x07 — Latin/Hebrew(ISO-8859-8) латинский алфавит 8 бит на 1 символ максимальная длина сообщения 140 символов
0x08 — UCS2(ISO/IEC-10646) для национальных алфавитов (например, русского) максимальная длина сообщения 70 символов

Yeastar

Родина Yeastar, так же как и у GoIP – Китай, хотя, как мне кажется, в Yeastar стараются делать устройства с большей претензией на качество и удобство использования, чем их конкуренты. Это касается как физического, так и программного исполнения. Но и у них бывают огрехи. Так, например, документация не всегда поспевает за изменениями в новых прошивках, а в отдельных случаях в ней могут отсутствовать важные моменты.

▪ Web интерфейс

Отправлять и принимать сообщения можно через web интерфейс, в общем то, это стандартный способ для подобных железок. В шлюзах Yeastar этот интерфейс чем то отдаленно напоминает простенькие почтовые web морды — «папочки» Inbox и Outbox с незатейливыми фильтрами и поиском. В любом случае, это на голову выше чем то, что есть в GoIP, а главное хранятся не последние пять входящих сообщений для каждого канала, а значительно больше. Только, к сожалению, не понятно сколько, опять же в datasheet про это нет ни слова.

→ GET

Так же как и в большинстве подобных железок, отправить сообщение можно с помощью GET запроса, что в общем не удивительно, это один из самых простых способов интеграции. Естественно, у Yeastar своя реализация со своими особенностями.

Для начала надо включить возможность отправлять SMS сообщения и USSD запросы. Для этого необходимо активировать «API Settings», если вы предпочитаете интерфейс на русском языке, то данный раздел будет называться «Настройки AMI» (правда очень логично?). Во вторых, необходимо поменять пароль по умолчанию, пока этого не сделаешь, авторизация не проходит, об этом опять же ни слова в документации.

Настройка API Settings

После этих манипуляций мы можем использовать запросы для SMS и USSD соответственно:

http://192.168.5.150/cgi/WebCGI?1500101=account=arttel&password=arttel&port=1&destination=89991234567&content=test

Response: Success
Message: Commit successfully!

http://192.168.5.150/cgi/WebCGI?1500102=account=arttel&password=arttel&port=1&content=%2A100%23

Request: 1,*100#
Response: Success
Message: Ваш баланс:
36.3 р.

Коротко о параметрах:

account=arttel – имя пользователя что мы указали в настройках API Settings
password=arttel – пароль из API Settings
port=1 – канал, с которого будет осуществлена отправка
destination=89991234567 – номер получателя, используется только при отправке SMS
content=test – текст сообщения или USSD запроса

Главное отличие от GoIP: при отправке SMS с Yeastar нет необходимости контролировать занят канал или нет, наше сообщение ставится в очередь и как только канал освобождается оно будет отправлено. А с USSD запросами работа происходит синхронно, т. е. ответ мы получаем сразу и нет необходимости его где то потом искать. Минус только в том, что ответы нам приходят в виде plain text, а хотелось бы что то более подходящее: JSON или XML.

▪ Asterisk Managment Interface

Вся линейка шлюзов Yeastar построена вокруг Asterisk (программный сервер IP-телефонии от компании Digium), поэтому поддержка такого специфического протокола как SMPP отсутствует. Зато есть родной для Asterisk’a протокол AMI, работать с которым достаточно просто.

Для начала посмотрим как принимать сообщения:

#!/usr/bin/perl -w

use utf8;
use strict;
use warnings;
use AnyEvent::Impl::Perl;
use Asterisk::AMI;
use Data::Dumper;
use URI::Escape;
use feature 'say';

# Подключаемся к AMI
my $astman = Asterisk::AMI->new(
            PeerAddr => '192.168.5.150', # Адрес шлюза
            Username => 'arttel', # Имя пользователя из API Settings
            Secret  => 'arttel', # Пароль из API Settings
            Events  => 'on',
            Handlers => { 
                ReceivedSMS => &received_sms # Подписываемся на приём сообщений
            },
            Keepalive => 60,
            on_error => sub { print "Error occured on socketrn"; exit; },
            on_timeout => sub { print "Connection to asterisk timed outrn"; exit; }
        );

die "Unable to connect to asterisk" unless ($astman);

sub received_sms {
    my ($asterisk, $event) = @_;

    say Dumper($event);
    # Приводим сообщение к читаемому виду
    say uri_unescape($event->{'Content'}) if ($event->{'Content'});

    return 1;
}

AnyEvent::Impl::Perl::loop;

=result 
$VAR1 = {
          'Total' => '1',
          'Recvtime' => '2016-07-15 17:49:55',
          'ID' => '',
          'Event' => 'ReceivedSMS',
          'Privilege' => 'all,smscommand',
          'Index' => '1',
          'GsmSpan' => '4',
          'Sender' => '+79991234567',
          'Smsc' => '+79997456321',
          '--END SMS EVENT--' => undef,
          'Content' => '%EF%BB%BF%D0%9A%D1%83-%D0%BA%D1%83'
        };

Ку-ку
=end

Пример достаточно прост и мне кажется, что всё должно быть понятно. Единственное, на что хочу обратить внимание это «GsmSpan». Мы все привыкли, что индексация массивов начинается с 0, здесь же не 0 и не 1, а 2, последовательный номер канала отображается как номер + 1, поэтому минимальное значение GsmSpan это 2.

Так же через AMI мы может отправлять SMS и USSD запросы:

#!/usr/bin/perl -w

use strict;
use warnings;
use Asterisk::AMI;
use Data::Dumper;
use URI::Escape;
use Encode;
use feature 'say';

# Connect to asterisk
my $astman = Asterisk::AMI->new(
            PeerAddr => '192.168.5.150',
            Username => 'arttel',
            Secret  => 'arttel',
            Timeout => 30, # Таймаут на выполнение команд, если используем USSD то ставим побольше
            Keepalive => 60,
            on_error => sub { print "Error occured on socketrn"; exit; },
            on_timeout => sub { print "Connection to asterisk timed outrn"; exit; }
        );

die "Unable to connect to asterisk" unless ($astman);

# Отправляем USSD запрос
my %action = (
    Action => 'smscommand',
    Command => 'gsm send ussd 2 "*100#"'
);
my $actionid = $astman->send_action(%action);
my $response = $astman->get_response($actionid);

my @cmd = @{$response->{CMD}};
my $i = 0;
while ($i <= $#cmd) {
    if ($cmd[$i] =~ /USSD Message: (.+)/) {
        # Ответ будет закодирован, поэтому потребуется не много магии
        my $decodedHex = pack('H*', $1);
        say decode("UCS-2BE", $decodedHex);
    }

    $i++;
}

# Отправляем SMS
%action = (
    Action => 'smscommand',
    Command => 'gsm send sms 2 89991234567 "Привет" 11111'
);
$actionid = $astman->send_action(%action);
$response = $astman->get_response($actionid);

По USSD думаю всё понятно, только не забываем, что каналы нумеруются с двойки. А по SMS есть небольшое уточнение: если нам судьба сообщения безразлична и статус отслеживать не надо, то после текста сообщения можно ничего не указывать. В противном случае, необходимо указать уникальный индификатор. Тогда, когда судьба смски станет известна, система отправит нам сообщение о её состоянии. Что-то такого вида:

$VAR1 = {
          'ID' => '11111',
          'Event' => 'UpdateSMSSend',
          '--END SMS EVENT--' => undef,
          'Status' => '1',
          'Privilege' => 'all,smscommand',
          'Smsc' => '+79991234567'
        };

Status = 1 говорит нам о том, что сообщение успешно доставлено, а в случае ошибки статус будет равен 0. Получать подобные сообщения можно, подписавшись на события UpdateSMSSend, делается это точно так же, как и при приеме SMS.

В качестве заключения

Лично мне было бы удобнее работать со шлюзом Yeastar TG400 через AMI. С другой стороны, я не вижу каких-то больших проблем и в случае использования GoIP. О чем я сознательно умолчал: у каждого из производителя есть бесплатный программный SMS сервер, в случае GoIP чтобы его использовать потребуется PHP, Apache и MySQL, а в случае Yeastar – Windows. Подобные продукты больше подходят для рассылки одинаковых сообщений по заранее подготовленным базам номеров, а не интеграции с какими-то приложениями. Это и есть причина, по которой я их пропустил. Если кому-то интересно, на сайтах производителей должны быть соответствующие описания.

Понравилась статья? Поделить с друзьями:
  • Error sending request to chip module eltex
  • Error sending request nordvpn
  • Error sending password change confirmation email
  • Error sending message to server перевод
  • Error sending message child exited 127 exec error