หลายวันก่อนผมได้มีโอกาสไป Implement งาน IP PBX ที่มหาวิทยาลัยที่หนึ่งในเมืองไทย และได้มีโอกาสไปแก้ไขปัญหาเรื่องของระบบ Network ที่มีการเปลี่ยนแปลงใหม่ ทำให้มีผลกระทบต่อระบบโทรศัพท์ไอพีของคณะต่าง ๆ ภายในมหาวิทยาลัย ซึ่งไม่สามารถโทรข้ามคณะกันได้ เลยต้องหันมาใช้วิธีการทำ SIP Trunk ผ่านทาง CUBE (Cisco Unified Border Element) ไปที่ตู้โทรศัพท์ของศูนย์คอมพิวเตอร์แทนแบบเดิมที่ได้ให้ Cisco CallManager ทำการทำ SIP Trunk ตรงไปยังตู้ Siemens Hybrid PBX ของมหาวิทยาลัย เลยเป็นที่มาในการเขียนบทความนี้เพื่อให้หลาย ๆ คนที่ประสบปัญหาเดียวกัน หรือกำลังหาโซลูชั่นในการเชื่อมต่อลักษณะเดียวกันนี้นั่นเอง
ขออนุญาตเกริ่นนำเพื่อให้มีไอเดียเบื้องต้นกันก่อนนะครับ หลายคนที่ทำงานเกี่ยวกับโทรศัพท์ หรือตู้สาขามาคงเคยเจอความต้องการของลูกค้าที่อยากจะให้เบอร์โทรศัพท์ภายใน ถูกส่งออกไปเปลี่ยนเป็นเบอร์ภายนอกหมายเลขต่าง ๆ ซึ่งอาจจะส่งไปยังผู้ให้บริการโทรศัพท์พื้นฐานบ้าง หรือผู้ให้บริการ SIP Trunk บ้างก็เป็นไปได้ ทางผู้ให้บริการนั้น ๆ จะมี Format ในการรับ Digit ว่ามีกี่หลัก ซึ่งทางผู้ดูแลระบบจะต้องจัดการเขียน Voice translation rules แปลงออกไปนั่นเอง อุปกรณ์ที่มารองรับการทำงานในลักษณะนี้ก็คืออุปกรณ์ของ Cisco ซึ่งเป็น ISR Router โดยจะต้องใช้ Voice Bundle IOS Firmware (แนะนำว่าเป็น Router ตั้งแต่รุ่น 2800, 2900 Series เป็นต้นไปและใช้ DRAM 512 MB/Flash 128 MB เป็นอย่างน้อย) และหากต้องทำ SIP Trunk เพื่อเป็น Bridge เชื่อมระหว่างตู้สาขาไอพีฝั่งเรา และฝั่งของ SIP Trunk Provider ก็ต้องซื้อ CUBE License (Cisco Unified Border Element) เพิ่มเติมด้วย
เอาหล่ะเกริ่นกันมาพอหอมปากหอมคอ เอกสารนี้จะอธิบายถึงการทำ Voice translation rules หรือ กฎเกณฑ์ในการแปลงเลขหมายการโทร เช่นเมื่อผู้ใช้งานโทรศัพท์ทำการกดหมายเลขใด ๆ มา เข้ามายังอุปกรณ์ที่มีการเขียน Voice Syntax นี้ไว้จะทำการ Match ว่าจะเปลี่ยนไปเป็นเลขหมายใดนั่นเอง ซึ่งถ้ามองที่เราเตอร์ก็จะคล้าย ๆ กับการทำ NAT (Network Address Translation) แปลงหมายเลขไอพีจาก Private IP (ไอพีภายใน หรือคนทั่ว ๆ ไปนิยมเรียกว่าไอพีปลอม) เป็น Public IP (ไอพีจริง หรือคนทั่ว ๆ ไปนิยมเรียกว่าไอพีจริง) ส่วนการทำ Voice translation rules ก็จะมี Syntax ที่เหมือนกับการทำ Regular Expression โดยมีวิธีเขียนดังนี้
rule precedence /match pattern/ /replacement pattern/
Note: / — / เป็นการเขียนกำหนดตัวเลขต่าง ๆ แปลงจาก pattern อะไร แล้วให้เปลี่ยนไปเป็น pattern อะไร ผมจะยกตัวอย่างเพื่อสามารถทำความเข้าใจไปเลย และจะมีผลลัพธ์ในการทำ test translation-rule บนตัว ISR Router ให้ไปด้วยเลยนะครับ
ตัวอย่างที่ 1 ทำการเขียน pattern แทนค่า ตัวเลข “123” ด้วย “456”
voice translation-rule 1
rule 1 /123/ /456/
ตัวอย่างของผลลัพธ์การใช้คำสั่ง test voice translation-rule ในตัวอย่างที่ 1
router#test voice translation-rule 1 123
Matched with rule 1
Original number: 123 Translated number: 456
router#test voice translation-rule 1 1234
Matched with rule 1
Original number: 1234 Translated number: 4564
router#test voice translation-rule 1 6123
Matched with rule 1
Original number: 6123 Translated number: 6456
router#test voice translation-rule 1 6123123
Matched with rule 1
Original number: 6123123 Translated number: 6456123
Original number type: none Translated number type: none
Original number plan: none Translated number plan: none
ในเคสนี้มันจะทำการแปลงให้ใน 3 digit แรกเท่านั้นนะครับ ที่ทำการ Match เข้ากับเลข 123
ตัวอย่างที่ 2 ทำการเขียน pattern ที่ขึ้นต้นด้วยเลข “123” แทนค่าด้วยตัวเลข “456” ซึ่งการเขียน rule เราจะใช้สัญลักษณ์เป็นรูป ^ ตามด้วยตัวเลขที่ต้องการ
voice translation-rule 1
rule 1 /^123/ /456/
ตัวอย่างของผลลัพธ์การใช้คำสั่ง test voice translation-rule ในตัวอย่างที่ 2
router#test voice translation-rule 1 123
Matched with rule 1
Original number: 123 Translated number: 456
router#test voice translation-rule 1 1234
Matched with rule 1
Original number: 1234 Translated number: 4564
router#test voice translation-rule 1 6123
6123 Didn’t match with any of rules
ตัวอย่างที่ 3 หากเราต้องการที่จะ Match เฉพาะหมายเลขที่ขึ้นต้น และลงท้าย ให้เราทำการใส่เครื่องหมาย ^ ไว้หน้าหมายเลขนั้น และลงท้ายหมายเลขนั้นด้วยเครื่องหมาย $
voice translation-rule 1
rule 1 /^123$/ /456/
router#test voice translation-rule 1 123
Matched with rule 1
Original number: 123 Translated number: 456
router#test voice translation-rule 1 1234
1234 Didn’t match with any of rules
router#test voice translation-rule 1 6123
6123 Didn’t match with any of rules
Pattern Match with Wildcards
ตัวอย่างด้านบนเป็นพื้นฐานของการเขียน voice translation rule แต่การใช้งานจริงเราสามารถเขียนได้เพิ่มเติมโดยใช้รูปแบบของ Wildcard หรือรูปแบบ ดังตารางด้านล่างนี้
ตัวอย่างที่ 1 สำหรับการใช้ Wildcard โดยทำการเขียน pattern ที่มีหมายเลขขึ้นต้นด้วย 40 (^40) และประกอบไปด้วยตัวเลข 5 Digit (40…) ไปเป็นหมายเลข “6666000”
voice translation-rule 1
rule 1 /^40…/ /6666000/
router#test voice translation-rule 1 40123
Matched with rule 1
Original number: 40123 Translated number: 6666000
ตัวอย่างที่ 2 ทำการเขียน pattern จาก digit ตัวเลข ตัวอักษรก็ไรก็ตาม และเป็นจำนวนเท่าไหร่ก็ได้หรือไม่มีเลยก็ได้ ให้ไปเป็นหมายเลข “5554000”
voice translation-rule 2
rule 1 /.*/ /5554000/
router#test voice translation-rule 2 123
Matched with rule 1
Original number: 123 Translated number: 5554000
router#test voice translation-rule 2 86573
Matched with rule 1
Original number: 86573 Translated number: 5554000
router#test voice translation-rule 2 “”
Matched with rule 1
Original number: Translated number: 5554000
ตัวอย่างที่ 3 ทำการเขียน pattern จาก digit ตัวเลข ตัวอักษรอะไรก็ตาม ยกเว้นไม่ได้ใส่ค่าอะไรมา (Null) ให้แทนค่าไปเป็นเลขหมาย “5554000”
voice translation-rule 2
rule 1 /.+/ /5554000/
router#test voice translation-rule 2 123
Matched with rule 1
Original number: 123 Translated number: 5554000
router#test voice translation-rule 2 “”
Didn’t match with any of rules
ตัวอย่างที่ 4 ทำการเขียน pattern จากตัวเลขที่ขึ้นต้นด้วย 0 (0, 00, 000, หรือไป 0 จำนวนเท่าไหร่ก็ตาม) ให้แทนค่าด้วย “909” ตามด้วย digit ที่เหลือ
voice translation-rule 4
rule 1 /^0+/ /909/
router#test voice translation-rule 4 0123456
Matched with rule 1
Original number: 0123456 Translated number: 909123456
router#test voice translation-rule 4 00123456
Matched with rule 1
Original number: 00123456 Translated number: 909123456
router#test voice translation-rule 4 000123456
Matched with rule 1
Original number: 000123456 Translated number: 909123456
router#test voice translation-rule 4 123456
123456 Didn’t match with any of rules
เราสามารถใช้การตัดเพิ่มเติมแต่งตัวเลขบางส่วนที่ส่งมา ไปเป็นอีกเลขโดยใช้ Number Slice ได้ โดยมีรูปแบบตามด้านล่างนี้
ตัวอย่างในการอธิบายการใช้งาน Number Slice นะครับ
/ (x\) y\ (z\) / /w\1\2/
โจทย์มี 3 ตัวอักขระคือ x, y, and z. เครื่องหมาย backward slash (\) ชี้ให้เห็นถึงตำแหน่งของตัวอักษรที่จะมาทำการแทนที่หรือเปลี่ยนแปลง เครื่องหมายวงเล็บ () จะบอกว่าเราต้องการที่จะใช้ตัวอักขระเดิมอยู่ในผลลัพธ์ด้วย. w จะเป็นตัว digit ที่ถูกเพิ่มเข้าไป
Set 1 จะแปลงเป็น expression x.
Set 2 จะแปลงเป็น expression z.
Expression y จะถูกเพิกเฉยหรือไม่นำมาเป็นผลลัพธ์ที่ได้ (Ignore)
ดังนั้นผลลัพธ์ที่ได้จะเป็น: wxz.
มาดูตัวอย่างจริงเมื่อเราเอาไปประยุกต์ใช้งานนะครับ
voice translation-rule 1
rule 1 /^\(12\)3\(45\)$/ /6\1\2/
Set 1: 12
Set 2: 45
Ignore: 3
router#test voice translation-rule 1 12345
Matched with rule 1
Original number: 12345 Translated number: 61245
อีกตัวอย่างหนึ่งนะครับ
rule 1 /^.*\(..\)/ /\1/
Rule นี้จะทำการแบ่งตัวเลขเป็น 2 กลุ่ม (2 Set) 1 set นำไปพิจารณา อีก 1 set จะทำการ Ignore
Ignored: ^.* None or more digits จากตัวเลขแรกสุด
Set 1: .. 2 digits
ทำการแทนที่ค่าเฉพาะ Set 1 rule นี้จะทำการ copy ตัวเลข 2 digit สุดท้ายที่ส่งมานั่นเอง
router#test voice translation-rule 9 12345
Matched with rule 1
Original number: 12345 Translated number: 45
router#test voice translation-rule 9 123456
Matched with rule 1
Original number: 123456 Translated number: 56