前言
- 个人邮箱:zhangyixu02@gmail.com
- 这里将会介绍合宙的蓝牙广播功能,并且实现 ibeacon 功能。
- 学习本文之前,建议先看合宙 Air724UG 开发板快速上手
ibeacon 报文结构
BLE 广播报文结构
- 首先我们来看看 BLE 广播报文结构体如下,需要注意的是,一个 BLE 广播包必须存在 0x01 类型的广播数据,该广播主要是用于指示当前设备能进行的一些行为。因此 AD Structure 1 必须是 0x01 类型广播。
ibeacon 报文结构
- 接下来的 AD Structure 2 就是 ibeacon 的数据包格式。从下图我们即可看出,我们正在要关心和修改的地方只有如下四个。对于一部分人而言,Company ID 甚至也不需要管。
- Company ID : 设备公司名
- UUID : 用于唯一标识应用场景
- Major : 用户自定义的主要值,用于分组或区域标识
- Minor : 用户自定义的次要值,用于更精细的分组或区域标识
实验
代码
- 创建 main.lua 文件,里面写入如下内容。
PROJECT = "ibeacon" -- 工程名字
VERSION = "0.0.1" -- 项目版本
sys = require"sys"
---------------- 这里写应用程序代码 ----------------
sys.timerLoopStart(print,1000,"hello world") -- 每隔 1s 打印一次
require "beacon" -- ibeacon
--------------------------------------------------
sys.run()
- 创建 beacon.lua 文件,里面写入如下内容。
--- 模块功能:蓝牙功能测试
-- @author openLuat
-- @module bluetooth.beacon
-- @license MIT
-- @copyright openLuat
-- @release 2020.09.27
-- @注意 需要使用core(Luat_VXXXX_RDA8910_BT_FLOAT)版本
module(..., package.seeall)
local function init()
log.info("bt", "init")
rtos.on(rtos.MSG_BLUETOOTH, function(msg)
if msg.event == btcore.MSG_OPEN_CNF then
sys.publish("BT_OPEN", msg.result) --蓝牙打开成功
end
end)
end
local function poweron()
log.info("bt", "poweron")
btcore.open(0) --打开蓝牙从模式
_, result = sys.waitUntil("BT_OPEN", 5000) --等待蓝牙打开成功
end
local function advertising()
log.info("bt", "advertising")
--btcore.setadvparam(0x80,0xa0,0,0,0x07,0,0,"11:22:33:44:55:66") --广播参数设置 (最小广播间隔,最大广播间隔,广播类型,广播本地地址类型,广播channel map,广播过滤策略,定向地址类型,定向地址)
btcore.setbeacondata("AB8190D5D11E4941ACC442F30510B408",10107,50179) --beacon设置 (uuid,major,minor),默认公司为 Microsof
-- btcore.setadvdata(string.fromHex("0201061AFF06000215AB8190D5D11E4941ACC442F30510B408277BC403C5")) --通过设置广播包接口设置 beacon, Microsof 公司
-- btcore.setadvdata(string.fromHex("0201061AFF4C000215AB8190D5D11E4941ACC442F30510B408277BC403C5")) -- 通过设置广播包接口设置 beacon,公司修改为 apple
btcore.advertising(1)-- 打开广播
end
local ble_test = {init, poweron,advertising}
sys.taskInit(function()
for _, f in ipairs(ble_test) do
sys.wait(5000)
f()
end
end)
程序烧录
进入下载模式
数据线连接开发板的 USB 口。
按住下载模式按键,不要松手,插入电脑,然后松手。
- 此时电脑打开设备管理器,能够发现增加了一个端口。
程序下载
- 打开 LuaTools ,选择 4G模块USB打印,然后点击项目管理测试。
- 我们查阅 Air724UG LuatOS固件版本 说明 知道,只有
Luat_RDA8910_BT_FLOAT
和Luat_RDA8910_RBTTSQRLLSDFT
者两个底层 core 兼容蓝牙。
- 这里我们选择底层core
Luat_RDA8910_BT_FLOAT
。
- 按照如下步骤将两个
lua
文件包含进来。
- 按照下图将对应选项勾选,然后点击下载底层和脚本。
现象
- 下载完成之后,设备管理器中端口将会出现 4 个设备。
之后我们每秒可以看到一次
hello world
。
当看到
[bt] advertising
时候,我们在手机端打开 nRF Connect。进行如下设置
- 之后我们即可扫描到一个 Beacon 设备,展开后信息如下。
用法说明
初始化注册蓝牙消息回调函数
- 如下方法为注册一个蓝牙消息的回调处理函数。
local function init()
log.info("bt", "init")
rtos.on(rtos.MSG_BLUETOOTH, function(msg)
if msg.event == btcore.MSG_OPEN_CNF then
sys.publish("BT_OPEN", msg.result) --蓝牙打开成功
end
end)
end
打开蓝牙
- 当蓝牙初始化完成后,需要调用如下函数进行打开。
local function poweron()
log.info("bt", "poweron") -- 打印 [I]-[bt] poweron
btcore.open(0) --打开蓝牙从模式
_, result = sys.waitUntil("BT_OPEN", 5000) --等待蓝牙打开成功,时间为 5s
end
设置广播参数
- 这里是用于设置广播的内容。根据上面的报文结构我们可知真正需要关心的内容只有 Company ID、UUID 、Major 、Minor这四个参数,而Company ID对于绝大多数开发者而言,也是可以忽略的。
- 当我们不关心Company ID时候,我们直接调用
btcore.setbeacondata()
函数即可。这个方法是比较推荐的。 - 如果开发者对 BLE 的广播报文结构很清晰,并且希望获取更大的灵活性,那么就可以使用
btcore.setadvdata()
函数来进行设置。
local function advertising()
log.info("bt", "advertising")
--btcore.setadvparam(0x80,0xa0,0,0,0x07,0,0,"11:22:33:44:55:66") --广播参数设置 (最小广播间隔,最大广播间隔,广播类型,广播本地地址类型,广播channel map,广播过滤策略,定向地址类型,定向地址)
btcore.setbeacondata("AB8190D5D11E4941ACC442F30510B408",10107,50179) --beacon设置 (uuid,major,minor),默认公司为 Microsof
-- btcore.setadvdata(string.fromHex("0201061AFF06000215AB8190D5D11E4941ACC442F30510B408277BC403C5")) --通过设置广播包接口设置 beacon, Microsof 公司
-- btcore.setadvdata(string.fromHex("0201061AFF4C000215AB8190D5D11E4941ACC442F30510B408277BC403C5")) -- 通过设置广播包接口设置 beacon,公司修改为 apple
btcore.advertising(1)-- 打开广播
end
API 说明
- 我们可以阅读 合宙官方 API 介绍文档:BLE 蓝牙功能 文档得知相关 API 的使用方法。