admin管理员组

文章数量:1559721

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

技术预研-总结(五、玖云33e9cloud)

前面几个篇章中,对蓝牙打电话的能力进行一定深入的挖掘,但怎么总觉得越寻找越不靠谱。毕竟一会安装这个呼叫信令获取不到、一会安装那个声音质量又有问题、一会不想声音直接播放而希望提取声音出来进一步加工(就这么个简单需求还得装几个虚拟声卡来曲线救国),最重要的是,一个个都还是收费的,连虚拟声卡都单独收费。效果没达到、却一个个挖空心思去打广告、玩授权,真的是服了。

缓过劲来,我们不禁思考,为什么我要按微软的蓝牙框架的逻辑去搜索和实现这一块的功能呢?前面第一篇章我们讲过“Windows自带的蓝牙驱动,通常包括用于传输信令、含有RFComm的驱动,以及用于传输SCO语音的媒体驱动”,但事实上真的如此?我们真的需要这么多繁复冗杂的驱动和调用逻辑?

就以我们手上的10块钱的USB Bluetooth Dongle为例,这玩意对于电脑而言,就是一个纯粹的USB设备,那我把它当作USB字符设备和块设备来进行ioctl和bulk_read/bulk_write不也一样可以?从这个理念出发,上述的什么RFComm驱动、SCO媒体驱动都不过是USB驱动之上的子集。既然是这样,何必还要跟着微软玩?开源社区中对这一块的扩展已经非常的丰富了,反正微软到目前为止,在蓝牙特别是我们预研的这块蓝牙电话领域也没什么建树。

在Windows体系中,有了USB Dongle硬件,下一步需要一个特定的驱动,然后才是在这个驱动上参照示例来实现各种功能的应用。我们在GitHub中很容易就能找到一款USB开源驱动libusb。

下载地址如下:GitHub - libusb/libusb: A cross-platform library to access USB devices

其基于Windows版本的驱动为libusb-win32,编译结果地址为:libusb-win32 download | SourceForge

源码地址为:https://github/mcuee/libusb-win32

下载后,参照其示例examples/bulk.c 可以正常找到我们的USB设备,并进行打开、关闭。理论上这个驱动应该是有效的,而且驱动很简洁。但是到了这一步,其实我不知道要往里面写哪些数据、以什么格式、什么样的交互时序(也就是所谓的协议),我们只依稀知道内部一定会要按照蓝牙的HFP的协议规范进行数据收发,但是怎么封装、封装之后能不能正常的交互?光靠这个是很难往下走的。

我们不会自己封装,但是丝毫不影响继续往下预研。我们使用libusb-win32的驱动,进行启发性搜索,看看现在这个世界上都有哪些应用会依托于这个开源libusb-win32驱动进行扩展开发,进而寻觅这些应用中是否有蓝牙相关的,最好是有蓝牙打电话能力有关联的应用。

一顿搜索,发现还真有。这就是我们本篇章讲述的玖云33e9cloud方案。(私下不得不感慨互联网的神奇,总是在你所不知道的角落,有一大批人在背后默默努力,所以真的不能闭门造车啊)

玖云33e9cloud官网:虚拟中间号_小号线路_电话呼叫系统__企业语音电话-玖云平台

应用的下载地址为:https://www.33e9cloud/uploads/soft/20220701/DialerCloud22_exe.zip

安装包安装后的驱动,在设备管理器中的展示如下图1所示:

图1 - 玖云33e9cloud的蓝牙驱动程序

安装完成后,手动进入电脑目录【C:\Windows\System32\DriverStore\FileRepository】,可以看到仅新安装了一个驱动,如下图2所示:

图2 - 玖云33e9cloud安装的所有驱动程序

 使用上次购买的CSR芯片的USB Bluetooth Dongle(设备的VID为0x0A12 PID为0x0001)插入电脑后,不运行其默认的主程序,启动【测试工具-手机呼叫】程序。应用会自动检索插入的USB模块,并进行蓝牙初始化。示例效果如下图3所示,运行后的应用可以正常绑定手机、发起呼叫、接听来电,并能够正常获取得到SCO声音。

 图3 - 玖云33e9cloud手机呼叫测试工具

 该工具本身并未提供SDK和相关的开发接口,但由于应用采用.Net开发,我们作为科研人员逆向查看了一下逻辑(仅做科研分析,不做商业性的逆向破解,而且不提倡这样做),发现它是通过UDP数据进行交互的。那这就很容易了,我们开启大白鲨Wireshark,直接抓取本地回环(Npcap Loopback Adapter)通道的UDP数据包。再启动该测试工具,得出如下图4的抓包结果,逆向工程的代码如下图5所示:

图4 - 玖云33e9cloud大白鲨Wireshark抓包的数据 

 图5 - 玖云33e9cloud逆向工程结果(仅研究用)

 根据抓包内容和逆向工程的结果来看,这个工具很容易使用和扩展。其使用固定的端口收发UDP的信令和语音数据,而且收到的和发出的语音数据,均为PCM的原始数据格式(根据new WaveFormat(0x1f40, 1)可知其采样率为8000、单声道)。

其信令的目标端口为43652,本地端口随意(抓包中本地端口为43751)。

其媒体的本地监听端口为43703(上行播放的声音),目标的监听端口为43704(下行的话筒声音)。

这样,使用这个工具,根本不需要虚拟声卡,不需要前几篇预研中那些各种杂七杂八的驱动,就可以直接进行蓝牙拨打电话并获取对应的状态信令和媒体语音的直接收发。

逆向工程后的项目也可以直接编译运行,相关示例和抓包结果均已上传百度云。(特别注明:此内容仅用于科学研究和技术探索,不用于商业行为哈

感兴趣的读者可自行下载进行对比,下载地址为:

链接:https://pan.baidu/s/1ip6cNaHQeNRWuu1ICdxE7g

提取码:jp4c

根据逆向工程的代码中的逻辑,可以简单列举其信令的收/发的格式内容,如下表1所示。

发出信令

接收信令

(应答)

信令含义(以接收到应答信令为准)

A:S

S:1:蓝牙名称

检测蓝牙是否就绪(1-就绪 其它未就绪)

Z:z

Z:蓝牙地址|名称

开始蓝牙扫描

Z:Z

Z:end

手动停止蓝牙扫描

A:T

主动强制退出蓝牙服务

P:0 / P:1

蓝牙被拔出 / 蓝牙已插入

shutdown/ init_timeout

蓝牙工作状态不正常

B:A:04:10:6B:F5:22:43

A:OK

连接手机04:10:6B:F5:22:43(若未配对则自动配对)

B:B

B:OK

断开已连接的手机

B:G

G:OK

断开通话中的SCO声音

B:H

H:OK

重新连接通话中的SCO声音

AT+CNUM

+CNUM:,"+8619907820504",145,,4

获取手机上SIM卡的手机号

ATD19907820504;

呼叫手机号19907820504

ATA

接听来电

AT+CHUP

挂断电话

+CIEV: x,x (如+CIEV: 1,0)

这一批AT指令,遵循HFP协议

表1 - 玖云33e9cloud测试工具操作的信令一栏表

从上述表1的内容中可以看出,我们想要的控制手机连接、呼叫、通话应答反馈、异常状态反馈,以及我们较为关注的声音数据的收发,在上述格式中均能得到满足(最主要是逆向工程输出的代码,居然可以直接编译后继续运行)。

我们在项目中简单的整合这个示例的逻辑后,试了一下,基本能够满足内容整合的需要,最主要是安装也不麻烦,而且看厂家的描述这个功能也是免费的。最终衡量后,觉得这个方案基本能够满足项目的实际需求,最终确定选用此方案。

至此,蓝牙电话的方案选型结束。

最终的结果为:Windows电脑蓝牙打电话方案,依赖一个USB Bluetooth Dongle硬件,依赖一个外部的安装包。在这个基础之上,我们的应用实现部分的信令和交互逻辑,最终实现电话的相互事件操作和语音媒体的实时传输。


上一篇:电脑蓝牙打电话-总结(篇外、虚拟声卡选型)

下一篇:手机实时提取SIM卡打电话的信令和声音-总结篇

本文标签: 蓝牙电脑玖云e9cloud