Transcoding G711 ke Opus di Kazoo

Tempo hari kantor kedatangan tamu dari Aarenet. Mereka memperesentasikan layanan UC yang bisa mereka sediakan untuk level provider. Platform yang mereka gunakan buatan sendiri yang didevelop dari tahun 2004 – 2009, tanpa jualan dulu. Hasilnya juga ndak main-main. Menarik lah pokoknya. Kelak kalo punya ITSP sendiri mungkin kepikiran pakai produk mereka, terutama kalo sudah males ngoprek. Hehehe.

Ada beberapa hal yang bisa dipelajari dari presentasi mereka, yang juga bisa diterapkan di network yang lagi saya bangun. Dari sekian banyak hal, saya jadi ngeh kalau ingin layanan UC bisa diakses dari jaringan 3G/4G (untuk saat ini), yang dipake adalah codec Opus. Hal lain yang saya pelajari dari mereka mungkin nanti saja diceritakan dalam postingan berikutnya (kalo sempet dan inget). Sekarang ini sudah banyak aplikasi softphone yang sudah menggunakan Opus. Salah satu yang saya pakai di PC/laptop yang cukup ringan adalah Microsip. Sedangkan di smartphone, saya memanfaatkan Linphone. Jadi di media server Kazoo yang menghadap ke user akan selalu dipaksa menggunakan Opus (kecuali jika user hendak menggunakan fax di mana harus menggunakan codec G711 ulaw/alaw), sedangkan di sisi menghadap OLO (Other Local Operator) akan tetap menggunakan G711 untuk menjamin kualitas. Karena media server melakukan transcoding, maka di FreeSWITCH ditambahkan konfigurasi seperti berikut:

  • Di sip profile (kebetulan dalam topologi Kazoo hanya punya satu profile), tambahkan baris:
    • disable-transcoding = false (tujuannya untuk mengaktifkan transcoding).
    • inbound-late-negotiation = true (tujuannya supaya media server tidak memilih codec hingga RTP lewat).
    • inherit_codec = true (tujuannya adalah agar media server mencoba codec yang pertama digunakan oleh call leg satunya. Hal ini berhubungan dengan penghematan resource server).



  • di dalam freeswitch.xml (di FS Kazoo tidak ada vars.xml) tambahkan baris:

  • Dan terakhir, paksa Device yang teregister ke Kazoo untuk selalu menggunakan Opus dengan cara hanya mengaktifkan codec Opus di setting Device dan di masing-masing software SIP client:

Ketika kita coba melakukan panggilan, maka SDP akan tampak seperti:

INVITE

v=0
o=FreeSWITCH 1522990346 1522990347 IN IP4 116.68.171.76
s=FreeSWITCH
c=IN IP4 1.2.3.4
t=0 0
m=audio 25278 RTP/AVP 102 101 13
a=rtpmap:102 opus/48000/22
a=fmtp:102 useinbandfec=1; maxaveragebitrate=30000; maxplaybackrate=48000; ptime=20; minptime=10; maxptime=40
a=rtpmap:101 telephone-event/48000
a=fmtp:101 0-16
a=rtpmap:13 CN/48000
a=ptime:20

Selamat mencoba!

Ref:

[Tips] Kazoo Media Server – Tidak Bisa Memainkan Voice Recording

Jika kita memiliki platform Kazoo dengan media server terpisah, ada kemungkinan tidak bisa mendengarkan voice recording, misal, jika kita salah mendial nomer seharusnya mendapatkan pesan suara:

“The call can not be completed as dialed. Please check your number and dial again.”

alih-alih akan mendapatkan error message di console FreeSWITCH seperti berikut:

[ERR] mod_http_cache.c:1170 Received HTTP error 0 trying to fetch http://127.0.0.1:15984/system_media/en-us%2Ffault-can_not_be_completed_as_dialed/fault-can_not_be_completed_as_dialed.wav?rev=6-585c8f2e3b6b3f4063efb1c18cce5309

Sebelum melanjutkan ke setting HAPROXY, pastikan semua rekaman suara sudah berada di dalam direktori /opt/kazoo/sounds (dalam contoh ini, karena menggunakan bahasa inggris, lokasi direktori lengkapnya /opt/kazoo/sounds/en/us). Jika belum ada, copy manual langsung dari server ecallmgr yang sudah berjalan.

Selanjutnya, ubah config HAPROXY yang mengarah ke server database CouchDB (biasanya karena server terpisah dengan media server) dengan bind server ke 0.0.0.0 misal :

....
listen bigcouch-data
bind 0.0.0.0:15984
balance roundrobin
server db_1.couch.db 127.0.0.1:5984 check
server db_2.couch.db 127.0.0.1:5984 check
server db_3.couch.db 127.0.0.1:5984 check backup
server db_4.couch.db 127.0.0.1:5984 check backup

listen bigcouch-mgr
bind 0.0.0.0:15986
balance roundrobin
server db_1.couch.db 127.0.0.1:5986 check
server db_2.couch.db 127.0.0.1:5986 check
server db_3.couch.db 127.0.0.1:5986 check backup
server db_4.couch.db 127.0.0.1:5986 check backup
...

Pastikan juga firewall hanya menerima koneksi ke service-service tersebut dari ip address cluster kita sendiri untuk keamanan.

Lalu di server FreeSWITCH juga diinstall HAPROXY dengan config sebagai berikut (misal HAPROXY database terpasang di ip address 1.2.3.4 dengan port 15984 dan 15986):

....
listen bigcouch-data
bind 127.0.0.1:15984
balance roundrobin
server db_1.couch.db 1.2.3.4:15984 check
server db_2.couch.db 1.2.3.4:15984 check
server db_3.couch.db 1.2.3.4:15984 check backup
server db_4.couch.db 1.2.3.4:15984 check backup

listen bigcouch-mgr
bind 0.0.0.0:15986
balance roundrobin
server db_1.couch.db 1.2.3.4:15986 check
server db_2.couch.db 1.2.3.4:15986 check
server db_3.couch.db 1.2.3.4:15986 check backup
server db_4.couch.db 1.2.3.4:15986 check backup
...

Reload semua HAPROXY di ke-2 server/cluster tersebut, lalu test kembali.

 

Homer Untuk SIP dan RTP Monitoring/Troubleshoot

Membaca log pada saat troubleshoot VoIP berbasis SIP itu penting, tapi masih juga banyak yang malas melakukan hal tersebut. Bisa dimaklumi karena memang membaca log SIP itu beneran ribet, walaupun sebenarnya cukup dengan merunut Call-ID problem langsung bisa ketahuan. Jika di sebuah lingkungan dengan jumlah panggilan sedikit, hal ini tidak menjadi masalah, karena jumlah log SIP tidak begitu banyak dan bisa langsung teridentifikasi permasalahannya. Tapi jika dalam lingkungan call yang berjumlah banyak, misal di sebuah VoIP provider, membaca log akan menjadi sangat merepotkan. Sering kali kita harus meminta pelanggan untuk melakukan test call lagi hanya demi mendapatkan log. Sedangkan sebagai pelanggan, ogah banget kan disuruh ini itu hanya karena si provider tidak punya catatan log pada saat problem terjadi.

Log SIP itu benar-benar chatty. Banyak banget. Dalam satu kali sesi bisa sampai dengan ratusan baris. Jadi kalo ada problem 1 jam sebelumnya, pada saat kita check log, sudah terdapat ribuan baris log menumpuk dari panggilan yang lain. Untuk mempermudah melakukan troubleshoot ini, kita bisa memanfaatkan tool lain seperti Homer SIP Capture.

Cara Kerja

Homer terdiri dari Capture Server dan Capture agent. Capture server merupakan server sipcapture berbasis Kamailo / OpenSIPS yang menerima kiriman HEP, IPIP ataupun raw packet dari HEP agent/Capture agent. Beberapa software telephony sudah memiliki implementasi capture agent seperti FreeSWITCH (versi 1.6.8 ke atas), Asterisk (versi 13 ke atas), Kamailio dan OpenSIPS. Lalu untuk perangkat lain yang tidak memiliki implementasi capture agent, tetap bisa memanfaatkannya dengan cara memasang sebuah server (berbasis Linux) dengan capture agent, lalu salah satu interface nya tersambung ke  port mirror perangkat SIP lain. Semua paket SIP yangt tertangkap capture agent akan dikirimkan ke Capture Server untuk kemudian disimpan dan dianalisa jika terjadi problem.

Berikut ini gambaran topologi dari yang saya embat dari https://github.com/sipcapture/homer :

Capture Server:

 

Capture agent:

Instalasi/Setup

Lalu berikutnya mari kita setup Capture Server terlebih dahulu:

  • Paling enak menurut saya kalau Capture Server jalan di Debian 8 Jessie 64 bit. Jadi silahkan disiapkan. Server distro lain harusnya tidak masalah, tapi pas saya install di Centos 7, saya stuck di MySQL. Walaupun problemnya sebenarnya jelas, tapi sayanya yang malas troubleshoot karena dikejar waktu.
  • Ada 4 cara install Homer 5, ini yang bisa dilihat di sini, tapi cara yang paling saya sukai adalah cara pertama, yaitu menggunakan install script. Jalankan step di bawah ini:
root~# cd /usr/src
root~# wget https://cdn.rawgit.com/sipcapture/homer-installer/master/homer_installer.sh
root~# chmod +x homer_installer.sh
root~# ./homer_installer.sh
  • Pada saat proses instalasi, kita akan ditanyakan nama database, user dan password user database untuk akses database Homer. Nama database saya pilih default, yaitu homer, dan passwordnya tentu saja saya isikan berbeda. Script di atas akan menginstall Kamailio dengan module sipcapture.so, jika penasaran bagaimana cara penggunaannya silahkan lihat di kamailio.cfg. Selain itu script ini juga akan menambahkan direktori web di /var/www/html/homer. Web tersebut langsung bisa diakses dengan username admin dan password : test1234. Sangat disarankan untuk segera mengganti password ini begitu login. Jika instalasi berhasil secara keseluruhan, akan nampak informasi seperti berikut:
*************************************************************
    ,;;;;,
   ;;;;;;;;.  Congratulations! HOMER has been installed!
 ;;;;;;;;;;;;
 ;;;; ;; ;;;; <--------------- INVITE --------------- 
 ;;;; ;; ;;;; --------------- 200 OK --------------->
 ;;;; .. ;;;;
 ;;;;    ;;;; Your system should be now ready to rock!
 ;;;; ;; ;;;; Please verify/complete the configuration
 ,;;; ;; ;;;; files generated by the installer below.
 ;;;;;;;;;;;;
  :;;;;;;;;;  THIS SCRIPT IS PROVIDED AS-IS, USE AT
   ;;;;;;;;   YOUR *OWN* RISK, REVIEW LICENSE & DOCS

*************************************************************

* Verify configuration for HOMER-API:
 '/var/www/html/homer/api/configuration.php'
 '/var/www/html/homer/api/preferences.php'

* Verify capture settings for Homer/Kamailio:
 '/etc/kamailio/kamailio.cfg'

* Start/stop Homer SIP Capture:
 '/sbin/kamctl start|stop'

* Access HOMER UI:
 http://1.2.3.4
 [default: admin/test1234]

* Send HEP/EEP Encapsulated Packets:
 hep://1.2.3.4:9060

**************************************************************

IMPORTANT: Do not forget to send Homer node some traffic! ;)
 For our capture agents, visit http://github.com/sipcapture
 For more help and information visit: http://sipcapture.org

**************************************************************
 Installer Log saved to: /tmp/homer_installer.sh.6095.log

Selanjutnya adalah bagaimana setup Capture agent. Kebetulan yang akan dimonitor adalah server FreeSWITCH v1.6.19. Ada dua cara untuk melakukannya, yang pertama dengan mengaktifkan capture agent bawaan dari FreeSWITCH. Caranya:

  • Tambahkan ip address Homer di sofia.conf.xml (misal: 1.2.3.4 port 9060) dengan menambahkan baris berikut di global_settings:
  • Lalu buka sip profiles yang hendak dimonitor. Dalam instalasi FreeSWITCH biasanya sudah ada default sip profile, misal, internal.xml, tambahkan baris berikut
  • Setelah perubahan di atas disimpan, reload sip profile dari fs_cli dengan perintah:
freeswitch@localhost> sofia profile internal restart
  • Aktifkan HEP agent melalui fs_cli dengan perintah:
freeswitch@localhost> sofia profile internal capture on

 

Cara kedua adalah dengan menginstall Captagent di server yang sama dengan FreeSWITCH. Langkahnya adalah sebagai berikut:

  • Karena FreeSWITCH saya berjalan di atas Centos 7, maka perlu ditambahkan package berikut:

yum -y install json-c-devel expat-devel libpcap-devel flex-devel automake libtool bison libuv-devel flex

  • Clone captagent  dan install:
cd /usr/src
git clone https://github.com/sipcapture/captagent.git captagent
cd captagent
./build.sh
./configure
make && make install
  • Setelah selesai menjalankan script di atas, lokasi default konfigurasi berada di /usr/local/captagent/etc/captagent. File pertama yang perlu diedit adalah file protocol_sip.xml. Edit bagian enable=”false” menjadi enable=”true”
  • Kemudian edit file transport_hep.xml untuk diaktifkan dan dicantumkan alamat ip server Homer/Capture Server seperti berikut:

            
                
                
                
  • Untuk memudahkan startup captagent di Centos 7, salin file startup dan jalakan perintah berikut ini :
root~# cp /usr/src/captagent/init/el/7/captagent.service /usr/lib/systemd/system/captagent.service
root~# cp /usr/src/captagent/init/el/captagent.sysconfig /etc/sysconfig/captagent
root~# systemctl enable captagent
root~# systemctl start captagent
  • Login ke web Homer dan lakukan test call melalui server FreeSWITCH tersebut, tunggu beberapa saat, maka kita bisa mendapatkan log sepert berikut:

Banyak sekali yang bisa diexplore dari hasil log ini yang tidak bisa dibahas semua dalam satu postingan. Nanti kapan-kapan saya posting lagi cara memanfaatkan Homer lebih jauh. Setidaknya dari hasil log di atas saya bisa melakukan troubleshoot dengan merunut Call-id tanpa harus melototin file log dalam mode text:

Jika hendak mencari sebuah panggilan gagal, saya tinggal click reply code panggilan dari Leg A ke Leg B di jam yang disebutkan pada saat terjadi problem, misal, pada tanggal 11 November 2017 pukul 8.45 – 8.50 pelanggan anu mengalami gagal ke nomer tertentu. Saya bisa mengisi kolom search :

Lalu hasilnya ternyata ada log seperti ini:

Hanya perlu click pada kolom CallID di atas saya mendapatkan detail sesi.

Banyak sekali yang bisa dieksplore di sini, dan saya masih belom mendapatkan semuanya. Untuk lebih detail bagaimana memanfaatkan

Kelebihan Setup CaptAgent Server Tersendiri

Seperti yang telah dibahas di atas, agent bisa diaktifkan di aplikasi SIP yang sudah support seperti FreeSWITCH ver 1.6.8 ke atas, Asterisk versi 13 ke atas, Kamailio dan OpenSIPS.

Lalu bagaimana jika perangkat SIP yang tidak support sipcapture/Captagent seperti AudiCode, Sonus, atau bahkan Asterisk versi 11 ke bawah?

Gampang. Install Captagent di server tersendiri dengan minimal dua interface. Satu interface tanpa ip address dengan mode promiscuous  digunakan untuk menerima raw packet dari port mirror perangkat SIP yang sedang dimonitoring. Switch tentunya harus manageable. Lalu interface satunya lagi digunakan untuk mengirim paket HEP/EEP ke server Homer. Topologi nya kira-kira seperti ini (gambar saya ambil dari https://github.com/sipcapture/captagent):

HomerFlow

 

Links

 

 

Codec G729 Di FreeSWITCH Dengan mod_bcg729

Akhir-akhir ini jadi kudet karena banyak hal yang harus dikerjakan, termasuk kudet dalam berita bahwa pemilik lisensi G729 memasukkan codec ini ke Royalty Free license per tanggal 1 Januari 2017. Artinya kedepan akan banyak pengembang library untuk codec ini supaya bisa digunakan di platform opensource telephony. Salah satunya yang sudah dipakai di kantor adalah mod_bcg729 (yang merupakan modifikasi dari mod_fsg729, hanya saja semua code dari Intel dimodifikasi dan dibuang). Codec diambil dari http://www.linphone.org/eng/documentation/dev/bcg729.html, jadi pastikan pada saat instalasi mod_bcg729 berikut ini, mesin dalam kedaan tersambung ke internet, karena pada saat proses instalasi akan mendowload source bcg729.

Berikut ini adalah cara instalasi codec G729 di SBC FreeSWITCH:

  1. Pastikan FreeSWITCH bisa terkoneksi dengan internet. Login ke FreeSWITCH lalu masuk ke direktori /usr/src
  2. Install libtool dan freeswitch-devel dengan perintah: ‘yum install -y freeswitch-devel libtool’
  3. Jalankan perintah: git clone https://github.com/xadhoom/mod_bcg729.git
  4. Masuk ke direktori /usr/src/mod_bcg729 lalu edit file Makefile, tambahkan direktori include di baris FS_INCLUDES  dan direktori modules di baris FS_MODULES. Contoh di server yang saya tangani:
    ################################
    ### FreeSwitch headers files found in libfreeswitch-dev ###
    FS_INCLUDES=/usr/include
    FS_MODULES=/usr/lib64/freeswitch/mod
    ################################
  5. Save hasil editan tersebut lalu jalankan perintah: make
  6. Jika tidak ada error, lanjutkan dengan perintah: make install
  7. Edit file  autoload_configs/modules.conf.xml, edit baris mod_g729 menjadi mod_bcg729. Lalu save.
  8. Reload FreeSWITCH
  9. Pastikan codec tersebut sudah diload otomatis oleh FreeSWITCH dengan menjalankan perintah : show codec di dalam fs_cli yang akan muncul baris seperti:
    codec,G.729,mod_bcg729
  10. Jika belum juga muncul, bisa lakukan load manual di dalam fs_cli dengan perintah: load mod_bcg729
  11. Optional, aktifkan fungsi transcoding di FreeSWITCH seperti di postingan https://www.otakudang.org/?p=648. (di postigan tersebut dibahas transcoding G711 ke OPUS, tapi step transcoding masih relevan untuk codec ini dan juga codec-codec lainnya).
  12. Test panggilan dengan memaksa SIP client menggunakan hanya codec G729, jika berhasil maka SDP pada SIP INVITE dan 200 OK akan tampak seperti
    INVITE SDP:
    ...
    a=rtpmap:18 G729/8000
    a=fmtp:18 annexb=no
    a=rtpmap:101 telephone-event/8000
    ...
    200 OK SDP:
    ...
    m=audio 31910 RTP/AVP 18 101
    a=rtpmap:18 G729/8000
    a=fmtp:18 annexb=no
    a=rtpmap:101 telephone-event/8000
    ...

 

[Troubleshoot] SIP/2.0 422 Session Interval Too Small dari FreeSWITCH

Di perangkat FreeSWITCH yang kami deploy, dapat error seperti ini:

SIP/2.0 422 Session Interval Too Small

menyebabkan call langsung terputus. Belum kedapatan trigger dari mana tapi akhirnya kami workaround dengan menambahkan config di bawah ini ke dalam sip profile:




Lalu reload dengan cli:

freeswitch> sofia profile  restart

 

[Kazoo] Problem Pergantian RabbitMQ Server

Karena sesuatu hal, saya harus mengubah topologi Kazoo, terutama server RabbitMQ yang menggunakan ip public menjadi ip private. Dan ternyata penggantian tersebut tidak mudah. Setelah dijalankan, WhistleApps masih mencari server AMQP lama, dan karena server tersebut sudah tidak ada, maka muncul error econnrefused seperti di bawah ini:

Jan 4 17:35:05 portal 2600hz[1211]: |00000000000|wh_amqp_connection:320 (<0.2180.0>) failed to connect to ‘amqp://guest:guest@1.2.3.4:5672’ will retry: econnrefused
Jan 4 17:35:06 portal 2600hz[1211]: |00000000000|wh_amqp_connection:320 (<0.2180.0>) failed to connect to ‘amqp://guest:guest@1.2.3.4:5672’ will retry: econnrefused
Jan 4 17:35:07 portal 2600hz[1211]: |00000000000|wh_amqp_connection:320 (<0.2180.0>) failed to connect to ‘amqp://guest:guest@1.2.3.4:5672’ will retry: econnrefused
Jan 4 17:35:08 portal 2600hz[1211]: |00000000000|wh_amqp_connection:320 (<0.2180.0>) failed to connect to ‘amqp://guest:guest@1.2.3.4:5672’ will retry: econnrefused
Jan 4 17:35:09 portal 2600hz[1211]: |00000000000|wh_amqp_connection:320 (<0.2180.0>) failed to connect to ‘amqp://guest:guest@1.2.3.4:5672’ will retry: econnrefused
Jan 4 17:35:10 portal 2600hz[1211]: |00000000000|wh_amqp_connection:320 (<0.2180.0>) failed to connect to ‘amqp://guest:guest@1.2.3.4:5672’ will retry: econnrefused

Untuk mengatasi hal ini, maka broker harus dihilangkan secara manual dengan perintah:

root# sup whistle_amqp_maintenance remove_broker “amqp://guest:guest@1.2.3.4:5672”

Lalu tambahkan broker baru, misal:

root# sup whistle_amqp_maintenance add_connection “amqp://guest:guest@6.7.8.9:5672”

Dengan langkah tersebut, seharusnya broker sudah terarah ke server yang baru.