如果當前產品不具備物模型的能力,可以通過設備影子將當前設備的最新狀態緩存到云端。云端緩存的是一個最新的 JSON 格式數據,需要用戶自己根據實際情況做解析。物模型具備更高級的設備影子能力,能根據各個屬性、事件、服務做獨立展示,并具有所有操作的歷史記錄。

說明 設備影子相關接口參見設備 IDeviceShadow

數據上行

  • 獲取云端設備影子

  • 更新云端設備影子

  • 刪除云端設備影子

// 獲取設備影子 具體業務可參考 Demo
String data = "{" + "\"method\": \"get\"" + "}";
// 更新設備影子 需要根據獲得到的設備影子讀取返回的 version值,在更新的時候 {ver} 替換為version+1
// String data = "{" + "\"method\": \"update\"," + "\"state\": {" + "\"reported\": {" +
//            "\"color\": \"red\"" + "}" + "}," + "\"version\": {ver}" + "}";
//刪除設備影子 color 屬性  {ver}需要替換
// String data = "{" + "\"method\": \"delete\"," + "\"state\": {" + "\"reported\": {" +
//            "\"color\": \"null\"" + "}" + "}," + "\"version\": {ver}" + "}";
LinkKit.getInstance().getDeviceShadow().shadowUpload(data, new IConnectSendListener() {
    @Override
    public void onResponse(ARequest aRequest, AResponse aResponse) {
        // 設備影子更新成功
        // 數據解析參考數據下行或 Demo
    }

    @Override
    public void onFailure(ARequest aRequest, AError aError) {
        // 設備影子更新失敗
    }
});
			

數據下行

監聽云端設備影子數據更新,一般使用在 APP 去控制設備的時候。APP控制設備的時候,通過云端下發設備影子更新到設備端,設備端拿到云端下行的設備影子之后,根據 desired 的值去執行設備更新。

// 監聽云端設備影子更新
LinkKit.getInstance().getDeviceShadow().setShadowChangeListener(new IShadowRRPC() {
    @Override
    public void onSubscribeSuccess(ARequest aRequest) {
        // 訂閱設備影子下行數據成功
    }

    @Override
    public void onSubscribeFailed(ARequest aRequest, AError aError) {
        // 訂閱設備影子下行數據失敗
    }

    @Override
    public void onReceived(ARequest aRequest, AResponse aResponse, IConnectRrpcHandle iConnectRrpcHandle) {
        // 接收到云端數據下行,下行數據在 aResponse 想里面
        try {
            if (aRequest != null) {
                String dataStr = null;
                if (aResponse.data instanceof byte[]) {
                    dataStr = new String((byte[]) aResponse.data, "UTF-8");
                } else if (aResponse.data instanceof String) {
                    dataStr = (String) aResponse.data;
                } else {
                    dataStr = String.valueOf(aResponse.data);
                }
                // Log.d(TAG, "dataStr = " + dataStr);
                // 返回數據示例
                //{"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}
                // 僅供參考
                ShadowResponse<String> shadowResponse = JSONObject.parseObject(dataStr, new TypeReference<ShadowResponse<String>>() {
                }.getType());
                if (shadowResponse != null && shadowResponse.version != null && TextUtils.isDigitsOnly(shadowResponse.version)) {
                    version = Long.valueOf(shadowResponse.version);
                }

                AResponse response = new AResponse();
                // TODO 用戶實現控制設備
                // 用戶控制設備之后 上報影子的值到云端
                // 上報設置之后的值到云端
                // 根據當前實際值上報
                response.data = shadowUpdate.replace("{ver}", String.valueOf(version + 1));
                // 第一個值 replyTopic 有默認值 用戶不需要設置
                iConnectRrpcHandle.onRrpcResponse(null, response);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onResponseSuccess(ARequest aRequest) {
        // 下行處理之后上報成功
    }

    @Override
    public void onResponseFailed(ARequest aRequest, AError aError) {
        // 下行處理之后上報失敗
    }
});