beacon
# 简介
Beacon是建立在低功耗蓝牙协议基础上的一种广播协议,同时它也是拥有这个协议的一款低功耗蓝牙设备(从机)。作为一款Beacon设备,它通常是放在室内的某个固定位置,借此向周围进行连续性广播,但是它不能和任何低功耗蓝牙主机进行连接。所有广播数据在特定规则下进行排列。
# API说明
以下API是模块BLE beacon(从机)用到的接口,其余接口及具体接口参数说明和用法请到API说明章节和demo内查看并学习
| API接口 | 描述 |
| ------------------------- | -------------------------------------- |
| btcore.open() | 打开蓝牙 |
| btcore.close() | 关闭蓝牙 |
| btcore.state() | 查询蓝牙状态(开启或者关闭) |
| btcore.setadvparam() | 设置广播参数 |
| btcore.advertising() | 蓝牙广播开关 |
| btcore.getaddr() | 获取本机蓝牙MAC地址 |
BLE从设备模式用到的蓝牙消息
| API接口 | 描述 |
| ------------------------- | -------------------------------------- |
| MSG_OPEN_CNF | 蓝牙打开成功 |
| MSG_CLOSE_CNF | 蓝牙关闭成功 |
> 详细的API介绍见[btcore API章节](https://doc.openluat.com/wiki/21?wiki_page_id=2244)
# 实现流程
- 注册蓝牙消息回调函数
通过rtos.on() 注册蓝牙消息回调函数
- 打开蓝牙
使用btcore.open(0)打开蓝牙从设备模式
- 设置广播参数
使用btcore.setadvparam()来设置广播参数,如果没有设置,则使用默认的广播参数
- 设置beacon广播数据
使用btcore.setbeacondata()设置beacon广播数据:uuid, major, minor
UUID :这是将你所有的beacon与其他人的beacon设备区别开的id!例如,目前在商店里某个区域分布着多个beacon形成一条“链带”,用于为顾客提供特定的服务,那么归属于同一条“链带”的beacon将分配到相同的proximity UUID。为这条“链带”设计的专用应用程序将会在后台使用这个UUID扫描到这条“链带”中的beacon设备。
major 编号:用于将相关的beacon标识为一组。例如,一个商店中的所有beacon将会分配到相同的major编号。通过这种方式,应用程序就能够知道顾客位于哪一家商店。
minor 编号:用于标识特定的beacon设备。例如一个商店中的每一个beacon设备都拥有唯一的minor编号,这样你才能够知道顾客位于商店中的哪个位置。
- 开启蓝牙广播
使用btcore.advertising()来打开广播
# 示例
相关实例程序在脚本库的demo\bluetooth文件夹下,包含主机、从机、becaon和经典蓝牙。可以根据实际需要选择demo进行研究。
**初始化注册蓝牙消息回调函数**
以\script_LuaTask_V2.3.9\demo\bluetooth\slave.lua作为基础进行修改。首先使用rtos.on()注册蓝牙消息的回调处理函数。
```lua
local function init()
log.info("bt", "init")
rtos.on(rtos.MSG_BLUETOOTH, function(msg)
if msg.event == btcore.MSG_OPEN_CNF then
sys.publish("BLE_OPEN", msg.result) --蓝牙打开成功
end
end)
end
```
**打开蓝牙**
```lua
local function poweron()
log.info("bt", "poweron")
btcore.open(0) --打开蓝牙从模式
--蓝牙打开后,在上面的消息回调内会有蓝牙打开成功的消息上报
--在这里阻塞住,当收到蓝牙打开成功消息时退出阻塞
sys.waitUntil("BLE_OPEN")
end
```
***注意:接口返回成功不一定是打开成功,需要等待蓝牙打开成功的消息***
**设置蓝广播参数,beacon数据包、打开广播**
```lua
local function advertising()
log.info("bt", advertising")
--btcore.setadvparam(0x80,0xa0,0,0,0x07,0,0,"11:22:33:44:55:66")
--btcore.setbeacondata(uuid, major, minor)
btcore.setbeacondata("AB8190D5D11E4941ACC442F30510B408", 10107, 50179)
btcore.advertising(1) --打开广播
end
```
**将以上几个函数结合执行一下,模块蓝牙即可向周围广播beacon数据**
```lua
sys.taskinit(
function()
init()
poweron()
advertising()
end
)
```
# 注意事项
使用手机、电脑与模块低功耗蓝牙进行测试时,需要使用专门的低功耗蓝牙调试软件
手机低功耗蓝牙调试软件这里推荐使用nRF Connect
[nRF Connect下载及使用教程](https://hmi.wiki.luatos.com/doc/65042949/e6zPC3k9/sivVjmZk)