本文将介绍如何在腾讯云物联网开发平台控制台(以下简称控制台)创建设备, 并结合 SDK Demo 快速体验设备端通过 MQTT 协议连接腾讯云端,以及断开 MQTT 连接使设备下线。
设备接入SDK前需要在控制台中创建项目产品设备,并获取产品ID、设备名称、设备证书(证书认证)、设备私钥(证书认证)、设备密钥(密钥认证),设备与云端认证连接时需要用到以上信息。请参考官网 用户指南-项目管理、 用户指南-产品定义、 用户指南-设备调试。
下载IoT Explorer Android-SDK Demo示例代码
编辑 app-config.json 文件中的参数配置信息
{
"PRODUCT_ID": "",
"DEVICE_NAME": "",
"DEVICE_PSK": "",
"SUB_PRODUCT_ID": "",
"SUB_DEV_NAME": "",
"SUB_DEV_PSK": "",
"SUB_PRODUCT_ID2": "",
"SUB_DEV_NAME2": "",
"SUB_DEV_PSK2": ""
}
如果控制台创建设备使用的是密钥认证方式,需要在 app-config.json 填写 PRODUCT_ID(产品ID)、DEVICE_NAME(设备名称)、DEVICE_PSK(设备密钥),示例中使用的是密钥认证。
如果控制台创建设备使用的是证书认证方式,除了需要在 app-config.json 填写 PRODUCT_ID(产品ID)、DEVICE_NAME(设备名称),DEVICE_PSK(设备密钥)设置为null,还需修改 DataTemplateSample 初始化方法为
public DataTemplateSample(Context context, String brokerURL, String productId, String devName, String devPSK, String devCertName, String devKeyName, TXMqttActionCallBack mqttActionCallBack, final String jsonFileName,TXDataTemplateDownStreamCallBack downStreamCallBack)
通过 AssetManager 进行读取证书,在工程 explorer/device-android-demo/src/main 路径下创建 assets 目录并将设备证书、私钥放置在该目录中,在 DataTemplateSample 初始化时传入 devCertName(设备证书文件名称)devKeyName(设备私钥文件名称)。
控制台上创建的每一个产品都可以设置该产品对应的数据模板,数据模板对应的功能包含三大类:属性,事件和行为。控制台数据模板的使用,请参考官网 数据模板 章节。
示例中的设备需要将控制台上下载的json文件导入工程中,用来规范上报属性、事件时数据的校验,请将json文件放到 assets 目录中,设置 mJsonFileName(json文件名称)。
选择explorer-demo的 Android App ,点击 Android Studio 菜单栏上的 Run 'explorer-demo' 按钮安装 Demo。
运行示例程序,在数据模板模块上点击设备上线
按钮,进行认证连接,使设备上线。示例代码如下:
mDataTemplateSample = new DataTemplateSample(mParent, mBrokerURL, mProductID, mDevName, mDevPSK, new SelfMqttActionCallBack(), mJsonFileName, new SelfDownStreamCallBack());
mDataTemplateSample.connect(); // MQTT连接
观察Logcat日志。
I/TXMQTT_1.2.3: Start connecting to ssl://LWVUL5SZ2L.iotcloud.tencentdevices.com:8883
I/TXDataTemplateFragment: onConnectCompleted, status[OK], reconnect[false], userContext[MQTTRequest{requestType='connect', requestId=0}], msg[connected to ssl://LWVUL5SZ2L.iotcloud.tencentdevices.com:8883]
以上是设备通过MQTT成功连接至云端的日志,在控制台可查看该设备的状态已更新为在线。
TXMqttActionCallBack为设备行为的回调
/**
* MQTT Connect完成回调
*
* @param status Status.OK: 连接成功; Status.ERROR: 连接失败
* @param reconnect true: 重新连接 false: 首次连接
* @param userContext 用户上下文
* @param msg 连接信息
*/
@Override
public void onConnectCompleted(Status status, boolean reconnect, Object userContext, String msg){}
/**
* MQTT连接断开回调
*
* @param cause 连接断开原因
*/
@Override
public void onConnectionLost(Throwable cause) {}
/**
* MQTT Disconnect完成回调
*
* @param status Status.OK: 断连成功; Status.ERROR: 断连失败
* @param userContext 用户上下文
* @param msg 详细信息
*/
@Override
public void onDisconnectCompleted(Status status, Object userContext, String msg) {}
/**
* 发布消息完成回调
*
* @param status Status.OK: 发布消息成功; Status.ERROR: 发布消息失败
* @param token 消息token,包含消息内容结构体
* @param userContext 用户上下文
* @param msg 详细信息
*/
@Override
public void onPublishCompleted(Status status, IMqttToken token, Object userContext, String errMsg) {}
/**
* 订阅主题完成回调
*
* @param status Status.OK: 订阅成功; Status.ERROR: 订阅失败
* @param token 消息token,包含消息内容结构体
* @param userContext 用户上下文
* @param msg 详细信息
*/
@Override
public void onSubscribeCompleted(Status status, IMqttToken asyncActionToken, Object userContext, String errMsg) {}
/**
* 取消订阅主题完成回调
*
* @param status Status.OK: 取消订阅成功; Status.ERROR: 取消订阅失败
* @param token 消息token,包含消息内容结构体
* @param userContext 用户上下文
* @param msg 详细信息
*/
@Override
public void onUnSubscribeCompleted(Status status, IMqttToken asyncActionToken, Object userContext, String errMsg) {}
/**
* 收到订阅主题的消息Push
*
* @param topic 主题名称
* @param message 消息内容
*/
@Override
public void onMessageReceived(final String topic, final MqttMessage message) {}
TXDataTemplateDownStreamCallBack为下行消息处理的回调,收到以下回调的前提是在设备上线后订阅过相关的数据模板的topic,可参考 订阅与取消订阅 Topic 主题 。
/**
* 属性上报、设备信息上报、清除控制、事件上报、多事件上报的回复回调
*
* @param replyMsg 属性上报、设备信息上报、清除控制、事件上报、多事件上报的回复信息
*/
@Override
public void onReplyCallBack(String replyMsg) {}
/**
* 获取设备最新上报信息的回复回调
*
* @param data 获取设备最新上报信息的回复信息
*/
@Override
public void onGetStatusReplyCallBack(JSONObject data) {}
/**
* 收到云端属性下发的控制信息回调
*
* @param msg 收到云端属性下发的控制信息
* @return 包含code(回复码)和status(回复信息)的JSONObject,用来回复属性下发控制消息。
*/
@Override
public JSONObject onControlCallBack(JSONObject msg) {}
/**
* 收到云端向设备下发的行为信息回调
*
* @param msg 收到云端向设备下发的行为信息
* @return 包含code(回复码)和status(回复信息)的JSONObject,用来回复下发的行为消息。
*/
@Override
public JSONObject onActionCallBack(String actionId, JSONObject params){}
/**
* 用户在腾讯连连小程序或腾讯连连App删除设备时由云端发送给设备的通知消息,便于设备重置或网关类设备清除子设备数据。
*
* @param msg 用户在腾讯连连小程序或腾讯连连App删除设备时由云端发送给设备的通知消息
*/
@Override
public void onUnbindDeviceCallBack(String msg) {}
/**
* 用户在腾讯连连小程序或腾讯连连App绑定设备时由云端发送给设备的通知消息,设备接收后可根据业务需求自行处理
*
* @param msg 用户在腾讯连连小程序或腾讯连连App绑定设备时由云端发送给设备的通知消息
*/
@Override
public void onBindDeviceCallBack(String msg) {}
可通过getConnectStatus()API获取设备连接状态
enum ConnectStatus {
kConnectIdle, //初始状态
kConnecting, // 连接中
kConnected, // 连接上/上线
kConnectFailed,// 连接失败
kDisconnected // 已断开连接
}
运行示例程序,当设备已上线,在数据模板模块上点击设备下线
按钮,使设备断开 MQTT 认证连接,设备下线。示例代码如下:
mDataTemplateSample.disconnect(); // 断开 MQTT 连接,
观察Logcat日志。
I/TXDataTemplateFragment: onDisconnectCompleted, status[OK], userContext[MQTTRequest{requestType='disconnect', requestId=1}], msg[disconnected to ssl://LWVUL5SZ2L.iotcloud.tencentdevices.com:8883]
以上是设备成功断开MQTT连接的日志,在控制台可查看该设备的状态已更新为离线。