hj 212 协议解包php解包,
这里写目录标题
- 什么是环保HJ212协议?
- 常用的标准码说明
- php接收包解包(没有crc验证)到redis 序列化
- python 发包测试
什么是环保HJ212协议?
HJ212是由国家环保行业制定的数据传输标准协议,通常是通过TCP/P通讯方式进行数据传输的,数据传输报文主要由包头、数据段长度、数据段、CRC校验、包尾组成。重点解析的就是”数据段“的内容,内容包括请求编码(QN)、系统编码(ST)、设备唯一标识(MN)、密码(PW)、命令编码(CN)、指令参数(CP)。请求编码为请求的时间戳,系统编码ST统一规定为22,命令编码CN为该数据包的时间类型,访问密码、设备唯一标识在对接时由平台提供,指令参数为数据内容。
基本报文示例:
##0192QN=20230703220100923;ST=22:CN=2011:PW=123456;MN=BF0F022021090077:Flag=5:CP=&&DataTime=20230703220100:a34001-Rtd=48.5,a34001-Flag=N:a34004-Rtd=31.2,a34004-Flag=N:a34002-Rtd=48.5,a34002-FIaQ=N&&A881
协议包组成:
名称 类型 长度 描述
包头 字符 2 同定为##
数据段长度 十进制整数 A 数据段的ASCII字符数,例如:长192,则写为“0192
数据段 字符 0<=n<=1024 变长的数据
CRC校验 十六进制 4 数据段的校验结果
包尾 字符 2 回车换行()
标准化json:
{
“ST “: “22“,
“MN“:“BFOF022021090077“,
“PW“ : “123456“,
“CN“: “2011“,
“QN“:“20230703220100923“,
“Flag“ : “5“,
“CP“:{
“DataTime": “20230703220100“,
“a34001-Flag :“ N“,
“a34001-Rtd : “48.5“,
“a34002-Flag :“N“,
“a34002-Rtd : “48.5“,
“a34004-Flag :“N“,
“a34004-Rtd : “31.2“,
}
}
常用的标准码说明
1.后面都会加Rtd或Flag,一般是a01001-Rtd或a01001-Flag,其中Rtd是实际的值,Flag为状态一般为N
2.2.单位只是大部分的一个标准,可作为参考
编码(Rtd->数值,Flag->状态) 实际值 单位(参考)
a01001 温度 咖
a01002 湿度 Kpa
a01006 气压 m/s
a01007 风速 0
a01008 风向 ug/m
a34001 TSP扬尘 ug/ms
a34002 PM10 ug/m
a34004 PM2.5 mg/m
a21004 NOz mg/m*
a21005 NO 葱mg/m*
a21026 S0z mg/m*
a21026 S0z dB
LA 噪声 单位(参考)
php接收包解包(没有crc验证)到redis 序列化
<?php
// 设置 Redis 连接
$redisHost = '127.0.0.1';
$redisPort = 6379;
$redis = new Redis();
$redis->connect($redisHost, $redisPort);// 创建一个 TCP 服务器
$host = '0.0.0.0'; // 监听所有网卡
$port = 21212; // 自定义端口(与212协议无直接关系,仅供示例)$socket = stream_socket_server("tcp://$host:$port", $errno, $errstr);if (!$socket) {die("无法创建服务器: $errstr ($errno)\n");
}echo "服务器已启动,正在监听 $host:$port...\n";while ($conn = stream_socket_accept($socket)) {$data = fread($conn, 2048); // 每次读取2048字节if ($data) {echo "接收到数据: $data\n";// 数据解析(根据212协议对数据结构的定义)$parsedData = parse212Data($data);// 获取设备唯一标识(MN)$MN = $parsedData['MN'] ?? 'unknown_device';
$parsedData = serialize($parsedData);// 将解析后的数据存入 Redis,设置过期时间为300秒$redis->setex('tsp_data_' . $MN, 300,$parsedData);// 发送确认或回复fwrite($conn, "数据接收成功,^_^,谢谢测试帅哥!\n");}fclose($conn);
}fclose($socket);function parse212Data($data) {// 分离 CP 部分// $data = substr($data, 6, strpos($data, '&&') - 6); // 提取数据段$data= substr($data, 6);$parts = explode('CP=&&', $data, 2);$metadata = trim($parts[0]); // CP 之前的数据部分$cpContent = isset($parts[1]) ? trim($parts[1]) : '';// 解析 CP 之前的数据部分$fieldsBeforeCP = explode(';', $metadata);$result = [];foreach ($fieldsBeforeCP as $field) {if (strpos($field, '=') !== false) {list($key, $value) = explode('=', $field, 2);$result[$key] = $value;}}// 解析 CP 内部的数据if (!empty($cpContent)) {$cpEndPos = strpos($cpContent, '&&');if ($cpEndPos !== false) {$cpData = substr($cpContent, 0, $cpEndPos);// 用正则表达式精准分割 CP 内容$fieldsInCP = preg_split('/[;,]/', $cpData);foreach ($fieldsInCP as $field) {if (strpos($field, '=') !== false) {list($key, $value) = explode('=', $field, 2);$result[$key] = $value;}}}}return $result;
}?>
python 发包测试
import sockethost = 'IP地址或者域名'
port = 21212# 数据包
data = "##0530QN=20241119164503506;ST=39;CN=2051;PW=123456;MN=ZR118220915203;Flag=5;CP=&&DataTime=20241119163500;a01001-Min=12.54,a01001-Avg=12.87,a01001-Max=13.25,a01001-Flag=N;a01002-Min=51.30,a01002-Avg=52.49,a01002-Max=53.52,a01002-Flag=N;a01006-Min=102.301,a01006-Avg=102.301,a01006-Max=102.303,a01006-Flag=N;a01007-Min=0.0,a01007-Avg=0.0,a01007-Max=0.0,a01007-Flag=N;a01008-Min=165,a01008-Avg=165,a01008-Max=166,a01008-Flag=N;a34001-Min=100.9,a34001-Avg=100.9,a34001-Max=100.9,a34001-Flag=N;LA-Min=38.4,LA-Avg=39.8,LA-Max=44.1,LA-Flag=N&&6240"##0530QN=20241119170103194;ST=39;CN=2061;PW=123456;MN=ZR118220915203;Flag=5;CP=&&DataTime=20241119160000;a01001-Min=11.14,a01001-Avg=13.20,a01001-Max=15.22,a01001-Flag=N;a01002-Min=45.44,a01002-Avg=51.41,a01002-Max=57.99,a01002-Flag=N;a01006-Min=102.299,a01006-Avg=102.315,a01006-Max=102.349,a01006-Flag=N;a01007-Min=0.0,a01007-Avg=0.0,a01007-Max=0.0,a01007-Flag=N;a01008-Min=130,a01008-Avg=165,a01008-Max=197,a01008-Flag=N;LA-Min=37.3,LA-Avg=40.7,LA-Max=53.5,LA-Flag=N;a34001-Min=103.1,a34001-Avg=103.1,a34001-Max=103.1,a34001-Flag=N&&EA41
# 创建 socket
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:s.connect((host, port))s.sendall(data.encode())# 接收服务器的响应response = s.recv(1024)print('服务器响应:', response.decode())
相关文章:
hj 212 协议解包php解包,
这里写目录标题 什么是环保HJ212协议?常用的标准码说明php接收包解包(没有crc验证)到redis 序列化python 发包测试 什么是环保HJ212协议? HJ212是由国家环保行业制定的数据传输标准协议,通常是通过TCP/P通讯方式进行数据传输的,…...
03架构模式(D2_架构模式01)
目录 学习前言 一、架构的模式 1. 分层 2. 分隔 3. 分布式 4. 集群 5. 缓存 6. 异步 7. 冗余 8. 自动化 9. 安全 10. 敏捷性 二、参考文献 学习前言 架构演进中有很多知识点,总体上可以归结为以下模式,这里说的模式本质是架构中技术点的抽 …...

深入List集合:ArrayList与LinkedList的底层逻辑与区别
目录 一、前言 二、基本概念 三、相同之处 四、不同之处 五、ArrayList 底层 六、LinkedList 底层 七、ArrayList 应用场景 八、LinkedList 应用场景 九、ArrayList和LinkedList高级话题 十、总结 一、前言 在Java集合的广阔舞台上,ArrayList与LinkedLis…...

mac安装appuim
要在macOS上安装Appium,这是一个自动化测试框架,可以用来对移动应用进行测试(支持iOS和Android应用)。为了安装Appium和其依赖的环境,你需要做一些准备工作。以下是详细的安装步骤: 前提条件 1、macOS系统…...

Telegram bot Mini-App开发实践---Telegram简单介绍与初始化小程序获取window.Telegram.WebApp对象并解析
➡️【好看的灵魂千篇一律,有趣的鲲志一百六七!】- 欢迎认识我~~ 作者:鲲志说 (公众号、B站同名,视频号:鲲志说996) 科技博主:极星会 星辉大使 后端研发:java、go、python、TS,前电商、现web3 主理人:COC杭州开发者社区主理人 、周周黑客松杭州主理人、 AI爱好…...

绿光一字线激光模组:工业制造与科技创新的得力助手
在现代工业制造和科技创新领域,绿光一字线激光模组以其独特的性能和广泛的应用前景,成为了不可或缺的关键设备。这种激光模组能够发射出一条明亮且精确的绿色激光线,具有高精度、高稳定性和长寿命的特点,为各种精密加工和测量需求…...

鸿蒙进阶篇-Math、Date
“在科技的浪潮中,鸿蒙操作系统宛如一颗璀璨的新星,引领着创新的方向。作为鸿蒙开天组,今天我们将一同踏上鸿蒙基础的探索之旅,为您揭开这一神奇系统的神秘面纱。” 各位小伙伴们我们又见面了,我就是鸿蒙开天组,下面让我们进入今…...

定时器简介
TIM(Timer定时器)简介 在第一部分,我们主要讲的是定时器基本定时的功能,也就是定一个时间,然后让定时器每隔这个时间产生一个中断,来实现每隔一个固定时间执行一段程序的目的,比如你要做个时钟、秒表,或者使用一些程序…...

3C产品说明书电子化转变:用户体验、环保与商业机遇的共赢
在科技日新月异的当代社会,3C产品(涵盖计算机类、通信类和消费类电子产品)已成为我们日常生活中不可或缺的重要元素。与此同时,这些产品的配套说明书也经历了一场从纸质到电子化的深刻变革。这一转变不仅体现了技术的飞速进步&…...

redis:主从复制
个人主页 : 个人主页 个人专栏 : 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言主从模式复制拓扑结构主从节点建立复制流程数据同步 psyncpsync运行流程全量复制流程部分复制流程实时复制总结 前言 分布式系统&#x…...
思考Redis的用途 2024-11-19
一.分布式锁 这个要保证多个服务器执行一段逻辑时的锁操作,就用这个。如:账号注册,防止同一个账号注册多次。 二.全局共享数据 1.多个Game服情况下,要共享一些数据,比如:登录token信息之类的。 痛点&…...

根据条件 控制layui的table的toolbar的按钮 显示和不显示
部分代码: <!-----查询条件-----> <input type"date" id"StartDate" onchange"PageList()" /> <input type"date" id"EndDate" onchange"PageList()" /><!-----表格Table-----&…...
什么是C++中的初始化参数列表,它的作用是什么?
在 C 中,初始化参数列表(Initialization List)是一个构造函数的特性,用于初始化类成员变量和基类。它是在构造函数的声明中,以冒号(:)开头,跟随一系列成员变量的初始化表达式的列表。…...
python基础之学生成绩管理系统
声明:学习视频来自b站up主 泷羽sec,如涉及侵权马上删除文章 声明:本文主要用作技术分享,所有内容仅供参考。任何使用或依赖于本文信息所造成的法律后果均与本人无关。请读者自行判断风险,并遵循相关法律法规。 while…...

SQL Server Management Studio 的JDBC驱动程序和IDEA 连接
一、数据库准备 (一)启用 TCP/IP 协议 操作入口 首先,我们要找到 SQL Server 配置管理器,操作路径为:通过 “此电脑” 右键选择 “管理”,在弹出的 “计算机管理” 窗口中,找到 “服务和应用程…...

大数据挖掘期末复习
大数据挖掘 数据挖掘 数据挖掘定义 技术层面: 数据挖掘就是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中,提取隐含在其中、人们事先不知道的、但又潜在有用的信息的过程。 数据准备环节 数据选择 质量分析 数据预处理 数据仓库 …...

凸函数与深度学习调参
问题1:如何区分凸问题和凹问题? 问题2:深度学习如何区分调参?...

Java前端基础——CSS
一、CSS介绍 1.1 什么是CSS CSS(Cascading Style Sheet),层叠样式表,用于控制页面的样式. CSS 能够对网页中元素位置的排版进行像素级精确控制, 实现美化页面的效果. 能够做到页面的样式和结构分离. 1.2 基本语法规范 选择器 {⼀条/N条声明} • 选择器决定针…...

Photino:通过.NET Core构建跨平台桌面应用程序,.net国产系统
一、Photino.NET简介: 最近发现了一个不错的框架 Photino.Net 一份代码运行,三个平台 windows max linux ,其中windows10,windows11,ubuntu 18.04,ubuntu 20.04 已测试均可以。mac 因为没有相关电脑没有测试。 github:https://github.com/t…...

个人全栈开发微信小程序上线了(记日记)
个人开发的全栈项目,《每日记鸭》微信小程序上线了! 主要是技术栈:uniapp,koa2,mongodb,langchian; 感兴趣的小伙伴可以来捧捧场!...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...