Skip to content

Latest commit

 

History

History
112 lines (93 loc) · 7.47 KB

设备状态上报与状态设置.md

File metadata and controls

112 lines (93 loc) · 7.47 KB

设备状态上报与状态设置

操作场景

官网上假设的一个智能家居场景,结合腾讯云物联网通信设备端 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 消息成功。可以在控制台中查看最新的设备影子文档,和拉取得到的文档是一致的。