设备群组业务实现

更新时间:2024-04-24 03:47:32下载pdf

业务能力介绍

设备群组业务能力包括:

  • 获取能组成群组的设备列表
  • 创建群组
  • 编辑群组
  • 删除群组

实现群组业务

前置条件

在涂鸦体系下,只有当前用户权限是 家庭管理员及以上设备支持创建群组 时,才能实现设备群组业务。

设备是否支持群组

  // 查看设备是否支持创建群组
  DeviceBean deviceBean = ThingGroupCoreKit.INSTANCE.getDeviceBean(deviceId);
  boolean supportGroup = deviceBean.isSupportGroup();

是否为家庭管理员及以上

查看用户的权限是否为家庭管理员及以上。接入 家庭成员管理业务拓展 SDK,并按照以下代码查看用户权限。

  // 查看当前用户的权限
  var mMemberUseCase : IMemberUseCase = FamilyManagerCoreKit.getMemberUseCase()
  mMemberUseCase.getMemberInfo(11,111,object :IFamilyMemberDataCallback<MemberBean>{
      override fun onSuccess(result: MemberBean?) {
        /**
         * 0:家庭所有者 MemberRole.ROLE_OWNER
         * 1:家庭管理员 MemberRole.ROLE_ADMIN
         * 2:家庭普通成员 MemberRole.ROLE_MEMBER
         */
        result?.role
      }

      override fun onError(errorCode: String?, errorMessage: String?) {

      }
    })

步骤 1:初始化管理类

当满足上述条件之后,在实现设备群组业务之前,需要根据设备 ID 或群组 ID 完成初始化工作,并获取群组业务管理类 ThingGroupBizManager。后续所有群组业务接口的调用,均通过该管理类来完成。

  // 已存在的群组,通过 groupId 进行初始化
  val initBuilder = GroupInitBuilder.Builder()
                      .setGroupId(groupId)
                      .build()

  // 未创建群组之前,通过 devcieId 进行初始化
  val initBuilder = GroupInitBuilder.Builder()
                      .setDevId(deviceId)
                      .build()
  val thingGroupBizManager = ThingGroupBizKit.getGroupBizManager(homeId,initBuilder)
  • 初始化时,需要传入当前群组或设备所属家庭 ID。
  • 不同方式初始化得到的管理类不能交叉使用。例如,通过设备 ID 初始化得到管理类,调用 fetchDeviceList()createGroup() 接口之后创建了一个群组。对该群组的编辑和和删除,需要通过 groupId 重新初始化一个管理类,调用 updateGroup()dismissGroup() 来完成。否则会出现异常。

步骤 2:查询设备列表

完成初始化并获取 ThingGroupBizManager 之后,就可以调用 fetchDeviceList() 接口,查询可与当前群组或设备组成群组的设备列表。

    val operateBuilder = GroupOperateBuilder.Builder()
        .setQueryDeviceCallback(object : QueryDeviceCallback {
            override fun result(list: List<GroupInfo>) {
                /**
                 *
                 * 通过群组 ID 查询到的设备列表:包含已在群组中的设备和可添加到群组的设备。
                 * 通过 GroupInfo 中的 checked 字段区分。
                 *
                 * 通过设备 ID 查询到的设备列表:包含其本身和可与当前设备组成群组的设备
                 *
                 */
            }

        })
        .setFailureCallback(object : FailureCallback {
            override fun onError(
                errorCode: String?,
                errorMessage: String?,
                groupId: Long,
                failDevices: List<GroupResult>?
            ) {

            }

        })
        .build()
    thingGroupBizManager?.fetchDeviceList(operateBuilder)

步骤 3:创建群组

在调用 fetchDeviceList() 接口,获取可组成群组的设备列表之后,可以通过合理的 UI 和交互设计,让用户自行选择将哪些设备添加到一个群组中。当然,选中设备列表之后,还需要给群组一个名称。然后调用 createGroup() 接口,完成群组的创建。

    val operateBuilder = GroupOperateBuilder.Builder()
        .setGroupName("群组 1")
        .setAllSelectDeviceList(selectedDevice)
        .setSuccessCallback(object : SuccessCallback {
            override fun result(groupId: Long, failDevices: List<GroupResult>?) {
              // 创建成功,获取群组 ID

            }

        })
        .setProcessCallback(object : ProcessCallback {
            override fun result(process: Int, size: Int) {

            }
        })
        .setFailureCallback(object : FailureCallback {
            override fun onError(
                errorCode: String?,
                errorMessage: String?,
                groupId: Long,
                failDevices: List<GroupResult>?
            ) {

            }

        })
        .build()
    thingGroupBizManager?.createGroup(operateBuilder)

步骤 4:编辑群组

成功地创建群组并获取群组 ID 之后,就能对群组进行编辑了。需要注意的是,要重新通过群组 ID 进行初始化,拿到新的 ThingGroupBizManager 对象,才可以去增减群组里的设备。

  // 已存在的群组,通过 groupId 进行初始化
    val initBuilder = GroupInitBuilder.Builder()
                      .setGroupId(groupId)
                      .build()
    val thingGroupBizManager = ThingGroupBizKit.getGroupBizManager(homeId,initBuilder)

    // 编辑群组里的设备时,不需要传入群组名称,只需传入重新选择之后的设备 ID 列表即可。
    val operateBuilder = GroupOperateBuilder.Builder()
        .setAllSelectDeviceList(selectedDevice)
        .setSuccessCallback(object : SuccessCallback {
            override fun result(groupId: Long, failDevices: List<GroupResult>?) {
              // 编辑成功

            }

        })
        .setProcessCallback(object : ProcessCallback {
            override fun result(process: Int, size: Int) {

            }
        })
        .setFailureCallback(object : FailureCallback {
            override fun onError(
                errorCode: String?,
                errorMessage: String?,
                groupId: Long,
                failDevices: List<GroupResult>?
            ) {

            }

        })
        .build()
    thingGroupBizManager?.updateGroup(operateBuilder)

步骤 5:删除群组

当需要删除一个群组时,同样也是需要通过群组 ID 进行初始化,拿到新的 ThingGroupBizManager 对象,才能删除群组。不过,群组编辑和删除可以用同一个管理类。

  // 已存在的群组,通过 groupId 进行初始化,即便在初始化的时候已经传入了。
    val initBuilder = GroupInitBuilder.Builder()
                      .setGroupId(groupId)
                      .build()
    val thingGroupBizManager = ThingGroupBizKit.getGroupBizManager(homeId,initBuilder)

    GroupOperateBuilder operateBuilder = new GroupOperateBuilder.Builder()
            .setGroupId(groupId)
            .setSuccessCallback((groupId, failDevices) -> {
              // 群组删除成功

            })
            .setFailureCallback((errorCode, errorMessage, groupId, failDevices) -> {

            })
            .build();
    thingGroupBizManager?.dismissGroup(operateBuilder)

Demo

上述的步骤是按照查增改删的思路一步步完成群组业务的。实际业务开发时,可灵活组合。更多信息,可以参考 业务拓展 SDK Demo 中的 群组业务模块