天天看點

阿裡雲物聯網平台裝置日志上報示例Demo

Step By Step

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

阿裡雲物聯網平台裝置日志上報示例Demo
資料上行
- 請求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連接配接阿裡雲IoT
import 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、平台修改:裝置本地日志上報 開關狀态

阿裡雲物聯網平台裝置日志上報示例Demo

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、控制台:裝置本地日志檢視

阿裡雲物聯網平台裝置日志上報示例Demo

參考連結

裝置日志上報 裝置本地日志