news 2026/6/10 15:15:22

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 系列 此类支持蓝牙功能的模组。

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 12:21:04

手机检测不止于图片:DAMO-YOLO在监控视频流预处理中的创新应用

手机检测不止于图片:DAMO-YOLO在监控视频流预处理中的创新应用 1. 项目概述 1.1 系统简介 这是一个基于DAMO-YOLO深度学习模型的实时手机检测系统,专门针对监控视频流预处理场景设计。系统采用阿里巴巴达摩院研发的DAMO-YOLO-S模型,结合Ti…

作者头像 李华
网站建设 2026/6/10 12:14:57

告别重复输入:输入法词库迁移工具3分钟快速上手指南

告别重复输入:输入法词库迁移工具3分钟快速上手指南 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 还在为更换输入法丢失个人词库而烦恼吗?每…

作者头像 李华
网站建设 2026/6/10 12:14:58

SpringBoot集成TranslateGemma:构建企业级多语言微服务

SpringBoot集成TranslateGemma:构建企业级多语言微服务 想象一下,你的电商平台需要同时服务来自50多个国家的用户,每个用户都希望看到自己语言的商品描述。或者你的客服系统每天要处理上千条不同语言的咨询,人工翻译根本忙不过来…

作者头像 李华
网站建设 2026/6/10 12:13:44

STM32 HAL库串口收发与printf重定向实战指南

1. HAL库串口收发与printf重定向的工程实现在嵌入式系统开发中,串口通信是调试、日志输出和人机交互最基础且高频使用的外设功能。STM32 HAL库通过高度封装的API大幅降低了串口驱动开发门槛,但若仅停留在“调用函数即可工作”的表层理解,极易…

作者头像 李华
网站建设 2026/6/10 12:17:53

如何借助窗口置顶工具实现多任务效率倍增?全方位使用指南

如何借助窗口置顶工具实现多任务效率倍增?全方位使用指南 【免费下载链接】AlwaysOnTop Make a Windows application always run on top 项目地址: https://gitcode.com/gh_mirrors/al/AlwaysOnTop 在当今信息爆炸的时代,高效的窗口管理已成为提升…

作者头像 李华