当前位置: 首页 > news >正文

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接收包解包&#xff08;没有crc验证&#xff09;到redis 序列化python 发包测试 什么是环保HJ212协议? HJ212是由国家环保行业制定的数据传输标准协议&#xff0c;通常是通过TCP/P通讯方式进行数据传输的&#xff0c…...

03架构模式(D2_架构模式01)

目录 学习前言 一、架构的模式 1. 分层 2. 分隔 3. 分布式 4. 集群 5. 缓存 6. 异步 7. 冗余 8. 自动化 9. 安全 10. 敏捷性 二、参考文献 学习前言 架构演进中有很多知识点&#xff0c;总体上可以归结为以下模式&#xff0c;这里说的模式本质是架构中技术点的抽 …...

深入List集合:ArrayList与LinkedList的底层逻辑与区别

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

mac安装appuim

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

Telegram bot Mini-App开发实践---Telegram简单介绍与初始化小程序获取window.Telegram.WebApp对象并解析

➡️【好看的灵魂千篇一律,有趣的鲲志一百六七!】- 欢迎认识我~~ 作者:鲲志说 (公众号、B站同名,视频号:鲲志说996) 科技博主:极星会 星辉大使 后端研发:java、go、python、TS,前电商、现web3 主理人:COC杭州开发者社区主理人 、周周黑客松杭州主理人、 AI爱好…...

绿光一字线激光模组:工业制造与科技创新的得力助手

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

鸿蒙进阶篇-Math、Date

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

定时器简介

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

3C产品说明书电子化转变:用户体验、环保与商业机遇的共赢

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

redis:主从复制

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 前言主从模式复制拓扑结构主从节点建立复制流程数据同步 psyncpsync运行流程全量复制流程部分复制流程实时复制总结 前言 分布式系统&#x…...

思考Redis的用途 2024-11-19

一.分布式锁 这个要保证多个服务器执行一段逻辑时的锁操作&#xff0c;就用这个。如&#xff1a;账号注册&#xff0c;防止同一个账号注册多次。 二.全局共享数据 1.多个Game服情况下&#xff0c;要共享一些数据&#xff0c;比如&#xff1a;登录token信息之类的。 痛点&…...

根据条件 控制layui的table的toolbar的按钮 显示和不显示

部分代码&#xff1a; <!-----查询条件-----> <input type"date" id"StartDate" onchange"PageList()" /> <input type"date" id"EndDate" onchange"PageList()" /><!-----表格Table-----&…...

什么是C++中的初始化参数列表,它的作用是什么?

在 C 中&#xff0c;初始化参数列表&#xff08;Initialization List&#xff09;是一个构造函数的特性&#xff0c;用于初始化类成员变量和基类。它是在构造函数的声明中&#xff0c;以冒号&#xff08;:&#xff09;开头&#xff0c;跟随一系列成员变量的初始化表达式的列表。…...

python基础之学生成绩管理系统

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 声明&#xff1a;本文主要用作技术分享&#xff0c;所有内容仅供参考。任何使用或依赖于本文信息所造成的法律后果均与本人无关。请读者自行判断风险&#xff0c;并遵循相关法律法规。 while…...

SQL Server Management Studio 的JDBC驱动程序和IDEA 连接

一、数据库准备 &#xff08;一&#xff09;启用 TCP/IP 协议 操作入口 首先&#xff0c;我们要找到 SQL Server 配置管理器&#xff0c;操作路径为&#xff1a;通过 “此电脑” 右键选择 “管理”&#xff0c;在弹出的 “计算机管理” 窗口中&#xff0c;找到 “服务和应用程…...

大数据挖掘期末复习

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

凸函数与深度学习调参

问题1&#xff1a;如何区分凸问题和凹问题&#xff1f; 问题2&#xff1a;深度学习如何区分调参&#xff1f;...

Java前端基础——CSS

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

Photino:通过.NET Core构建跨平台桌面应用程序,.net国产系统

一、Photino.NET简介&#xff1a; 最近发现了一个不错的框架 Photino.Net 一份代码运行&#xff0c;三个平台 windows max linux &#xff0c;其中windows10,windows11,ubuntu 18.04,ubuntu 20.04 已测试均可以。mac 因为没有相关电脑没有测试。 github:https://github.com/t…...

个人全栈开发微信小程序上线了(记日记)

个人开发的全栈项目&#xff0c;《每日记鸭》微信小程序上线了&#xff01; 主要是技术栈&#xff1a;uniapp,koa2,mongodb,langchian&#xff1b; 感兴趣的小伙伴可以来捧捧场&#xff01;...

Linux移植IMX6ULL记录 一:编译源码并支持能顺利进入linux

目录 前言 一、不修改文件进行编译 二、修改设备树文件进行编译 前言 我用的开发板是100_ask_imx6ull_pro&#xff0c;其自带的linux内核版本linux-4.9.88&#xff0c;然后从linux官网下载过来的linux-4.9.88版本的arch/arm/configs/defconfig和dts设备树文件并没有对imx6ull…...

idea正则表达式-正则替换示例-2024.11笔记

注意idea中反向引用的格式是【$1】换行符是【\n】 需要在如下的代码中往接口的方法中添加一行注解&#xff0c;注解需要用到以后注解的中文备注 原文 Autowired private WomanService womanService; /** * 自定义分页 */ PostMapping("/page/{current}/{…...

Github 2024-11-20C开源项目日报 Top9

根据Github Trendings的统计,今日(2024-11-20统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目9Assembly项目1raylib: 用于视频游戏编程的简单易用图形库 创建周期:3821 天开发语言:C协议类型:zlib LicenseStar数量:18556 个Fork数…...

安卓CameraX的使用

如果要在安卓应用中操作相机&#xff0c;有三个库可以选&#xff1a; Camera&#xff08;已废弃&#xff09;&#xff1a;Camera是安卓最早的包&#xff0c;目前已废弃&#xff0c;在Android 5.0&#xff08;API 级别 21&#xff09;的设备上操作相机可以选择该包&#xff0c;…...

unity3d——基础篇小项目(开始界面)

示例代码&#xff1a; using System.Collections; using System.Collections.Generic; using UnityEngine;public class BeginPanel : BasePanel<BeginPanel> {public UIButton btnBegin;public UIButton btnRank;public UIButton btnSetting;public UIButton btnQuit; …...

【YOLOv8】安卓端部署-1-项目介绍

【YOLOv8】安卓端部署-1-项目介绍 1 什么是YOLOv81.1 YOLOv8 的主要特性1.2 YOLOv8分割模型1.2.1 YOLACT实例分割算法之计算掩码1.2.1.1 YOLACT 的掩码原型与最终的掩码的关系1.2.1.2 插值时的目标检测中提取的物体特征1.2.1.3 coefficients&#xff08;系数&#xff09;作用1.…...

安卓手机root+magisk安装证书+抓取https请求

先讲一下有这篇文章的背景吧&#xff0c;在使用安卓手机fiddler抓包时&#xff0c;即使信任了证书&#xff0c;并且手机也安装了证书&#xff0c;但是还是无法捕获https请求的问题&#xff0c;最开始不知道原因&#xff0c;后来慢慢了解到现在有的app为了防止抓包&#xff0c;把…...

11.20 深度学习-pytorch包和属性的基础语法

import torch import numpy as np def sci_close(): # 关闭pytorch 数据打印出来时科学计数法 torch.set_printoptions(sci_modeFalse) pass return 0 def create_tensor(): # 创建张量 t1torch.tensor(5) # 一阶张量 阶数看你传入的矩阵是多少阶的 这个是标量 不是一阶 一阶…...

SpringMVC域对象共享数据

目录 一.向 request 域对象共享数据 1.1使用ServletAPI向request域对象共享数据 1.2使用ModelAndView向request域对象共享数据 1.3使用Model向request域对象共享数据 1.4使用map向request域对象共享数据 1.5使用ModelMap向request域对象共享数据 二.Model、ModelMap、Ma…...

每日论文23-24ESSERC 6.4-16.1Ghz混合并联-串联谐振器

《A 6.4-to-16.1GHz Hybrid Parallel-Series Resonator Mode-Switching Oscillator with 206.6dBc/Hz FoMT at 1MHz Offset in 40nm CMOS》 24ESSERC 首先这篇文章有个地方我其实没太明白&#xff0c;它在title和行文的时候都写的是“ hybrid parallel-series resonator mode-…...

电商行业接单平台/网络优化工程师主要负责什么工作

2019独角兽企业重金招聘Python工程师标准>>> 当前日志系统常用的有elk&#xff08;elasticsearch logstash kibana&#xff09;&#xff0c;不过很多公司不喜欢用logstash&#xff0c;而会用很多其他性能好、资源利用少的日志采集软件&#xff0c;其中rsyslog会是很…...

win7网站开发教程/网络营销方式都有哪些

RequestMapping注解 1、RequestMapping注解的功能 从注解名称上我们可以看到&#xff0c;RequestMapping注解的作用就是将请求和处理请求的控制器方法关联起来&#xff0c;建立映射关系。 SpringMVC 接收到指定的请求&#xff0c;就会来找到在映射关系中对应的控制器方法来处理…...

wordpress 多说评论系统 安装/seo网络推广排名

8月7日上午十点&#xff0c;百度诉360违反Robots协议案将在北京市第一中级人民法院一审宣判&#xff0c;虽然目前尚无法知道判决结果&#xff0c;但有互联网行业人士分析&#xff0c;由于 Robots协议直接关系到中国6亿多网民的隐私安全&#xff0c;更与互联网企业的前途发展息息…...

wordpress 建立网站/国家免费技能培训官网

Java 构造结构私有化单例设计模式&#xff1a;(Singleton)在一般情况下&#xff0c;一个类只有通过产生对象之后才可以操作这个类。class Singleton {public void print() {System.out.println("Hello,world!") ;}}public class TestDemo {public static void main(S…...

网站论坛 备案/广州最新重大新闻

2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/leopardsaga/blog/105822...

做移动网站点击软件/seo网站介绍

1.rbac-优化login函数   因为login是业务逻辑 ,而rbac是个组件 ,将rbac在login的代码分离 ###初始化权限函数分离出去 rbac/service/permission from untitled import settingsdef init_permission(request, obj):permission_query obj.roles.all().filter(permissions__url…...