官网上假设的一个智能家居场景,结合腾讯云物联网通信设备端 IoT Hub JAVA-SDK 体验更新设备属性信息与获取设备影子文档。请参考官网 场景二:设备状态上报与状态设置
体验前提,需要按照官网文档中创建产品设备。请参考官网 控制台使用手册-设备接入准备 。
下载Hub JAVA SDK Demo示例代码,准备开发环境,检查SDK的依赖关系,请参考 设备互通 , 设备影子 以及 设备影子数据流 了解设备影子开发。
请在 ShadowSampleTest.java 文件中填入所需的参数。
public class ShadowSampleTest {
private static String testProductIDString = "YOUR_PRODUCT_ID"; //产品ID
private static String testDeviceNameString = "YOUR_DEVICE_NAME"; //设备名称
private static String testPSKString = "YOUR_PSK"; //设备密钥(密钥认证)
}
此处以密钥认证为例
运行 ShadowSampleTest.java ,初始化mShadowConnection,将 设备影子 进行 MQTT 认证连接,设备影子通过调用update接口更新设备属性信息,先订阅自身 Topic $shadow/operation/result/${productId}/${deviceName}
, 然后将要上报的属性信息通过 Topic $shadow/operation/${productId}/${deviceName}
发布出去。示例代码如下:
public static void main(String[] args) {
...
mShadowConnection = new TXShadowConnection(testProductIDString, testDeviceNameString, testPSKString, new callback());
mShadowConnection.connect(options, null);
while(pubCount < testCnt) {
pubCount += 1;
Thread.sleep(20000);
if (pubCount < 3) { // 更新设备影子
List<DeviceProperty> mDevicePropertyList = new ArrayList<>();
DeviceProperty deviceProperty1 = new DeviceProperty();
deviceProperty1.key("updateCount").data(String.valueOf(pubCount)).dataType(TXShadowConstants.JSONDataType.INT);
mShadowConnection.registerProperty(deviceProperty1);
DeviceProperty deviceProperty2 = new DeviceProperty();
deviceProperty2.key("energyConsumption").data(String.valueOf(10+pubCount)).dataType(TXShadowConstants.JSONDataType.INT);
mShadowConnection.registerProperty(deviceProperty2);
DeviceProperty deviceProperty3 = new DeviceProperty();
deviceProperty3.key("temperatureDesire").data(String.valueOf(25)).dataType(TXShadowConstants.JSONDataType.INT);
mShadowConnection.registerProperty(deviceProperty3);
mDevicePropertyList.add(deviceProperty1);
mDevicePropertyList.add(deviceProperty2);
mDevicePropertyList.add(deviceProperty3);
mShadowConnection.update(mDevicePropertyList, null);
}
...
}
}
public static class callback extends TXShadowActionCallBack{
/**
* 设备属性更新回调接口
* @param propertyJSONDocument 从云端收到的原始设备属性json文档
* @param propertyList 更新后的设备属性集
*/
public void onDevicePropertyCallback(String propertyJSONDocument, List<DeviceProperty> propertyList) {
System.out.println("onDevicePropertyCallback " +propertyList);
}
}
观察Logcat日志。
TXMqttConnection connect 297 - Start connecting to ssl://XMN6AZ4M0Y.iotcloud.tencentdevices.com:8883
TXShadowConnection onConnectCompleted 633 - onConnectCompleted, status[OK], reconnect[false], msg[connected to ssl://XMN6AZ4M0Y.iotcloud.tencentdevices.com:8883]
TXMqttConnection subscribe 633 - Starting subscribe topic: $shadow/operation/result/XMN6AZ4M0Y/airConditioner1
TXMqttConnection subscribe 633 - Starting subscribe topic: XMN6AZ4M0Y/airConditioner1/data
TXShadowConnection onSubscribeCompleted 675 - onSubscribeCompleted, status[OK], errMsg[subscribe success], topics[[$shadow/operation/result/XMN6AZ4M0Y/airConditioner1]]
TXShadowConnection onSubscribeCompleted 675 - onSubscribeCompleted, status[OK], errMsg[subscribe success], topics[[XMN6AZ4M0Y/airConditioner1/data]]
TXMqttConnection publish 451 - Starting publish topic: $shadow/operation/XMN6AZ4M0Y/airConditioner1 Message: {"clientToken":"XMN6AZ4M0YairConditioner1-0","state":{"reported":{"energyConsumption":11,"updateCount":1,"temperatureDesire":25}},"type":"update","version":0}
以上日志为 设备影子 MQTT 已连接 成功,发布自身 Topic 成功并携带相关属性信息,观察控制台中创建的对应设备的状态已更改为上线,并在控制台中设备影子观察到reported已上报最新的属性信息。
前提,设备已认证连接在线,并订阅了 Topic $shadow/operation/result/${productId}/${deviceName}
, 调用 restAPI 接口 UpdateDeviceShadow 模拟家电管理后台发布目标温度配置,restAPI 请求参数例如:deviceName=airConditioner1, state={"desired" : {"temperatureDesire": 10}}, ProductId=XMN6AZ4M0Y, ShadowVersion要和控制台上最新的设备影子中的Version匹配,期望调整控制温度为 10°。
观察Logcat日志。
TXMqttConnection messageArrived 879 - Received topic: $shadow/operation/result/XMN6AZ4M0Y/airConditioner1, id: 0, message: {"clientToken":"XMN6AZ4M0YairConditioner1-2","payload":{"state":{"delta":{"temperatureDesire":10},"desired":{"temperatureDesire":10},"reported":{"energyConsumption":12,"status":1,"temperatureDesire":25,"updateCount":2}},"timestamp":1603269222843,"version":25},"result":0,"timestamp":1603269269,"type":"get"}
onDevicePropertyCallback [DeviceProperty{mKey='temperatureDesire', mData='10', mDataType=INT}]
以上日志为设备接收到云端下发的 delta 消息。期望更新的属性为temperatureDesire,期望设置目标温度10度。更新delta信息后,上报空的desired信息。
设备向$shadow/operation/${productId}/${deviceName}
主题发布 get 消息。示例代码如下:
mShadowConnection.get(null);
观察Logcat日志。
TXMqttConnection publish 451 - Starting publish topic: $shadow/operation/XMN6AZ4M0Y/airConditioner1 Message: {"clientToken":"XMN6AZ4M0YairConditioner1-2","type":"get"}
onRequestCallback{"state":{"desired":{"temperatureDesire":10},"delta":{"temperatureDesire":10},"reported":{"energyConsumption":12,"updateCount":2,"temperatureDesire":25,"status":1}},"version":32,"timestamp":1603269797600}
以上日志为发布一条带有 type 为 get 的 Topic 消息成功。可以在控制台中查看最新的设备影子文档,和拉取得到的文档是一致的。