前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HJ212协议C#代码解析实现

HJ212协议C#代码解析实现

作者头像
ccf19881030
发布2024-05-24 13:04:51
640
发布2024-05-24 13:04:51
举报
文章被收录于专栏:ccf19881030的博客ccf19881030的博客

HJ212协议C#代码解析实现

HJ212协议是环保中一个非常重要的标准协议(字符串协议),之前写了两篇C++ HJ212协议解析的相关博文:

  • 环保 HJ212协议解析
  • 基于Qt5.14.2的HJ212 TCP服务端接收解析入库程序 最近在学习C#,所以打算基于C#重新实现一遍,算是熟悉一下C#的基本语法。一般来说,环保自动站通过HJ212协议将仪器设备的数据上传给省站或者国家总站,是通过TCP协议进行推送的(一般需要设置VPN网络传输),发送方是TCP客户端(解析数采仪设备数据-》解析入库到本地数据库-》连接服务器-》从本地数据库中将设备监测数据整合成HJ212格式-》推送给TCP服务端),接收端是TCP服务端(接收-》解析-》入库)。
网络拓扑图
网络拓扑图
协议层次
协议层次

HJ212协议简介

由于是做环保相关的,有时需要对212协议进行拆包和解包。HJ212协议是一种字符串协议,数据传输通讯包主要由包头、数据段长度、数据段、CRC校验、包尾组成,其中“数据段”内容包括请求编码、系统编码、命令编码、密码、设备唯一标识、总包数、包号、指令参数。请求编码为请求的时间戳,系统编码ST统一规定为22,命令编码CN为该数据包的时间类型,访问密码、设备唯一标识在对接时由平台提供,指令参数为数据内容。通讯协议的数据结构如图4所示。

通讯协议的数据结构
通讯协议的数据结构

图4 通讯协议的数据结构

6.1.1通讯包结构组成

名称

类型

长度

描述

包头

字符

2

固定为##

数据段长度

十进制整数

4

数据段的ASCII字符数。例如数据段的字符数为128,则写为“0128”

数据段

字符

0<=n<=9999

变长的数据

CRC校验

十六进制

4

数据段的校验结果,例如C901,如果CRC错,即执行超时

包尾

字符

2

回车换行(\r\n)

数据段结构组成表如下图所示:

数据段结构组成表
数据段结构组成表

《污染物在线监控(监测)系统数据传输标准》简称《HJ212-2017》标准PDF文档可以从中华人民共和国生态环境部的官网下载,具体地址为:HJ212-2017》标准PDF文档

如下图所示:

HJ212-2017标准下载
HJ212-2017标准下载

目前HJ212标准协议已经发布了两个版本,一个是HJ/T 212-2005,另一个是 HJ 212-2017,最新的HJ 212-2017下载地址为:污染物在线监控(监测)系统数据传输标准(HJ 212-2017代替HJ/T 212-2005)

基于C#的HJ212解析类

首先创建一个基于C# .Net的库项目,名称为:HJ212ParseLibrary,相关类实现代码如下:

(1)、通用工具类 CommonUtils
代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace HJ212ParseLibrary
{
    /// <summary>
    /// 通用工具类
    /// </summary>
    public class CommonUtils
    {
        /// <summary>
        /// 切分数据
        /// </summary>
        /// <param name="cp"></param>
        /// <returns></returns>
        public static List<Dictionary<string, string>>  SplitKV(string cp)
        {
            List<Dictionary<string, string>> resultList = new List<Dictionary<string, string>>();
            var arr1 = cp.Split(';');
            foreach (var i in arr1)
            {
                Dictionary<string, string> item = new Dictionary<string, string>();
                var arr2 = i.Split(',');
                foreach(var j in arr2)
                {
                    var arrKv = j.Split('=');
                    if (arrKv.Length == 2)
                    {
                        item.Add(arrKv[0], arrKv[1]);   
                    }
                }
                resultList.Add(item);
            }
            return resultList;
        }
        /// <summary>
        /// 组合数据
        /// </summary>
        /// <param name=""></param>
        /// <returns></returns>
        public static string JoinKV(List<Dictionary<string, string>> myList)
        {
            List<string> item = new List<string>();
            foreach (var i in myList)
            {
                List<string> arrKv = new List<string>();
                foreach (var j in i)
                {
                    arrKv.Add(j.Key + "=" + j.Value);
                }
                item.Add(Join(arrKv, ','));
            }
            return Join(item, ';');
        }
        /// <summary>
        /// 数据组合字符串
        /// </summary>
        /// <param name="arrKv">字符串列表</param>
        /// <param name="sep">分隔符</param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        private stat
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • HJ212协议C#代码解析实现
    • HJ212协议简介
      • 基于C#的HJ212解析类
        • (1)、通用工具类 CommonUtils
    相关产品与服务
    VPN 连接
    VPN 连接(VPN Connections)是一种基于网络隧道技术,实现本地数据中心与腾讯云上资源连通的传输服务,它能帮您在 Internet 上快速构建一条安全、可靠的加密通道。VPN 连接具有配置简单,云端配置实时生效、可靠性高等特点,其网关可用性达到 99.95%,保证稳定、持续的业务连接,帮您轻松实现异地容灾、混合云部署等复杂业务场景。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档