日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

物模型開發(fā)

物模型是阿里云物聯(lián)網(wǎng)平臺為產(chǎn)品定義的數(shù)據(jù)模型。您可以通過Android Link SDK,實現(xiàn)設(shè)備端上報屬性和事件,并接收物聯(lián)網(wǎng)平臺發(fā)送的設(shè)置屬性和調(diào)用服務(wù)的指令。

背景信息

使用說明

重要

調(diào)用下文提及的物模型相關(guān)接口后,回調(diào)中onSuccess僅代表對應(yīng)消息從設(shè)備發(fā)出成功,不代表消息對應(yīng)的任務(wù)執(zhí)行成功。設(shè)備執(zhí)行業(yè)務(wù)邏輯請勿依賴onSuccess

  • Android Link SDK中,通過getDeviceThing(),獲取的物模型對象即為IThing。IThing的詳細(xì)說明,請參見 IThing ApiReference。

  • Android Link SDK默認(rèn)未開啟物模型功能,如需使用,請參見一機一密設(shè)備認(rèn)證方式的示例代碼Step 5。

  • 調(diào)用物模型接口后,如果您需根據(jù)物模型指令的執(zhí)行結(jié)果編寫業(yè)務(wù)的處理邏輯,請參考Demo的InitManager.java類中的函數(shù) IConnectNotifyListener接口onNotify,處理下行消息。

  • 具體代碼實現(xiàn)請參見Demo中的TSLActivity.java。

設(shè)備上報屬性

  • 上報屬性:

    // 設(shè)備上報
    Map<String, ValueWrapper> reportData = new HashMap<>();
    // identifier為物聯(lián)網(wǎng)平臺定義的屬性標(biāo)識符,valueWrapper為屬性的值
    // ValueWrapper valueWrapper = new ValueWrapper.BooleanValueWrapper(1);   //以布爾型變量值1為例
    // reportData.put(identifier, valueWrapper); // 參考示例,更多使用可參考Demo 
    LinkKit.getInstance().getDeviceThing().thingPropertyPost(reportData, new IPublishResourceListener() {
     @Override
    public void onSuccess(String alinkId, Object o) {
            // 消息從設(shè)備發(fā)出成功
            // alinkId表示該消息的messageId
    }
    public void onError(String alinkId, AError aError) {
            // 屬性上報失敗    
            // alinkId表示該消息的messageId
    }
    });
     
    說明
    • 從1.7.3.1版本開始,thingPropertyPost的回調(diào)接口通過alinkId字段透出當(dāng)前所發(fā)送的上行消息的ID。

    • 如果要觀察設(shè)備上報的屬性消息是否已到達(dá)云端,可以在訂閱 /sys/${productKey}/${deviceName}/thing/event/property/post_reply消息后,關(guān)注IConnectNotifyListener類(參考Demo的InitManager.java)的接口onNotify。該接口會透出reply消息的alinkId,如果上下行消息的alinkId一致,表示上行消息已經(jīng)被服務(wù)端處理。

  • 獲取屬性:

    獲取的是緩存在設(shè)備本地的屬性數(shù)據(jù),不是云端實時的屬性數(shù)據(jù)。

    // 通過identifier獲取物模型對應(yīng)屬性的值(默認(rèn)模塊, 非用戶自定義模塊)
    String identifier = "******";
    LinkKit.getInstance().getDeviceThing().getPropertyValue(identifier);
    // 獲取默認(rèn)模塊(非用戶自定義模塊)的屬性列表
    LinkKit.getInstance().getDeviceThing().getProperties()

設(shè)備上報事件

HashMap<String, ValueWrapper> hashMap = new HashMap<>();
// TODO 您需根據(jù)業(yè)務(wù)實際情況修改該代碼
// hashMap.put("ErrorCode", new ValueWrapper.IntValueWrapper(0));
OutputParams params = new OutputParams(hashMap);
LinkKit.getInstance().getDeviceThing().thingEventPost(identifier, params, new IPublishResourceListener() {
 @Override
public void onSuccess(String alinkId, Object o) {
        // 消息從設(shè)備發(fā)出成功
        // alinkId表示該消息的messageId
}
public void onError(String alinkId, AError aError) {
        // 事件上報失敗
        // alinkId表示該消息的messageId
}
});
說明
  • 從1.2.3版本開始,thingEventPost的回調(diào)接口通過alinkId字段透出當(dāng)前所發(fā)送的上行消息的ID。

  • 如果要觀察設(shè)備上報的事件消息是否已到達(dá)云端,可以在訂閱 /sys/${productKey}/${deviceName}/thing/event/${tsl.event.identifier}/post_reply消息后,關(guān)注IConnectNotifyListener類(參考Demo的InitManager.java)的接口onNotify。該接口會透出reply消息的alinkId,如果上下行消息的alinkId一致,表示上行消息已經(jīng)被服務(wù)端處理。

獲取默認(rèn)模塊(非用戶自定義模塊)的事件列表:

獲取的是設(shè)備本地的事件,不是上報到物聯(lián)網(wǎng)平臺的實時事件。

LinkKit.getInstance().getDeviceThing().getEvents()

云端下發(fā)屬性和服務(wù)

  • 設(shè)備調(diào)用服務(wù)獲取Service的定義,請參見 Service API Reference

  • 獲取默認(rèn)模塊(非用戶自定義模塊)的服務(wù)列表

    LinkKit.getInstance().getDeviceThing().getServices()
  • 設(shè)備的服務(wù)調(diào)用支持同步和異步兩種方式。設(shè)備屬性的設(shè)置和獲取也是通過該服務(wù)調(diào)用的監(jiān)聽方式,實現(xiàn)物聯(lián)網(wǎng)平臺服務(wù)的下發(fā)。

    異步調(diào)用

    設(shè)置方法

    callType="async"
    • 設(shè)備注冊服務(wù)的處理監(jiān)聽器,當(dāng)物聯(lián)網(wǎng)平臺觸發(fā)異步服務(wù)調(diào)用時,下行的請求會到注冊的監(jiān)聽器中。

    • onProcess為設(shè)備收到的云端下行的服務(wù)調(diào)用。其中,第一個參數(shù)為需調(diào)用服務(wù)對應(yīng)的identifier。您可根據(jù)identifier做不同的業(yè)務(wù)處理。

      identifier為服務(wù)的標(biāo)識符,更多信息,請參見標(biāo)識符

    • 設(shè)備收到物聯(lián)網(wǎng)平臺的下行服務(wù)調(diào)用后,根據(jù)指令執(zhí)行對應(yīng)操作,操作結(jié)束后上報一條屬性狀態(tài)變化的通知。

    相關(guān)代碼

    List<Service> serviceList = thing.getServices();
            //設(shè)置handler處理屬性下發(fā),以及默認(rèn)模塊中的異步服務(wù). 如果是用戶自定義模塊的異步服務(wù),請參見"模塊化服務(wù)的注冊"一節(jié) 
            for (int i = 0; serviceList != null && i < srviceList.size(); i++) {
                Service service = serviceList.get(i);
                LinkKit.getInstance().getDeviceThing().setServiceHandler(service.getIdentifier(), mCommonHandler);
            }
            
            private ITResRequestHandler mCommonHandler = new ITResRequestHandler()  {
            
            @Override
            public void onProcess(String identify, Object result, ITResResponseCallback itResResponseCallback) {
                AppLog.d(TAG, "onProcess() called with: s = [" + identify + "], o = [" + result + "], itResResponseCallback = [" + itResResponseCallback + "]");
    
                try {
                    if (SERVICE_SET.equals(identify)) {
                        /* 云端下發(fā)屬性到設(shè)備 */
                        // TODO 1:用戶需要按照真實設(shè)備的接口調(diào)用,設(shè)置設(shè)備的屬性. 用戶根據(jù)實際情況判斷屬性是否設(shè)置成功.
                        // TODO 2:設(shè)置完真實設(shè)備屬性之后,上報設(shè)置完成的屬性值. 這里是測試代碼,做了簡化,直接返回成功
                        boolean isSetPropertySuccess = true;
                        if (isSetPropertySuccess){
                            if (result instanceof InputParams) {
                                //TODO 3:解析服務(wù)端下行的屬性數(shù)據(jù)
                                Map<String, ValueWrapper> data = (Map<String, ValueWrapper>) ((InputParams) result).getData();
                                //   data.get()
                                // 響應(yīng)云端 接收數(shù)據(jù)成功
                                itResResponseCallback.onComplete(identify, null, null);
                            } else {
                                itResResponseCallback.onComplete(identify, null, null);
                            }
                        } else {
                            AError error = new AError();
                            error.setCode(100);
                            error.setMsg("setPropertyFailed.");
                            itResResponseCallback.onComplete(identify, new ErrorInfo(error), null);
                        }
    
                    } else if (SERVICE_GET.equals(identify)){
                        //  不需要用戶處理
                    } else {
                        // 云端下發(fā)服務(wù)到設(shè)備. 
                        // TODO: 根據(jù)不同的服務(wù)做不同的處理,跟具體的服務(wù)有關(guān)系
                        OutputParams outputParams = new OutputParams();
                        // 參考例子: outputParams.put("op", new ValueWrapper.IntValueWrapper(20));
                        itResResponseCallback.onComplete(identify,null, outputParams);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
    
            @Override
            public void onSuccess(Object o, OutputParams outputParams) {
                AppLog.d(TAG, "onSuccess() called with: o = [" + o + "], outputParams = [" + outputParams + "]");
            }
    
            @Override
            public void onFail(Object o, ErrorInfo errorInfo) {
                AppLog.d(TAG, "onFail() called with: o = [" + o + "], errorInfo = [" + errorInfo + "]");
            }
        };

    同步調(diào)用

    設(shè)置方法

    callType="sync"
    1. 先注冊一個下行數(shù)據(jù)監(jiān)聽,注冊方法請參見認(rèn)證與連接連接狀態(tài)與下行消息監(jiān)聽notifyListener。

      當(dāng)云端觸發(fā)服務(wù)調(diào)用時,用戶可以在onNotify收到云端的下行服務(wù)調(diào)用。

    2. 用戶收到云端的下行服務(wù)調(diào)用后,根據(jù)實際服務(wù)調(diào)用對設(shè)備做服務(wù)處理,處理之后需要設(shè)備回復(fù)云端的請求,即發(fā)布一個帶有處理結(jié)果的請求到云端。

    說明

    新版本的Android Link SDK支持自定義RRPC,如果您的SDK是由低版本升級而來,請注意同步服務(wù)屬性下行的通道為RRPC。

    相關(guān)代碼

    private static IConnectNotifyListener notifyListener = new IConnectNotifyListener() {
          
            @Override
            public void onNotify(String connectId, String topic, AMessage aMessage) {
                String data = new String((byte[]) aMessage.data);
                // 服務(wù)端返回數(shù)據(jù)示例  data = {"method":"thing.service.test_service","id":"123374967","params":{"vv":60},"version":"1.0.0"}
                AppLog.d(TAG, "onNotify() called with: connectId = [" + connectId + "], topic = [" + topic + "], aMessage = [" + data + "]");
    
    
                if (ConnectSDK.getInstance().getPersistentConnectId().equals(connectId) && !TextUtils.isEmpty(topic) &&
                        topic.startsWith("/ext/rrpc/")) {
                    // 1.處理/ext/rrpc開頭的同步服務(wù)的topic
                    
                    //示例 topic=/ext/rrpc/1138654706478941696//a1ExY4afKY1/testDevice/user/get
                    //AppLog.d(TAG, "receice Message=" + new String((byte[]) aMessage.data));
                    //回復(fù)服務(wù)端數(shù)據(jù)示例  {"method":"thing.service.test_service","id":"123374967","params":{"vv":60},"version":"1.0.0"}
                    MqttPublishRequest request = new MqttPublishRequest();
                    request.isRPC = false;
                    request.topic = topic;
                    String[] array = topic.split("/");
                    String resId = array[3];
                    request.msgId = resId;
    
                    String alinkdId = null;
                    try{
                        JSONObject jsonObject = JSONObject.parseObject(data);
                        alinkdId = jsonObject.getString("id");
                    }catch (Exception e){
                        AppLog.e(TAG,"parse alinkId failed, exit");
                        return;
                    }
    
                    // 云端下發(fā)了同步服務(wù),需要做回復(fù),否則服務(wù)端會顯示調(diào)用超時
                    // TODO 用戶根據(jù)實際情況填寫 僅做參考
                    request.payloadObj = "{\"id\":\"" + alinkdId + "\", \"code\":\"200\"" + ",\"data\":{\"aa\":1} }";
                    LinkKit.getInstance().publish(request, new IConnectSendListener() {
                        @Override
                        public void onResponse(ARequest aRequest, AResponse aResponse) {
                            // 響應(yīng)成功
                        }
    
                        @Override
                        public void onFailure(ARequest aRequest, AError aError) {
                            // 響應(yīng)失敗
                        }
                    });
                } else if (ConnectSDK.getInstance().getPersistentConnectId().equals(connectId) && !TextUtils.isEmpty(topic) &&
                        topic.startsWith("/sys/" + DemoApplication.productKey + "/" + DemoApplication.deviceName + "/rrpc/request/")) {
                    // 2.處理/sys開頭的同步服務(wù)的topic
                    
                    // AppLog.d(TAG, "receice Message=" + new String((byte[]) aMessage.data));
                    // 回復(fù)服務(wù)端數(shù)據(jù)示例  {"method":"thing.service.test_service","id":"123374967","params":{"vv":60},"version":"1.0.0"}
                    MqttPublishRequest request = new MqttPublishRequest();
                    // 支持 0 和 1, 默認(rèn)0
                    // request.qos = 0;
                    request.isRPC = false;
                    request.topic = topic.replace("request", "response");
                    String[] array = topic.split("/");
                    String resId = array[6];
                    request.msgId = resId;
                    // TODO 用戶根據(jù)實際情況填寫 僅做參考
                    request.payloadObj = "{\"id\":\"" + resId + "\", \"code\":\"200\"" + ",\"data\":{} }";
    
                    LinkKit.getInstance().publish(request, new IConnectSendListener() {
                        @Override
                        public void onResponse(ARequest aRequest, AResponse aResponse) {
                        }
    
                        @Override
                        public void onFailure(ARequest aRequest, AError aError) {
                        }
                    });
                } else {
                    // 3.處理其他消息
                    
                    /**
                     * TODO
                     * 根據(jù)訂閱的具體 topic 做業(yè)務(wù)處理
                     */
                }
              
              //TODO: 實現(xiàn)其他回調(diào)
            }

模塊化物模型

使用說明

  • 只有iot-device-manager的1.7.5.2及以上版本支持模塊化物模型。

  • 在物模型默認(rèn)的模塊中,屬性、事件、服務(wù)的identifier不用加前綴。例如名為lightSwitch的屬性,identifier就是lightSwitch。

  • 在用戶自定義的模塊中,屬性、事件、服務(wù)的identifier要加模塊名為前綴。例如myBlock模塊中的lightSwitch屬性,identifier要寫成myBlock:lightSwitch。

模塊化物模型屬性的上報

以上報myBlock模塊中的lightSwitch屬性為例:

Map<String, ValueWrapper> reportData  = new HashMap<>();
// identifier為物聯(lián)網(wǎng)平臺定義的屬性的標(biāo)識符,valueWrapper為屬性的值
String identifier = "myBlock:lightSwitch";
reportData.put(identifier, valueWrapper);  // 參考示例,更多內(nèi)容可參考Demo
LinkKit.getInstance().getDeviceThing().thingPropertyPost(reportData, new IPublishResourceListener() {
    @Override
    public void onSuccess(String resID, Object o) {
        // 屬性上報成功
    }

    @Override
    public void onError(String resId, AError aError) {
        // 屬性上報失敗
    }
});

模塊化物模型事件的上報

以上報map模塊中的OnDetect事件為例:

 HashMap<String, ValueWrapper> hashMap = new HashMap<>();
hashMap.put("StoreID", new ValueWrapper.StringValueWrapper("1"));
OutputParams params = new OutputParams(hashMap);
LinkKit.getInstance().getDeviceThing().thingEventPost("map:OnDetect", params, new IPublishResourceListener() {
    @Override
        public void onSuccess(String resId, Object o) { // 事件上報動作成功
    }

    @Override
        public void onError(String resId, AError aError) { // 事件上報失敗
     }
 });

模塊化服務(wù)的注冊

用戶自定義模塊中的服務(wù)要先向SDK注冊,才能監(jiān)聽到相應(yīng)的回調(diào),以map模塊中的VehDtcService服務(wù)為例,需要通過如下方式訂閱:

thing.setServiceHandler("map:VehDtcService", resRequestHandler);

其中resRequestHandler是物模型報文處理handler的實例,請參見demo中的TSLActivity.java。

向設(shè)備下發(fā)指令

  • 物聯(lián)網(wǎng)平臺下發(fā)指令:通過監(jiān)控運維功能對設(shè)備進(jìn)行控制和數(shù)據(jù)的下發(fā),具體內(nèi)容,請參見監(jiān)控運維的在線調(diào)試

  • 服務(wù)端下發(fā)指令:通過OpenAPI,調(diào)用北向控制API下發(fā)指令。具體內(nèi)容,請參見云端API參考