Mesh 管理

更新时间:2024-03-15 09:11:10LLM 副本以 Markdown 格式查看下载 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);
    }
}