Step By Step
一、裝置擷取日志配置(通過該功能,裝置端可以主動擷取:裝置本地日志上報開關的開啟情況)

資料上行
- 請求Topic:/sys/${productKey}/${deviceName}/thing/config/log/get
- 響應Topic:/sys/${productKey}/${deviceName}/thing/config/log/get_reply
1、裝置端訂閱:響應Topic
2、裝置端publish如下格式消息到服務端:
{
"id" : 123,
"version":"1.0",
"params" : {
"configScope":"device",
"getType":"content"
},
"method":"thing.config.log.get"
}
3、裝置端即可擷取裝置本地日志上報開關的開啟情況(mode為0表示未開啟,mode為1表示開啟)
4、Code Sample,參考連結:
基于開源JAVA MQTT Client連接配接阿裡雲IoTimport com.alibaba.taro.AliyunIoTSignUtil;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import java.util.HashMap;
import java.util.Map;
public class IoTDemoPubSubDemoSLSGetPro {
// 裝置三元組資訊
public static String productKey = "a1qLU******";
public static String deviceName = "device1";
public static String deviceSecret = "cA9wzIM6bL2QI6Dg****************";
public static String regionId = "cn-shanghai";
// 物模型-屬性上報topic
private static String pubTopic = "/sys/" + productKey + "/" + deviceName + "/thing/config/log/get";
// 自定義topic,在産品Topic清單位置定義
private static String subTopic = "/sys/" + productKey + "/" + deviceName + "/thing/config/log/get_reply";
private static MqttClient mqttClient;
public static void main(String [] args){
initAliyunIoTClient();
postDeviceProperties();
try {
mqttClient.subscribe(subTopic); // 訂閱Topic
} catch (MqttException e) {
System.out.println("error:" + e.getMessage());
e.printStackTrace();
}
// 設定訂閱監聽
mqttClient.setCallback(new MqttCallback() {
@Override
public void connectionLost(Throwable throwable) {
System.out.println("connection Lost");
}
@Override
public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
System.out.println("Sub message");
System.out.println("Topic : " + s);
System.out.println(new String(mqttMessage.getPayload())); //列印輸出消息payLoad
}
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
}
});
}
/**
* 初始化 Client 對象
*/
private static void initAliyunIoTClient() {
try {
// 構造連接配接需要的參數
String clientId = "java" + System.currentTimeMillis();
Map<String, String> params = new HashMap<>(16);
params.put("productKey", productKey);
params.put("deviceName", deviceName);
params.put("clientId", clientId);
String timestamp = String.valueOf(System.currentTimeMillis());
params.put("timestamp", timestamp);
// cn-shanghai
String targetServer = "tcp://" + productKey + ".iot-as-mqtt."+regionId+".aliyuncs.com:1883";
String mqttclientId = clientId + "|securemode=3,signmethod=hmacsha1,timestamp=" + timestamp + "|";
String mqttUsername = deviceName + "&" + productKey;
String mqttPassword = AliyunIoTSignUtil.sign(params, deviceSecret, "hmacsha1");
connectMqtt(targetServer, mqttclientId, mqttUsername, mqttPassword);
} catch (Exception e) {
System.out.println("initAliyunIoTClient error " + e.getMessage());
}
}
public static void connectMqtt(String url, String clientId, String mqttUsername, String mqttPassword) throws Exception {
MemoryPersistence persistence = new MemoryPersistence();
mqttClient = new MqttClient(url, clientId, persistence);
MqttConnectOptions connOpts = new MqttConnectOptions();
// MQTT 3.1.1
connOpts.setMqttVersion(4);
connOpts.setAutomaticReconnect(false);
connOpts.setConnectionTimeout(10);
// connOpts.setCleanSession(true);
connOpts.setCleanSession(false);
connOpts.setUserName(mqttUsername);
connOpts.setPassword(mqttPassword.toCharArray());
connOpts.setKeepAliveInterval(60);
mqttClient.connect(connOpts);
}
/**
* 彙報屬性
*/
private static void postDeviceProperties() {
try {
//上報資料
//進階版 物模型-屬性上報payload
System.out.println("上報裝置日志:");
String payloadJson = "{\n" +
" \"id\" : 123,\n" +
" \"version\":\"1.0\",\n" +
" \"params\" : {\n" +
" \"configScope\":\"device\", \n" +
" \"getType\":\"content\"\n" +
" },\n" +
" \"method\":\"thing.config.log.get\"\n" +
"}";
MqttMessage message = new MqttMessage(payloadJson.getBytes("utf-8"));
message.setQos(1);
mqttClient.publish(pubTopic, message);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
5、Result:
Sub message
Topic : /sys/a1qLU******/device1/thing/config/log/get_reply
{"code":200,"data":{"content":{"mode":1},"getType":"content"},"id":"123","method":"thing.config.log.get","version":"1.0"}
二、裝置接收訂閱雲端推送日志配置
資料下行
- Topic:/sys/${productKey}/${deviceName}/thing/config/log/push
1、裝置端訂閱下行Topic;
private static String subTopicSLS = "/sys/" + productKey + "/" + deviceName + "/thing/config/log/push";
mqttClient.subscribe(subTopicSLS);
2、平台修改:裝置本地日志上報 開關狀态
3、裝置端監聽情況
Sub message
Topic : /sys/a1qLU******/device1/thing/config/log/push
{"method":"thing.config.log.push","id":"1174554406","params":{"getType":"content","content":{"mode":0}},"version":"1.0"}
三、裝置上報日志内容(與正常的物模型屬性上報類似)
資料上行
- 請求Topic:/sys/${productKey}/${deviceName}/thing/log/post
- 響應Topic:/sys/${productKey}/${deviceName}/thing/log/post_reply
1、向請求Topic上行消息,
格式如下:
{
"id" : 123,
"version":"1.0",
"params" :[{
"utcTime": "2020-04-24T15:15:27.464+0800",
"logLevel": "ERROR",
"module": "ModuleA",
"code" :"",
"traceContext": "123456",
"logContent" : "some log content"
}],
"method" : "thing.log.post"
}
2、Code Sample
/**
* 上報裝置日志
*/
private static void postDeviceProperties() {
try {
//上報資料
//進階版 物模型-屬性上報payload
System.out.println("上報裝置日志:");
String payloadJson = "{\n" +
" \"id\" : 123,\n" +
" \"version\":\"1.0\",\n" +
" \"params\" :[{\n" +
" \"utcTime\": \"2020-04-24T15:15:27.464+0800\", \n" +
" \"logLevel\": \"ERROR\", \n" +
" \"module\": \"ModuleA\", \n" +
" \"code\" :\"\", \n" +
" \"traceContext\": \"123456\", \n" +
" \"logContent\" : \"some log content\" \n" +
" }], \n" +
" \"method\" : \"thing.log.post\"\n" +
"}";
MqttMessage message = new MqttMessage(payloadJson.getBytes("utf-8"));
message.setQos(1);
mqttClient.publish(pubTopic, message);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
3、控制台:裝置本地日志檢視