网关产品具备普通产品的基本功能,同时支持绑定不能直连 Internet 的产品,可用于代理子设备与腾讯云物联网通信 IoT Hub 进行数据交互。本文档将讲述网关产品通过 MQTT 协议连接到腾讯云IoT Hub以及代理子设备上下线、发送和接收消息的功能。
体验网关功能需要在控制台创建网关产品,绑定其子产品,以及绑定子设备。请参考 设备接入准备 ,网关产品接入
示例中编辑 unit_test_config.json 文件中的参数配置信息
{
"TESTGATEWAYSAMPLE_PRODUCT_ID": "",
"TESTGATEWAYSAMPLE_DEVICE_NAME": "",
"TESTGATEWAYSAMPLE_DEVICE_PSK": "",
"TESTGATEWAYSAMPLE_SUB_PRODUCT_ID": "",
"TESTGATEWAYSAMPLE_SUB_DEV_NAME": "",
"TESTGATEWAYSAMPLE_SUB_DEV_PSK": "",
"TESTGATEWAYSAMPLE_TEST_TOPIC": "",
}
以密钥认证方式为例,开发者需要在 unit_test_config.json 填写 TESTGATEWAYSAMPLE_PRODUCT_ID(网关产品ID)、TESTGATEWAYSAMPLE_DEVICE_NAME(网关设备名称)、TESTGATEWAYSAMPLE_DEVICE_PSK(网关设备密钥)、TESTGATEWAYSAMPLE_SUB_PRODUCT_ID(子设备产品ID)、TESTGATEWAYSAMPLE_SUB_DEV_NAME(子设备名称)、TESTGATEWAYSAMPLE_SUB_DEV_PSK(子设备密钥)参数。
运行 GatewaySampleTest.java 的main函数,设备上线后调用gatewaySubdevOnline(),让子设备上线。示例代码如下:
private static void gatewaySubdevOnline() {
try {
Thread.sleep(2000);
// set subdev online
mqttconnection.gatewaySubdevOnline(mSubProductID, mSubDevName);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
以下是子设备成功上线的logcat日志,在控制台可查看该设备的状态已更新为在线。
17/03/2021 09:52:22,726 [main] DEBUG TXGatewayConnection gatewaySubdevOnline 234 - set 9RW4A8OOFK & test_device to Online
17/03/2021 09:52:22,728 [main] INFO TXMqttConnection publish 567 - Starting publish topic: $gateway/operation/AP9ZLEVFKT/log_test Message: {"payload":{"devices":[{"device_name":"test_device","product_id":"9RW4A8OOFK"}]},"type":"online"}
17/03/2021 09:52:22,729 [MQTT Call: AP9ZLEVFKTlog_test] DEBUG GatewaySampleTest onPublishCompleted 347 - onPublishCompleted, status[OK], topics[[$gateway/operation/AP9ZLEVFKT/log_test]], userContext[], errMsg[publish success]
17/03/2021 09:52:22,822 [MQTT Call: AP9ZLEVFKTlog_test] DEBUG GatewaySampleTest onMessageReceived 375 - receive message, topic[$gateway/operation/result/AP9ZLEVFKT/log_test], message[{"type":"online","payload":{"devices":[{"product_id":"9RW4A8OOFK","device_name":"test_device","result":0}]}}]
运行 GatewaySampleTest.java 的main函数,设备上线后以及子设备也上线后,调用gatewaySubdevOffline(),让子设备下线。示例代码如下:
private static void gatewaySubdevOffline() {
try {
Thread.sleep(2000);
mqttconnection.gatewaySubdevOffline(mSubProductID, mSubDevName);//切换子设备下线
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
以下是子设备成功下线的logcat日志,在控制台可查看该设备的状态已更新为离线。
17/03/2021 09:58:36,324 [main] DEBUG TXGatewayConnection gatewaySubdevOffline 205 - set 9RW4A8OOFK & test_device to offline
17/03/2021 09:58:36,324 [main] INFO TXMqttConnection publish 567 - Starting publish topic: $gateway/operation/AP9ZLEVFKT/log_test Message: {"payload":{"devices":[{"device_name":"test_device","product_id":"9RW4A8OOFK"}]},"type":"offline"}
17/03/2021 09:58:36,325 [MQTT Call: AP9ZLEVFKTlog_test] DEBUG GatewaySampleTest onPublishCompleted 347 - onPublishCompleted, status[OK], topics[[$gateway/operation/AP9ZLEVFKT/log_test]], userContext[], errMsg[publish success]
17/03/2021 09:58:36,345 [MQTT Call: AP9ZLEVFKTlog_test] DEBUG GatewaySampleTest onMessageReceived 375 - receive message, topic[$gateway/operation/result/AP9ZLEVFKT/log_test], message[{"type":"offline","payload":{"devices":[{"product_id":"9RW4A8OOFK","device_name":"test_device","result":0}]}}]