设备上报二进制数据在 IoT 平台解析实践

简介: 设备上报二进制数据在 IoT 平台解析实践

设备上报二进制数据在 IoT 平台解析实践


在IoT场景中,很多传感器采集到的是私有协议二进制数据流,设备端又不具备转换成结构化JSON的能力,这时设备可以通过自定义Topic上报二进制数据,在IoT物联网平台支持云端配置解析脚本,动态转换成结构化的JSON数据。

完整端到端开发过程如下:

  1. 明确二进制上报的Topic和数据格式规则
  2. 云端预先配置针对指定Topic的原始数据配置JS解析脚本
  3. 在脚本解析模拟数据输入,校验脚本业务逻辑正确后,提交到IoT云端
  4. 运行设备,指定Topic上报原始数据
  5. 云端日志服务查看数据解析过程

我们以手表为例,传感器上报hex进制数据,到IoT物联网平台,在云端解析,最终以结构化JSON流转到业务系统。

1.技术架构方案

私有协议数据转换链路:

消息转换前后变化:

2云端开发

产品定义和消息通信Topic选择
image.png

数据转换脚本
原始数据:
0x035e8192fd0000000d0000001b00000a8c

数据业务格式:
image.png
云端产品数据解析脚本配置
image.png

完整脚本内容

/**
 * 将设备自定义topic数据转换为json格式数据, 设备上报数据到物联网平台时调用
 * 入参:topic   字符串,设备上报消息的topic
 * 入参:rawData byte[]数组                  不能为空
 * 出参:jsonObj JSON对象                    不能为空
 */
function transformPayload(topic, rawData) {
    var jsonObj = {}
/*
原始hex数据 : 0x035e8192fd0000000d0000001b00000a8c
转换后JSON数据 : 
{
  "heartbeat": 15,
  "id": 1585549855,
  "steps": 2700,
  "speed": 56
}
*/
    if (topic.endsWith('/user/update')) {
            var uint8Array = new Uint8Array(rawData.length);
            for (var i = 0; i < rawData.length; i++) {
                uint8Array[i] = rawData[i] & 0xff;
            }
            var dataView = new DataView(uint8Array.buffer, 0);
            var fHead = uint8Array[0]; // command
            if (fHead == 0x03) {
                //
                jsonObj['id'] = dataView.getInt32(1);
                //心跳
                jsonObj['heartbeat'] = dataView.getInt32(5);
                //速度
                jsonObj['speed'] = dataView.getInt32(9);
                //总步数
                jsonObj['steps'] = dataView.getInt32(13);
            }
    }
    return jsonObj;
}

3设备端开发

设备上报hex原始数据的代码片段:

const mqtt = require('aliyun-iot-mqtt');

//设备身份
const options = {
    productKey: "a1kaK7XC8oB",
    deviceName: "BlXj1yasMJXmpKxymoUC",
    deviceSecret: "41798535d799c60c8f67f02efd28b01c",
    regionId: "cn-shanghai"
};

//建立连接
const client = mqtt.getAliyunIotMqttClient(options);

// 消息Topic携带?_sn=default标识
const topic = `/${options.productKey}/${options.deviceName}/user/update?_sn=default`;
// 原始数据
var payloadArray = [ 3, 94, 129, 169, 59, 0, 0, 0, 23, 0, 0, 0, 79, 0, 0, 30, 220 ];
var payload = new Buffer(payloadArray);

// 发布数据到topic
client.publish(topic, payload);

4运行日志

设备上报原始hex数据日志

image.png

往期推荐

[

1、39张传感器工作原理GIF图汇总
2、智能手持测温枪开发实践
3、JMeter压测MQTT服务性能实战
4、IoT物联网平台日志服务详解
5、自建MQTT集群迁移阿里云IoT实践
6、工业Modbus电力104规约接入IoT平台
7、设备免烧录三元组,即时注册解决方案
8、IoT+TSDB+Quick BI 搭建楼宇环境监控
9、JS全栈开发,构建智能家居小程序

相关文章
|
6天前
|
存储 JSON API
深入解析RESTful API设计原则与实践
【9月更文挑战第21天】在数字化时代,后端开发不仅仅是编写代码那么简单。它关乎于如何高效地连接不同的系统和服务。RESTful API作为一套广泛采用的设计准则,提供了一种优雅的解决方案来简化网络服务的开发。本文将带你深入了解RESTful API的核心设计原则,并通过实际代码示例展示如何将这些原则应用于日常的后端开发工作中。
|
3天前
|
机器学习/深度学习 人工智能 自然语言处理
Hugging Face 论文平台 Daily Papers 功能全解析
【9月更文挑战第23天】Hugging Face 是一个专注于自然语言处理领域的开源机器学习平台。其推出的 Daily Papers 页面旨在帮助开发者和研究人员跟踪 AI 领域的最新进展,展示经精心挑选的高质量研究论文,并提供个性化推荐、互动交流、搜索、分类浏览及邮件提醒等功能,促进学术合作与知识共享。
|
7天前
|
Linux iOS开发 Docker
Docker:容器化技术的领航者 —— 从基础到实践的全面解析
在云计算与微服务架构日益盛行的今天,Docker作为容器化技术的佼佼者,正引领着一场软件开发与部署的革命。它不仅极大地提升了应用部署的灵活性与效率,还为持续集成/持续部署(CI/CD)提供了强有力的支撑。
176 69
|
6天前
|
编解码 开发工具 UED
QT Widgets模块源码解析与实践
【9月更文挑战第20天】Qt Widgets 模块是 Qt 开发中至关重要的部分,提供了丰富的 GUI 组件,如按钮、文本框等,并支持布局管理、事件处理和窗口管理。这些组件基于信号与槽机制,实现灵活交互。通过对源码的解析及实践应用,可深入了解其类结构、布局管理和事件处理机制,掌握创建复杂 UI 界面的方法,提升开发效率和用户体验。
48 12
|
2天前
|
数据挖掘 BI UED
B2B 领域 CRM 平台全景解析
在快节奏的商业环境中,移动CRM应用让企业随时随地管理客户关系,成为不可或缺的利器。本文深入探讨了七款优秀移动CRM应用:销售易Mobile、Salesforce Mobile、纷享销客、Zoho CRM Mobile、HubSpot Mobile、金蝶云·星辰移动端及用友U8+移动端,详细分析了各自的优势和适用场景。企业可根据具体需求、预算和行业特点,选择最适合的移动CRM解决方案,提升销售效率与管理水平,为企业发展注入新活力。
B2B 领域 CRM 平台全景解析
|
5天前
|
设计模式 数据库连接 PHP
PHP中的设计模式:单例模式的深入解析与实践
在PHP开发中,设计模式是提高代码可维护性、扩展性和复用性的关键技术之一。本文将深入探讨单例模式——一种确保类只有一个实例,并提供该实例的全局访问点的设计模式。我们将从单例模式的基本概念入手,剖析其在PHP中的应用方式,并通过实际案例展示如何在不同场景下有效利用单例模式来优化应用架构。
|
29天前
|
监控 网络协议 Java
Tomcat源码解析】整体架构组成及核心组件
Tomcat,原名Catalina,是一款优雅轻盈的Web服务器,自4.x版本起扩展了JSP、EL等功能,超越了单纯的Servlet容器范畴。Servlet是Sun公司为Java编程Web应用制定的规范,Tomcat作为Servlet容器,负责构建Request与Response对象,并执行业务逻辑。
Tomcat源码解析】整体架构组成及核心组件
|
1月前
|
存储 NoSQL Redis
redis 6源码解析之 object
redis 6源码解析之 object
56 6
|
14天前
|
存储 缓存 Java
什么是线程池?从底层源码入手,深度解析线程池的工作原理
本文从底层源码入手,深度解析ThreadPoolExecutor底层源码,包括其核心字段、内部类和重要方法,另外对Executors工具类下的四种自带线程池源码进行解释。 阅读本文后,可以对线程池的工作原理、七大参数、生命周期、拒绝策略等内容拥有更深入的认识。
什么是线程池?从底层源码入手,深度解析线程池的工作原理
|
18天前
|
开发工具
Flutter-AnimatedWidget组件源码解析
Flutter-AnimatedWidget组件源码解析

推荐镜像

更多