หมายเหตุ.. ใน Elastix ถ้าเราเช็ค kernel (คำสั่ง rpm -qa | grep kernel) จะเห็นมี kernel-module-wanpipe อยู่ และเวลารีสตาร์ทเครื่องถ้าต่อจอมอนิเตอร์ก็จะเห็นว่ามีการโหลด wanpipe แต่ว่าจะ fail ไม่ต้องตกใจครับ เขาทำมาสำหรับการ์ด Sangoma เท่านั้น ในเครื่องเราถ้าไม่มีการ์ดนี้ก็จะเจอ Error อย่างที่ว่า รับรองไม่มีปัญหาการใช้งานครับ และถ้าดูที่เว็บอื่นที่เขามีบอกวิธีการติดตั้งการ์ด E1 แล้วมีการอ้างถึง wanpipe นั่นแสดงว่าเขาใช้การ์ดของ Sangoma ครับ
รูปร่างหน้าตาของการ์ด E1 TE110P
การ์ดนี้เป็นบัสแบบ PCI นะครับ ใส่ได้ทั้ง Slot PCI 5 Volt และ PCI 3.3 Volt


ติดตั้งใน PCI Slot

หัวลูป
รูปนี้เป็นหัวลูป (loop) ผมเอาไว้เทสพอร์ต E1 ว่ามันเจ้งหรือเปล่า ใช้สาย Lan ทำครับ เอาขา 1 (Rx-) ต่อกับขา 4 (Tx-) และขา 2 (Rx+) ต่อกับขา 5 (Tx+) ไขว้กันอย่างในรูป

คำสั่งบน Linux
- โค้ด: เลือกทั้งหมด
# dmesg
TE110P: Setting up global serial parameters for E1 FALC V1.2
TE110P: Successfully initialized serial bus for card
Found a Wildcard: Digium Wildcard TE110P T1/E1
- โค้ด: เลือกทั้งหมด
# dahdi_scan
[1]
active=yes
alarms=UNCONFIGURED
description=Digium Wildcard TE110P T1/E1 Card 0
name=WCT1/0
manufacturer=Digium
devicetype=Digium Wildcard TE110P T1/E1
location=PCI Bus 02 Slot 03
basechan=1
totchans=31
irq=209
type=digital-E1
syncsrc=0
lbo=0 db (CSU)/0-133 feet (DSX-1)
coding_opts=HDB3
framing_opts=CCS,CRC4
coding=
framing=
การ์ดยังไม่ได้คอนฟิกครับ ผลของคำสั่ง dahdi_scan เลยเป็นแบบข้างบน
1. ทำให้ Elastix รู้จักการ์ด
1.1 หน้าเว็บ "Hardware Detector" ของ Elastix
เข้าหน้าเว็บ Hardware Detector ครั้งแรก(อาจ)จะมองไม่เห็นการ์ดและพอร์ตนะครับ ต้องกดปุ่ม "Detect New Hardware" ครั้งนึงก่อน ถึงจะมองเห็นการ์ด ดังรูป

พอร์ตยังไม่เป็นสีเขียวเพราะว่า Physical Port ของการ์ดยังไม่ Sync ถ้ามาดูที่ตัวการ์ดจะเห็นไฟสีแดงติดกระพริบ ไฟนี้เป็นไฟ Alarm นะครับ และสีแดงที่เราเห็นเรียกว่า "Red Alarm"

ถ้าอยากให้มันหาย Alarm และยังไม่ได้เตรียมอุปกรณ์ E1 หรือสาย E1 จากตู้สาขาหรือชุมสายโทรศัพท์ ก็ให้เสียบสาย Loop เข้าไปที่พอร์ตก่อนนะครับ เพื่อให้มันหาย Alarm เราจะได้ทำอย่างอื่นไปก่อน ตามรูปนะครับ

รอสักพักไฟ Alarm จะเปลี่ยนเป็นสีเขียว กลับมากดปุ่ม Deatect New Hardware ในหน้าเว็บใหม่ครับ ก็จะเห็นพอร์ตเปลี่ยนเป็นสีเขียวแล้ว ดังรูป

1.2 เซ็ต Echo Canceller เป็นแบบ OSLEC
ที่หน้า Hardware Detector นะครับ คลิ๊กที่ "Configuration of Span" แล้วเลือก Echo Canceller เป็นแบบ OSLEC ตามรูป

2. คอนฟิกเพิ่มเติม
2.1 เพิ่มบรรทัดต่อไปนี้ในไฟล์ /etc/dahdi/genconf_parameters
context_lines from-zaptel
ใส่ไว้บรรทัดไหนก็ได้ในไฟล์ ถ้าขาดบรรทัดนี้ไปมีบรรทัดนี้แต่ไม่ใช่แบบนี้ จะทำให้เวลาเรากดปุ่ม "Detect New Hardware" ในหน้าเว็บ Hardware Detector ค่าคอนฟิกของการ์ด E1 มันจะเป็น context=from-pstn ซึ่งจะทำให้โทรเข้าไม่ได้ (แต่ยังโทรออกได้อยู่)
3. คำสั่งบน CentOS และ Asterisk เอาไว้ตรวจสอบการ์ด
- โค้ด: เลือกทั้งหมด
# dahdi_cfg -v
DAHDI Tools Version - 2.3.0
DAHDI Version: 2.3.0.1
Echo Canceller(s): OSLEC
Configuration
======================
SPAN 1: CCS/HDB3 Build-out: 0 db (CSU)/0-133 feet (DSX-1)
31 channels to configure.
Setting echocan for channel 1 to oslec
Setting echocan for channel 2 to oslec
Setting echocan for channel 3 to oslec
Setting echocan for channel 4 to oslec
Setting echocan for channel 5 to oslec
Setting echocan for channel 6 to oslec
Setting echocan for channel 7 to oslec
Setting echocan for channel 8 to oslec
Setting echocan for channel 9 to oslec
Setting echocan for channel 10 to oslec
Setting echocan for channel 11 to oslec
Setting echocan for channel 12 to oslec
Setting echocan for channel 13 to oslec
Setting echocan for channel 14 to oslec
Setting echocan for channel 15 to oslec
Setting echocan for channel 16 to none
Setting echocan for channel 17 to oslec
Setting echocan for channel 18 to oslec
Setting echocan for channel 19 to oslec
Setting echocan for channel 20 to oslec
Setting echocan for channel 21 to oslec
Setting echocan for channel 22 to oslec
Setting echocan for channel 23 to oslec
Setting echocan for channel 24 to oslec
Setting echocan for channel 25 to oslec
Setting echocan for channel 26 to oslec
Setting echocan for channel 27 to oslec
Setting echocan for channel 28 to oslec
Setting echocan for channel 29 to oslec
Setting echocan for channel 30 to oslec
Setting echocan for channel 31 to oslec
- โค้ด: เลือกทั้งหมด
# dahdi_hardware
pci:0000:02:02.0 wcte11xp+ e159:0001 Digium Wildcard TE110P T1/E1 Board
- โค้ด: เลือกทั้งหมด
# dahdi_scan
[1]
active=yes
alarms=OK
description=Digium Wildcard TE110P T1/E1 Card 0
name=WCT1/0
manufacturer=Digium
devicetype=Digium Wildcard TE110P T1/E1
location=PCI Bus 02 Slot 03
basechan=1
totchans=31
irq=209
type=digital-E1
syncsrc=0
lbo=0 db (CSU)/0-133 feet (DSX-1)
coding_opts=HDB3
framing_opts=CCS,CRC4
coding=HDB3
framing=CCS
สังเกตุบรรทัด Alarm นะครับ ปกติจะเป็น Alarm=OK แต่ถ้าสาย E1 หลุดหรืออุปกรณ์ที่ต่ออยู่มีปัญหา บรรทัดนี้จะกลายเป็น Alarm=RED
- โค้ด: เลือกทั้งหมด
# dahdi_test
Opened pseudo dahdi interface, measuring accuracy...
99.996% 99.995% 99.987% 99.994% 99.994% 99.994% 99.993% 99.994%
99.994% 99.993% 99.994% 99.995% 99.995% 99.994% 99.994% 99.995%
99.994% 99.994% 99.994% 99.995% 99.994% 99.994% 99.994% 99.994%
99.994%
--- Results after 25 passes ---
Best: 99.996 -- Worst: 99.987 -- Average: 99.993901, Difference: 99.993901
# dahdi_tool


ถ้าพอร์ต E1 มีปัญหาการเชื่อมต่อก็จะมี Read Alarm โชว์แบบนี้ครับ

- โค้ด: เลือกทั้งหมด
elastix-a*CLI> dahdi show status
Description Alarms IRQ bpviol CRC4 Fra Codi Options LBO
Digium Wildcard TE110P T1/E1 Card 0 OK 61 0 0 CCS HDB3 CRC4 0 db (CSU)/0-133 feet (DSX-1)
- โค้ด: เลือกทั้งหมด
elastix-a*CLI> dahdi show channels
Chan Extension Context Language MOH Interpret Blocked State
pseudo default default In Service
1 from-zaptel default In Service
2 from-zaptel default In Service
3 from-zaptel default In Service
4 from-zaptel default In Service
5 from-zaptel default In Service
6 from-zaptel default In Service
7 from-zaptel default In Service
8 from-zaptel default In Service
9 from-zaptel default In Service
10 from-zaptel default In Service
11 from-zaptel default In Service
12 from-zaptel default In Service
13 from-zaptel default In Service
14 from-zaptel default In Service
15 from-zaptel default In Service
17 from-zaptel default In Service
18 from-zaptel default In Service
19 from-zaptel default In Service
20 from-zaptel default In Service
21 from-zaptel default In Service
22 from-zaptel default In Service
23 from-zaptel default In Service
24 from-zaptel default In Service
25 from-zaptel default In Service
26 from-zaptel default In Service
27 from-zaptel default In Service
28 from-zaptel default In Service
29 from-zaptel default In Service
30 from-zaptel default In Service
31 from-zaptel default In Service
จะไม่โชว์ Channel 0 และ 16 นะครับ เพราะว่า Channel 0 เอาไว้ทำ Synchronization และ Channel 16 เป็น Signaling หรือที่เราเรียกว่า D-Channel ซึ่งทั้งสอง Channel นี้เราเอามาใช้งานไม่ได้ ที่เราเห็นจะเป็น Channel 1 - 31 รวม 30 Channels เราเอามาใช้งานได้ทั้งหมดครับ
- โค้ด: เลือกทั้งหมด
elastix-a*CLI> dahdi show channel 1
Channel: 1
File Descriptor: 21
Span: 1
Extension:
Dialing: no
Context: from-zaptel
Caller ID:
Calling TON: 0
Caller ID name:
Mailbox: none
Destroy: 0
InAlarm: 1
Signalling Type: ISDN PRI
Radio: 0
Owner: <None>
Real: <None>
Callwait: <None>
Threeway: <None>
Confno: -1
Propagated Conference: -1
Real in conference: 0
DSP: no
Busy Detection: yes
Busy Count: 3
Busy Pattern: 500,500
TDD: no
Relax DTMF: no
Dialing/CallwaitCAS: 0/0
Default law: alaw
Fax Handled: no
Pulse phone: no
DND: no
Echo Cancellation:
128 taps
(unless TDM bridged) currently OFF
Wait for dialtone: 0ms
PRI Flags:
PRI Logical Span: Implicit
Hookstate (FXS only): Onhook
3. Alarm messages บน Asterisk Console
ถ้าเราเห็นข้อความดังต่อไปนี้ใน Asterisk Log File หรือไม่ก็ Asterisk Console
3.1 D-Channel Up/Down
== Primary D-Channel on span 1 down
== Primary D-Channel on span 1 up
== Primary D-Channel on span 1 down
== Primary D-Channel on span 1 up
== Primary D-Channel on span 1 down
== Primary D-Channel on span 1 up
มันบอกเราว่า ISDN Layer 2 ไม่อัพครับ สาเหตุจากคอนฟิก Clocking/Signaling ไม่แม๊ตซ์กับอุปกรณ์ที่เอามาต่อด้วย โทรแจ้งผู้เกี่ยวข้องได้เลย
4. ไฟล์คอนฟิกที่เกี่ยวข้อง
ต่อไปนี้เป็นไฟล์คอนฟิกที่เกี่ยวข้องกับการ์ดนะครับ บางไฟล์ก็แก้ไขได้ บางไฟล์ก็ห้ามแก้ไข (เพราะว่า Elastix จะเขียนข้อมูลทับ)
4.1 /etc/dahdi/system.conf
ไฟล์นี้เขาห้ามแก้ไขนะครับ แต่จริงๆเราจะแก้ไขก็ได้ แต่ก็จำไว้ว่าถ้ามีการรันคำสั่ง dahdi_genconf ภายหลัง ค่าคอนฟิกที่แก้ไขมันก็จะเปลี่ยนกลับเป็นค่าดีฟอลท์
# Span 1: WCT1/0 "Digium Wildcard TE110P T1/E1 Card 0" (MASTER)
span=1,1,0,ccs,hdb3,crc4
# termtype: te
bchan=1-15,17-31
dchan=16
echocanceller=oslec,1-15,17-31
# Global data
loadzone = us
defaultzone = us
4.2 /etc/dahdi/genconf_parameters
ไฟล์นี้แก้ไขได้ ใส่พารามิเตอร์ที่ต้องการให้เอาไปใช้งาน โดยเฉพาะเวลาที่เรากดปุ่ม "Detect New Hardware" ในหน้าเว็บ "Hardware Detector"
[/code]
context_lines from-zaptel
echo_can oslec
bri_sig_style bri
[/code]
4.3 /etc/asterisk/chan_dahdi.conf
ไฟล์นี้แก้ไขได้
- โค้ด: เลือกทั้งหมด
[trunkgroups]
[channels]
context=from-zaptel
signalling=fxs_ks
rxwink=300 ; Atlas seems to use long (250ms) winks
usecallerid=yes
hidecallerid=no
callwaiting=yes
usecallingpres=yes
callwaitingcallerid=yes
threewaycalling=yes
transfer=yes
canpark=yes
cancallforward=yes
callreturn=yes
echocancel=yes
echocancelwhenbridged=no
faxdetect=incoming
echotraining=800
rxgain=0.0
txgain=0.0
callgroup=1
pickupgroup=1
;Uncomment these lines if you have problems with the disconection of your analog lines
busydetect=yes
busycount=3
busypattern=500,500
immediate=no
#include dahdi-channels.conf
#include chan_dahdi_additional.conf
5. ต่อสาย E1 เข้ากับอุปกรณ์ E1 อื่นๆที่จะทดสอบ
เช่นต่อกับ E1 ของตู้สาขาหรือชุมสายโทรศัพท์ ใช้สาย Lan ธรรมดาๆนี่แหล่ะครับ เข้าหัวแบบนี้
1 (Rx-) --- 1 (Rx-)
2 (Rx+) --- 2 (Rx+)
3 (Tx+) --- 3 (Tx+)
4 (Tx-) --- 4 (TX-)
แต่ถ้าเอาไปต่อกับพอร์ต E1 ของ VoIP Gateway เช่น Cisco, Quintum, E1 Card เครื่องอื่น หรือ E1 พอร์ตอื่นบนเครื่องเดียวกัน ต้องไขว้สายนะครับ แบบนี้
1 (Rx-) --- 4 (Tx-)
2 (Rx+) --- 5 (Tx+)
4 (Tx-) --- 1 (Rx-)
5 (Tx+) --- 2 (Rx+)
ถ้าเข้าสายได้แบบนี้ จะเอาด้านไหนต่อเข้าการ์ด TE110P ก็เวอร์คหมดครับ ถ้าสายถูกต้องและอุปกรณ์ปลายทางคอนฟิกแล้ว ไฟด้านหลังการ์ดจะเปลี่ยนจากสีแดง (Red Alarm) เป็นสีเขียว (Normal)
6. คอนฟิก Elastix ให้โทรออกทางพอร์ต E1
6.1 คอนฟิก Trunks
"PBX" -> "Trunks" -> "Add ZAP Trunk (DAHDI compatible mode)"

ช่อง Zap Identifer (trunk name) ใส่หมายเลข Channels (ดูหมายเลขจากหน้าเว็บ Hardware Detector ซึ่งมีตั้งแต่ 1 จนถึง 31 จะใส่ 0 หรือ 16 ไม่ได้นะครับ ห้าม) ถ้าต้องการโทรออกโดยไม่ระบุ Channel ซึ่งหมายความว่าให้ Asterisk เลือก Channel ที่ว่างอยู่ให้เอง ก็ระบุเป็นหมายเลข Group แทนครับ ดูหมายเลข Group ได้จากไฟล์ /etc/asterisk/dahdi-channels.conf ตามนี้
; Span 1: WCT1/0 "Digium Wildcard TE110P T1/E1 Card 0" (MASTER) HDB3/CCS/CRC4 RED
group=0,11
context=from-zaptel
switchtype = euroisdn
signalling = pri_cpe
channel => 1-15,17-31
context = default
group = 63
ดูอันที่เป็นการ์ด TE110P และดูหมายเลข Group ที่บรรทัด group บรรทัดแรกนะครับ ซึ่งในตัวอย่างที่ผมก๊อบมาให้ดูมีตัวเลข 0 และ 11 อยู่ ซึ่งหมายความว่าสำหรับการ์ดนี้จะระบุหมายเลข Group เป็น 0 หรือ 11 ก็ได้ แต่เวลาเอาไปใส่ในช่อง Zap Identifer จะใส่ตัวเลขอย่างเดียวไม่ได้นะครับ เพราะเดี๋ยว Asterisk จะเข้าใจว่าเป็นหมายเลข Channel แล้วก็จะโทรออกแต่ Channel นั้นอย่างเดียว
วิธีระบุหมายเลข Group เราต้องใส่ตัวอักษรนำหน้าหมายเลข Group เช่น G0, g0, R0 หรือไม่ก็ r0 ซึ่งจะใช้ G หรือ g หรือ R หรือ r นั้นก็อยู่ที่ว่าจะให้ Asterisk เลือก Channel ใน Group ยังไง ตามนี้ครับ
G เลือก channel มากที่สุดก่อน
g เลือก channel น้่อยที่สุดก่อน
R เลือกแบบ round-robin โดยเริ่มจาก channel ที่มากที่สุดก่อน
r เลือกแบบ round-robin โดยเริ่มจาก channel ที่น้อยที่สุดก่อน
ซึ่ง Channel ที่ใช้งานได้สำหรับการ์ด TE110P และในเครื่องใส่แค่การ์ดเดียวก็คือ 1-15 และ 17-31 ครับ รวม 30 channels หรือ 30 timeslots พอดี
6.2 คอนฟิก Outbound Routes
ผมกำหนดว่าจากเบอร์ Extension ใน Elastix ให้กด 0 โทรออกทางพอร์ต E1
"PBX" -> "Outbound Route" -> "Add Route"

ช่อง "Trunk sequence" เลือก "ZAP/G0" ที่สร้างไว้
5.3 ทดสอบโทรออก
จาก Softphone ผมกด 029009000 นี่เป็นข้อความใน Asterisk Console ครับ
- โค้ด: เลือกทั้งหมด
-- Executing [029009000@from-internal:1] Macro("SIP/200-00000042", "user-callerid,SKIPTTL,") in new stack
-- Executing [s@macro-user-callerid:1] Set("SIP/200-00000042", "AMPUSER=200") in new stack
-- Executing [s@macro-user-callerid:2] GotoIf("SIP/200-00000042", "0?report") in new stack
-- Executing [s@macro-user-callerid:3] ExecIf("SIP/200-00000042", "1?Set(REALCALLERIDNUM=200)") in new stack
-- Executing [s@macro-user-callerid:4] Set("SIP/200-00000042", "AMPUSER=200") in new stack
-- Executing [s@macro-user-callerid:5] Set("SIP/200-00000042", "AMPUSERCIDNAME=bkk") in new stack
-- Executing [s@macro-user-callerid:6] GotoIf("SIP/200-00000042", "0?report") in new stack
-- Executing [s@macro-user-callerid:7] Set("SIP/200-00000042", "AMPUSERCID=200") in new stack
-- Executing [s@macro-user-callerid:8] Set("SIP/200-00000042", "CALLERID(all)="bkk" <200>") in new stack
-- Executing [s@macro-user-callerid:9] ExecIf("SIP/200-00000042", "0?Set(CHANNEL(language)=)") in new stack
-- Executing [s@macro-user-callerid:10] GotoIf("SIP/200-00000042", "1?continue") in new stack
-- Goto (macro-user-callerid,s,19)
-- Executing [s@macro-user-callerid:19] NoOp("SIP/200-00000042", "Using CallerID "bkk" <200>") in new stack
-- Executing [029009000@from-internal:2] Set("SIP/200-00000042", "_NODEST=") in new stack
-- Executing [029009000@from-internal:3] Macro("SIP/200-00000042", "record-enable,200,OUT,") in new stack
-- Executing [s@macro-record-enable:1] GotoIf("SIP/200-00000042", "1?check") in new stack
-- Goto (macro-record-enable,s,4)
-- Executing [s@macro-record-enable:4] ExecIf("SIP/200-00000042", "0?MacroExit()") in new stack
-- Executing [s@macro-record-enable:5] GotoIf("SIP/200-00000042", "0?Group:OUT") in new stack
-- Goto (macro-record-enable,s,15)
-- Executing [s@macro-record-enable:15] GotoIf("SIP/200-00000042", "0?IN") in new stack
-- Executing [s@macro-record-enable:16] ExecIf("SIP/200-00000042", "1?MacroExit()") in new stack
-- Executing [029009000@from-internal:4] Macro("SIP/200-00000042", "dialout-trunk,5,029009000,,") in new stack
-- Executing [s@macro-dialout-trunk:1] Set("SIP/200-00000042", "DIAL_TRUNK=5") in new stack
-- Executing [s@macro-dialout-trunk:2] GosubIf("SIP/200-00000042", "0?sub-pincheck,s,1") in new stack
-- Executing [s@macro-dialout-trunk:3] GotoIf("SIP/200-00000042", "0?disabletrunk,1") in new stack
-- Executing [s@macro-dialout-trunk:4] Set("SIP/200-00000042", "DIAL_NUMBER=029009000") in new stack
-- Executing [s@macro-dialout-trunk:5] Set("SIP/200-00000042", "DIAL_TRUNK_OPTIONS=tr") in new stack
-- Executing [s@macro-dialout-trunk:6] Set("SIP/200-00000042", "OUTBOUND_GROUP=OUT_5") in new stack
-- Executing [s@macro-dialout-trunk:7] GotoIf("SIP/200-00000042", "0?nomax") in new stack
-- Executing [s@macro-dialout-trunk:8] GotoIf("SIP/200-00000042", "0?chanfull") in new stack
-- Executing [s@macro-dialout-trunk:9] GotoIf("SIP/200-00000042", "0?skipoutcid") in new stack
-- Executing [s@macro-dialout-trunk:10] Set("SIP/200-00000042", "DIAL_TRUNK_OPTIONS=") in new stack
-- Executing [s@macro-dialout-trunk:11] Macro("SIP/200-00000042", "outbound-callerid,5") in new stack
-- Executing [s@macro-outbound-callerid:1] ExecIf("SIP/200-00000042", "0?Set(CALLERPRES()=)") in new stack
-- Executing [s@macro-outbound-callerid:2] ExecIf("SIP/200-00000042", "0?Set(REALCALLERIDNUM=200)") in new stack
-- Executing [s@macro-outbound-callerid:3] GotoIf("SIP/200-00000042", "1?normcid") in new stack
-- Goto (macro-outbound-callerid,s,6)
-- Executing [s@macro-outbound-callerid:6] Set("SIP/200-00000042", "USEROUTCID="bkk" <200>") in new stack
-- Executing [s@macro-outbound-callerid:7] Set("SIP/200-00000042", "EMERGENCYCID=") in new stack
-- Executing [s@macro-outbound-callerid:8] Set("SIP/200-00000042", "TRUNKOUTCID=") in new stack
-- Executing [s@macro-outbound-callerid:9] GotoIf("SIP/200-00000042", "1?trunkcid") in new stack
-- Goto (macro-outbound-callerid,s,12)
-- Executing [s@macro-outbound-callerid:12] ExecIf("SIP/200-00000042", "0?Set(CALLERID(all)=)") in new stack
-- Executing [s@macro-outbound-callerid:13] ExecIf("SIP/200-00000042", "1?Set(CALLERID(all)=bkk <200>)") in new stack
-- Executing [s@macro-outbound-callerid:14] ExecIf("SIP/200-00000042", "0?Set(CALLERID(all)=)") in new stack
-- Executing [s@macro-outbound-callerid:15] ExecIf("SIP/200-00000042", "0?Set(CALLERPRES()=prohib_passed_screen)") in new stack
-- Executing [s@macro-dialout-trunk:12] ExecIf("SIP/200-00000042", "1?AGI(fixlocalprefix)") in new stack
-- Launched AGI Script /var/lib/asterisk/agi-bin/fixlocalprefix
== fixlocalprefix: Dialpattern X. matched. 029009000 -> 029009000
-- <SIP/200-00000042>AGI Script fixlocalprefix completed, returning 0
-- Executing [s@macro-dialout-trunk:13] Set("SIP/200-00000042", "OUTNUM=029009000") in new stack
-- Executing [s@macro-dialout-trunk:14] Set("SIP/200-00000042", "custom=DAHDI/G0") in new stack
-- Executing [s@macro-dialout-trunk:15] ExecIf("SIP/200-00000042", "0?Set(DIAL_TRUNK_OPTIONS=M(setmusic^))") in new stack
-- Executing [s@macro-dialout-trunk:16] Macro("SIP/200-00000042", "dialout-trunk-predial-hook,") in new stack
-- Executing [s@macro-dialout-trunk-predial-hook:1] MacroExit("SIP/200-00000042", "") in new stack
-- Executing [s@macro-dialout-trunk:17] GotoIf("SIP/200-00000042", "0?bypass,1") in new stack
-- Executing [s@macro-dialout-trunk:18] GotoIf("SIP/200-00000042", "0?customtrunk") in new stack
-- Executing [s@macro-dialout-trunk:19] Dial("SIP/200-00000042", "DAHDI/G0/029009000,300,") in new stack
-- Requested transfer capability: 0x00 - SPEECH
-- Called G0/029009000
-- DAHDI/31-1 is proceeding passing it to SIP/200-00000042
-- DAHDI/31-1 is making progress passing it to SIP/200-00000042
-- DAHDI/31-1 is making progress passing it to SIP/200-00000042
-- DAHDI/31-1 answered SIP/200-00000042
วางสาย
-- Executing [h@macro-dialout-trunk:1] Macro("SIP/200-00000042", "hangupcall,") in new stack
-- Executing [s@macro-hangupcall:1] GotoIf("SIP/200-00000042", "1?noautomon") in new stack
-- Goto (macro-hangupcall,s,3)
-- Executing [s@macro-hangupcall:3] NoOp("SIP/200-00000042", "TOUCH_MONITOR_OUTPUT=") in new stack
-- Executing [s@macro-hangupcall:4] GotoIf("SIP/200-00000042", "1?noautomon2") in new stack
-- Goto (macro-hangupcall,s,6)
-- Executing [s@macro-hangupcall:6] NoOp("SIP/200-00000042", "MONITOR_FILENAME=") in new stack
-- Executing [s@macro-hangupcall:7] GotoIf("SIP/200-00000042", "1?skiprg") in new stack
-- Goto (macro-hangupcall,s,10)
-- Executing [s@macro-hangupcall:10] GotoIf("SIP/200-00000042", "1?skipblkvm") in new stack
-- Goto (macro-hangupcall,s,13)
-- Executing [s@macro-hangupcall:13] GotoIf("SIP/200-00000042", "1?theend") in new stack
-- Goto (macro-hangupcall,s,15)
-- Executing [s@macro-hangupcall:15] Hangup("SIP/200-00000042", "") in new stack
== Spawn extension (macro-hangupcall, s, 15) exited non-zero on 'SIP/200-00000042' in macro 'hangupcall'
-- Hungup 'DAHDI/31-1'
== Spawn extension (macro-dialout-trunk, s, 19) exited non-zero on 'SIP/200-00000042' in macro 'dialout-trunk'
== Spawn extension (from-internal, 029009000, 4) exited non-zero on 'SIP/200-00000042'
ก็เป็นอันว่าโทรออกทางพอร์ต E1 ได้ครับ
7. คอนฟิก Elastix ให้รับสายเข้าทางพอร์ต E1
มาคอนฟิกพอร์ต E1 ให้รับสายโทรเข้า สมมติว่าผมต่อสาย E1 กับชุมสายโทรศัพท์ ได้เบอร์ DID มา 100 เบอร์ ตั้งแต่เบอร์ 023456700 - 99 ในจำนวน 100 เบอร์นี้ (แต่ E1 ใช้ได้แค่ 30 แชนแนล) ผมจะให้ 023456700 เป็นเบอร์โทรเข้า ให้โทรเข้าได้ 5 สายพร้อมกัน และให้ใช้ E1 แชนแนลเริ่มจากหลังสุด ก็คอนฟิกแบบนี้ครับ
7.1 เช็คไฟล์ /etc/asterisk/dahdi-channels.conf
ว่ามีบรรทัด context=from-zaptel หรือยัง อันนี้สำคัญนะครับสำหรับการคอนฟิกการ์ดใน Elastix ไม่อย่างนั้นจะโทรไม่เข้า
; Span 1: WCT1/0 "Digium Wildcard TE110P T1/E1 Card 0" (MASTER) HDB3/CCS/CRC4 RED
group=0,11
context=from-zaptel
7.2 คอนฟิก ZAP Channel DIDs
จะคอนฟิกให้ Asterisk Card ไม่ว่าจะเป็น Analog หรือ Digital ให้รับสายเข้าได้ ต้องมาคอนฟิกที่เมนูนี้ตลอดครับ
"PBX" -> "ZAP Channel DIDs"
ใส่ channel ที่ต้องการใช้งานและเบอร์โทรศัพท์ เนื่องจากใส่ได้ทีละ channel และใส่เป็น group ไม่ได้ เราก็ต้องทำทีละแชนแนลครับ จนครบ 5 แชนแนล

...

จะเริ่มจาก channel ไหนก็ไม่ผิดกติกาครับ แต่ขอให้มีจำนวนแชนแนลครบ
7.3 สร้าง Inbound Routes
สร้างไว้รับเบอร์ 023456700 ที่จะมีคนโทรเข้ามา เพราะเราต้องโอนสายคนที่โทรเข้ามาไปยังบริการที่เราจัดเตรียมไว้ให้ เช่น IVR, Groups เป็นต้น แต่กรณีของผมจะเอาไว้เป็นเบอร์ Hotline ครับคือโทรเข้ามาแล้วให้มาดังที่เบอร์ Extension 200 ของผมเลย
[http://www.voip4share.com/images/shared/e1-did-incoming.png[/img]
6.4 ทดสอบโทรเข้า
ผมโทรจากเบอร์ 0851619439 เข้ามาที่ E1 นี้ก็จะวิ่งเข้ามาที่เบอร์ Extension 200 เลยครับ อันนี้เป็นข้อความบน Asterisk Console
- โค้ด: เลือกทั้งหมด
-- Accepting call from '0851619439' to '023456700' on channel 0/1, span 1
-- Executing [023456700@from-zaptel:1] Set("DAHDI/1-1", "DID=023456700") in new stack
-- Executing [023456700@from-zaptel:2] Goto("DAHDI/1-1", "s,1") in new stack
-- Goto (from-zaptel,s,1)
-- Executing [s@from-zaptel:1] NoOp("DAHDI/1-1", "Entering from-zaptel with DID == 023456700") in new stack
-- Executing [s@from-zaptel:2] Ringing("DAHDI/1-1", "") in new stack
-- Executing [s@from-zaptel:3] Set("DAHDI/1-1", "DID=023456700") in new stack
-- Executing [s@from-zaptel:4] NoOp("DAHDI/1-1", "DID is now 023456700") in new stack
-- Executing [s@from-zaptel:5] GotoIf("DAHDI/1-1", "1?zapok:notzap") in new stack
-- Goto (from-zaptel,s,8)
-- Executing [s@from-zaptel:8] NoOp("DAHDI/1-1", "Is a Zaptel Channel") in new stack
-- Executing [s@from-zaptel:9] Set("DAHDI/1-1", "CHAN=1-1") in new stack
-- Executing [s@from-zaptel:10] Set("DAHDI/1-1", "CHAN=1") in new stack
-- Executing [s@from-zaptel:11] Macro("DAHDI/1-1", "from-zaptel-1,023456700,1") in new stack
-- Executing [s@macro-from-zaptel-1:1] NoOp("DAHDI/1-1", "Entering macro-from-zaptel-1 with DID = 023456700 and setting to: 023456789") in new stack
-- Executing [s@macro-from-zaptel-1:2] Set("DAHDI/1-1", "__FROM_DID=023456789") in new stack
-- Executing [s@macro-from-zaptel-1:3] Goto("DAHDI/1-1", "from-trunk,023456789,1") in new stack
-- Goto (from-trunk,023456789,1)
== Channel 'DAHDI/1-1' jumping out of macro 'from-zaptel-1'
-- Executing [023456789@from-trunk:1] Set("DAHDI/1-1", "__FROM_DID=023456789") in new stack
-- Executing [023456789@from-trunk:2] Gosub("DAHDI/1-1", "app-blacklist-check,s,1") in new stack
-- Executing [s@app-blacklist-check:1] GotoIf("DAHDI/1-1", "0?blacklisted") in new stack
-- Executing [s@app-blacklist-check:2] Set("DAHDI/1-1", "CALLED_BLACKLIST=1") in new stack
-- Executing [s@app-blacklist-check:3] Return("DAHDI/1-1", "") in new stack
-- Executing [023456789@from-trunk:3] ExecIf("DAHDI/1-1", "1 ?Set(CALLERID(name)=0851619439)") in new stack
-- Executing [023456789@from-trunk:4] Set("DAHDI/1-1", "__CALLINGPRES_SV=allowed_not_screened") in new stack
-- Executing [023456789@from-trunk:5] Set("DAHDI/1-1", "CALLERPRES()=allowed_not_screened") in new stack
-- Executing [023456789@from-trunk:6] Goto("DAHDI/1-1", "from-did-direct,200,1") in new stack
-- Goto (from-did-direct,200,1)
-- Executing [200@from-did-direct:1] Macro("DAHDI/1-1", "exten-vm,novm,200") in new stack
-- Executing [s@macro-exten-vm:1] Macro("DAHDI/1-1", "user-callerid,") in new stack
-- Executing [s@macro-user-callerid:1] Set("DAHDI/1-1", "AMPUSER=0851619439") in new stack
-- Executing [s@macro-user-callerid:2] GotoIf("DAHDI/1-1", "0?report") in new stack
-- Executing [s@macro-user-callerid:3] ExecIf("DAHDI/1-1", "1?Set(REALCALLERIDNUM=0851619439)") in new stack
-- Executing [s@macro-user-callerid:4] Set("DAHDI/1-1", "AMPUSER=") in new stack
-- Executing [s@macro-user-callerid:5] Set("DAHDI/1-1", "AMPUSERCIDNAME=") in new stack
-- Executing [s@macro-user-callerid:6] GotoIf("DAHDI/1-1", "1?report") in new stack
-- Goto (macro-user-callerid,s,10)
-- Executing [s@macro-user-callerid:10] GotoIf("DAHDI/1-1", "0?continue") in new stack
-- Executing [s@macro-user-callerid:11] Set("DAHDI/1-1", "__TTL=64") in new stack
-- Executing [s@macro-user-callerid:12] GotoIf("DAHDI/1-1", "1?continue") in new stack
-- Goto (macro-user-callerid,s,19)
-- Executing [s@macro-user-callerid:19] NoOp("DAHDI/1-1", "Using CallerID "0851619439" <0851619439>") in new stack
-- Executing [s@macro-exten-vm:2] Set("DAHDI/1-1", "RingGroupMethod=none") in new stack
-- Executing [s@macro-exten-vm:3] Set("DAHDI/1-1", "VMBOX=novm") in new stack
-- Executing [s@macro-exten-vm:4] Set("DAHDI/1-1", "EXTTOCALL=200") in new stack
-- Executing [s@macro-exten-vm:5] Set("DAHDI/1-1", "CFUEXT=") in new stack
-- Executing [s@macro-exten-vm:6] Set("DAHDI/1-1", "CFBEXT=") in new stack
-- Executing [s@macro-exten-vm:7] Set("DAHDI/1-1", "RT=""") in new stack
-- Executing [s@macro-exten-vm:8] Macro("DAHDI/1-1", "record-enable,200,IN") in new stack
-- Executing [s@macro-record-enable:1] GotoIf("DAHDI/1-1", "1?check") in new stack
-- Goto (macro-record-enable,s,4)
-- Executing [s@macro-record-enable:4] ExecIf("DAHDI/1-1", "0?MacroExit()") in new stack
-- Executing [s@macro-record-enable:5] GotoIf("DAHDI/1-1", "0?Group:OUT") in new stack
-- Goto (macro-record-enable,s,15)
-- Executing [s@macro-record-enable:15] GotoIf("DAHDI/1-1", "1?IN") in new stack
-- Goto (macro-record-enable,s,20)
-- Executing [s@macro-record-enable:20] ExecIf("DAHDI/1-1", "1?MacroExit()") in new stack
-- Executing [s@macro-exten-vm:9] Macro("DAHDI/1-1", "dial,,tr,200") in new stack
-- Executing [s@macro-dial:1] GotoIf("DAHDI/1-1", "1?dial") in new stack
-- Goto (macro-dial,s,3)
-- Executing [s@macro-dial:3] AGI("DAHDI/1-1", "dialparties.agi") in new stack
-- Launched AGI Script /var/lib/asterisk/agi-bin/dialparties.agi
dialparties.agi: Starting New Dialparties.agi
dialparties.agi: Caller ID name is '0851619439' number is '0851619439'
dialparties.agi: Methodology of ring is 'none'
-- dialparties.agi: Added extension 200 to extension map
-- dialparties.agi: Extension 200 cf is disabled
-- dialparties.agi: Extension 200 do not disturb is disabled
dialparties.agi: EXTENSION_STATE: 0 (NOT_INUSE)
dialparties.agi: Extension 200 has ExtensionState: 0
-- dialparties.agi: Checking CW and CFB status for extension 200
-- dialparties.agi: dbset CALLTRACE/200 to 0851619439
-- dialparties.agi: Filtered ARG3: 200
-- <DAHDI/1-1>AGI Script dialparties.agi completed, returning 0
-- Executing [s@macro-dial:7] Dial("DAHDI/1-1", "SIP/200,,tr") in new stack
== Using SIP RTP TOS bits 184
== Using SIP RTP CoS mark 5
-- Called 200
-- SIP/200-00000047 is ringing
-- SIP/200-00000047 is ringing
-- SIP/200-00000047 answered DAHDI/1-1
-- Channel 0/1, span 1 got hangup request, cause 16
-- Executing [h@macro-dial:1] Macro("DAHDI/1-1", "hangupcall") in new stack
-- Executing [s@macro-hangupcall:1] GotoIf("DAHDI/1-1", "1?noautomon") in new stack
-- Goto (macro-hangupcall,s,3)
-- Executing [s@macro-hangupcall:3] NoOp("DAHDI/1-1", "TOUCH_MONITOR_OUTPUT=") in new stack
-- Executing [s@macro-hangupcall:4] GotoIf("DAHDI/1-1", "1?noautomon2") in new stack
-- Goto (macro-hangupcall,s,6)
-- Executing [s@macro-hangupcall:6] NoOp("DAHDI/1-1", "MONITOR_FILENAME=") in new stack
-- Executing [s@macro-hangupcall:7] GotoIf("DAHDI/1-1", "1?skiprg") in new stack
-- Goto (macro-hangupcall,s,10)
-- Executing [s@macro-hangupcall:10] GotoIf("DAHDI/1-1", "1?skipblkvm") in new stack
-- Goto (macro-hangupcall,s,13)
-- Executing [s@macro-hangupcall:13] GotoIf("DAHDI/1-1", "1?theend") in new stack
-- Goto (macro-hangupcall,s,15)
-- Executing [s@macro-hangupcall:15] Hangup("DAHDI/1-1", "") in new stack
== Spawn extension (macro-hangupcall, s, 15) exited non-zero on 'DAHDI/1-1' in macro 'hangupcall'
== Spawn extension (macro-dial, s, 7) exited non-zero on 'DAHDI/1-1' in macro 'dial'
== Spawn extension (macro-exten-vm, s, 9) exited non-zero on 'DAHDI/1-1' in macro 'exten-vm'
== Spawn extension (from-did-direct, 200, 1) exited non-zero on 'DAHDI/1-1'
-- Hungup 'DAHDI/1-1'
สังเกตุนะครับว่าตอนคอนฟิก Zap channel DIDs อุตส่าห์ตั้งไว้เป็นอย่างดีว่าใช้ Channel 27-31 แต่พอใช้จริงปรากฏว่าเป็น Channel 1 โดยสังเกตุจาก DAHDI/1-1 ที่เป็นแบบนี้ก็เพราะว่าในการใช้งานจริงนั้นเวลามีคนโทรเข้ามา ก่อนที่จะมาถึงพอร์ต E1 มันจะผ่านชุมสายโทรศัพท์มาก่อน ซึ่งที่ชุมสายเขาจะเลือก channel ของเขาที่ยังว่างอยู่ เราไปบังคับเขาไม่ได้ครับ ปกติเขาจะเลือก channel ลำดับล่างๆก่อน
จากคอนเซ็ปต์การเลือก channel ของชุมสาย เราเอามาใช้งานในการเลือก channel ในการโทรออกได้นะครับ (สมมติว่า E1 นี้ใช้ทั้งรับสายเข้าและโทรออก) เรารู้ว่าตอนโทรเข้าชุมสายจะเลือก channel แรกๆก่อน ดังนั้นตอนโทรออกเราก็เลือก channel บนๆก่อน มันก็จะไม่ชนกัน
ก็เป็นอันว่าบทความเกี่ยวกับการติดตั้งและใช้งานการ์ด E1 TE110P ก็มีเพียงเท่านี้ครับ
ขอบคุณ http://www.buyasteriskcard.com ที่เอื้อเฟื้อการ์ดมาให้ทดสอบครับ
บทความที่เกี่ยวข้อง
Elastix
วิธีการติดตั้ง Elastix 2.0
OSLEC - Line Echo Canceller สำหรับ Asterisk
ติดตั้งและใช้งานการ์ด X100P
เทคนิคการติดตั้งการ์ด 4 E1 TE405P บน Elastix
เทคนิคการแก้ปัญหา DTMF บนการ์ด Asterisk
เทคนิคการดีบัคพอร์ต E1 PRI ด้วยคำสั่ง pri
เทคนิคการติดตั้งและใช้งานการ์ด 2 E1 บน Elastix
