Windows电脑中通过蓝牙拨打电话
技术预研-总结(三、千月Bluesoleil)
在上述Windows原生方案(利用Windows原装驱动的方案)均被验证不符合项目需求后,从这个阶段开始,迫于无奈,开始检验论证某些团队发布的商用的安装包。
这些安装包,绝大部分均为自带驱动、SDK、守护服务、界面应用的整体安装包,并且安装完毕后,除替换掉设备的驱动外,一般都会将电脑右下角任务管理器的蓝牙图标替换为其程序对应的可操作的应用,并在电脑开机或蓝牙模块加载时运行。
之所以先检验千月Bluesoleil,是因为其广告打得太猛烈了。百度随便一搜“蓝牙打电话”,前面几版面的搜索结果都是它。遛谁不是遛,那就先拿它试试效果吧。
千月Bluesoleil官网:千月(1000Moons)---为您提供最好用的蓝牙驱动和蓝牙软件(IVT BlueSoleil),最高品质的蓝牙产品,最贴心的技术服务!
安装包安装后的驱动,在设备管理器中的展示如下图1所示:
图1 - 千月Bluesoleil的蓝牙驱动程序
安装完成后,手动进入电脑目录【C:\Windows\System32\DriverStore\FileRepository】,可以看到新安装了一堆的驱动,如下图2所示:
图2 - 千月Bluesoleil安装的所有驱动程序
按照其官网的提示,也为了对比验证蓝牙模块的效果,我们除了使用电脑笔记本自带的蓝牙外,另外淘宝花了10块钱买了一个CSR芯片的USB Bluetooth Dongle(特意申明,没在它官网买,太贵了。但我只是研发阶段预研、并未商用,此行为不提倡。有条件的还是建议要直接买正版的程序和硬件),试了一下它的安装包,发现也可以使用。妥了,后续就以这个USB蓝牙的台式机和一个内置蓝牙模块的笔记本作为验证的手段。
初期选型千月Bluesoleil,是因为它对外提供了SDK(也不算详尽、一般般吧,有一些还是靠打断点和猜测才猜出来的,后面我列举时会标注红色显示)。该SDK和配套示例(C++版),基本上涵盖了简单的调用接口,当然,不包括本次项目想要的蓝牙电话HFP的示例。
千月SDK(bluesoleil_SDK_2.0.5.zip)的下载地址为:(由于网上很多下载都各种注册各种币,文章末尾提供)
官方示例描述文档地址:BlueSoleil - Support
下载完成后的对应SDK和描述指导文档,如下图3所示:
图3 - 千月SDK及其参考文档
下载后的SDK目录结构大致如下图4所示:
图4 - 千月SDK的目录结构
由于本项目中,只关注蓝牙电话的功能,即只需要其中的“获取本地设备信息”、“搜索远程设备”、“配对/取消选中设备”、“HFP连接/断开连接”,以及“HFP/HSP Profile”中相关的打电话、接听、拒接、连接/断开SCO声音等功能。
千月SDK的运行条件为:(注:该SDK在Win7和Win10中均能正常运行)
- 在电脑中已安装了1000Moons(BlueSoleil)千月安装包,并于安装后重启了电脑(不重启电脑它的虚拟声卡不会被安装,所以一定要重启电脑)
- 项目的运行路径或电脑System路径中能够找到BsSDK.dll文件(调用SDK的进程会通过此SDK自动运行BlueSoleilCS.exe进程,用于提供对应的服务)
- 安装包首次安装后,能在电脑右下角的声音管理中找到一个叫Bluetooth Audio的虚拟声卡设备
具备了上述环境后,就可以正常运行和调试基于该SDK的上层应用了。下面是我们在预研过程中临时写的一个基于C#的示例,该示例在Win7中是能正常编译和运行的。
感兴趣的读者可自行下载进行对比,下载地址为:百度网盘 请输入提取码 提取码:qk2e
应用运行后的界面如下图5所示:
图5 - 千月SDK蓝牙的验证程序
该【蓝牙SDK验证】Demo,将千月SDK中提供的示例代码中的获取蓝牙MAC地址、修改蓝牙名称、扫描附近的蓝牙设备、HFP连接手机、获取手机号、断开HFP连接,以及HFP蓝牙通话中的呼叫、来电、呼叫状态显示(振铃、接通、拒接、挂断等),以及通话过程中对SCO语音连接的连接与断开等常规功能的验证。
该示例中,主要对原先千月SDK的文档和示例中的几个需传入UTF8编码字符串的位置(如Encoding.UTF8.GetBytes(szLocalDevName)和string AtCmd = Encoding.UTF8.GetString(param)等),以及几个需要传入Encoding.GetEncoding("gb2312")编码的位置进行了标注(说实在的,我也搞不懂为什么传入UTF8就不行)。并且对注册回调函数以及回调函数中事件的处理逻辑进行了简单的分类的处理。
郁闷的是,根据SDK提供的文件和示例,始终对连接蓝牙手机时,进行的Link_Key或Pin码配对时,始终无法获取手机上弹出框的那6位数字的内容(估计是本人技术水平有限,实在搞不定)。最终,每次进行手机HFP连接时,均依赖千月自带的右下角的BtTray.exe(蓝牙图标)应用,由它弹出提醒框。连接时在电脑点它那个框,再到手机中点手机的弹出框,才算完成配对。
下表1中,简单列举了一下项目中用到的SDK接口函数,以做后续参考:
千月Bluesoleil SDK关键接口函数 |
接口描述 |
Int32 Btsdk_RegisterCallbackEx(BtSdkCallbackStru call_back, ulong priority); |
注册事件回调 |
Int32 Btsdk_RegisterCallback4ThirdParty(BtSdkCallbackStru call_back); |
注册事件回调 |
Int32 Btsdk_Init(); |
初始化SDK |
Int32 Btsdk_Done(); |
结束退出SDK |
Int32 Btsdk_SetStatusInfoFlag(ushort usMsgType); |
设置上述接口要监听的事件类型(RegisterGetStatusInfoCB4ThirdParty) |
Int32 Btsdk_StartBluetooth(); |
开启蓝牙 |
Int32 Btsdk_StopBluetooth(); |
关闭蓝牙 |
bool Btsdk_IsBluetoothHardwareExisted(); |
判断硬件是否插入 |
Int32 Btsdk_SetLocalName(byte[] name, UInt16 len); |
设置自身的蓝牙名称 |
Int32 Btsdk_GetLocalDeviceAddress(IntPtr bd_addr); |
获取自身的蓝牙MAC地址 |
Int32 Btsdk_GetLocalLMPInfo(BtSdkLocalLMPInfoStru lmp_info); |
获取蓝牙的制造商等信息 |
Int32 Btsdk_StartDeviceDiscovery(UInt32 device_class, UInt16 max_num, UInt16 max_seconds); |
开始扫描蓝牙 |
Int32 Btsdk_StopDeviceDiscovery(); |
停止蓝牙扫描 |
Int32 Btsdk_Connect(UInt32 svc_hdl, UInt32 lParam, ref UInt32 conn_hdl); |
尝试建立HFP连接 |
Int32 Btsdk_Disconnect(UInt32 handle); |
断开HFP连接 |
UInt32 Btsdk_RegisterHFPService(string svc_name, UInt16 svc_class, UInt16 features); |
注册0x111E的HFP服务 |
UInt32 Btsdk_UnregisterHFPService(UInt32 svc_hdl); |
取消注册HFP服务 |
UInt32 Btsdk_HFAP_Dial(UInt32 hdl, string phone_num, UInt16 len); |
呼叫目标号码phone_num |
UInt32 Btsdk_HFAP_AnswerCall(UInt32 hdl); |
接听来电 |
UInt32 Btsdk_HFAP_CancelCall(UInt32 hdl); |
挂断电话 |
UInt32 Btsdk_HFAP_TxDTMF(UInt32 hdl, UInt16 chr); |
发送DTMF:chr |
UInt32 Btsdk_HFAP_AudioConnTrans(UInt32 hdl); |
切换 手机接听/电脑接听 |
UInt32 Btsdk_HFP_ExtendCmd(UInt32 hdl, string cmd, UInt16 len, UInt32 timeout); |
直接发出AT信令 |
表1 - 千月Bluesoleil SDK关键接口函数及其描述
总的来说,千月SDK封装的还是比较完善的,除了蓝牙配对时Link_Key实在是不能从SDK中取到之外,也没啥可以挑剔的。
关于声音数据提取的部分,千月SDK也提供了Btsdk_HFAP_SetWaveInDevice和Btsdk_HFAP_SetWaveOutDevice的操作接口供SDK调用方设置对应的虚拟声卡名称。调用方设置后,可以很容易的提取和写入SCO语音数据,并对语音数据做进一步的处理。由于虚拟声卡部分的的选型较为复杂,将在后续单独进行一篇的讲解。(详情可参考《篇外、虚拟声卡选型》)
通过声卡名称设置后,电脑可以不用去修改默认的声音设备,能够最大限度的减少对电脑中其它的应用造成干扰。
另外,实践中发现,部分电脑使用USB Bluetooth Dongle时,上行和下行的语音偶尔出现“啵啵”的杂音,通话的音质效果较差(由于没交钱、使用的试用版,而且USB Dongle也不是从其官网购买,不排除是这些原因引起,但现象确实真实存在)。(顺便吐槽一下,千月Bluesoleil广告贼多,受不了啊)
另外,实践中发现,千月Bluesoleil的安装包及SDK,存在Win7、Win8、Win10甚至Win11的操作系统兼容性问题。从其发布的历史沿革上,一共输出了3类的安装包,在下表中列出,仅供参考:
1000Moons(BlueSoleil).rar |
官网发布的增强版Win7/Win10都能正常安装和使用 |
BlueSoleil_QianYue_1000477_32.zip |
Win7免费版,不支持Win8以上的系统 |
BlueSoleil_QianYue_1000477_64.zip |
Win7免费版,不支持Win8以上的系统 |
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/106419.html