使用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 获取数据生成报文并发送。

 

posted @   宁静致远·TangJ  阅读(1646)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示