LuatOS核心库API——【ble 】 蓝牙功能库

在嵌入式物联网应用中,低功耗蓝牙(BLE)是实现短距离无线交互的关键技术。LuatOS通过其内置的【ble】库,为开发者提供了完整且高效的API接口,支持从角色管理到GATT服务操作的全流程控制,适用于各类传感器节点、智能穿戴设备等场景开发。

一、概述

1.1 模式解释 -> BLE 不同模式的解读

BLE设备,可以工作在几种不同的模式: 外围设备模式,中心设备模式,广播者模式,观察者模式。

外围设备模式(peripheral), 设备会被扫描到, 并且可以被连接;

中心设备模式(central), 设备会扫描其他设备, 并且可以连接其他设备;

广播者模式(ibeacon), 设备会周期性的广播 beacon 信息, 可以被扫描到, 但一般不会被连接;

观察者模式(scan), 设备会扫描其他设备, 但不会连接其他设备。

注: 目前Air8000,Air8101 只能支持同时连接一个从设备。

1.2 蓝牙中的重要概念

1、GATT(通用属性配置文件)

定义 BLE 设备如何组织和传输数据,以 "服务(Service)" 和 "特征(Characteristic)" 为单位。

示例:心率监测设备的 GATT 服务包含 "心率特征",手机通过读取该特征获取心率数据。

2、服务和特征

服务是特征的容器,通过逻辑分组简化复杂功能的管理;

特征是数据交互的最小单元,通过属性定义实现灵活的读写与推送机制;

两者结合构成 GATT 协议的核心框架,支撑蓝牙设备间的标准化数据交互(如智能穿戴、医疗设备、物联网传感器)。

3、特征的关键属性(Properties)

特征通过"属性"定义数据的操作方式。从 GATT 通信角色看:

服务端(通常为外围设备):存储特征值的数据提供方

客户端(通常为中心设备):操作特征值的数据消费方

常见属性包括:

1)可读(Read):允许客户端读取服务端的特征值(如手机读取手环的电量)。

2)可写(Write):允许客户端向服务端写入特征值(如手机设置设备的参数)。

3)通知(Notify):服务端主动向客户端推送特征值更新(如手环向手机推送心率数据)。

4、UUID

UUID 是蓝牙 GATT 协议的 "数字身份证",通过标准化的唯一标识机制,实现了跨厂商设备的功能互认(标准 UUID)与厂商个性化功能的扩展(自定义 UUID)

注:

一个蓝牙设备可以包含多个服务(Service),每个服务通过一个 UUID(服务UUID) 进行标识。

每个服务下包含多个特征(Characteristic),每个特征都拥有一个独立的UUID(特征UUID)作为其唯一标识。

特征是最小的数据单元,我们通过读写特征来与设备交互。

1.3 四种模式的基本流程

1.3.1 外围设备模式(peripheral)的基本流程(概要描述)

1、初始化蓝牙框架

bluetooth_device = bluetooth.init()

2、创建 BLE 对象

local ble_device = bluetooth_device:ble(ble_callback)

3、创建 GATT 描述

local att_db = {xxx}

ble_device:gatt_create(att_db)

4、创建广播信息

ble_device:adv_create(adv_data)

5、开始广播

ble_device:adv_start()

6、等待连接

7、在回调函数中处理连接事件, 如接收数据, 发送数据等

1.3.2 中心设备模式(central)的基本流程(概要描述)

1、初始化蓝牙框架

bluetooth_device = bluetooth.init()

2、创建 BLE 对象

local ble_device = bluetooth_device:ble(ble_callback)

3、扫描目标 BLE 设备

ble_device:scan_start()

4、建立与目标设备的连接

ble_device:connect(mac, add_type)

5、处理各类 BLE 事件(连接、断开连接、扫描报告、GATT 操作完成等)

1.3.3 广播者模式(ibeacon)的基本流程(概要描述)

1、初始化蓝牙底层框架

bluetooth_device = bluetooth.init()

2、创建 BLE 对象

local ble_device = bluetooth_device:ble(ble_callback)

3、配置 ibeacon 广播数据包

包含厂商特定数据格式,ibeacon 类型标识符,设置UUID、Major、Minor等关键参数

4、启动 BLE 广播功能

ble_device:adv_start()

1.3.4 观察者模式(scan)的基本流程(概要描述)

1、初始化蓝牙框架

bluetooth_device = bluetooth.init()

2、创建 BLE 对象

local ble_device = bluetooth_device:ble(ble_callback)

3、开始扫描

ble_device:scan_start()

4、在回调函数中处理扫描事件, 如接收设备信息等

5、按需停止扫描

ble_device:scan_stop()

1.4 应用场景

1.4.1 外围设备 + 中心设备(连接模式)

设计框图:

1.4.2 广播者 + 观察者(无连接模式)

设计框图:

1.5 注意事项

1、Air8000,Air8101 只能支持同时连接一个从设备。

2、Air8000,Air8101 蓝牙发射功率固定为 6dBm,不可调节;最大通讯距离约为10米。

3、Air8000,Air8101 的MTU(最大传输单元)为 256 字节,不可调整,超过256字节的数据需要分包处理。

二、核心示例

核心示例是指:使用本库文件提供的核心 API,开发的基础业务逻辑的演示代码;

核心示例的作用是:帮助开发者快速理解如何使用本库,所以核心示例的逻辑都比较简单;

2.1 中心设备模式(central)的核心示例

2.2 外围设备模式(peripheral)的核心示例

2.3 广播者模式(ibeacon)的核心示例

2.4 观察者模式(scan)的核心示例

三、常量详解

核心库常量,顾名思义是由 LuatOS 内核固件中定义的、不可重新赋值或修改的固定值,在脚本代码中不需要声明,可直接调用;

每个常量对应的常量取值仅做日志打印时查询使用,不要将这个常量取值用做具体的业务逻辑判断,因为LuatOS内核固件可能会变更每个常量对应的常量取值;

如果用做具体的业务逻辑判断,一旦常量取值发生改变,业务逻辑就会出错;

3.1 地址模式常量

3.1.1 ble.PUBLIC

3.2 特征属性常量

3.2.1 ble.READ

3.2.2 ble.WRITE

3.2.3 ble.NOTIFY

3.2.4 ble.IND

3.2.5 ble.WRITE_CMD

3.3 事件类型常量

3.3.1 ble.EVENT_CONN

3.3.2 ble.EVENT_DISCONN

3.3.3 ble.EVENT_WRITE

3.3.4 ble.EVENT_READ_VALUE

3.3.5 ble.EVENT_SCAN_REPORT

3.3.6 ble.EVENT_GATT_ITEM

3.3.7 ble.EVENT_GATT_DONE

3.3.8 ble.EVENT_SCAN_STOP

3.4 广播相关常量

3.4.1 ble.COMPLETE_LOCAL_NAME

3.4.2 ble.CHNLS_ALL

3.4.3 ble.CHNL_37

3.4.4 ble.CHNL_38

3.4.5 ble.CHNL_39

3.4.6 ble.FLAGS

3.4.7 ble.SERVICE_DATA

3.4.8 ble.MANUFACTURER_SPECIFIC_DATA

3.5 扫描相关常量

3.5.1 ble.SCAN_ACTIVE

3.5.2 ble.SCAN_PASSIVE

四、函数详解

4.1 bluetooth.init()

功能

初始化蓝牙框架

注意事项

必须在使用蓝牙功能之前调用;

仅需要调用一次,若创建失败, 会返回nil, 请检查内存是否足够。

参数

返回值

local bluetooth_device = bluetooth.init()

bluetooth_device

示例

4.2 bluetooth_device:ble(ble_callback)

功能

创建一个BLE对象, 用于操作BLE设备

注意事项

必须在bluetooth.init()初始化成功后调用

参数

ble_callback

返回值

local ble_device = bluetooth_device:ble(ble_callback)

ble_device

示例

4.3 ble_device:scan_create(addr_mode,scan_interval,scan_window,scan_type)

功能

创建一个 BLE 扫描

注意事项

默认扫描模式为 ble.SCAN_PASSIVE,仅接收广播包,不向广播设备发送任何请求;

如果设备名称在扫描响应包中,则需要设置扫描模式为 ble.SCAN_ACTIVE ,此时会向广播设备发送扫描请求(Scan Request),并接收广播设备的扫描响应(Scan Response);

参数

addr_mode

scan_interval

scan_window

scan_type

返回值

local result = ble_device:scan_create(addr_mode,scan_interval,scan_window,scan_type)

result

示例

4.4 ble_device:scan_start()

功能

开始 BLE 扫描

注意事项

扫描会一直进行, 直到调用 ble.scan_stop()停止扫描;

扫描到结果会触发 ble.EVENT_SCAN_REPORT 事件,执行通过 bluetooth_device:ble(ble_callback)创建 BLE 对象时注册的回调函数;

扫描到同一个设备不会去重, 扫描到数据就会执行回调。

参数

返回值

local result = ble_device:scan_start()

result

示例

4.5 ble_device:scan_stop()

功能

停止 BLE 扫描

注意事项

扫描会一直进行, 直到调用 ble.scan_stop()停止扫描。

参数

返回值

local result = ble_device:scan_stop()

result

示例

4.6 ble_device:connect(mac, addr_type)

功能

发起 BLE 连接请求

注意事项

参数

mac

addr_type

返回值

local result = ble_device:connect(mac, addr_type)

result

示例

4.7 ble_device:disconnect()

功能

发起 BLE 断开连接请求

注意事项

参数

返回值

local result = ble_device:disconnect()

result

示例

4.8 ble_device:gatt_create(opts)

功能

创建一个 BLE GATT 服务

注意事项

确保 UUID 格式正确,且特征属性使用正确的权限常量;

特征属性必须是 ble.NOTIFY | ble.READ | ble.WRITE | ble.IND 的一种或多种组合;

参数

opts

返回值

local result = ble_device:gatt_create(opts)

result

示例

4.9 ble_device:adv_create(opts)

功能

创建一个 BLE 广播

注意事项

参数

opts

返回值

local result = ble:adv_create(opts)

result

示例

4.10 ble_device:adv_start()

功能

开始广播

注意事项

对于外围设备模式, 如果被断开了连接, 则需要重新开始广播, 才能被重新搜索到

参数

返回值

local result = ble_device:adv_start()

result

示例

4.11 ble_device:adv_stop()

功能

主动停止广播

注意事项

参数

返回值

local result = ble_device:adv_stop()

result

示例

4.12 ble_device:write_notify(opts,value)

功能

写入带通知的特征值

注意事项

外围设备使用,主动向中心设备发送通知数据

参数

opts

value

返回值

local result = ble_device:write_notify(opts,value)

result

示例

4.13 ble_device:write_indicate(opts,value)

功能

写入带指示的特征值

注意事项

外围设备使用,主动向中心设备发送指示数据

参数

opts

value

返回值

local result = ble:write_indicate(opts,value)

result

示例

4.14 ble_device:write_value(opts,value)

功能

写入特征值

注意事项

参数

opts

value

返回值

local result = ble_device:write_value(opts,value)

result

示例

4.15 ble_device:read_value(opts)

功能

读取特征值

注意事项

参数

opts

返回值

local result = ble_device:read_value(opts)

result

示例

4.16 ble_device:notify_enable(opts,enable)

功能

开关通知监听

注意事项

中心设备使用,配置是否接收外围设备发送的通知消息

参数

opts

enable

返回值

local result = ble_devie:notify_enable(opts,enable)

result

示例

4.17 ble_device:indicate_enable(opts,enable)

功能

开关指示监听

注意事项

中心设备使用,配置是否接收外围设备发送的指示消息

参数

opts

enable

返回值

local result = ble_device:indicate_enable(opts,enable)

result

示例

4.18 ble_device:adv_decode(data)

功能

解码广播数据

注意事项

广播数据通常来自于 ble.EVENT_SCAN_REPORT 事件的 ble_param.data

参数

data

返回值

local adv_data = ble_device:adv_decode(data)

adv_data

示例

4.19 ble.mac()

功能

获取蓝牙 MAC

注意事项

1、AP,STA,BLE三者的MAC地址关系:

AP = STA + 1 BLE = STA + 2

例如: STA = "C8C2C6906511" AP = "C8C2C6906512" BLE = "C8C2C6906513"

2、如何获取AP或者STA MAC地址?

使用wlan.getMac(mode, hexstr) 获取AP或者STA MAC地址,具体用法请参考:https://docs.openluat.com/osapi/core/wlan/#410-wlansetmacmode-mac

参数

返回值

local mac = ble.mac

mac

示例

五、模组支持说明

适用于 Air8000,Air8000A,Air8000W,Air8000XB,Air8000U,Air8000WU,Air8000N,Air8000WN,以及 Air6101/Air8101 系列 此类支持蓝牙功能的模组。

今天的内容就分享到这里了~

相关推荐
安科士andxe5 小时前
深入解析|安科士1.25G CWDM SFP光模块核心技术,破解中长距离传输痛点
服务器·网络·5g
九.九8 小时前
ops-transformer:AI 处理器上的高性能 Transformer 算子库
人工智能·深度学习·transformer
春日见8 小时前
拉取与合并:如何让个人分支既包含你昨天的修改,也包含 develop 最新更新
大数据·人工智能·深度学习·elasticsearch·搜索引擎
恋猫de小郭8 小时前
AI 在提高你工作效率的同时,也一直在增加你的疲惫和焦虑
前端·人工智能·ai编程
寻寻觅觅☆8 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法
YJlio8 小时前
1.7 通过 Sysinternals Live 在线运行工具:不下载也能用的“云端工具箱”
c语言·网络·python·数码相机·ios·django·iphone
deephub8 小时前
Agent Lightning:微软开源的框架无关 Agent 训练方案,LangChain/AutoGen 都能用
人工智能·microsoft·langchain·大语言模型·agent·强化学习
l1t8 小时前
在wsl的python 3.14.3容器中使用databend包
开发语言·数据库·python·databend
CTRA王大大8 小时前
【网络】FRP实战之frpc全套配置 - fnos飞牛os内网穿透(全网最通俗易懂)
网络
大模型RAG和Agent技术实践8 小时前
从零构建本地AI合同审查系统:架构设计与流式交互实战(完整源代码)
人工智能·交互·智能合同审核