*** บทความนี้เป็นหนึ่งในหลายๆบทความเกี่ยวกับวิธีการคอนฟิกและการใช้งาน Linksys SPA-3102 (1 FXO + 1 FXS, 1 LAN + 1 WAN) ***
1. ล๊อกอินเป็น Admin
http://192.168.100.200/admin
แล้วคลิ๊ก "advanced" -> "voice"
2. คลิ๊กแท็ป "Line 1"
- โค้ด: เลือกทั้งหมด
Line Enable = Yes
3. คอนฟิกให้ Register กับ SIP Server
** สมมติว่า SIP Server = 192.168.100.100, User=88133, Pass=12345 **
- โค้ด: เลือกทั้งหมด
Proxy and Registration -> Proxy = 192.168.100.100
Proxy and Registration -> Register = Yes
Proxy and Registration -> Register Expires = 60
- โค้ด: เลือกทั้งหมด
Subscriber Information -> Display Name = 88133
Subscriber Information -> User ID = 88133
Subscriber Information -> Password = 12345
Subscriber Information -> Use Auth ID = Yes
Subscriber Information -> Auth ID = 88133
4. คอนฟิก NAT Keepalive
- โค้ด: เลือกทั้งหมด
NAT Settings -> NAT Keep Alive Enable = Yes
(แล้วคลิ๊กแท๊ป "SIP" เซ็ตค่า "NAT Support Parameters" -> "NAT Keep Alive Intvl" = 15 หรือมากกว่า หน่วยเป็นวินาที โดยที่ SPA-3102 จะส่ง NOTIFY ไปยัง SIP Server ทุกๆช่วงเวลานี้ เพื่อให้ Router ยังคงเปิดพอร์ตที่ SPA-3102 ใช้คุยกับ SIP Server ไว้)
5. คอนฟิก Codec
- โค้ด: เลือกทั้งหมด
Audio Configuration -> Preferred Codec = G729a
6. คอนฟิก Dialplan
- โค้ด: เลือกทั้งหมด
Dialplan -> Dialplan = (*xx|0[2-7]xxxxxxxS0|0[8-9]xxxxxxxxS0|[3469]11|0|00|[2-9]xxxxxx|1xxx[2-9]xxxxxxS0|xxxxxxxxxxxx.)
** จริงๆค่าดีฟอลท์มีอยู่แค่นี้ (*xx|[3469]11|0|00|[2-9]xxxxxx|1xxx[2-9]xxxxxxS0|xxxxxxxxxxxx.) ผมเพิ่ม 0[2-7]xxxxxxxS0|0[8-9]xxxxxxxxS0 เข้าไปเพื่อให้เวลาผมจะโทรไปเบอร์ภายนอก เบอร์บ้าน เบอร์มือถือ ผมก็กด 0x ได้เลย พอกดตัวเลขครบ 9 หลัก หรือ 10 หลัก มันก็จะโทรไปยัง SIP Server ทันที ผมไม่ต้องรอ 5 วินาทีหรือกด # ตามหลัง **
รายละเอียดเกี่ยวกับสัญลักษณ์ต่างๆใน Dialplan คร่าวๆเป็นดังต่อไปนี้ครับ
( ) เขียน Dial plan ให้อยู่ในเครื่องหมายนี้
| หมายถึงใช้แยกแต่ละ Dialplan ออกจากกัน
0 - 9 หมายถึงตัวเลข 0 ถึง 9
x แทนตัวเลขใดๆก็ได้ระหว่าง 0 - 9 ตัว x หนึ่งตัวคือตัวเลขหนึ่งหลัก
* แทนปุ่ม *
# แทนปุ่ม #
. แทนตัวเลขใดๆระหว่าง 0 - 9 กี่หลักก็ได้
<:> เป็นการแทนค่าชุดตัวเลขด้านซ้ายมือให้เป็นชุดตัวเลขด้านขวามือ เช่น <02:662> แทน 02 ด้วย 662 ส่วนตัวเลขอื่นๆที่ตามหลังมาก็จะเหมือนเดิม เช่น 023456789 ก็จะกลายเป็น 6623456789
<:@gw0> Gateway 0 หมายถึงพอร์ต PSTN
S0 หมายถึงโทรออกทันที
! หมายถึงไม่ให้โทร วางไว้หลัง Dialplan เพื่อใม่ให้กดเลขนี้ได้
, หมายถึงให้จ่าย Dial tone
[234] หมายถึงเลข 2, 3 หรือ 4
[2-4] หมายถึง 2, 3 และ 4 (เหมือนกับบรรทัดบน
[24-68] 2, 4, 5, 6 หรือ 8
ตัวอย่าง
(9S0<:@gw0>)
ถ้ากด 000 จะโทรออกทาง Gateway 0 ซึ่งก็คือพอร์ต PSTN Line (FXO)
(1xxx!|0[23457]xxxxxxxS0|0[89]xxxxxxxxS0)
กด 1 ตามด้วยเลขอีก 3 หลักไม่ได้
กด 02,03,04,05 หรือ 07 ตามด้วยเลขอีก 7 หลัก จะโทรออกทันที หรือจะเขียนแบบนี้เพื่อให้สั้นลง 0[2-57]xxxxxxxS0
กด 08 หรือ 08 ตามด้วยเลขอีก 8 หลัก จะโทรออกทันที
(<0:66>[2-57]xxxxxxxS0|<0:66>[89]xxxxxxxxS0|1xxx!)
กด 1 ตามด้วยเลขอีก 3 หลักไม่ได้
กด 02, 03, 04, 05 หรือ 07 ตามด้วยเลขอีก 7 หลัก จะแปลงเป็น 662, 663, 664, 665 หรือ 667 แล้วโทรออกทันที
7. คอนฟิก Line reverse
ควรจะคอนฟิก Line reverse (สลับขั้วแรงดัน) เวลาเอาพอร์ต FXS (PHONE) ไปต่อกับตู้สาขา ให้ตู้สาขารู้ว่ามีการรับสาย (บิลลิ่งเดิน) หรือวางสายแล้ว (บิลลิ่งหยุดเดิน) พอร์ตจะได้ไม่ค้าง แต่ถ้าต่อกับ Fax หรือหัวเครื่องโทรศัพท์ก็ไม่ต้องเซ็ตก็ได้นะครับ จะได้ไม่มีเสียง Relay เสียงดัง "กึก" เวลาปลายทางรับสาย รำคาญหูปล่าวๆ
- โค้ด: เลือกทั้งหมด
FXS Port Polarity Configuration -> Callee Conn Polarity = Reverse
ปกติจะเซ็ตให้มี Line reverse เฉพาะตอนเมื่อปลายทางรับสาย
8. คอนฟิก Fax
ใช้ค่า Default ได้เลย ผมใช้งานแบบ T.38 FAX ก็ใช้งานเวอร์คเลย ไม่ต้องเปลี่ยนค่าอะไร
- โค้ด: เลือกทั้งหมด
Audio Configuration -> FAX Enable T38 = Yes
Audio Configuration -> FAX T38 Redundancy = 1
Audio Configuration -> FAX CED Detect Enable = Yes
Audio Configuration -> FAX CNG Detect Enable = Yes
Audio Configuration -> FAX Passthru Codec = G711u
Audio Configuration -> FAX Codec Symmetric = Yes
Audio Configuration -> FAX Passthu Method = NSE
Audio Configuration -> FAX Process NSE = Yes
Audio Configuration -> FAX DisableECAN = No
Audio Configuration -> FAX Tone Detect Mode = caller or callee
9. เมนูในหน้า Line 1
10. คอนฟิกให้ SPA-3102 คุยกับ Elastix
เราสามารถเซ็ตพอร์ต FXS ของ SPA-3102 ให้คุยกับ Elastix ได้ 2 แบบนะครับ คือแบบ Register และแบบไม่ต้อง Register
** ตอนต่อ SPA-3102 เข้ากับเน็ตเวอร์ค ให้ใช้พอร์ต INTERNET (WAN) นะครับ ห้ามต่อผิดพอร์ต **
10.1 ให้ SPA-3102 รีจิสเตอร์กับ Elastix (Account Based Authentication)
วิธีนี้ก็เหมาะกับกรณีที่ SPA-3102 มีไอพีพอร์ต WAN แบบ Dynamic
10.1.1 สร้างเบอร์ Extensions บน Elastix ผมสร้างเป็นเบอร์ 501 ตอนสร้างก็ปกติเลยไม่มีอะไรต้องทำเป็นพิเศษ ตามรูปครับ
ได้ว่า User=501, Pass=3102-fxs เอาค่านี้พร้อมไอพีแอดเดรสของ Elastix ไปคอนฟิกใน "Line 1" ของ SPA-3102
10.1.2 คอนฟิก "Line1"
แก้ไขไม่กี่ที่ครับ ก็ใช้งานได้แล้ว
คลิ๊ก "Submit All Changes" แล้วรอสักครู่ ดูหน้า "Info" ก็จะเห็นว่า Register ได้
ก็พร้อมจะโทรจากพอร์ต Line1 ไปยังเบอร์ Extensions อื่นบน Elastix หรือแม้กระทั่งโทรผ่าน Trunk สายนอกที่คอนฟิกไว้ หรือว่าโทรจากเบอร์ Extension อื่นบน Elastix มาที่เบอร์ 501 บน SPA-3102 แล้วหล่ะครับ ลองดูครับ กดแบบปกติเลยครับ
*** ถ้าโทรไม่ได้ก็ไปเช็คใน Dialplan ว่ามีเซ็ตบล๊อกไว้หรือเปล่า หรือบางทีค่าดีฟอลท์นั่นแหล่ะที่มันบล๊อกเบอร์ไว้ ***
- โค้ด: เลือกทั้งหมด
Dial Plan = (2xx|*xx|0[2-7]xxxxxxxS0|0[8-9]xxxxxxxxS0|[3469]11|0|00|[2-9]xxxxxx|1xxx[2-9]xxxxxxS0|xxxxxxxxxxxx.)
ข้อความใน Asterisk Console ตอนที่โทรจากเบอร์ 501 ไปยังเบอร์ 200
- โค้ด: เลือกทั้งหมด
[Mar 15 18:37:54] -- Executing [200@from-internal:1] Set("SIP/501-0000001e", "__RINGTIMER=30") in new stack
[Mar 15 18:37:54] -- Executing [200@from-internal:2] Macro("SIP/501-0000001e", "exten-vm,novm,200") in new stack
[Mar 15 18:37:54] -- Executing [s@macro-exten-vm:1] Macro("SIP/501-0000001e", "user-callerid,") in new stack
[Mar 15 18:37:54] -- Executing [s@macro-user-callerid:1] ExecIf("SIP/501-0000001e", "0]?Set(CALLERID(number)=0501)") in new stack
[Mar 15 18:37:54] -- Executing [s@macro-user-callerid:2] ExecIf("SIP/501-0000001e", "0]?Set(CALLERID(number)=0501)") in new stack
[Mar 15 18:37:54] -- Executing [s@macro-user-callerid:3] ExecIf("SIP/501-0000001e", "0?Set(CALLERID(number)=)") in new stack
[Mar 15 18:37:54] -- Executing [s@macro-user-callerid:4] Set("SIP/501-0000001e", "AMPUSER=501") in new stack
[Mar 15 18:37:54] -- Executing [s@macro-user-callerid:5] GotoIf("SIP/501-0000001e", "0?report") in new stack
[Mar 15 18:37:54] -- Executing [s@macro-user-callerid:6] ExecIf("SIP/501-0000001e", "1?Set(REALCALLERIDNUM=501)") in new stack
[Mar 15 18:37:54] -- Executing [s@macro-user-callerid:7] Set("SIP/501-0000001e", "AMPUSER=501") in new stack
[Mar 15 18:37:54] -- Executing [s@macro-user-callerid:8] Set("SIP/501-0000001e", "AMPUSERCIDNAME=SPA-3102-FXS") in new stack
[Mar 15 18:37:54] -- Executing [s@macro-user-callerid:9] GotoIf("SIP/501-0000001e", "0?report") in new stack
[Mar 15 18:37:54] -- Executing [s@macro-user-callerid:10] Set("SIP/501-0000001e", "AMPUSERCID=501") in new stack
[Mar 15 18:37:54] -- Executing [s@macro-user-callerid:11] Set("SIP/501-0000001e", "CALLERID(all)="SPA-3102-FXS" <501>") in new stack
[Mar 15 18:37:54] -- Executing [s@macro-user-callerid:12] ExecIf("SIP/501-0000001e", "0?Set(CHANNEL(language)=)") in new stack
[Mar 15 18:37:54] -- Executing [s@macro-user-callerid:13] GotoIf("SIP/501-0000001e", "0?continue") in new stack
[Mar 15 18:37:54] -- Executing [s@macro-user-callerid:14] Set("SIP/501-0000001e", "__TTL=64") in new stack
[Mar 15 18:37:54] -- Executing [s@macro-user-callerid:15] GotoIf("SIP/501-0000001e", "1?continue") in new stack
[Mar 15 18:37:54] -- Goto (macro-user-callerid,s,22)
[Mar 15 18:37:54] -- Executing [s@macro-user-callerid:22] NoOp("SIP/501-0000001e", "Using CallerID "SPA-3102-FXS" <501>") in new stack
[Mar 15 18:37:54] -- Executing [s@macro-exten-vm:2] Set("SIP/501-0000001e", "RingGroupMethod=none") in new stack
[Mar 15 18:37:54] -- Executing [s@macro-exten-vm:3] Set("SIP/501-0000001e", "VMBOX=novm") in new stack
[Mar 15 18:37:54] -- Executing [s@macro-exten-vm:4] Set("SIP/501-0000001e", "EXTTOCALL=200") in new stack
[Mar 15 18:37:54] -- Executing [s@macro-exten-vm:5] Set("SIP/501-0000001e", "CFUEXT=") in new stack
[Mar 15 18:37:54] -- Executing [s@macro-exten-vm:6] Set("SIP/501-0000001e", "CFBEXT=") in new stack
[Mar 15 18:37:54] -- Executing [s@macro-exten-vm:7] Set("SIP/501-0000001e", "RT=""") in new stack
[Mar 15 18:37:54] -- Executing [s@macro-exten-vm:8] Macro("SIP/501-0000001e", "record-enable,200,IN") in new stack
[Mar 15 18:37:54] -- Executing [s@macro-record-enable:1] GotoIf("SIP/501-0000001e", "1?check") in new stack
[Mar 15 18:37:54] -- Goto (macro-record-enable,s,4)
[Mar 15 18:37:54] -- Executing [s@macro-record-enable:4] ExecIf("SIP/501-0000001e", "0?MacroExit()") in new stack
[Mar 15 18:37:54] -- Executing [s@macro-record-enable:5] GotoIf("SIP/501-0000001e", "0?Group:OUT") in new stack
[Mar 15 18:37:54] -- Goto (macro-record-enable,s,15)
[Mar 15 18:37:54] -- Executing [s@macro-record-enable:15] GotoIf("SIP/501-0000001e", "1?IN") in new stack
[Mar 15 18:37:54] -- Goto (macro-record-enable,s,20)
[Mar 15 18:37:54] -- Executing [s@macro-record-enable:20] ExecIf("SIP/501-0000001e", "1?MacroExit()") in new stack
[Mar 15 18:37:54] -- Executing [s@macro-exten-vm:9] Macro("SIP/501-0000001e", "dial,30,tr,200") in new stack
[Mar 15 18:37:54] -- Executing [s@macro-dial:1] GotoIf("SIP/501-0000001e", "1?dial") in new stack
[Mar 15 18:37:54] -- Goto (macro-dial,s,3)
[Mar 15 18:37:54] -- Executing [s@macro-dial:3] AGI("SIP/501-0000001e", "dialparties.agi") in new stack
[Mar 15 18:37:54] -- Launched AGI Script /var/lib/asterisk/agi-bin/dialparties.agi
[Mar 15 18:37:54] dialparties.agi: Starting New Dialparties.agi
[Mar 15 18:37:54] dialparties.agi: Caller ID name is 'SPA-3102-FXS' number is '501'
[Mar 15 18:37:54] dialparties.agi: Methodology of ring is 'none'
[Mar 15 18:37:54] -- dialparties.agi: Added extension 200 to extension map
[Mar 15 18:37:54] -- dialparties.agi: Extension 200 cf is disabled
[Mar 15 18:37:54] -- dialparties.agi: Extension 200 do not disturb is disabled
[Mar 15 18:37:54] dialparties.agi: EXTENSION_STATE: 0 (NOT_INUSE)
[Mar 15 18:37:54] dialparties.agi: Extension 200 has ExtensionState: 0
[Mar 15 18:37:54] -- dialparties.agi: Checking CW and CFB status for extension 200
[Mar 15 18:37:54] -- dialparties.agi: dbset CALLTRACE/200 to 501
[Mar 15 18:37:54] -- dialparties.agi: Filtered ARG3: 200
[Mar 15 18:37:54] -- <SIP/501-0000001e>AGI Script dialparties.agi completed, returning 0
[Mar 15 18:37:54] -- Executing [s@macro-dial:7] Dial("SIP/501-0000001e", "SIP/200,30,tr") in new stack
[Mar 15 18:37:54] == Using SIP RTP TOS bits 184
[Mar 15 18:37:54] == Using SIP RTP CoS mark 5
[Mar 15 18:37:54] -- Called 200
[Mar 15 18:37:54] -- SIP/200-0000001f is ringing
[Mar 15 18:38:12] -- SIP/200-0000001f answered SIP/501-0000001e
ข้อความใน Asterisk Console ตอนที่โทรจากเบอร์ 200 ไปหาเบอร์ 501
- โค้ด: เลือกทั้งหมด
[Mar 15 18:39:55] -- Executing [501@from-internal:1] Macro("SIP/200-00000020", "exten-vm,novm,501") in new stack
[Mar 15 18:39:55] -- Executing [s@macro-exten-vm:1] Macro("SIP/200-00000020", "user-callerid,") in new stack
[Mar 15 18:39:55] -- Executing [s@macro-user-callerid:1] ExecIf("SIP/200-00000020", "0]?Set(CALLERID(number)=0200)") in new stack
[Mar 15 18:39:55] -- Executing [s@macro-user-callerid:2] ExecIf("SIP/200-00000020", "0]?Set(CALLERID(number)=0200)") in new stack
[Mar 15 18:39:55] -- Executing [s@macro-user-callerid:3] ExecIf("SIP/200-00000020", "0?Set(CALLERID(number)=)") in new stack
[Mar 15 18:39:55] -- Executing [s@macro-user-callerid:4] Set("SIP/200-00000020", "AMPUSER=200") in new stack
[Mar 15 18:39:55] -- Executing [s@macro-user-callerid:5] GotoIf("SIP/200-00000020", "0?report") in new stack
[Mar 15 18:39:55] -- Executing [s@macro-user-callerid:6] ExecIf("SIP/200-00000020", "1?Set(REALCALLERIDNUM=200)") in new stack
[Mar 15 18:39:55] -- Executing [s@macro-user-callerid:7] Set("SIP/200-00000020", "AMPUSER=200") in new stack
[Mar 15 18:39:55] -- Executing [s@macro-user-callerid:8] Set("SIP/200-00000020", "AMPUSERCIDNAME=bkk") in new stack
[Mar 15 18:39:55] -- Executing [s@macro-user-callerid:9] GotoIf("SIP/200-00000020", "0?report") in new stack
[Mar 15 18:39:55] -- Executing [s@macro-user-callerid:10] Set("SIP/200-00000020", "AMPUSERCID=200") in new stack
[Mar 15 18:39:55] -- Executing [s@macro-user-callerid:11] Set("SIP/200-00000020", "CALLERID(all)="bkk" <200>") in new stack
[Mar 15 18:39:55] -- Executing [s@macro-user-callerid:12] ExecIf("SIP/200-00000020", "0?Set(CHANNEL(language)=)") in new stack
[Mar 15 18:39:55] -- Executing [s@macro-user-callerid:13] GotoIf("SIP/200-00000020", "0?continue") in new stack
[Mar 15 18:39:55] -- Executing [s@macro-user-callerid:14] Set("SIP/200-00000020", "__TTL=64") in new stack
[Mar 15 18:39:55] -- Executing [s@macro-user-callerid:15] GotoIf("SIP/200-00000020", "1?continue") in new stack
[Mar 15 18:39:55] -- Goto (macro-user-callerid,s,22)
[Mar 15 18:39:55] -- Executing [s@macro-user-callerid:22] NoOp("SIP/200-00000020", "Using CallerID "bkk" <200>") in new stack
[Mar 15 18:39:55] -- Executing [s@macro-exten-vm:2] Set("SIP/200-00000020", "RingGroupMethod=none") in new stack
[Mar 15 18:39:55] -- Executing [s@macro-exten-vm:3] Set("SIP/200-00000020", "VMBOX=novm") in new stack
[Mar 15 18:39:55] -- Executing [s@macro-exten-vm:4] Set("SIP/200-00000020", "EXTTOCALL=501") in new stack
[Mar 15 18:39:55] -- Executing [s@macro-exten-vm:5] Set("SIP/200-00000020", "CFUEXT=") in new stack
[Mar 15 18:39:55] -- Executing [s@macro-exten-vm:6] Set("SIP/200-00000020", "CFBEXT=") in new stack
[Mar 15 18:39:55] -- Executing [s@macro-exten-vm:7] Set("SIP/200-00000020", "RT=""") in new stack
[Mar 15 18:39:55] -- Executing [s@macro-exten-vm:8] Macro("SIP/200-00000020", "record-enable,501,IN") in new stack
[Mar 15 18:39:55] -- Executing [s@macro-record-enable:1] GotoIf("SIP/200-00000020", "1?check") in new stack
[Mar 15 18:39:55] -- Goto (macro-record-enable,s,4)
[Mar 15 18:39:55] -- Executing [s@macro-record-enable:4] ExecIf("SIP/200-00000020", "0?MacroExit()") in new stack
[Mar 15 18:39:55] -- Executing [s@macro-record-enable:5] GotoIf("SIP/200-00000020", "0?Group:OUT") in new stack
[Mar 15 18:39:55] -- Goto (macro-record-enable,s,15)
[Mar 15 18:39:55] -- Executing [s@macro-record-enable:15] GotoIf("SIP/200-00000020", "1?IN") in new stack
[Mar 15 18:39:55] -- Goto (macro-record-enable,s,20)
[Mar 15 18:39:55] -- Executing [s@macro-record-enable:20] ExecIf("SIP/200-00000020", "1?MacroExit()") in new stack
[Mar 15 18:39:55] -- Executing [s@macro-exten-vm:9] Macro("SIP/200-00000020", "dial,30,tr,501") in new stack
[Mar 15 18:39:55] -- Executing [s@macro-dial:1] GotoIf("SIP/200-00000020", "1?dial") in new stack
[Mar 15 18:39:55] -- Goto (macro-dial,s,3)
[Mar 15 18:39:55] -- Executing [s@macro-dial:3] AGI("SIP/200-00000020", "dialparties.agi") in new stack
[Mar 15 18:39:55] -- Launched AGI Script /var/lib/asterisk/agi-bin/dialparties.agi
[Mar 15 18:39:55] dialparties.agi: Starting New Dialparties.agi
[Mar 15 18:39:55] dialparties.agi: Caller ID name is 'bkk' number is '200'
[Mar 15 18:39:55] dialparties.agi: Methodology of ring is 'none'
[Mar 15 18:39:55] -- dialparties.agi: Added extension 501 to extension map
[Mar 15 18:39:55] -- dialparties.agi: Extension 501 cf is disabled
[Mar 15 18:39:55] -- dialparties.agi: Extension 501 do not disturb is disabled
[Mar 15 18:39:55] dialparties.agi: EXTENSION_STATE: 0 (NOT_INUSE)
[Mar 15 18:39:55] dialparties.agi: Extension 501 has ExtensionState: 0
[Mar 15 18:39:55] -- dialparties.agi: Checking CW and CFB status for extension 501
[Mar 15 18:39:55] -- dialparties.agi: dbset CALLTRACE/501 to 200
[Mar 15 18:39:55] -- dialparties.agi: Filtered ARG3: 501
[Mar 15 18:39:55] -- <SIP/200-00000020>AGI Script dialparties.agi completed, returning 0
[Mar 15 18:39:55] -- Executing [s@macro-dial:7] Dial("SIP/200-00000020", "SIP/501,30,tr") in new stack
[Mar 15 18:39:55] == Using SIP RTP TOS bits 184
[Mar 15 18:39:55] == Using SIP RTP CoS mark 5
[Mar 15 18:39:55] -- Called 501
[Mar 15 18:39:55] -- SIP/501-00000021 is ringing
[Mar 15 18:39:58] -- SIP/501-00000021 answered SIP/200-00000020
10.2 SPA-3102 เชื่อมต่อกับ Elastix แบบ SIP Trunk (IP Based Authentication)
10.3 โทรจาก SPA-3102 พอร์ต FXS (Phone) ไป Elastix
10.4 โทรจาก Elastix ไป SPA-3102 พอร์ต FXS (Phone)
11. คอนฟิกให้ SPA-3102 คุยกับ Asterisk
11.1 โทรจาก SPA-3102 พอร์ต FXS (Phone) ไป Elastix
11.2 โทรจาก Elastix ไป SPA-3102 พอร์ต FXS (Phone)
บทความที่เกี่ยวข้อง
คอนฟิกเริ่มต้น