全部产品
云市场

设备影子

更新时间:2019-02-21 20:49:36

如果当前产品不具备物模型的能力,可以通过设备影子将当前设备的最新状态缓存到云端。云端缓存的是一个最新的 JSON 格式数据,需要用户自己根据实际情况做解析。物模型具备更高级的设备影子能力,能根据各个属性、事件、服务做独立展示,并具有所有操作的历史记录。

说明 设备影子相关接口参见设备 IDeviceShadow

数据上行

  • 获取云端设备影子
  • 更新云端设备影子
  • 删除云端设备影子
  1. // 获取设备影子 具体业务可参考 Demo
  2. String data = "{" + "\"method\": \"get\"" + "}";
  3. // 更新设备影子 需要根据获得到的设备影子读取返回的 version值,在更新的时候 {ver} 替换为version+1
  4. // String data = "{" + "\"method\": \"update\"," + "\"state\": {" + "\"reported\": {" +
  5. // "\"color\": \"red\"" + "}" + "}," + "\"version\": {ver}" + "}";
  6. //删除设备影子 color 属性 {ver}需要替换
  7. // String data = "{" + "\"method\": \"delete\"," + "\"state\": {" + "\"reported\": {" +
  8. // "\"color\": \"null\"" + "}" + "}," + "\"version\": {ver}" + "}";
  9. LinkKit.getInstance().getDeviceShadow().shadowUpload(data, new IConnectSendListener() {
  10. @Override
  11. public void onResponse(ARequest aRequest, AResponse aResponse) {
  12. // 设备影子更新成功
  13. // 数据解析参考数据下行或 Demo
  14. }
  15. @Override
  16. public void onFailure(ARequest aRequest, AError aError) {
  17. // 设备影子更新失败
  18. }
  19. });

数据下行

监听云端设备影子数据更新,一般使用在 APP 去控制设备的时候。APP控制设备的时候,通过云端下发设备影子更新到设备端,设备端拿到云端下行的设备影子之后,根据 desired 的值去执行设备更新。

  1. // 监听云端设备影子更新
  2. LinkKit.getInstance().getDeviceShadow().setShadowChangeListener(new IShadowRRPC() {
  3. @Override
  4. public void onSubscribeSuccess(ARequest aRequest) {
  5. // 订阅设备影子下行数据成功
  6. }
  7. @Override
  8. public void onSubscribeFailed(ARequest aRequest, AError aError) {
  9. // 订阅设备影子下行数据失败
  10. }
  11. @Override
  12. public void onReceived(ARequest aRequest, AResponse aResponse, IConnectRrpcHandle iConnectRrpcHandle) {
  13. // 接收到云端数据下行,下行数据在 aResponse 想里面
  14. try {
  15. if (aRequest != null) {
  16. String dataStr = null;
  17. if (aResponse.data instanceof byte[]) {
  18. dataStr = new String((byte[]) aResponse.data, "UTF-8");
  19. } else if (aResponse.data instanceof String) {
  20. dataStr = (String) aResponse.data;
  21. } else {
  22. dataStr = String.valueOf(aResponse.data);
  23. }
  24. // Log.d(TAG, "dataStr = " + dataStr);
  25. // 返回数据示例
  26. //{"method":"control","payload":{"state":{"desired":{"mode":2,"color":"white"},"reported":{"mode":"1","color":"red"}},"metadata":{"desired":{"mode":{"timestamp":1547642408},"color":{"timestamp":1547642408}},"reported":{"mode":{"timestamp":1547642408},"color":{"timestamp":1547642408}}}},"timestamp":1547642408,"version":12}
  27. // 仅供参考
  28. ShadowResponse<String> shadowResponse = JSONObject.parseObject(dataStr, new TypeReference<ShadowResponse<String>>() {
  29. }.getType());
  30. if (shadowResponse != null && shadowResponse.version != null && TextUtils.isDigitsOnly(shadowResponse.version)) {
  31. version = Long.valueOf(shadowResponse.version);
  32. }
  33. AResponse response = new AResponse();
  34. // TODO 用户实现控制设备
  35. // 用户控制设备之后 上报影子的值到云端
  36. // 上报设置之后的值到云端
  37. // 根据当前实际值上报
  38. response.data = shadowUpdate.replace("{ver}", String.valueOf(version + 1));
  39. // 第一个值 replyTopic 有默认值 用户不需要设置
  40. iConnectRrpcHandle.onRrpcResponse(null, response);
  41. }
  42. } catch (Exception e) {
  43. e.printStackTrace();
  44. }
  45. }
  46. @Override
  47. public void onResponseSuccess(ARequest aRequest) {
  48. // 下行处理之后上报成功
  49. }
  50. @Override
  51. public void onResponseFailed(ARequest aRequest, AError aError) {
  52. // 下行处理之后上报失败
  53. }
  54. });