หน้า 1 จากทั้งหมด 1

การใช้งาน API บน Grandstream IP Phone

โพสต์โพสต์แล้ว: 07 พ.ย. 2019 12:25
โดย nuiz
บน IP Phone ของ Grandstream (รุ่นที่ผมทดสอบอยู่นี้คือ GXP1625 ครับ) มี API อยู่ด้วยนะครับ ซึ่ง API ย่อมาจากคำว่า Application Programming Interface ให้เราเขียนโปรแกรมไปเชื่อมต่อเพื่อสั่งงานหรือเพื่อเช็คสถานะของอุปกรณ์ครับ

API บน Grandstream IP Phone รุ่น GXP1625 ทำอะไรได้บ้าง
ทำได้หลายอย่างครับ เช่น โทรออก รับสาย รีบู๊ตเครื่อง รายงานสถานะเครื่อง รายงานสถานะของแต่ละ Line

ต้องส่งอะไรไปยัง IP Phone เพื่อเชื่อมต่อกับ API
เราจะสั่งงงาน API บน Grandstream IP Phone โดยส่ง URL ไปครับ ก็เหมือนกับที่เราใช้ Web Browser เปิดหน้าเว็บ IP Phone เพื่อที่จะคอนฟิกมันนั่นแหล่ะครับ ปกติเราก็พิมพ์บน URL บน Web Browser แบบนี้ http://192.168.100.121 แค่นี้ แต่พอเราจะสั่งงานมันผ่าน API เราต้องพิมพ์เยอกว่านั้นครับ เป็นแบบนี้

โค้ด: เลือกทั้งหมด
http://192.168.100.121/cgi-bin/function?passcode=admin&param=value


โดยที่ passcode เป็น password ที่ใช้ล๊อคอินเข้า IP Phone ครับ เช่น admin ส่วน param=value นั้นคือชื่อพารามิเตอร์และค่าที่เราต้องใส่เข้าไปเพื่อสั่งงาน IP Phone ครับ

พอเราส่งคำสั่งไปยัง IP Phone แล้ว มันมี Response กลับมาด้วยนะครับ เราก็เอาค่าที่ Response กลับมานี้มาแสดงผลว่าสั่งงาน Success หรือ Fail ครับ และกรณีที่เราขอดู Status ก็เอาค่าที่ตอบกลับมานี้มาแสดงผลครับ

จะใช้งาน API ต้องคอนฟิกอะไรเพิ่มบน IP Phone
บน GXP1625 ที่ผมทดสอบนี้ ฟีเจอร์ API เปิดโดยดีฟอลท์อยู่แล้ว

อธิบายตัวอย่างการส่งคำสั่งไปยัง IP Phone
ดูรูปแบบการส่งคำสั่งอีกทีครับ เป็นรูปแบบโดยทั่วไปครับ
โค้ด: เลือกทั้งหมด
http://192.168.100.121/cgi-bin/function?passcode=admin&param=value


ซึ่ง function ได้แก่
api-get_line_status เรียกดูสถานะของ IP Phone แต่ละ Line
api-get_phone_status เรียกดูสถานะของ IP Phone
api-phone_operation ส่งคำสั่งไปยัง IP Phonครับ เช่น hang up, answer call, reject call เป็นต้น
api-send_key ส่ง keys functions เช่น speaker, volume up/down, mute, hold, ตัวเลข 0-9,*,# เป็นต้น
api-sys_operation ส่งคำสั่ง reset, reboot เป็นต้น

ส่วน param=value จะมีหรือไม่มีก็ขึ้นอยู่กับว่า function อะไรครับ บาง function ต้องส่ง parameter และ value ไปด้วย บาง function ก็ไม่ต้องส่ง ยกตัวอย่างครับ

เรียกดูสถานะ Line ของ IP Phone
เปิด Web Browser แล้วพิมพ์ประมาณนี้
โค้ด: เลือกทั้งหมด
http://192.168.100.121/cgi-bin/api-get_line_status?passcode=admin

บนหน้า Web Browser จะได้แบบนี้ครับ ฟอร์ตแม็ต JSON เลย

- ไอพีโฟนอยู่เฉยๆ
โค้ด: เลือกทั้งหมด
{"response":"success", "body": [{"line": 1, "state": "idle", "acct": "1", "remotename": "", "remotenumber": "", "active": 0}, {"line": 2, "state": "idle", "acct": "1", "remotename": "", "remotenumber": "", "active": 0}]}


- ไอพีโฟนกำลังมีสายเรียกเข้า แต่ยังไม่รับสาย
โค้ด: เลือกทั้งหมด
{"response":"success", "body": [{"line": 1, "state": "ringing", "acct": "1", "remotename": "102", "remotenumber": "102", "active": 1}, {"line": 2, "state": "idle", "acct": "1", "remotename": "", "remotenumber": "", "active": 0}]}


- ยกหูรับสาย
โค้ด: เลือกทั้งหมด
{"response":"success", "body": [{"line": 1, "state": "connected", "acct": "1", "remotename": "102", "remotenumber": "102", "active": 1}, {"line": 2, "state": "idle", "acct": "1", "remotename": "", "remotenumber": "", "active": 0}]}


เรียกดูสถานะของ IP Phone
http://192.168.100.121/cgi-bin/api-get_ ... code=admin

ตอนอยู่เฉยๆ
{ "response": "success", "body": "available", "misc": "0" }

มีสายเรียกเข้า
{ "response": "success", "body": "ringing", "misc": "0" }

รับสาย
{ "response": "success", "body": "busy", "misc": "0" }

โทรออก (ทั้งปลายทางรับสายแล้วและยังไม่รับสาย)
{ "response": "success", "body": "busy", "misc": "0" }

การสั่งงาน IP Phone เกี่ยวกับการโทร
ต่อไปเป็นการสั่งงาน IP Phone ครับ แบ่งออกเป็น 3 ส่วนครับ ได้แก่

1. ด้าน Operation
มีรูปแบบคำสั่งดังนี้
โค้ด: เลือกทั้งหมด
http://192.168.100.121/cgi-bin/api-phone_operation?passcode=admin&cmd=OPERATION

ซึ่ง OPERATION ได้แก่
endcall
holdcall
acceptcall
rejectcall
cancel
ความหมายก็ตรงตามนั้นเลยครับ

ตัวอย่างครับ
สั่งให้ IP Phone รับสายสาย
http://192.168.100.121/cgi-bin/api-phon ... acceptcall

สั่งให้ IP Phone วางสาย
http://192.168.100.121/cgi-bin/api-phon ... md=endcall

2. การส่ง Keys ไปยัง IP Phone
เปรียบเสมือนกับที่เรากดปุ่มบน IP Phone นั่นแหล่ะครับ มีรูปแบบการส่งคำสั่งตามนี้
โค้ด: เลือกทั้งหมด
http://192.168.100.121/cgi-bin/api-send_key?passcode=admin&keys=KEY

ซึ่ง KEY ก็ได้แก่ (ต้องพิมพ์อักษรตัวใหญ่นะครับ)
SPEAKER กด/ปล่อยปุ่ม SPEAKER
XFER กดปุ่มโอนสาย
VUP กดปุ่มเร่ง Volume
VDOWN กดปุ่มลด Volume
MUTE กดปุ่มเปิด/ปิด Mic
HOLD กดปุ่ม Hold
0-9,*,# กดปุ่มตัวเลข
LINE[1-8] กดปุ่มระบุ Line
CONF กดปุ่มเปิด/ปิดการ Conference
VM กดปุ่ม Voice Mail
HEADSET กดปุ่มใช้งาน Headset
DND กดปุ่ม DND
SEND กดปุ่มโทรออก
SOFT[1-4] กดปุ่ม Softkeys
MPK[1-24] กดปุ่ม MPK
LEFT_SOFT_KEY กดปุ่ม Softkey ด้านซ้าย
RIGHT_SOFT_KEY กดปุ่ม Softkey ด้านขวา
STAR กดปุ่ม *
ONHOOK กดปุ่มตัดสาย มีคนโทรเข้ามา เรายังไม่รับสาย เราตัดสาย (ไม่ใช่การวางสาย)
OFFHOOK รับสาย
OK กดปุ่ม OK
LOCK กดปุ่มล๊อค Keypad
UNLOCK กดปุ่มปลดล๊อค Keypad
UP กดปุ่ม Up
DOWN กดปุ่ม Down
LEFT กดปุ่ม Left
RIGHT กดปุ่ม Right

ส่งคำสั่งไปกดปุ่ม SPEAKER ดูครับ
http://192.168.100.121/cgi-bin/api-send ... ys=SPEAKER
ข้อความที่ IP Phone ตอบกลับมา
{"response":"success", "body": "complete"}
ผลลัพธ์ ปุ่ม SPEAKER ถูกกด
ส่งคำสั่งเดิมอีกครั้งหนึ่ง ปุ่ม SPEAKER ถูกปล่อย

ส่งคำสั่งให้โทรไปยังเบอร์ 102 (ต้องใส่เครื่องหมาย : คั่นระหว่างตัวเลขแต่ละตัว และต้องตามด้วยคำสั่ง SEND ครับ)
โค้ด: เลือกทั้งหมด
http://192.168.100.121/cgi-bin/api-send_key?passcode=admin&keys=1:0:2
http://192.168.100.121/cgi-bin/api-send_key?passcode=admin&keys=SEND

คำสั่งแรกจะสั่งให้ IP Phon กดปุ่ม 1 0 และ 2 รอไว้ครับ ส่วนคำสั่งที่ 2 จะกดปุ่ม SEND หรือส่ง 2 คำสั่งทีเดียวเลยก็ได้ครับ แบบนี้
โค้ด: เลือกทั้งหมด
http://192.168.100.121/cgi-bin/api-send_key?passcode=admin&keys=1:0:2&keys=SEND


สั่งให้ Hold สาย ส่งอีกครั้งจะยกเลิก Hold
โค้ด: เลือกทั้งหมด
http://192.168.100.121/cgi-bin/api-send_key?passcode=admin&keys=HOLD

ส่งคำสั่งให้วางสาย
โค้ด: เลือกทั้งหมด
http://192.168.100.121/cgi-bin/api-phone_operation?passcode=admin&cmd=endcall

ขณะกำลังใช้สายอยู่ ลองส่งคำสั่ง XFER ไปยังเบอร์ 1234 ครับ จะเป็นยังไง (ผมต้องส่งคำสั่ง 3 ครั้งครับ ย่อคำสั่งก็ไม่รับ)
โค้ด: เลือกทั้งหมด
http://192.168.100.121/cgi-bin/api-send_key?passcode=admin&keys=XFER
http://192.168.100.121/cgi-bin/api-send_key?passcode=admin&keys=1:2:3:4
http://192.168.100.121/cgi-bin/api-send_key?passcode=admin&keys=SEND


3. คำสั่งประเภท System Operation
มี 2 คำสั่ง ได้แก่
REBOOT รีบู๊ตเครื่อง
RESET เซ็ต Factory Default

ส่งคำสั่งไปรีบู๊ตเครื่อง (ประมาณ 3 วินาทีเครื่องจะรีบู๊ต)
http://192.168.100.121/cgi-bin/api-sys_ ... est=REBOOT

ส่งคำสั่งให้ IP Phone ส่ง Register/Unregister ไปยัง SIP Server
หาไม่เจอครับ สงสัยจะไม่มี

ฝังปุ่มกดสั่งงาน API ไว้บนหน้าเว็บ
ทำเป็นปุ่มกดฝังไว้บนหน้าเว็บเลยครับ เป็นเว็บ CRM ก็ได้ ลองนำไปประยุกต์ใช้งานดูครับ

รวมเทคนิคการใช้งาน Elastix
รวมเทคนิคการใช้งาน Asterisk
รวมเทคนิคการใช้งาน Issabel
รวมเทคนิคการใช้งาน FreePBX
รวมเทคนิคการใช้งาน RasPBX - Asterisk on Raspberry Pi