*** Asterisk มันจะดีเท็คสัญญาณ DTMF เฉพาะสายที่โทรเข้ามานะครับ ส่วนสายที่โทรออกไป ทางฝั่งปลายทางจะเป็นคนดีเท็ค ***
*** การ์ด Analog/Digital ไม่มี DTMFMODE=RFC2833 นะครับ หลายท่าน "เข้าใจผิด" ซึ่งการโทรเข้ามายัง Asterisk ผ่านทางการ์ด หรือการโทรออกจาก Asterisk ผ่านทางการ์ด ไม่ได้มี RTP เข้ามาเกี่ยวข้องเลยแม้แต่น้อย เพราะไม่ได้มีการส่งออกผ่านIP ในขณะที่ RFC2833 หรือ SIP INFO เป็นการรับส่ง DTMF ผ่านทาง RTP ***
*** การ detect สัญญาณ DTMF จะรวมถึงกรณีที่ Asterisk โทรออกไปหาปลายทางผ่านทางการ์ด ปลายทางรับสาย แล้วกดปุ่ม DTMF ส่งมา เราจะเห็นการใช้งานลักษณะนี้ได้จากบริการ Callback ครับ ***
*** ถ้า Asterisk ดีเท็คสัญญาณ DTMF ได้ชัวร์แล้ว การใช้งานอย่างอื่นก็จะไม่มีปัญหาเลยครับ ไม่ว่าจะเป็นกดฟัง IVR กด PIN กดเบอร์ปลายทาง หรือแม้กระทั่งส่งต่อไปยัง SIP Server ผ่านทาง IP ***
ผมมีวิธีตรวจสอบและแก้ปัญหาเรื่อง DTMF มาฝากครับ
1. เช็คบรรทัด relaxdtmf ในคอนฟิก
เช็คว่าค่า elaxdtmf ของพอร์ตที่เรากำลังใช้รับสายเข้ามา (เป็นพอร์ตที่ใช้โทรออกก็ได้นะครับ เซ็ตไว้เลย) มีค่าเป็น yes หรือ no ต้องเป็น "yes" ครับ
- โค้ด: เลือกทั้งหมด
asterisk -rx "dahdi show channel 1"
Channel: 1
File Descriptor: 21
Span: 1
Extension:
Dialing: no
Context: from-zaptel
Caller ID:
Calling TON: 1
Caller ID name:
Mailbox: none
Destroy: 0
InAlarm: 0
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: Call
PRI Logical Span: Implicit
Hookstate (FXS only): Onhook
ปรากฏว่าของผมเป็น relaxdtmf=no ครับ ต้องแก้ไขให้มันเป็น yes ด่วนเลย
2. แก้ไขบรรทัด relaxdtmf
เปิดไฟล์ /etc/asterisk/chan_dahdi.conf เพิ่มหรือแก้ไขบรรทัด relaxdtmf
relaxdtmf=yes
3. รีสตาร์ท Dahdi
- โค้ด: เลือกทั้งหมด
asterisk -rx "dahdi restart"
คำสั่งนี้จะรีสตาร์ทการ์ด Asterisk ทุกการ์ดที่มีติดตั้งในเครื่อง ดังนั้นสายจะหลุด แต่สายที่โทรผ่าน IP จะไม่หลุดครับ เพราะไม่เกี่ยวกัน
4. ตรวจสอบ
- โค้ด: เลือกทั้งหมด
asterisk -rx "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: 0
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: yes
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
บรรทัด relaxdtmf เปลี่ยนจาก no เป็น yes แล้วครับ
5. ลองโทรเข้าอีกทีครับ
คราวนี้น่าจะชัวร์แล้ว
*** ถ้าคอนฟิกในเครื่องของท่านเป็น relaxdtmf=yes อยู่แล้ว แต่มีปัญหาการดีเท็ค DTMF ก่อนอื่นเช็คให้ชัวร์ก่อนครับว่าใช่พอร์ตนี้แน่ๆ แล้วก็ลองเพิ่มค่า rxgain ดู ก็อยู่ในไฟล์ /etc/asterisk/chan_dahdi.conf นี่แหล่ะครับ ถ้าเพิ่มก็ยังไม่ดีขึ้น ก็ต้องลองโทรผ่านสายนี้ดูแล้วครับ ดูว่ามีเสียงซ่าๆ หรือมีเสียงสะท้อนหรือเปล่า อาจมีก็ได้นะครับ ***
บทความที่เกี่ยวข้อง
OSLEC - Line Echo Canceller สำหรับ Asterisk
ติดตั้งและใช้งานการ์ด X100P
ติดตั้งและใช้งานการ์ด E1 TE110P