Asterisk with Avaya 9640 phone

Щоб не кричати на увесь будинок було вирішено поставити пару телефонів. З обладнання у наявності – мережа з підтримкою PoE на усіх порта[, Ethernet у місцях майбутнього розташування телефонів, ubuntu з Docker де вже запущено openhab та телефон Avaya 9640. Після недовгого аналізу вирішено було ставити для тесту Asterisk на вже існуючий Docker та робити SIP телефонію. У результаті з’явились таки вимоги:

  • SIP телефонія на базі Asterisk з підтримкою телефона Avaya
  • наявність HTTP сервера для Avaya (апдейт та налаштування)
  • окремий VLAN для IP телефонії, бажано без доступу навіть в інші мережі
  • інсталяція у вже існуючий докер, бажано з окремою IP мережею

Після недовгого читання документації по докеру з’ясувалось що можна зробити для окремих контейнерів окрему мережу та надати контейнерам доступ до неї. Приступаємо до реалізаціїї котра буде складатись з наступних пунктів:

  • підготовка мережі (створеня vlan, налаштування DHCP для окремого діапазону)
  • інсталяція програмного забезпечення
  • налаштування HTTP та оновлення телефона на прошивку з підтримкою SIP, підготовка налаштування для телефона
  • налаштування Asterisk

Підготовка мережі

Тут все було відносно просто – створюємо vlan на pfSence, на ньому ж налаштуємо DHCP. Конфігуруємо свіч на підтримку цього vlan на окремих портах та налаштовуємо додатковий інтерфейс на ubuntu. Результатом цього є отримання на новому інтерфейсі в ubuntu адреси з DHCP з нового діапазону. Конфігурацію ubuntu робив за цією інструкцією, розділ netplan.

Для керування докером я використовую portainer, створюємо у ньому нову мережу з назвою pbx-network та налаштовуємо її на новий vlan. Для цього використовуємо драйвер ipvlan та як parent вказуємо інтерфейс ubuntu з потрібним VLAN. Також вказуємо діапазон мережі з нашого нового VALN котрий виключено з DHCP діапазону:

Інсталяція програмного забезпечення

Для інсталяції сервісов підготуємо docker-compose файл та передамо його в portainer як готовий стек, це дасть можливість не створювати усі налаштування для кожного контейнера у UI, а просто користуватись блокнотом. Стек буде мати 2 сервіси – asterisk та веб сервер з усіма файлами що необхідні для телефона avaya. У результаті з’явилась така конфігурація:

version: '3'

services:
  asterisk-app:
    container_name: asterisk-app
    image:  andrius/asterisk
    ports:
      - 5060:5060/udp
      - 5160:5160/udp
    volumes:
      - /opt/asterisk/lib/asterisk/keys:/var/lib/asterisk/keys
      - /opt/asterisk/lib/asterisk/sounds:/var/lib/asterisk/sounds
      - /opt/asterisk/lib/asterisk/phoneprov:/var/lib/asterisk/phoneprov
      - /opt/asterisk/spool:/var/spool/asterisk
      - /opt/asterisk/log:/var/log/asterisk
      - /opt/asterisk/conf:/etc/asterisk
    restart: always
    networks:
       pbx-network:
         ipv4_address: 192.168.240.225
  nginx-web:
    container_name: nginx-web
    image: nginx
    ports:
      - 80:80
    volumes:
      - /opt/asterisk/web:/usr/share/nginx/html
    restart: always
    networks:
       pbx-network:
         ipv4_address: 192.168.240.226


networks:
  pbx-network:
    name: pbx-network
    external: true

Перед створенням стеку створюємо усі необхідні директорії (шлях /opt/asterisk). Єдиний нюанс – ця конфігурація очікує що директорія /opt/asterisk/conf містить усі необхідні для asterisk файли конфігурації. Щоб їх отримати можна створити стек без /opt/asterisk/conf та скопіювати усі файли з існуючого контейнера, а потім оновити стек з підключенням /opt/asterisk/conf. Як результат в нас повинно бути 2 запущенийх контейнера:

Налаштування HTTP та оновлення телефону

Беремо ПЗ для телефону з підтримкою SIP з офіціального сайту та розпаковуємо отриманий файл у директорію /opt/asterisk/web. Далі створюємо у тій самій директорії файл 46xxsettings.txt з наступним вмістом:


SET SIPDOMAIN pbx.private.domain
SET SIPPORT 5060
SET SIP_CONTROLLER_LIST 192.168.240.225:5060;transport=udp
SET SIPREGPROXYPOLICY alternate
SET SIPPROXYSRVR 192.168.240.225
SET SIPREGISTRAR 192.168.240.225
SET ENABLE_AVAYA_ENVIRONMENT 0
SET ENABLE_PPM_SOURCED_SIPPROXYSRVR 0
SET DISCOVER_AVAYA_ENVIRONMENT 0
SET SIP_MODE 0
SET MWISRVR 192.168.240.225
SET DIALPLAN 7xxx
SET PROVIDE_TRANSFER_TYPE 1
SET CALL_TRANSFER_MODE 1
SET CONFERENCE_TYPE 1
SET QKLOGINSTAT 1
## SET PHNNUMOFSA 6
SET SIPSIGNAL 0
SET SNTPSRVR pool.ntp.org
SET GMTOFFSET +3:00
SET DSTOFFSET 1
SET DSTSTART 2SunMar2L
SET DSTSTOP 1SunNov2L
SET TIMEZONE Europe/Kyiv
SET WAIT_FOR_REGISTRATION_TIMER 60
SET REGISTERWAIT 120
SET RECOVERYREGISTERWAIT 60
SET WAIT_FOR_UNREGISTRATION_TIMER 32
SET WAIT_FOR_INVITE_RESPONSE_TIMEOUT 60
SET OUTBOUND_SUBSCRIPTION_REQUEST_DURATION 180
SET NO_DIGITS_TIMEOUT 10
SET INTER_DIGIT_TIMEOUT 5
SET ENABLE_PRESENCE 0
SET ENABLE_AUTOMATIC_ON_THE_PHONE_PRESENCE 0
SET SPEAKERSTAT 2
SET SDPCAPNEG 1
SET DISPLAY_NAME_NUMBER 1
SET PLAY_TONE_UNTIL_RTP 1
SET SKILLSCREENTIME 1
SET UUIDISPLAYTIME 5
SET ENTRYNAME 0
SET ENABLE_G729 2
SET SEND_DTMF_TYPE 2
SET DTMF_PAYLOAD_TYPE 101
SET SYMMETRIC_RTP 1
SET MATCHTYPE 1
SET ENABLE_HOLD_BUTTON 1
SET SIG 2
SET PHNLD ""
SET SUBSCRIBE_SECURITY 0
SET ENABLE_IPOFFICE 1
SET SUBSCRIBE_LIST_NON_AVAYA "mwi"
SET EXTENSION_ON_TOP_LINE 2
SET PROVIDE_OPTIONS_SCREEN 1
SET DATEFORMAT %d-%m-%y
SET TIMEFORMAT 1
SET DAYLIGHT_SAVING_SETTING_MODE 2
SET PSTN_VM_NUM "*97"
SET ENABLE_EARLY_MEDIA 1

Файл повинен містити правильну адресу asterisk – 192.168.240.225/pbx.private.domain

Щоб телефон дізнався про цей сервер додаємо у DHCP текстову опцію 242 з вмістом:

MCIPADD=pbx.private.domain,HTTPSRVR=pbx-web.private.domain,VLANTEST=0

pbx.private.domain повинен вказувати на asterisk, pbx-web.private.domain на веб сервер. Можна вказати IP адреси.

Запускаємо телефон, входимо у налаштування за допомогою коду MUTE CRAFT # та налаштовуємо потрібний VLAN. Якщо все добре то телефон перезавантажиться, оновить ПЗ та запропонує ввести номер та пароль.

Налаштування Asterisk

Я не є спеціалістом з астеріск, це взагалі мій перший досвід з ним, тому можуть бути деякі помилки у цьому розділі.

Останні версії астеріск мають плагін pjsip та sip для sip телефоній, причому останній вимкнений та у найближчих версіях буде видалений. На даний момент мені не вдалось з’єднати телефон avaya з плагіном pjsip тому вимикаємо pjsip та вмикаємо sip. Мій конфіг modules.conf виглядвє наступним чином:

[modules]
autoload=yes
noload = res_pjsip.so
noload = chan_alsa.so
noload = chan_console.so
noload = res_hep.so
noload = res_hep_pjsip.so
noload = res_hep_rtcp.so
noload = chan_sip.so
noload = app_voicemail_imap.so
noload = app_voicemail_odbc.so

Додаємо в sip.conf необхідні номера, розділ з виправленнями буде виглядати якось так:

[basic-options](!)                ; a template
        dtmfmode=rfc2833
        context=home
        type=friend
        host=dynamic

[natted-phone](!,basic-options)   ; another template inheriting basic-options
        directmedia=no
        host=dynamic

[public-phone](!,basic-options)   ; another template inheriting basic-options
        directmedia=yes

[my-codecs](!)                    ; a template for my preferred codecs
        disallow=all
        allow=ilbc
        allow=g729
        allow=gsm
        allow=g723
        allow=ulaw
        ; Or, more simply:
        ;allow=!all,ilbc,g729,gsm,g723,ulaw

[ulaw-phone](!)                   ; and another one for ulaw-only
        disallow=all
        allow=ulaw
        ; Again, more simply:
        ;allow=!all,ulaw

[7700](public-phone,my-codecs)
        secret = 7700
[7701](public-phone,my-codecs)
        secret = 7701
[7702](public-phone,my-codecs)
        secret = 7702

Пам’ятаємо що avaya підтримує тільки цифри як паролі.

На цьому етапі можна спробувати зробити перезавантаження конфігурації астериск та спробувати зареєструватись з телефону, реєстрація повинна бути успішною. Для тесту можна встановити додаток наприклад MicroSIP та перевірити чи можна зареєструватись у ньому.

Якщо реєстрація була вдалою треба налаштувати діалплан щоб мати можливість здійснювати дзвінки. Для початківця це все виглядає досі складно я просто змінив розділ default та додав розділ home. Ці 2 розділи виглядають так:

[default]


[home]
exten => _77XX,1,Dial(SIP/${EXTEN}, 30)

Після перезавантаження конфігурацію ви повинні мати можливість здійснювати дзвінки у межах 77хх.