这是在一个项目中,需要开发 windows APP,通过蓝牙与下位机通讯。之前接触过的一些蓝牙项目,大多是 模块与模块 通讯,也见过很多模块-手机通讯的教程,但PC端直接与蓝牙模块的连接教程比较少,买的一些模块给出的大都是 USB-TTL-BLE的转接方案进行连接,显得有些臃肿;既然笔记自带蓝牙,直接使用笔记本自带的蓝牙和产品通讯会简便很多。
在完成“笔记本电脑自带蓝牙与蓝牙模块连接通讯”时,遇到了一些问题。在此提出一些重点的问题并给出初步的解决方案。
目录
Test1:连接 蓝牙4.0模块 : DX-BT05 BLE 4.0蓝牙模块
一、问题的提出
1. 不同版本的蓝牙能否连接通讯?
理论上不同版本(3.0、4.0、4.2、5.0)的蓝牙能够相互连接,通讯。不同版本连接时,使用较低的通讯协议版本。但是实际测试时,高版本蓝牙模块做主机能够连接低版本从机、 不同的厂家模块能够配对并连接,但有些有一些无法通讯。
2. PC端蓝牙模块连接
在一些支持PC开发的蓝牙产品与PC连接后,往往会生成一个虚拟端口号(COMXX),并且作为记录,断开后也会存在端口号。 但是用蓝牙模块(ATK, Yb,HC-06 )连接PC,有些能够匹配、有些不能匹配;而且也不能通讯透传。这是pc缺少驱动的问题、还是模块本身的问题?
3 不同厂家模块的工作模式
和蓝牙版本无关。 不同厂家的蓝牙模块,有些带密码匹配、加密通讯、上电自动寻址连接、连接记忆存储 这些功能,而简单一些的之后透传模式,作为主机每次都需要搜索、连接从机。 模块的配置-工作模式转换也是,有些需要退出配置模式,有些则不需要。不同厂家的模块也有无法连接通讯的情况。
二、资料搜集与知识学习
1.蓝牙模块的架构
之前用蓝牙模块的时候,也去找过一些底层的原理,但理解起来实在困难,看了一遍啥都没记住。而且就应用开发而言,用集成好的蓝牙模块即,会调用API即可,没必要从底层通讯协议开始学起。
目前开发遇到了问题,从新去回顾底层原理,并请教大佬,大致对之前遇到的问题有了一个初步的解答。
首先从蓝牙的架构说起。
这里给出 ATK的BEL O1蓝牙模块的外观图和引脚示意图。
观察外观图,这是不带串口底板的蓝牙模块,可以焊接到电路板上使用。但这个蓝牙也是封装好的,26个引脚用到的接口大多还是和TLL相似:VCC,GND,Uart-RX,Uart-TX,STA,WAKE UP
那么封装了哪些部分呢?观察角度再底层一些,可以看到最上面是蓝牙天线,然后是一些外围电路(电阻电容晶振)和一个芯片 QFN32(无线通讯控制芯片)。 可以从逻辑角度把他们分为:基础电路+controller ,蓝牙电路与控制器。蓝牙+外围电路,实现无线信号的收发;而控制器向下对接主机的电平配置、信号转化等,向上提供简化的电路接口,使之能够通过TLL电平控制。
而在大多数场景,都会有一颗MCU去向下对接 蓝牙控制器,向上对接操作用户,这颗MCU称作AP,Application Processor。蓝牙控制器实现了信号收发变成了高低电平控制的过程,而AP芯片实现了电平控制 到 “ble_send()”的面向开发用户的封装。
这是一种最常用的蓝牙模块架构:主机+控制器结构。除此之外,也会有一些节省成本的单芯片方案、提供复杂功能MCU的方案。目前大多数蓝牙电子产品的蓝牙都是使用host+控制器的架构。
2.通讯协议与协议栈
在了解了基础架构之后,两个模块实现通讯,还需要考虑他们之间的通讯协议。通讯协议是定义的通讯标准 ,协议栈是协议的具体实现形式(代码函数库)
就最常用架构而言,协议栈分为在 蓝牙控制器 中的和在 主机(AP)中的。
从底层往上,大致做一个解释:
最底层:PHY 物理层 指定BLE所用的无线频段,调制解调方式和方法等,基石
链路层:LL 射频状态控制 ,大致分为:待机、广播、监听、扫描、 初始化、扫描
这一层就蓝牙工程师而言,是最复杂的。具体设计到:选择哪个射频通道进行通信,怎么识别空中数据包,具体在哪个时间点把数据包发送出去,怎么保证数据的完整性,ACK如何接收,如何进行重传,以及如何对链路进行管理和控制等等。
主机控制接口层: HCI主机与控制器见提供了控制接口,提供控制接口 (在上面ATK BLE模块例子中就是TTL电平控制接口)
逻辑链路控制与数据链 L2GAP 对LL层payload(有效数据包)如何进行解析的两种方式中的一种
安全管理层 SMP 管理BLE连接的加密和安全的
通用接入规范 GAP 保证不同的Bluetooth产品可以互相发现对方并建立连接
具体的协议层与作用可以参考以下博文:
各种无线传输协议汇总(一)- Bluetooth_oyzy_Sean的篝火-CSDN博客_无线传输协议文章目录一、Bluetooth(一)、蓝牙分类(二)、蓝牙原理及应用1、工作方式2、应用(三)、发展历史(四)、蓝牙协议堆栈(五)、协议规范(六)、基带纠错(七)、建立连接(八)、配对和绑定1、动机2、实现3、配对机制(1)、遗留配对(Lagacy pairing)(2)、安全简易配对(Secure Simple Pairing,SSP)(九)、关键术语和概念1、蓝牙profile框架一、Bluetooth(一)、蓝牙分类从左到右依次为:经典蓝牙(BR/EDR)、双模蓝牙(同时支持BR/EDR/LEhttps://blog.csdn.net/qq_33194301/article/details/88041585?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164649437316780255249499%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164649437316780255249499&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-3-88041585.pc_search_result_control_group&utm_term=%E8%93%9D%E7%89%99+%E5%8D%8F%E8%AE%AE&spm=1018.2226.3001.4187总而言之,协议栈中各协议层的规定,让不同构造的蓝牙能够相互连接、通讯;而不同模块间能否连接通讯,也是看协议是否匹配。在底层硬件能够匹配的基础上,还需要通讯协议相互匹配,才能互相连接。
在大多数模块中,Conroller内协议栈的配置是封装好的,即哪些模块能够互联,是模块出厂就决定了的,不过可以通过软件更改上位机的协议配置,或者通过单片机更改下位机模块的协议配置,让他们协议匹配,不过这对技术的要求比较高,能做到这不如从头开发一款蓝牙产品,还用模块干嘛。
三、问题尝试解答
1. 不同版本蓝牙的连接通讯
在一些教程中找到了以下蓝牙设备连接图:
目前市面上蓝牙大致分为:经典 bluetoorh、低功耗 ble、双模 bluetooth smart ready
经典蓝牙和低功耗蓝牙两者物理层调制解调方式是不一样的,所以低功耗蓝牙设备和经典蓝牙设备两者之间是不能相互通信。
双模蓝牙设备,即同时支持低功耗蓝牙和经典蓝牙,比如手机中搭载的就是双模蓝牙。手机让双模蓝牙芯片不断地在低功耗蓝牙模式和经典蓝牙模式之间进行切换,以同时支持低功耗蓝牙设备和经典蓝牙设备。
2. PC端蓝牙连接
之前有看到过笔记本连接蓝牙模块的教程:
使用蓝牙模块和笔记本自带蓝牙通讯_u012933659的博客-CSDN博客本人以前常用的HC-06蓝牙模块可以通过串口将数据发送至电脑,但需要两个蓝牙模块,如下图:由于经常带产品出差测试,得一直把上图右边那个带在身上,容易弄丢。我就想既然笔记本上带有蓝牙,为何不直接使用笔记本自带的蓝牙和产品通讯呢?于是便有了这篇文章:测试模块:注:资金原因只买了这一款的,绝非打广告。第一步: 将蓝牙模块与笔记本连接 我们先将蓝牙通过串口连接电脑上,给...https://blog.csdn.net/u012933659/article/details/89152934简单地通过蓝牙设置-连接模块,即可生成虚拟端口号,进行串口通讯。
但是按照教程,我的笔记本无法实现与蓝牙模块通讯,此时,失败的原因已经找到:我所用的笔记本搭载的蓝牙版本不兼容。
LMP 10 ,蓝牙5.1, 和模块所用的 4.0、4.1不兼容(?)
而之前教程作者所用笔记本的蓝牙版本应该是ble或者双模。
所以可以尝试用低版本的蓝牙适配器,这里买了一个ble 4.0适配器,再搭载相应的驱动,应该能够与模块通讯连接。
但是,可想而知并不是所有模块都能连接。之前提高了 蓝牙控制器中协议栈配置不同,所以能否连接还要看运气,协议是否匹配;(协议栈修改是不可能去修改的,只能挑个能用的模块这样。
3. 不同厂家模块的工作模式
不同工作模式由 controller芯片决定,有些产家用点心,功能做的丰富一些;有些就简陋一些。一些模块就是不支持与PC通讯的协议的,可能是因为PC蓝牙版本有些多,又或者单纯是不考虑这个应用场景。
四、测试实验
在有一定的基础知识后,用已有的几个蓝牙模块再此进行实验,看是否能够解释之前的实验现象,找到最适合项目的方案。
下位机蓝牙模块:ATK-BLE01 蓝牙4.2串口透传模块
蓝牙串口模块ATK-BLE01 — 正点原子资料下载中心 1.0.0 文档
蓝牙MAC地址:ADD99C6FA427
配置:AT+MODE=S 从设备
波特率、数据位、校验位、停止位: 115200,8,0,1
接受ble异步串行信息,并显示到LCD
Test1:连接 蓝牙4.0模块 : DX-BT05 BLE 4.0蓝牙模块
这是买一个开发小车配套的蓝牙模块。之前就测试过连接通讯,不太成功。本次测试还是失败。具体情况如下:
左图通过串口-AT命令控制DX-BT05模块作为上位机连接ATK模块,能够连接成功,返回CONN1,但是通讯出现错误,返回无意义信息“TX!!~~” 这个问题一开始测试就是如此,通讯失败。在通讯失败后找客服,买了同一款DX-BT05模块产品,但是通讯实验还是不成功,依然会返回“TX!!~~” ,且下位机没有收到相应命令。
猜测可能的原因:一是俩模块不匹配,无法互相通讯(但是换了两个一样的DX模块还是无法通讯), 二是 SUB-TTL 模块与蓝牙模块不匹配(但是能够进行AT配置,为啥透传就会出问题,能进行AT配置就是TTL通讯没问题吧),三是透传的方式不对,或是模块没有写转发功能(即没有串口收到uart信号,通过 蓝牙转发的功能,但是大多数模块都会写的好吧,不写怎么调试啊)
目前最大的可能是3,我的调试方法不对,直接串口透传对一些模块不适用。
该模块是真的不好用,之后项目应该不会考虑使用这个模块。
Test2:PC内置蓝牙连接
还是仿照前人成功的例子,想连一下内置蓝牙。
能配对上,但是没有出现新的COM号,无法通过串口助手通讯。在设备管理器中添加新的蓝牙连接虚拟端口:
win10开启蓝牙虚拟串口_Max的杂物仓-CSDN博客_蓝牙虚拟串口
有了端口后,尝试通过改一下蓝牙地址等方式,让这个端口能够连接配对的ATKBLE01。
没有成功,或者说没有找到修改的方法。
听之前询问大佬的建议,尝试在设备管理器中更改蓝牙设备的属性,给它生成给虚拟COM啥都,还是没有找到修改的方式。
最后放弃了。
此时想到上面问题提出时说的“一些支持PC开发的蓝牙产品与PC连接后,往往会生成一个虚拟端口号” ,这个虚拟端口号生成是在连接后直接生成的,没有通过软件更改一些系统配置。应该是那个模块的controller比较nb。如何更改蓝牙模块配置,让其能连接PC蓝牙并自动生成COM,这个目前没有找到可信的说法,之后会再留意相关的信息。
Test3: HC-06 从机模块连接
随便买到的最便宜的模块,用过好多次的HC系列
LADDR=98:da:60:04:15:b8
(这个模块很AT指令不带换行,调试卡了半天才发现,很坑)
能够连接上,但是也不能正常通讯;
这个模块是阉割版,只能做从机。所以把ATK-BLE01 更改为主机,扫描周围从机,能够CONNECT ,但是发送指令,串口能收到,另一个hc-06模块没受到,或是收到没有转发给串口;
比DX模块好一些,但没完全好。不同产家的模块真就不互通的吗。可能能通讯吧,但是支持串口透传。之后用支持透传的ATK模块做上位机,给单片机写透传代码再测试吧,现在不想写了。
Test4:蓝牙适配器连接
买的4.0 ble蓝牙适配器,先去官网下个驱动。
下完安装驱动,然后在 “我的电脑” 出现了如下软件驱动界面:
这个和win10自带的,左下角的驱动不是一个,得接上蓝牙适配器才能启动。(蓝牙适配器大多也使用win10的蓝牙驱动,但是连蓝牙模块还是有点问题)
然后给蓝牙模块上电,设置为从机模式,添加设备:
把几个蓝牙模块分别测试,能够找到 HC06和DX 模块,而ATK的模块可能版本比这个高,没能找到。而两个模块中,HC-06能够在这这个界面创建虚拟CMO号,而DX模块不行。
设备管理器
在此补充一下,windows创建的蓝牙虚拟端口号一般由两个,一个接收,一个发送。具体的原因不太清楚,总之就是一个设备两个虚拟端口。
然后再把HC-06设为主机,在蓝牙适配器的蓝牙设置中勾选“允许其他设备发现本计算机”
再在串口助手中,通过AT指令让HC-06连接上蓝牙适配器。此时再打开另一个串口助手,现在模块生成的虚拟端口号CMO12能够打开。由于HC-06可能没有搭载串口透传功能,通讯实验还需要后续测试。
总结:
对于“笔记本电脑自带蓝牙与蓝牙模块连接通讯”时发现的几个问题,尝试给出了解答。蓝牙连接需要版本适配(ble、经典、双模),并且协议匹配。就目前所做项目,考虑到可能 下位机模块即使能连接本人的笔记本,但无法使用其他笔记本,所以打算使用 蓝牙4.0 ble 适配器+软件驱动的方式,完成上位机中蓝牙通讯功能。
2022-8 更新:
协议栈的组成也是众说纷纭,具体原因的经典蓝牙、ble蓝牙的协议栈会有不同,而其他人搬过去的时候也只是机械地翻译 ,协议栈有多少多少层,每层有什么功能,对初学者非常不友好,看完往往是一头雾水。
不过大致的原理都是类似的:controller于底层RF交互、HCI交连controller和Host,Host中搭建应用功能服务协议。架构都是相似的,其中controller层的协议决定了是BLE还是经典BT。手机、电脑中大多都是双模的底层协议。
transport层决定了controller和Host交互的通信协议,片外通信。常见的有UART USB SDIO。USB是D+、D-,用的是差分线,这样的话可以支持的速率更高,虽然和UART都是异步串行协议,但是USB通过差分稳定以及打包发送能实现更快的速度;SDIO是SD卡的读取协议,属于同步串行协议。SDIO和USB协议的通信速度都比UART高,但是对于2Mbps的底层速率,UART显然够用了。
之前买的很多模块,HC-05 ATK-BLE HC-08等等,大多都只是在无线收发芯片中封装了底层协议,给出了UART接口,然后就可以接入单片机使用了;或者就只搭载了BLE配对协议。但是这种使用方法,由于没有Host协议栈,即使能匹配上电脑的蓝牙,也无法通信。可以在单片机中完善Host协议栈,配置SSP协议,在与电脑内置蓝牙配对后,可以生成对应的串口号进行通信了。亦或者配置A2DP协议,这一与电脑蓝牙匹配后会被识别出蓝牙耳机,进行音频数据传输。
感谢博主 Wireless_Link 的教学文章,解答了之前的疑惑。很后悔没能早点看到这样脉络完整、水平足够的教程。