蓝牙简学(一)

发布时间:2023年12月29日

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、蓝牙广播

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) #注册蓝牙中断函数

下一章节,写最重要的蓝牙服务和特性,还有数据收发

文章来源:https://blog.csdn.net/lianghuajunone/article/details/135291821
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。