软件架构
TuyaOS 是基于组件化的概念设计的,提供了基础服务、安全、网络服务中间件、丰富的物联网业务功能组件,这些功能组件构成了 TuyaOS 的能力地图。TuyaOS 蓝牙开发框架就是基于 TuyaOS 的能力地图,按照蓝牙设备工作场景的能力需求,构建的不同规格的、适用于不同场景的 SDK 的集合。这些开发框架提供了统一的接口、丰富的组件能力,您无需关心具体的实现原理,调用接口函数即可快速开发产品功能,并提供了统一的开发体验。
根据上图可知,TuyaOS BLE 开发包
主要分为4层。
第1层是涂鸦核心适配层(Tuya Kernel Layer,TKL层),由涂鸦提供的TKL层标准接口和芯片原厂SDK组成,TKL层对上提供统一的接口,对下适配不同的芯片平台,适配工作可能由涂鸦开发人员完成,也可能由芯片原厂的开发人员完成。
第2层和第3层是涂鸦抽象层(Tuya Abstract Layer,TAL层),由各种组件组成,是开发包的主体部分,基本功能包括涂鸦配网、数据通信以及系统管理功能,高级服务包括天气服务、HID靠近响应、时间服务、共享设备,功耗管理,设备管理,网络能力等功能;
第4层是应用层,涵盖电工、照明、家电、传感、穿戴、门锁等多个领域,除了提供标准的产品例程以外,涂鸦还提供了标准 Demo 工程,标准 Demo 工程无需任何改动,即可直接编译烧录,为应用开发人员提供跨平台的应用开发体验,详见【蓝牙】TuyaOS 开发蓝牙产品之nRF52832实战。
软件运行流程
更多信息详见:设备初始化。
开发包目录
Demo 目录
此处展示的 Demo 是 TuyaOS BLE 开发包最基本的 Demo,开发者可以通过该 Demo 体验开发包支持的几乎所有功能,当然也可以基于该 Demo 开发任何产品。
app_dp_parser
DP 点解析例程,包含 DP 点接收函数和发送函数,开发人员可以在接收和发送之间添加业务逻辑。
app_key
按键例程,短按进入低功耗,长按恢复出厂设置。
app_led
LED 例程。
tuya_ble_protocol_callback
主要负责处理涂鸦蓝牙通信协议的事件回调处理以及相关的接口。
tuya_sdk_callback
主要负责 TuyaOS SDK 的事件回调处理、各级初始化以及大循环处理。
组件(含库)目录
组件是 TuyaOS BLE 开发包的主体部分,TuyaOS的目标就是实现代码的组件化,熟练地掌握常用组件的基本原理和实现方法对于产品开发可以达到事半功倍的效果。
tal_ble_bulkdata
实现大数据传输功能。
tal_ble_ota
实现OTA功能。
tal_ble_product_test
实现授权(产测)功能。
tal_ble_protocol
实现涂鸦 BLE 配网协议,内部开发人员请参考《Tuya BLE Communication Protocol》,其他使用人员无需关心实现细节,直接调用相关接口实现业务功能即可。接口介绍详见《涂鸦ble sdk说明》的 API介绍
和 CALL BACK EVENT 介绍
章节,其他内容请忽略 。
tal_ble_uart_common
实现串口通用对接功能。
tal_ble_weather
实现查询天气功能。
tal_bluetooth
实现蓝牙相关接口封装。
tal_driver
实现驱动相关接口封装。
tal_key
实现按键功能。
tal_oled
实现 OLED 屏幕驱动功能。
tal_sdk_test
实现测试功能。
tal_system
实现系统相关接口封装。
tal_utc
实现 UTC 相关接口。
tal_util
实现通用工具接口。
tal_ble_mbedtls
实现 AES 和 MD5 等加密接口。
tal_ble_secure
实现 涂鸦 BLE 配网协议相关的安全接口。
Vender 目录
Vender 是开发环境所在目录,包含芯片原厂 SDK、各类适配层以及通用头文件,由涂鸦和芯片原厂共同维护。
芯片原厂 SDK
基于芯片原厂的公开例程开发或由芯片原厂开发人员修改而来。
各类适配层
涉及蓝牙、外设驱动(GPIO、PWM、ADC、IIC、SPI……)、系统驱动(Memory、OTA、Sleep……)、工具接口的适配。
通用头文件
为保证 TKL 层以上能够达到一套代码适用于多个芯片平台的目标,Flash 地址、外设引脚等平台相关的因素都通过统一的宏定义放置于 board.h中。
头文件目录
tuya_error_code.h
涂鸦对错误类型的定义。
tuya_cloud_types.h
涂鸦对数据类型、枚举、宏、结构体的定义。
tuya_iot_config
涂鸦对系统配置、组件使能/配置的定义。
常用 API
初始化
tuya_init_first()
一般用于基础外设、配置信息、内存处理相关的初始化。
tuya_init_second()
一般用于 Log、软定时、蓝牙基础协议相关的初始化。
tuya_init_third()
一般用于复杂外设、外设组件相关的初始化。
tuya_init_last()
一般用于初始化的收尾工作,包含蓝牙配网协议的初始化、测试代码的初始化、开启广播等动作。
在执行完该 API 之后,一般会进入主循环。
tuya_ble_protocol_init
蓝牙配网协议的初始化。
主循环
tuya_main_loop()
TuyaOS BLE 开发包基于前后台软件框架,提供了主循环内的回调接口 tuya_main_loop()
,开发者可依据需求自定义相关操作注入该接口。
注意:
(1)该接口的返回值会影响低功耗功能,请勿随意修改;
(2)该接口主要用于开发者添加调试、验证性的操作,需谨慎使用。该接口占用过多时间片会影响整个系统框架的稳定性!
事件回调
tuya_ble_evt_callback
蓝牙基础协议事件回调处理函数,包含协议栈初始化完成、连接、断开、连接参数更新、接收数据等蓝牙基础事件。
tuya_ble_protocol_callback
蓝牙配网协议事件回调处理函数,包含配网成功、时间戳更新成功、接收应用数据、解绑成功、接收OTA数据等应用层常用功能。
数据收发
TUYA_BLE_CB_EVT_DP_DATA_RECEIVED
应用层数据接收回调,接收的数据符合 DP 数据格式,请参考 DP 点
小节
tuya_ble_dp_data_send
应用层数据发送函数
tuya_ble_dp_data_with_time_send
应用层数据发送函数(带时间戳)
TAL_BLE_EVT_WRITE_REQ
蓝牙基础数据接收回调
tal_ble_server_common_send
蓝牙基础数据发送函数
状态查询
tuya_ble_connect_status_get()
Code: Select all
typedef enum {
UNBONDING_UNCONN = 0, //未绑定未连接
UNBONDING_CONN, //未绑定已连接已认证
BONDING_UNCONN, //已绑定未连接
BONDING_CONN, //已绑定已连接已认证
BONDING_UNAUTH_CONN, //已绑定已连接未认证
UNBONDING_UNAUTH_CONN, //未绑定已连接未认证
UNKNOW_STATUS
} tuya_ble_connect_status_t;
各状态之间的转换关系如下图所示:
常用功能
蓝牙数据流
下图演示了 BLE 数据在 SDK 中的流转过程,其他过程类似。
表格形式,方便复制
手机发送数据 | 手机接收数据 |
---|---|
TKL:芯片原厂 BLE 数据接收回调 + tkl_ble_gatt_evt_func | tkl_ble_gatts_value_notify + 芯片原厂 BLE 数据发送函数 |
TAL:TKL_BLE_GATT_EVT_WRITE_REQ + tal_ble_event_callback | tal_ble_server_common_send |
TUYA:TAL_BLE_EVT_WRITE_REQ + tuya_ble_gatt_receive_data | tuya_ble_gatt_send_data |
接收单包:TUYA_BLE_EVT_MTU_DATA_RECEIVE + tuya_ble_handle_ble_data_evt | tuya_ble_gatt_send_data_enqueue + tuya_ble_gatt_send_data_handle |
tuya_ble_commonData_rx_proc,组包,解密 | tuya_ble_commData_send,组包,加密 |
接收指令:TUYA_BLE_EVT_BLE_CMD + tuya_ble_handle_ble_cmd_evt | TUYA_BLE_EVT_DP_DATA_SEND - tuya_ble_handle_dp_data_send_evt |
tuya_ble_evt_process,指令分发 | tuya_ble_dp_data_send |
FRM_DP_DATA_WRITE_REQ + tuya_ble_handle_dp_data_write_req | app_dp_report |
TUYA_BLE_CB_EVT_DP_DATA_RECEIVED + app_dp_parser | ↑ |
→ | → |
测试代码
开启测试代码 - 设置宏 TUYA_SDK_TEST 的值为 1。
关闭测试代码 - 设置宏 TUYA_SDK_TEST 的值为 0。
测试代码结合测试上位机(Logic)可实现大部分配网、通信、外设等功能的测试,可帮助开发者更好的开发产品,但是生产固件请务必关闭测试功能。
Log 管理
上图链接 方便复制
ENABLE_LOG
BOARD_ENABLE_LOG
Log 输出接口
tuya_log_output_cb
动态内存
动态内存的大小:BOARD_HEAP_SIZE
关于驱动
涂鸦通过 TKL 层提供了最小功能集所需的驱动接口,TKL 只是涂鸦标准化的接口,并非所有驱动都有 TKL。
为保证开发效率,如果 TKL 层对应的驱动没有实现或者没有相关驱动,开发者可以按照实际需求直接调用芯片原厂提供的接口。