提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
GATT层”中定义的所有属性都有一个UUID值,UUID是全球唯一的128位的号码,它用来识别不同的特性。
可以在上一章中下载pdf查看更多的uuid设定;
从0x1800开始是定义好的:服务uuid,比如0x180a是设备信息,0x180D是心率,0x180f是电池
从0x2A00开始是定义好的:特性UUID,比如0x2a00是设备名称, 0x2a01是设备外观,0x2a19为设备电量,0x2a6d是压力,0x2a6e是温度,0x2a6f是湿度
更多的可以从下面的pdf查阅。
一些文档中定义了的服务和特性,比如说:
电池电量服务的UUID是0x180F,电池电量特性的UUID是0x2A19
#创建电池服务和特性的UUID
BATTERY_SERVER_UUID = ubluetooth.UUID(0x180F)
BATTERY_CHAR_UUID = ubluetooth.UUID(0x2A19)
#创建环境传感器服务和特性的UUID
ENV_SERVER_UUID = ubluetooth.UUID(0x181A) #环境传感器服务
TEM_CHAR_UUID = ubluetooth.UUID(0x2A6E) #温度特性
HUM_CHAR_UUID = ubluetooth.UUID(0x2A6F) #湿度特性
from machine import Pin
from time import sleep_ms
import ubluetooth #导入BLE功能模块
ble = ubluetooth.BLE() #创建BLE设备
ble.active(True) #打开BLE
#创建电池服务和特性的UUID
BATTERY_SERVER_UUID = ubluetooth.UUID(0x180F)
BATTERY_CHAR_UUID = ubluetooth.UUID(0x2A19)
#创建特性并设置特性的读写权限
BATTERY_CHAR = (BATTERY_CHAR_UUID, ubluetooth.FLAG_READ , )
BATTERY_SERVER = (BATTERY_SERVER_UUID, (BATTERY_CHAR, ) , ) #把电量特性放入电池服务
SERVICES = (BATTERY_SERVER, ) #把电池服务服务放入服务集和中
((battery_char,), ) = ble.gatts_register_services(SERVICES) #注册服务到gatts
ble.gatts_write(battery_char, b'\x50') #设置电池电量为80%
#设置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: #收到数据
print("收到新消息")
ble.irq(ble_irq)
每个特性的数值类型以及范围
可以查下面的文档,GATT Specification Supplement(bing直接搜索这个,超链接有时候会丢)。
gatt文档
–比如截图的:
湿度,采用的是16位无符号类型的数据,单位是0.01%,范围是0到100.
然后是温度:
采用的16位有符号类型的数据,单位是0.01摄氏度,范围是-273.15-327.67
#创建环境传感器服务和特性的UUID
ENV_SERVER_UUID = ubluetooth.UUID(0x181A) #环境传感器服务
TEM_CHAR_UUID = ubluetooth.UUID(0x2A6E) #温度特性
HUM_CHAR_UUID = ubluetooth.UUID(0x2A6F) #湿度特性
ble.gatts_write(tem_char, b'\x06\x08') #设置温度为20.54度(0x0806 = 2054)
ble.gatts_write(hum_char, b'\x09\x07') #设置湿度为18.01%(0x0709 = 1801)
同样的,可以用以上代码替换到上面的电池电量服务代码即可显示温湿度数据。
当然这个数据是我们自己写的,实际情况中需要写温湿度的驱动,将获取到的值通过以上方式传送出去。
全称Serial Port Profile,串口协议,是通过蓝牙实现的串口数据透传,比如HC-05蓝牙模块采用的就是spp协议。
低功耗蓝牙规范里面是没有定义spp服务标准的,但是我们可以自定义一个服务和特性,实现类似的功能
以下是代码
from machine import Pin,UART
from ubletooth import BLE
import ubluetooth #导入BLE功能模块
uart1= UART(1,baudrate=115200,tx=23,rx=22)#默认串口被控制台占用,这里使用串口1
ble = BLE() #创建蓝牙对象
ble.active(True) #打开BLE
#创建SPP服务和特性的UUID,为了避免uuid重复,采用128bit的uuid
SPP_SERVER_UUID = ubluetooth.UUID('835892ab-edbc-1234-5678-112233445566')
SPP_CHAR_UUID = ubluetooth.UUID('835892ab-edbc-1234-5678-00805F9B34FB')
#创建特性并设置特性的读通知权限
SPP_CHAR = (SPP_CHAR_UUID, ubluetooth.FLAG_READ ,ubluetooth.NOTIFY )
SPP_SERVER = (SPP_SERVER_UUID, (SPP_CHAR, ) , ) #把特性A放入服务
SERVICES = (SPP_SERVER, ) #把服务放入服务集和中
((spp_char,), ) = ble.gatts_register_services(SERVICES) #注册服务到gatts
#设置BLE广播数据并开始广播
ble.gap_advertise(100, adv_data = b'\x02\x01\x05\x05\x09\x42\x69\x62\x69')
def ble_irq(event, data): # 蓝牙中断函数
if event == 1: #蓝牙已连接
print("BLE 连接成功")
elif event == 2: #蓝牙断开连接
print("BLE 断开连接")
ble.gap_advertise(100, adv_data = b'\x02\x01\x05\x05\x09\x42\x69\x62\x69')
elif event == 3: #收到数据
conn_handle,char_handle = date
buffer = ble.gatts_read(char_handle)#这里事件段是处理特性的write请求
uart1.write(buffer)#把收到的数据通过串口输出
#这样就是实现了接收数据
ble.irq(ble_irq)
while 1 :
if uart1.any() !=0:
r=uart1.read()#读取串口数据
ble.gatts_notify(0,spp_char,r)#通过蓝牙发送给手机
#这里是不断的读取数据,并且将数据通过notify发送到手机,实现数据发送的功能
以上的代码就是实现了一个简单的spp协议