Tuesday, August 16, 2005

ลองเล่น VoIP

ช่วงนี้กำลังบ้า VoIP หลังจากที่ลองเล่น Asterisk ดู ความจริงสุดท้ายแล้วก็ไม่มีอะไรมากกว่าโทรไปโทรมา แต่ก่อนถึงสุดท้ายนั้นก็มีอะไรสนุกๆให้ลองเล่นเยอะเหมือนกัน

Protocol ที่ใช้กันอยู่ในการส่งเสียงไปๆมาๆของ VoIP ก็มีใหญ่ๆสองอัน คือ SIP กับ IAX ซึ่ง Asterisk สนับสนุนทั้งสองตัว แต่ผู้ให้บริิการ Service Provider ส่วนมากจะมีแต่ SIP ปัญหาของ SIP คือบางทีเล่นผ่าน NAT ไม่ได้ ต้องใช้ STUN Server มาช่วย เวลาตั้งค่า Softphone (โปรแกรมที่ทำตัวเป็นโทรศัพท์) ก็เลยต้องตั้งตรงช่อง STUN ด้วย และตรง SIP Proxy ก็ต้องบอกให้ใช้ STUN นี้ บางทีก็ใช้ได้ บางทีก็ไม่ได้ ยังงงๆอยู่ ส่วนมากถ้าใช้ไม่ได้ก็ไป reboot NAT ซะ ก็จะหาย

อ่านเจอว่า Yahoo Messenger Voice รุ่นใหม่ไม่นานมานี้ก็ใช้ SIP เหมือนกัน โดยใช้ Softphone ของ X-Ten และ Yahoo เพิ่งซื้อกิจการ DialPad ไป อีกหน่อยอาจจะมีบริการโทรหาเบอร์บ้านเหมือนกับ SkypeOut

Softphone

ตัวแรกที่เอามาลองเล่นคือ X-Lite ของ X-Ten มีให้ดาวน์โหลดสำหรับ Windows, Linux, Mac (ฟรี) สามารถใช้ได้กับ SIP Provider ทั่วไป พอดีอยากลองใช้ IAX กับ FreeWorldDialup ก็เลยต้องหาตัวอื่นมาลองอีกอัน ไปเจอ Virbiage Soft Phone (FireFly) มีหน้าตาพอดูได้ และใช้ได้กับ IAX และ SIP

Service Provider

อันแรกเลยที่สมัครเล่นดูคือ FreeWorldDialup ใช้โทรไปเบอร์ที่เสียเงินไม่ได้ แต่โทรได้แต่ระหว่างสมาชิกและหมายเลขโทรฟรีในอเมริกา อังกฤษ ฯลฯ และก็มีหมายเลขทดสอบให้โทรเล่นๆอีกสองสามอัน สมัครสมาิชิก FWD ไว้สองอัน ระหว่างหัดใช้ Asterisk ก็โทรไปโทรมาเล่น ทีแรกตั้งค่าให้ Asterisk ต่อเข้าไปแบบ SIP แต่มีปัญหาโทรเข้าไม่ได้ถ้าเล่นสองหมายเลขพร้อมกัน อาจจะเพราะอยู่หลัง NAT เดียวกัน (ในรูป) หรือปัญหาอะไรสักอย่าง ก็เลยเปลี่ยนไปใช้ SIP กับหมายเลขหนึ่ง และ IAX2 กับอีกหมายเลขหนึ่ง

ทีนี้เกิดอยากโทรกลับเมืองไทยดูบ้าง ก็ต้องหาผู้ให้บริการโทรเข้าเบอร์บ้าน (PSTN Termination Service) เจอหลายรายหลายราคา เยอะมากจนเลือกไม่ถูก ลองสมัครไปสองรายคือ sipphone.com กับ calldaddy.com ราคาโทรไปเมืองไทยประมาณนาทีละ 10c กับ 6-11c ตามลำดับ (ขึ้นกับว่าเป็นเบอร์บ้านหรือมือถือ กรุงเทพหรือต่างจังหวัด) ถูกกว่าที่ใช้ Brastel อยู่ที่ญี่ปุ่นเกินครึ่ง

พวกนี้ตอนสมัครไม่ต้องจ่ายตังค์ และจะได้เบอร์ account ในเครือข่ายนั้นๆมาเลย สมัครแล้วจะมีเบอร์ปลายทางให้ลองโทรเล่นๆ เพื่อทดสอบทำงาน เช่น Echo Test พูดอะไรไปมันจะ Echo กลับมา จะได้รู้ว่ามีหน่วงเวลา (Delay) แค่ไหน ถ้าใช้งานได้พอใจก็ค่อยจ่ายตังค์ซื้อเวลา (นาที) เอา

ตรงนี้วุ่นวายมาก เขาคงเคยโดนโกงมาเยอะ คือจ่ายไปแล้วบัตรโดนปฏิเสธบ้าง(sipphone) หรือว่าต้องรอให้เขาโทรกลับมายืนยันบ้าง(calldaddy) สมัครไปตั้งแต่วันเสาร์ ต้องเมล์ไปถามอีกสองสามวันกว่าจะได้เล่น (วันนี้=อังคาร) สรุปคือ sipphone เปลี่ยนไปจ่ายผ่าน PayPal แทน (ซึ่งก็ผ่านบัตรเครดิตใบเดิมนั่นแหละ) และ calldaddy เขาก็โทรมาคุยสองสามนาที

โทรไปเมืองไทยทั้งสองบริการ เสียงก็ใช้ได้เลยทีเดียว ดีพอๆกับ Brastel แต่ต้องลองหลายๆครั้งหลายๆเวลาก่อนถึงจะแน่ใจว่าดีจริง ตอนนี้มีปัญหาคือ sipphone โทรเข้าเบอร์บ้าน กทม ไม่ได้ในบางครั้ง (ใน Log บอกว่า circuit เต็ม) แต่โทรมือถือได้ และมันคิดราคาถูกกว่าราคาที่ประกาศบนเว็บ คือ บนเว็บบอกว่านาทีละ 10c แต่เมื่อเช้าโทรไป 15 นาที ยอดหายไปแค่ 75c เอง ประมาณครึ่งเดียว ราคาไม่อัพเดทหรือว่าคิดผิดหว่า

ส่วน calldaddy โทรได้ทั้งเบอร์บ้านและมือถือ ยังไม่เคยเจอวงจรเต็ม และที่สนุกมากคือ ใช้คำสั่งตั้ง Caller ID ใน Asterisk กำหนดหมายเลขตัวเราได้เอง ลองแกล้งตั้งเป็นเบอร์ญาติคนอื่น โทรกลับไปหลอก ผบ. สำเร็จมาแล้ว :) แต่เนื่องจากในญี่ปุ่นระบบนี้เคยมีคนใช้ก่ออาชญากรรม ก็เลยถูกบล็อค ตอนแรกใช้ calldaddy โทรเข้าเบอร์ในญี่ปุ่นไม่ได้เลย สักพักเขาก็เอา CallerID ออก โทรเข้าญี่ปุ่นได้ แต่ตอนนี้พอโทรไปเมืองไทยมันเลยขึ้น Private Call ตลอด หลอกเบอร์ไม่ได้แล้ว :( ตั้ง Caller ID เป็นอะไรก็ไม่มีผล

Asterisk

ในบ้านก็เลยตั้งชุมสายโดยใช้ Asterisk ควบคู่กับการ์ด Digium (ในรูป) ที่ซื้อมา ซึ่งมีช่อง FXO (Foreign eXchange Office) สองช่องสำหรับต่อกับสายจากชุมสาย และช่อง FXS (Foreign eXchange Station) ต่อเข้ากับเครื่องโทรศัพท์ในบ้าน

พอดีสายจากชุมสาย NTT จะวิ่งเข้า ADSL Modem ของ YahooBB แล้วจึงต่อออกมาที่เครื่องโทรศัพท์ ดังนั้นเวลาใช้เครื่องโทรศัพท์โทรไปไหน YahooBB มันจะดักเข้าใช้บริการ VoIP ของมันตลอด โทรไปมือถือตัวเองก็จะเห็นว่าโทรมาจากเบอร์ YahooBB คือ 050-... ไม่ใช่เบอร์ของ NTT

ในทางปฏิบัติตอนนี้สาย NTT คือเอาไว้รับเข้าอย่างเดียว เพราะโทรออกวิ่งเส้น YahooBB หมด ซึ่งก็ดีนะ เพราะค่าโทรมันถูกกว่า NTT

เลยเกิดไิอเดียว่าถ้าแยกสาย NTT ตรงทางเข้า ADSL Modem ออกมาต่อกับโทรศัพท์อีกเครื่องต่างหาก น่าจะทำให้โทรออกโดยใช้สาย NTT ได้ต่างหาก และใช้งานพร้อมๆกันกับสาย YahooBB แต่ถ้าแยกออกมาตรงๆแล้วต่อเข้ากับเครื่องโทรศัพท์เลย สัญญาน ADSL ที่วิ่งไป Modem อาจจะถูกรบกวนได้ ก็เลยไปซื้อ ADSL Splitter มาต่อก่อนตัวนึง (เหมือนที่เขาแนะนำให้ใช้กรณีต่อสายพ่วงเวลาใช้งาน ADSL ที่เมืองไทย)

แยกออกมาแล้วก็เลยได้สายจากชุมสายสองเส้น คือ

  1. เส้นที่วิ่งออกมาจาก ADSL Modem เวลาโทรออกเส้นนี้จะไปทาง YahooBB
  2. เส้นที่แยกออกมาก่อนเข้า ADSL Modem และผ่าน ADSL Splitter เวลาโทรออกเส้นนี้จะไปทาง NTT
กลายเป็นว่าโทรออกได้สองช่องสัญญาณพร้อมๆกัน เอาสองสายนี้ต่อเข้ากับช่อง FXO ทั้งสองของการ์ด Digium เหมือนในรูปข้างบน

ส่วนบน Asterisk ก็ตั้งค่าไฟล์ extensions.conf ไว้ว่า เมื่อยกหูเครื่องโทรศัพท์ (ที่ต่ออยู่กับช่อง FXS) ขึ้นมาแล้ว ให้ทำดังนี้

[homeline]
exten => s,1,Answer   
exten => s,2,Wait(.5)
exten => s,n,WaitExten(60,m(hui))
exten => s,n,Hangup

exten => _0.,1,Dial(Zap/4/${EXTEN:1})
exten => _#.,1,Dial(Zap/3/${EXTEN:1})

exten => _9.,1,Dial(SIP/${EXTEN:1}@calldaddy)

exten => _7.,1,Dial(SIP/${EXTEN:1}@proxy01.sipphone.com)
คือ เมื่อยกหูสาย FXS แล้วให้ ทำการรับสาย (Answer), รอ 0.5 วินาที Wait(.5) แล้วเปิดเพลง MP3 ให้ฟัง WaitExten(60,m(hui)) ระหว่างนั้นก็รอผู้ใช้กดปุ่ม 60 วินาที ถ้าไม่กดก็วางสายไปเลย (Hangup)

(รายการ s ของสาย FXS ปกติจะไม่ถูกเรียกใช้งาน คือยกหูเครื่องโทรศัพท์ที่ต่อกับช่อง FXS แล้วจะมีสัญญาณ ตึ้ด รอให้กดปุ่มเหมือนเครื่องโทรศัพท์ทั่วไป แต่นี่ต้องไปแก้ไฟล์ zapata.conf โดยเพิ่ม immediate=yes ลงไปเพื่อให้รับสายและเรียกใช้ s ทันที)

บรรทัดต่อๆมากำหนดว่า ถ้าผู้ใช้

  • กด 0 ตามด้วยตัวเลข ก็จะโทรออกผ่านช่อง Zap/4 (สาย YahooBB)
  • กด # ตามด้วยตัวเลข ก็จะโทรออกผ่านช่อง Zap/3 (สาย NTT)
  • กด 9 ตามด้วยตัวเลข ก็จะโทรออกผ่านบริการของ calldaddy
  • กด 7 ตามด้วยตัวเลข ก็จะโทรออกผ่านบริการของ sipphone
ซึ่งวิธีการโทรออกด้วย calldaddy, sipphone ต้องไปกำหนดละเอียดใน sip.conf ต่างหาก

เวลาโทรเข้ามาเบอร์บ้าน 050-... ก็จะไปดังที่ Zap/4 เหมือนกัน ซึ่งใส่เมนูเดียวกันนี้ไว้ ทำให้ตัด 7 โทรกลับเมืองไทยผ่าน sipphone ได้ ทำเมนูเพิ่มเปิดบริการบัตรโทรศัพท์ได้เลยนะเนี่ย

แต่เวลาโทรเข้าเบอร์ NTT มันจะดังทั้งสองช่องคือ Zap/3 และ Zap/4 พร้อมๆกัน มั่วไปหมด :(

Softphone บน PocketPC

ลองตั้ง Asterisk ให้เป็น SIP Server สำหรับให้ Softphone บนเครื่องคอมพิวเตอร์ในบ้านที่อยู่ใน LAN ต่อเข้ามา และเรียกใช้เมนูเหมือนข้างบนได้

การตั้งค่าบน Softphone ก็แค่เปลี่ยน SIP Server มาเป็น Local IP และบอกว่าไม่ต้องใช้ STUN Server

ที่สนุกหน่อยก็คือไปเจอโปรแกรม SJphone (ฟรี) สำหรับ PocketPC ก็เลยเอามาลองกับ PocketPC (TOSHIBA) โดยเสียบการ์ด WiFi (BUFFALO) เอาไว้ จะได้โทรศัพท์ออกนอกบ้านผ่าน WiFi ผ่าน Asterisk

เวลาเปิดโปรแกรมขึ้นมาก็เป็นแบบนี้ (ในรูปถ่ายข้างบนไม่ได้ใช้ skin นี้)

การทำงานของโปรแกรม มันอืดมากจนคิดว่าไม่น่าจะใช้งานได้ในทางปฏิบัติ ทั้งที่เครื่องก็ ARM 400MHz พอดีเป็นโปรแกรมรุ่นเก่าแล้ว ไม่รู้ว่ารุ่นใหม่จะดีขึ้นหรือเปล่า ไม่ได้ลองรุ่นใหม่เพราะว่ามันต้องการ PocketPC 2003 แต่ที่มีอยู่เป็น 2002

คุณภาพเสียงก็ดูเหมือนจะเป็น Half-Duplex คือ ในสภาวะปกติ เสียงจาก PokcetPC จะวิ่งไป SIP Server ได้ดีมาก ชัดแจ๋ว แต่เสียงจาก Server แทบจะไม่ดังออกมาทางลำโพงของ PocketPC เลย ต้องปิดไมค์ด้วย Mute ให้ PocketPC เลิกส่งข้อมูลจึงจะพอได้ยินเสียงออกมาบ้าง น่าจะมีปุ่ม Push-to-Talk ให้ใช้ ลองปรับไมค์ให้ไวน้อยลงหน่อยก็ช่วยได้ระดับหนึ่ง

อีกอย่าง PocketPC รุ่นนี้มีลำโพงอยู่มุมขวาล่าง ส่วนไมค์อยู่ตรงขอบด้านข้างมุมซ้ายบน เวลาพูดเป็นโทรศัพท์ก็ต้องหันหัวตีลังกาแนวทแยง ดูแล้วแปลกๆ

อื่นๆ

นอกจากต่อสายไปมาแล้ว Asterisk ยังมีลูกเล่นพวก VoiceMail ประชุมสาย ฯลฯ ให้ครบ เท่าที่ลองใช้ VoiceMail ดู มีคุณสมบัติครบเครื่องมาก เช่น เมื่อมีผู้มาฝากข้อความแล้ว ก็ส่งข้อความเป็น .wav ไปยังเมล์ที่กำหนดให้เลย หรือเมื่อโทรเข้ามาฟังข้อความ ก็จะมีเมนูว่าต้องการลบ ย้ายโฟลเดอร์ ฯลฯ ซับซ้อนจนงงไปเลย

หรือถ้าใส่โมดูลเพิ่มลงไป ก็จะตรวจจับสัญญาณเสียงแฟกซ์ และรับแฟกซ์ส่งไปทางเมล์ให้โดยอัตโนมัติก็ได้ เดี๋ยวค่อยลองต่อ

สรุป: สนุกดี แต่คงไม่ค่อยได้ใช้เท่าไร เพราะตอนนี้คุยกับ ผบ. ที่เมืองไทยก็ใช้ MSN ชัดแจ๋วทั้งภาพและเสียง ที่ไปสมัครมา sipphone, calldaddy เอาไว้ใช้กับที่บ้านหรือเมื่อโทรจากนอกบ้านก็แล้วกัน

3 comments:

hamesut said...

ผมกำลังศึกษาเรื่อง asterisk อยู่เหมือนกันครับ กำลังงงๆอยู่ อาจจะต้องขอคำปรึกษาคุณหน่อยนะครับ

Av said...

exten => _0.,1,Dial(SIP/${EXTEN:1}
บรรทัดนี้อะครับผมใช้ 0 โทรออก

0123456789 แต่มันตัด 0 ผมออกตอนโทร
123456789 ทำไงให้มันส่ง 0 ที่กดไปด้วยครับ

Hui/ฮุ้ย said...

เปลี่ยน EXTEN:1 เป็น EXTEN:0 ครับ