阿里云物联网平台自定义Topic脚本解析功能演示
概述
之前物联网平台自定义Topic均做消息的直接透传,不做类似物模型模式的数据脚本解析。平台最新推出的自定义Topic脚本解析功能,设备通过携带解析标记(?_sn=default)的自定义Topic上报数据,物联网平台收到数据后,调用您在控制台提交的数据解析脚本,将自定义格式数据转换为JSON结构体,再流转给后续业务系统。本文主要演示该功能的具体功能实现。
Step By Step
1、创建产品和设备
2、添加脚本
3、设备端通过自定义Topic模拟上行数据
import com.alibaba.taro.AliyunIoTSignUtil;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
// 透传类设备测试
public class IoTDemoPubSubDemoForPersonalTopic {
// 设备三元组信息
public static String productKey = "a1wJG******";
public static String deviceName = "Device1";
public static String deviceSecret = "40YEyiGzXmvhDdpvbUVFCHjC********";
public static String regionId = "cn-shanghai";
private static String pubTopic = "/"+ productKey + "/" + deviceName + "/user/update?_sn=default";//自定义Topic做脚本解析
private static MqttClient mqttClient;
public static void main(String [] args){
initAliyunIoTClient(); // 初始化Client
ScheduledExecutorService scheduledThreadPool = new ScheduledThreadPoolExecutor(1,
new ThreadFactoryBuilder().setNameFormat("thread-runner-%d").build());
scheduledThreadPool.scheduleAtFixedRate(()->postDeviceProperties(), 10,10, TimeUnit.SECONDS);
}
/**
* 初始化 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.setCleanSession(true);
connOpts.setUserName(mqttUsername);
connOpts.setPassword(mqttPassword.toCharArray());
connOpts.setKeepAliveInterval(60);
mqttClient.connect(connOpts);
}
/**
* 汇报属性
*/
private static void postDeviceProperties() {
try {
//上报数据
System.out.println("自定义Topic上报属性值");
//0x000000000100320100000000
String hexString = "000000000100320100000000";
byte[] payLoad = hexToByteArray(hexString);
MqttMessage message = new MqttMessage(payLoad);
message.setQos(0);
mqttClient.publish(pubTopic, message);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
/**
* hex字符串转byte数组
* @param inHex 待转换的Hex字符串
* @return 转换后的byte数组结果
*/
public static byte[] hexToByteArray(String inHex){
int hexlen = inHex.length();
byte[] result;
if (hexlen % 2 == 1){
//奇数
hexlen++;
result = new byte[(hexlen/2)];
inHex="0"+inHex;
}else {
//偶数
result = new byte[(hexlen/2)];
}
int j=0;
for (int i = 0; i < hexlen; i+=2){
result[j]=hexToByte(inHex.substring(i,i+2));
j++;
}
return result;
}
/**
* Hex字符串转byte
* @param inHex 待转换的Hex字符串
* @return 转换后的byte
*/
public static byte hexToByte(String inHex) {
return (byte) Integer.parseInt(inHex, 16);
}
}
4、上行消息查看
5、注意事项
1、在物联网平台创建自定义Topic时按正常Topic定义,不添加该解析标记;
2、仅解析设备上报云端的数据,不解析云端下行数据;
3、仅解析上报数据的Payload,并返回解析后的Payload;
4、解析前后,数据所在Topic不变。例如,设备发送到/${productKey}/${deviceName}/user/update的数据,解析后仍在该Topic中。
参考链接

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
不见面,仍在线
面对来势汹汹的“新型冠状病毒肺炎”,多个省份启动重大突发公共卫生事件一级响应。春节假期延长,不少企业也采取了延迟上班、远程上班等应对措施。 对开发者这样的脑力劳动者而言,只要电脑在手,身在何处都不影响我们搬砖。那么问题来了:如何更高效地协同?团队如何迅速适应远程协作? Gitee 企业版提供安全、稳定、可靠的企业级项目管理和代码协作一体化云开发平台,即使我们相隔万里,依然可以通过它进行实现团队研发工作的规划、拆解、跟踪,以及便利的编码协同。 精细代码管理 统一管理代码资源,方便随时随地访问 精细权限控制,可对分支、文件单独设置权限 完整、清晰、可视化地记录代码变更过程 Gitee 企业版的「 Pull Request 」可在开发者提交代码后,自动触发代码质量分析,减少人工审核,提升效率。同时支持在线代码评审,帮助企业提升代码质量。 过程管理 Gitee 企业版不仅精于代码管理,亦可灵活支撑团队研发的过程管理: 产品经理(或其他成员)使用码「需求管理」提出「需求」; 需求经确认可纳入「项目」管理,由技术管理者转化成技术实现方案,通过「里程碑」规划迭代; 接下来,将里程碑拆分为具体任务,安...
-
下一篇
年轻人对 IT 一无所知?
有些人认为年轻人是未来,特别是 IT 行业,不年轻也根本无法与其他人竞争。关于年轻人与 IT,一位作者Zeyphros 发表于 2016 年的一篇文章值得思考。 作者的观点很明确,“Teens don't have a clue about IT”,他认为年轻人对 IT 一无所知。文章最开始抛出了大家信以为真的观念:许多老师和父母认为,年轻一代比他们会更了解技术和计算机,因为现在的年轻人与计算机一起成长,在成长中一直在使用计算机完成各种任务。 然而作者认为这根本不是真实情况。今天的年轻人可能已经随着 IT 技术成长,但并不意味着他们知道相关技术的原理,他们可能会知道如何使用 Android 和 iOS 应用,但却无法理解什么是 Android 和 iOS。 同样的,年轻人知道如何使用 Windows 和 macOS,知道它们的一般用途,知道如何安装和启动各种应用,但是不了解背后的原理,甚至不知道设置菜单中所有设置的含义。 并且,当你解释内部情况时,他们将无视你。当你告诉他们某个设置可能会做什么时,他们将忽视你。他们很可能不会在意系统的运行,他们所需要做的就是运行自己喜欢的应用的任何版本...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8编译安装MySQL8.0.19
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Hadoop3单机部署,实现最简伪集群
- MySQL数据库在高并发下的优化方案