Windows电脑中通过蓝牙拨打电话

技术预研-总结(二、InTheHand的C#库)

由于上一篇中Windows自带的蓝牙功能有如下限制要求:

  1. 需要极高版本的Win10(19044.1288)才能正常的部署和使用;
  2. 调用内置UWP组件打电话和获取AT信令来主动识别通话状态这两种行为不能同时拥有;
  3. 常规的方法无法从内置的UWP组件中提取到通话中的蓝牙SCO语音

这些问题,制约了我们对项目的选型要求。抛开其它的不谈,就第一条“仅最新的Win10才能安装和使用”,正常的电脑用户都无法接收自己只是需要用一个软件,就要把所有的电脑都升级到Win10这种行为。甚至是重装到Win10后还不能用,还要在重装了Win10后还要在线升级到最新版才能用。很明显,没法玩,微软自己把自己的路给堵死了。

在这样的情况下,我们需要寻求一种既能够通过蓝牙AT指令去控制蓝牙拨打电话(其实拨打操作不重要,重要的是要能够实时获取通话过程中各阶段如振铃、已接通、已挂断等的状态),且在Win7、Win8、Win10等常规系统均能正常兼容,并且呼叫后,能够建立蓝牙SCO连接并获取通话语音的Windows方案。

搜索引擎中随便一搜,Windows蓝牙或C#蓝牙,各大社区的推荐中,排在首位很可能是InTheHand库。

该类库支持BT、BLE、NFC、IrDA等各种协议,并且支持超多类型的蓝牙芯片厂商,使用Windows自带的蓝牙驱动,发起连接后,通过发送AT信令,进行各种操作的控制和返回状态的获取。之所以选择C#库,是因为通常意义上来说,C#是微软的亲儿子,选型它会让上下兼容变得更加容易。但其实没有关系,事实上InTheHand库的本质就是【new Socket((AddressFamily) 0x20, 1, 3)】,通过套接字传入预设的地址簇和对应参数,建立流连接后,再进行对应格式的数据操作。

使用InTheHand库,可以正常进行拨打电话、接听来电等呼叫操作。可以进行短信的收发操作。可以进行文件传输等数据交换操作。

但是遗憾的是,在当前我们需求的项目中,InTheHand库所有的操作都是基于蓝牙协议栈中的l2cap之上的RFComm连接,无法操作SCO语音数据,甚至连SCO的连接/释放操作都无能为力。因此,使用该类库最多只能实现【在电脑中拨打目标手机号但语音接听必须要在手机中进行接听】的鸡肋方式,无法达到预期的【使用电脑的声音采集和播放设备进行通话】的效果。

由于微软自带的蓝牙驱动,包含有RFComm的驱动,以及用于传输SCO语音的媒体驱动。但在本次选型的InTheHand库中,却仅用上了其中的RFComm的驱动。最为郁闷的是,微软本身并未公开其对SCO语音媒体驱动的调用示例或调用方法(理论上其蓝牙驱动在win8、win10中正常挂载,其公开的示例,理论上也能在win8及以上版本中正常可用)。

总而言之,InTheHand库不包含蓝牙SCO语音操作相关部分逻辑代码,经过综合衡量后,暂停这个方向的预研,待某一天InTheHand库突然意识到这个问题,痛定思痛,决定并真正将SCO语音、A2DP音乐等部分功能包含进去时,再决定是否要启用它。