Очистка смс на модеме через datacard - Asterisk

  • VOIP
ERROR[15627]: at_response.c:1420 at_response_smmemfull: [dongle0] SMS storage is full

Это означает, что память SMS заполнена, и нужно ее освободить. Существует 2 вида памяти SMS: на SIM карте и в самом 3G модеме.
Для очистки памяти SIM применяем в консоли астериска последовательно команды:
datacard cmd AT+CPMS=\«SM\»,\«SM\»,\«SM\»
datacard cmd AT+CMGD=1,4
Для очистки памяти модема применяем в консоли астериска последовательно команды:
datacard cmd AT+CPMS=\«ME\»,\«ME\»,\«ME\»
datacard cmd AT+CMGD=1,4
В консоли asterisk (CLI) должно появиться сообщение вида:
[datacard_name] 'AT+CMGD=1,4'
Command queued for execute
[datacard_name] Got Response for user's command:'OK'
...NOTICE[15627]: at_response.c:1714 at_response: [dongle_name] Got Response for user's command:'OK'

Всё. Память SMS очищена.
===
Читать дальше

Подключение модема Huawei E1550 к FreePBX (elastix ).

  • VOIP
Протестированно на модеме Huawei E1550 с разлоченным звонками и версией прошивки 11.608.14.15.311 СКАЧАТЬ ТУТ
А теперь перейдем к установке и настройке модема. Для нормальной работы модема отключим на нем CardReader и виртуальный CD-ROM. Сделать это можно так:

[email protected]:$ sudo -i
[email protected]:$ apt-get install minicom
[email protected]:$ minicom -s
Выбираем настройку последовательного порта:
Нажимаем А и редактируем порт — /dev/ttyUSB0 после этого жмем два раза Enter и нажимаем Выход.
После подключения к модему введем команду — AT^U2DIAG=0 (Это команда перевода модема в режим только модем)
Выходим нажав Ctrl-A а потом Q

CardReader и виртуальный CD-ROM отключены можно продолжать.
Дальше — если нет svn то доставим

# yum install mod_dav_svn mod_ssl


Ну а дальше непосредственно к установке chan_datacard. По чему то не захотел ставиться на elastix 2.4

# svn co http://www.makhutov.org/svn/chan_datacard/trunk/ chan_datacard
# cd ~/chan_datacard/
# ./configure
# make install
# cp ~/chan_datacard/etc/datacard.conf /etc/asterisk


Второй вариант это chan_dongle

Устанавливаем последнюю стабильную версию Dongle-1.1.r14:

Качаем, распаковываем и переходим в папку с исходниками модуля chan_dongle выполнив команды:

wget http://asterisk-chan-dongle.googlecode.com/files/chan_dongle-1.1.r14.tgz
tar xvfz chan_dongle-1.1.r14.tgz
cd chan_dongle-1.1.r14

Если на официальном сайте отсутствует архив с дистрибутивом модуля Dongle, скачиваем его с этого сайта:

wget http://softnastroy.com/downloads/asterisk/chan_dongle-1.1.r14.tgz
tar xvfz chan_dongle-1.1.r14.tgz
cd chan_dongle-1.1.r14

Запускаем конфигурирование, сборку и установку модуля chan_dongle командами:

./configure
make
cp chan_dongle.so /usr/lib/asterisk/modules/
cp etc/dongle.conf /etc/asterisk/


Устанавливаем самую последнюю разрабатываемую версию Dongle из svn:

aptitude install autoconf
cd /usr/src/asterisk-src/
svn checkout http://asterisk-chan-dongle.googlecode.com/svn/trunk/
cd trunk/
aclocal
autoconf
automake -a
./configure
make
cp chan_dongle.so /usr/lib/asterisk/modules/
cp etc/dongle.conf /etc/asterisk/
chown -R asterisk:asterisk /usr/lib/asterisk/modules/chan_dongle.so
/etc/init.d/asterisk restart


Задание прав и пользователя устройства (Huawei E1550)

Предположим, по умолчанию так:

# ls -al /dev | grep ttyS


crw-rw----   1 root     dialout    4,  64 Сен 23 15:14 ttyUSB0
crw-rw----   1 root     dialout    4,  65 Сен 23 15:14 ttyUSB1
crw-rw----   1 root     dialout    4,  66 Сен 23 15:14 ttyUSB2

А Asterisk запущен из под одноименного пользователя

в консоли увидим:

chan_dongle.c: unable to open /dev/ttyUSB1: Permission denied
создадим правило udev

nano /etc/udev/rules.d/e1550.rules

Вставим в созданный файл.
KERNEL=="ttyUSB[012]", OWNER="asterisk", GROUP="asterisk", MODE="0660"


# /sbin/start_udev  
 # ls =al /dev | grep ttyUSB


crw-rw--   1 asterisk asterisk   4,  64 Сен 23 15:25 ttyUSB0
crw-rw--   1 asterisk asterisk   4,  65 Сен 23 15:25 ttyUSB1
crw-rw--   1 asterisk asterisk   4,  66 Сен 23 15:25 ttyUSB2


Отредактируем файл конфигурации модуля модема:

[email protected]:$ nano /etc/asterisk/datacard.conf
Удаляем всё после последней черты в конфиг файле и вставляем:

[ВАШ НОМЕР СИМ КАРТЫ]
context=from-gsm         ; context для входящих звонков
audio=/dev/ttyUSB1        ; tty порт для аудио подключения
data=/dev/ttyUSB2         ; tty порт для управляющих AT комманд модема
group=1              ; Группа вызова
rxgain=10             ; Изменение громкости динамика
txgain=-5             ; Изменение громкости микрофона
resetdatacard=yes         ; Перезагрузка модема при перезапуске модуля
autodeletesms=yes         ; Удаление смс с симкарты при перезапуске
usecallingpres=yes        ; use the caller ID presentation or not
callingpres=allowed_passed_screen ; set caller ID presentation

Создадим конфигурационный файл для входящих подключений:

Для входящих вызовов, sms и ussd запросов настроим extensions.conf:



[datacard-incoming]
exten => sms,1,Verbose(Incoming SMS from ${CALLERID(num)} ${SMS})
exten => sms,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DATACARD} - ${CALLERID(num)}: ${SMS}' >> /var/log/asterisk/sms.txt)
exten => sms,n,Hangup()

exten => ussd,1,Verbose(Incoming USSD: ${USSD})
exten => ussd,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DATACARD}: ${USSD}' >> /var/log/asterisk/ussd.txt)
exten => ussd,n,Hangup()

exten => s,1,Dial(SIP/100,,)
exten => s,n,Hangup()

Подробности

Маршрутизация по наименьшей стоимости в Asterisk

  • VOIP
Тема актуальная. Для меня как для корпоративного телефониста лет пять-десять назад всегда была задача настроить функцию ARS на Panasonic TDA100/200/600 или LCR на LG LDK100/300. В общем, сделать так чтобы подешевле звонить было. Но времена меняются, и сейчас у многих компаний используется Asterisk, а я уже не настраиваю УПАТС Panasonic, LG и прочие.

В Астериске, всем известно, вся маршрутизация делается в диалплане. Но если у оператора много направлений и цена на каждое из них различна, то в диалплане получаются портянки на несколько страниц. Решения разные: кто-то разбивает по разным файлам диалплана, использует макросы, кто-то подключает к работе БД, кто-то выносит на отдельный сервис.

Я хочу поделиться своим решением: вынести поиск оператора с наименьшей стоимостью заданного направления в стороннее приложение на node.js, с которым Астериск взаимодействует посредством AGI.



 

Задача

Получить простое и быстрое решение для определения оператора, у которого наименьшая стоимость минуты звонка, которое также быстро устанавливается и настраивается.

С одной стороны с приложением должен взаимодействовать Астериск, передавая направление звонка и запрашивая оператора с наименьшей стоимостью. С другой стороны через веб-интерфейс с приложением взаимодействует пользователь, который добавляет операторов связи, направления и их стоимость.

Схема



LCR Finder

Подробная установка в описании к проекту на гитхабе. Но мы воспользуемся заготовкой приложения lcr-finder-app (клонируем, устанавливаем зависимости и запускаем приложение).

Установленное приложение открывает два порта для соединений, одно для Астериска — запросов по AGI, другое для веб-интерфейса.

Затем настроить Астериск в файле extensions.conf достаточно выполнить запрос в AGI и сделать вызов по результату.
 
<code class="bash" style="margin: 0px; padding: 1px 4px; border: 1px solid rgb(225, 225, 232); font-size: 12px; vertical-align: baseline; outline: 0px; display: block; white-space: pre-wrap; font-family: Menlo, Monaco, 'Courier New', monospace; color: rgb(34, 34, 34); border-radius: 3px; background: rgb(247, 247, 249);">exten=>_X.,1,AGI(agi://localhost:3000)
exten=>_X.,n,Dial(SIP/<span class="variable" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: rgb(150, 142, 91);">${LCR_RESULT}</span>/<span class="variable" style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; outline: 0px; color: rgb(150, 142, 91);">${EXTEN}</span>)
</code>


Также после запроса в AGI к LCR Finder'у устанавливаются переменные LCR_STATUS, LCR_RESULT, LCR_SEQUENCE. LCR_STATUS — FAILED, SUCCESS в зависимости от результата поиска, LCR_RESULT — имя оператора с наименьшей стоимостью, LCR_SEQUENCE — список всех операторов через запятую, отсортированных в порядке возрастания стоимости. LCR_SEQUENCE позволяет реализовать failover, если оператор с наименьшей стоимостью не пропускает вызов, то можно взять следующего.

В веб-интерфейсе, который на angular.js быстро сверстал мой коллега Анатолий, все достаточно лаконично: добавляем оператора, добавляем к нему направления и стоимость. Во вкладке поиска можно проверить стоимость направление у операторов.

Вопрос к астерискерам: нужно ли развивать эту систему? Стали бы вы пользоваться ей в своих инсталляциях с Астериском. Сейчас здесь нет загрузки Excel файлов с направлениями (я сначала командой в mongodb загружаю направления, т.к. у меня есть небольшой скрипт для этого, а потом в веб-интерфейсе я или заказчик меняем цены по необходимости). Есть еще задумка с весом оператора, т.к. иногда цена не единственный параметр влияющий на выбор оператора.

Есть ли подобные системы? Конечно, да. Например, знаю, что некоторые используют для A2Billing для LCR, еще есть проект LCDial.sh (не знаю, кто-нибудь им пользуется), кто-то использует такие скрипты.

Надеюсь на конструктивную критику и предложения по улучшению. Думаю, что поможет кому-нибудь сэкономить дополнительные средства для развития в наше непростое время.

P.S. Небольшое видео по установке lcr-finder'а

 
Взято с хабры .

 
Читать дальше

Grandstream GXW-4104 и GXW-4108 + Asterisk

  • VOIP
В этой статье опишу способ подключения FXO шлюзов Grandstream GXW-4104 и GXW-4108 к Asterisk. Для удобства будем использовать AsteriskNow или Trixbox. Настройка для них идентична. Целью подключения является организовать подачу линий от городской телефонной сети либо от офисной АТС в вашу PBX и организовать возможность делать входящие и исходящие, вызовы в ТФОП или в АТС.

Сперва настроим в Trixbox trunk для FXO порта Grandstream`a.
Указываем необходимый минимум настроек:

Trunk_port1
Outbound Caller ID: PORT1 ( можно указать и номер который прикреплён к экстеншену, в моём случае это просто не критично)
Trunk Name: PORT1
host=dynamic
username=PORT1
secret=PaSsWoRd
type=peer
disallow=all
allow=alaw
qualify=yes


Читать дальше

Соединение двух FreePBX

  • VOIP
Существуют две точки входа в Диалплан FreePBX.
Это контексты [from-trunk] и [from-internal]. Когда вызов направляется в контекст [from-trunk], он обрабатывается как DID и рассматривается как внешний вызов. Если же вызов направляется в контекст [from-internal] он рассматривается как внутренний вызов от SIP, IAX или DAHDI екстеншена Вашей АТС. Далее будет рассмотрен пример объединения двух FreePBX с созданием общего Диалплана, так, чтобы для конечного пользователя две машины работали как одна.

FreePBX «офис1» выходит через ’9′ на внешние линии и имеет внутреннюю нумерацию от 110 до 149.

FreePBX «офис2» выходит через ’0′ на внешние линии и имеет внутреннюю нумерацию в диапазоне от 200 до 249.

Первым делом создадим IAX транк между двумя сторонами.

Для FreePBX «офис1»

Trunks

Trunk Name

office2
PEER Details

deny=all              запрещает использование всех аудио кодеков.
allow=g729&alaw       разрешает использование кодеков g729 и g711 alaw.
type=friend           может совершать и принимать звонки
host=IP'office2'      может совершать и принимать звонки с хоста 'office2'.
qualify=yes           регулярно поддерживать связь с удаленной машиной.
context=from-internal обрабатывать входящие звонки из 'office2'в контексте [from-internal]
Для FreePBX «офис2» создается такой же транк. Только изменяем host на IP’office1′. Trunk Name


office1
PEER Details

deny=all
allow=g729&alaw
type=friend
host=IP 'office1'
qualify=yes
context=from-internal


Вот и все с транками. Теперь создадим исходящую маршрутизацию.

Для FreePBX «офис1»

Outbound Routes

Route Name

tooffice2
Dial Patterns

2[0-4]X
Trunk Sequence

IAX/office2
Для FreePBX «офис»

Route Name

tooffice1
Dial Patterns

1[1-4]X
Trunk Sequence

IAX/office1
Читать дальше