子设备接入

更新时间:2018-10-23 21:25:19

如果当前设备是一个网关,且该网关下的子设备需接入云端,此时需要使用子设备管理功能。

网关子设备管理提供了子设备动态注册、获取云端网关下子设备列表、添加子设备、删除子设备、子设备上线、子设备下线、监听子设备禁用和删除、代理子设备上下行的能力。

网关本身是一个直连设备可直接使用上述介绍的所有能力。网关和子设备之间的连接、数据通信需要用户处理。

说明 网关子设备管理相关接口参见设备 IGateway

设备每次初始建联的时候都需要调用添加、登录接口。

子设备动态注册

需要在云端开启允许动态注册功能,可以同时注册多个。子设备添加到网关之前需要先进行动态注册。

LinkKit.getInstance().getGateway().gatewaySubDevicRegister(getSubDevList(), new IConnectSendListener() {
    @Override
    public void onResponse(ARequest aRequest, AResponse aResponse) {
        ALog.d(TAG, "onResponse() called with: aRequest = [" + aRequest + "], aResponse = [" + (aResponse == null ? "null" : aResponse.data) + "]");
        try {
            // 子设备动态注册成功
            ResponseModel<List<DeviceInfo>> response = JSONObject.parseObject(aResponse.data.toString(), new TypeReference<ResponseModel<List<DeviceInfo>>>() {
            }.getType());
            // 根据 response 的数据判断是否成功 code=200
            //TODO 保存子设备的三元组信息
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onFailure(ARequest aRequest, AError aError) {
        // 子设备动态注册失败
    }
});

获取子设备列表

获取网关当前在云端已经有哪些子设备。

LinkKit.getInstance().getGateway().gatewayGetSubDevices(new IConnectSendListener() {
    @Override
    public void onResponse(ARequest aRequest, AResponse aResponse) {
        // 获取子设备列表结果
        try {
            ResponseModel<List<DeviceInfo>> response = JSONObject.parseObject(aResponse.data.toString(), new TypeReference<ResponseModel<List<DeviceInfo>>>() {
            }.getType());
            // TODO 根据实际应用场景处理
        } catch (Exception e) {
            e.printStackTrace();
        }
}

    @Override
    public void onFailure(ARequest aRequest, AError aError) {
        // 获取子设备列表失败
    }
});

添加子设备

子设备动态注册完成之后,可以通过该接口将子设备添加到网关下。

final DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey; // 三元组 产品型号(必填)
deviceInfo.deviceName = deviceName; // 三元组 设备标识 (必填)
LinkKit.getInstance().getGateway().gatewayAddSubDevice(deviceinfo, new ISubDeviceConnectListener() {
    @Override
    public String getSignMethod() {
        // 使用的签名方法
        return "hmacsha1";
    }

    @Override
    public String getSignValue() {
        // 获取签名,用户使用 deviceSecret 获得签名结果
        Map<String, String> signMap = new HashMap<>();
        signMap.put("productKey", info.productKey);
        signMap.put("deviceName", info.deviceName);
//                signMap.put("timestamp", String.valueOf(System.currentTimeMillis()));
        signMap.put("clientId", getClientId());
        return SignUtils.hmacSign(signMap, info.deviceSecret);
    }

    @Override
    public String getClientId() {
        // clientId 可为任意值
        return "id";
    }

    @Override
    public void onConnectResult(boolean isSuccess, ISubDeviceChannel iSubDeviceChannel, AError aError) {
        // 添加结果
        if (isSuccess) {
            // 子设备添加成功,接下来可以做子设备上线的逻辑
            // subDevOnline(null);
        }
    }

    @Override
    public void onDataPush(String s, String s1) {
        // 收到子设备下行数据 topic=" + s  + ", data=" + s1
        // 如禁用 删除 已经 设置、服务调用等
    }
});

删除子设备

此处指在子设备的产品里面删除该子设备,并非删除和网关的拓扑关系。

final DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey; // 三元组 产品型号(必填)
deviceInfo.deviceName = deviceName; // 三元组 设备标识 (必填)
LinkKit.getInstance().getGateway().gatewayDeleteSubDevice(deviceinfo, new ISubDeviceRemoveListener() {
    @Override
    public void onSuceess() {
        // 成功删除子设备 删除之前可先做下线操作
    }

    @Override
    public void onFailed(AError aError) {
        // 删除子设备失败
    }
});

子设备上线

代理子设备上线,子设备上线之后可以执行子设备的订阅、发布等操作。

final DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey; // 三元组 产品型号(必填)
deviceInfo.deviceName = deviceName; // 三元组 设备标识 (必填)
LinkKit.getInstance().getGateway().gatewaySubDeviceLogin(deviceinfo, new ISubDeviceActionListener() {
    @Override
    public void onSuccess() {
        // 代理子设备上线成功
        // 上线之后可订阅 删除和禁用的下行通知
        // subDevDisable(null);
        // subDevDelete(null);
    }

    @Override
    public void onFailed(AError aError) {
        ALog.d(TAG, "onFailed() called with: aError = [" + aError + "]");
        showToast("代理子设备上线失败");
        log(TAG ,"代理子设备上线失败" + getPkDn(info));
    }
});

子设备下线

子设备下线之后不可以进行子设备的发布、订阅、取消订阅等操作。

final DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey; // 三元组 产品型号(必填)
deviceInfo.deviceName = deviceName; // 三元组 设备标识 (必填)
LinkKit.getInstance().getGateway().gatewaySubDeviceLogout(deviceinfo, new ISubDeviceActionListener() {
    @Override
    public void onSuccess() {
        // 代理子设备下线成功
    }

    @Override
    public void onFailed(AError aError) {
        // 代理子设备下线失败
    }
});

监听子设备禁用、删除

网关设备可以在云端操作子设备,如禁用子设备、启用子设备、删除和子设备的拓扑关系。目前服务端只支持禁用子设备的下行通知。服务端在禁用子设备的时候会对子设备做下线处理,后续网关将不能代理子设备和云端做通信。

final DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey; // 三元组 产品型号(必填)
deviceInfo.deviceName = deviceName; // 三元组 设备标识 (必填)
LinkKit.getInstance().getGateway().gatewaySetSubDeviceDisableListener(deviceinfo, new IConnectRrpcListener() {
    @Override
    public void onSubscribeSuccess(ARequest aRequest) {
        // 订阅成功
    }

    @Override
    public void onSubscribeFailed(ARequest aRequest, AError aError) {
        // 订阅失败
    }

    @Override
    public void onReceived(ARequest aRequest, IConnectRrpcHandle iConnectRrpcHandle) {
        // 子设备禁用通知
        iConnectRrpcHandle.onRrpcResponse(null, null);
    }

    @Override
    public void onResponseSuccess(ARequest aRequest) {
        Log.d(TAG, "onResponseSuccess() called with: aRequest = [" + aRequest + "]");
    }

    @Override
    public void onResponseFailed(ARequest aRequest, AError aError) {
        Log.d(TAG, "onResponseFailed() called with: aRequest = [" + aRequest + "], aError = [" + aError + "]");
    }
});

代理子设备物模型上下行

  • 子设备物模型初始化

      DeviceInfo deviceInfo = new DeviceInfo();
      deviceInfo.productKey = productKey;
      deviceInfo.deviceName = deviceName;
      //        deviceInfo.deviceSecret = "xxxx";
      Map<String, ValueWrapper> subDevInitState = new HashMap<>();
      //        subDevInitState.put(); //TODO 用户根据实际情况设置
      String tsl = null;// 用户根据实际情况设置,默认为空 直接从云端获取最细的 TSL
      LinkKit.getInstance().getGateway().initSubDeviceThing(tsl, deviceInfo, subDevInitState, new IDMCallback<InitResult>() {
          @Override
          public void onSuccess(InitResult initResult) {
              // 物模型初始化成功之后 可以做服务注册  上报等操作
          }
    
          @Override
          public void onFailure(AError aError) {
              // 子设备初始化失败
          }
      });
    
  • 子设备物模型使用
    接口使用和直连设备的物模型使用一致,获取 IThing 接口实现使用如下方式获取。

      // 获取 IThing 实例
      IThing thing = LinkKit.getInstance().getGateway().getSubDeviceThing(mBaseInfo).first;
      // thing 有可能为空,如子设备未登录、物模型未初始化、子设备未添加到网关、子设备处于离线状态等。
      // error 信息在 LinkKit.getInstance().getGateway().getSubDeviceThing(mBaseInfo).second 返回
      // 参考示例 注意判空
      thing.thingPropertyPost(reportData, new IPublishResourceListener() {
          @Override
          public void onSuccess(String s, Object o) {
              // 设备上报状态成功
          }
    
          @Override
          public void onError(String s, AError aError) {
              // 设备上报状态失败
          }
      });
    
  • 子设备物模型销毁
    反初始化物模型,后续如果需要重新使用需要重新走登录、物模型初始化流程。

      LinkKit.getInstance().getGateway().uninitSubDeviceThing(mBaseInfo);
    

代理子设备基础上下行

使用网关的通道执行子设备的数据上下行。

final DeviceInfo deviceInfo = new DeviceInfo();
deviceInfo.productKey = productKey; // 三元组 产品型号(必填)
deviceInfo.deviceName = deviceName; // 三元组 设备标识 (必填)
String topic = xxx;
String publishData = xxx;
// 订阅
LinkKit.getInstance().getGateway().gatewaySubDeviceSubscribe(topic, deviceinfo, new ISubDeviceActionListener() {
    @Override
    public void onSuccess() {
        // 代理子设备订阅成功
    }

    @Override
    public void onFailed(AError aError) {
        // 代理子设备订阅失败
    }
});

//发布
LinkKit.getInstance().getGateway().gatewaySubDevicePublish(topic, publishData, deviceinfo, new ISubDeviceActionListener() {
    @Override
    public void onSuccess() {
        // 代理子设备发布成功
    }

    @Override
    public void onFailed(AError aError) {
        // 代理子设备发布失败
    }
});

// 取消订阅
LinkKit.getInstance().getGateway().gatewaySubDeviceUnsubscribe(topic, deviceinfo, new ISubDeviceActionListener() {
    @Override
    public void onSuccess() {
        // 代理子设备取消订阅成功
    }

    @Override
    public void onFailed(AError aError) {
        // 代理子设备取消订阅事变
    }
});

results matching ""

    No results matching ""