提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 一、蓝牙广播
- 二、通过设备广播数据
- 三、蓝牙广播类型
- 四、蓝牙状态切换
一、蓝牙广播
1、低功耗蓝牙一共有40个信道,频段范围从2402MHz到2480Mhz,37、38、39是蓝牙广播信道,剩余37个是数据信道。
为什么不使用相近的信道作为广播信道呢?
答案:为了避免广播扫描中相邻信道相互干扰。
2、一个广播数据包最长37个字节,其中6个字节是mac地址,剩下的31个字节是很多个广播数据结构体。每个结构体都有3个东西,长度,类型和内容。
具体示例:
4=1+3,3=1+2 字节
其中广播数据没用完的话,系统会自动补0,凑够31字节。
这一串跟上面那一串是一样的。
Ox03 0x08 0x41 0x49 0x02 0x0A Ox02 0x02 0x01 0x05 0x06 OxFF 0x42 0x69 0x62 0x69
好,上面这一串是多少个数据结构体呢?
答案在最后
3、蓝牙广播数据的意义
这里说的是第二个字节类型的意义,
a.第一个广播数据结构体钟,通过UTF-8得知,字符1就是0x31.
b.第二个广播数据结构体中,0x08就是发射功率为8dBm
c.第三个是厂商自定义结构体
详细的类型意义可以从官网下载
https://www.bluetooth.com/
二、通过设备广播数据
0x02 0x01 0x05 0x05 0x09 0x42 0x69 0x62 0x69 0x02 0x0A 0x02
from machine import Pin
from time import sleep_ms
import ubluetooth #导入BLE功能模块
ble = ubluetooth.BLE() #创建BLE设备
ble.active(True) #打开BLE
#设置BLE广播数据并开始广播
ble.gap_advertise(100, adv_data = b'\x02\x01\x06\x03\x09\x41\x42')
这是python的代码,c语言版本待加- -
\x表示16进制数据
安装nRF Connect手机软件,使用es32开发模组下载固件和代码后可以看到出来的广播,\x41\x42
三、蓝牙广播类型
1.可连接非定向:普通蓝牙设备采用的广播方式
2.可连接定向:已配对设备中的快速连接
3.不可连接定向:蓝牙信标和蓝牙传感器的广播方式
4可扫描非定向:在3的基础上加了扫描响应的功能,能传输更多数据
扫描响应:是在从机收到蓝牙主机的扫描请求(scan request),回复给蓝牙主机的数据(scan reponse)。
跟广播是不一样的
广播(advertises)是:蓝牙主动发射的一些数据.
广播最多发送31个字节数据,但是通过扫描响应就可以发送更多的数据
from machine import Pin
from time import sleep_ms
import ubluetooth #导入BLE功能模块
ble = ubluetooth.BLE() #创建BLE设备
ble.active(True) #打开BLE
#设置BLE广播数据并开始广播
ble.gap_advertise(100, adv_data = b'\x02\x01\x06\x03\x09\x41\x42', resp_data = b'\x03\xFF\x4C\x00')
总结
1.扫描响应数据和广播数据格式是一样的
2.扫描响应数据是非必需的
3.扫描响应可作为广播数据的补充
4.扫描响应有一定的触发条件(收到扫描请求)
四、蓝牙状态切换
总共有5个状态,分别是:
就绪态,广播态,连接态,扫描态,发起态。
前3个都很好理解,开机之后就是就绪,发广播就是广播,连上了就是连接
扫描态是主机在就绪态发起扫描,就是扫描态
发起态是,发现想要连接的设备,就是发起态
其中扫描态和广播态看着好像差不多,但是不一样的
蓝牙模块设置广播数据并开始广播后是广播态,手机扫描附近范围内的蓝牙设备时,手机将处于扫描态。
这是蓝牙广播的代码
from machine import Pin
from time import sleep_ms
import ubluetooth #导入BLE功能模块
ble = ubluetooth.BLE() #创建BLE设备
ble.active(True) #打开BLE(此时设备将处于就绪态)
#设置BLE广播数据并开始广播(开始广播后设备将处于广播态)
ble.gap_advertise(100, adv_data = b'\x02\x01\x06\x03\x09\x41\x42')
但是上面的代码在连上之后再断开了就不会继续发广播了,所以加了下面一些
加了个灯判断连上还是断开和连上断开之后继续发广播
from machine import Pin
from time import sleep_ms
import ubluetooth #导入BLE功能模块
ble = ubluetooth.BLE() #创建BLE设备
ble.active(True) #打开BLE(此时设备将处于就绪态)
#设置BLE广播数据并开始广播(开始广播后设备将处于广播态)
ble.gap_advertise(100, adv_data = b'\x02\x01\x06\x03\x09\x41\x42')
#定义一个函数,用作蓝牙事件中断
def ble_irq(event, data): # 蓝牙中断函数
if event == 1: #蓝牙已连接(此时蓝牙将处于连接态)
print("BLE 连接成功")
elif event == 2: #蓝牙断开连接(此时蓝牙将从链接态进入就绪态)
print("BLE 断开连接")
ble.gap_advertise(100, adv_data = b'\x02\x01\x06\x03\x09\x41\x42')#再次启动广播
elif event == 3: # 收到新write消息
print("BLE 收到新消息")
ble.irq(ble_irq) #注册蓝牙中断函数
下一章节,写最重要的蓝牙服务和特性,还有数据收发