物联网平台提供各类设备端SDK,支持您使用SDK开发设备。本文介绍使用物联网平台提供的Java SDK开发设备。
前提条件
已在物联网平台云端创建产品和设备,并获取设备证书(ProductKey、DeviceName和DeviceSecret)。具体操作,请参见云端配置。
背景信息
实际开发中,请根据开发时使用的语言、平台,选用合适的设备端SDK。更多信息,请参见下载设备端SDK。本示例使用Java SDK开发设备。
准备工作
示例代码
说明
为了避免初始化时订阅大量Alink协议中系统Topic带来的性能开销,平台提供了免订阅能力,即物联网平台帮设备进行Topic订阅。Topic相关说明,请参见什么是Topic。
下载Java SDK Demo,然后解压。
修改src/main/java/com.aliyun.alink.devicesdk.demo目录下ThingSample.java文件中上报属性、上报事件和监听下行服务的代码,内容如下。
上报属性
public void reportDemoProperty(){ /** * 上报属性 */ Map<String, ValueWrapper> properties = new HashMap<String, ValueWrapper>(); // key为物模型中属性标识符"acOutMeterIty",value需要遵循属性值规范: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======="); } }); // 上报属性之后,云端会返回响应结果,此处是监听云端返回的属性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) { } }); }
上报事件
public void reportDemoEvent() { /** * 上报事件 */ HashMap<String, ValueWrapper> eventMap = new HashMap<String, ValueWrapper>(); // key为物模型中事件参数的标识符"gunNum", value为事件参数值需要遵循数值规范:int类型,取值范围0~100之间; eventMap.put("gunNum", new ValueWrapper.IntValueWrapper(50)); OutputParams eventOutput = new OutputParams(eventMap); // 参数identity为"startChaResEvt"属于物模型事件标识符。 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======="); } }); }
监听下行服务
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 { /** * 设置属性(property)的模式 */ // "set"为设置属性默认的标识符 if ("set".equals(identify)) { // TODO 用户需要设置真实设备的属性 /** * 向云端同步设置好的属性值 */ 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, "收到异步下行数据 " + data); // 响应云端接收数据成功 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); } }); /** * 服务(service)的模式 */ // "startChaResService"为服务的标识符 } else if ("startChaResService".equals(identify)) { Map<String, ValueWrapper> inputParams = (Map<String, ValueWrapper>) ((InputParams) result).getData(); // TODO 根据服务入参inputParams执行设备逻辑,比如启动充电 // 充电完成后,向云端返回输出参数 OutputParams outputParams = new OutputParams(); // key为"charm"属于物模型中"startChaResService"服务出参标识符,value为出参值遵循数据规范:int类型,数据范围1~100之间; outputParams.put("charm", new ValueWrapper.IntValueWrapper(20)); itResResponseCallback.onComplete(identify, null, outputParams); } else { // 根据不同的服务做不同的处理,跟具体的服务有关系 OutputParams outputParams = new OutputParams(); // 根据特定服务,按照服务规范返回服务的出参。 itResResponseCallback.onComplete(identify, null, outputParams); } } catch (Exception e) { e.printStackTrace(); ALog.d(TAG, "云端返回数据格式异常"); } } public void onSuccess(Object o, OutputParams outputParams) { ALog.d(TAG, "onSuccess() called with: o = [" + o + "], outputParams = [" + outputParams + "]"); ALog.d(TAG, "注册服务成功"); } public void onFail(Object o, ErrorInfo errorInfo) { ALog.d(TAG, "onFail() called with: o = [" + o + "], errorInfo = [" + errorInfo + "]"); ALog.d(TAG, "注册服务失败"); } };
在device_id.json文件中配置设备证书信息(productKey、deviceName、deviceSecret)。
"productKey": "*****", "deviceName": "*****", "deviceSecret": "*************",
在src/main/java/com.aliyun.alink.devicesdk.demo目录下HelloWorld.java文件中,配置MQTT接入域名。具体内容,请参见查看实例终端节点。
config.channelHost = pk + ".iot-as-mqtt." + deviceInfoData.region + ".aliyuncs.com:1883";
运行HelloWorld.java文件。
代码运行成功后:
上报属性成功,云端返回如下REPLY信息,表示设备与物联网平台成功进行通信。
设备收到属性设置指令,在物理设备上修改属性完成后,建议将新属性同步上报到云端。
后续步骤
该文章对您有帮助吗?