# 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 &gt; Advanced &gt; Variables &gt; IP Addresses

- external\_rtp\_ip: &lt;server-public-ip&gt;
- external\_sip\_ip: &lt;server-public-ip&gt;

重啟 freeswitch

```bash
systemctl restart freeswitch
```

驗證

Web Admin &gt; Status &gt; 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
<!-- RTP port range -->
<!-- If no definitation the port range would be 16384 - 32768 -->
<param name="rtp-start-port" value="16384"/>
<param name="rtp-end-port" value="17000"/>
```

#### 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 &gt; Connectivity &gt; Custom Contexts &gt; Add Context 
    - Context: from-ext-sip-server
    - Description: Whatever
    - Outbound Routes: &lt;allow-some-route&gt;
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 &gt; Accounts &gt; Gateways &gt; Add

- Gateway: myasterisk
- Proxy: &lt;my-asterisk-sip&gt;
- Register: False
- Profile: external
- Enable: Checked

Web Admin &gt; Dialplan &gt; Outbound Routes &gt; Add

- Gateway: myasterisk
- Dialplan Expression: 9 Digits
- Prefix: &lt;blank&gt;
- Enable: True

另一個方法：以 Bridge 取代 Gateway

Applications &gt; Bridge

- Name: &lt;自定義&gt;
- Destination: `sofia/Internal/$1@<your-freePBX-IP>:5060`

Advanced &gt; Access Controls &gt; Add

- Name: FreePBX
- Default: deny
- Nodes 
    - Type: allow
    - CIDR: `<your-freePBX-IP>/32`
    - Domain: &lt;CIDR 與 Domain 擇其一&gt;
    - Description: &lt;自訂&gt;

 Outbound Route 記得要選 Bridge。

#### Voicemail to Email

Web Admin &gt; Accounts &gt; Extensions &gt; Select extension and Edit

- Voicemail Mail to: &lt;your-email-addr&gt;

Web Admin &gt; Advanced &gt; Default Settings &gt; Email

- address\_type: add\_address
- method: smtp
- smtp\_auth: True
- smtp\_from: &lt;sender-from-addr&gt;
- smtp\_from\_name: &lt;sender-from-name&gt;
- smtp\_host: smtp-relay.sendinblue.com
- smtp\_hostname: False
- smtp\_username: &lt;smtp-user&gt;
- smtp\_password: &lt;smtp-pass&gt;
- smtp\_port: 587
- smtp\_secure: tls
- smtp\_validate\_certificate: True

Send Test Email

Web Admin &gt; Status &gt; Email Logs &gt; 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 &gt; Watson &gt; STT

- API Key: `SQCKJOwC_4VoRozrhw-zm2vYFcxgztFlb2LskGr`
- API URL: `https://api.au-syd.speech-to-text.watson.cloud.ibm.com/instances/{GUID}`

FusionPBX &gt; Advanced &gt; Default Settings &gt; 新增以下參數

<table border="1" class="docutils" id="bkmrk-category-subcategory"><thead valign="bottom"><tr class="row-odd"><th class="head">Category</th><th class="head">Subcategory</th><th class="head">Type</th><th class="head">Value</th><th class="head">Enabled</th></tr></thead><tbody valign="top"><tr class="row-even"><td>voicemail</td><td>transcribe\_provider</td><td>text</td><td>watson</td><td>True</td></tr><tr class="row-odd"><td>voicemail</td><td>watson\_key</td><td>text</td><td>{your watson key}</td><td>True</td></tr><tr class="row-even"><td>voicemail</td><td>watson\_url</td><td>text</td><td>{watson url}</td><td>True</td></tr><tr class="row-odd"><td>voicemail</td><td>transcribe\_language</td><td>text</td><td>en-US</td><td>True</td></tr><tr class="row-even"><td>voicemail</td><td>transcribe\_enabled</td><td>boolean</td><td>true</td><td>True</td></tr><tr class="row-odd"><td>voicemail</td><td>json\_enabled</td><td>boolean</td><td>true</td><td>True</td></tr></tbody></table>

- 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 &gt; Status &gt; 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 &gt; Advanced &gt; Default Settings &gt; Provision

- enabled: `True`, Enabled: True
- admin\_password: &lt;自訂密碼,硬體電話的管理存取&gt;, Enabled: True
- http\_auth\_username: &lt;空白&gt;, 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 &gt; Accounts &gt; Devices &gt; ADD

- MAC Address: &lt;PAP2T-MAC-Addr&gt;
- Domain: &lt;選擇適合的網域&gt;
- Enabled: Checked
- 其餘欄位保持空白或預設

##### Extension

Web Admin &gt; Accounts &gt; Extensions &gt; Add

- Extension: &lt;自訂分機號&gt;
- Device Provisioning: 
    - Line: 1
    - MAC Address: &lt;選擇 PAP2T 的 MAC&gt;
    - Template: cisco/pap2t
    - Domain: &lt;選擇合適的網域&gt;
    - Enabled: Checked

##### 驗證 Provision Configuration

瀏覽器輸入 `http://<fusionpbx-ip-addr>/app/provision/?mac=<pap2t-mac-addr>`

> 如果有輸出 XML 格式的參數設定檔內容，表示以上的設定正確。

##### Linksys PAP2T

PAP2T Web Admin &gt; Provisioning

- Provision Enable: `yes`
- Profile Rule: `http://<fusionpbx-ip-addr>/app/provision/?mac=$MA`

> TIP: 如果發生無法註冊成功，且同一個 NAT 網路環境還有其他 SIP 終端裝置。試試修改 PAP2T 的 Local SIP port 為其他 port。

修改 PAP2T 的 Local Port (透過 FusionPBX)

Web Admin &gt; Accounts &gt; Devices &gt; Select: &lt;PAP2T-Mac-Addr&gt; &gt; Lines &gt; Line 1

- Port: 1001 (預設是 5060)

重啟 PAP2T 以便重新同步新設定。

##### Cisco IP Phone 8800/7800 Series

- [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)
- [Cisco IP Phone 7800 Series and Cisco IP Conference Phone 7832 Multiplatform Phones Provisioning Guide](https://www.cisco.com/c/en/us/td/docs/voice_ip_comm/cuipph/MPP/7800/english/provisioning/pa2d_b_mpp-7800-provisioning-guide/pa2d_b_mpp-7800-provisioning-guide_chapter_00.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/)