计算机电话集成和主流电话


越来越多的现代通信正在融入我们周围的世界,并且办公室电话也不例外。 Grandstream决定跟上潮流,并增加了对手机特殊CTI(计算机-电话集成)接口的支持。 最初,更新了GXP21XX系列的设备,不久后更新了较年轻的GXP16XX系列的设备,例如GXP1610GXP1620等。


实际上,实际上是大声说“ CTI接口”-一个小的REST API,使您可以使用简单的HTTP请求来控制手机。 看起来:您可以发起呼叫,在PBX上跟踪电话使用的线路状态,但是例如在使用基于云的IP PBX时,这并不总是可能的。 除此之外,CTI还允许您控制免提电话,扬声器音量,使麦克风静音等,这在PBX级别上并不总是可能的。


那么我们可以用CTI做什么呢? 通常,不是很多,我们只有五种类型的请求:


索取内容描述
api-get_line_status线路状态
api-get_phone_status手机状态
api-send_key按一个键(0-9,#,*,上下文相关等)
api-phone_operation用手机进行最简单的操作(接听电话,重设电话等)
api-sys_operation允许您重启设备并将其重置为出厂设置

使用这个非常简单,我们形成以下形式的请求:


"http://IP  /cgi-bin/api-get_line_status?passcode=" // (     ) 

作为响应,我们得到以下形式的JSON:


 { "response": "success", "body": [ { "line": 1, "state": "idle", "acct": 1, "active": 0, "remotename": "", "remotenumber": "" }, { "line": 2, "state": "connected", "acct": 2, "active": 1, "remotename": "", "remotenumber": "203" }, { "line": 3, "state": "idle", "acct": 1, "active": 0, "remotename": "", "remotenumber": "" }, ... { "line": 8, "state": "idle", "acct": 1, "active": 0, "remotename": "", "remotenumber": "" } ] } 

在请求中将 api-get_line_status替换为api-get_phone_status ,我们在电话上获得了简要信息:


 { "response": "success", "body": "busy", "misc": "0" } 

当我们只需要询问设备或电话线的状态时,此方法很方便,而在要跟踪发生的更改的情况下,此方法非常不便。 接到电话后,我们将接听来电号码并向用户显示通知,但是该怎么做呢? 我们没有机会订阅任何活动,这不是一个明智的决定,它会每秒两次或三次通过状态请求来敲打电话。 不幸的是,在这种情况下,CTI并不是助手。


我们进一步看一下,顾名思义, api-send_key响应此请求以将击键发送到电话键,您可以一次发送一个,也可以一次发送多个。 实际上,以大约一秒钟的间隔开始按下传送的键,并且该过程不能中断。 同时,电话上的按键没有被锁住,可以自由按下,结果电话可执行文件变成了难以理解的“混乱”。


 "http://192.168.4.118/cgi-bin/api-send_key?passcode=admin&keys=LINE2:2:0:3:SEND" 

如您所见,已添加另一个参数,指示要按下的键。 (CTI文档中包含一个可以虚拟按下的所有键的列表的表。)


首先想到的是:“是否有可能为浏览器编写一个扩展程序,使您可以直接从中发起呼叫?” 最简单的选择很快就到了。 由于我拥有主要的Google Chrome浏览器,因此我为此编写了代码,因此只需要两个文件即可创建:


 // manifest.json { "manifest_version": 2, "name": "ArtDial", "version": "0.1", "permissions": ["contextMenus"], "background": { "scripts": ["background.js"] } } 

 // background.js function dial(selectedText) { var serviceCall = 'http://192.168.4.118/cgi-bin/api-send_key?passcode=admin&keys='+ selectedText.replace(/[^\d]/g, '').split('').join(':') +':SEND'; var xhr = new XMLHttpRequest(); xhr.open("GET", serviceCall, true); xhr.send(); } chrome.contextMenus.create({ title: ": %s", contexts: ["selection"], onclick: function(info, tab) { dial(info.selectionText); } }); 

我们将它们放在一个文件夹中,在扩展页面上,我们打开开发人员模式并连接我们的扩展。




为了管理呼叫,提供了api-phone_operation请求,通过该请求,我们可以接受或拒绝传入呼叫(acceptcall /拒绝呼叫),将其置于保持状态或结束当前对话(holdcall /结束呼叫)。 还可以使用更通用的取消命令,该命令允许您拒绝和结束呼叫。 要发送,请使用以下形式的请求:


 "http://192.168.4.118/cgi-bin/api-phone_operation?passcode=admin&cmd=cancel" 

最后一件事: api-sys_operation ,将使我们能够重新启动手机,或将其重置为出厂设置(分别为REBOOT和RESET)。 我们使用以下形式的查询:


 "http://192.168.4.118/cgi-bin/api-sys_operation?passcode=admin&request=REBOOT" 

仅使用计算机电话集成不可能创建能够与您的环境完全交互的滚动应用程序。 但是,作为与其他API(电话中的操作URL或Asterisk中的AMI)结合使用的附加工具,CTI有权存在。

Source: https://habr.com/ru/post/zh-CN404241/


All Articles