使用SDK開發(fā)
物聯(lián)網(wǎng)平臺(tái)提供各類設(shè)備端SDK,支持您使用SDK開發(fā)設(shè)備。本文介紹使用物聯(lián)網(wǎng)平臺(tái)提供的Java SDK開發(fā)設(shè)備。
前提條件
已在物聯(lián)網(wǎng)平臺(tái)云端創(chuàng)建產(chǎn)品和設(shè)備,并獲取設(shè)備證書(ProductKey、DeviceName和DeviceSecret)。具體操作,請(qǐng)參見(jiàn)云端配置。
背景信息
實(shí)際開發(fā)中,請(qǐng)根據(jù)開發(fā)時(shí)使用的語(yǔ)言、平臺(tái),選用合適的設(shè)備端SDK。更多信息,請(qǐng)參見(jiàn)下載設(shè)備端SDK。本示例使用Java SDK開發(fā)設(shè)備。
準(zhǔn)備工作
示例代碼
為了避免初始化時(shí)訂閱大量Alink協(xié)議中系統(tǒng)Topic帶來(lái)的性能開銷,平臺(tái)提供了免訂閱能力,即物聯(lián)網(wǎng)平臺(tái)幫設(shè)備進(jìn)行Topic訂閱。Topic相關(guān)說(shuō)明,請(qǐng)參見(jiàn)什么是Topic。
下載Java SDK Demo,然后解壓。
修改src/main/java/com.aliyun.alink.devicesdk.demo目錄下ThingSample.java文件中上報(bào)屬性、上報(bào)事件和監(jiān)聽下行服務(wù)的代碼,內(nèi)容如下。
上報(bào)屬性
public void reportDemoProperty(){ /** * 上報(bào)屬性 */ Map<String, ValueWrapper> properties = new HashMap<String, ValueWrapper>(); // key為物模型中屬性標(biāo)識(shí)符"acOutMeterIty",value需要遵循屬性值規(guī)范:int類型,取值范圍在0~200之間; properties.put("acOutMeterIty", new ValueWrapper(10)); LinkKit.getInstance().getDeviceThing().thingPropertyPost(properties, new IPublishResourceListener() { @Override public void onSuccess(String s, Object o) { System.out.println("=====thingPropertyPost success======="); System.out.println(s); System.out.println(JSON.toJSONString(o)); } @Override public void onError(String s, AError aError) { System.out.println("=====thingPropertyPost failure======="); } }); // 上報(bào)屬性之后,云端會(huì)返回響應(yīng)結(jié)果,此處是監(jiān)聽云端返回的屬性reply LinkKit.getInstance().registerOnNotifyListener(new IConnectNotifyListener() { @Override public void onNotify(String s, String s1, AMessage aMessage) { System.out.println("===PROPERTY REPLY==="); System.out.println("TOPIC:" + s1); System.out.println("Payload:" + JSON.toJSONString(aMessage)); } @Override public boolean shouldHandle(String s, String s1) { return false; } @Override public void onConnectStateChange(String s, ConnectState connectState) { } }); }
上報(bào)事件
public void reportDemoEvent() { /** * 上報(bào)事件 */ HashMap<String, ValueWrapper> eventMap = new HashMap<String, ValueWrapper>(); // key為物模型中事件參數(shù)的標(biāo)識(shí)符"gunNum", value為事件參數(shù)值需要遵循數(shù)值規(guī)范:int類型,取值范圍0~100之間; eventMap.put("gunNum", new ValueWrapper.IntValueWrapper(50)); OutputParams eventOutput = new OutputParams(eventMap); // 參數(shù)identity為"startChaResEvt"屬于物模型事件標(biāo)識(shí)符。 LinkKit.getInstance().getDeviceThing().thingEventPost("startChaResEvt", eventOutput, new IPublishResourceListener() { public void onSuccess(String resId, Object o) { System.out.println("=====thingEventPost success======="); System.out.println(resId); System.out.println(JSON.toJSONString(o)); } public void onError(String resId, AError aError) { System.out.println("=====thingEventPost failure======="); } }); }
監(jiān)聽下行服務(wù)
private ITResRequestHandler mCommonHandler = new ITResRequestHandler() { public void onProcess(final String identify, final Object result, final ITResResponseCallback itResResponseCallback) { ALog.d(TAG, "onProcess() called with: s = [" + identify + "], o = [" + result + "], itResResponseCallback = [" + itResResponseCallback + "]"); try { /** * 設(shè)置屬性(property)的模式 */ // "set"為設(shè)置屬性默認(rèn)的標(biāo)識(shí)符 if ("set".equals(identify)) { // TODO 用戶需要設(shè)置真實(shí)設(shè)備的屬性 /** * 向云端同步設(shè)置好的屬性值 */ Map<String, ValueWrapper> desiredProperty = (Map<String, ValueWrapper>) ((InputParams) result).getData(); LinkKit.getInstance().getDeviceThing().thingPropertyPost(desiredProperty, new IPublishResourceListener() { @Override public void onSuccess(String s, Object o) { if (result instanceof InputParams) { Map<String, ValueWrapper> data = (Map<String, ValueWrapper>) ((InputParams) result).getData(); // data.get() ALog.d(TAG, "收到異步下行數(shù)據(jù) " + data); // 響應(yīng)云端接收數(shù)據(jù)成功 itResResponseCallback.onComplete(identify, null, null); } else { itResResponseCallback.onComplete(identify, null, null); } } @Override public void onError(String s, AError aError) { AError error = new AError(); error.setCode(100); error.setMsg("setPropertyFailed."); itResResponseCallback.onComplete(identify, new ErrorInfo(error), null); } }); /** * 服務(wù)(service)的模式 */ // "startChaResService"為服務(wù)的標(biāo)識(shí)符 } else if ("startChaResService".equals(identify)) { Map<String, ValueWrapper> inputParams = (Map<String, ValueWrapper>) ((InputParams) result).getData(); // TODO 根據(jù)服務(wù)入?yún)nputParams執(zhí)行設(shè)備邏輯,比如啟動(dòng)充電 // 充電完成后,向云端返回輸出參數(shù) OutputParams outputParams = new OutputParams(); // key為"charm"屬于物模型中"startChaResService"服務(wù)出參標(biāo)識(shí)符,value為出參值遵循數(shù)據(jù)規(guī)范:int類型,數(shù)據(jù)范圍1~100之間; outputParams.put("charm", new ValueWrapper.IntValueWrapper(20)); itResResponseCallback.onComplete(identify, null, outputParams); } else { // 根據(jù)不同的服務(wù)做不同的處理,跟具體的服務(wù)有關(guān)系 OutputParams outputParams = new OutputParams(); // 根據(jù)特定服務(wù),按照服務(wù)規(guī)范返回服務(wù)的出參。 itResResponseCallback.onComplete(identify, null, outputParams); } } catch (Exception e) { e.printStackTrace(); ALog.d(TAG, "云端返回?cái)?shù)據(jù)格式異常"); } } public void onSuccess(Object o, OutputParams outputParams) { ALog.d(TAG, "onSuccess() called with: o = [" + o + "], outputParams = [" + outputParams + "]"); ALog.d(TAG, "注冊(cè)服務(wù)成功"); } public void onFail(Object o, ErrorInfo errorInfo) { ALog.d(TAG, "onFail() called with: o = [" + o + "], errorInfo = [" + errorInfo + "]"); ALog.d(TAG, "注冊(cè)服務(wù)失敗"); } };
在device_id.json文件中配置設(shè)備證書信息(productKey、deviceName、deviceSecret)。
"productKey": "*****", "deviceName": "*****", "deviceSecret": "*************",
在src/main/java/com.aliyun.alink.devicesdk.demo目錄下HelloWorld.java文件中,配置MQTT接入域名。具體內(nèi)容,請(qǐng)參見(jiàn)查看實(shí)例終端節(jié)點(diǎn)。
config.channelHost = pk + ".iot-as-mqtt." + deviceInfoData.region + ".aliyuncs.com:1883";
運(yùn)行HelloWorld.java文件。
代碼運(yùn)行成功后:
上報(bào)屬性成功,云端返回如下REPLY信息,表示設(shè)備與物聯(lián)網(wǎng)平臺(tái)成功進(jìn)行通信。
設(shè)備收到屬性設(shè)置指令,在物理設(shè)備上修改屬性完成后,建議將新屬性同步上報(bào)到云端。