物模型开发
更新时间:2018-10-23 21:23:02
设备可以使用物模型功能,实现属性上报(如上报设备状态)、事件上报(上报设备异常或错误)和服务调用(通过云端调用设备提供的服务)。
getDeviceThing() 返回的 IThing 接口 介绍参见 IThing ApiReference。
设备属性
设备属性上报
// 设备上报 Map<String, ValueWrapper> reportData = new HashMap<>(); // identifier 是云端定义的属性的唯一标识,valueWrapper是属性的值 // reportData.put(identifier, valueWrapper); // 参考示例,更多使用可参考demo LinkKit.getInstance().getDeviceThing().thingPropertyPost(reportData, new IPublishResourceListener() { @Override public void onSuccess(String resID, Object o) { // 属性上报成功 resID 设备属性对应的唯一标识 } @Override public void onError(String resId, AError aError) { // 属性上报失败 } });
设备属性获取
// 根据 identifier 获取当前物模型中该属性的值 String identifier = "xxx"; LinkKit.getInstance().getDeviceThing().getPropertyValue(identifier); // 获取所有属性 LinkKit.getInstance().getDeviceThing().getProperties()
设备事件
设备事件上报
HashMap<String, ValueWrapper> hashMap = new HashMap<>(); // TODO 用户根据实际情况设置 // 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 resId, Object o) { // 事件上报成功 } @Override public void onError(String resId, AError aError) { // 事件上报失败 } });
设备服务
设备服务获取
Service 定义参见 Service API Reference。// 获取设备支持的所有服务 LinkKit.getInstance().getDeviceThing().getServices()
设备服务调用监听
云端在添加设备服务时,需设置该服务的调用方式,由Service中的callType 字段表示。同步服务调用时callType="sync"
;异步服务调用callType="async"
。设备属性设置和获取也是通过服务调用监听方式实现云端服务的下发。异步服务调用
设备先注册服务的处理监听器,当云端触发异步服务调用的时候,下行的请求会到注册的监听器中。一个设备会有多种服务,通常需要注册所有服务的处理监听器。onProcess 是设备收到的云端下行的服务调用,第一个参数是需要调用服务对应的 identifier,用户可以根据 identifier (identifier 是云端在创建属性或事件或服务的时候的标识符,可以在云端产品的功能定义找到每个属性或事件或服务对应的identifier)做不同的处理。云端调用设置服务的时候,设备需要在收到设置指令后,调用设备执行真实操作,操作结束后上报一条属性状态变化的通知。// 用户可以根据实际情况注册自己需要的服务的监听器 LinkKit.getInstance().getDeviceThing().setServiceHandler(service.getIdentifier(), mCommonHandler); // 服务处理的handler private ITResRequestHandler mCommonHandler = new ITResRequestHandler() { @Override public void onProcess(String identify, Object result, ITResResponseCallback itResResponseCallback) { // 收到云端异步服务调用 identify 设备端属性或服务唯一标识 result 下行服务调用数据 // iotResResponseCallback 用户处理完服务调用之后响应云端 具体使用参见 Demo 代码 try { if (SERVICE_SET.equals(identify)) { // TODO 用户按照真实设备的接口调用 设置设备的属性 // 设置完真实设备属性之后,上报设置完成的属性值 // 用户根据实际情况判断属性是否设置成功 这里测试直接返回成功 boolean isSetPropertySuccess = true; if (isSetPropertySuccess){ if (result instanceof InputParams) { Map<String, ValueWrapper> data = (Map<String, ValueWrapper>) ((InputParams) result).getData(); // data.get() // 响应云端 接收数据成功 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 { // 根据不同的服务做不同的处理,跟具体的服务有关系 showToast("用户根据真实的服务返回服务的值,请参照set示例"); OutputParams outputParams = new OutputParams(); // outputParams.put("op", new ValueWrapper.IntValueWrapper(20)); itResResponseCallback.onComplete(identify,null, outputParams); } } catch (Exception e) { e.printStackTrace(); showToast("TMP 返回数据格式异常"); } } @Override public void onSuccess(Object o, OutputParams outputParams) { // 服务注册成功 tag:用户传入的tag,未使用到 outputParams:异步回调成功的返回数据,outparams等类型 } @Override public void onFail(Object o, ErrorInfo errorInfo) { // 服务注册失败 } };
同步服务调用
同步服务调用是一个 RRPC 调用。用户可以注册一个下行数据监听,当云端触发服务调用时,可以在 onNotify 收到云端的下行服务调用。收到云端的下行服务调用之后,用户根据实际服务调用对设备做服务处理,处理之后需要回复云端的请求,即发布一个带有处理结果的请求到云端。RRPC 回复的 topic 将请求的 request 替换成 response, msgId 保持不变。LinkKit.getInstance().registerOnPushListener(new IConnectNotifyListener() { @Override public void onNotify(String connectId, String topic, AMessage aMessage) { if ("LINK_PERSISTENT".equals(connectId) && !TextUtils.isEmpty(topic) && topic.startsWith("/sys/" + DemoApplication.productKey + "/" + DemoApplication.deviceName + "/rrpc/request")){ // showToast("收到云端同步下行"); MqttPublishRequest request = new MqttPublishRequest(); request.isRPC = false; request.topic = topic.replace("request", "response"); String resId = topic.substring(topic.indexOf("rrpc/request/")+13); request.msgId = resId; // TODO 用户根据实际情况填写 仅做参考 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) { // 上报失败 aError:错误原因 } }); } } @Override public boolean shouldHandle(String connectId, String topic) { return true; } @Override public void onConnectStateChange(String connectId, ConnectState connectState) { } })