มารู้จัก dtmf mode ใน Asterik กันดีกว่าครับ

Asterisk Opensource IP Pbx

มารู้จัก dtmf mode ใน Asterik กันดีกว่าครับ

โพสต์โดย voip4share » 21 ธ.ค. 2009 17:42

มารู้จัก DTMF Mode ใน Asterik กันดีกว่าครับ

asterisk-dtmf-mode.png
Asterisk DTMF Example
asterisk-dtmf-mode.png (18.64 KiB) เปิดดู 5582 ครั้ง

โปรโตคอล SIP บน Asterisk รองรับ DTMF อยู่ 3 แบบครับ ดังนี้

1. RFC2833 (มาตรฐาน RFC 2833)
2. SIP INFO (มาตรฐาน RFC 2976)
3. Inband

Note! เวลาเราคอนฟิกเบอร์ Extension จะมีให้เลือก dtmfmode ด้วยนะครับ ซึ่งเราจะต้องเลือกค่าให้มันตรงกับ dtmf ที่ตัวอุปกรณ์มันรองรับด้วย เน้นว่าต้องตรงกันครับ แต่ไม่จำเป็นต้องตรงกับเบอร์ปลายทางที่จะโทรไปเพราะว่า Asterisk สามารถแปลง DTMF จากแบบหนึ่งไปเป็นอีกแบบหนึ่งได้หน่ะครับ

DTMF Mode สำหรับ SIP

ในไฟล์ sip.conf มีให้คอนฟิกโหมดของ mode ด้วยนะครับ โดยจะคอนฟิกแบบ global หรือคอนฟิกใน trunk หรือคอนฟิกใน client (เบอร์ extensions) ก็ได้ บรรทัดคอนฟิกโหมด dtmf คือ

dtmfmode=

ซึ่งมีให้เลือก 4 แบบคือ auto, rfc2833, info และ inband โดยที่

inband
เมื่อเรากดปุ่มบนแป้นโทรศัพท์ อุปกรณ์ VoIP จะสร้าง DTMF tone และส่งมายัง Asterisk ถ้าโคเด็คไม่ใช่ G.711 alaw หรือ ulaw สัญญาณ DTMF Tone จะถูกบีบอัดและจะผิดเพี้ยนไปจากเดิมจนอาจทำให้ Asterisk ไม่สามารถแปลงออกมาได้ว่าเรากดปุ่มอะไร ถ้า gateway เซ็ต rfc2833 แต่ที่ asterisk เซ็ต inband เวลาเรากดปุ่ม dtmf ปลายทางจะไม่ได้ยินเสียงอะไร

rfc2833
เป็นการส่ง DTMF โดยระบุเป็น event และเข้ารหัสก่อนส่ง พอถึงปลายทางก็แปลงออกมา ปุ่มที่กดและการเข้ารหัส event สัมพันธ์กันดังนี้
ปุ่ม 0 - 9 ถูกเข้ารหัส event 0 - 9
ปุ่ม * ถูกเข้ารหัส event เป็น 10
ปุ่ม # เข้ารหัส event เป็น 11
ปุ่ม A-D เข้ารหัส event เป็น 12 - 15
ปุ่ม Flash เข้ารหัส event เป็น 16

info
จะส่ง DTMF เข้าไปใน SIP Info โดยระบุ Content-Type เป็น dtmf ดังตัวอย่าง

INFO sip:7007471000@example.com SIP/2.0
Via: SIP/2.0/UDP alice.uk.example.com:5060
From: <sip:7007471234@alice.uk.example.com>;tag=d3f423d
To: <sip:7007471000@example.com>;tag=8942
Call-ID: 312352@myphone
CSeq: 5 INFO
Content-Length: 24
Content-Type: application/dtmf-relay
Signal=5
Duration=160

เป็นการบอกว่ามีการกดปุ่มเลข 5 เป็นระยะเวลา 160 ms ส่ง DTMF มาโดยใช้ Content-Type เป็น application/dtmf-relay

INFO sip:7007471000@example.com SIP/2.0
Via: SIP/2.0/UDP alice.uk.example.com:5060
From: <sip:7007471234@alice.uk.example.com>;tag=d3f423d
To: <sip:7007471000@example.com>;tag=8942
Call-ID: 312352@myphone
CSeq: 5 INFO
Content-Length: 1
Content-Type: application/dtmf
5

ส่ง DTMF 5 โดยใช้ Content-Type เป็น application/dtmf


auto
จะใช้ rfc2833 ก่อน แต่ถ้าปลายทางไม่บ่งบอกว่ามันรองรับ rfc2833 ก็จะเปลี่ยนไปใช้ inband แทน
voip4share
Administrator
 
โพสต์: 656
ลงทะเบียนเมื่อ: 18 พ.ย. 2009 11:26
ที่อยู่: รามคำแหง กรุงเทพฯ

Re: มารู้จัก dtmf mode ใน Asterik กันดีกว่าครับ

โพสต์โดย voip4share » 07 ม.ค. 2010 13:33

ต่อ...

RFC2833
เป็นวิธีการรับส่ง DTMF แบบ out-of-band ถ้ามีปัญหาการรับส่งแบบ RFC2833 กับอุปกรณ์อื่นๆ ในไฟล์ sip.conf ลองเซ็ต rfc2833compensate=Yes ดูครับอาจช่วยได้
RFC2833 นี้เป็นที่นิยมมาก สำหรับ Asterisk เวอร์ชั่น 1.4 ขึ้นไปควรใช้แบบนี้จะดีที่สุด

SIP INFO
เป็นวิธีการรับส่ง DTMF แบบ out-of-band ใช้ได้เฉพาะโปรโตคอล SIP เท่านั้น โดยการส่ง DTMF ด้วย SIP message แต่ไม่ค่อยนิยมใช้งาน
voip4share
Administrator
 
โพสต์: 656
ลงทะเบียนเมื่อ: 18 พ.ย. 2009 11:26
ที่อยู่: รามคำแหง กรุงเทพฯ

Re: มารู้จัก dtmf mode ใน Asterik กันดีกว่าครับ

โพสต์โดย voip4share » 07 ม.ค. 2010 13:47

ต่อ...

ระยะเวลาการส่ง DTMF ไม่แน่นอน
เมื่อเรากดปุ่มตัวเลขบนแป้นโทรศัพท์ไม่ว่าจะเป็นโทรศัพท์บ้านหรือว่าโทรศัพท์มือถือก็ตาม ใน Asterisk นั้นนะครับเราไม่สามารถกำหนดระยะเวลาการส่ง DTMF ได้หากเราใช้ DTMF แบบ SIP INFO หรือ RFC2833 (ก่อน Asterisk เวอร์ชั่น 1.4) หมายความว่า สมมติว่าเราส่ง DTMF โดยกดปุ่มเลข 5 ไว้นาน 30 วินาที ก็ไม่ได้หมายความว่ามันจะส่ง DTMF 5 นาน 30 วินาที อาจจะส่งแค่ 500 ms ก็เป็นได้

Inband
Inband หมายความว่าส่ง DTMF ไปในช่องสัญญาณเสียงที่กำลังพูดคุยกัน ส่ง DTMF เหมือนกับเสียงพูด ปลายทางก็ได้ยินเสียงกดปุ่ม ปี๊ด ว่ากันว่าวิธีการส่ง DTMF แบบนี้ไม่ค่อยชัวร์ถ้าต้องส่งผ่านโคเด็คแบบที่มีการบีบอัดสัญญาณ เช่น G.729, G.723.1, GSM เป็นต้น โคเด็คจะต้องเป็นแบบไม่มีการบีบสัญญาณซึ่งก็มีแค่ G.711 ulaw, alaw เท่านั้นจึงจะส่งผ่านได้ชัวร์ ว่ากันว่าเสียงผู้หญิงมักทำให้เกิดความเข้าใจผิดคิดว่าเป็นการกด DTMF สำหรับในคู่สายแบบอนาล๊อกจะรับส่ง DTMF แบบ Inband เท่านั้น

การเปลี่ยน DTMF duration เมื่อโทรออกทาง ZAP Trunks
เราสามารถเพิ่มหรือลดระยะเวลาที่ Asterisk ส่ง DTMF ออกไปทาง ZAP Trunk ได้นะครับ ค่าดีฟอลท์คือ 300 ms ซึ่งถือว่าสั้นเกินไป แก้ไขที่ไฟล์ zaptel.conf บรรทัดนี้
toneduration=300
เพิ่มค่าให้เยอะขึ้นถ้ามีปัญหาไม่สามารถกด DTMF ผ่าน ZAP Trunk ได้

การดีเท็คการกด DTMF
สำหรับ DAHDI/Zaptel
ปรับค่า relaxdtmf= ในไฟล์ zapapa.conf (เช่นเปลี่ยนเป็น No) ถ้ามีปัญหาว่าระบบมักจะเข้าใจผิดว่าเสียงพูดเป็น DTMF

สำหรับ mISDN v2
ตอนโหลดโมดูล mISDN_dsp ให้รันบรรทัดต่อไปนี้ด้วย
modprobe mISDN_dsp dtmfthreshold=100
แก้ตัวเลข 100 ให้เป็นค่าที่ต้องการ

หมายเหตุ สำหรับ Asterisk เวอร์ชั่น 1.4 มีบรรทัด relaxdtmf= อยู่ในไฟล์ sip.conf แล้วรับ

การเปลี่ยนความถี่ของ DTMF tone ใน Asterisk
การป้องกันไม่ให้สร้าง DTMF ขึ้นมาใหม่จาก DTMF ที่รับเข้ามา
เมื่อ Asterisk กำลังรับคอลและกำลังรอรับอะไรบางอย่างจากคอลนั้น เช่น รอรับให้กดเบอร์ต่อ เท่ากับว่าตอนนี้ Asterisk กำลังรอรับ DTMF อยู่ มันจะตรวจจับแล้วสร้าง DTMF ขึ้นมาใหม่ พฤติกรรมธรรมชาติแบบนี้อาจทำให้เกิดปัญหาในการใช้งานก็ได้
ถ้าเราใช้งาน Asterisk เป็นสะพานเชื่อมต่อกับระบบที่สื่อสารกันด้วยการแลกเปลี่ยน DTMF tone (ยกตัวอย่างเช่นระบบแจ้งเตือนทางไกลซึ่งจะส่งหมายเลขแจ้งเตือนมาในรูปแบบ DTMF ส่วนมากเป็นระบบเก่าๆที่แจ้งเตือนทางโทรศัพท์ ซึ่งเวอร์คดีถ้าส่งไปทางสายโทรศัพท์ แต่เมื่อเอามาส่งผ่าน Asterisk เข้าโครงข่ายไอพีแทนก็อาจจะเกิดปัญหาขึ้นมา) Asterisk จะขัดจังหวะการส่ง DTMF โดยการรับเข้ามา เก็บไว้ในบัฟเฟอร์ แล้วสร้าง DTMF ที่รับได้ขึ้นมาใหม่ พฤติกรรมแบบนี้อาจทำให้เกิดปัญหา โดยเฉพาะอย่างยิ่งถ้าระบบนั้นมีการตรวจสอบ distinct DTMF-silence cadences ด้วย และโดยการสร้าง tone เหล่านั้นขึ้นมาใหม่ มันเป็นเอ๊าท์พุตพร้อมกับ Asterisk's signal-silence cadences
เพื่อหลีกเลี่ยงพฤติกรรมนี้ของ Asterisk สิ่งที่เราทำได้คือการเปลี่ยนความถี่ของ DTMF tone ที่ Asterisk จะตรวจพบแล้วรู้ว่านี่คือ DTMF นะ เมื่อ Asterisk ไม่รู้ว่ามันคือ DTMF ดังนั้น DTMF จริงๆก็จะไม่ถูกเปลี่ยนแปลง ระบบก็จะได้ DTMF ของจริง
voip4share
Administrator
 
โพสต์: 656
ลงทะเบียนเมื่อ: 18 พ.ย. 2009 11:26
ที่อยู่: รามคำแหง กรุงเทพฯ


ย้อนกลับไปยัง Asterisk SIP Server

ผู้ใช้งานขณะนี้

กำลังดูบอร์ดนี้: Google [Bot] และ บุคคลทั่วไป 2 ท่าน

cron