Microsoft Teams Direct Routing with Issabel (Asterisk)

Why?

FYI

  • Should have Issabel server properly installed with ip public and . The server firewall should be hardened by only allowing Carrier and Microsoft cloud ip address blocks (52.112.0.0/14). Even better if the only maintenance can only be accessed by VPN. Dont open your Issabel webGUI, SSH, SIP & RTP ports to public internet whenever possible.
  • My Issbel (Asterisk) server is already connected to Ofon as the PSTN Carrier, and already has a DID assigned.
  • Requires to edit chan_sip.c to comply with Microsoft Teams Phone System that demands SIP From and Contact header host part to be FQDN. From header is easy, just add fromdomain at the Asterisk trunk config and you’re good. The Contact header is the tricky one, based on this screenshot clue (stolen from thread https://community.asterisk.org/t/fqdn-in-the-contact-header/77625):
  • By half-assed editing the chan_sip.c , I expect there will be repercussion somewhere else in the system (plus I am no good at C, should find a better way to insert the change with more elegant solution), so dont share the PBX with something else for production, and use this as POC only.
  • Dont ever think to commercialize this without Microsoft approval, nor use this for officials. You may not be able to open tickets if you encounter problems with this installation although you are a legit Office 365 tenant with Phone System license. The certified SBC list can be found here.
  • Should have access to DNS server to add TXT type record for domain authentication.
  • Should have global admin account to make changes in O365 portal.
  • In this example, I have two E1 O365 + Phone System licenses. One to be assigned to my account and one to be assigned to SIP trunk domain dummy user.
  • You cant do multi tenant with this installation. Asterisk itself is a single realm (CMIIW).
  • Still cant find how to modify Contact header in OPTIONS, hence you’ll find tlsdontverifyserver=yes in Issabel general config.
  • Will periodically update this post with something new whenever I find improvement. So forgive me if you find something different when you read back the post later.

Microsoft Teams Phone System Side Config

In this stage you will need to add an SSL’ed domain to Office 365 portal. Microsoft-recommended CA list can be found here. I myself use GeoTrust.

  • Microsoft has a very detailed documentation that can be found at https://docs.microsoft.com/en-us/microsoftteams/direct-routing-plan . I wont rewrite the details here.
  • Using global admin to add domain (mine is ast.ofon.biz), to O365 admin portal.
  • Add a dummy user for that domain and assign O365 + Phone System license for that dummy user. For example, my dummy user for the newly added domain is sip@ast.ofon.biz. If successfully added, I will find the user in Active users table like this:
  • that is how Microsoft Teams will recognize the SIP trunk to our Issabel (Asterisk) server and assign license to the trunk.
  • Login using powershell to your account using global admin user. Again, the powershell preparation wont be repeated here since the detailed documentation can be found at https://docs.microsoft.com/en-us/microsoftteams/direct-routing-configure. Next steps will require us to import Sfbonline module to powershell.
  • Start the session (you will be asked for password on a popped up windows) :
$sfb = New-CsOnlineSession -Username "admin@ofonio.onmicrosoft.com"
Import-PSSession $sfb -AllowClobber
  • Add the Issabel (Asterisk server) as PSTN Gateway:
New-CsOnlinePSTNGateway -Fqdn ast.ofon.biz -SipSignalingPort 5061 -ForwardCallHistory $true -Enabled $true -ForwardPai $true -MaxConcurrentSessions 5
  • See if the server is properly added with Get-CsOnlinePstnGateway :
 Get-CsOnlinePSTNGateway


Identity                            : ast.ofon.biz
InboundTeamsNumberTranslationRules  : {}
InboundPstnNumberTranslationRules   : {}
OutboundTeamsNumberTranslationRules : {}
OutboundPstnNumberTranslationRules  : {}
Fqdn                                : ast.ofon.biz
SipSignalingPort                    : 5061
FailoverTimeSeconds                 : 10
ForwardCallHistory                  : True
ForwardPai                          : True
SendSipOptions                      : True
MaxConcurrentSessions               : 5
Enabled                             : True
MediaBypass                         : False
GatewaySiteId                       :
GatewaySiteLbrEnabled               : False
FailoverResponseCodes               : 408,503,504
GenerateRingingWhileLocatingUser    : True
PidfLoSupported                     : False
MediaRelayRoutingLocationOverride   :
ProxySbc                            :
BypassMode                          : None
  • Create a routing and routing policy that will utilize the Issabel (Asterisk) server:
Set-CsOnlinePstnUsage -Identity Global -Usage @{Add="Default"}

New-CsOnlineVoiceRoute -Identity "CatchAll" -NumberPattern ".*" -OnlinePstnGatewayList ast.ofon.biz -Priority 1 -OnlinePstnUsages "Default"

New-CsOnlineVoiceRoutingPolicy -Identity "DefaultVoicePolicy" -OnlinePstnUsages "Default"
  • Assign DID & VoiceRoutingPolicy to my account.

Issabel (Asterisk) Side Config

We will have two SIP connection configs for Microsoft Teams Phone System and two SIP connection configs for Carrier. Each connection will have different contexts. One SIP connection for Microsoft Teams will be from-internal, so call from Microsoft Teams will be treated as call from extension. And the other SIP connection will be treated as outbound trunk with from-trunk context. Same deal with the two SIP connections toward Carrier.

Microsoft provides 3 hosts to connect a SIP trunk with:

  • sip.pstnhub.microsoft.com
  • sip2.pstnhub.microsoft.com
  • sip3.pstnhub.microsoft.com

This example will only test the first one (sip.pstnhub.microsoft.com).

  • Adding Trunk to Microsoft Teams from PBX -> PBX Configuration -> Trunks. Add SIP Trunk and fill these parameters :
Trunk Name: MSTeams-Outbound
PEER Details:
disallow=all
host=sip.pstnhub.microsoft.com
type=peer
transport=tls
port=5061
allow=all&ulaw
qualify=yes
dtmfmode=rfc2833
context=from-trunk
insecure=port,invite
nat=force_rport,comedia
fromdomain=ast.ofon.biz
encryption=yes
  • And as “extension” add the following configs to sip_custom.conf using PBX -> Tools -> Asterisk File Editor :
[MSTeams-Inbound]
disallow=all
host=sip.pstnhub.microsoft.com
type=friend
transport=tls
port=5061
allow=all
allow=ulaw
qualify=yes
dtmfmode=rfc2833
context=from-internal
insecure=port,invite
nat=force_rport,comedia
fromdomain=ast.ofon.biz
  • To refer to certifcate files, go to PBX -> PBX Configuration -> Unembedded IssabelPBX. At the following page, go to Settings -> Asterisk SIP Settings and then Add field at the Other SIP Settings with these:
realm=ast.ofon.biz
tlsenable=yes
tlsbindaddr=0.0.0.0:5061
tlsprivatekey=/etc/asterisk/keys/star_ofon_biz.key
tlscertfile=/etc/asterisk/keys/star_ofon_biz.pem
tlscafile=/etc/asterisk/keys/star_ofon_biz.crt
tlscipher=ALL
tlsclientmethod=tlsv1
tlsdontverifyserver=yes
  • Save and reload the config.
  • Add the Outbound Routes to Microsoft Teams and Carrier (Microsoft Teams outbound should be aboive the Carrier). Since my carrier mostly sends with prefix 0, I have to convert it to E.164. Please modify these according to your apporpriate settings:

At this point, you should be able to call outbound from Microsoft Teams account but not the other way (inbound). As mentioned before, Microsoft Teams Phone System require us to send From and Contact header host as FQDN. The trunk settings in Asterisk wont change Contact header host to FQDN hence we’ll receive this message:

INVITE sip:+622430000062@sip.pstnhub.microsoft.com:5061 SIP/2.0
Via: SIP/2.0/TLS xxx.xxx.xxx.xxx:5061;branch=z9hG4bK4e781f8a;rport
Max-Forwards: 70
From: "02139700001" <sip:02139700001@ast.ofon.biz>;tag=as36acd9d9
To: <sip:+622430000062@sip.pstnhub.microsoft.com:5061>
Contact: <sip:02139700001@xxx.xxx.xxx.xxx:5061;transport=tls>
Call-ID: 2239ff467456d8f03c4348826168d7a6@ast.ofon.biz
CSeq: 102 INVITE
User-Agent: Asterisk 16.7.0
Date: Fri, 08 May 2020 04:45:38 GMT
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
Supported: replaces, timer
Content-Type: application/sdp
Content-Length: 1324

...
...
...
SIP/2.0 403 Forbidden
FROM: "02139700001"<sip:02139700001@ast.ofon.biz>;tag=as36acd9d9
TO: <sip:+622430000062@sip.pstnhub.microsoft.com:5061>
CSEQ: 102 INVITE
CALL-ID: 2239ff467456d8f03c4348826168d7a6@ast.ofon.biz
VIA: SIP/2.0/TLS xxx.xxx.xxx.xxx:5061;branch=z9hG4bK4e781f8a;rport
REASON: Q.850;cause=63;text="735a16a2-5f83-4cb0-bdec-9cb64edff551;Provided Trunk FQDN 'xxx.xxx.xxx.xxx' is not allowed. Connection allows following fqdns: *.ofon.biz, ofon.biz, *.ofon.biz."
CONTENT-LENGTH: 0
ALLOW: INVITE,ACK,OPTIONS,CANCEL,BYE,NOTIFY
SERVER: Microsoft.PSTNHub.SIPProxy v.2020.5.6.2 i.ASEA.2

chan_sip.c

There is no Asterisk source in Issabel distro so we have to get it ourself. From Issabel linux console, git clone the Asterisk github and checkout for 16.7.0 (since this is my Issabel’s Asterisk version).:

cd /usr/src
git clone https://github.com/asterisk/asterisk.git
cd asterisk
git checkout 16.7.0

Edit file /usr/src/asterisk/channel/chan_sip.c. Look at build_contact() we will find these lines:

static void build_contact(struct sip_pvt *p, struct sip_request *req, int incoming)
{
        char tmp[SIPBUFSIZE];
        char *user = ast_uri_encode(p->exten, tmp, sizeof(tmp), ast_uri_sip_user);
        int use_sips;
        char *transport = ast_strdupa(sip_get_transport(p->socket.type));

        if (incoming) {
                use_sips = uas_sips_contact(req);
        } else {
                use_sips = uac_sips_contact(req);
        }

        if (p->socket.type == AST_TRANSPORT_UDP) {
                ast_string_field_build(p, our_contact, "<%s:%s%s%s>", use_sips ? "sips" : "sip",
                        user, ast_strlen_zero(user) ? "" : "@",
                        ast_sockaddr_stringify_remote(&p->ourip));
        } else {
                ast_string_field_build(p, our_contact, "<%s:%s%s%s;transport=%s>",
                        use_sips ? "sips" : "sip", user, ast_strlen_zero(user) ? "" : "@",
                        ast_sockaddr_stringify_remote(&p->ourip), ast_str_to_lower(transport));
        }
}

The last conditional lines are where the Contact header gets value from. Since we only need to modify for TCP transport, edit the line:

 else {
                ast_string_field_build(p, our_contact, "<%s:%s%s%s;transport=%s>",
                        use_sips ? "sips" : "sip", user, ast_strlen_zero(user) ? "" : "@",
                        ast_sockaddr_stringify_remote(&p->ourip), ast_str_to_lower(transport));
        }

to become :

 else {
                ast_string_field_build(p, our_contact, "<%s:%s%s%s;transport=%s>",
                        use_sips ? "sips" : "sip", user, ast_strlen_zero(user) ? "" : "@",
                        p->fromdomain, ast_str_to_lower(transport));
        }

p->fromdomain will follow whatever “fromdomain=” value in the SIP trunk config.

Update:
Got input from Igo Cunha that the call from MSteams to PSTN will be disconnected after 6 sec. I can confirm I got random disconnect call at about 6 sec from the same direction. Try replace:
 
ast_sockaddr_stringify_remote(&p->ourip) 

with your Asterisk's FQDN string (e.g "ast.ofon.biz" in my case) instead of p->fromdomain.

Thanks Igo!

I understand this is not elegant way, but that should do it. Compile the source and we will have brand new chan_sip.so. Backup the original one and replace it after:

copy /usr/lib64/asterisk/modules/chan_sip.so /usr/local/src/chan_sip.so.original
copy /usr/src/asterisk/channels/chan_sip.so /usr/lib64/asterisk/modules/chan_sip.so

then reload the module from Asterisk console:

asterisk -vr

ast*CLI> module reload chan_sip.so
Module 'chan_sip.so' reloaded successfully.
 Reloading SIP

Now test call to inbound, we should have correct SIP Contact header requirement as follows:

INVITE sip:+622430000062@sip.pstnhub.microsoft.com:5061 SIP/2.0
Via: SIP/2.0/TLS 103.135.74.15:5061;branch=z9hG4bK394b6483;rport
Max-Forwards: 70
From: "02139700001" <sip:02139700001@ast.ofon.biz>;tag=as20858906
To: <sip:+622430000062@sip.pstnhub.microsoft.com:5061>
Contact: <sip:02139700001@ast.ofon.biz;transport=tls>
Call-ID: 1a5d05f10eadb0036683f88a6177f80f@ast.ofon.biz
CSeq: 102 INVITE
User-Agent: Asterisk 16.7.0
Date: Fri, 08 May 2020 04:54:36 GMT
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
Supported: replaces, timer
Content-Type: application/sdp
Content-Length: 1324

and the call went through:

Remarks

Although it is possible to connect Direct Routing with Asterisk, still easier using Kamailio (and OpenSIPS) since they’re built solely for SIP packet engineering. Until some of them become certified with Microsoft, I guess I will be using the already ceritfied ones, like Sonus or AudioCodes, or just connect to a hosted Direct Routing Provider in Indonesia, like Ofon. Alternatively, there are Kamailo based products start providing hosted DR, like Gilawa and dSIPRouter. Check them out.

Links:

Voice Conference dengan Ofon SmartPBX

Salah satu layanan conference call yang sering kami gunakan adalah Ofon SmartPBX Conference Call, selain menggunakan Google Meet, Zoom, Microsft Teams, atau Aplikabiz G-Net MeetNow. SmartPBX sendiri merupakan aplikasi hosted PBX buatan 2600hz dan merupakan bagian dari platform yang lebih besar lagi yang disebut Kazoo.

Ofon SmartPBX Conference Call cukup sering kami gunakan di kantor karena sifatnya yang sederhana, straightforward, dan cocok untuk situasi yang “mission critical”, di mana kadang jangkauan jaringan data selular tidak memadai, tapi masih bisa tetap bergabung melalui jalur PSTN yang bisa diakses luas bahkan sampai pelosok daerah. Untuk ekstensi yang masih dalam jangkauan jaringan data yang bagus, dapat bergabung melalui panggilan VoIP.

Kok ekstensi? Kayak PBX saja….

Lha kan memang layanan hosted PBX. Di gawai Android, saya menggunakan LinPhone dan GSWave untuk bisa menjadi ekstensi PBX tersebut, sementara teman-teman lain yang menggunakan iOS, lebih suka WeWei, walaupun ada LinPhone dan GSWave untuk iOS juga. Tapi jika panggilan data/VoIP tidak bisa dilakukan, panggilan dapat diteruskan melalui jaringan PSTN.

Semudah apa?

Bergabung ke SmartPBX Conference Call

Secara default, Ofon SmartPBX akan memberikan 3 nomer/DID. Satu DID sebagai nomer utama yang menjadi nomer identitas ketika melakukan panggilan PSTN. DID kedua untuk voice conference call (tampak dalam contoh di bawah nomer DID untuk Conference call: +622139710091), dan DID terakhir untuk menerima fax yang kemudian akan diforward ke email pengguna.

Setiap user Ofon SmartPBX dapat memiliki ruang konferensi sendiri. Misal berikut ini saya akan setting conference room milik saya. Pilih menu Users di panel sebelah kiri, lalu di halaman list user saya, klik kolom User Features:

Aktifkan Conference Bridge dengan klik button tersebut, lalu switch dari Disabled ke Enabled lalu isikan Personal Conference Room number. Bisa diisikan berapa saja, tapi saya lebih suka menyamakan dengan nomer ekstensi saya, misal, 6681.

Lalu klik Save Changes.

Ketika fitur Conference Bridge sudah aktif, akan muncul icon baru di tabel user saya berupa buble dialog warna hitam:

Setiap kali saya mengaktifkan fitur di user saya, akan muncul icon baru di situ. Misal, jika saya aktifkan CallForward dan Hotdesking, akan muncul icon baru seperti berikut:

oh ya, device saya di screenshoot terakhir sudah berwarna hijau karena barusan saya mengaktifkan softphone. Jika tidak aktif, icon device akan berwarna merah seperti gambar sebelumnya.

Untuk mencoba panggilan conference call dari PSTN, cukup dengan mendial nomer +622139710091 dengan memasukkan nomer room 6681 dan diakhiri tanda #.

Untuk pengguna yang hendak bergabung ke conference call dari ekstensi PBX tersebut, ada dua cara untuk bergabung. Yang pertama adalah dengan melakukan panggilan ke nomer conference call di atas (+622139710091), dan memasukkan room number seperti laiknya pengguna yang bergabung dari PSTN. Panggilan tersebut tidak akan dikenakan biaya, karena sama-sama menggunakan layanan dari Ofon dan dari kode area yang sama.

Cara kedua, ada satu ekstensi 9999 yang pada saat mendaftar sudah dibuatkan oleh Customer Service Ofon sesuai permintaan sendiri. Nomer tersebut ketika dihubungi dari ekstensi akan masuk ke Conference Call service, yang kemudian akan menayakan room number juga, seperti ketika melakukan panggilan dari PSTN. Di layanan conference call ini kita tidak bisa melakukan panggilan video atau screensharing, tapi cukup handal ketika peserta tidak sedang di area yang terjangkau internet. Seperti yang saya sampaikan di atas voice conference call ini cukup straightforward ketika di tengah situasi yang kritis atau darurat, seperti akhir-akhir ini. Koordinasi dapat berjalan dengan singkat, cepat dan jelas ketika berkoordinasi.

Bukannya jadi besar biaya ya kalau harus Dial In ke nomer tersebut?

Saya kurang tau apakah akhir-akhir ini masih banyak yang menggunakan pulsa regular untuk telepon via GSM/PSTN. Dengan tingginya minat terhada layanan data/ internet melalui operator selular, membuat dua layanan dasarnya; SMS & panggilan telepon, menjadi kurang diminati, sehingga mereka berlomba-lomba mengadakan paket SMS dan telpon ke semua operator dengan harga yang relatif cukup murah. Saya menggunakan operator XL Prioritas, dan selalu mendapat paket SMS dan panggilan ke semua operator dengan talk time yang cukup banyak:

Saya yakin sudah sangat umum bahwa perusahaan membekali karyawannya dengan kemudahan melakukan panggilan dari telepon genggam, dalam bentuk tunjangan bulanan ataupun berlangganan CUG.

Bagaimana Caranya Dial-Out

Untuk saat ini fitur dial-out conference call di Ofon SmartPBX belum ada, tapi dapat dilakukan dengan cara lain yaitu menggunakan conference phone sebagai conference bridge. Sebenarnya bisa saja sih menggunakan softphone atau ip phone biasa. Tapi perangkat tersebut harus cukup kuat untuk menjadi voice bridge karena akan menjadi pusat pertemuan media dari dan ke semua peserta. Untuk 3-4 peserta saya yakin masih lancar, tapi lebih dari itu biasanya akan berpengaruh pada kualitas suara karena resource yang digunakan juga naik seiring bertambahnya peserta. Oleh karena itu diperlukan perangkat khusus seperti conference phone. Ada macam-macam brand yang ada di Indonesia. Yang paling mahal dan tentunya paling bening biasanya keluaran Polycom dengan seri conference phones nya . Brand lain yang harganya cukup terjangkau adalah YeaLink Conference Phones dan Grandstream Audio Conferencing. Di kantor saya menggunakan Yealink CP920 ketika melakukan dial-out conference call. Perangkat tersebut teregistrasi sebagai device/ekstensi si SmartPBX. Jadi selain dial-out, pengguna lain juga dapat melakukan dial-in dari VoIP dengan menghubungi nomer ekstensinya.

Serius? Ndak ada cara lain dial-out supaya MUC nya ada di SmartPBX?

Jika Anda Programmer Web…

Ada sedikit rahasia :

https://api.ofon.io:8443/v2/

URL di atas masih dalam tahap trial, yang kelak akan diintegrasikan langsung ke SmartPBX. Tapi boleh lah dibuat coba-coba.

Contoh berikut akan menggunakan curl .

Lakukan autentikasi dengan login admin SmartPBX yang telah didapat dari OFON, buatlah md5sum, misal dari shell linux, dengan format “username:password” :

echo -n "admin@localhost.localdomain:r4h4514" | md5sum
65e26add3748f33039f119f3fd8a5735  -

berbekal md5sum -> 65e26add3748f33039f119f3fd8a5735 dan dan akun name, misal: YourCompanyPBX, dapatkan auth token:

curl -v -X PUT -H "content-type:application/json" \
-d '{"data":{"credentials":"65e26add3748f33039f119f3fd8a5735",\
"account_name":"yourcompanypbx"}}' \
https://api.ofon.io:8443/v2/user_auth | jq

Perintah di atas menghasilkan output panjang. Langsung ke bawah menuju bagian auth_token.

catatan: agar output JSON rapi, saya suka menggunakan tool jq. Jika tidak ada, bisa digantikan dengan -> | python -mjson.tool

kemudian perhatikan account id yang bisa dilihat di halaman SmartPBX bagian kanan bawah:

Berbekal auth_token dan account_id dapatkan ID conference call:

curl -X GET -H "X-Auth-Token: $AUTH_TOKEN"  \
https://api.ofon.io:8443/v2/accounts/$ACCOUNT_ID/conferences | jq

Output:

{
  "page_size": 1,
  "data": [
    {
      "owner_id": "ec356f13f300109ffb17a31edf94001a",
      "name": "Gabriel Wishnu SmartPBX Conference",
      "moderator": {
        "pins": [],
        "numbers": [],
        "join_muted": false,
        "join_deaf": false
      },
      "member": {
        "pins": [],
        "numbers": [],
        "join_muted": false,
        "join_deaf": false
      },
      "id": "7810f4b14b041e1f951c31ccfb124b1d",
      "flags": [],
      "conference_numbers": [
        "6681"
      ],

dari output JSON di atas kita mendapatkan identitas conference:

7810f4b14b041e1f951c31ccfb124b1d

dari conference room number 6681 yang sudah diset sebelumnya. Misal nomer telpon yang hendak didial-out adalah 081234567890, dan callerid yang akan kita gunakan untuk dial-out adalah nomer DID conference room di atas (+622139710091) maka cara panggilnya:

curl -v -X PUT -d '{"action": "dial", \ 
"data": {"endpoints":["081234567890"],"caller_id_number":"+622139710091"}}' \
-H "X-Auth-Token: $AUTH_TOKEN" \
https://api.ofon.io:8443/v2/accounts/$ACCOUNT_ID/conferences/7810f4b14b041e1f951c31ccfb124b1d  | jq

Atau jika ada beberapa nomer sekaligus (misal 081234567890, 081818181818, 08989898989, 02129393939):

curl -v -X PUT -d '{"action": "dial", \ 
"data": {"endpoints":["081234567890","081818181818", "08989898989", "02129393939"], \
"caller_id_number":"+622139710091"}}' \
-H "X-Auth-Token: $AUTH_TOKEN" \
https://api.ofon.io:8443/v2/accounts/$ACCOUNT_ID/conferences/7810f4b14b041e1f951c31ccfb124b1d  | jq

Perintah tersebut akan memanggil sekian nomer sekaligus untuk bergabung dalam voice conference.

catan:

sehubungan dengan adanya ratelimiter call di SBC Ofon untuk mencegah fraud, panggilan serentak ke nomer seperti diatas akan dibatasi 3 nomer dalam sekali waktu. Jadi jika peserta lebih dari 3, perlu dipecah per panggilan hanya dapat melakukan 3 panggilan keluar dari callerid yang sama. 

Panggilan yang terkena rate limit akan memberikan pesan:

     {
        "message": "failed to start call: OUTGOING_CALL_BARRED",
        "hangup_cause": "OUTGOING_CALL_BARRED",
        "status": "error",
        "endpoint_id": "081234567890"
      }

Sampai di sini dulu, kapan-kapan saya akan bahas lebih lanjut mengenai API ini.

Selamat mencoba!

Links:

[Tips] Mengganti Hostname Jitsi-Meet

Mengganti hostname di Jitsi-Meet ternyata ribet banget. Yang paling gampang diuninstall terlebih dahulu baru install ulang.

apt-get purge jigasi jitsi-meet jitsi-meet-web-config jitsi-meet-prosody jitsi-meet-turnserver jitsi-meet-web jicofo jitsi-videobridge2 nginx

Lalu hapus semua direktori nginx dan letsencrypt.

Setelah itu install ulang Nginx dan Jitsi-Meet. Pada saat tengah proses instalasi Jitsi-Meet kita akan kembali mengisikan hostname.

FreeConferenceCall.Com: Alternatif Rapat/Konferensi Daring.

Sepertinya sudah banyak yang membahas aplikasi untuk rapat/konferensi daring seperti Zoom, Webex, Microsoft Teams, Google Meet, dan lain sebagainya. Masing-masing memiliki kelebihan dan kekurangan. Selalu ada fitur yang terdapat di satu aplikasi yang tidak ada di aplikasi lainnya, dan sebaliknya. Tidak semua aplikasi-aplikasi tersebut dapat memenuhi keperluan rapat daring kita dengan ketentuan yang berbeda satu sama lain. Tapi selalu ada alternatif.

Saya akan membahas salah satu aplikasi rapat/konferensi daring yang bisa digunakan sepanjanang Kerja Dari Rumah yang ditetapkan pemerintah selama pandemi korona.

Adalah FreeConferenceCall, sebuah layanan conference call atau rapat/konferensi daring yang dapat dinikmati secara gratis. Kita bisa mendapatkan aplikasinya di Google Playstore dan Apple App Store. Selain itu ada juga versi desktop (per tulisan ini) untuk Windows PC, Linux (saya sudah coba di Linux Ubuntu 18.04 LTS), dan juga MacOS. Kita bisa mendaftar dengan gratis dan dengan mudah memulai rapat/konferensi daring.

Kelebihan lainnya, FreeConferenceCall menyediakan dial-in, agar peserta yang bergabung dari PSTN dapat melakukan panggilan ke ruang virtual rapat daring. Nomer dial-in sudah mencakup banyak negara, termasuk Indonesia seperti yang dicantumkan di lamannya.

Nomer dial-in yang disediakan di Indonesia adalah nomer PSTN dengan kode wilayah Jakarta:

(021) 39702915

*** Untuk dial-in kode negara Indoneisa, FreeConferenceCall bekerja sama dengan Ofon.

yang nantinya akan diikuti oleh identitas ruang virtual rapat/konferensi dan kode akses, sebagai pembeda identitas ruang dan autentikasi.

Selain itu disediakan juga akses dial-in dengan kode negara lain yang ditampilkan di aplikasinya, seperti contoh berikut:

Saat ini untuk layanan dial-out tidak disediakan. Sehingga peserta rapat yang tidak memiliki akses internet dan tidak memiliki aplikasi, harus melakukan dial-in ke nomer-nomer di atas.

Lalu bagaimana cara menggunakannya?

WINDOWS PC

Aplikasi FreeConferenceCall untuk Windows PC bisa diunduh dari pranala berikut:

https://www.freeconferencecall.com/download?localization=en&platform=win

Setelah terunduh dan terpasang di Windows PC (dan tentunya sudah mendaftar akun baru di layanan tersebut), klik ikon FreeConferenceCall yang kemudian akan membawa ke menu utama untuk memilih menjadi peserta atau penyelenggara rapat daring:

Kali ini kita akan mencoba menjadi penyelenggara rapat daring dengan memilih Host.

Layar berikutnya akan menampilkan informasi ruang rapat daring, nomer telepon untuk dial-in, identitas ruang rapat virtual, dan kode akses untuk peserta yang hendak bergabung dari PSTN.

Karena sebagai penyelenggara dengan menggunakan PC, pilih menu Computer audio sebagai media suaranya.

Layar berikutnya nampak seperti berikut:

Untuk menambahkan/mengundang peserta lain yang mungkin telah memasang aplikasi FreeConferenceCall, klik Invite pada halaman tersebut, yang kemudian akan memunculkan pilihan bagaimana kita hendak mengirimkan undangan. Pilihan pertama adalah Copy to clipboard, yang menyalin informasi cara bergabung, untuk kemudian bisa disalin-rekat ke aplikasi lain misal WhatsApp, Telegram, SMS, IRC, surel dan lain sebagainya. Pilihan kedua adalah Invite by email yang memungkinkan kita mengundang melalui surel.

Contoh hasil salin-rekat:

Dial-in number (ID): (021) 39702915
Access code: 865679#
International dial-in numbers: https://fccdl.in/i/gabrielwishnu5
Online meeting ID: gabrielwishnu5
Join the online meeting: https://join.freeconferencecall.com/gabrielwishnu5

Untuk undangan melalui menu Invite by email akan memanggil aplikasi penulis surel bawaan. Dalam contoh ini, aplikasi secara otomatis memanggil Outlook untuk mengirimkan surel:

Berikutnya saya akan coba bergabung ke rapat di atas dari gawai Android.

ANDROID

Setelah memasang aplikasi dari Google PlayStore, jalankan dan masukkan informasi cara bergabung seperti di atas:

di aplikasi tersebut pili Join new meeting

Lalu masukkan informasi untuk bergabung seperti yang tertera di undangan:

Dial-in number (ID): (021) 39702915
Access code: 865679#
International dial-in numbers: https://fccdl.in/i/gabrielwishnu5
Online meeting ID: gabrielwishnu5
Join the online meeting: https://join.freeconferencecall.com/gabrielwishnu5

atau cara lain, jika informasi di atas didapat dari email, maka tautan yang ada di dalam informasi tersebut bisa langsung diklik dan akan memanggil aplikasi FreeConferenceCall untuk bergabung ke rapat daring yang telah dibuat.

Kali ini kita akan memasukkan sendiri identitas rapat (Meeting ID) yaitu: gabrielwishnu5 lalu klik Join.

Layar berikutnya akan menampilkan dua pilihan sebelum bergabung. Yang pertama Call In, yaitu bergabung melalui panggilan PSTN. Disebutkan juga di bawah menu tersebut bahwa pilihan ini paling bagus untuk rapat yang hanya membutuhkan komunikasi suara saja. Bagaimanapun komunikasi suara di jaringan PSTN jauh lebih jernih dan stabil dibandingkan VoIP. Hanya saja kita tidak dapat melakukan panggilan gambar dan melakukan screensharing.

Pilihan kedua adalah Call In Using WiFi or Data. Pilihan ini cocok untuk panggilan video dan juga screensharing.

Dalam contoh di sini saya akan memilih Call In Using WiFi or Data untuk mencoba screensharing.

Setelah bergabung, saya dapat melihat peserta meeting (yang kebetulan saya sendiri juga):

Test screensharing dari sisi Windows PC dengan memilih menu Share di layar utama, lalu muncul menu aplikasi yang berjalan di Windows yang hendak dibagikan. Pilih Power Point Slide Show yang kebetulan sudah dijalankan, dan klik Start sharing:

Dari tangkapan layar gawai tampak mendatar seperti berikut:

BERGABUNG DARI PSTN

Cara berikutnya untuk bergabung adalah melalui panggilan telepon biasa (PSTN). Mari kita perhatikan kembali tangkap layar undangan:

Dial-in number (ID): (021) 39702915
Access code: 865679#
International dial-in numbers: https://fccdl.in/i/gabrielwishnu5
Online meeting ID: gabrielwishnu5
Join the online meeting: https://join.freeconferencecall.com/gabrielwishnu5
  • Dial ke nomer 021 3970 2915
  • Setelah terdengar IVR, masukkan kode akses (865679#)

Dari sisi penyelenggara, daftar peserta akan muncul pengguna yang bergabung dari PSTN seperti berikut:

Selama rapat/konferensi daring, kita dapat melakukan recording (rekaman). Kapasitas yang disediakan sebesar 1GB per akun. Berkas rekaman dapat diunduh agar ruang penyimpanan dapat digunakan untuk menyimpan rekaman berikutnya. Berkas rekaman dapat juga dikirimkan melalui surel.

Pada saat rapat daring selesai, akan muncul laman yang memberitahukan pranala rekaman.

Selain itu rekaman juga dapat diakses dari laman utama FreeConferenceCall. Log masuk ke akun kita, lalu pilih History & Recordings

di laman berikutnya kita dapat melihat daftar rekaman yang pernah kita buat, dan kapasitas penyimpanan yang telah dipakai.

Seperti yang telah disebutkan, kapasitas maksimal yang disediakan gratis sebesar 1GB. Jika kita memerlukan tambahan kapasitas, dapat dilakukan melalui tautan Buy More.

FASILITAS TAMBAHAN

Daftar fasilitas tambahan yang dapat kita peroleh dengan tambahan biaya dapat di lihat di daftar berikut (per tanggal tulisan ini):

DONASI

Walaupun layanan ini bisa digunakan gratis, FreeConferenceCall menyediakan tautan bagi yang ingin berdonasi.

Di halaman aplikasi terdapat tautan bertuliskan Help Us Provide Free Communications. Klik tautan tersebut untuk melakukan kontribusi/donasi:

Cukup mudah bukan?

Selamat mencoba, selamat beraktifitas di rumah, sehat selalu!

Tautan:

Microsoft Teams Phone System (Tulisan 2)

(Dari Tulisan 1)

Setelah sebelumnya membahas segala sesuatu yang non konfigurasi tentang MSteams Direct Routing, sekarang waktunya kita melihat bagaimana melakukan setting di sisi MSTeams Phone System yang sudah tersambung dengan SBC MSteams Direct Routing.

Asumsi:

  • Tulisan ini untuk pelanggan SBC Carrier hosted Direct Routing sehingga konfigurasi SBC tidak dibahas. (Lain waktu saya janji akan membahas untuk yang on premise).
  • Sebagai pelanggan SBC Carrier hosted Direct Routing, saya tidak perlu menyiapkan sertifikat SSL dan license Phone System yang dibakar untuk menjadi sip trunk.
  • Dalam contoh ini saya berlaku sebagai tenant Office 365 paket E1 dengan tambahan license Phone System untuk satu user. User yang saya gunakan untuk mengkonfigurasi pun harus punya role sebagai Global Admin. Untuk assign license dan role bisa dilakukan di https://portal.office.com, dan tidak akan dibahas karena bisa dibaca di link ini.
  • Nomer telpon/DID sudah disiapkan dan sudah dikonfigurasi di dalam routing dari SBC.

TOPOLOGI

Seperti yang sudah saya sampaikan di atas, contoh setting di sini adalah untuk pelanggan SBC Carrier hosted Direct Routing yang perangkat dan nomer DID sudah disediakan oleh service provider, menggunakan layanan dari Ofon, dengan topologi seperti berikut:

Kita akan mengkonfigurasi area yang ada di dalam kotak garis putus-putus warna merah, dengan mengarahkan MSTeams Phone System untuk mengenali SBC di Ofon dan meroutingkan panggilan ke sana.

PERSIAPAN & SETUP via POWERSHELL

Persiapan powershell memerlukan user Global Admin, untuk instalasi module-module yang bakal diperlukan. Kita mulai.

Asumsi:

  • Tenant yang digunakan adalah domain.tld, dengan username user@domain.tld. License Office 365 E1 + Phone System.
  • User Global admin yang digunakan: admin@domain.onmicrosoft.com
  • Nama SBC yang disediakan oleh operator adalah domain.ofon.biz port 5061.
  • Nomer DID : +622430000062 (kode wilayah Semarang).

Download dan install Module Skype for Business untuk powershell di :

https://www.microsoft.com/en-us/download/details.aspx?id=39366

Jalankan powershell dengan klik icon :

Image result for powershell icon

atau bisa dengan kombinasi Windows button + R, lalu ketik: powershell dan OK.

Dalam beberapa kasus, karena ada faktor pengamanan di Windowsnya sendiri, powershell dijalankan sebagai administrator dengan pilihan Run as Administrator.

Import module Skype for Business Online Connector:

Import-Module SkypeOnlineConnector

Jika mengimport module di atas mendapatkan error seperti berikut:

Import-Module: File C:\Program Files\Common Files\Skype for Business Online\Modules\SkypeOnlineConnectorStartup.psm1 cannot be loaded because running script is disabled on this system. For more information, see about_Execution_Policies at https://go.microsoft.com/fwlink/?LinkID=135170.
At line:1 char:1
+ Import-Module SkypeOnlineConnector
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo	    : SecurityEror: (:) [Import-Module]. PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess.Microsoft.PowerShell.Commands.ImportModuleCommand

disebabkan system merestrict import module dari luar. Cukup jalankan perintah berikut:

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

silahkan dicoba lagi.

Sekedar jaga-jaga apabila diperlukan untuk troubleshoot di waktu mendatang, saya juga mengimport dua module berikut ini:

Install-Module -Name AzureAD
Install-Module MSOnline

Langkah-langkah di atas hanya dilakukan sekali saja pada saat module-module di atas belum terinstall. Untuk kegiatan operasional, administrasi, dan manajemen (OAM) selanjutnya cukup di mulai dari langkah-langkah di bawah ini:

Lakukan autentikasi untuk menjalankan Skype for Business connector :

$sfb = New-CsOnlineSession -UserName "admin@domain.onmicrosoft.com"
Start WinRM Service
WinRM service is not started currently. Running this command will start the WinRM service.

Do you want to continue?
[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"): 

Jawab “Y” di pertanyaan “Do you want to continue?” yang kemudian akan muncul prompt password. Isikan password Global Admin yang kita peroleh dari pembelian Office 365 E1 + Phone System.

Lalu masukkan perintah:

Import-PSSession $sfb -AllowClobber

Dari sini kita sudah siap memasukkan informasi dari provider SBC hosted Direct Routing.

  • Tambahkan SBC provider ke MSTeams Phone System:
New-CsOnlinePSTNGateway -Fqdn domain.ofon.biz -SipSignallingPort 5061 -ForwardCallHistory $true -Enabled $true -ForwardPai $true -MaxConcurrentSessions 5
  • Buat grouping PSTN Usage dengan nama “Default”. Penamaan ini bebas, jadi di sini cuma contoh saja.
Set-CsOnlinePstnUsage -Identity Global -Usage @{Add="Default"}
  • Tambahkan routing baru dengan memasukann SBC ke group Usage “Default”, dan juga buat pattern panggilan ke nomer mana pun (“.*”) yang akan dilewatkan ke SBC tersebut, lalu beri nama sebagai “CatchAll” :
New-CsOnlineVoiceRoute -Identity "CatchAll" -NumberPattern ".*" -OnlinePstnGatewayList domain.ofon.biz -Priority 1 -OnlinePstnUsages "Default"
  • Buat Routing Policy dengan nama “DefaultRoutingPolicy” yang berisi PSTN usage “Default”:
New-CsOnlineVoiceRoutingPolicy -Identity "DefaultVoicePolicy" -OnlinePstnUsages "Default"
  • Aktifkan fitur Enterprise Voice dan sematkan DID/nomer telepon yang didapat dari service provider ke user@domain.tld
Set-CsUser -Identity "user@domain.tld" -EnterpriseVoiceEnabled $true -HostedVoiceMail $true -OnPremLineURI tel:+622430000062
  • Sematkan Voice Routing Policy “DefaultVoicePolicy” yang telah kita buat ke user tersebut
Grant-CsOnlineVoiceRoutingPolicy -Identity "user@domain.tld" -PolicyName "DefaultVoicePolicy"
  • Jika step-step di atas sudah benar, dialpad akan muncul lengkap dengan DID di MSTeams app/client user@domain.tld dan coba lakukan test panggilan ke PSTN.

Bingung dengan banyaknya step di atas? Akan saya coba jelaskan dengan gambar apa yang telah kita lakukan dalam langkah-langkah tersebut :

  • Kotak paling dalam adalah konfigurasi yang dibuat terlebih dahulu. Contoh di sini adalah penambahan PSTNGateway domain.ofon.biz. Saat ini masih menggunakan satu PSTNGateway. Kita bisa menambahkan lebih dari satu PSTNGateway di sini.
  • Buat tagging dengan perintah PSTN Usage. Contoh di sini : “Default”. Kita bisa memberikan nama yang lebih berarti. Misal kita memiliki lebih dari satu PSTNGateway yang digunakan untuk beda keperluan misal SLJJ dan SLI, bisa dinamakan “Nasional” dan “Internasional”.
  • Buat CsOnlineVoiceRoute dengan nama “CatchAll”, pattern routing “.*”, OnlinePSTNGatewayList hanya satu, yaitu “domain.ofon.biz” dan PSTNUsage “Default”.
  • Buat voice routing policy dengan nama “DefaultVoicePolicy” dengan PSTNUsage “Default”.
  • Sematkan DID/nomer telepon ke user@domain.tld dan set EnableVoiceEnterprise dengan $true. Setelah itu sematkan routing voice policy yang telah kita buat ke user tersebut.

Kenapa harus seribet itu?

Bayangkan membuat skenario seperti di gambar berikut:

Skenario di atas menunjukkan bahwa sangat memugkinkan setiap user memiliki Voice Policy yang berbeda satu dengan yang lainnya. Dengan mengkelompokkan masing-masing fungsi, kita bisa membuat skenario yang lebih rumit sekalipun.

Dari contoh bagan di atas, kita memiliki dua user yaitu user01@domain.tld dan user02@domain.tld.

user01@domain.tld memiliki policy yang memperbolehkan panggilan ke mana pun (lokal, SLJJ, SLI dan emergency) melalui 3 sbc yang telah disematkan untuknya.

Sedangkan user02@domain.tld hanya memiliki akses panggilan ke nomer lokal, SLJJ dan nomer-nomer emergency walaupun memiliki akses ke 4 sbc. 2 sbc bertama khusus untuk panggilan ke nome-nomer emergency seperti 110, 123, 112, 113, 1500xxx dan 140xx. Dan 2 sbc lainnya ke nomer-nomer dalam nasional (yang diawali dengan +62 atau 0).

Lalu bagaimana jika hanya 1 SBC untuk routing yang berbeda?

Sama seperti bagan di atas, hanya SBC cukup satu saja seperti gambar bagan di bawah ini (sbc01.ofon.biz port 5061) :

Links:

Microsoft Teams Direct Routing (Tulisan 1)

Kali ini saya menambahkan kategori dalam blog saya yang khusus membahas Microsoft Teams Direct Routing. Pembahasan ini akan terbagi menjadi (rencananya sih) dua. Mungkin bisa lebih, karena memang agak panjang ceritanya. Berikut adalah konteks tentang pembahasan Microsoft Teams.

Latar Belakang

Salah satu bundling Office 365 untuk kebutuhan telekomunikasi suara selama ini dilakukan melalui Skype for Business. Di kantor tempat saya bekerja dulu, kebetulan memiliki anak perusahaan yang berkecimpung di licensing Microsoft (Azzure, O365, dst). Waktu itu (2016 – 2017) saya sempat menggunakan Skype for Business Online. Saya tidak paham semua licensing Microsoft jadi saya tidak tau saya menggunakan yang tipe apa. Icon Skype nya yang warna putih seperti ini:

alih-alih yang berlatar belakang biru dengan hurup S putih.

Waktu itu untuk tersambung ke PSTN, dibutuhkan Cloud Connector. Untuk keperluan Cloud Connector ini, jika servernya install sendiri memerlukan 4 node server (bisa VM, bisa baremetal) dengan resource dan kapasitas yang besar sekali. Saya lupa pastinya berapa, tapi cukup besar untuk hitungan resource server pada saat itu (2016). Dan rasanya ndak perlu juga diingat-ingat karena saya tidak tertarik memasangnya. Opsi lain adalah dengan membeli appliance (waktu itu ditawari dari AudioCode) dengan harga mencapai ratusan juta rupiah, sekali lagi saya lupa pastinya berapa tapi mendekati IDR 200 juta. Dan geblegnya, Cloud Connector tersebut hanya bisa satu realm. Tentu saja terlalu overkill untuk perusahaan yang tidak sekelas BUMN atau swasta yang besar.

Lalu pada tanggal 2 November 2016, produk Microsoft Teams diumumkan (selanjutnya saya sebut sebagai MSTeams saja). MSTeams direncanakan akan menggantikan Skype keseluruhan pada tanggal 31 Juli 2021.

Kenapa MSTeams ?

Pernah dengar buzzword Unified Communication? Ceritanya semua kanal komunikasi dikonsolidasikan untuk kemudahan dalam bekerja. Saya pernah baca di buku Cisco lama, menurut mereka (saat itu) Unified Communication itu adalah mengabstraksi *halah* link telekomunikasi seperti POTS, TDM, SIP, H323, fax, dan seterusnya. Mungkin….ini mungkin lhoo.. ini yang disebut UC 1.0. Awal-awal belajar VoIP memang saya sering menggabungkan beberapa protokol sambungan telepon seperti di atas agar dapat diakses dengan mudah.

Lalu belakangan muncul yang namanya konsolidasi komunikasi dengan menggabungkan email, chat, fax, dan telekomunikasi suara menjadi satu platform. Kayaknya sih ini yang namanya UC 2.0.

Lalu sekarang UC 3.0. Saya masih baca-baca lebih jauh tentang definisi terakhir ini tapi sependek yang saya pahami, UC 3.0 ini buzzwordnya menggabungkan 4 pilar utama yaitu Customer Experience (CX), User Experience (UX), Teams Experience (TX), dan Business Experience (BX). Ada dua pemain yang paling keliatan saat penulisan ini yaitu Slack dan MSTeams. Keduanya menyediakan kolaborasi berdasarkan 4 pilar di atas. Gratis sampai dengan penggunaan fitur tertentu dan berbayar ketika mencapai fitur lainnya. Google Hangout Meet yang terus menjadi Google Meet pun akhir-akhir ini juga tampaknya mulai menyusul.

Kembali ke MSTeams. Salah satu kelebihan yang sesuai dengan bidang saya adalah kemampuannya tersambung ke PSTN, yang memungkinkan SBC melayani lebih dari satu realm.

MSTeams menyediakan dua cara untuk tersambung ke PSTN. Yang pertama adalah Calling Plan. Calling Plan ini menjadikan Microsoft sebagai operator/penyedia layanan telepon, tapi hanya di beberapa negara yaitu (per tanggal tulisan ini):

  • Belgium
  • Canada
  • France
  • Germany
  • Ireland
  • Puerto Rico
  • Netherlands
  • Spain
  • United Kingdom (U.K.)
  • United States (U.S.)

Sebenarnya ada dua lagi yatu Jepang dan Australia. Tapi nomer Jepang dan Australia hanya bisa digunakan di dalam negara masing-masing sehingga ada perlakuan khusus.

Jadi pada dasarnya kita bisa menggunakan nomer dari daftar negara di atas (kecuali tentu saja Australia dan Jepang). Lalu membeli talk time nya dengan list harga ada di sini.

Kelebihannya adalah, kita tidak perlu membeli SBC atau berlangganan cloud SBC untuk tersambung ke PSTN, karena semua sudah ditangani oleh Microsoft. Kekurangannya? Khususnya bagi orang Indonesia, tidak ada nomer dengan kepala +62.

Cara kedua untuk tersambung ke PSTN adalah dengan fitur Direct Routing. Cara ini untuk mengakomodasi pengguna yang membutuhkan nomer di luar list negara di atas. Kalau istilah bakulnya, BYOC, Bring Your Own Carrier. Nah, cara ini membutuhkan SBC. SBC nya sendiri bisa dengan dua cara, on premise atau Carrier hosted SBC. On premise artinya, perangkat SBC berada di lokasi pengguna, bisa berupa appliance maupun vm private cloud pengguna, dan digunakan hanya oleh pengguna tersebut (CAPEX). Atau pengguna juga dapat meletakknya di layanan cloud seperti Azure dan AWS. Sedangkan Carrier hosted SBC, perangkat disediakan operator. Perawatan, pemeliharaan, dan operasi dilakukan oleh operator (OPEX), walhasil SBC dapat digunakan rame-rame oleh banyak pengguna dari realm/domain yang berbeda.

Hal lain yang perlu diketahui, untuk on premise SBC diperlukan:

  • CAPEX untuk pembelian perangkat SBC, baik itu VM di private cloud atau public cloud, atau dalam bentuk hardware/appliance.
  • Satu license Phone System untuk “dibakar” sebagai sambugan ke cloud MSTeams.
  • SSL certificate
  • Sambuang telepon yang hendak digunakan di site SBC.

Ke-4 hal pertama di atas tidak diperlukan ketika menggunakan layanan Carrier hosted SBC.

Baik layanan Calling Plan maupun Direct Routing, masing-masing membutuhkan license tambahan yang namanya license Phone System dari Microsoft. Pada awal saya ngoprek, baru ada 2 Office 365 yang bisa ditambahkan license, yaitu E1 dan E3. Sedangkan jika membeli E5, otomatis sudah mendapatkan license Phone System.

Kabar terakhir, di beberapa produk SKU sudah bisa dilakukan license Phone System. Berita lengkapnya bisa dibaca di link ini. Dan perlu diketahui, untuk Audio Conference yang bisa dihost di cloud MSTeams diperlukan license yang berbeda lagi. Sebaiknya dibaca baik-baik kebutuhannya atau bisa berkonsultasi dengan beberapa rekanan Microsoft di Indonesia seperti VibiCloud, Svarakom, Asaba, Master System, dst.

Sepanjang tahun 2019, saya terlibat deployment Carrier hosted SBC yang dilakukan oleh Ofon. Dalam pembahasan teknis nanti, mungkin saya tidak akan menulis setting Carrier hosted SBC, tapi selama bermain dengan MSTeams Direct Routing, saya sempat mendapat pinjaman SBC appliance Ribbon/Sonus SBC1000 dari Svarakom dan AudioCodes Mediant800 dari Tecnomic.

Kalau yang dua ini kapan-kapan saya bisa share. Untuk produk-produk lainnya silahkan hubungi ke-2 vendor di atas untuk keterangan lebih lanjut mengenai produk dari Ribbon Communication dan AudioCodes.

Koneksi Ke MSTeams Phone System

Sebenarnya sambungan SBC ke MSTeams Phone System cloud hanya menggunakan SIPS (Secure SIP) trunk + SRTP. Sesimple itu. Tapi Microsoft melakukan sertifikasi merk SBC yang bisa tersambung ke cloudnya. List SBC tersebut (per tanggal tulisan ini) adalah

  • AudioCodes
  • Ribbon Communications
  • ThinkTel
  • Oracle
  • TE-SYSTEMS
  • Metaswitch

sepertinya daftar tersebut akan terus bertambah. Sebenarnya bisa saja sih menggunakan Asterisk, Kamailio ataupun FreeSWITCH untuk menggantikan brand di atas. Hanya saja, jika suatu saat ada kendala, bakal tidak bisa open ticket ke Microsoft karena jika mereka tau SBC yang bukan Microsoft Certified, konon akan diblacklist. Saya ndak yakin juga sejauh apa blacklistnya.

Sebaiknya yang belum Microsoft certified cukup buat test atau PoC saja, jangan coba-coba dikomersilkan jika tidak ingin pelangguna protes keras karena diblacklist.

Detail produk yang dapat melakukan MSTeams Direct Routing masing-masing brand bisa dilihat update-nya di sini. Di Indonesia, dua merk yang paling banyak digunakan adalah Ribbon Communication (ini dulunya Sonus) dan AudioCodes.

Sertifikat SSL juga hanya boleh dari yang CA yang direkomendasikan oleh Microsoft. Per tulisan ini yang daftarnya adalah:

  • AffirmTrust
  • AddTrust External CA Root
  • Baltimore CyberTrust Root
  • Buypass
  • Cybertrust
  • Class 3 Public Primary Certification Authority
  • Comodo Secure Root CA
  • Deutsche Telekom
  • DigiCert Global Root CA
  • DigiCert High Assurance EV Root CA
  • Entrust
  • GlobalSign
  • Go Daddy
  • GeoTrust
  • Verisign, Inc.
  • SSL.com
  • Starfield
  • Symantec Enterprise Mobile Root for Microsoft
  • SwissSign
  • Thawte Timestamping CA
  • Trustwave

Pastikan selalu memeriksa update daftarnya di sini. Dan pastikan juga untuk mengikuti berita terakhir tentang perusahaan penyedia sertifikat tersebut. Terakhir saya menggunakan Comodo SSL, setelah dibeli oleh perusahaan Sectigo yang notabene tidak masuk dalam list di atas, SBC malah tidak bisa tersambung ke cloud MSTeams Phone System. Padahal sudah tertulis di situ ada Comodo SSL. Sekarang saya menggunakan DigiCert, yang bisa dibeli dari IDWebhost.

Topologi MSTeams Direct Routing kira-kira seperti berikut:

MSTeams Phone System ini bisa dianggap sebagai PBX, dan kebetulan dulu namanya CloudPBX juga. Tidak jauh beda dengan topologi layanan hosted PBX di Ofon (jika butuh perbandingan apple to apple) :

Semua user MSTeams bisa dianggap sebagai “ekstensi” dari Phone System. Tapi tidak semua fitur PBX bisa diterapkan di MSTeams, seperti misalnya jika PBX (hosted maupun on premise) ada fitur global callerid, yaitu satu nomer telepon yang digunakan oleh banyak ekstensi sebagai identitas melakukan panggilan. Di MSTeams Phone System-nya sendiri, fitur tersebut hanya bisa dilakukan dengan layanan Calling Plan, dan belum dilakukan dengan Direct Routing. Pilihan untuk global callerid di Direct Routing hanya Anonymous, nomer telepon tidak ditampilkan. Untuk beberapa operator, setting panggilan Anonymous ini tidak diperbolehkan. Oleh karena itu perlu dibantu di sisi SBC.

Hal lain yang ada di PBX tapi tidak ada di MSTeams Phone System adalah panggilan nomer ekstensi, karena id user sudah berupa email (atau mirip email). Sebenarnya ini adalah bentuk identitas di masa depan (entah kapan). Kelak (mungkin) nomer telpon sudah tidak berlaku. Dalam kartu nama, misalnya, hanya ada alamat email yang berlaku menjadi kontak email, messaging, chat, dan juga telepon. Tapi kayaknya masih lama banget karena dengan format demikian, pengguna akan rentan terhadap robocalling ataupun spam. Jadi nomer telpon sepertinya akan menjadi pilihan identitas dalam jangka waktu yang masih lama.

AutoAttendant juga sudah ada di MSTeams Phone System, dan license untuk instance ini pun digratiskan jika sudah memiliki license Phone System. Namanya Phone System – Virtual User (PSVU). License ini tidak sama dengan license Phone System jadi tidak akan bisa jika disandingkan dengan Office 365 E1/E3 untuk menggantikan Phone System. Lincese ini benar-benar untuk AutoAttendant dan Queue.

Apa yang membedakan client MSTeams dengan Phone System dan yang tanpa Phone System?

Dialpad.

Di MSTeams yang ada license Phone System akan muncul dialpad sehingga pengguna dapat melakukan panggilan ke mana pun.

Sedangkan yang tanpa license Phone System hanya dapat melakukan panggilan ke sesama pengguna MSTeams, baik di dalam realm/domain yang sama ataupun beda.

(Bersambung ke Tulisan 2)

Links:

(Bersambung ke Tulisan 2)

Replikasi usrloc Kamailio Dengan dmq_usrloc

Salah satu redundansi SIP yang digunakan di kantor adalah dengan replikasi usrloc antar dua SIP registrar di dua datacenter yang berbeda. Lalu hostname akan diresolve ke kedua server tersebut, sehingga jika pada saat ada panggilan masuk dari Offnet ke pelanggan, dan kebetulan salah satu server SIP registrar down beberapa detik sebelum panggilan diteruskan, di SIP server lain masih memiliki AoR/usrloc user yang dituju dan panggilan tetap bisa diteruskan. (Untuk redundansi outbound call tidak akan di bahas di tulisan ini).

Untuk mereplikasi AoR/usrloc saya menggunakan modul dmq

Berikut cara install dan konfigurasi dmq untuk dua SIP server yang saya beri nama sip01.domain.tld (10.0.0.1) dan sip02.domain.tld (10.0.0.2). Skenario berikut ini juga bisa dijalankan untuk dua datacenter yang berbeda, sehingga dmq melakukan sinkronisasi via internet.

sip01.domain.tld (10.0.0.1)

Dengan asumsi server yang dijalankan adalah Centos versi 7 dan ini adalah SIP server untuk Kazoo platform yang sudah disetup dan berjalan, install dmq:

yum install -y kamailio-dmq_userloc.x86_64

Karena ini adalah salah satu komponen dari Kazoo platform, edit file /etc/kazoo/kamailio/default.cfg, dan tambahkan baris berikut:

...
...
...
####### DMQ & dmq_userloc #######
loadmodule "dmq.so"
loadmodule "dmq_usrloc.so"
modparam("dmq", "server_address", "sip:10.0.0.1:5060")
modparam("dmq", "notification_address", "sip:10.0.0.2:5060")
modparam("dmq", "num_workers", 8)
modparam("dmq", "ping_interval", 90)
modparam("dmq_usrloc", "enable", 1)
modparam("dmq_usrloc", "sync", 0)
...
...
...

Perhatikan baris yang ada server_address dan notification_address. Untuk server pertama, server_address diisikan ip address dari server sip01.domain.tld, dan notification_address diisikan sip address sip02.domain.tld.

Lalu masih di dalam file yang sama, tapi di dalam block route, tambahkan baris:

...
...
...
# routing dmq 
    if(is_method("KDMQ"))
        {
                dmq_handle_message();
        }
...
...
...

Save dan restart service kamailio.

sip02.domain.tld (10.0.0.1)

Pada dasarnya kita melakukan hal yang sama dengan sip server pertama. Install module dmq di server sip server kedua.

yum install -y kamailio-dmq_userloc.x86_64

Lalu konfig file /etc/kazoo/kamailio/default.cfg dan tambahkan baris berikut:

...
...
...
####### DMQ & dmq_userloc #######
loadmodule "dmq.so"
loadmodule "dmq_usrloc.so"
modparam("dmq", "server_address", "sip:10.0.0.2:5060")
modparam("dmq", "notification_address", "sip:10.0.0.1:5060")
modparam("dmq", "num_workers", 8)
modparam("dmq", "ping_interval", 90)
modparam("dmq_usrloc", "enable", 1)
modparam("dmq_usrloc", "sync", 0)
...
...
...

Perhatikan di baris yang ada server_address dan notification_address. IP address diset berbalik dengan konfigurasi terhadap sip server pertama. Selanjutnya untuk blok route sama:

...
...
...
# routing dmq 
    if(is_method("KDMQ"))
        {
                dmq_handle_message();
        }
...
...
...

Save file konfigurasi dan reload Kamailio.

Test Hasil

Untuk melihat apakah jumlah pengguna yang teregistrasi di kedua sip server sudah sama (harusnya sama, jika ada perbedaan mungkin sedang dalam tahap sinkronisasi karena kadang-kadang pengguna terputus dan tersambung di sip server) jalankan perintah berikut:

kamctl ul show --brief | jq

Perhatikan output di bagian berikut untuk kedua server:

 "Stats": {
            "Records": 670,
            "Max-Slots": 4
          }

Untuk entri Records baik di server pertama maupun server kedua, harusnya berjumlah sama yaitu 670. Jika ada perbedaan paling hanya 5 – 10 angka saja. Dan jika ingin benar-benar memastikan, ambil contoh satu record dari hasil di atas (harusnya hasil di atas berupa list panjang, tapi dalam contoh di sini hanya diambil potongan output itu saja), misal untuk record:

{
   "AoR": "user_8udxaw@11778f.sip.domain.tld"
}

Kita bisa search AoR tersebut di kedua server dengan cara:

kamctl ul show user_8udxaw@11778f.sip.domain.tld | jq

Jika tanpa dmq user tersebut hanya ada di salah satu server. Jika dengan dmq yang terinstall dengan baik, maka di kedua server mencatat AoR yang sama sekaligus.

[tips] Mematikan autorotate Layar di Ubuntu 19.10

Ndak tau sejak kapan, desktop Ubuntu ku bisa autorotate ketika posisi laptop agak berubah kemiringannya (misal pindah lokasi duduk atau sekedar ngangkat). Yang menyebalkan kadang sudah diputer-puter berapa kali layar ndak kembali ke semula.

Untuk mematikan autorotate, caranya adalah dengan mematikan aplikasi iio-sensor-proxy dengan cara berikut:

# systemctl stop iio-sensor-proxy
# systemctl disable iio-sensor-proxy
# apt remove iio-sensor-proxy --purge

Dah, habis itu laptop diputer-puter bagaimana pun layar ga akan ikut muter kayak henpon.