电脑蓝牙打电话-总结(二、InTheHand的C#库)

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库。

此调用库的公开代码为:GitHub - inthehand/32feet: Personal Area Networking for .NET

该类库支持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音乐等部分功能包含进去时,再决定是否要启用它。


上一篇:电脑蓝牙打电话-总结(一、win自带功能)

下一篇:电脑蓝牙打电话-总结(三、千月Bluesoleil)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,你需要在你的项目中添加`InTheHand.Net.Personal.dll`的引用。 然后,在你的按钮点击事件中,可以使用`BluetoothClient`类来连接蓝牙设备并接收数据。以下是一个简单的示例代码: ```csharp using InTheHand.Net.Bluetooth; using InTheHand.Net.Sockets; private void btnConnect_Click(object sender, EventArgs e) { BluetoothClient client = new BluetoothClient(); BluetoothDeviceInfo[] devices = client.DiscoverDevicesInRange(); // 选择要连接的蓝牙设备 BluetoothDeviceInfo device = devices.FirstOrDefault(d => d.DeviceName == "JDY-31"); if (device != null) { // 连接蓝牙设备 BluetoothClient client = new BluetoothClient(); client.Connect(device.DeviceAddress, BluetoothService.SerialPort); // 获取蓝牙设备的数据流 Stream stream = client.GetStream(); byte[] buffer = new byte[1024]; // 不断接收数据 while (true) { int bytesRead = stream.Read(buffer, 0, buffer.Length); string message = Encoding.ASCII.GetString(buffer, 0, bytesRead); // 处理接收到的数据 // ... } } else { MessageBox.Show("未找到蓝牙设备!"); } } ``` 在上面的示例代码中,我们使用了`BluetoothClient`类的`DiscoverDevicesInRange`方法来搜索附近的蓝牙设备。然后根据设备名称选择要连接的设备,并使用`Connect`方法建立连接。接着,我们获取蓝牙设备的数据流,并使用`Read`方法不断接收数据。最后,你可以在接收到数据时进行处理。请注意,这个代码示例并没有进行异常处理和线程安全处理,请根据具体情况进行改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值