蓝牙 Beacon Mesh 软件介绍

更新时间:2024-07-30 03:10:20下载pdf

TuyaOS 是基于组件化的概念设计的,提供了基础服务、安全、网络服务中间件和丰富的物联网业务功能组件,这些功能组件构成了 TuyaOS 的能力地图。TuyaOS 蓝牙开发框架就是基于 TuyaOS 的能力地图,按照蓝牙设备工作场景的能力需求,构建的不同规格的、适用于不同场景的 SDK 的集合。这些开发框架提供了统一的接口、丰富的组件能力,您无需关心具体的实现原理,调用接口函数即可快速开发产品功能,并提供了统一的开发体验。

软件架构

蓝牙 Beacon Mesh 软件介绍

根据上图可知,TuyaOS Beacon Mesh 开发包 主要分为 4 层。

  • 第 1 层是涂鸦核心适配层(Tuya Kernel Layer,TKL 层),由涂鸦提供的 TKL 层标准接口和芯片原厂 SDK 组成,TKL 层对上提供统一的接口,对下适配不同的芯片平台,适配工作可能由涂鸦开发人员完成,也可能由芯片原厂的开发人员完成。

  • 第 2 层和第 3 层是涂鸦抽象层(Tuya Abstraction Layer,TAL 层),由各种组件组成,是开发包的主体部分,基本功能包括涂鸦配网、数据通信以及系统管理功能。

  • 第 4 层是应用层,涵盖照明、电工、传感、遥控器、无线开关等多个领域,除了提供标准的产品例程以外,涂鸦还提供了标准 Demo 工程,标准 Demo 工程无需任何改动,即可直接编译烧录,您可参考 Demo 来实现更复杂的应用。

软件运行流程

蓝牙 Beacon Mesh 软件介绍

更多信息,参考 能力地图 - 设备初始化

开发包目录

蓝牙 Beacon Mesh 软件介绍

Demo 目录

➜ tuyaos_demo_beaconmesh_peripheral_phy6252 git:(master) ✗ tree
.
| -- app_config.h
| -- include
| `-- app_led.h
| -- src
| | -- app_led.c
| `-- main.c
`-- tuya_iot.config

此处展示的 Demo 是 TuyaOS Beacon Mesh 开发包最基础的 Demo,您可以通过该 Demo 体验开发包支持的几乎所有功能,也可以基于该 Demo 开发更加复杂的应用功能。

main.c

Demo 应用初始化以及基础的 Beacon Mesh 数据收发、状态回调。Demo 以 1 路灯为例展示了如何使用 Beacon Mesh SDK。

app_led.c

包含 1 路灯的应用层业务逻辑,包含三次上电重置设备等功能。

组件目录

➜ components git:(master) ✗ tree -L 1
.
| -- tal_sdk_test
`-- tal_xfifo

➜ libs git:(master) ✗ tree
.
| -- libtal_beacon2.lib
`-- libtal_xxtea.lib

tal_sdk_test

外设测试相关组件,里面包含关于外设的测试代码。

tal_gpio_test

实现涂鸦产测工具 GPIO 测试功能。

tal_xfifo

一个简单的、支持多实例的队列组件。

libtal_beacon2.lib

Beacon Mesh 协议栈库。

libtal_xxtea.lib

一种简单的加密算法库。

Vendor 目录

➜ phy6252_adv git:(master) ✗ tree -L 2
.
| -- sdk                     # 芯片原厂 SDK
| `-- phy6252_adv_sdk
| -- toolchain               # 芯片烧录原厂工具和工程模板
| | -- software
| `-- templates
| -- tuyaos                  # 各类适配层
| | -- bluetooth               # 蓝牙 Beacon 收发适配层
| | -- drivers                 # 外设驱动适配层
| `-- include                 # board.h 头文件
| -- README.md
| -- prepare.py
| -- release_note.md
`-- toolchain.yaml

Vendor 是开发环境所在目录,包含芯片原厂 SDK、各类适配层以及通用头文件,由涂鸦和芯片原厂共同维护。

芯片原厂 SDK

基于芯片原厂的公开例程开发或由芯片原厂开发人员修改而来。

各类适配层

涉及蓝牙、外设驱动(GPIO、PWM、ADC、IIC、SPI……)、系统驱动(Memory、OTA、Sleep……)、安全加密与 Hash 接口(AES、MD5)、工具接口的适配。

通用头文件

为了保证 TKL 层以上能够达到一套代码适用于多个芯片平台的目标,Flash 地址、外设引脚等平台相关的因素都通过统一的宏定义放置于 board.h 中。

头文件目录

蓝牙 Beacon Mesh 软件介绍
  • tuya_error_code.h:涂鸦对错误类型的定义。

  • tuya_iot_config:涂鸦对系统配置、组件使能/配置的定义。

常用 API

初始化

tuya_init_first()

一般用于基础外设、配置信息、内存处理相关的初始化。

tuya_init_second()

一般用于 Log、软定时、蓝牙基础协议相关的初始化。

tuya_init_third()

一般用于复杂外设、外设组件相关的初始化。

tuya_init_last()

一般用于初始化的收尾工作,包含蓝牙配网协议的初始化、测试代码的初始化、开启广播等动作。

在执行完该 API 之后,一般会进入主循环。

ty_beacon2_node_init

Beacon Mesh 协议栈初始化。

ty_beacon_remoter_init

Beacon Mesh 支持遥控器初始化。

主循环

tuya_main_loop()

TuyaOS Beacon Mesh 开发包基于前后台软件框架,提供了主循环内的回调接口 tuya_main_loop(),您可依据需求自定义相关操作注入该接口。

注意:该接口主要用于添加调试、验证性的操作,需 谨慎使用。如果该接口占用过多时间片,会影响整个系统框架的稳定性。

事件回调

ty_beacon2_event_cb

Beacon Mesh 基础协议事件回调处理函数,包含配网成功、重置、误重置恢复、添加群组、删除群组、遥控器対码、遥控器解绑等基础事件。

数据接收

app_dps_download

Beacon Mesh 收到手机、网关和遥控器的控制命令时的回调函数,直接到 DP 级别。

void app_dps_download(u8 dpid, u8 dpty, u8 dplen, u8 *dpvalue, beacon_frame_s *p_frame){
    PR_DEBUG("dpid=%d dpty=%d, dplen=%d, dpvalue=[",dpid,dpty,dplen);
    PR_DEBUG_HEX_ARRAY(dpvalue,dplen);
    PR_DEBUG_RAW("]\n");
    switch(dpid){
        case 0x01://onoff
        case 101:
            app_led_onoff(dpvalue[0]);
            break;
        case 0x02://mode:white,color,scene,music
            break;
        default:
            break;
    }
}

数据发送

函数 u8 frame_send(u8 head, u16 dst, u8 subcmd, u8* payload, u8 *key, u8 ttl); 高级封装包发送
作用 Beacon Mesh 协议栈最底层发包函数,直接将 payload 数据发送到目标地址,并且可以设置最大为 3 的 TTL。

注:应用 Demo 中单独介绍如何使用该最底层发包函数,封装出发送不同类型 DP、发送心跳等更应用的函数。

注:再次调用会直接打断上一次的发包,进行全新一次的发包
/
入参 u8 head 数据包 head
-> u16 dst 目的地址
-> u8 subcmd 数据包子命令
-> u8* payload 数据包数据字段
-> u8 *key 数据包秘钥
-> u8 ttl 跳数

示例:
DP 上报函数:

u8 payload[16];
memset(payload,0,16);
payload[0] = 1;//dp id = 1
payload[1] = 0x11;//dp kind = 1; dp len = 1 (各占 4bits)
payload[2] = led_onoff;//dp value
frame_send(0x08, 0x8000, 0x0A, payload, beacon_dev.beaconkey, 3);

注意:手机的接收窗口一般在手机下发命令之后的几十秒时间,这意味着如果没有网关的 Beacon 上报方案,则受限于窗口打开的时机。网关的接收会常开,没有这一点的限制。

设备重置

函数 u8 ty_beacon2_node_reset(u8 is_not_recovery, u32 pair_timeout_us) -
作用 一旦调用,整个系统进入待配网状态 -
入参 u8 is_not_recovery 配网超时后是否恢复为之前的已配网状态
-> u32 pair_timeout_us 配网超时时间,单位是 μs

设备配网使能

函数 u8 ty_beacon2_node_pair_start(u32 timeout_us) -
作用 一旦调用,整个系统进入待配网状态 -
入参 u32 timeout_us 设置配网超时时间

获取设备当前配网状态

可通过 beacon_dev.state 获取,用户主要关注的是两个状态:

  • #define STATE_NOT_PAIRED 0
  • #define STATE_PAIRED 1
  • #define STATE_PAIRING 2(无需关注)

Beacon Mesh 设备有两种状态:正在配网状态和已配网状态。

  • 调用开始配网函数或者设备重置函数,都会导致设备从已经配网状态切换到正在配网状态。
  • 如果配网超时,会使设备从正在配网状态变为设备不可控制的已经配网状态。

常用功能

LOG 开启

Demo 中 Log 默认是关闭的,可以在 tuya_iot_config.h 中修改实现 #define APP_LOG_ENABLE 1,使用 tkl_uart 中接口输出日志,已经打成 lib 的组件是没有日志的。如果有问题需要调试,请联系涂鸦开发人员。

备注:某些平台开 Log 比较特殊。

  • PHY6230 平台:在 .log 中用 CDK 打开工程,打开工程设置(魔术棒按钮),进入 Compiler 选项卡,将 Define(-D) 中的 _DEF_DEBUG_INFO_ 改为 3
  • PHY6252 遵循通用的 tuya_iot_config.h 方法。

关于驱动

涂鸦通过 TKL 层提供了最小功能集所需的驱动接口,TKL 只是涂鸦标准化的接口,并非所有驱动都有 TKL。

为了保证开发效率,如果 TKL 层对应的驱动没有实现或者没有相关驱动,您可以按照实际需求,直接调用芯片原厂提供的接口。