官网上假设的一个智能家居场景,结合 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.java和Airconditioner.java文件中配置
DEVICE_KEY_NAME
和DEVICE_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 设备进行 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 设备发布自身 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 出门离开了的消息,至此实现出门关闭空调设备的目的。