มารู้จัก DTMF Mode ใน Asterik กันดีกว่าครับ
โปรโตคอล 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 แทน