c# 关于HJ212协议组包

今天突然想起好久没有登过博客了 又将近两年没有更新
太懒散。。太懒散了。。。
工作中学习到的很多 但也很容易忘记 用过的东西某天可能想再用的时候却想不起来了 或者找不到了 只能挠头哇~~
好了 进入正题 我在工作中关于HJ212协议这块用到的还是很多的 下面是一个简单的demo ——给现有HJ212报文加上报文头及检验码得到完整212报文
在demo中的HJ212辅助类中有212协议组包的相关代码 有需要的可自行参考~
先放一张转换为完整报文的成果图:

以下为完整代码:

    public partial class Form1 : Form{public Form1(){InitializeComponent();textBox1.Text="QN=20210119145656000;ST=31;CN=2011;PW=123456;MN=88800000111;Flag=5;CP=&&DataTime= 20200801084000;a21026-Rtd=10.5,a21026-Flag=N;a25002-Rtd=32.23,a25002-Flag=N&&";}private void btnChange_Click(object sender, EventArgs e){textBox2.Clear();textBox2.Text=  GetBackCmd(textBox1.Text);}public static string GetBackCmd(string Mode){string strHead = "##";string strlen = "";string strMode = Mode;strlen = strMode.Length.ToString("0000");strMode = strHead + strlen + strMode +HJ212Mode.Crc_16(strMode) + "\r\n";return strMode;}}
    public class HJ212Mode{#region 212协议组包/// <summary>/// 获取212协议报文/// </summary>/// <param name="MN=27">设备唯一标识</param>/// <param name="CN=2011">命令编号</param>/// <param name="CP">数据</param>/// <param name="ST=31">系统编号</param>/// <param name="PW">访问密码</param>/// <param name="Flag">是否分包及应答标识(0:不应答,不分包 3:应答且分包)</param>/// <param name="RevAllData">原报文</param>/// <returns></returns>public static string GetBackCmd(string MN, string CN, string CP, string ST = "31", string PW = "123456", string Flag = "0", string RevAllData = null){string strHead = "##";string strlen = "";string strQN = "QN=" + DateTime.Now.ToString("yyyyMMddHHmmss000");string strST = "ST=" + ST;string strCN = "CN=" + CN;string strPW = "PW=" + PW;string strMN = "MN=" + MN;string strFlag = "Flag=" + Flag;string strCP = "CP=&&" + CP + "&&";//string strCRC = "";//从原报文中获取ST和PWif (RevAllData != null && RevAllData != ""){string str = "";str = GetParamValue(RevAllData, "ST=");if (str != null && str != null){strST = "ST=" + str;}str = GetParamValue(RevAllData, "PW=");if (str != null && str != null){strPW = "PW=" + str;}}//组装需要计算长度及校验的部分string strMode = "";strMode = strQN + ";" +strST + ";" +strCN + ";" +strPW + ";" +strMN + ";" +strFlag + ";" +strCP;strlen = strMode.Length.ToString("0000");strMode = strHead + strlen + strMode + Crc_16(strMode) + "\r\n";return strMode;}#endregion#region 获取数据报文中指定参数的值/*** 获取数据报文中指定参数的值* @param strData 完整字符串* @param strParam 对应的字符串* @return*/public static String GetParamValue(String strData, String strParam){//string strDataLow = strData.ToLower();//##0147ST=32;CN=2011;PW=123456;MN=88888880000001;//CP=&&DataTime=20100623130500;010-Rtd=10.00,010-Flag=N;011-Rtd=10.00,011-Flag=N;015-Rtd=10.00,015-Flag=N&&D081String strDataLow = strData;int iPosBegin = strDataLow.IndexOf(strParam, 0);if (iPosBegin < 0) return null;int iPosC = strDataLow.IndexOf(",", iPosBegin);int iPosS = strDataLow.IndexOf(";", iPosBegin);int iPosA = strDataLow.IndexOf("&", iPosBegin);int iPosEnd = GetValuePos(iPosC, iPosS);iPosEnd = GetValuePos(iPosA, iPosEnd);int iPosE = strDataLow.IndexOf("=", iPosBegin);String strValue = null;try{//if (iPosS < 0)  //数据区只有一个数据//{//    strValue = strDataLow.Substring(iPosE + 1, iPosA - iPosE - 1);//    //System.out.println("SS"+strValue);//    return strValue;//}if (iPosA < 0){iPosA = strDataLow.Length;}if (iPosEnd == iPosA){iPosEnd = strDataLow.IndexOf("&", iPosA + 2);strValue = strDataLow.Substring(iPosA, iPosEnd - iPosA);return strValue.Replace("&&", "");}if (iPosEnd > iPosE + 1){strValue = strDataLow.Substring(iPosE + 1, iPosEnd - iPosE - 1);return strValue.Replace(" ", "");}else return null;}catch (Exception ex){Console.WriteLine("HJ212_Mode", ex.ToString());return null;}}#endregion#region 判断分隔符的正确位置/*** 判断分隔符的正确位置* @param iPos1* @param iPos2* @return*/public static int GetValuePos(int iPos1, int iPos2){if (iPos1 >= 0 && iPos2 >= 0)return iPos1 > iPos2 ? iPos2 : iPos1;else if (iPos1 < 0 && iPos2 < 0)return -1;else if (iPos1 >= 0 && iPos2 < 0)return iPos1;else if (iPos1 < 0 && iPos2 >= 0)return iPos2;else return -1;}#endregion#region 212协议校验/// <summary>/// 212协议校验/// </summary>/// <param name="strData"></param>/// <returns></returns>public static string Crc_16(string strData){byte crc16Lo, crc16Hi;byte saveLo, saveHi;System.Text.Encoding chs = System.Text.Encoding.GetEncoding("gb2312");byte[] bits = chs.GetBytes(strData);crc16Hi = 0xFF;crc16Lo = 0x00;for (int i = 0; i < bits.Length; i++){crc16Lo = crc16Hi;crc16Hi = 0;crc16Lo ^= bits[i];for (int g = 0; g < 8; g++){saveHi = crc16Hi;saveLo = crc16Lo;crc16Hi /= 2;crc16Lo /= 2;if (saveHi % 2 == 1){crc16Lo |= 0x80;}if (saveLo % 2 == 1){crc16Hi ^= 0xA0;crc16Lo ^= 0x01;}}}return crc16Hi.ToString("X2") + crc16Lo.ToString("X2");}#endregion}

c# HJ212协议组包相关推荐

  1. Qt 实现数据协议控制--组帧、组包、解析帧、解析包

    数据传输中的组帧和组包 一.数据帧,数据包的概念 数据帧 组包 二. 程序实现: 2.1.frame(帧)类的实现: 2.2.Pack(包)类的实现: 三.测试 一.数据帧,数据包的概念 数据帧 数据 ...

  2. qt 串口粘包_Qt Socket 传输图片——图像拆包、组包、粘包处理

    之前给大家分享了一个使用python发图片数据.Qt server接收图片的Demo.之前的Demo用于传输小字节的图片是可以的,但如果是传输大的图片,使用socket无法一次完成发送该怎么办呢?本次 ...

  3. 【计算机网络】网络层 : IP 组播 ( IP 数据报传输方式 | 组播 IP 地址 | 组播 MAC 地址 | IGMP 协议 | 组播路由选择协议 )

    文章目录 一.IP 数据报传输方式 二.组播 IP 地址 三.组播 MAC 地址 四.IGMP 协议 五.组播路由选择协议 一.IP 数据报传输方式 IP 数据报传输方式 : ① 单播 : 发送数据到 ...

  4. hj212协议如何和php通讯,HJ212数据传输标准报文解析

    HJ212分为2005年(HJ/T212-2005)和2017年(HJ212-2017)的版本,略有不同. 网上没找到非常官方的渠道下载,在这贴一份2017年版本的下载地址 TCP/IP通讯包组成 名 ...

  5. TCP协议——粘包与拆包

    TCP的基础 TCP协议基础,传送门 TCP协议流量控制,传送门 1.1 什么是TCP粘包/拆包 TCP是个"流"协议,所谓流,就是没有界限的一串数据.大家可以想想河里的流水,是连 ...

  6. coap 返回版本信息_coap组包格式的简单解析

    最近的一个项目中用到了coap,为了防止时间过长导致遗忘,将具体的关键知识写在这里,同时也为后来人减少一些坑. Coap coap是一种符合REST规范(主要是幂等性)的,适用于物联网通讯的数据协议. ...

  7. java实现hj协议_环保 HJ212协议解析

    由于是做环保相关的,有时需要对212协议进行拆包和解包.HJ212协议是一种字符串协议,数据传输通讯包主要由包头.数据段长度.数据段.CRC校验.包尾组成,其中"数据段"内容包括请 ...

  8. AVB传输协议数据包分析

    解析媒体矩阵(MediaMatrix)(六十四)--高性能媒体数据流传输解决方案AVB 著作 兆翦 AVB传送协议改进了了之前二层通讯协议(如CobraNet或EtherSound)的固有" ...

  9. NRF24L01 大数据分包组包传输

    NRF24L01一个数据包最大32字节,对于视频音频不适用,定义一个应用层协议对传输数据进行分包组包,应用层数据收发队列存储,向对方发送数据进行拆包,每发一包应答确认超时重发,接收完整大数据包向应用层 ...

最新文章

  1. Python里面None True False之间的区别
  2. 深入浅出Websocket(二)分布式Websocket集群
  3. “以史为鉴”-企业信息化的梳理-前言
  4. 【学习笔记】32、字符串格式化
  5. Flowportal-BPM——环境配置
  6. 人工计算机的相关信息,第三届计算机信息科学与人工智能国际学术会议(CISAI 2020)...
  7. 电量计在手持设备中的实现
  8. 格力:核心科技有时也是高利贷
  9. Django part 6 ---Static File
  10. 深圳绘制SVG地图数据
  11. 三个视频教你如何找到另一半
  12. msg1500说明书_拆解电信定制 瑞斯达康MSG1500 双频路由器
  13. java math 三角函数_Java Math类的常用方法,三角函数运算
  14. amoeba实现mysql主从读写分离_MySQL+Amoeba实现数据库主从复制和读写分离
  15. ASP.NET编写一个简易网站
  16. 编译内核报错 No rule to make target ‘debian/canonical-certs.pem‘ 或 ‘canonical-revoked-certs.pem‘ 的解决方法
  17. B站硬核up主稚晖君:对于有志学习嵌入式开发的软件工程师,我有这些建议!...
  18. ZipFile 解压多个.zip压缩文件
  19. STM32红外寻迹小车
  20. 蓝桥杯真题:数字三角形

热门文章

  1. 项目管理之信息文档管理与配置管理(第一篇)
  2. 如何选择适合你的兴趣爱好(二十六),剪纸
  3. Mysql日期时间格式化 %Y-%m-%d %H:%i:%S
  4. 想要提高企业分账管理,简单分账系统如何做到?
  5. Windows的NSIS ERROR
  6. 刷流量和刷点击率的方法探讨
  7. 基于AForge.Net框架的扑克牌识别
  8. Chainge橙子钱包跨链技术介绍
  9. 如何使用百度云加速提升网站访问速度
  10. 少年歌行游戏一直显示连接服务器,少年歌行第二季无法上线的原因找到了,不是没做好,而是限制太多...