群组

更新时间: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

Opcode0x801F

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。

API 说明

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,可以为设备自己订阅或者删除指定群组地址。

群组订阅 List 查询

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 与云端,以此来实现设备群组控制后的状态同步。