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中均能正常运行

  1. 在电脑中已安装了1000Moons(BlueSoleil)千月安装包,并于安装后重启了电脑(不重启电脑它的虚拟声卡不会被安装,所以一定要重启电脑)
  2. 项目的运行路径或电脑System路径中能够找到BsSDK.dll文件(调用SDK的进程会通过此SDK自动运行BlueSoleilCS.exe进程,用于提供对应的服务)
  3. 安装包首次安装后,能在电脑右下角的声音管理中找到一个叫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以上的系统

电脑蓝牙打电话-总结(三、千月Bluesoleil)相关推荐

  1. 安装过千月(BlueSoleil)蓝牙软件后,网络图标上就一直显示红叉,但却能上网

    问题描述 安装过千月(BlueSoleil)蓝牙软件后,网络图标上就一直显示红叉,但却能上网,卸载千月后还是一直恢复不了. 解决方案: http://www.1000moons.com/downloa ...

  2. Windows电脑蓝牙打电话-预研总结

    Windows电脑中通过蓝牙拨打电话 技术预研过程-总结 因项目需求,需要在电脑中(一般是Windows系统.不排除后续会对接Mac)直接通过SIM卡拨打手机号进行呼叫的能力.这个能力在Android ...

  3. 电脑蓝牙打电话-总结(四、百瑞互联BRLink)

    Windows电脑中通过蓝牙拨打电话 技术预研-总结(四.百瑞互联BRLink) 上一篇章中,我们讲到淘宝花了10块钱买了一个CSR芯片的USB Bluetooth Dongle,后来淘宝卖家给发来了 ...

  4. 电脑蓝牙打电话-总结(五、玖云33e9cloud)

    Windows电脑中通过蓝牙拨打电话 技术预研-总结(五.玖云33e9cloud) 前面几个篇章中,对蓝牙打电话的能力进行一定深入的挖掘,但怎么总觉得越寻找越不靠谱.毕竟一会安装这个呼叫信令获取不到. ...

  5. 电脑蓝牙打电话-总结(一、win自带功能)

    Windows电脑中通过蓝牙拨打电话 技术预研-总结(一.win自带功能) Windows中,一般对新加入的硬件设备,采用一个或多个.sys驱动+同名.dll的方式,挂载设备对应的驱动,在.dll中暴 ...

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

    Windows电脑中通过蓝牙拨打电话 技术预研-总结(二.InTheHand的C#库) 由于上一篇中Windows自带的蓝牙功能有如下限制要求: 需要极高版本的Win10(19044.1288)才能正 ...

  7. 千月(BlueSoleil)_7.0.359.0

    https://www.lanzous.com/i69uv3e https://download.csdn.net/download/bsmmaoshenbo/5531535

  8. 工具BlueSoleil千月蓝牙破解版,最好的蓝牙驱动

    网上谈到的工具BlueSoleil千月蓝牙破解版,方法千奇百怪,大都是扯淡.该蓝牙驱动根本就不需要花时间去破解,只要限制一下联网就行了.(请往下看) 官方介绍      功能简介 千月蓝牙软件(Blu ...

  9. 最好的蓝牙驱动-BlueSoleil千月蓝牙破解版10.2.497.0-2018\10\9更新下,支持64位系统

    最好的蓝牙驱动-千月10.0.0496破解版-2018年支持64位系统 - 幻生的博客 - CSDN博客 https://blog.csdn.net/qq_36114959/article/detai ...

最新文章

  1. Webdriver定位不到元素的解决办法
  2. pfSense修改PPPoE拨号总数
  3. sqlsever使用charindex查询中文字符返回固定值_10个MySQL使用技巧及30个搜索优化方法...
  4. matlab slider不可移动,GUI界面能运行,但是_slider不能用,不能控制波长
  5. 应邀ITGeGe在线教育社区嵌入式基础开发讲师
  6. LinuxQuestions.org庆祝16岁生日
  7. oracle备份恢复之rman恢复到异机(二)
  8. 常见问题数组索引越界异常
  9. 质性数据分析软件NVivo的安装选项和参数
  10. matlab显示 图注,Matlab图例注记乱码(2019a)
  11. 可行性研究报告【列文】2022-5.6
  12. 数据结构-买卖青蛙最大利润
  13. UnicodeTOGB,能够将Unicode串转换成GB码,方便开发。
  14. CTGU 2021春-MySQL数据库实验2:基本查询1-2关,共10小题全代码+信息表+通关截图!
  15. 智能配时、图片识别…AI为你的春运保驾护航!
  16. 基于51单片机的篮球赛计时计分器(仿真+源程序+原理图+PCB+论文)
  17. Java中for循环的应用
  18. 人生苦短,快学python(python可以做什么)
  19. 块存储、文件存储和对象存储三者的区别
  20. 手机安装charles证书与雷电模拟器4.0安装charles证书流程

热门文章

  1. 神奇的Modbus的writeup
  2. 如何下载大兴区卫星地图高清版大图
  3. HCNR200二三事
  4. 正则表达式中\s和\\s区别
  5. RabbitMq无法连接([AMQP Connection xx.xx.xx.xx:5672-119] ERROR com.rabbitmq.client.impl.ForgivingExcept)
  6. 城市交通应急广播系统方案
  7. 如何获取Html或Jsp中select框内的值(JS原生与非原生)
  8. 上传图片计算机没有桌面,为什么我的电脑不能上传任何图片和文件?各位 – 手机爱问...
  9. Adaptive AUTOSAR架构介绍(3)
  10. 科技卡牌,PVC(奇怪的游戏增加了)