利用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

相关文章

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

在Linux中改变echo输出颜色的实现方法

《在Linux中改变echo输出颜色的实现方法》在Linux系统的命令行环境下,为了使输出信息更加清晰、突出,便于用户快速识别和区分不同类型的信息,常常需要改变echo命令的输出颜色,所以本文给大家介... 目python录在linux中改变echo输出颜色的方法技术背景实现步骤使用ANSI转义码使用tpu

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文