修正~Asterisk Realtime Mode

    版本為 16:31, 27 Jan 2025

    到這個版本。

    返回到 版本存檔.

    查閱目前版本

    問題描述:A2Billing 預設是以 Asterisk Realtime Mode 與 Asterisk 作連結,但若沒有經過一些設定,會使兩者的設定無法同步。

    為何要使用 Realtime Mode:

    • 如果 SIP/IAX 帳戶數量超過 15000+,就必須使用 Realtime mode,否則 VoIP 的 UI 相關操作會產生異常。
    • 若要將 A2B 與 Asterisk 安裝在不同的機器,必須使用 Realtime Mode。
       

    軟體版本:A2Billing 1.7.x, 1.9.x

    步驟開始

    // 檢查 asterisk 有無啟動以下的模組,res_config_mysql.so, res_realtime.so

    $ asterisk -rx "module show like res"
    Module                         Description                              Use Count
    ...
    res_config_mysql.so            MySQL RealTime Configuration Driver      0
    res_realtime.so                Realtime Data Lookup/Rewrite             0
    

    // 編輯 /etc/asterisk/res_mysql.conf
    // 增加這幾行

    ...
    [mya2b]
    dbhost = 127.0.0.1
    dbname = mya2billing
    dbuser = a2billinguser
    dbpass = a2billing
    dbport = 3306
    dbsock = /var/lib/mysql/mysql.sock
    ; NOTE! If running Asterisk 1.6 or later add the following line
    requirements = warn
    

    TIPS:

    * dbname,dbuser,dbpass 可以參考 /etc/asterisk/a2billing.conf

    // 編輯 /etc/asterisk/extconfig.conf

    [settings]
    ;This is used for A2B realtime mode
    sipusers => mysql,mya2b,cc_sip_buddies
    sippeers => mysql,mya2b,cc_sip_buddies
    iaxusers => mysql,mya2b,cc_iax_buddies
    iaxpeers => mysql,mya2b,cc_iax_buddies
    

    Tips:

    For Asterisk 1.6.x+,mya2b 必須是 res_mysql.conf 的定義名稱。

    For Asterisk 1.4.x,mya2b 必須是實際的資料庫名稱,例如是 mya2billing。

    確認指令

    #asterisk -rx "realtime mysql status"
    Connected to mya2billing@123.123.123.123, port 3306 with username a2billinguser for 34 seconds.
    
    # asterisk -rx "core show config mappings"
    
    ...
    Config Engine: mysql
    ===> iaxpeers (db=mya2billing, table=cc_iax_buddies)
    ===> iaxusers (db=mya2billing, table=cc_iax_buddies)
    ===> sippeers (db=mya2billing, table=cc_sip_buddies)
    ===> sipusers (db=mya2billing, table=cc_sip_buddies)
    

    // 設定 A2B
    A2B Admin > SYSTEM SETTINGS > Global List > Select Group: global

    use_realtime = yes

    注意事項

    • 如果 SIP/IAX 帳戶數量超過 15000+,就必須使用 Realtime mode,否則 VoIP 的 UI 相關操作會產生異常。
    • 系統在啟用 Realtime mode 後,當 A2B 新增了 SIP 帳號,若執行 sip show users, sip show peers 不會有任何結果,但此時分機已經建立完畢並且立即生效,CLI 的輸出必須等分機有註冊上,才會有資料顯示。
    • 設定 Realtime mode 時,對於 Asterisk 1.4, 1.6+ 會有不同設定。
    • 設定檔的 SIP 帳號仍可以保留,但只能用在非 A2B 的系統,例如 FreePBX。
    • 增加 rtcachefriends=yes 在 sip.conf,如此才能使用 sip show [users|peers] 等指令。用戶端要先註冊後,主機才會有顯示。

    在 Asterisk 1.8 的實作

    1. res_config_mysql.conf
    2. extconfig.conf
    3. Table sip_buddies
    編輯 res_config_mysql.conf
    [ast18]
    dbhost = 127.0.0.1
    dbname = asterisk
    dbuser = astuser
    dbpass = mypass
    dbport = 3306
    dbsock = /var/run/mysqld/mysql.sock ;for ubuntu
    requirements=warn ; or createclose or createchar
    
    編輯 extconfig.conf
    [settings]
    ;This is used for Asterisk realtime mode
    sipusers => mysql,ast18,sip_buddies
    sippeers => mysql,ast18,sip_buddies
    
    Table sip_buddies
    #
    # Table structure for table `sip_buddies`
    #
    
    CREATE TABLE `sip_buddies` (
    `id` int(11) NOT NULL auto_increment,
    `name` varchar(80) NOT NULL default '',
    `host` varchar(31) NOT NULL default '',
    `nat` varchar(5) NOT NULL default 'no',
    `type` enum('user','peer','friend') NOT NULL default 'friend',
    `accountcode` varchar(20) default NULL,
    `amaflags` varchar(13) default NULL,
    `call-limit` smallint(5) unsigned default NULL,
    `callgroup` varchar(10) default NULL,
    `callerid` varchar(80) default NULL,
    `cancallforward` char(3) default 'yes',
    `canreinvite` char(3) default 'yes',
    `context` varchar(80) default NULL,
    `defaultip` varchar(15) default NULL,
    `dtmfmode` varchar(7) default NULL,
    `fromuser` varchar(80) default NULL,
    `fromdomain` varchar(80) default NULL,
    `insecure` varchar(4) default NULL,
    `language` char(2) default NULL,
    `mailbox` varchar(50) default NULL,
    `md5secret` varchar(80) default NULL,
    `deny` varchar(95) default NULL,
    `permit` varchar(95) default NULL,
    `mask` varchar(95) default NULL,
    `musiconhold` varchar(100) default NULL,
    `pickupgroup` varchar(10) default NULL,
    `qualify` char(3) default NULL,
    `regexten` varchar(80) default NULL,
    `restrictcid` char(3) default NULL,
    `rtptimeout` char(3) default NULL,
    `rtpholdtimeout` char(3) default NULL,
    `secret` varchar(80) default NULL,
    `setvar` varchar(100) default NULL,
    `disallow` varchar(100) default 'all',
    `allow` varchar(100) default 'g729;ilbc;gsm;ulaw;alaw',
    `fullcontact` varchar(80) NOT NULL default '',
    `ipaddr` varchar(15) NOT NULL default '',
    `port` smallint(5) unsigned NOT NULL default '0',
    `regserver` varchar(100) default NULL,
    `regseconds` int(11) NOT NULL default '0',
    `lastms` int(11) NOT NULL default '0',
    `username` varchar(80) NOT NULL default '',
    `defaultuser` varchar(80) NOT NULL default '',
    `subscribecontext` varchar(80) default NULL,
    `useragent` varchar(20) default NULL,
    PRIMARY KEY (`id`),
    UNIQUE KEY `name` (`name`)
    ) ENGINE=MyISAM ROW_FORMAT=DYNAMIC;
    Powered by MindTouch Core