阿里云物联网平台设备日志上报示例Demo
概述
物联网平台支持设备将本地日志上报到云端,在控制台进行查询和故障分析。在设备详情页,开启设备本地日志上报开关后,设备才能将本地日志上报到云端。
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连接阿里云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、平台修改:设备本地日志上报 开关状态
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、控制台:设备本地日志查看
参考链接

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
阿里面试官现身说法:刷了一批又一批,有些话不得不对你们说...
序言 本文主要介绍校招,疫情原因今年的春招持续的时间拉长了,截止到目前我已经面试超过一百位应届生,批改过超过150份笔试的试卷,因为通过率较低,我也被同事吐槽许多次让我“手下留情”。今天我就想聊一聊,我自己的面试标准。这不是一篇什么攻略文,旨在抛砖引玉,大家一起探讨如何面试更有效率。 需要写在前面的是,“平等“和”高效”一直都是互斥的。信息从一个人传递到另一个人那里,由于表达能力和接收能力的限制,必然产生信息熵,所以花一天的时间好好了解一个人的技术实力和学习能力,自然要比一场半小时的面试要更加的全面。但很可惜的是,现实中没有那么长的时间,所以一个面试官最基本的任务,就是引导面试者在最有限的时间里,最大化展示出自己的能力。 简历原则 最近看到很多技术大牛放出来自己的简历,但就我个人而言,感觉参考意义真的不大——这些大牛不管简历写成啥样,模板用啥,哪怕是TXT格式不做排版,就光看项目内容和技术深度就足够拿到offer了,但是正常人来说并没有这种“底蕴”,看完可能只会觉得“握草牛逼啊”,然后自己写简历时候仍然一脸懵逼。其实应届生做简历真没那么复杂,能够突出的无非是: GPA、算法奖项名次、奖...
-
下一篇
【云栖号案例 | 物联网&人工智能】言图科技上云 成功解决提供深度学习API调用问题
云栖号案例库:【点击查看更多上云案例】不知道怎么上云?看云栖号案例库,了解不同行业不同发展阶段的上云方案,助力你上云决策! 公司介绍 言图科技总部位于武汉光谷,致力于人工智能领域的自然语言处理、图像处理基础算法、软件、平台与设备研发。目前,公司拥有成熟的自然语言处理基础软件集、语义理解工具集、知识图谱工具集、智能陪练机器人、聊天机器人、情感与专注度分析工具、无人机大数据分析服务器系统等多种产品,并被多家金融集团、大型国企、科研机构与政府机关采用。公司在积极开拓市场的同时,投入大量资金进行基础研究。 公司与华中科技大学计算机学院共同组建“华中科技大学计算机学院人工智能实验室”。 而且,团队成员在自然语言处理、知识图谱、视频分析、图像处理等方面取得了较为丰富的理论成果和技术积累,已在国内外权威杂志及会议上发表论文一百多篇,比如AAAI、SIGKDD、RTSS、CIKM、IEEE TKDE、IEEE TSMC-B、IEEE TC、ACM TWEB等。 业务痛点 线下的GPU服务器,成本特别高,而且非常不灵活。 没有使用过云GPU服务器,对服务器选型比较困惑。 对GPU、Tesla P100与...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS关闭SELinux安全模块
- Docker容器配置,解决镜像无法拉取问题
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS8编译安装MySQL8.0.19
- MySQL数据库在高并发下的优化方案
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程