# FusionPBX A full-featured domain based multi-tenant PBX and voice switch for FreeSwitch. #### Links - Website: [https://www.fusionpbx.com/](https://www.fusionpbx.com/) - Forum: [https://www.pbxforums.com/](https://www.pbxforums.com/) - Documentation: [https://docs.fusionpbx.com/en/latest/index.html](https://docs.fusionpbx.com/en/latest/index.html) - Github: [https://github.com/fusionpbx/fusionpbx](https://github.com/fusionpbx/fusionpbx) #### Installation - Install script: [https://www.fusionpbx.com/download](https://www.fusionpbx.com/download) Debian 11 ```bash wget -O - https://raw.githubusercontent.com/fusionpbx/fusionpbx-install.sh/master/debian/pre-install.sh | sh; cd /usr/src/fusionpbx-install.sh/debian && ./install.sh ``` #### NAT Setting Web Admin > Advanced > Variables > IP Addresses - external\_rtp\_ip: <server-public-ip> - external\_sip\_ip: <server-public-ip> 重啟 freeswitch ```bash systemctl restart freeswitch ``` 驗證 Web Admin > Status > SIP Status - sofia status profile internal: ext-rtp-ip, ext-sip-ip - sofia status profile external: ext-rtp-ip, ext-sip-ip #### RTP Port /etc/freeswitch/autoload\_configs/switch.conf.xml: ```xml ``` #### Gateway to Asterisk On FreePBX 1. Added a custom context 'from-ext-sip-server' with the module [Custom Contexts](https://github.com/FreePBX-ContributedModules/customcontexts/tree/release/13.0). 2. FreePBX Admin > Connectivity > Custom Contexts > Add Context - Context: from-ext-sip-server - Description: Whatever - Outbound Routes: <allow-some-route> 3. Add Trunk - Trunk Name: fusionpbx - PEER Details: ``` host=sip.osslab.tw type=peer context=from-ext-sip-server nat=yes insecure=port,invite ``` On FusionPBX Web Admin > Accounts > Gateways > Add - Gateway: myasterisk - Proxy: <my-asterisk-sip> - Register: False - Profile: external - Enable: Checked Web Admin > Dialplan > Outbound Routes > Add - Gateway: myasterisk - Dialplan Expression: 9 Digits - Prefix: <blank> - Enable: True 另一個方法:以 Bridge 取代 Gateway Applications > Bridge - Name: <自定義> - Destination: `sofia/Internal/$1@:5060` Advanced > Access Controls > Add - Name: FreePBX - Default: deny - Nodes - Type: allow - CIDR: `/32` - Domain: <CIDR 與 Domain 擇其一> - Description: <自訂> Outbound Route 記得要選 Bridge。 #### Voicemail to Email Web Admin > Accounts > Extensions > Select extension and Edit - Voicemail Mail to: <your-email-addr> Web Admin > Advanced > Default Settings > Email - address\_type: add\_address - method: smtp - smtp\_auth: True - smtp\_from: <sender-from-addr> - smtp\_from\_name: <sender-from-name> - smtp\_host: smtp-relay.sendinblue.com - smtp\_hostname: False - smtp\_username: <smtp-user> - smtp\_password: <smtp-pass> - smtp\_port: 587 - smtp\_secure: tls - smtp\_validate\_certificate: True Send Test Email Web Admin > Status > Email Logs > TEST Bug Fixed: > \[ERR\] switch\_cpp.cpp:1465 \[database\] can not bind parameter: undefined parameter: email\_from Edit /usr/share/freeswitch/scripts/resources/functions/send\_mail.lua ``` if (email_from == nil or email_from == "") then email_from = settings:get('email', 'smtp_from', 'text'); from_name = settings:get('email', 'smtp_from_name', 'text'); end -- added by Alang -- fixed: [ERR] switch_cpp.cpp:1465 [database] can not bind parameter: undefined parameter: email_from email_from = 'noreply@your.domain'; if (email_from == nil or email_from == "") then email_from = address; elseif (from_name ~= nil and from_name ~= "") then email_from = from_name .. "<" .. email_from .. ">"; end ``` #### Voicemail Transcription ##### IBM Watson API IBM Cloud > Watson > STT - API Key: `SQCKJOwC_4VoRozrhw-zm2vYFcxgztFlb2LskGr` - API URL: `https://api.au-syd.speech-to-text.watson.cloud.ibm.com/instances/{GUID}` FusionPBX > Advanced > Default Settings > 新增以下參數
CategorySubcategoryTypeValueEnabled
voicemailtranscribe\_providertextwatsonTrue
voicemailwatson\_keytext{your watson key}True
voicemailwatson\_urltext{watson url}True
voicemailtranscribe\_languagetexten-USTrue
voicemailtranscribe\_enabledbooleantrueTrue
voicemailjson\_enabledbooleantrueTrue
- watson\_url = `https://api.au-syd.speech-to-text.watson.cloud.ibm.com/instances/{GUID}/v1/recognize?model=en-US_NarrowbandModel&smart_formatting=true` - 其他語言模型:[https://cloud.ibm.com/docs/speech-to-text?topic=speech-to-text-models](https://cloud.ibm.com/docs/speech-to-text?topic=speech-to-text-models) 按下 "Reload" 套用設定。 FusionPBX > Status > SIP Status 按下 "Flush Cache","Reload XML" 與 "Rescan"。 測試 STT API ```bash # Audio file: audio-file.flac curl -X POST -u "apikey:{API_KET}" \ --header "Content-Type: audio/flac" \ --data-binary @audio-file.flac \ "https://api.au-syd.speech-to-text.watson.cloud.ibm.com/instances/{GUID}/v1/recognize" ``` #### Auto Provisioning ##### Provision (Linksys PAP2T) Web Admin > Advanced > Default Settings > Provision - enabled: `True`, Enabled: True - admin\_password: <自訂密碼,硬體電話的管理存取>, Enabled: True - http\_auth\_username: <空白>, Enable: False *NOTE: PAP2T 不支援 http 認證的 Auto Provisioning。* - ntp\_server\_primary: `tw.pool.ntp.org`, Enable: True - spa\_dial\_plan: `(*xx|*0xx|[3469]11|0|00|[2-9]xxxxxx|1xxx[2-9]xxxxxxS0|*xxxx|xxxxxxxxxxxx.)`, Enabled: True - spa\_time\_zone: `GMT+08:00`, Enabled: True ##### Device Web Admin > Accounts > Devices > ADD - MAC Address: <PAP2T-MAC-Addr> - Domain: <選擇適合的網域> - Enabled: Checked - 其餘欄位保持空白或預設 ##### Extension Web Admin > Accounts > Extensions > Add - Extension: <自訂分機號> - Device Provisioning: - Line: 1 - MAC Address: <選擇 PAP2T 的 MAC> - Template: cisco/pap2t - Domain: <選擇合適的網域> - Enabled: Checked ##### 驗證 Provision Configuration 瀏覽器輸入 `http:///app/provision/?mac=` > 如果有輸出 XML 格式的參數設定檔內容,表示以上的設定正確。 ##### Linksys PAP2T PAP2T Web Admin > Provisioning - Provision Enable: `yes` - Profile Rule: `http:///app/provision/?mac=$MA` > TIP: 如果發生無法註冊成功,且同一個 NAT 網路環境還有其他 SIP 終端裝置。試試修改 PAP2T 的 Local SIP port 為其他 port。 修改 PAP2T 的 Local Port (透過 FusionPBX) Web Admin > Accounts > Devices > Select: <PAP2T-Mac-Addr> > Lines > Line 1 - Port: 1001 (預設是 5060) 重啟 PAP2T 以便重新同步新設定。 ##### Cisco IP Phone 8841 - [Cisco 8841 User Manual](https://wiki.bicomsystems.com/UADs/Cisco_8841) - [Cisco IP Phone 8800 Series :Deployment and Provisioning](https://www.cisco.com/c/en/us/td/docs/voice_ip_comm/cuipph/MPP/8800/english/provisioning/p881_b_mpp-8800-provisioning-guide/p881_b_mpp-8800-provisioning-guide_chapter_00.html) - [Cisco IP Phone 8800 Series : Provisioning Examples](https://www.cisco.com/c/en/us/td/docs/voice_ip_comm/cuipph/MPP/8800/english/provisioning/p881_b_mpp-8800-provisioning-guide/p881_b_mpp-8800-provisioning-guide_chapter_011.html) #### Let's Encrypt - [Doc - Lent's Encrypt](https://docs.fusionpbx.com/en/latest/getting_started/lets_encrypt.html) #### WebRTC - [Doc - WebRTC](https://docs.fusionpbx.com/en/latest/applications_optional/webrtc.html) - [Github](https://github.com/fusionpbx/fusionpbx-apps/tree/master/webrtc) - [SaraPhone](https://saraphone.org/)