C#基于Socket的UDP和TCP处理通信报文(包含心跳包+业务处理+数据库)

        设备通过TCP/IP接入OMC,此时OMC作为TCP/IP服务端,主设备作为客户端且主设备IP地址和端口号可设。主设备通过开站上报数据包或者登录包来主动接入OMC。开站上报的接入流程如下(登录包与之相似)

                

包的协议格式如下:

起始标志

(7E)

AP层协议类型

(01或03)

承载协议类型

(01)

数据单元(PDU)

校验单元

(CRC)

结束标志

 

        程序主要通过TCP UDP协议进行通讯。要求用VS2013编译文件,用C#开发代码,需要安装framework4.6的WINDOW框架,服务程序只需要framework3.5框架,其本上编译后的应用程序,所有WINDOW7以上的操作系统都可以正常使用。

1、创建服务

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using SignalRules;
using System.Timers;
 

namespace SignalServ
{
    public partial class SignalMonitor : ServiceBase
    {
        private Thread _oil_Thread;
        private Thread _monter_Thread;		//ODS修复线程
        private static bool bExitThread =false;	//是否退出线程


        public SignalMonitor()
        {
            InitializeComponent();
        }

 
        protected override void OnStart(string[] args)
        {
            string errmsg = "服务启动成功,";
            try
            {
                //启动授权线程
                //_oil_Thread = new Thread(new           ThreadStart(SignalRules.SocketServer.Socket_Thread));
                _oil_Thread = new Thread(new ThreadStart(SignalRules.SocketServer1.StartListen));
                _oil_Thread.Start();
                errmsg += "Socket线程启动;";

                //启动心跳监控线程
                _monter_Thread = new Thread(new ThreadStart(monter_heartbeat));
                _monter_Thread.Start();
                errmsg += "monter线程启动,";

                WebCore.Log.WebLog.WriteTextLog("", WebCore.Log.WebLogType.SignalCmd, "SignalServ_Socket", errmsg);
            }
            catch (Exception err)
            {
                errmsg += "socket启动错误:" + err.Message + err.StackTrace + ";";
                WebCore.Log.WebLog.WriteTextLog("", WebCore.Log.WebLogType.SignalCmd, "SignalServ_Socket", errmsg);
            }
        }

 
        protected override void OnStop()
        {
            if (_oil_Thread != null)
            {
                _oil_Thread.Abort();
            }

            if (_monter_Thread != null)
            {
                _monter_Thread.Abort();
            }       

            SignalRules.SocketServer1.Socket_Close();
            string errmsg = "停止Socket服务";
            WebCore.Log.WebLog.WriteTextLog("", WebCore.Log.WebLogType.SignalCmd, "SignalServ_Socket", errmsg);
        }


        /// <summary>
        /// 心跳监控线程
        /// </summary>
        private static void monter_heartbeat()
        {
            while (true)
            {
                if (bExitThread)
                {
                    break;
                }

                try
                {
                    new SignalRules.BLL.omc_device_heartbeat().monter_heartbeat();
                    Thread.Sleep(10000);//10秒运行一次
                }
                catch (Exception ex)
                {
                    WebCore.Log.WebLog.WriteTextLog("", WebCore.Log.WebLogType.SignalCmd, "monter_heartbeat", ex.Message);
                }
            }
        }
     }
}

2、Socket服务端监听

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
using WebCore;
using SignalRules.Model;
using System.Threading;
 

namespace SignalRules
{ 
    public class SocketServer1
    {
        static Socket sokWatch = null;//负责监听 客户端段 连接请求的  套接字
        static Thread threadWatch = null;//负责 调用套接字, 执行 监听请求的线程
        static Thread threadSend = null;
        static bool isWatch = true;
        static bool isRec = true;//与客户端通信的套接字 是否 监听消息
        static bool isSend = true;//给客户端发信息。
        static int monitor_interval = WebConfig.MonitorInterval;

        static Dictionary<string, ConnectionClient> dictConn = new Dictionary<string, ConnectionClient>();
        public delegate void DGShowMsg(string strMsg);

 
        public static void StartListen()
        {
            //实例化 套接字 (ip4寻址协议,流式传输,TCP协议)
            sokWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //创建 ip对象
            IPAddress address = IPAddress.Parse(WebConfig.SocketIP);
            //创建网络节点对象 包含 ip和port
            IPEndPoint endpoint = new IPEndPoint(address, int.Parse(WebConfig.SocketPort));
            //将 监听套接字  绑定到 对应的IP和端口            

            try
            {
                sokWatch.Bind(endpoint);
                //设置 监听队列 长度为10(同时能够处理 10个连接请求)
                sokWatch.Listen(10);
                threadWatch = new Thread(StartWatch);
                threadWatch.IsBackground = true;
                threadWatch.Start();
                WebCore.Log.WebLog.WriteTextLog(WebCore.Log.WebLogLevel.INFO, "system", WebCore.Log.WebLogType.SignalCmd, "SocketListen", String.Format("启动监听{0}成功", sokWatch.LocalEndPoint.ToString()));
                //txtShow.AppendText("启动服务器成功......\r\n");
                threadSend = new Thread(socket_Send);
                threadSend.IsBackground = true;
                threadSend.Start();
                WebCore.Log.WebLog.WriteTextLog(WebCore.Log.WebLogLevel.INFO, "system", WebCore.Log.WebLogType.SignalCmd, "SocketListen", String.Format("启动发送"));
            }
            catch (Exception ex)
            {
                WebCore.Log.WebLog.WriteTextLog(WebCore.Log.WebLogLevel.ERROR, "system", WebCore.Log.WebLogType.SignalCmd, "StartListen", ex.Message);
            }
        }

 

        #region 1.被线程调用 监听连接端口
        /// <summary>
        /// 被线程调用 监听连接端口
        /// </summary>
        static void StartWatch()
        {
            while (isWatch)
            {
                try
                {
                    //threadWatch.SetApartmentState(ApartmentState.STA);
                    //监听 客户端 连接请求,但是,Accept会阻断当前线程
                    Socket sokMsg = sokWatch.Accept();//监听到请求,立即创建负责与该客户端套接字通信的套接字
                    ConnectionClient connection = new ConnectionClient(sokMsg, RemoveClientConnection);
                    //将负责与当前连接请求客户端 通信的套接字所在的连接通信类 对象 装入集合
                    try
                    {
                        dictConn.Add(((IPEndPoint)sokMsg.RemoteEndPoint).Address.ToString(), connection);
                        WebCore.Log.WebLog.WriteTextLog(WebCore.Log.WebLogLevel.INFO,"system", WebCore.Log.WebLogType.SignalCmd, "SocketListen", String.Format("监听到请求IP={0}", sokMsg.RemoteEndPoint.ToString()));
                    }
                    catch (Exception ex)
                    {
                            WebCore.Log.WebLog.WriteTextLog(WebCore.Log.WebLogLevel.ERROR, "system", WebCore.Log.WebLogType.SignalCmd, "SocketListen", String.Format("重新监听到请求IP={0}", sokMsg.RemoteEndPoint.ToString()));
                    }

                    //将 通信套接字 加入 集合,并以通信套接字的远程IpPort作为键
                    //dictSocket.Add(sokMsg.RemoteEndPoint.ToString(), sokMsg);
                    //ShowMsg("接收连接成功......");
                    //启动一个新线程,负责监听该客户端发来的数据
                    //Thread threadConnection = new Thread(ReciveMsg);
                    //threadConnection.IsBackground = true;
                    //threadConnection.Start(sokMsg);
                }
                catch (Exception ex)
                {
                    WebCore.Log.WebLog.WriteTextLog(WebCore.Log.WebLogLevel.ERROR, "system", WebCore.Log.WebLogType.SignalCmd, "StartWatch", "监听连接端口错误:" + ex.Message);
                }
            }

        }
        #endregion

 

        #region 发送消息 到指定的客户端 -btnSend_Click
        //发送消息 到指定的客户端
        private static void socket_Send()
        {            
            //获取客户端信息 
            int result=0;
            byte[] recvBytes = new byte[1024];
            byte[] sendBytes;
            List<byte[]> sendByte_list = new List<byte[]>();
            string connectionSokKey = "";

            while (isSend)
            {
                try
                {
                    #region 发送数据给终端板
                    cmd_execute m_cmd_execute = new cmd_execute();
                    SignalRules.Model.EntReturn send_result = SignalRules.DealLib.Signal_Send_Deal(ref m_cmd_execute);
                    if (send_result != null && send_result.ResultCode == 0)
                    {
                        sendByte_list = (List<byte[]>)send_result.ResultObject;
                        connectionSokKey = m_cmd_execute.device_ip;//取得发送的客户端IP
                        WebCore.Log.WebLog.WriteTextLog(WebCore.Log.WebLogLevel.INFO, "system", WebCore.Log.WebLogType.SignalCmd, "socket_Send/Deal", "取得发送的客户端IP:" + connectionSokKey);
                        for (int i = 0; i < sendByte_list.Count; i++)
                        {
                            sendBytes = sendByte_list[i];//发送数据给终端板
                            if (!string.IsNullOrEmpty(connectionSokKey) && dictConn.ContainsKey(connectionSokKey))
                            {
                                //从字典集合中根据键获得 负责与该客户端通信的套接字,并调用send方法发送数据过去
                                result = dictConn[connectionSokKey].doSend_Work(sendBytes);//返回信息给客户端
                                if (result == -1)
                                {
                                    continue;
                                }
                                WebCore.Log.WebLog.WriteTextLog(WebCore.Log.WebLogLevel.INFO, "system", WebCore.Log.WebLogType.SignalCmd, "socket_Send/Deal", SignalRules.DealLib.byteToHexStr(sendBytes));
                            }
                            Thread.Sleep(100);
                        }

 
                        //发送成功,修改数据库
                        if (m_cmd_execute != null && m_cmd_execute.device_code != "")
                        {
                            DealLib.Signal_Send_Deal_Data(m_cmd_execute);
                        }
                    }
                    else if (send_result.ResultCode ==-1)
                    {
                        WebCore.Log.WebLog.WriteTextLog(WebCore.Log.WebLogLevel.INFO, "system", WebCore.Log.WebLogType.SignalCmd, "socket_Send/Deal", send_result.ResultCode + send_result.ResultMsg);
                    }

                    Thread.Sleep(monitor_interval);
                    #endregion
                }
                catch (Exception ex)
                {
                    WebCore.Log.WebLog.WriteTextLog(WebCore.Log.WebLogLevel.ERROR, "system", WebCore.Log.WebLogType.SignalCmd, "socket_Send/Error", ex.Message);
                }
            }
        }
        #endregion

 

        //发送闪屏!!
        private void socket_Shack(string key)
        {
            string connectionSokKey = key;

            if (!string.IsNullOrEmpty(connectionSokKey))
            {
                dictConn[connectionSokKey].SendShake();
            }
        }


        //群闪
        private void socket_ShackAll(string key)
        {
            foreach (ConnectionClient conn in dictConn.Values)
            {
                conn.SendShake();
            }
        }

   

        public static void Socket_Close()
        {
            try
            {
                isSend = false;
                isRec = false;
                isWatch = false;
                Thread.Sleep(100);
                foreach (ConnectionClient conn in dictConn.Values)
                {
                    conn.CloseConnection();
                }

                if (sokWatch != null && sokWatch.Connected)
                {
                    sokWatch.Close();
                }

                if (threadWatch != null)
                {
                    threadWatch.Abort();
                }

                if (threadSend != null)
                {
                    threadSend.Abort();
                }            
            }
            catch(Exception ex)
            {
                WebCore.Log.WebLog.WriteTextLog(WebCore.Log.WebLogLevel.ERROR, "system", WebCore.Log.WebLogType.SignalCmd, "Socket_Close/Error", ex.Message);
            }
        }
    }
}

3、业务协议处理


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.IO;

using SignalRules.Model;

using System.Data;

using WebCore;

using WebCore.Log;

 

namespace SignalRules

{

    public class DealLib

    {

        #region 枚举定义

        /// <summary>

        /// 命令位数

        /// </summary>

        enum cmd_place

        {

            7E 03 01 00 000000000000 D280 80 01 01 FF 04410106 C508 7E

            start = 0,      //起始标志,固定为0x7E

            ap_layer = 1,   //AP层协议类型,0x03表示为AP:C

            load_bearing = 2,//承载协议类型,0x01表示承载的上层协议类型为VP:A

            site_code = 3,  //主单元站点编号

            floor_no=4,     //获取楼号

            floor_num1=5,   //楼层,低位字节

            floor_num2=6,   //楼层,低位字节

            device_type=7,  //设备类型(主控单元0x00、远端单元0x01、*侦测单元0x02)

            remote_code1=8, //远端单元编号,共两个字节.

            remote_code2=9,//远端单元编号,共两个字节.

            communica_identify1=10,//监控中心发起的通信,低位.

            communica_identify2=11,//监控中心发起的通信,高位

            vp_layer_interact_flag=12,  //VP层交互标志

            mcp_layer_protocol_flag=13, //MCP层协议标识,目前只定义了一种0x01

            data_command_identify=14,   //命令标识,0x01	设备主动告警(上报)、0x02	查询、0x03	设置

            data_response_flag=15,      //应答标志,0xFF 表示此包为发出的命令,而非命令的应答包

            monitor_data_length=16,     //监控数据长度

            monitor_identify=17,        //监控标识

            monitor_data_value = 18       //监控数据的值

        }

 

        /// <summary>

        /// VP层交互标志

        /// </summary>

        enum vp_layer_interact

        {

            res_success=0x00,   //	通信请求的执行结果,表示执行正常。

            res_busy=0x01,//	通信请求的执行结果,表示设备忙,无法处理命令请求。

            req_success=0x80,//	正常的命令请求。

        }

 

        /// <summary>

        /// a)	命令标识:命令的唯一标识

        /// </summary>

        enum command_identify

        {

            device_active_alarm = 0x01,//设备主动告警(上报)

            query = 0x02,             //查询

            set_up = 0x03,            //设置

            upgrade_mode = 0x10,      //转换到软件升级模式

            monitor_software_version = 0x11   //切换监控软件版本

        }

 

        /// <summary>

        /// b)	应答标志:

        /// </summary>

        enum response_flag

        {

            success = 0x00,      //	成功

            execute = 0x01,      //	命令被有条件执行

            code_error = 0x02,      //	命令编号错

            leng_error = 0x03,      //	长度错

            crc_error = 0x04,      //	CRC校验错

            error = 0xFE,      //	其它错误

            cmd = 0xFF      //	命令

        }

        #endregion

 

       

        /// <summary>

        /// 获取数据值,存在多个数据值。

        /// </summary>

        /// <param name="revcByte"></param>

        /// <param name="start">数据开始项,第一个数据块为16</param>

        /// <returns></returns>

        private static List<SignalRules.Model.cmd_packet_data> get_Packet_DataValue(byte[] revcByte,int start)

        {

            string str = "";

            int tmp_num = 0;

            byte[] datavalue_byte;

            List<SignalRules.Model.cmd_packet_data> result = new List<SignalRules.Model.cmd_packet_data>();

            SignalRules.Model.cmd_packet_data m_cmd_packet_data;

            try

            {

                //判断整长度-3 还大于3,说明有两个以上的数据块。

                while ((revcByte.Length - start - 3) > 3)

                {

                    str = "revcByte.Length=" + revcByte.Length + ",start=" + start;

                    //取得数据数块

                    m_cmd_packet_data = new SignalRules.Model.cmd_packet_data();

                    m_cmd_packet_data.monitor_data_length = revcByte[start];//标识监控数据结构的长度,指的是从“长度”到“值”的所有字节总数,其本身为1个字节无符号整型数,单位是字节。

                    str = str + ",data_length=" + m_cmd_packet_data.monitor_data_length;

                    m_cmd_packet_data.monitor_identify = byteToHexStr(new byte[] { revcByte[start + 2], revcByte[start + 1] });//监控数据标识为2个字节的无符号整型数,其可取值范围为0x0000~0xFFFF

                    str = str + ",monitor_identify=" + m_cmd_packet_data.monitor_identify;

                    #region//start计划出数据块的值

                    if (m_cmd_packet_data.monitor_data_length > 3)

                    {

                        tmp_num = m_cmd_packet_data.monitor_data_length - 3;//数据块值的位数。

                        datavalue_byte = new byte[tmp_num];

                        start = start + 3;//从第4位数据值开始计算。

                        for (int i = 0; i < tmp_num; i++)

                        {

                            datavalue_byte[i] = revcByte[start];

                            start++;

                        }

                        m_cmd_packet_data.monitor_data_value = datavalue_byte;//byteToHexStr(datavalue_byte);

                    }

                    else

                    {

                        tmp_num = revcByte.Length - start;

                        datavalue_byte = new byte[tmp_num];

                        for (int i = 0; i < tmp_num; i++)

                        {

                            datavalue_byte[i] = revcByte[start];

                            start++;

                        }

                        m_cmd_packet_data.monitor_data_value = datavalue_byte;

                        throw new Exception("数据块长度异常:data_length=" + m_cmd_packet_data.monitor_data_length + ",tmp_num=" + tmp_num + ",datavalue=" + byteToHexStr(datavalue_byte));

                    }

 

                    result.Add(m_cmd_packet_data);

 

                    str = str + ",data_value=" + byteToHexStr(m_cmd_packet_data.monitor_data_value);

                    WebCore.Log.WebLog.WriteTextLog(WebLogLevel.INFO,"system", WebCore.Log.WebLogType.SignalCmd, "SocketServer/Deal/test", str);//测试打印日志

                    //

                }

                #endregion

            }

            catch (Exception ex)

            {

                WebCore.Log.WebLog.WriteTextLog(WebLogLevel.ERROR, "system", WebCore.Log.WebLogType.SignalCmd, "SocketServer/Deal/get_Packet_DataValue", ex.Message + "; " + str);

            }

            return result;

        }

 

        /// <summary>

        /// 得到通信包标识ID

        /// </summary>

        /// <returns></returns>

        public static byte[] get_Comm_Packet_Identify()

        {

            string tmp_str = "";

            byte[] result = new byte[2];

            if (_COMM_PACKET_IDENTIFY > 9999)

            {

                _COMM_PACKET_IDENTIFY = 1;

            }

            else

            {

                _COMM_PACKET_IDENTIFY++;

            }

            tmp_str =_COMM_PACKET_IDENTIFY.ToString().PadLeft(4, '0');

            for (int i = 0; i < 2; i++)

            {

                result[i] = Convert.ToByte(tmp_str.Substring(i * 2, 2));

            }

            return result;

        }

 

   

 

        #region 处理从终端收到的数据

        private static bool revice_response_verify(byte response_flag)

        {

            bool result = false;

 

            if (response_flag == 0x01)//0x01	命令被有条件执行

            {

                result = true;

            }

            else if (response_flag == 0x02)//0x02	命令编号错

            {

                result = false;

            }

            else if (response_flag == 0x03)//0x03	长度错

            {

                result = false;

            }

            else if (response_flag == 0x04)//0x04	CRC校验错

            {

                result = false;

            }

            else if (response_flag == 0xFE)//0xFE	其它错误

            {

                result = false;

            }

            return result;

        }

 

        /// <summary>

        /// 接收命令包业务处理

        /// </summary>

        /// <param name="m_cmd_execute">命令工单</param>

        /// <param name="m_cmd_packet_data_list">命令里数据块列表</param>

        /// <returns></returns>

        private static bool revice_command_package_deal(SignalRules.Model.cmd_execute m_cmd_execute, List<SignalRules.Model.cmd_packet_data> m_cmd_packet_data_list)

        {

            bool result = false;

            string[,] ary_packet_data;

            string tmp_str = "";

            SignalRules.Model.omc_device_alarm m_omc_device_alarm = new SignalRules.Model.omc_device_alarm();

 

 

            // 获取数据列表数组 ID|数据值|数据类型|数据编码|表字|字段|数据描述

            ary_packet_data = SignalRules.BLL.common.get_cmd_data_identify(m_cmd_packet_data_list);

 

            for (int i = 0; i < ary_packet_data.GetLength(0); i++)

            {

                tmp_str = ary_packet_data[i, 0].Substring(0, 2);

                if (tmp_str == "02" || tmp_str == "03")//获取告警使能或告警状态

                {

                    int rows = new SignalRules.BLL.omc_cmd_execute().revice_device_alarm_info(m_cmd_execute.device_code, m_cmd_execute.device_ip, ary_packet_data[i, 0], ary_packet_data[i, 1]);

                    

                }

                else if (ary_packet_data[i, 0] == "0141")//上报类型

                {

                    //WebCore.Log.WebLog.WriteTextLog("system", WebCore.Log.WebLogType.SignalCmd, "doReceive_Work/DealLib/revice_command_package_deal", "device_code=" + m_cmd_execute.device_code + ",monitor_id=" + ary_packet_data[i, 0] + ",data_str=" + ary_packet_data[i, 1]);

                    new SignalRules.BLL.omc_cmd_execute().revice_device_report_type(m_cmd_execute.device_code, m_cmd_execute.device_ip,ary_packet_data[i, 0], ary_packet_data[i, 1]);

                    //new SignalRules.BLL.omc_driverinfo().ExistUpdate(m_cmd_execute.device_code);

                }

            }

            return result;

        }

 

        /// <summary>

        /// 接收响应包业务处理

        /// </summary>

        /// <param name="response_flag"></param>

        /// <returns></returns>

        private static SignalRules.Model.EntReturn revice_response_package_deal(SignalRules.Model.cmd_packet m_cmd_packet, SignalRules.Model.cmd_execute m_cmd_execute, List<SignalRules.Model.cmd_packet_data> m_cmd_packet_data_list)

        {

            SignalRules.Model.EntReturn result = new SignalRules.Model.EntReturn();

            int command_identify = 0;

            SignalRules.Model.omc_device_alarm m_omc_device_alarm = new SignalRules.Model.omc_device_alarm();

            SignalRules.Model.omc_device_query m_omc_device_query = new SignalRules.Model.omc_device_query();

            List<cmd_packet_data> m_cmd_data_list = new List<cmd_packet_data>();

 

            string[,] ary_packet_data;

            string remote_code = "";

            string remote_ip = "";

            string monitor_id = "";

            byte[] remote_byte=new byte[18] ;

            byte[] tmp_byte;

            int num = 0;

 

            

            try

            {

                //ID|数据值|数据类型|数据编码|表字|字段|数据描述

                ary_packet_data = SignalRules.BLL.common.get_cmd_data_identify(m_cmd_packet_data_list);

                if (ary_packet_data == null)

                {

                    result.ResultCode = -1;

                    return result;

                }

                //获取命令响应标识

                command_identify = m_cmd_packet.data_command_identify;

                if (command_identify == 0x02)//查询

                {

                    #region 获取查询的响应

                    

 

                    for (int i = 0; i < ary_packet_data.GetLength(0); i++)

                    {

                        #region

                        /*

                        m_omc_device_query = new SignalRules.Model.omc_device_query();

                        m_omc_device_query.device_type = m_cmd_execute.device_type;

                        m_omc_device_query.device_code = m_cmd_execute.device_code;

                        m_omc_device_query.monitor_id = ary_packet_data[i, 0];

                        m_omc_device_query.monitoring_name = ary_packet_data[i, 6];

                        m_omc_device_query.data_value = ary_packet_data[i, 1];

                        m_omc_device_query.status = 0;

                        m_omc_device_query.query_time = DateTime.Now;

                        new SignalRules.BLL.omc_device_query().Add(m_omc_device_query);*/

                        #endregion

                        //监控数据标识=0x0008,获取远端设备编号和IP地址,有N台远端机

                        if (ary_packet_data[i, 0] == "0008") 

                        {

                            #region 获取远端设备编号和IP地址,有N台远端机

                            remote_byte = strToToHexByte(ary_packet_data[i, 1]);

                            m_cmd_data_list = get_Packet_DataValue(remote_byte, 3);//得到数组为2,1个为远端设备号,另一个为远端IP地址。

                            if (m_cmd_data_list.Count == 2)//远端单元设备编号 和 IP

                            {

                                tmp_byte = m_cmd_data_list[0].monitor_data_value;//远端单元设备编号

                                if (tmp_byte.Length == 6)

                                {

                                    //remote_code = byteToHexStr(m_cmd_data_list[0].monitor_data_value);//获取远端设备号

                                    remote_code = asciiToStr(m_cmd_data_list[0].monitor_data_value);//远端设备编号,转为ASCII码

                                    remote_code = m_cmd_execute.site_code.ToString("000") + remote_code;//设备编号   

                                    

                                    monitor_id = m_cmd_data_list[1].monitor_identify;   //远端标识号

                                    tmp_byte = m_cmd_data_list[1].monitor_data_value;//远程端的IP地址

                                    if (tmp_byte.Length == 4)

                                    {

                                        remote_ip = tmp_byte[0].ToString() + "." + tmp_byte[1].ToString() + "." + tmp_byte[2].ToString() + "." + tmp_byte[3].ToString();

                                        new SignalRules.BLL.omc_cmd_execute().revice_query_response_deal(remote_code,monitor_id, remote_ip);

                                    }

                                }

                            }

                            #endregion

                        }

                        else if (ary_packet_data[i, 0] == "0009")//监控数据标识=0x0009,获取设备所有的监控标识

                        {

                            #region 获取设备所有的监控标识

                            //WebCore.Log.WebLog.WriteTextLog("system", WebCore.Log.WebLogType.SignalCmd, "SocketServer/Common/set_cmd_execute", ary_packet_data[i, 1]);

                            remote_byte = strToToHexByte(ary_packet_data[i, 1]);

                            for (int j = 1; j < remote_byte.Length / 2; j++)

                            {

                                num=j*2;

                                monitor_id = byteToHexStr(new byte[] { remote_byte[num + 1], remote_byte[num] });

                                new SignalRules.BLL.omc_cmd_execute().p_revice_query_response_init(m_cmd_execute.device_code, monitor_id);

                            }

                            #endregion

                        }

                        else

                        {

                            //修改设备表

                            monitor_id=ary_packet_data[i, 0];

                            int rows = new SignalRules.BLL.omc_cmd_execute().revice_query_response_deal(m_cmd_execute.device_code, monitor_id, ary_packet_data[i, 1]);

                        }

 

                    }

                    //WebCore.Log.WebLog.WriteTextLog("system", WebCore.Log.WebLogType.SignalCmd, "SocketServer/Common/set_cmd_execute", strSql.ToString());

                    

                    result.ResultCode = 0;

                    #endregion

                }

                else if (command_identify == 0x03)//设置

                {

                    #region 获得设置响应

                    for (int i = 0; i < ary_packet_data.GetLength(0); i++)

                    {

                        //修改设备表

                        monitor_id = ary_packet_data[i, 0];

                        int rows = new SignalRules.BLL.omc_cmd_execute().revice_query_response_deal(m_cmd_execute.device_code, monitor_id, ary_packet_data[i, 1]);

                    }

                    new SignalRules.BLL.omc_cmd_execute().UpdateStatus(m_cmd_execute.device_code,"03", 3);

                    result.ResultCode = 0;

                    #endregion

                }

            }

            catch (Exception ex)

            {

                result.ResultCode = -1;

                result.ResultMsg = ex.Message;

 

            }

 

            return result;

        }

 

        /// <summary>

        /// 处理从终端收到的数据

        /// </summary>

        /// <param name="revcByte"></param>

        /// <param name="str"></param>

        /// <returns>ResultCode>0需要响应包;ResultCode=0不需要响应包;ResultCode小于为异常包</returns>

        public static SignalRules.Model.EntReturn Signal_Revice_Deal(byte[] revcByte, string socketRemoteKey)

        {

            byte[] sendByte = revcByte;

            byte[] ary_byte=null;

            string tmp_str = "";

            int data_num = revcByte.Length;

            SignalRules.Model.EntReturn result = new SignalRules.Model.EntReturn();

            SignalRules.Model.cmd_packet m_cmd_packet = new SignalRules.Model.cmd_packet();

            //SignalRules.Model.cmd_packet_data m_cmd_packet_data;

            List<SignalRules.Model.cmd_packet_data> m_cmd_packet_data_list =new List<cmd_packet_data>();

            List<SignalRules.Model.cmd_execute> m_cmd_execute_list =new List<cmd_execute>();

            try

            {

                result.ResultCode = 0;

 

                //转义字符,接收到数据包后,先进行转义处理,再进行CRC校验

                set_Escape(ref revcByte, ref data_num, "revice");

 

                //7E 03 01 00 000000000000 D280 80 01 01 FF 04410106 C508 7E

                #region 解读数据包,检验CRC检验正确性

                if (get_DataPacket_CRC_Check(revcByte) == true)

                {

                    try

                    {

                        #region 解读数据包字节

                        #region 解析数据包头信息

                        m_cmd_packet.site_code = revcByte[3];//获取主单元站点编号

                        m_cmd_packet.floor_no = revcByte[4];//获取楼号

                        m_cmd_packet.floor_num=new byte[]{ revcByte[5], revcByte[6] };//获取楼层,共两个字节

                        m_cmd_packet.device_type = revcByte[7];//获取设备类型(主控单元0x00、远端单元0x01、*侦测单元0x02)

                        m_cmd_packet.remote_code = new byte[] { revcByte[8], revcByte[9] };//获取远端单元编号,共两个字节.

                        获取通信包标识号,在传输时低字节在前,高字节在后,

                        //其中0x0000~0x7FFF用于监控中心发起的通信,而0x8000~0x8FFF则用于由设备发起的通信,余下的0x9000~0xFFFF则为保留

                        m_cmd_packet.communica_packet_identify = new byte[] { revcByte[10], revcByte[11] };//获取通信包标识号,在传输时低字节在前,高字节在后,

                        m_cmd_packet.vp_layer_interact_flag = revcByte[12];//获取VP层交互标志

                        m_cmd_packet.mcp_layer_protocol_flag = revcByte[13];//获取MCP层协议标识,目前只定义了一种0x01

                        m_cmd_packet.data_command_identify = revcByte[14];//获取命令标识,0x01表示是上报命令

                        m_cmd_packet.data_response_flag = revcByte[15];//获取应答标志,命令发起方该字段填充0xFF

                        #endregion

 

                        //判断VP层的命令

                        if (m_cmd_packet.vp_layer_interact_flag >= 0x00 && m_cmd_packet.vp_layer_interact_flag <= 0xFF)

                        {

                            //其中0x80~0xFF用于命令,而0x00~0x7F则用于应答包中

                        }

                        else

                        {

                            result.ResultCode = -8;

                            result.ResultMsg = "VP层的命令有误,不属于0x80~0xFF用于命令,而0x00~0x7F则用于应答包";

                        }

 

                        //判断设备类型(主控单元0x00、远端单元0x01、*侦测单元0x02),不正常丢掉。

                        if ((m_cmd_packet.device_type == 0x00 || m_cmd_packet.device_type == 0x01 || m_cmd_packet.device_type == 0x02))

                        {

                            //只接收从设备过来的三种数据,包括主控单元0x00、远端单元0x01、侦测单元0x02

                        }

                        else

                        {

                            result.ResultCode = -9;

                            result.ResultMsg = "设备类型有误,不属于主控单元0x00、远端单元0x01、侦测单元0x02";

                        }

                        

 

                        SignalRules.Model.cmd_execute m_cmd_execute = new SignalRules.Model.cmd_execute();

                        m_cmd_execute.site_code = revcByte[3];获取主单元站点编号

                        //m_cmd_execute.remote_code = byteToHexOneStr(new byte[] { revcByte[4], revcByte[5], revcByte[6], revcByte[7], revcByte[8], revcByte[9] });//远端设备编号

                        //转为ASCII码

                        //remote_code=楼号(1字节)	楼层(2字节)	设备类型(1字节)	远端单元编号(2字节)

                        m_cmd_execute.remote_code = asciiToStr(new byte[] { revcByte[4], revcByte[5], revcByte[6], revcByte[7], revcByte[8], revcByte[9] });//远端设备编号

                        m_cmd_execute.device_code = m_cmd_execute.site_code.ToString("000") + m_cmd_execute.remote_code;//设备编号

                        m_cmd_execute.device_ip = socketRemoteKey;

                        m_cmd_execute.action_type = "03";//操作类型 读、写

 

                        //获取数据库块的值

                        m_cmd_packet_data_list = get_Packet_DataValue(revcByte, 16);//

 

                        //判断命令包还是应答包

                        if (m_cmd_packet.vp_layer_interact_flag <= 0x7F) //应答包

                        {

                            try

                            {

                                #region 应答包处理

                                if (m_cmd_packet.data_response_flag == 0x00) //返回应答标志为成功

                                {

                                    //将命令语句转为SQL处理语句

                                    SignalRules.Model.EntReturn ent = revice_response_package_deal(m_cmd_packet, m_cmd_execute, m_cmd_packet_data_list);

                                    if (ent.ResultCode == 0)

                                    {

                                        tmp_str = m_cmd_packet.data_command_identify.ToString();

                                        //处理完成 状态为已响应

                                        new SignalRules.BLL.omc_cmd_execute().UpdateStatus(m_cmd_execute.device_code, tmp_str,3);

                                        result.ResultCode = 0;

                                        //result.ResultString = m_cmd_execute.site_code + "," + m_cmd_execute.device_code + "," + m_cmd_execute.device_type + "," +

                                        //m_cmd_execute.monitor_type + "," + m_cmd_execute.monitor_identify + "," + m_cmd_execute.action_type + "," +

                                        //m_cmd_execute.monitor_identify.ToString();

                                    }

                                    else

                                    {

                                        result.ResultCode = -1;

                                        result.ResultMsg = ent.ResultMsg;

                                    }

                                }

                                else

                                {

                                    result.ResultCode = -1;

                                    result.ResultMsg = "返回应答标志为" + m_cmd_packet.data_response_flag.ToString();

                                    throw new Exception("返回“命令被有条件执行=" + m_cmd_packet.data_response_flag + "”");

                                }

                                #endregion

                            }

                            catch (Exception ex)

                            {

                                WebCore.Log.WebLog.WriteTextLog(WebLogLevel.ERROR, "system", WebCore.Log.WebLogType.SignalCmd, "doReceive_Work/DealLib/Signal_Revice_Deal", "应答包处理:" + ex.Message);

                            }

                        }

                        else //命令包

                        {

                            try

                            {

                                #region 命令包处理

                                if (m_cmd_packet.data_command_identify == 0x01)//设备主动告警(上报)

                                {

                                    revice_command_package_deal(m_cmd_execute, m_cmd_packet_data_list);

                                    //WebCore.Log.WebLog.WriteTextLog("system", WebCore.Log.WebLogType.SignalCmd, "SocketServer/Common/set_cmd_execute", strSql.ToString());

                                }

                                #endregion

                            }

                            catch (Exception ex)

                            {

                                WebCore.Log.WebLog.WriteTextLog(WebLogLevel.ERROR, "system", WebCore.Log.WebLogType.SignalCmd, "doReceive_Work/DealLib/Signal_Revice_Deal", "命令包处理:" + ex.Message);

                            }

                        }

                        #endregion

                    }

                    catch (Exception ex)

                    {

                        throw new Exception("解读数据包字节:"+ex.Message);

                    }

                }

                else

                {

                    sendByte[15] = 0x04;//重置应答标志,0x00 发送CRC校验错

                    result.ResultCode = 1;

                    result.ResultMsg = "CRC校验错";

                }

                #endregion

 

                #region 构造响应包

                try

                {

                    if (Convert.ToInt16(m_cmd_packet.vp_layer_interact_flag) >= 0x80) //0x80~0xFF 命令,

                    {

                        result.ResultCode = 1;//命令发起方,需要响应包

                        //判断通讯标识

                        //tmp_str = m_cmd_packet.communica_packet_identify;

                        //int sss = Convert.ToInt16("80", 16); sss = Convert.ToInt16("FF", 16);

                        if (m_cmd_packet.communica_packet_identify[1]<= 128) //中心主动发起

                        {

                            sendByte[12] = 0x00;

                            sendByte[15] = 0x00;

                        }

                        //else if (tmp_str != "" && Convert.ToInt16(tmp_str, 16) <= 255) //设备主动发起

                        else if (m_cmd_packet.communica_packet_identify[1] <= 255) //设备主动发起

                        {

                            sendByte[12] = 0x00;

                            sendByte[15] = 0x00;//重置应答标志,0x00 发送成功

                        }

                        else

                        {

                            sendByte[12] = 0x00;//VP层交互标志

                            sendByte[15] = 0x00;//重置应答标志,0x00 发送成功

                        }

                        try

                        {

                            #region 生成CRC检验码

                            ary_byte = new byte[sendByte.Length - 4];

                            for (int i = 0; i < sendByte.Length - 4; i++)

                            {

                                ary_byte[i] = sendByte[i + 1];

                            }

                            //WebCore.Log.WebLog.WriteTextLog("system", WebCore.Log.WebLogType.SignalCmd, "SocketServer/DealLib/Signal_Revice_Deal", byteToHexStr(ary_byte));

                            ary_byte = strToToHexByte(CCITTCrc16(ary_byte, ary_byte.Length).ToString("X2"));

                            if (ary_byte.Length == 2)

                            {

                                sendByte[sendByte.Length - 3] = ary_byte[1]; //取得CRC高位值

                                sendByte[sendByte.Length - 2] = ary_byte[0];//取得CRC低位值

 

                            }

                            #endregion

 

                            ///转义字符,发送数据包之前,先生成CRC校验值,再进行转义处理

                            set_Escape(ref sendByte, ref data_num, "send");

                            //WebCore.Log.WebLog.WriteTextLog("system", WebCore.Log.WebLogType.SignalCmd, "SocketServer/DealLib/Signal_Revice_Deal/转义字符", byteToHexStr(sendByte));

                        }

                        catch (Exception ex)

                        {

                            

                            WebCore.Log.WebLog.WriteTextLog("system", WebCore.Log.WebLogType.SignalCmd, "SocketServer/DealLib/Signal_Revice_Deal", "构造响应包->生成CRC检验码:" + ex.Message+byteToHexStr(ary_byte));

                            //throw new Exception("构造响应包->生成CRC检验码:" + ex.Message);

                        }

                        result.ResultObject = sendByte;

                    }

                    else

                    {

                        result.ResultCode = 0;//命令接收方,不需要响应包

                    }

                }

                catch (Exception ex)

                {

                    throw new Exception("构造响应包:" + ex.Message);

                }

                #endregion

            }

            catch (Exception ex)

            {

                result.ResultMsg = ex.Message;

                WebCore.Log.WebLog.WriteTextLog(WebLogLevel.ERROR, "system", WebCore.Log.WebLogType.SignalCmd, "doReceive_Work/DealLib/Signal_Revice_Deal", ex.Message);

            }

            

            return result;

        }

 

        #endregion

 

        #region 处理向终端发送数据

        /// <summary>

        /// 处理向终端发送数据

        /// </summary>

        /// <returns></returns>

        public static SignalRules.Model.EntReturn Signal_Send_Deal(ref cmd_execute m_cmd_execute )

        {

            byte[] sendByte = new byte[1064];

            List<byte[]> sendByte_list=new List<byte[]>();

            byte[] package_head = new byte[16];

            List<byte[]> package_list = new List<byte[]>();

 

            byte[] ary_byte;

            int data_num = 0;

            SignalRules.Model.EntReturn result = new SignalRules.Model.EntReturn();

            //SignalRules.Model.cmd_execute m_cmd_execute = new cmd_execute();

            result.ResultCode = 0;

            

            try

            {

 

                result.ResultCode = 0;

                #region 生成命令

                #region 获取数据包集合

                List<SignalRules.Model.cmd_execute> m_cmd_execute_list = get_Send_Data();//从发送列表获取需要发送的数据      

                if (m_cmd_execute_list.Count == 0)

                {

                    result.ResultCode = 1;//数据包为空

                }

 

                for (int n = 0; n < m_cmd_execute_list.Count; n++)

                {

                    m_cmd_execute = m_cmd_execute_list[n];

                    if (m_cmd_execute != null && m_cmd_execute.packet_data_byte != null)

                    {

                        //分拆数据包,//每个包为1000+19的长度,超过需要分成2个或多个包

                        package_list = split_data_package(m_cmd_execute.packet_data_byte);

 

                        for (int num = 0; num < package_list.Count; num++) //每个包处理

                        {

                            #region 命令赋值

                            7E 03 01 00 000000000000 D280 80 01 01 FF 04410106 C508 7E

                            package_head[0] = 0x7E;//起始标志,固定为0x7E

                            package_head[1] = 0x03;//AP层协议类型,0x03表示为AP:C

                            package_head[2] = 0x01;//承载协议类型,0x01表示承载的上层协议类型为VP:A

                            package_head[3] = Convert.ToByte(m_cmd_execute.site_code);//主单元站点编号

                            //ary_byte = oneStrToHexByte(m_cmd_execute.remote_code); //分解远端设备号 

                            ary_byte = Encoding.ASCII.GetBytes(m_cmd_execute.remote_code);//分解远端设备号,转为ASCII编号

                            package_head[4] = ary_byte[0];//获取楼号

                            package_head[5] = ary_byte[1];//获取楼层,共两个字节

                            package_head[6] = ary_byte[2];//获取楼层,共两个字节

                            package_head[7] = ary_byte[3];//设备类型(主控单元0x00、远端单元0x01、*侦测单元0x02)

                            package_head[8] = ary_byte[4];//远端单元编号,共两个字节.

                            package_head[9] = ary_byte[5];//远端单元编号,共两个字节.

 

                            //其中0x0000~0x7FFF用于监控中心发起的通信,而0x8000~0x8FFF则用于由设备发起的通信

                            ary_byte = get_Comm_Packet_Identify();

                            package_head[10] = ary_byte[1];//监控中心发起的通信,共两个字节.

                            package_head[11] = ary_byte[0];//监控中心发起的通信,共两个字节.

 

                            package_head[12] = 0x80;//VP层交互标志  80请求

                            package_head[13] = 0x01;//MCP层协议标识,目前只定义了一种0x01

                            // 设置包的命令标识,0x01	设备主动告警(上报)、0x02	查询、0x03	设置

                            package_head[14] = get_command_identify(m_cmd_execute.action_type);

 

                            package_head[15] = 0xFF;//应答标志,0xFF 表示此包为发出的命令,而非命令的应答包

                            data_num = 16;

                            #endregion

 

                            #region 赋值包头

                            for (int j = 0; j < package_head.Length; j++)

                            {

                                sendByte[j] = package_head[j];

                            }

                            #endregion

                            #region 获取包内容

                            ary_byte = package_list[num];//每个分包内容处理

                            for (int i = 0; i < ary_byte.Length; i++)

                            {

                                sendByte[data_num++] = ary_byte[i];

                            }

                            #endregion

                            #region 生成CRC检验码

                            ary_byte = new byte[data_num - 1];

                            for (int i = 0; i < data_num - 1; i++)

                            {

                                ary_byte[i] = sendByte[i + 1];

                            }

                            //WebCore.Log.WebLog.WriteTextLog("system", WebCore.Log.WebLogType.SignalCmd, "SocketServer/DealLib/Signal_Revice_Deal", byteToHexStr(ary_byte));

                            ary_byte = strToToHexByte(CCITTCrc16(ary_byte, ary_byte.Length).ToString("X2"));

                            if (ary_byte.Length == 2)

                            {

                                sendByte[data_num++] = ary_byte[1]; //取得CRC高位值

                                sendByte[data_num++] = ary_byte[0];//取得CRC低位值

 

                            }

                            #endregion

 

                            sendByte[data_num++] = 0x7E; //结束符。

 

                            //转义字符,发送数据包之前,先生成CRC校验值,再进行转义处理

                            set_Escape(ref sendByte, ref data_num, "send");

 

                            #region 重新赋值数据包

                            ary_byte = new byte[data_num];

                            for (int i = 0; i < ary_byte.Length; i++)

                            {

                                ary_byte[i] = sendByte[i];

                            }

                            sendByte_list.Add(ary_byte);

                            #endregion

                        }

 

                    }

                    

                }

                #endregion      

                #endregion

 

            }

            catch (Exception ex)

            {

                result.ResultCode = -1;

                result.ResultMsg = ex.Message;

            }

            result.ResultObject = sendByte_list;

            return result;

        }

 

        /// <summary>

        /// 分拆包大小

        /// </summary>

        /// <param name="packet_data_byte"></param>

        /// <returns></returns>

        private static List<byte[]> split_data_package(List<SignalRules.Model.cmd_packet_data_byte> packet_data_byte)

        {

            byte[] sendByte = new byte[532];

            byte[] ary_byte = ary_byte = new byte[500];

            List<byte[]> result = new List<byte[]>();

            int tmp_num = 0;

           

            SignalRules.Model.cmd_packet_data_byte m_cmd_packet_data_byte = new SignalRules.Model.cmd_packet_data_byte();

 

            tmp_num = 0;

            int num = 0;

            try

            {

                //计算包个数,并列表队列中

                for (int i = 0; i < packet_data_byte.Count; i++)

                {

                    m_cmd_packet_data_byte = packet_data_byte[i];

 

                    ary_byte[num++] = m_cmd_packet_data_byte.monitor_data_length;

                    ary_byte[num++] = m_cmd_packet_data_byte.monitor_identify1;//低位在前,高位在后

                    ary_byte[num++] = m_cmd_packet_data_byte.monitor_identify2;//低位在前,高位在后

                    for (int j = 0; j < m_cmd_packet_data_byte.monitor_data_value.Length; j++)

                    {

                        ary_byte[num++] = m_cmd_packet_data_byte.monitor_data_value[j];

                    }

 

                    tmp_num += m_cmd_packet_data_byte.monitor_data_length;//包的长度

                    if (tmp_num > 500) //包长度:每个包的长度不超过500字节。

                    {

 

 

                        sendByte = new byte[num];

                        for (int j = 0; j < num; j++)

                        {

                            sendByte[j] = ary_byte[j];

                        }

 

                        result.Add(sendByte);

 

                        tmp_num = 0; //包长度

                        num = 0;    //包字节数

 

                    }

                }

                if (num > 0)

                {

                    sendByte = new byte[num];

                    for (int j = 0; j < num; j++)

                    {

                        sendByte[j] = ary_byte[j];

                    }

 

                    result.Add(sendByte);

                }

            }

            catch (Exception ex)

            {

                throw new Exception("分析包长度时异常:"+ex.Message);

            }

            return result;

        }

 

        /// <summary>

        /// 从omc_cmd_execute表获得到发送的数据串

        /// </summary>

        /// <returns></returns>

        private static List<SignalRules.Model.cmd_execute> get_Send_Data()

        {

            byte[] ary_byte;    //无符号

            //sbyte[] ary_sbyte;

            int tmp_num_int = 0;

            uint tmp_num_uint = 0;

            string data_value = "";

            string[] tmp_ary ;

            //byte[] tmp_byte;

            int data_length=0;

            DataSet ds = null;

            DataRow drow = null;

            //SignalRules.Model.cmd_execute m_cmd_execute = new cmd_execute();

            SignalRules.Model.cmd_packet_data_byte m_cmd_packet_data_byte;

 

            SignalRules.Model.cmd_execute result = new cmd_execute();

            List<SignalRules.Model.cmd_execute> result_lest = new List<SignalRules.Model.cmd_execute>();

            //获得取omc_cmd_execute表里一条记录做为命令

            SignalRules.Model.omc_cmd_execute m_omc_cmd_execute = new SignalRules.Model.omc_cmd_execute();

            try

            {

                List<SignalRules.Model.omc_cmd_execute> m_omc_cmd_execute_list = new SignalRules.BLL.omc_cmd_execute().GetModel_List("");

                for (int n = 0; n < m_omc_cmd_execute_list.Count; n++)

                {

                    m_omc_cmd_execute = m_omc_cmd_execute_list[n];

                    if (m_omc_cmd_execute != null)

                    {

                        try

                        {

                            result.id = m_omc_cmd_execute.id;

                            result.device_code = m_omc_cmd_execute.device_code;

                            result.device_ip = m_omc_cmd_execute.device_ip;

                            if (result.device_code.Length == 9)

                            {

                                result.site_code = Convert.ToInt16(result.device_code.Substring(0, 3)); //device_code前3位为主控单元编号

                                result.remote_code = result.device_code.Substring(3, 6);                //device_code后6位为远端单元编号

                            }

                            else

                            {

                                throw new Exception("设备号非9位(主单元号+远端单元号)");

                            }

                            result.action_type = m_omc_cmd_execute.action_type;//命令类型 

                            result.package_length = 0;

                            result.package_num = 0;

                            result.packet_data_byte = new List<cmd_packet_data_byte>();

                            ds = new SignalRules.BLL.omc_cmd_execute_identify().GetList(m_omc_cmd_execute.id);

                            if (ds.Tables[0].Rows.Count > 0)

                            {

                                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)

                                {

                                    #region 构造cmd_packet_data_byte

                                    drow = ds.Tables[0].Rows[i];

                                    if (drow["monitor_id"].ToString() != "")

                                    {

                                        m_cmd_packet_data_byte = new SignalRules.Model.cmd_packet_data_byte();

 

                                        ary_byte = strToToHexByte(drow["monitor_id"].ToString());//获取网络数据标识,转为16进制。高位在前,低位在后

                                        m_cmd_packet_data_byte.monitor_identify1 = ary_byte[1];//低位在前,高位在后

                                        m_cmd_packet_data_byte.monitor_identify2 = ary_byte[0];//低位在前,高位在后

                                        data_value = drow["data_value"].ToString();

                                        data_length = Convert.ToInt16(drow["data_length"]);

 

                                        if (drow["data_type"].ToString() == "03") //数据类型03:字符串

                                        {

                                            #region 数据类型03:字符串

                                            if (drow["data_encode"].ToString() == "06")//06:ASCII

                                            {

                                                ary_byte = Encoding.ASCII.GetBytes(data_value);

                                            }

                                            else if (drow["data_encode"].ToString() == "02")//02:GBK

                                            {

                                                //ary_byte = Encoding.GetEncoding("GBK").GetBytes(data_value);

                                                ary_byte = Encoding.UTF8.GetBytes(data_value);

                                                //ary_byte = Encoding.Default.GetBytes(data_value);

                                                //StringToHexString(drow["data_value"].ToString(), Encoding.Default);//获取数据块

                                            }

                                            else//默认编码

                                            {

                                                ary_byte = Encoding.Default.GetBytes(data_value);

                                            }

                                            #endregion

                                        }

                                        else if (drow["data_type"].ToString() == "01")//数据类型01:Uint型

                                        {

                                            #region 数据类型01:Uint型

                                            if ((drow["data_encode"].ToString() == "03") && data_value.Contains('.'))//03:IP地址格式

                                            {

                                                tmp_ary = data_value.Split('.');

                                                ary_byte = new byte[tmp_ary.Length];

                                                for (int j = 0; j < tmp_ary.Length; j++)

                                                {

                                                    ary_byte[j] = Convert.ToByte(tmp_ary[j]);

                                                }

                                            }

                                            else if ((drow["data_encode"].ToString() == "04"))//04:时间格式2015-08-22 10:38:22

                                            {

                                                data_value = data_value.Replace("-", "").Replace(":", "").Replace(" ", "");

                                                ary_byte = strToToHexByte(data_value);

                                            }

                                            else if ((drow["data_encode"].ToString() == "05"))//整数型显示

                                            {

                                                #region data_encode:05 整数型显示无符号

                                                try

                                                {

                                                    tmp_num_uint = Convert.ToUInt32(data_value);

                                                    if (tmp_num_uint > 4294967295)

                                                    {

                                                        throw new Exception("设置数据值超过4294967295");

                                                    }

                                                }

                                                catch

                                                {

                                                    throw new Exception("设置数据值超过4294967295");

                                                }

 

                                                if (tmp_num_uint >= 0 && tmp_num_uint <= 255)

                                                {

 

                                                    ary_byte = new byte[] { Convert.ToByte(tmp_num_uint) };

                                                }

                                                else if (tmp_num_uint >= 0 && tmp_num_uint <= 65535)

                                                {

                                                    tmp_num_uint = Convert.ToUInt16(tmp_num_uint);

                                                    ary_byte = System.BitConverter.GetBytes(tmp_num_uint);

                                                }

                                                else if (tmp_num_uint >= 0 && tmp_num_uint <= 4294967295)

                                                {

                                                    tmp_num_uint = Convert.ToUInt32(tmp_num_uint);

                                                    ary_byte = System.BitConverter.GetBytes(tmp_num_uint);

                                                }

                                                #endregion

                                            }

                                            else//01:default字符串、数字串

                                            {

                                                try

                                                {

                                                    tmp_num_uint = Convert.ToUInt32(data_value);

                                                    if (tmp_num_uint > 4294967295)

                                                    {

                                                        throw new Exception("设置数据值不能超过4294967295");

                                                    }

 

                                                    ary_byte = strToToHexByte(tmp_num_uint.ToString("X2")); //      strToDecByte

                                                    if (ary_byte.Length == 2)

                                                    {

                                                        ary_byte = new byte[] {ary_byte[1],ary_byte[0]};

                                                        //WebCore.Log.WebLog.WriteTextLog("system", WebCore.Log.WebLogType.SignalCmd, "strToToHexByte", (ary_byte[0]+ary_byte[1]).ToString());

                                                    }

                                                    else if (ary_byte.Length == 4)

                                                    {

                                                        ary_byte = new byte[] { ary_byte[1], ary_byte[0], ary_byte[3], ary_byte[2] };

                                                    }

                                                    //ary_byte = intToHexByte(tmp_num_uint);

                                                }

                                                catch

                                                {

                                                    throw new Exception("设置数据值超过4294967295");

                                                }

                                                

                                            }

                                            #endregion

                                        }

                                        else if (drow["data_type"].ToString() == "02")//数据类型02:Sint型

                                        {

                                            #region data_encode:05 整数型显示无符号

                                            try

                                            {

                                                tmp_num_int = Convert.ToInt32(data_value);

                                                if (tmp_num_int > 2147483647 || tmp_num_int < -2147483648)

                                                {

                                                    throw new Exception("设置数据值超过2147483647");

                                                }

                                            }

                                            catch

                                            {

                                                throw new Exception("设置数据值超过2147483647");

                                            }

                                            if (tmp_num_int >= -128 && tmp_num_int <= 127)  //

                                            {

                                                sbyte tmp = Convert.ToSByte(tmp_num_int);

                                                ary_byte = new byte[] { (byte)tmp };

                                            }

                                            else if (tmp_num_int >= -32768 && tmp_num_int <= 32767)

                                            {

                                                tmp_num_int = Convert.ToInt16(tmp_num_int);

                                                ary_byte = System.BitConverter.GetBytes(tmp_num_int);

                                            }

                                            else if (tmp_num_int >= -2147483648 && tmp_num_int <= 2147483647)

                                            {

                                                tmp_num_int = Convert.ToInt32(tmp_num_int);

                                                ary_byte = System.BitConverter.GetBytes(tmp_num_int);

                                            }

                                            #endregion

                                        }

                                        else if (drow["data_type"].ToString() == "04")//数据类型04:bit型

                                        {

                                            ary_byte = new byte[] { Convert.ToByte(data_value) };

                                        }

                                        else if (drow["data_type"].ToString() == "05")//数据类型05:16进制字符

                                        {

                                            ary_byte = strToToHexByte(data_value);

                                        }

                                        //定义数组的长度

                                        m_cmd_packet_data_byte.monitor_data_value = new byte[data_length];

                                        if (data_length >= ary_byte.Length)

                                        {

                                            for (int j = 0; j < ary_byte.Length; j++)

                                            {

                                                m_cmd_packet_data_byte.monitor_data_value[j] = ary_byte[j];

                                            }

                                        }

                                        else

                                        {

                                            for (int j = 0; j < data_length; j++)

                                            {

                                                m_cmd_packet_data_byte.monitor_data_value[j] = ary_byte[j];

                                            }

                                        }

 

                                        m_cmd_packet_data_byte.data_length = m_cmd_packet_data_byte.monitor_data_value.Length + 3;//设置数据块长度  int类

                                        if (m_cmd_packet_data_byte.data_length <= 255)

                                        {

                                            m_cmd_packet_data_byte.monitor_data_length = Convert.ToByte((m_cmd_packet_data_byte.data_length));

                                        }

                                        else

                                        {

                                            //数据块长度超过255

                                            WebCore.Log.WebLog.WriteTextLog("system", WebCore.Log.WebLogType.SignalCmd, "SocketServer/Deal/get_Send_Data", "数据块长度超过255" + m_cmd_packet_data_byte.monitor_data_value);

                                            continue;

                                        }

 

                                        result.package_num++;//所有数据包数量

                                        result.package_length += m_cmd_packet_data_byte.monitor_data_length;//所有包累加长度。

 

                                        result.packet_data_byte.Add(m_cmd_packet_data_byte);//增加数据块赋值 

                                    }

                                    #endregion

                                }

                            }

                            

                            result_lest.Add(result);

                        }

                        catch (Exception ex)

                        {

                            WebCore.Log.WebLog.WriteTextLog("system", WebCore.Log.WebLogType.SignalCmd, "SocketServer/Deal/get_Send_Data", ex.Message);

                        }

                    }

                }

            }

            catch (Exception ex)

            {

                WebCore.Log.WebLog.WriteTextLog("system", WebCore.Log.WebLogType.SignalCmd, "SocketServer/Deal/get_Send_Data", ex.Message);

            }

            return result_lest;

        }

 

        /// <summary>

        /// 设置命令标识

        /// </summary>

        /// <param name="action_type">操作类型</param>

        /// <returns></returns>

        private static byte get_command_identify(string action_type)

        {

            byte result = new byte();

            #region 设置命令标识

            if (action_type == "01") //告警(设备主动告警(上报))

            {

                result = 0x01;//(设备主动告警(上报))

            }

            else if (action_type == "02") //读(查询)

            {

                result = 0x02;//查询

            }

            else if (action_type == "03")//写(设置)

            {

                result = 0x03;//设置

            }

            else if (action_type == "10")//升级(转换到软件升级模式)

            {

                result = 0x10;//转换到软件升级模式

            }

            else if (action_type == "11")//版本(切换监控软件版本)

            {

                result = 0x11;//切换监控软件版本

            }

            #endregion

            return result;

        }

 

        /// <summary>

        /// 向板发送成功,修改数据库

        /// </summary>

        /// <param name="m_cmd_execute"></param>

        /// <returns></returns>

        public static bool Signal_Send_Deal_Data(cmd_execute m_cmd_execute)

        {

            bool result = false;

            if (m_cmd_execute.action_type == "03")//操作类型 01	设备主动告警(上报);02	查询;03	设置;10	转换到软件升级模式;11	切换监控软件版本

            {

                

                int rows = new SignalRules.BLL.omc_cmd_execute().send_set_request_deal(m_cmd_execute.id);

                if (rows >= 0)

                {

                    result = true;

                    WebCore.Log.WebLog.WriteTextLog("system", WebCore.Log.WebLogType.SignalCmd, "SocketServer/revice_response_package_deal", "已处理条数:" + rows.ToString());

                }

                else

                {

                    result = false;

                }

            }

            else 修改命令单状态为已发送

            {

                new SignalRules.BLL.omc_cmd_execute().UpdateStatus(m_cmd_execute.id, 2);

            }

            

            return result;

        }

 

        #endregion

 

      }

 

 

}

4、数据库入库处理

using System;
using System.Data;
using System.Text;
using MySql.Data.MySqlClient;
using Maticsoft.DBUtility;//Please add references
using System.Collections.Generic;

 
namespace SignalRules.DAL
{

    /// <summary>
    /// 数据访问类:omc_cmd_execute
    /// </summary>

    public partial class omc_cmd_execute
    {
        public omc_cmd_execute()
        { }

        #region  BasicMethod
        /// <summary>
        /// 是否存在该记录
        /// </summary>
        public bool Exists(int id)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("select count(1) from omc_cmd_execute");
            strSql.Append(" where id=@id");
            MySqlParameter[] parameters = {
					new MySqlParameter("@id", MySqlDbType.Int32)
			};

            parameters[0].Value = id;
            return DbHelperMySQL.Exists(strSql.ToString(), parameters);
        }

 

 
        /// <summary>
        /// 增加一条数据
        /// </summary>
        public bool Add(SignalRules.Model.omc_cmd_execute model)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("insert into omc_cmd_execute(");
            strSql.Append("device_code,action_type,cmd_time,status)");
            strSql.Append(" values (");
            strSql.Append("@device_code,@action_type,@cmd_time,@status)");
            MySqlParameter[] parameters = {
					new MySqlParameter("@device_code", MySqlDbType.VarChar,20),
					new MySqlParameter("@action_type", MySqlDbType.VarChar,10),
					new MySqlParameter("@cmd_time", MySqlDbType.DateTime),
					new MySqlParameter("@status", MySqlDbType.Int32,4)};
            parameters[0].Value = model.device_code;
            parameters[1].Value = model.action_type;
            parameters[2].Value = model.cmd_time;
            parameters[3].Value = model.status;

            int rows = DbHelperMySQL.ExecuteSql(strSql.ToString(), parameters);
            if (rows > 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }


        /// <summary>
        /// 更新一条数据
        /// </summary>
        public bool Update(SignalRules.Model.omc_cmd_execute model)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("update omc_cmd_execute set ");
            strSql.Append("device_code=@device_code,");
            strSql.Append("action_type=@action_type,");
            strSql.Append("cmd_time=@cmd_time,");
            strSql.Append("status=@status");
            strSql.Append(" where id=@id");
            MySqlParameter[] parameters = {
					new MySqlParameter("@device_code", MySqlDbType.VarChar,20),
					new MySqlParameter("@action_type", MySqlDbType.VarChar,10),
					new MySqlParameter("@cmd_time", MySqlDbType.DateTime),
					new MySqlParameter("@status", MySqlDbType.Int32,4),
					new MySqlParameter("@id", MySqlDbType.Int32,4)};
            parameters[0].Value = model.device_code;
            parameters[1].Value = model.action_type;
            parameters[2].Value = model.cmd_time;
            parameters[3].Value = model.status;
            parameters[4].Value = model.id;
 
            int rows = DbHelperMySQL.ExecuteSql(strSql.ToString(), parameters);
            if (rows > 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

 

        /// <summary>
        /// 删除一条数据
        /// </summary>
        public bool Delete(int id)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("delete from omc_cmd_execute ");
            strSql.Append(" where id=@id");
            MySqlParameter[] parameters = {
					new MySqlParameter("@id", MySqlDbType.Int32)
			};

            parameters[0].Value = id;

            int rows = DbHelperMySQL.ExecuteSql(strSql.ToString(), parameters);
            if (rows > 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }



        /// <summary>
        /// 批量删除数据
        /// </summary>
        public bool DeleteList(string idlist)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("delete from omc_cmd_execute ");
            strSql.Append(" where id in (" + idlist + ")  ");
            int rows = DbHelperMySQL.ExecuteSql(strSql.ToString());
            if (rows > 0)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

 

 
        /// <summary>
        /// 得到一个对象实体
        /// </summary>
        public SignalRules.Model.omc_cmd_execute GetModel(int id)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("select id,device_code,action_type,cmd_time,status from omc_cmd_execute ");
            strSql.Append(" where id=@id");
            MySqlParameter[] parameters = {
					new MySqlParameter("@id", MySqlDbType.Int32)
			};
            parameters[0].Value = id;
 
            SignalRules.Model.omc_cmd_execute model = new SignalRules.Model.omc_cmd_execute();
            DataSet ds = DbHelperMySQL.Query(strSql.ToString(), parameters);
            if (ds.Tables[0].Rows.Count > 0)
            {
                return DataRowToModel(ds.Tables[0].Rows[0]);
            }
            else
            {
                return null;
            }
        }

 

 

        /// <summary>
        /// 得到一个对象实体
        /// </summary>
        public SignalRules.Model.omc_cmd_execute DataRowToModel(DataRow row)
        {
            SignalRules.Model.omc_cmd_execute model = new SignalRules.Model.omc_cmd_execute();

            if (row != null)
            {
                if (row["id"] != null && row["id"].ToString() != "")
                {
                    model.id = int.Parse(row["id"].ToString());
                }

                if (row["device_code"] != null)
                {
                    model.device_code = row["device_code"].ToString();
                }

                if (row["device_ip"] != null)
                {
                    model.device_ip = row["device_ip"].ToString();
                }

                if (row["action_type"] != null)
                {
                    model.action_type = row["action_type"].ToString();
                }

                if (row["cmd_time"] != null && row["cmd_time"].ToString() != "")
                {
                    model.cmd_time = DateTime.Parse(row["cmd_time"].ToString());
                }

                if (row["status"] != null && row["status"].ToString() != "")
                {
                    model.status = int.Parse(row["status"].ToString());
                }
            }
            return model;
        }

 

        /// <summary>
        /// 获得数据列表
        /// </summary>
        public DataSet GetList(string strWhere)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("select id,device_code,action_type,cmd_time,status ");
            strSql.Append(" FROM omc_cmd_execute ");

            if (strWhere.Trim() != "")
            {
                strSql.Append(" where " + strWhere);
            }
            return DbHelperMySQL.Query(strSql.ToString());
        }

 

        /// <summary>
        /// 获取记录总数
        /// </summary>
        public int GetRecordCount(string strWhere)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("select count(1) FROM omc_cmd_execute ");
            if (strWhere.Trim() != "")
            {
                strSql.Append(" where " + strWhere);
            }

            object obj = DbHelperSQL.GetSingle(strSql.ToString());
            if (obj == null)
            {
                return 0;
            }
            else
            {
                return Convert.ToInt32(obj);
            }
        }


        /// <summary>
        /// 分页获取数据列表
        /// </summary>
        public DataSet GetListByPage(string strWhere, string orderby, int startIndex, int endIndex)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("SELECT * FROM ( ");
            strSql.Append(" SELECT ROW_NUMBER() OVER (");

            if (!string.IsNullOrEmpty(orderby.Trim()))
            {
                strSql.Append("order by T." + orderby);
            }
            else
            {
                strSql.Append("order by T.id desc");
            }

            strSql.Append(")AS Row, T.*  from omc_cmd_execute T ");
            if (!string.IsNullOrEmpty(strWhere.Trim()))
            {
                strSql.Append(" WHERE " + strWhere);
            }

            strSql.Append(" ) TT");
            strSql.AppendFormat(" WHERE TT.Row between {0} and {1}", startIndex, endIndex);
            return DbHelperMySQL.Query(strSql.ToString());
        }

 

        /*
        /// <summary>
        /// 分页获取数据列表
        /// </summary>
        public DataSet GetList(int PageSize,int PageIndex,string strWhere)
        {
            MySqlParameter[] parameters = {
                    new MySqlParameter("@tblName", MySqlDbType.VarChar, 255),
                    new MySqlParameter("@fldName", MySqlDbType.VarChar, 255),
                    new MySqlParameter("@PageSize", MySqlDbType.Int32),
                    new MySqlParameter("@PageIndex", MySqlDbType.Int32),
                    new MySqlParameter("@IsReCount", MySqlDbType.Bit),
                    new MySqlParameter("@OrderType", MySqlDbType.Bit),
                    new MySqlParameter("@strWhere", MySqlDbType.VarChar,1000),
                    };

            parameters[0].Value = "omc_cmd_execute";
            parameters[1].Value = "id";
            parameters[2].Value = PageSize;
            parameters[3].Value = PageIndex;
            parameters[4].Value = 0;
            parameters[5].Value = 0;
            parameters[6].Value = strWhere;	
            return DbHelperMySQL.RunProcedure("UP_GetRecordByPage",parameters,"ds");

        }*/

 

        #endregion  BasicMethod
        #region  ExtensionMethod

        /// <summary>
        /// 得到一个对象实体
        /// </summary>
        public SignalRules.Model.omc_cmd_execute GetModel_Top()
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("set @id=0;select id into @id from omc_cmd_execute where status=0 order by id limit 1;");
            strSql.Append("select id,device_code,device_ip,action_type,status,cmd_time from omc_cmd_execute where id=@id;");
            strSql.Append("update omc_cmd_execute set status=1 where id=@id;");
 

            SignalRules.Model.omc_cmd_execute model = new SignalRules.Model.omc_cmd_execute();
            DataSet ds = DbHelperMySQL.Query(strSql.ToString());

            if (ds.Tables[0].Rows.Count > 0)
            {
                return DataRowToModel(ds.Tables[0].Rows[0]);
            }
            else
            {
                return null;
            }
        }


        /// <summary>
        /// 获得数据列表
        /// </summary>
        public DataSet Get_DealStatus()
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("update omc_cmd_execute set status=9 where status=0;");
            strSql.Append("select id,device_code,device_ip,action_type,status,cmd_time from omc_cmd_execute where status=9;");
            strSql.Append("update omc_cmd_execute set status=1 where status=9;");

            try
            {
                return DbHelperMySQL.Query(strSql.ToString());
            }
            catch (Exception ex)
            {
                WebCore.Log.WebLog.WriteTextLog("system", WebCore.Log.WebLogType.SignalCmd, "doReceive_Work/DealLib/Get_DealStatus", "获取omc_cmd_execute数据时出错:" + ex.Message);
               return null;
            }
        }

 

        /// <summary>
        /// 更新一条数据
        /// </summary>
        public bool UpdateStatus(int id ,int status)
        {
            StringBuilder strSql = new StringBuilder();
            strSql.Append("update omc_cmd_execute set ");
            strSql.Append("status=@status,");
            strSql.Append("cmd_time=@cmd_time");
            strSql.Append(" where id=@id");
            MySqlParameter[] parameters = {
					new MySqlParameter("@status", MySqlDbType.Int32,4),
					new MySqlParameter("@cmd_time", MySqlDbType.DateTime),
					new MySqlParameter("@id", MySqlDbType.Int32,4)};
            parameters[0].Value = status;
            parameters[1].Value = DateTime.Now;
            parameters[2].Value = id;

            int rows = DbHelperMySQL.ExecuteSql(strSql.ToString(), parameters);

            if (rows > 0)

            {

                return true;

            }

            else

            {

                return false;

            }

        }

 

        /// <summary>

        /// 更新一条数据

        /// </summary>

        public bool UpdateStatus(string device_code, string action_type,int status)

        {

            try

            {

                StringBuilder strSql = new StringBuilder();

                strSql.Append("update omc_cmd_execute set ");

                strSql.Append("status=@status,");

                strSql.Append("cmd_time=@cmd_time");

                strSql.Append(" where device_code=@device_code and action_type=@action_type");

                MySqlParameter[] parameters = {

					new MySqlParameter("@status", MySqlDbType.Int32,4),

					new MySqlParameter("@cmd_time", MySqlDbType.DateTime),

					new MySqlParameter("@device_code", MySqlDbType.VarChar,45),

					new MySqlParameter("@action_type", MySqlDbType.VarChar,2)

                                          };

                parameters[0].Value = status;

                parameters[1].Value = DateTime.Now;

                parameters[2].Value = device_code;

                parameters[3].Value = action_type;

 

                int rows = DbHelperMySQL.ExecuteSql(strSql.ToString(), parameters);

                if (rows > 0)

                {

                    return true;

                }

                else

                {

                    return false;

                }

            }

            catch (Exception ex)

            {

                WebCore.Log.WebLog.WriteTextLog("system", WebCore.Log.WebLogType.SignalCmd, "doReceive_Work/DealLib/UpdateStatus", "修改omc_cmd_execute状态时出错:" + ex.Message);

                return false;

            }

        }

 

        public int revice_response_package_set(SignalRules.Model.omc_cmd_execute m_omc_cmd_execute)

        {

            int result_code = 0;

            try

            {

                MySqlParameter[] parameters = {

                    new MySqlParameter("device_code", MySqlDbType.VarChar, 30),

                    new MySqlParameter("action_type", MySqlDbType.VarChar,10),

                    new MySqlParameter("result_code", MySqlDbType.Int16)

                    };

                parameters[0].Value = m_omc_cmd_execute.device_code;

                parameters[1].Value = m_omc_cmd_execute.action_type;

                parameters[2].Direction = ParameterDirection.Output;

                DbHelperMySQL.RunProcedure("p_revice_response_package_set", parameters, "table");

                result_code = Convert.ToInt32(parameters[2].Value);

            }

            catch (Exception ex)

            {

                WebCore.Log.WebLog.WriteTextLog("system", WebCore.Log.WebLogType.SignalCmd, "doReceive_Work/DealLib/revice_response_package_set", "执行p_revice_response_package_set时出错:" + ex.Message);

            }

            return result_code;

        }

 

        public int revice_device_alarm_info(string device_code, string device_ip, string monitor_id, string data_str)

        {

            int result_code = 0;

            try

            {

 

                MySqlParameter[] parameters = {

                    new MySqlParameter("i_device_code", MySqlDbType.VarChar, 30),

                    new MySqlParameter("i_device_ip", MySqlDbType.VarChar,45),

                    new MySqlParameter("i_monitor_id", MySqlDbType.VarChar,10),

                    new MySqlParameter("i_data_value", MySqlDbType.VarChar,1000),

                    new MySqlParameter("result_code", MySqlDbType.Int16)

                    };

                parameters[0].Value = device_code;

                parameters[1].Value = device_ip;

                parameters[2].Value = monitor_id;

                parameters[3].Value = data_str;

                parameters[4].Direction = ParameterDirection.Output;

                DbHelperMySQL.RunProcedure("p_revice_device_alarm_info", parameters, "table1");

                result_code = Convert.ToInt32(parameters[4].Value);

            }

            catch (Exception ex)

            {

                WebCore.Log.WebLog.WriteTextLog("system", WebCore.Log.WebLogType.SignalCmd, "doReceive_Work/DealLib/revice_device_alarm_info", "执行p_revice_device_alarm_info时出错:" + ex.Message);

            }

            return result_code;

        }

 

        /// <summary>

        /// 发送设置请求数据处理

        /// </summary>

        /// <param name="id"></param>

        /// <returns></returns>

        public int send_set_request_deal(int id)

        {

            int result_code = 0;

            try

            {

                MySqlParameter[] parameters = {

                    new MySqlParameter("i_id", MySqlDbType.Int32),

                    new MySqlParameter("result_code", MySqlDbType.Int16)

                    };

                parameters[0].Value = id;

                parameters[1].Direction = ParameterDirection.Output;

                DbHelperMySQL.RunProcedure("p_send_set_request_deal", parameters, "table");

                result_code = Convert.ToInt32(parameters[1].Value);

            }

            catch (Exception ex)

            {

                WebCore.Log.WebLog.WriteTextLog("system", WebCore.Log.WebLogType.SignalCmd, "doReceive_Work/DealLib/send_set_request_deal", "执行p_send_set_request_deal时出错:" + ex.Message);

            }

            return result_code;

        }

 

        /// <summary>

        /// 接收查询命令包响应处理

        /// </summary>

        /// <param name="m_omc_cmd_execute"></param>

        /// <param name="monitor_id"></param>

        /// <param name="data_str"></param>

        /// <returns></returns>

        public int revice_query_response_deal(string device_code, string monitor_id, string data_str)

        {

            int result_code = 0;

            try

            {

 

                MySqlParameter[] parameters = {

                    new MySqlParameter("i_device_code", MySqlDbType.VarChar, 30),

                    new MySqlParameter("i_monitor_id", MySqlDbType.VarChar,10),

                    new MySqlParameter("i_data_value", MySqlDbType.VarChar,1000),

                    new MySqlParameter("result_code", MySqlDbType.Int16)

                    };

                parameters[0].Value = device_code;

                parameters[1].Value = monitor_id;

                parameters[2].Value = data_str;

                parameters[3].Direction = ParameterDirection.Output;

                DbHelperMySQL.RunProcedure("p_revice_query_response_deal", parameters, "table1");

                result_code = Convert.ToInt32(parameters[3].Value);

                WebCore.Log.WebLog.WriteTextLog("system", WebCore.Log.WebLogType.SignalCmd, "doReceive_Work/DealLib/revice_query_response_deal", "device_code="+device_code +"|monitor_id="+ monitor_id+ "|data_str=" + data_str);

            }

            catch (Exception ex)

            {

                WebCore.Log.WebLog.WriteTextLog("system", WebCore.Log.WebLogType.SignalCmd, "doReceive_Work/DealLib/revice_query_response_deal", "执行p_revice_query_response_deal时出错:" + ex.Message);

            }

            return result_code;

        }

        /// <summary>

        /// 

        /// </summary>

        /// <param name="device_code"></param>

        /// <param name="monitor_id"></param>

        /// <returns></returns>

        public int p_revice_query_response_init(string device_code, string monitor_id)

        {

            int result_code = 0;

            try

            {

 

                MySqlParameter[] parameters = {

                    new MySqlParameter("i_device_code", MySqlDbType.VarChar, 30),

                    new MySqlParameter("i_monitor_id", MySqlDbType.VarChar,10),

                    new MySqlParameter("result_code", MySqlDbType.Int16)

                    };

                parameters[0].Value = device_code;

                parameters[1].Value = monitor_id;

                parameters[2].Direction = ParameterDirection.Output;

                DbHelperMySQL.RunProcedure("p_revice_query_response_init", parameters, "table1");

                result_code = Convert.ToInt32(parameters[2].Value);

                //WebCore.Log.WebLog.WriteTextLog("system", WebCore.Log.WebLogType.SignalCmd, "doReceive_Work/DealLib/revice_query_response_init", "monitor_id=" + monitor_id);

            }

            catch (Exception ex)

            {

                WebCore.Log.WebLog.WriteTextLog("system", WebCore.Log.WebLogType.SignalCmd, "doReceive_Work/DealLib/revice_query_response_deal", "执行p_revice_query_response_init时出错:" + ex.Message);

            }

            return result_code;

        }

        /// <summary>

        /// 接收设备上报类型

        /// </summary>

        /// <param name="device_code"></param>

        /// <param name="monitor_id"></param>

        /// <param name="data_str"></param>

        /// <returns></returns>

        public int revice_device_report_type(string device_code, string device_ip, string monitor_id, string data_str)

        {

            int result_code = 0;

            try

            {

 

                MySqlParameter[] parameters = {

                    new MySqlParameter("i_device_code", MySqlDbType.VarChar, 30),

                    new MySqlParameter("i_device_ip", MySqlDbType.VarChar, 30),

                    new MySqlParameter("i_monitor_id", MySqlDbType.VarChar,10),

                    new MySqlParameter("i_data_value", MySqlDbType.VarChar,1000),

                    new MySqlParameter("result_code", MySqlDbType.Int16)

                    };

                parameters[0].Value = device_code;

                parameters[1].Value = device_ip;

                parameters[2].Value = monitor_id;

                parameters[3].Value = data_str;

                parameters[4].Direction = ParameterDirection.Output;

                DbHelperMySQL.RunProcedure("p_revice_device_report_type", parameters, "table1");

                result_code = Convert.ToInt32(parameters[4].Value);

            }

            catch (Exception ex)

            {

                WebCore.Log.WebLog.WriteTextLog("system", WebCore.Log.WebLogType.SignalCmd, "doReceive_Work/DealLib/revice_device_report_type", "执行p_revice_device_report_type时出错:" + ex.Message);

            }

            return result_code;

        }

        #endregion  ExtensionMethod

    }

}

 

https://blog.csdn.net/zzlyx99/article/details/82624084?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-5.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-5.channel_param

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值