阿里云物联网平台自定义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条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS7安装Docker,走上虚拟化容器引擎之路
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker快速安装Oracle11G,搭建oracle11g学习环境