使用212协议组装报文,发送数据、
1.需求描述
将数据库里面的水质参数,使用212协议(污染物传输协议2017版)拼装成报文发送到,第三方数据接收平台。
2.技术架构
Winform, Socket,
3.步骤实现
3.1获取数据
原始数据表结构大概是这样,必要字段需要有 测站编码,监测时间,和相关要素。
3.2 污染物协议访问地址 污染物传输协议 HJ 212- 2017
3.3 转换数据,将数据转换为 报文。贴出核心代码。
public string GenerateMessageCache()
{
//1.获取数据库数据
foreach (DataRow rowItem in OrignTable.Rows)
{
string data_str = string.Empty;
if (rowItem["采样时间"] == null || rowItem["采样时间"].ToString() == "") { continue; }
//if (Convert.ToDateTime(rowItem["采样时间"].ToString()).Hour <= 12) { continue; }
data_str = "QN=" + Convert.ToDateTime(rowItem["采样时间"].ToString()).ToString("yyyyMMddHHmmss000");
data_str += ";ST=21;CN=2011;PW=2011;MN=" + rowItem["测站编码"] + ";Flag=8;CP=&&DataTime=" + Convert.ToDateTime(rowItem["采样时间"].ToString()).ToString("yyyyMMddHHmmss");
//数据区
//PH
data_str += ";w01001-Rtd=" + rowItem["pH"] + ";w01001-Flag=N";
//COD
data_str += ";w01018-Rtd=" + rowItem["化学需氧量"] + ";w01018-Flag=N";
//总磷
data_str += ";w21011-Rtd=" + rowItem["总磷"] + ";w21011-Flag=N";
//总氮
data_str += ";w21001-Rtd=" + rowItem["总氮"] + ";w21001-Flag=N";
//氨氮
data_str += ";w21003-Rtd=" + rowItem["氨氮"] + ";w21003-Flag=N";
//水温
data_str += ";w01010-Rtd=" + rowItem["水温"] + ";w01010-Flag=N";
//指令参数
data_str += ";CP=&&&&";
//生成报文
data_str = GetBackCmd(data_str);
MonitorEnity.Add(data_str);
GenerateInsertMessage(rowItem["采样时间"].ToString(), rowItem["测站名称"].ToString(), data_str);
}
//2.封装报文实体
//3.添加报头报尾
Thread readAllThread = new Thread(new ThreadStart(insertMessage));
readAllThread.Start();
return "";
}
/// <summary>
/// 添加报文头尾部
/// </summary>
/// <param name="Mode"></param>
/// <returns></returns>
public 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;
}
3.4 发送报文
/// <summary>
/// Socket发送模块
/// </summary>
public void SocketSend()
{
string ip = this.txt_ip.Text;
int _port = Convert.ToInt32(this.txt_port.Text);
Socket s_client = new Socket(SocketType.Stream, ProtocolType.Tcp);
String host = ip;
int port = _port;
byte[] buf = null;
s_client.Connect(host, port);
string text = "hi";
foreach (var item in MonitorEnity)
{
text = item;
buf = Encoding.Default.GetBytes(text);
int len = s_client.Send(buf);
if (len > 0)
{
string str_SQL_Update = $"delete from GenerateMessage where Message ='{item}'";
int num = sqliteHelper.ExecuteNonQuery(str_SQL_Update);
Action action = () =>
{
InitTable();
};
Invoke(action);
}
Thread.Sleep(800);
}
//buf = new byte[1024];
//len = s.Receive(buf);s
//string resp = Encoding.Default.GetString(buf);
MonitorEnity.Clear();
DeleteGenerateMessage();
s_client.Close();
}
3.5 界面展示
我这里开发的数据源来自 csv格式文档,导入后我把数据存储到本地sqlite数据库,然后从sqlite 获取数据生成报文并发送。
分类:
C#与水利信息化
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术