Mesh 管理

更新时间:2024-03-15 09:11:10下载pdf

本文介绍如何进行 Mesh 管理。

概念介绍

Mesh

商用照明 SDK 接入文档中所涉及到的 Mesh 均为蓝牙 Mesh,目前 SDK 不支持除标准蓝牙 Mesh 以外的其他私有 Mesh 类型。
一个 Mesh 下的蓝牙 Mesh 协议的设备数建议控制在 300 以内,非蓝牙 Mesh 协议的设备不受数量限制。

Mesh 网络模式

  • 单 Mesh 网络模式

    • 创建项目时会自动创建一个关联的 Mesh,当前项目以及项目下的所有区域层级均关联在自动生成的 Mesh 下。
    • 在该网络模式的项目下,请勿进行 Mesh 创建和删除等操作
  • 多 Mesh 网络模式

    • 创建项目时不会自动创建关联的 Mesh,用户必须手动创建 Mesh 并与区域进行关联绑定,否则蓝牙 Mesh 设备将无法在未绑定 Mesh 的区域节点下进行配网。
    • 一个区域最多绑定一个 Mesh,但一个 Mesh 可以同时被多个区域节点绑定。
    • 不同 Mesh 下的设备无法进行跨区域转移。如果您需要在多个区域节点下进行设备的跨区域转移等操作,需将目标区域关联在同一个 Mesh 下。

设备配网

不支持在项目根节点下进行设备配网操作,请在目标区域节点下进行配网。配网过程中传入 API 的 homeId 参数需为当前区域的 gid

商用照明 SDK 2.8.1 版本后支持创建单 Mesh 和多 Mesh 两种网络模式的项目,设备配网、群组和场景等操作需在区域节点下进行

管理

获取当前区域 Mesh 信息

获取区域已绑定的 Mesh 信息。

  • 在单 Mesh 网络模式的项目下,所有区域层级默认绑定 Mesh,原则上不存在 Mesh 未绑定的情况。
  • 在多 Mesh 网络模式的项目下,已绑定的 Mesh 可能为空,此时需要手动进行 Mesh 绑定。

示例代码

//根据 areaId 从缓存中获取对应的 SimpleAreaBean 对象信息
SimpleAreaBean areaBean = ThingCommercialLightingArea.newAreaInstance(
                projectId,//项目 ID
                areaId //当前区域 ID
        ).getCurrentAreaCache();

//获取当前区域绑定的 meshId
String meshId = areaBean.getMeshId();

//若 meshId 不为空,获取 SigMeshBean 对象
if (!TextUtils.isEmpty(meshId)) {
    ILightingMultiMeshPlugin service = PluginManager.service(ILightingMultiMeshPlugin.class);
    SigMeshExtBean sigMeshBean = service.getInstance().getSigMeshBean(projectId, meshId);
}

获取项目下已创建的 Mesh 列表

单 Mesh 网络模式的项目下存在且仅存在一个 Mesh,多 Mesh 网络模式下可能存在不定数量的 Mesh。

接口说明

ILightingMultiMeshPlugin # getInstance() # getSigMeshBeans(projectId)

示例代码

ILightingMultiMeshPlugin service = PluginManager.service(ILightingMultiMeshPlugin.class);

List<SigMeshExtBean> sigMeshBeans = service.getInstance().getSigMeshBeans(projectId);

单 Mesh 网络模式

一个项目下存在且仅存在一个自动创建的 Mesh,所有区域节点均绑定在当前 Mesh 下。

初始化

初始化蓝牙 Mesh 网络,并注册来自云端状态变化的监听。在切换和初始化蓝牙 Mesh 网络时,调用该接口。

接口说明

void initMesh(String meshId);

示例代码

ThingOSMesh.getThingSigMeshClient().initMesh("meshIdxxxxx");

连接或断开蓝牙 Mesh 子设备

IThingBlueMeshClient 提供开始连接、断开连接、开启扫描和停止扫描能力。

示例代码

// 开启连接
ThingOSMesh.getThingSigMeshClient().startClient(mSigMeshBean);
// 开启连接,指定扫描的时间
ThingOSMesh.getThingSigMeshClient().startClient(mSigMeshBean,searchTime);

// 断开连接
ThingOSMesh.getThingSigMeshClient().stopClient();

// 开启扫描
ThingOSMesh.getThingSigMeshClient().startSearch()

// 停止扫描
ThingOSMesh.getThingSigMeshClient().stopSearch();

后台一直扫描会消耗资源,可以通过开启扫描和停止扫描来控制后台的扫描。

  • startClient(mSigMeshBean) 开启连接后,会在后台不断地扫描周围可连接设备,直到连接成功为止。
  • startClient(mSigMeshBean,searchTime) 开启连接后,searchTime 时间内没有扫描到设备,就停止扫描。
  • 当未调用 startClient() 时,调用 startSearch()stopSearch() 是没有效果的。
  • 当已经连接到蓝牙 Mesh 网时,调用 startSearchstopSearch 是没有效果的。

多 Mesh 网络模式

一个项目下可能存在不定数量的 Mesh,一个 Mesh 可能同时被不定数量的区域绑定。

Mesh 创建

创建一个 Mesh,可以指定 Mesh 的名称。

接口说明

ILightingMultiMeshPlugin # getMultiMeshManager() # createSigMesh(projectId,meshName,callback)

示例代码

ILightingMultiMeshPlugin service = PluginManager.service(ILightingMultiMeshPlugin.class);
service.getMultiMeshManager().createSigMesh(
        projectId, //项目 ID
        meshName, //mesh 名称
        new IThingResultCallback<SigMeshExtBean>() {
    @Override
    public void onSuccess(SigMeshExtBean sigMeshExtBean) {

    }

    @Override
    public void onError(String errorCode, String errorMessage) {

    }
});

Mesh 删除

确保在 Mesh 下没有蓝牙 Mesh 设备,且当前 Mesh 没有被任何区域绑定,才能执行该删除操作。

接口说明

ILightingMultiMeshPlugin # getMultiMeshManager() # deleteSigMesh(projectId,meshId,callback)

示例代码

 ILightingMultiMeshPlugin service = PluginManager.service(ILightingMultiMeshPlugin.class);
service.getMultiMeshManager().deleteSigMesh(
        projectId,//项目 ID
        meshId,   //mesh id
        new IThingResultCallback<Boolean>() {
            @Override
            public void onSuccess(Boolean aBoolean) {

            }

            @Override
            public void onError(String errorCode, String errorMessage) {

            }
        });

区域绑定 Mesh

将未绑定过 Mesh 的区域绑定到一个 Mesh 下,支持同时绑定多个区域 ID。

接口说明

ILightingMultiMeshPlugin # getMultiMeshManager() # bindSigMeshAreas(projectId,meshId,areaIds,callback)

示例代码

List<String> areaIds = new ArrayList<>();
areaIds.add("areaId1");
areaIds.add("areaId2");
areaIds.add("areaId3");

ILightingMultiMeshPlugin service = PluginManager.service(ILightingMultiMeshPlugin.class);
service.getMultiMeshManager().bindSigMeshAreas(
        projectId,
        meshId,
        areaIds,
        new IThingResultCallback<Boolean>() {
            @Override
            public void onSuccess(Boolean aBoolean) {

            }

            @Override
            public void onError(String errorCode, String errorMessage) {

            }
        });

区域解绑 Mesh

将区域与 Mesh 进行解绑,支持同时解绑多个区域。

接口说明

ILightingMultiMeshPlugin # getMultiMeshManager() # unbindSigMeshAreas(projectId,meshId,areaIds,callback)

示例代码

List<String> areaIds = new ArrayList<>();
areaIds.add("areaId1");
areaIds.add("areaId2");
areaIds.add("areaId3");

ILightingMultiMeshPlugin service = PluginManager.service(ILightingMultiMeshPlugin.class);
service.getMultiMeshManager().unbindSigMeshAreas(
        projectId,
        meshId,
        areaIds,
        new IThingResultCallback<Boolean>() {
            @Override
            public void onSuccess(Boolean aBoolean) {

            }

            @Override
            public void onError(String errorCode, String errorMessage) {

            }
        });

Mesh 初始化

初始化指定 Mesh。

接口说明

  ThingOSMesh.getMeshManager().initSigMesh(meshId)

示例代码

  ThingOSMesh.getMeshManager().initSigMesh("meshIdxxxxx");

Mesh 连接

支持同时连接不多于 3 个 Mesh。

接口说明

ThingOSMesh.getMeshManager().connectMesh(builderList);

示例代码

List<MeshConnectBuilder> builderList = new ArrayList<>();
builderList.add(new MeshConnectBuilder.Builder()
        .setSigMeshBean(sigmeshBean1)
        .setScanTimeout(30*1000)
        .setConnectStatusListener(listener1)
        .build());
ThingOSMesh.getMeshManager().connectMesh(builderList);

Mesh 断连

将 Mesh 断开连接。

接口说明

ThingOSMesh.getMeshManager().disconnectMesh(meshId);

示例代码

ThingOSMesh.getMeshManager().disconnectMesh("meshIdxxxxx");

获取 Mesh 绑定的区域列表

根据 meshId,获取已关联此 Mesh 的所有区域的列表。

示例代码

ILightingMultiMeshPlugin service = PluginManager.service(ILightingMultiMeshPlugin.class);
service.getMultiMeshManager().getSigMeshAreas(projectId, meshId, true,
        new IThingResultCallback<List<AreaBean>>() {
            @Override
            public void onSuccess(List<AreaBean> simpleAreaBeans) {

            }

            @Override
            public void onError(String errorCode, String errorMessage) {

            }
        });

获取已连接的 Mesh

鉴于手机蓝牙性能等原因,目前一台手机支持同时连入 Mesh 的数量为 3 个,可以通过该方法获取目前正在连接的 meshId 列表。

接口说明

List<String> connectedMeshIds = ThingOSMesh.getMeshManager().getConnectedMeshIds();

示例代码

List<String> connectedMeshIds = ThingOSMesh.getMeshManager().getConnectedMeshIds();
List<SigMeshExtBean> sigMeshExtBeans = new ArrayList<>();
ILightingMultiMeshPlugin service = PluginManager.service(ILightingMultiMeshPlugin.class);
for (String meshId : connectedMeshIds) {
    SigMeshExtBean sigMeshBean = service.getInstance().getSigMeshBean(projectId, meshId);
    if (sigMeshBean != null) {
        sigMeshExtBeans.add(sigMeshBean);
    }
}