更新时间:2023-12-11 07:46:31下载pdf
TuyaOS Bluetooth Mesh SDK 支持同品类间设备创建群组且建议多使用群组控制。相对于逐个设备控制,群组控制可以做到更快速、更稳定、更高成功率。
Mesh 设备群组采用订阅机制,设备订阅一个群组地址后,当收到数据的目的地址为此群组地址时,Network 层会将数据传输到更上层进行处理,否则将会根据数据包内规则,将数据 Relay 出去而不做任何处理。因此,在给设备添加群组时,即给设备发送一个群组地址,让设备订阅此群组地址。
群组订阅是以 model 维度的,不同 Element 或同一个 Element 中不同的 Model 可以独立订阅不同的群组地址。
TuyaOS Bluetooth Mesh SDK 支持最多订阅 32 个群组。每个 Mesh 网络支持的最多群组数量为群组地址的限制,群组地址的范围为:0xC000
- 0xFEFF
。
本小节介绍 Mesh Specification 规定的群组订阅/删除命令数据格式,群组相关命令在 SDK 内的 Config Model 中实现,应用无需操作。应用要给自身订阅群组时,可以参考下文的 API 说明,调用接口为设备自身相关 Element 的 Model 订阅指定的群组。
TAL_MESH_MODEL_SUB_ADD_T
typedef struct {
USHORT_T element_addr;
USHORT_T addr;
UINT_T model_id; /**< 2 bytes or 4 bytes */
} PACKED TAL_MESH_MODEL_SUB_ADD_T;
element_addr
:命令接收端的 Element Address。一个设备内可能有多个 Element,不同 Element 的不同 Model 可以独立订阅不同的地址。
addr
:需要订阅的群组地址。
model_id
:订阅此群组地址的 Model。
TAL_MESH_MODEL_SUB_DELETE_T
typedef struct {
USHORT_T element_addr;
USHORT_T addr;
UINT_T model_id; /**< 2 bytes or 4 bytes */
} PACKED TAL_MESH_MODEL_SUB_DELETE_T;
element_addr
:命令接收端的 Element Address。一个设备内可能有多个 Element,不同 Element 的不同 Model 可以独立订阅不同的地址。
addr
:需要删除的群组地址。
model_id
:删除此群组地址的 Model。
TAL_MESH_MODEL_SUB_STATUS_T
Opcode
:0x801F
typedef struct {
UCHAR_T status;
USHORT_T element_addr;
USHORT_T addr;
UINT_T model_id; /**< 2 bytes or 4 bytes */
} PACKED TAL_MESH_MODEL_SUB_STATUS_T;
status
:群组添加结果。
element_addr
:命令接收端的 Element Address。一个设备内可能有多个 Element,不同 Element 的不同 Model 可以独立订阅不同的地址。
addr
:需要删除的群组地址。
model_id
:删除此群组地址的 Model。
SDK 内提供 API 来供您使用,给设备自身配置群组或者查询当前群组的配置状态。
利用这些接口,可以实现设备间的联动。例如,A 设备向 0xC010
群组地址发送数据,B/C 设备订阅 0xC010
地址,则可以收到 A 设备发送的数据,实现 A -> B/C 的联动控制。
#define MESH_IS_GROUP_ADDR(addr) (((addr) & 0xC000) == 0xC000)
通过此宏定义,可以判断地址是否为合法的群组地址。
#define TAL_MESH_OPCODE_CFG_MODEL_SUB_ADD (0x801B)
#define TAL_MESH_OPCODE_CFG_MODEL_SUB_DELETE (0x801C)
OPERATE_RET tal_group_addr_sub_set(UINT_T opcode, USHORT_T ele_index, USHORT_T group_addr);
通过此 API,可以为设备自己订阅或者删除指定群组地址。
USHORT_T* tal_group_addr_sub_list_get(USHORT_T ele_idx, UINT_T model_id);
通过此 API,可以获取设备当前 Element 订阅的群组地址列表,接口返回值为列表的指针,列表为 UINT16_T
类型,长度为 32。
获取到返回的群组地址后,可以通过前文的宏定义来判断是否为合法的群组地址。
群组控制使用的 opcode
与单个设备控制不同,为 unack 命令,即设备无需回复。这样做是因为如果群组内设备比较多,群组控制后如果所有设备一起回复会造成网络阻塞与大量丢包。即使回复中增加随机延时,在群组内设备数量较大时,仍无法保证不丢包。
注意:群组控制之后不要回复设备状态,也不要发送其他会引起网络风暴的数据包。
群组控制后设备不回复状态,就会造成 App 上与设备状态不同步问题。目前,涂鸦提供以下方案解决此问题:
App 在群组控制后,默认将群组内设备 DP 进行更新。
网关在群组控制后,以队列的方式来按顺序查询群组内被控制的 DP 的状态,并将设备回复的状态同步到 App 与云端,以此来实现设备群组控制后的状态同步。
该内容对您有帮助吗?
是意见反馈该内容对您有帮助吗?
是意见反馈