LuatOS扩展库API——【exril_5101】 Air5101 蓝牙扩展库
一、概述
exril_5101 是一个基于 LuatOS 框架,专为 Air5101 BLE 模块 开发的 LuatOS 扩展库;
该库封装了 Air5101 蓝牙模块的底层 AT 指令集,提供简洁、易用的 API 接口,简化了蓝牙应用的开发复杂度。

二、核心示例
-- 加载蓝牙扩展库
local exril_5101 = require("exril_5101")
-- =============== 任务队列和优先级管理 ===============
-- 看门狗定时喂狗任务和数据循环发送任务 可能会同时执行导致冲突,所以加上优先级处理
local task_queue = {}
local task_priority = {
watchdog = 1, -- 最高优先级
data_send = 2, -- 次高优先级
}
local is_watchdog_running = false
local is_connected = false
-- 添加任务到队列
local function add_task(task_type, task_func, params)
table.insert(task_queue, {
type = task_type,
priority = task_priority[task_type] or 999,
func = task_func,
params = params
})
-- 按优先级排序,优先级数字越小优先级越高
table.sort(task_queue, function(a, b)
return a.priority < b.priority
end)
end
-- 任务处理函数
local function process_tasks()
while true do
if #task_queue > 0 then
-- 取出第一个任务(优先级最高的)
local task = table.remove(task_queue, 1)
log.info("main", "执行任务:", task.type)
-- 标记看门狗任务正在执行
if task.type == "watchdog" then
is_watchdog_running = true
end
-- 执行任务
task.func(task.params)
-- 标记看门狗任务执行完成
if task.type == "watchdog" then
is_watchdog_running = false
end
end
sys.wait(100) -- 每100ms检查一次任务队列
end
end
-- 启动任务处理线程
sys.taskInit(process_tasks)
-- =============== 配置参数 ===============
local config = {
-- 设备名称(不超过20字符)
device_name = "Air5101_Demo",
-- 广播类型(可连接)
adv_type = exril_5101.ADV_C,
-- 广播间隔(毫秒)
adv_interval = 50,
-- 广播数据
adv_data = "02010603031218",
}
-- =============== 事件回调处理 ===============
local function ble_event_handler(event, payload)
log.info("蓝牙事件", "事件类型:", event)
if event == "connected" then
log.info("蓝牙事件", "蓝牙已连接")
is_connected = true
elseif event == "disconnected" then
log.info("蓝牙事件", "蓝牙已断开")
is_connected = false
elseif event == "data" then
-- 收到蓝牙数据
log.info("main", "收到数据 [模式:" .. payload.mode .. "]:", payload.data)
-- 收到数据后自动回复
exril_5101.send("AT:ACK " .. payload.data)
end
end
-- =============== 初始化示例 ===============
local function ble_init()
log.info("main", "\n========== 初始化示例 ==========")
-- 1. 获取当前工作模式
local success, mode = exril_5101.mode()
if success then
log.info("main", "当前工作模式:", mode)
else
log.error("main", "获取模式失败:", mode)
end
-- 2. 切换到AT模式(确保可以配置参数)
log.info("main", "切换到AT指令模式...")
success, mode = exril_5101.mode(exril_5101.MODE_AT)
if not success then
log.error("main", "切换AT模式失败:", mode)
return false
end
log.info("main", "已切换到:", mode)
-- 3. 配置设备参数
log.info("main", "配置设备参数...")
local config_result, err = exril_5101.set({
name = config.device_name,
adv_type = config.adv_type,
adv_data = config.adv_data,
adv_interval = config.adv_interval
})
if config_result then
log.info("main", "参数配置成功")
else
log.error("main", "参数配置失败:", err)
end
-- 4. 查询设备信息
log.info("main", "查询设备信息...")
local info, err = exril_5101.get({"name", "mac", "ver"})
if info then
log.info("main", "设备名称:", info.name or "未知")
log.info("main", "MAC地址:", info.mac or "未知")
log.info("main", "固件版本:", info.ver or "未知")
else
log.error("main", "查询失败:", err)
end
return true
end
-- =============== 功耗管理示例 ===============
local function power_demo()
log.info("main", "\n========== 功耗管理示例 ==========")
-- 获取当前功耗模式
local success, mode = exril_5101.power()
if success then
local mode_names = {["exril_5101.P0"]="常规模式", ["exril_5101.P1"]="低功耗模式1", ["exril_5101.P3"]="低功耗模式3"}
log.info("main", "当前功耗模式:", mode, mode_names[mode] or "未知")
end
-- 设置低功耗模式1
log.info("main", "切换到低功耗模式1...")
local success, msg = exril_5101.power(exril_5101.P1)
if success then
log.info("main", "低功耗模式1设置成功")
else
log.error("main", "低功耗模式1设置失败:", msg)
end
sys.wait(1000)
-- 唤醒并切换到常规模式(最多尝试3次)
local max_retries = 3
local success = false
local msg = ""
for i = 1, max_retries do
log.info("main", "尝试切换到常规模式 (" .. i .. "/" .. max_retries .. ")...")
success, msg = exril_5101.power(exril_5101.P0, true)
if success then
log.info("main", "第" .. i .. "次切换到常规模式成功")
break
else
log.error("main", "第" .. i .. "次切换常规模式失败:", msg)
if i < max_retries then
log.info("main", "300ms后重试...")
sys.wait(300)
end
end
end
if not success then
log.error("main", "多次尝试切换常规模式失败")
end
end
-- =============== 看门狗示例 ===============
-- 喂狗任务执行函数
local function execute_watchdog_task()
-- 先切换到AT模式
local mode_success, mode_result = exril_5101.mode(exril_5101.MODE_AT)
if not mode_success then
log.error("看门狗", "切换到AT模式失败:", mode_result)
return
end
-- 执行喂狗
local fed_success, fed_msg = exril_5101.wdfed()
if fed_success then
log.info("main", "喂狗成功")
else
log.error("main", "喂狗失败:", fed_msg)
end
end
-- 喂狗任务函数
local function watchdog_feed_task()
while true do
sys.wait(10000) -- 10秒喂一次
add_task("watchdog", execute_watchdog_task)
end
end
local function watchdog_demo()
log.info("main", "\n========== 看门狗示例 ==========")
-- 查询看门狗配置
local success, config = exril_5101.wdcfg()
if success then
log.info("main", "当前看门狗配置:")
log.info("main", " 使能:", config.en)
log.info("main", " 超时:", config.timeout, "秒")
log.info("main", " 电平:", config.level)
log.info("main", " 脉宽:", config.width, "ms")
end
-- 开启看门狗(30秒超时,超时后拉低100ms)
log.info("main", "开启看门狗...")
local success, msg = exril_5101.wdcfg(true, 30, 0, 100)
if success then
log.info("main", "看门狗已开启")
-- 启动喂狗任务
sys.taskInit(watchdog_feed_task)
else
log.error("main", "看门狗配置失败:", msg)
end
end
-- =============== 数据收发示例 ===============
-- 数据发送任务执行函数
local function execute_data_send_task()
if is_connected then
local send_success, send_message = exril_5101.send("heartbeat" .. os.time())
if send_success then
log.info("心跳包", "发送成功")
else
log.error("心跳包", "发送失败:", send_message)
end
end
end
-- 数据发送任务函数
local function data_send_task()
while true do
sys.wait(5000)
add_task("data_send", execute_data_send_task)
end
end
local function data_transfer_demo()
log.info("main", "\n========== 数据收发示例 ==========")
-- 每10秒尝试发送一次数据
sys.taskInit(data_send_task)
end
-- =============== 主任务 ===============
local function main_task()
log.info("main", "====================================")
log.info("main", "exril_5101 蓝牙模块启动")
log.info("main", "项目:", PROJECT)
log.info("main", "版本:", VERSION)
log.info("main", "====================================")
-- 注册事件回调
local reg_success, reg_err = exril_5101.on(ble_event_handler)
if reg_success then
log.info("main", "事件回调注册成功")
else
log.error("main", "事件回调注册失败:", reg_err)
return
end
-- 初始化
local result = ble_init()
if not result then
log.error("main", "初始化配置失败,退出")
return
end
-- 功耗管理演示
power_demo()
-- 看门狗演示
watchdog_demo()
-- 数据收发演示
data_transfer_demo()
log.info("main", "\n所有演示任务已启动,等待蓝牙连接...")
end
-- 启动主任务
sys.taskInit(main_task)
三、常量详解
扩展库常量,由 excloud 扩展库中定义的、不可重新赋值或修改的固定值;
3.1 功耗模式常量
3.1.1 exril_5101.P0
常量含义:常规模式,正常运行;
数据类型:string;
注意事项:无;
示例代码:exril_5101.power(exril_5101.P0)
3.1.2 exril_5101.P1
常量含义:低功耗模式1,蓝牙可连接,唤醒后继续保持低功耗模式1;
数据类型:string;
注意事项:蓝牙可以被发现、连接,可通过串口或蓝牙数据唤醒,唤醒后80ms左右后会再次进入低功耗模式1;
示例代码:exril_5101.power(exril_5101.P1)
3.1.3 exril_5101.P3
常量含义:低功耗模式3,唤醒后自动恢复到常规模式0;
数据类型:string;
注意事项:蓝牙可以被发现、连接,可通过串口或蓝牙数据唤醒,唤醒后自动退出低功耗模式3,恢复为常规模式0;
示例代码:exril_5101.power(exril_5101.P3)
3.2 蓝牙工作模式
3.2.1 exril_5101.MODE_UA
常量含义:uart透传模式;
数据类型:string;
注意事项:模组上电默认透传模式;
示例代码:exril_5101.mode(exril_5101.MODE_UA)
3.2.2 exril_5101.MODE_AT
常量含义:AT指令模式;
数据类型:string;
注意事项:模组上电默认透传模式;
示例代码:exril_5101.mode(exril_5101.MODE_AT)
3.3 广播类型
3.3.1 exril_5101.ADV_N
常量含义:不可连接广播;
数据类型:string;
注意事项:设备只广播数据,不接受连接请求;
示例代码:exril_5101.set("adv_type", exril_5101.ADV_N)
3.3.2 exril_5101.ADV_C
常量含义:可连接广播;
数据类型:string;
注意事项:设备广播数据并接受连接请求;
示例代码:exril_5101.set("adv_type", exril_5101.ADV_C)
四、函数详解
函数使用总体说明:
在使用 exril_5101 扩展库的 API 函数时,需要注意以下重要事项:
1、必须在任务(task)中使用的函数
以下函数包含 sys.wait() 延时操作,必须在任务函数中调用:
-
exril_5101.send() – 当启用唤醒功能(wakeup_option)时,内部会调用 sys.wait() 进行延时
-
exril_5101.mode()
-
exril_5101.set()
-
exril_5101.get()
-
exril_5101.restore()
-
exril_5101.restart()
-
exril_5101.disconnect()
-
exril_5101.status()
-
exril_5101.power()
-
exril_5101.wdcfg()
-
exril_5101.wdfed()
-
exril_5101.wakeup()
-
exril_5101.save()
-
exril_5101.send()
2、可在任意上下文使用的函数
以下函数不包含延时操作,可在任意上下文(包括回调函数)中调用:
- exril_5101.on() – 仅注册回调函数,无等待
4.1 exril_5101.mode(mode,timeout)
功能:
模式切换;
注意事项:
Air5101 模块上电默认是 exril_5101.MODE_UA 透传模式;
参数:
mode
参数含义:工作模式;
数据类型:number;
取值范围:exril_5101.MODE_UA或exril_5101.MODE_AT;
是否必选:否;
注意事项:不选表示获取当前模式,
exril_5101.MODE_UA:透传模式,
exril_5101.MODE_AT:AT指令模式;
参数实例:exril_5101.MODE_UA或exril_5101.MODE_AT
timeout
参数含义:同步超时时长;
数据类型:number;
取值范围:1-10000,单位:ms;
是否必选:否;
注意事项:仅同步调用时有效,默认200ms;
返回值:
local result1, result2 = exril_5101.mode(mode)
result1
含义说明:是否配置模式成功;
数据类型:boolean;
取值范围:true/false;
注意事项:true表示模式配置成功,false表示模式配置失败;
返回示例:成功返回:true 失败返回:false
result2
含义说明:当前模式或错误信息;
数据类型:string;
取值范围:模式字符串或错误信息;
注意事项:成功时返回当前模式,失败时返回错误信息;
返回示例:成功返回:exril_5101.MODE_UA或者exril_5101.MODE_AT
失败返回:错误信息
示例:
-- 示例1:获取当前模式
local result1, result2 = exril_5101.mode()
log.info("success", result1, "mode", result2)
-- 示例2:切换到透传模式(准备传输数据)
local result1, result2 = exril_5101.mode(exril_5101.MODE_UA)
log.info("success", result1, "result", result2)
-- 示例3:切换回AT指令模式(需要配置参数时)
local result1, result2 = exril_5101.mode(exril_5101.MODE_AT)
log.info("success", result1, "result", result2)
4.2 exril_5101.set(config,timeout)
功能:
设置 Air5101 模块参数,如设备名称、广播参数、连接参数等;
注意事项:
1、必须在 AT 模式下设置参数,设置前请先调用 exril_5101.mode(exril_5101.MODE_AT) 切换到 AT 模式;
2、配置会自动保存到 Flash,掉电不消失;
3、配置成功后,函数会自动调用 exril_5101.save() 保存配置;
4、mac 地址不要轻易设置,模块出厂前已经内置了不可擦除的 mac 地址,如果使用此接口设置 mac 地址,则原先的 mac 地址将会被替换,同时设置后的 mac 地址可通过 exril_5101.restore()接口擦除!!!!!!
参数:
config
> 参数含义:配置参数表,用于配置Air5101模块参数;参数为table类型时,table内容格式说明如下:
> {
> 参数含义:设备广播时显示的名称;
> 数据类型:string;
> 取值范围:不超过20字节;
> 是否必选:可选,默认设备名称为"Air5101S";
> 注意事项:无;
> 参数示例:name = "Air5101"
> 参数名称:config.name
>
> 参数含义:广播类型;
> 数据类型:string;
> 取值范围:exril\_5101.ADV\_N 或 exril\_5101.ADV\_C;
> 是否必选:可选,默认exril\_5101.ADV\_C;
> 注意事项:无;
> 参数示例:adv\_type = exril\_5101.ADV\_C
> 参数名称:config.adv\_type
>
> 参数含义:广播数据;
> 数据类型:string;
> 取值范围:不超过31字节的十六进制字符串;
> 是否必选:可选,默认"020106",代表\[长度2\]\[类型1-广播标志\]\[06-通用发现模式\];
> 注意事项:无;
> 参数示例:adv\_data = "02010603031218"
> 数据解析:
> 02 01 06 → \[长度2字节\]\[类型1-广播标志\]\[06-通用发现模式\]
> 03 03 12 18 → \[长度3字节\]\[类型3-16位UUID\]\[0x1812\]
> 参数名称:config.adv\_data
>
> 参数含义:扫描响应数据;
> 数据类型:string;
> 取值范围:不超过31字节的十六进制字符串;
> 是否必选:可选,默认空;
> 注意事项:仅在蓝牙连接状态下可设置;
> 参数示例:scan\_rsp\_data = "080941697235313031"
> 数据解析:
> 08 = 长度字节 (1字节类型 + 7字节数据 = 8字节)
> 09 = 数据类型 (09表示完整设备名称)
> 41 69 72 35 31 30 31 = "Air5101"的ASCII码
> 参数名称:config.scan\_rsp\_data
>
> 参数含义:广播间隔;
> 数据类型:number;
> 取值范围:20-10000ms;
> 是否必选:可选,默认30ms;
> 注意事项:无;
> 参数示例:adv\_interval = 1000 --设置广播间隔为1s
> 参数名称:config.adv\_interval
>
> 参数含义:连接间隔;
> 数据类型:number;
> 取值范围:7.5-2000ms;
> 是否必选:可选,默认30ms;
> 注意事项:仅在蓝牙连接状态下可设置;
> 参数示例:conn\_interval = 1000 --设置连接间隔为1s
> 参数名称:config.conn\_interval
>
> 参数含义:MTU长度;
> 数据类型:number;
> 取值范围:23-512;
> 是否必选:可选,默认512;
> 注意事项:仅在蓝牙连接状态下可设置;
> 参数示例:mtu\_len= 512
> 参数名称:config.mtu\_len
>
> 参数含义:波特率;
> 数据类型:number;
> 取值范围:可选择波特率表:{921600,460800,230400,115200,57600,38400,19200,9600,4800,2400};
> 是否必选:可选,默认9600;
> 参数示例:baud = 115200
> 参数名称:config.baud
> }
>
> 数据类型:table;
> 取值范围:无;
> 是否必选:是;
> 注意事项:无;
> 参数示例:设置设备名称、广播类型和广播间隔:
> {
> name = "MyDevice",
> adv\_type = exril\_5101.ADV\_C,
> adv\_interval = 1000
> }
timeout
参数含义:同步超时时长;
数据类型:number;
取值范围:1-10000,单位:ms;
是否必选:否;
注意事项:仅同步调用时有效,默认200ms;
返回值:
local result1, result2 = exril_5101.set(config)
result1
含义说明:是否设置成功;
数据类型:boolean;
取值范围:true/false;
注意事项:true表示所有参数设置成功,false表示有参数设置失败;
返回示例:成功返回:true 失败返回:false
result2
含义说明:设置结果或错误信息;
结果表结构(成功时):
{
[参数名1] = {
success -- boolean 该参数是否设置成功
value -- any 实际设置的值
message -- string 设置结果描述
},
[参数名2] = {
success -- boolean 该参数是否设置成功
value -- any 实际设置的值
message -- string 设置结果描述
},
...
}
数据类型:table/string;
取值范围:结果表或错误信息;
注意事项:成功时返回结果表,失败时返回错误信息;
返回示例:-- 成功时举例
{
name = {
success = true,
value = "Air5101_Test",
message = "设置成功"
},
adv_type = {
success = true,
value = "0x03",
message = "设置成功"
},
adv_interval = {
success = true,
value = 30,
message = "设置成功"
}
}
-- 失败时举例
"config必须是table类型"
示例:
-- 构建配置表
local config = {
name = "Air5101_Test", -- 设备名称为Air5101_Test
adv_type = exril_5101.ADV_C, -- 可连接广播
adv_interval = 30, -- 广播间隔30ms
}
-- 同步设置参数
local result1, result2 = exril_5101.set(config)
if result1 then
log.info("参数设置", "参数设置成功")
-- result2 是一个table,包含每个配置项的设置结果
for key, result in pairs(result2) do
if result.success then
log.info("参数设置", key, "设置成功,值:", result.value)
else
log.warn("参数设置", key, "设置失败:", result.message)
end
end
else
-- 当result1为false时,result2是错误信息字符串_
log.error("参数设置", "参数设置失败:", result2)
end
4.3 exril_5101.get(key, timeout)
功能:
获取 Air5101 模块参数,如设备名称、MAC 地址、固件版本等;
注意事项:
1、必须在 AT 模式下设置参数,设置前请先调用 exril_5101.mode(exril_5101.MODE_AT) 切换到 AT 模式;
2、支持获取单个参数或多个参数;
参数:
key
参数含义:要获取的参数键名或键名数组;
数据类型:string/table;
取值范围:单个键名或键名数组;
是否必选:是;
注意事项:支持的键名见下方说明:
键名 含义 返回格式
ver 固件版本 版本字符串
name 设备名称 设备名称字符串
baud 波特率 波特率数值
mac MAC地址 十六进制字符串
adv_type 广播类型 广播类型常量
adv_data 广播数据 十六进制字符串
scan_rsp_data 扫描响应数据 十六进制字符串
adv_interval 广播间隔 毫秒值
conn_interval 连接间隔 毫秒值
mtu_len MTU长度 数值
power_mode 功耗模式 模式数值
参数实例:单个键名:exril_5101.get("name")
多个键名:exril_5101.get({"name", "mac", "ver"})
timeout
参数含义:同步超时时长;
数据类型:number;
取值范围:1-10000,单位:ms;
是否必选:否;
注意事项:仅同步调用时有效,默认200ms;
返回值:
local result1, result2 = exril_5101.get(key)
result1
含义说明:获取的参数值;
数据类型:取决于键名/nil;
取值范围:取决于键名;
注意事项:成功时返回参数值,失败时返回nil;
返回示例:成功返回:获取的参数值,比如获取设备名称,返回的字符串便是设备名称
失败返回:nil
result2
含义说明:错误信息;
数据类型:string;
取值范围:错误信息;
注意事项:成功时返回nil,失败时返回错误信息;
返回示例:成功返回:nil
失败返回:错误信息
示例:
-- 示例1:单个键获取
local result1, result2 = exril_5101.get("name")
if result1 then
log.info("设备名称:", result1)
else
log.error("获取失败:", result2)
end
-- 示例2:多个键获取
local result1, result2= exril_5101.get({"name", "mac", "ver"})
if result1 then
log.info("设备名称:", result1.name)
log.info("设备MAC:", result1.mac)
log.info("设备版本:", result1.ver)
else
log.error("获取失败:", result2)
end
4.4 exril_5101.restore(timeout)
功能:
恢复 Air5101 模块的出厂设置,将所有参数重置为默认值;
注意事项:
1、必须在 AT 模式下执行此操作,执行前请先调用 exril_5101.mode(exril_5101.MODE_AT) 切换到 AT 模式;
2、恢复出厂设置后,模块会自动重启以应用默认设置;
3、恢复出厂设置会清除所有自定义配置,包括设备名称、广播参数等;
参数:
timeout
参数含义:同步超时时长;
数据类型:number;
取值范围:1-10000,单位:ms;
是否必选:否;
注意事项:仅同步调用时有效,默认200ms;
返回值:
local result = exril_5101.restore()
result
含义说明:是否恢复成功;
数据类型:boolean;
取值范围:true/false;
注意事项:true表示恢复出厂设置成功,false表示恢复失败;
返回示例:成功返回:true 失败返回:false
示例:
local result = exril_5101.restore()
if result then
log.info("恢复出厂设置成功")
else
log.error("恢复失败")
end
4.5 exril_5101.restart(timeout)
功能:
软重启 Air5101 模块,使模块重新初始化并加载配置;
注意事项:
1、必须在 AT 模式下执行此操作,执行前请先调用 exril_5101.mode(exril_5101.MODE_AT) 切换到 AT 模式;
2、重启后,模块会重新初始化并加载默认配置或已保存的配置;
3、重启过程中,蓝牙连接会断开;
参数:
timeout
参数含义:同步超时时长;
数据类型:number;
取值范围:1-10000,单位:ms;
是否必选:否;
注意事项:仅同步调用时有效,默认200ms;
返回值:
local result = exril_5101.restart()
result
含义说明:是否重启成功;
数据类型:boolean;
取值范围:true/false;
注意事项:true表示重启命令发送成功,false表示重启失败;
返回示例:成功返回:true 失败返回:false
示例:
local result = exril_5101.restart()
if result then
log.info("重启成功")
else
log.erroe("重启失败")
end
4.6 exril_5101.disconnect(timeout)
功能:
断开当前蓝牙连接,使设备回到可发现状态;
注意事项:
1、必须在 AT 模式下执行此操作,执行前请先调用 exril_5101.mode(exril_5101.MODE_AT) 切换到 AT 模式;
2、断开连接后,设备会重新开始广播,可被其他设备发现和连接;
3、如果当前没有蓝牙连接,此操作仍然会返回成功;
参数:
timeout
参数含义:同步超时时长;
数据类型:number;
取值范围:1-10000,单位:ms;
是否必选:否;
注意事项:仅同步调用时有效,默认200ms;
返回值:
local result = exril_5101.disconnect()
result
含义说明:是否断开成功;
数据类型:boolean;
取值范围:true/false;
注意事项:true表示断开成功,false表示断开失败;
返回示例:成功返回:true 失败返回:false
示例:
local result = exril_5101.disconnect()
if result then
log.info("断开成功")
else
log.erroe("断开失败")
end
4.7 exril_5101.status(timeout)
功能:
查询蓝牙连接状态,获取设备当前的连接状态信息;
注意事项:
1、必须在 AT 模式下执行此操作,执行前请先调用 exril_5101.mode(exril_5101.MODE_AT) 切换到 AT 模式;
2、此函数会返回内部缓存的连接状态,同时会更新状态信息;
参数:
timeout
参数含义:同步超时时长;
数据类型:number;
取值范围:1-10000,单位:ms;
是否必选:否;
注意事项:仅同步调用时有效,默认200ms;
返回值:
local result1, result2 = exril_5101.status()
result1
含义说明:是否查询成功;
数据类型:boolean;
取值范围:true/false;
注意事项:true表示查询成功,false表示查询失败;
返回示例:成功返回:true 失败返回:false
result2
含义说明:状态信息或错误信息;
如果返回的是状态信息表,则字段如下:
{
参数含义:蓝牙连接状态;
数据类型:boolean;
取值范围:true/false;
注意事项:无;
参数名称:connected
参数含义:当前工作模式;
数据类型:string;
取值范围:exril_5101.MODE_UA或者exril_5101.MODE_AT;
注意事项:无;
参数名称:mode
参数含义:模块原始的响应上报信息;
数据类型:string;
取值范围:"AT:CONNECTED":已连接;
"AT:DISCONNECT":未连接;
注意事项:无;
参数名称:raw_respnse
}
数据类型:table/string;
取值范围:状态表或错误信息字符串;
注意事项:成功时返回状态表,失败时返回错误信息;
返回示例:成功返回table,失败返回错误信息;
示例:
local status_success, status_info = exril_5101.status()
if status_success then
log.info("连接状态:", status_info.connected)
log.info("当前模式:", status_info.mode)
else
log.error("查询失败:", status_info)
end
4.8 exril_5101.power(mode, wakeup_option, timeout)
功能:
设置或获取 Air5101 模块的功耗模式,以控制模块的功耗状态;
注意事项:
1、设置功耗模式时必须在 AT 模式下执行,执行前请先调用 exril_5101.mode(exril_5101.MODE_AT) 切换到 AT 模式;
2、功耗模式信息:
- exril_5101.P0 常规模式 0:蓝牙正常工作;
- exril_5101.P1 低功耗模式 1:可被发现和连接,唤醒后,会在 80ms 后再次进入低功耗模式 1;
- exril_5101.P3 低功耗模式 3:可被发现和连接,唤醒后,自动退出低功耗模式 3,进入常规模式 0;
3、wakeup_option 内的 data 表示唤醒数据,可以在 Air5101 低功耗模式下,发送此数据来唤醒 Air5101:
- ≤ 115200:发送任意 1 个字节唤醒即可,后面可以加上回车换行,与后面真正要发的 AT 指令分隔开;
- > 115200:此时基本不能通过串口数据来唤醒了,如果一定要用串口唤醒,需要发十六进制 0x00,这样单字节低电平持续时间最长(大于 115200 波特率的唤醒,低电平时间要持续 60uS 以上);
参数:
mode
参数含义:功耗模式;
数据类型:string;
取值范围:exril_5101.P0/exril_5101.P1/exril_5101.P3;
是否必选:否;
注意事项:不选表示获取当前功耗模式;
参数实例:exril_5101.power(exril_5101.P1)
wakeup_option
参数含义:唤醒Air5101配置;
该参数为 table 类型,字段如下:
{
参数含义:是否在设置功耗模式前先唤醒Air5101;
数据类型:boolean;
取值范围:true/false;
是否必选:否;
注意事项:默认是false;
参数名称:enable
参数含义:唤醒数据;
数据类型:string;
取值范围:任意字符串;
是否必选:否;
注意事项:默认是"wakeup";
参数名称:data
参数含义:唤醒后延时多久再设置功耗模式;
数据类型:string;
取值范围:1ms-100ms;
是否必选:否;
注意事项:默认是25ms(推荐值);
参数名称:delay
}
数据类型:table;
取值范围:暂无;
是否必选:否;
注意事项:若不提供此参数或提供空表,默认不唤醒;
timeout
参数含义:同步超时时长;
数据类型:number;
取值范围:1-10000,单位:ms;
是否必选:否;
注意事项:仅同步调用时有效,默认200ms;
返回值:
local result1, result2 = exril_5101.mode(mode)
result1
含义说明:是否获取/设置成功;
数据类型:boolean;
取值范围:true/false;
注意事项:不传mode参数,表示获取当前功耗模式,true表示获取成功,false表示获取失败;
若传了mode参数,表示设置功耗模式,true表示设置成功,false表示设置失败;
返回示例:成功返回:true 失败返回:false
result2
含义说明:当前模式或错误信息;
数据类型:string;
取值范围:模式数值或错误信息;
注意事项:成功时返回当前模式,失败时返回错误信息;
返回示例:成功返回:exril_5101.P0,exril_5101.P1,exril_5101.P3
失败返回:错误信息
示例:
-- 1. 获取当前功耗模式
local result1, result2 = exril_5101.power()
if result1 then
log.info("当前功耗模式为:", result2)
else
log.info("获取当前功耗模式失败")
end
-- 2. 设置为低功耗模式1
local set_success, set_message = exril_5101.power(exril_5101.P1)
if set_success then
log.info("功耗模式设置成功:", set_message)
else
log.error("设置失败:", set_message)
end
-- 3. 唤醒后设置为低功耗模式1(使用默认的data和delay)
local set_success, set_message = exril_5101.power(exril_5101.P1,true)
if set_success then
log.info("功耗模式设置成功:", set_message)
else
log.error("设置失败:", set_message)
end
4.9 exril_5101.wdcfg(en, timeout, level, width, sync_timeout)
功能
1、配置看门狗功能参数,用于监控主控设备运行状态。
2、当主控设备在指定时间内未喂狗时,蓝牙模块将通过 SWITCH 引脚复位主控。
3、看门狗复位脉冲波形说明:
-
当看门狗超时发生时,SWITCH 引脚会输出一个复位脉冲信号
-
脉冲的极性由 level 参数控制:
注意事项
1、必须在 AT 模式下执行此操作,执行前请先调用 exril_5101.mode(exril_5101.MODE_AT) 切换到 AT 模式;
2、配置看门狗后,需要定期调用 exril_5101.wdfed() 进行喂狗,否则看门狗会超时;
3、配置成功后,函数会自动调用 exril_5101.save() 保存配置;
参数
en
参数含义:是否开启看门狗功能;
数据类型:boolean;
取值范围:true/false;
是否必选:否;
注意事项:不提供则表示查询当前配置;
timeout
参数含义:喂狗超时时长;
数据类型:number;
取值范围:1-99999999,单位:s;
是否必选:否;
注意事项:不选则默认60s;
level
参数含义:超时动作电平;
数据类型:number;
取值范围:0/1;
是否必选:否;
注意事项:默认值:0
0:超时后拉低SWITCH
1:超时后拉高SWITCH
width
参数含义:复位脉冲宽度;
数据类型:number;
取值范围:10-10000,单位:ms;
是否必选:否;
注意事项:不选则默认100ms
sync_timeout
参数含义:同步超时时长;
数据类型:number;
取值范围:1-10000,单位:ms;
是否必选:否;
注意事项:仅同步调用时有效,默认200ms;
返回值
local result1,result2 = exril_5101.wdcfg(en, timeout, level, width)
result1
含义说明:是否获取/配置成功;
数据类型:boolean;
取值范围:true/false;
注意事项:true表示看门狗获取/配置成功,false表示看门狗获取/配置失败;
返回示例:成功返回:true 失败返回:false
-- 配置看门狗
local result = exril_5101.wdcfg(en, timeout, level, width)
log.info("result", result)
result2
含义说明:当前配置信息表或错误信息;
如果返回的是配置信息表,则字段如下:
{
参数含义:看门狗状态;
数据类型:boolean;
取值范围:true/false;
注意事项:无;
参数名称:en
参数含义:喂狗超时时间;
数据类型:number;
取值范围:1-99999999秒;
注意事项:无;
参数名称:timeout
参数含义:超时动作电平;
数据类型:number;
取值范围:0/1;
注意事项:0:超时后拉低SWITCH
1:超时后拉高SWITCH;
参数名称:level
参数含义:脉冲宽度;
数据类型:number;
取值范围:10ms-10000ms;
注意事项:无;
参数名称:width
}
数据类型:table/string;
取值范围:当前配置信息表或错误信息;
注意事项:成功时返回当前配置信息表,失败时返回错误信息;
返回示例:成功返回:table
失败返回:错误信息
示例
-- 开启看门狗,45秒超时,超时后拉高SWITCH引脚持续500ms
local result = exril_5101.wdcfg(true, 45, 1, 500)
log.info("result", result)
-- 开启看门狗,使用默认配置
exril_5101.wdcfg(true)
-- 关闭看门狗
exril_5101.wdcfg(false)
-- 查询看门狗配置
local query_success, config = exril_5101.wdcfg()
if query_success then
log.info("看门狗配置:", json.encode(config))
log.info("是否开启:", config.en)
log.info("超时时间:", config.timeout, "秒")
log.info("电平状态:", config.level)
log.info("脉冲宽度:", config.width, "毫秒")
else
log.error("查询失败:", config)
end
4.10 exril_5101.wdfed(timeout)
功能
看门狗喂狗;
注意事项
1、必须在 AT 模式下执行此操作,执行前请先调用 exril_5101.mode(exril_5101.MODE_AT) 切换到 AT 模式;
2、配置看门狗后,需要定期调用此函数进行喂狗,否则看门狗会超时;
参数
timeout
参数含义:同步超时时长;
数据类型:number;
取值范围:1-10000,单位:ms;
是否必选:否;
注意事项:仅同步调用时有效,默认200ms;
返回值
local result = exril_5101.wdfed()
result
含义说明:看门狗喂狗是否成功;
数据类型:boolean;
取值范围:true/false;
注意事项:true表示看门狗喂狗成功,false表示看门狗喂狗失败;
返回示例:成功返回:true 失败返回:false
local result = exril_5101.wdfed()
log.info("result", result)
示例
local result = exril_5101.wdfed()
log.info("result", result)
4.11 exril_5101.wakeup(source, level, width, timeout)
功能
1、配置或查询 Air5101 模块的唤醒功能,用于配置模块如何唤醒主控设备;
2、当蓝牙连接断开或收到数据时,需要唤醒主控(通过 WAKEUP 引脚)以恢复主控的数据处理能力;
3、唤醒脉冲波形说明:
-
当唤醒事件发生时,WAKEUP 引脚会输出一个脉冲信号
-
脉冲的极性由 level 参数控制:
注意事项
1、必须在 AT 模式下执行此操作,执行前请先调用 exril_5101.mode(exril_5101.MODE_AT) 切换到 AT 模式;
2、配置唤醒功能后,函数会自动调用 exril_5101.save() 保存配置;
3、使用该功能前,请确保硬件连接正确,WAKEUP 引脚可用于唤醒主控。
参数
source
参数含义:唤醒源配置;
数据类型:number;
取值范围:0,1,2,3;
是否必选:否;
注意事项:默认值:0
0:禁用所有唤醒源
1:使能蓝牙连接断开作为唤醒源
2:使能蓝牙接收到数据作为唤醒源
3:同时使能蓝牙连接断开和蓝牙接收到数据作为唤醒源;
level
参数含义:唤醒电平;
数据类型:number;
取值范围:0/1;
是否必选:否;
注意事项:默认值:0
0:当唤醒事件发生时,拉低 WAKEUP
1:当唤醒事件发生时,拉高 WAKEUP
width
参数含义:复位脉冲宽度;
数据类型:number;
取值范围:10-10000,单位:ms;
是否必选:否;
注意事项:默认值:100
timeout
参数含义:同步超时时长;
数据类型:number;
取值范围:1-10000,单位:ms;
是否必选:否;
注意事项:仅同步调用时有效,默认200ms;
返回值
local result1,result2 = exril_5101.wakeup(source, level, width)
result1
含义说明:唤醒查询/设置是否成功;
数据类型:boolean;
取值范围:true/false;
注意事项:true表示唤醒查询/设置成功,false表示唤醒查询/设置失败;
返回示例:成功返回:true 失败返回:false
local result = exril_5101.wakeup(source,level, width)
log.info("result", result)
result2
含义说明:当前配置信息表或错误信息;
如果返回的是配置信息表,则字段如下:
{
参数含义:唤醒源配置;
数据类型:number;
取值范围:0,1,2,3;
注意事项:0:禁用所有唤醒源
1:使能蓝牙连接断开作为唤醒源
2:使能蓝牙接收到数据作为唤醒源
3:同时使能蓝牙连接断开和蓝牙接收到数据作为唤醒源;
参数名称:source
参数含义:唤醒电平;
数据类型:number;
取值范围:0/1;
注意事项:0:当唤醒事件发生时,拉低 WAKEUP
1:当唤醒事件发生时,拉高 WAKEUP;
参数名称:level
参数含义:脉冲宽度;
数据类型:number;
取值范围:10ms-10000ms;
注意事项:无;
参数名称:width
}
数据类型:table/string;
取值范围:当前配置信息表或错误信息;
注意事项:成功时返回当前配置信息表,失败时返回错误信息;
返回示例:成功返回:table
失败返回:错误信息
示例
-- 查询唤醒配置
local query_success, config = exril_5101.wakeup()
if query_success then
log.info("唤醒配置:", json.encode(config))
log.info("唤醒源:", config.source)
log.info("唤醒电平:", config.level)
log.info("唤醒脉宽:", config.width, "毫秒")
else
log.error("查询失败:", config)
end
-- 设置蓝牙连接唤醒,低电平,100ms脉宽
local set_success, set_message = exril_5101.wakeup(1, 0, 100)
if set_success then
log.info("唤醒功能设置成功:", set_message)
else
log.error("设置失败:", set_message)
end
4.12 exril_5101.save(timeout)
功能:
保存当前配置到 Flash,确保配置在设备重启后仍然有效;
注意事项:
1、必须在 AT 模式下执行此操作,执行前请先调用 exril_5101.mode(exril_5101.MODE_AT) 切换到 AT 模式;
2、配置参数后,建议调用此函数保存配置,以确保配置在设备重启后仍然生效;
3、exril_5101.set()、exril_5101.wdcfg() 、exril_5101.wakeup() 这三个接口会自动调用此函数保存配置;
参数:
timeout
参数含义:同步超时时长;
数据类型:number;
取值范围:1-10000,单位:ms;
是否必选:否;
注意事项:仅同步调用时有效,默认200ms;
返回值:
local result1 = exril_5101.save()
result
含义说明:是否保存成功;
数据类型:boolean;
取值范围:true/false;
注意事项:true表示保存成功,false表示保存失败;
返回示例:成功返回:true 失败返回:false
示例:
local result = exril_5101.save()
if result then
log.info("配置保存成功")
else
log.error("保存失败:")
end
4.13 exril_5101.send(data,wakeup_option, timeout)
功能:
向已连接的蓝牙主设备发送数据;
注意事项:
1、需要蓝牙已连接才能发送成功;
2、根据当前工作模式自动选择发送方式:
-
透传模式:发送数据,最大 MTU-3 字节(MTU 最大是 512,所以 data 最大是 509 字节);
-
AT 指令模式:使用 AT+BS 命令,最大 80 字节;
3、wakeup_option 内的 data 表示唤醒数据,可以在 Air5101 低功耗模式下,发送此数据来唤醒 Air5101:
-
≤ 115200:发送任意 1 个字节唤醒即可,后面可以加上回车换行,与后面真正要发的 AT 指令分隔开;
-
> 115200:此时基本不能通过串口数据来唤醒了,如果一定要用串口唤醒,需要发十六进制 0x00,这样单字节低电平持续时间最长(大于 115200 波特率的唤醒,低电平时间要持续 60uS 以上);
参数:
data
参数含义:要发送的数据;
数据类型:string;
取值范围:透传模式下,最大509字节;AT模式下,最大80字节;
是否必选:是;
注意事项:注意单包数据量大小;
wakeup_option
参数含义:唤醒Air5101配置;
该参数为 table 类型,字段如下:
{
参数含义:是否在发送数据前先唤醒Air5101;
数据类型:boolean;
取值范围:true/false;
是否必选:否;
注意事项:默认是false;
参数名称:enable
参数含义:唤醒数据;
数据类型:string;
取值范围:任意字符串;
是否必选:否;
注意事项:默认是"wakeup";
参数名称:data
参数含义:唤醒后延时多久再发送数据;
数据类型:string;
取值范围:1ms-100ms;
是否必选:否;
注意事项:默认是25ms(推荐值);
参数名称:delay
}
数据类型:table;
取值范围:暂无;
是否必选:否;
注意事项:若不提供此参数或提供空表,默认不唤醒;
timeout
参数含义:同步超时时长;
数据类型:number;
取值范围:1-10000,单位:ms;
是否必选:否;
注意事项:仅同步调用时有效,默认200ms;
返回值:
local result = exril_5101.send(data)
result
含义说明:是否发送成功;
数据类型:boolean;
取值范围:true/false;
注意事项:true表示发送成功,false表示发送失败;
返回示例:成功返回:true 失败返回:false
示例:
-- 1. 发送数据给已连接的蓝牙设备,不唤醒
local success, message = exril_5101.send("Hello, Bluetooth!")
if success then
log.info("数据发送成功")
else
log.error("发送失败:", message)
end
-- 2. 简单唤醒(使用默认的data和delay)
exril_5101.send("Hello", true)
-- 3. 唤醒并指定延时20ms(使用默认的data)
exril_5101.send("Hello", 20)
-- 4. 完整唤醒配置
exril_5101.send("Hello", {
enable = true,
data = "0x00", -- 唤醒数据
delay = 30 -- 延时30ms
})
4.14 exril_5101.on(callback)
功能:
注册蓝牙事件回调函数,用于接收和处理蓝牙相关事件;
注意事项:
1、此函数可以在任何模式下调用,不需要切换到 AT 模式;
2、首次注册回调函数时,会自动注册 URC 处理器;
3、多次调用此函数会覆盖之前注册的回调函数;
参数:
callback
参数含义:事件回调函数;格式为:
function callback(event, payload)
-- 用户代码
end
该回调函数接收 event和payload 两个参数,参数说明如下:
参数含义:事件类型
数据类型:string;
取值范围:"connected", "disconnected", "data";
是否必选:必选;
参数名称:event
参数含义:事件数据
该参数为 table 类型,字段如下:
{
参数含义:蓝牙连接状态;
数据类型:boolean;
取值范围:true/false;
注意事项:仅在 event 为 "connected" 或 "disconnected" 时存在;
参数名称:payload.connected
参数含义:收到的数据内容;
数据类型:string;
取值范围:任意字符串;
注意事项:仅在 event 为 "data" 时存在;在 AT 模式下会去掉 "AT:" 前缀;
参数名称:payload.data
参数含义:原始完整数据;
数据类型:string;
取值范围:任意字符串;
注意事项:仅在 event 为 "data" 时存在;包含完整的原始响应数据;
参数名称:payload.raw
参数含义:数据前缀;
数据类型:string/nil;
取值范围:字符串或 nil;
注意事项:仅在 event 为 "data" 时存在;在 AT 模式下会有前缀AT:;
参数名称:payload.prefix
参数含义:当前工作模式;
数据类型:string;
取值范围:"at" 或 "uart";
注意事项:仅在 event 为 "data" 时存在;表示数据接收时的工作模式;
参数名称:payload.mode
}
数据类型:table;
取值范围:暂无;
是否必选:必选;
参数名称:payload
数据类型:function;
取值范围:暂无;
是否必选:必选;
参数示例:-- 1. 定义蓝牙事件处理函数
function callback(event, payload)
-- 用户代码
end
-- 2. 注册蓝牙事件回调函数
exril_5101.on(callback)
返回值:
无;
示例:
-- 定义蓝牙事件处理函数
local function bluetooth_event_handler(event, payload)
log.info("蓝牙事件", "事件类型:", event)
if event == "connected" then
-- 连接成功
log.info("蓝牙事件", "蓝牙已连接")
elseif event == "disconnected" then
log.info("蓝牙事件", "蓝牙已断开")
elseif event == "data" then
log.info("蓝牙事件", "收到数据:", payload.data)
log.info("蓝牙事件", "当前模式:", payload.mode)
-- 处理收到的数据
end
end
-- 注册蓝牙事件回调函数
exril_5101.on(bluetooth_event_handler)
五、模组支持说明
支持 LuatOS 开发的所有产品都支持 exril-5101 扩展库,使用此扩展库需要接 Air5101 模块。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)