Установка и запуск Asterisk на Android-смартфоне

Здравстуй, хабр!

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



1. Зачем

Я работаю в компании, которая занимается настройкой телефонии для маленьких и не очень компаний по городу и области. Asterisk в большинстве случаев является самым оптимальным вариантом АТС, так как легко настраивается, масштабируется под нужды организации, можно дополнять функционал своими скриптами. Имеется свой джентльменский набор для демонстрации работы АТС — старенький макбук с линуксом на борту и настроенным астером, SIP-трубка Gigaset, шлюз SPA8000, SIP-транк на нашу АТС для внешних звонков.
Случилось так, что кот опрокинул стакан сока на ноутбук. Заказал на aliexpress клавиатуру, но при замене нечаянно сломал шлейф. Пока откладываю деньги на новый топкейс и шлейф — нужно делать стенд — утром переговоры. На новом ноуте под виртуалку места нет, линукс ставить — жаль рабочую систему. Решил — стоит попробовать на смартфоне, заодно оценить его возможности по железу.

2. Установка

Имеем — Sony Xperia M Dual, последний билд Cyanogenmod с 4.4.4, MicroSD на 32гб 10 класса. Метод должен работать большинстве смартфонов с root правами и (желательно) кастомной прошивкой.
В Google Play есть замечательная утилита Linux Deploy. Она позволяет устанавливать один или несколько различных дистрибутивов Linux на смартфон и запускать их в chroot-окружении. Процесс установки linux описывать не буду, есть очень наглядное видео с приятной музыкой на странице программы в Google Play, но на всякий случай продублирую его здесь.

Установка GNU/Linux на Android через Linux Deploy.



Устанавливаем систему по инструкции на видео, я делал также, только выбрал Debian Wheezy. Жмем кнопку Start в окне Linux Deploy, система установлена и запущена.
Далее можем подключиться любимым SSH-клиентом по ip-адресу нашего смартфона, и попадаем в Linux-окружение. Пароль по умолчанию для пользователя — changeme, в рута через sudo -s. Для установленного Debian (Ubuntu) обновим систему и установим нужные пакеты:

aptitude update
aptitude upgrade
aptitude install mc tmux htop asterisk


3. Настройка

После установки создадутся конфигурационные файлы в каталоге /etc/asterisk/. Для минимальной настройки VoIP сервера необходимо их изменить. Под спойлерами примеры настроек:

sip.conf
; Main

[general]

context=incoming_calls                 
allowguest=no                
;match_auth_username=yes        ; if available, match user entry using the
allowoverlap=no               ; Enable RFC3578 overlap dialing support.
udpbindaddr=0.0.0.0           
transport=udp                   
srvlookup=yes                   ; Enable DNS SRV lookups on outbound calls
;pedantic=yes                   ; Enable checking of tags in headers,
disallow=all                   ; First disallow all codecs
allow=ulaw                     ; Allow codecs in order of preference
language=ru                    ; Default language setting for all users/peers
relaxdtmf=yes                  ; Relax dtmf handling
useragent=Asterisk PBX         ; Allows you to change the user agent string
dtmfmode = rfc2833             ; Set default dtmfmode for sending DTMF. Default: rfc2833
videosupport=yes               ; Turn on support for SIP video. You need to turn this
alwaysauthreject = yes         ; When an incoming INVITE or REGISTER is to be rejected,
autocreatepeer=no             ; Allow any UAC not explicitly defined to register
rtptimeout=60                  ; Terminate call if 60 seconds of no RTP or RTCP activity
recordhistory=yes              ; Record SIP history by default
dumphistory=yes                ; Dump SIP history at end of SIP dialogue
t38pt_udptl = yes,redundancy,maxdatagram=300 
faxdetect = no          ; Default 'no', 'yes' enables both CNG and T.38 detection
nat=no
jbenable = yes              ; Enables the use of a jitterbuffer on the receiving side of a
canreinvite=no
rfc2833compensate=yes
limitonpeers = yes
externrefresh=60
disallow=all
allow=ulaw,alaw
qualify=yes
echocancel=yes
echocancelwhenbridged=yes


register => 4732453344-101:veryStrongSecret@server.prov.ru

; Provider

[ext_template](!)
disallow=all
allow=ulaw,alaw
description=fakeExampleProvider ;)
type=peer
context=incoming_calls
nat=force_rport,comedia
host=server.prov.ru
fromdomain=server.prov.ru
insecure=port,invite

[trunk](ext_template)
fromuser=4732453344-101
defaultuser=4732453344-101
authname=4732453344-101
secret=veryStrongSecret

; GSM

;Templates

[global_template](!)
type=friend
qualify=yes
host=dynamic
nat=no
notifyringing=yes
call-limit=1
limitonpeers=yes
insecure=port,invite
secret=pass
callgroup=1
pickupgroup=1
context=outgoing_calls

;SIP users

[101](global_template)
[102](global_template)
[103](global_template)
[104](global_template)
[105](global_template)




extensions.conf
[default]
exten => _X.,1,Hangup()

[globals]

[features]

exten => ##,1,Pickup()

[incoming_calls]

;from-trunk
exten => s,1,NoOp(${CALLERID(num)})
same => n,Answer()
same => n,Queue(main,tr)
same => n,Hangup()

[outgoing_calls]

exten => _[23]XXXXXX,1,NoOp(${CALLERID(num)})
same => n,Dial(SIP/trunk/${EXTEN},,tTr)
same => n,Hangup()

exten => _8XXXXXXXXXX,1,NoOp(${CALLERID(num)})
same => n,Dial(SIP/trunk/${EXTEN},,tTr)
same => n,Hangup()

exten => _810XXXXXXXXXXXX,1,NoOp(${CALLERID(num)})
same => n,Dial(SIP/trunk/${EXTEN},,tTr)
same => n,Hangup()

include => internal_calls

[internal_calls]

exten => _10[12345],1,Dial(SIP/${EXTEN},,tTr)
same => n,Hangup()



queues.conf
[general]
persistentmembers = yes
autofill = yes
monitor-type = MixMonitor
updatecdr = yes
;musicclass = default
strategy = rrmemory
context = incoming_calls
timeout = 20
retry = 1
weight=0
wrapuptime=1
autofill=yes
maxlen = 0
announce-frequency = 0
relative-periodic-announce=no
announce-holdtime = no
announce-position = no
monitor-format = wav
ringinuse = no


[main]
strategy = rrmemory
ringinuse=no
member => SIP/101
member => SIP/102
member => SIP/103
member => SIP/104
member => SIP/105




Когда конфигурация написана, запускаем службу и заходим в CLI:
asterisk && asterisk -vvvvr

При запуске службы из init.d не грузится модуль сhan_sip, пишет ошибку chan_sip.c:28816 reload_config: Unable to create SIP socket: Permission denied. От рута запускается нормально, для демонстрации сойдет.

Все готово. Я подключил к нашей новой АТС шлюз FXS и два софтфона. На моем аппарате (Xperia M Dual) нагрузка на процессор в 4 активных канала составляет где-то 10%, не заикается, лагов нет. Можно звонить по внутренним 101-105 друг другу, и общаться с внешним миром через транк от провайдера.

4. Возможности применения:
а) демонстрация работы Asterisk PBX
б) портативная гиковская АТС =)
в) для домашнего использования (ставят же на роутеры с openwrt, можно и на смартфоне сделать)
г) просто ради интереса
Скриншот


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

По первому комментарию
Исправил " Я занимаюсь" на «Я работаю в компании, которая занимается», спасибо shadowalone, сначала просто не придал значения, приношу извинения. Но все же, мои финансовые проблемы -мое личное дело, не так ли? ;)
Share post

Comments 19

    +3
    Как эксперимент, очень познавательно.
    Но вот смущает несостыковка совсем не технического плана:

    я занимаюсь настройкой телефонии для маленьких и не очень компаний по городу и области

    и
    Пока откладываю деньги на новый топкейс и шлейф


    То есть, мне кажется, сильно «притянута за уши» причина реализации в статье.
      0
      Отписал в личку)
        +2
        Вопрос публичный к публичной статье, а вы как-то в личку на него отвечаете. нехорошо.
          +2
          Ответ был личного характера, на публику такие вещи не выставляют. В статье исправил первый абзац, сейчас сделаю сноску в конце. Вам также в личку скинул диалог.
            +2
            Автор еще и исправления в текст внес, и не сделал UPD, теперь мой вопрос вообще выглядит «высосаным из пальца» — куды катится это мир…
              0
              Спойлер внизу. Вы меня на долю секунды опередили)
                0
                Так подстраховываться надо — цитату из статьи под спойлер и/или скриншот = )
          +2
          2автор:
          шлюз GSM(Voice)->Asterisk на смартфоне поднимается?
            0
            Если бы… цены б не было…
            Было как-то одно приложение в маркете, которое реалтзовывало подобный функционал, но оно работало очень криво и только на некоторых девайсах.
              0
                0
                Я хотел попробовать установить dongle channel, прицепить его на модем и попробовать сделать звонок. Теоретически можно попробовать сделать по аналогии с симкой в usb-модеме, но подходящего устройства в /dev/ на телефоне я не нашел. Может быть плохо смотрел, у меня usb-свистка нет под рукой, я бы его в комп вставил и сравнил список устройств.
                  0
                  play.google.com/store/apps/details?id=org.joinsip.usipserver
                  вот, откопал. но как и писал уже — УГ.
                    0
                    попробую вечером установить и прозвонить, спасибо
                      0
                      Установил программу, прицепил на этот же астериск, зарегистрировалось без проблем, но вот не работает, при звонке в дебаге 404. А идея была действительно хороша… Может на других аппаратах и заработает
                    0
                    Желаете IVR на смартфоне? =)
                      +1
                      Мда… кстати — отличная мысль ))
                    0
                    Можно так Chef или Puppet сервер с собой таскать :)
                      0
                      В cyanogenmod обе SIM-карты работают?

                    Only users with full accounts can post comments. Log in, please.