c# HJ212协议组包

c# HJ212协议组包c#关于HJ212协议组包今天突然想起好久没有登过博客了又将近两年没有更新怪我太懒散了。。。工作中学习到的很多但也很容易忘记用过的东西某天可能想再用的时候却想不起来了或者找不到了只能挠头~~好了进入正题我在工作中关于HJ212协议这块用到的还是很多的今天来写一写在c#中HJ212协议如何组包以及有了报文内容如何转换为完整报文:先放一张转换为完整报文的成果图:以下为实际代码:publicpartialclassForm1:Form

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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和PW
if (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&&D081
String 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
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/159961.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • StringTokenizer使用讲解

    StringTokenizer使用讲解StringTokenizer是一个用来分隔String的应用类,相当于VB的split函数。一.构造函数。1.StringTokenizer(Stringstr):构造一个用来解析str的StringTokenizer对象。java默认的分隔符是“空格”、“制表符(‘\t’)”、“换行符(‘\n’)”、“回车符(‘\r’)”。2.StringTokenizer(Stri

  • ORM框架Hibernate (二) 持久化对象的三种状态分析

    ORM框架Hibernate (二) 持久化对象的三种状态分析

  • 60mph和kmh换算_mph换算器(速度计算器在线)「建议收藏」

    60mph和kmh换算_mph换算器(速度计算器在线)「建议收藏」mph是英里每时的意思吗?如何换算成千米每时?100mph=160.9kmhmph是英里每时的意思吗?如何换算成千米每时?mph是米/小时的意思mitersperhour也可写成m/hAkm/h=A*1000m/h玩极品飞车12,上面的速度是mph,怎么换算啊1英里=5280英尺=63360英寸=1609.344米汽车速度表上,英制的MPH与公制的km/…

  • Docker for mac 使用说明

    Docker for mac 使用说明

  • MATLAB 粒子群算法,例题与常用模版

    MATLAB 粒子群算法,例题与常用模版MATLAB粒子群算法本文学习自:ParticleSwarmOptimizationinMATLAB-YarpizVideoTutorial与《精通MATLAB智能算法》1.简介:ParticleSwarmOptimization,粒子群优化算法,常用来找到方程的最优解。2.算法概述:每次搜寻都会根据自身经验(自身历史搜寻的最优地点)和种群…

  • SpringBoot是什么?干嘛用的?(新手入门篇)

    SpringBoot是什么?干嘛用的?(新手入门篇)SpringBoot是干哈的介绍:springboot是由Pivotal团队提供的全新框架。spring的出现是为了解决企业级开发应用的复杂性,spring的通过注册bean的方式来管理类,但是随着业务的增加,使用xml配置bean的方式也显得相当繁琐,所以springboot就是为了解决spring配置繁琐的问题而诞生的,并且近几年来非常流行开启我的第一个HelloSpringBoot!开启方式根据https://start.spring.io网址创建一个springboot项目

    2022年10月26日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号