Skip to content

Latest commit

 

History

History
executable file
·
147 lines (126 loc) · 8.49 KB

设备互通.md

File metadata and controls

executable file
·
147 lines (126 loc) · 8.49 KB

设备互通

操作场景

官网上假设的一个智能家居场景,结合 IoT Hub Android-SDK 体验基于设备间的消息和规则引擎实现设备之间的联动。请参考官网 场景一:设备互通

体验设备互通,需要按照官网文档中创建两类智能设备(Door、AirConditioner)。 还需要配置规则引擎,请参考官网 规则引擎概述 一章 , 将 数据转发到另一Topic

填写认证连接设备的参数

Door模型在SDK Demo示例中对应的是 Door.java 文件,需要在app-config.json中填写对应的参数。

{
  ...
  "DOOR_PRODUCT_ID":            "",
  "DOOR_DEVICE_NAME":           "",
  "DOOR_DEVICE_PSK":            "",
  ...
}

Airconditioner模型在SDK Demo示例中对应的是 Airconditioner.java 文件,需要在app-config.json中填写对应的参数。

{
  ...
  "AIRCONDITIONER_PRODUCT_ID":  "",
  "AIRCONDITIONER_DEVICE_NAME": "",
  "AIRCONDITIONER_DEVICE_PSK":  ""
}

注:Demo中的Door和Airconditioner是通过设备密钥的方式连接物联网通信平台;若想使用证书/设备私钥的方式去连接,需要在Door.javaAirconditioner.java文件中配置 DEVICE_KEY_NAMEDEVICE_CERT_NAME两个字段

运行示例程序体验设备互通模块

当 MQTT 认证方式为密钥认证时,在 MqttOptions 中不需要做 SSL 配置,走TCP,当您使用的sdk版本为3.3.0及以下时,密钥认证需要在 MqttOptions 中做 SSL 配置 options.setSocketFactory(AsymcSslUtils.getSocketFactory());

当 MQTT 认证方式为证书认证时,在 MqttOptions 中添加 SSL 配置 options.setSocketFactory(AsymcSslUtils.getSocketFactoryByAssetsFile(mContext, DEVICE_CERT_NAME, DEVICE_KEY_NAME));

运行示例程序,切换底部Tab,选择设备互通模块,初始化Airconditioner,将 Airconditioner 进行 MQTT 认证连接,认证连接通过后就订阅自身 Topic ${productId}/${deviceName}/control。示例代码如下:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    mDoor = new Door(IoTEntryFragment.this.getContext()); // 初始化Door实例,不会进行 MQTT 认证连接
    mAir = new Airconditioner(this.getContext(), new AirMqttActionCallBack()); // 初始化Airconditioner实例,会进行 MQTT 认证连接,设置 MQTT 回调
}

private class AirMqttActionCallBack extends TXMqttActionCallBack {
    @Override
    public void onConnectCompleted(Status status, boolean reconnect, Object userContext, String msg) { // MQTT 认证连接完成
        if (status.equals(Status.OK)) {
            mAir.subScribeTopic(); // 订阅自身 Topic
        }
    }
    ...
    @Override
    public void onMessageReceived(String topic, MqttMessage message) { // 收到来自云端的消息
        String logInfo;
        if (message.toString().contains("come_home")) {
            logInfo = "receive command: open airconditioner, count: " + atomicInteger.getAndIncrement();
        } else {
            logInfo = "receive command: close airconditioner, count: " + atomicInteger.getAndIncrement();
        }
        mParent.printLogInfo(TAG, logInfo, textView);
    }
}

以下是 Airconditioner 设备 成功上线并订阅自身 Topic 的logcat日志,在控制台中可查看 Airconditioner 设备的状态已更新为上线。

I/com.tencent.iot.hub.device.java.core.mqtt.TXMqttConnection: Starting subscribe topic: XMN6AZ4M0Y/airConditioner1/control
I/IoTEntryActivity: onSubscribeCompleted, status[OK], message[subscribe success]

体验 Door 设备进门

在设备互通模块上,点击进门按钮,将会触发 Door 设备进行 MQTT 认证连接,连接成功后发布自身 Topic:${productId}/${deviceName}/event,由于配置了规则引擎将数据转发,将会由云端规则引擎转发 Topic 消息给到 Airconditioner 设备。示例代码如下:

public void enterRoom() {
    ...
    mqttConnection = new TXMqttConnection(mContext, PRODUCT_ID, DEVICE_NAME, SECRET_KEY, new DoorMqttActionCallBack());
    mqttConnection.connect(options, null);
    ...
    if (mqttConnection.getConnectStatus().equals(TXMqttConstants.ConnectStatus.kConnected)) { // 如果已经连接状态,就直接发布自身 Topic
        ...
        mqttConnection.publish(topic, message, null);
    }
    ...
}

private class DoorMqttActionCallBack extends TXMqttActionCallBack {
    @Override
    public void onConnectCompleted(Status status, boolean reconnect, Object userContext, String msg) { // MQTT 认证连接完成
        if (status.equals(Status.OK)) { // 连接成功
            if (!reconnect) { // 不是重连 就发布自身 Topic
                MqttMessage message = new MqttMessage();
                message.setPayload(COME_HOME_MESSAGE.getBytes());
                String topic = String.format("%s/%s/%s", PRODUCT_ID, DEVICE_NAME, "event");
                mqttConnection.publish(topic, message, null);
            }
         }
    }
...
}

观察Logcat日志。

I/TXMQTT_1.2.3: Start connecting to ssl://9RW4A8OOFK.iotcloud.tencentdevices.com:8883
I/iot.scenarized.Door: onConnectCompleted:connected to ssl://9RW4A8OOFK.iotcloud.tencentdevices.com:8883
I/com.tencent.iot.hub.device.java.core.mqtt.TXMqttConnection: Starting publish topic: 9RW4A8OOFK/door1/event Message: {"action": "come_home", "targetDevice": "airConditioner1"}
I/TXMQTT_1.2.3: Received topic: XMN6AZ4M0Y/airConditioner1/control, id: 350, message: {"action":"come_home","targetDevice":"airConditioner1"}
D/IoTEntryActivity: receive command: open airconditioner, count: 0

以上日志为 Door 设备 MQTT 已连接 成功,Door 设备发布自身 Topic ,并携带了 action 为 come_home 的 message 消息,之后 Airconditioner 设备也接收到了由云端规则引擎转发来的 Topic 进门回家的消息,至此实现进门打开空调设备的目的。

体验 Door 设备出门

在设备互通模块上,点击出门按钮,将会触发 Door 设备发布自身 Topic:${productId}/${deviceName}/event,由于配置了规则引擎将数据转发,将会由云端规则引擎转发 Topic 消息给到 Airconditioner 设备, Door 设备断开 MQTT 连接。示例代码如下:

public void leaveRoom() {
    ...
    MqttMessage message = new MqttMessage();
    message.setPayload(LEAVE_HOME_MESSAGE.getBytes());
    String topic = String.format("%s/%s/%s", PRODUCT_ID, DEVICE_NAME, "event");
    mqttConnection.publish(topic, message, null); // 发布自身 Topic 携带 LEAVE_HOME_MESSAGE(leave_home) 的消息
    closeConnection(); // 关闭 Door 设备的 MQTT 连接
}

观察Logcat日志。

I/com.tencent.iot.hub.device.java.core.mqtt.TXMqttConnection: Starting publish topic: 9RW4A8OOFK/door1/event Message: {"action": "leave_home", "targetDevice": "airConditioner1"}
I/com.tencent.iot.hub.device.java.core.mqtt.TXMqttConnection: deliveryComplete, token.getMessageId:2
I/iot.scenarized.Door: onDisconnectCompleted, status[OK], msg[disconnected to ssl://9RW4A8OOFK.iotcloud.tencentdevices.com:8883]
I/TXMQTT_1.2.3: Received topic: XMN6AZ4M0Y/airConditioner1/control, id: 351, message: {"action":"leave_home","targetDevice":"airConditioner1"}
D/IoTEntryActivity: receive command: close airconditioner, count: 1

以上日志为 Door 设备发布订阅自身 Topic ,并携带了 action 为 leave_home 的 message 消息并断开 MQTT 连接,之后 Airconditioner 设备也接收到了由云端规则引擎转发来的 Topic 出门离开了的消息,至此实现出门关闭空调设备的目的。