利用Python简单实现环保212协议数据解码为字典结果【HJ212_2017协议的拆包解码】

本文主要是介绍利用Python简单实现环保212协议数据解码为字典结果【HJ212_2017协议的拆包解码】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、直接上代码

#!/usr/bin/python3
#coding=utf-8
import time'''由数据字典 生成 HJ212_2017 协议字符串
'''
def encode(DIC_HJ212_2017):_data=''for key,value in DIC_HJ212_2017.items():if(key=='CP'):_data+='CP=&&'for cp_i,cp_item in DIC_HJ212_2017[key].items():                        for cp_key,cp_value in DIC_HJ212_2017[key][cp_i].items():_data+=cp_key+'='+str(cp_value)+','_data=_data[0:-1] _data+=';'    _data=_data[0:-1]                        _data+='&&'                        else:        _data+=key+'='+str(value)+';'_head='##'_length=len(_data)        STR_HJ212_2017=''STR_HJ212_2017+=_headSTR_HJ212_2017+=str(_length).zfill(4)STR_HJ212_2017+=_dataSTR_HJ212_2017+=str(crc16(_data)).zfill(4).upper();STR_HJ212_2017+='\r\n'return STR_HJ212_2017 '''由HJ212_2017 协议字符串数据 生成 字典
'''def decode(data):DIC_HJ212_2017={}DIC_HJ212_2017['HEAD']=data[0:2]DIC_HJ212_2017['LENGTH']=data[2:6]DIC_HJ212_2017['CRC']=data[-6:-2]DIC_HJ212_2017['DATA']={}DIC_HJ212_2017['DATA']['CP']={}    _d0=data[6:-6].split('&&')_d1=_d0[0][0:-4].split(';')    for _d2 in _d1:_d3=_d2.split('=')        DIC_HJ212_2017['DATA'][_d3[0]]=_d3[1]   _d4=_d0[1].split(';')for _d5 in _d4:_d6=_d5.split(',')for _d7 in _d6:_d8=_d7.split('=')DIC_HJ212_2017['DATA']['CP'][_d8[0]]=_d8[1]_data=data[6:-6]    if(int(DIC_HJ212_2017['LENGTH'])==len(_data)):print('数据长度验证通过')else:print('数据长度验证未通过')  if(DIC_HJ212_2017['CRC']==str(crc16(_data)).zfill(4).upper()):print('CRC校验通过')  else:print('CRC校验未通过') #print(DIC_HJ212_2017)  调试输出 结构为双层字典,类似JAVA对象  return DIC_HJ212_2017'''crc16效验'''
def crc16(text):data = bytearray(text, encoding='utf-8')crc = 0xffffdxs = 0xa001for i in range(len(data)):hibyte = crc >> 8crc = hibyte ^ data[i]for j in range(8):sbit = crc & 0x0001crc = crc >> 1if sbit == 1:crc ^= dxsreturn hex(crc)[2:]'''QN=年月日时分秒毫秒
'''
def get_time_stamp():timestamp=time.time()local_time = time.localtime(timestamp)data_head = time.strftime("%Y%m%d%H%M%S", local_time)data_secs = (timestamp - int(timestamp)) * 1000dt_ms = "%s%03d" % (data_head, data_secs)# print(dt_ms)return dt_ms#自我测试    
if __name__ == "__main__":data='##0131QN=20210730012315231;ST=31;CN=2011;PW=123456;MN=V130427GDSJ001;Flag=4;CP=&&DataTime=20210730012315;avoc01-Rtd=0.021,avoc01-Flag=N&&1A40\r\n'#print('时间='+decode(data)['DATA']['CP']['DataTime'])print('数据,avoc01-Rtd='+decode(data)['DATA']['CP']['avoc01-Rtd'])print('数据,avoc01-Flag='+decode(data)['DATA']['CP']['avoc01-Flag'])print('时间,DataTime='+decode(data)['DATA']['CP']['DataTime'])DIC_HJ212_2017={}            DIC_HJ212_2017['QN']=get_time_stamp()DIC_HJ212_2017['ST']='31'DIC_HJ212_2017['CN']='2011'DIC_HJ212_2017['PW']='123456'DIC_HJ212_2017['MN']='V130427GDSJ001'DIC_HJ212_2017['Flag']='4'DIC_HJ212_2017['CP']={}DIC_HJ212_2017['CP'][0]={}    DIC_HJ212_2017['CP'][0]['DataTime']=DIC_HJ212_2017['QN'][0:14]DIC_HJ212_2017['CP'][1]={}        DIC_HJ212_2017['CP'][1]['avoc01-Rtd']=0.021DIC_HJ212_2017['CP'][1]['avoc01-Flag']='N'print(encode(DIC_HJ212_2017))

2、运行调试

解码出的字典,结构类似JAVA对象,按结构取值即可
解码出的字典,结构类似JAVA对象,按结构取值即可
在这里插入图片描述

这篇关于利用Python简单实现环保212协议数据解码为字典结果【HJ212_2017协议的拆包解码】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/359881

相关文章

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF