• 【原创】国网远程加密机认证软件开发2(认证步骤及代码)


    这两天出了点问题,由于不会操作加密机,顺道学习了下加密机的硬件操作,不过已经实现了讲过网络加密机对新国网正式ESAM进行认证。

    先把图片放出来吧

    整个认证过程我没有对端口进行监听,也就略过了socket这部分内容,也许后续会完善进去,话不多说了,直接贴代码吧。有点乱,容我有时间整里下。

    1.动态库函数调用

     [DllImport("SJJ1009forformalchip.dll")]//连接设备
            public static extern int ConnectDevice(string putIp, string putPortk, string putCTime);
     [DllImport("SJJ1009forformalchip.dll")]//关闭设备
            public static extern int CloseDevice();
     [DllImport("SJJ1009forformalchip.dll")]//身份认证
            public static extern int Meter_Formal_IdentityAuthentication(int Flag, string PutDiv, System.Text.StringBuilder OutRand, System.Text.StringBuilder OutEndata);

    2.串口操作自行补脑,这里就不多解释了

      1 namespace RemoteReceiveComm
      2 {
      3     using System;
      4     using System.Runtime.InteropServices;
      5     using System.Text;
      6 
      7     internal class MyCom
      8     {
      9         private byte bParity;
     10         private int bSize;
     11         private byte bStopBits;
     12         private const uint GENERIC_READ = 0x80000000;
     13         private const uint GENERIC_WRITE = 0x40000000;
     14         private int hComm;
     15         private const int INVALID_HANDLE_VALUE = -1;
     16         private int iPort;
     17         private int iRate;
     18         private int iTimeout;
     19         private const int OPEN_EXISTING = 3;
     20         public bool Opened;
     21 
     22         public MyCom()
     23         {
     24             this.iTimeout = 0xfa0;
     25             this.hComm = -1;
     26             this.Opened = false;
     27             this.iPort = 0;
     28             this.iRate = 0x2580;
     29             this.bSize = 8;
     30             this.bParity = 0;
     31             this.bStopBits = 0;
     32         }
     33 
     34         public MyCom(int com, int rate, int size, byte parity, byte stopbits)
     35         {
     36             this.iTimeout = 0xfa0;
     37             this.hComm = -1;
     38             this.Opened = false;
     39             this.iPort = com;
     40             this.iRate = rate;
     41             this.bSize = size;
     42             this.bParity = parity;
     43             this.bStopBits = stopbits;
     44         }
     45 
     46         [DllImport("kernel32.dll")]
     47         private static extern bool BuildCommDCB(string lpDef, ref DCB lpDCB);
     48         public void Close()
     49         {
     50             if (this.hComm != -1)
     51             {
     52                 CloseHandle(this.hComm);
     53                 this.Opened = false;
     54             }
     55         }
     56 
     57         [DllImport("kernel32.dll")]
     58         private static extern bool CloseHandle(int hObject);
     59         [DllImport("kernel32.dll")]
     60         private static extern int CreateFile(string lpFileName, uint dwDesiredAccess, int dwShareMode, int lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile);
     61         [DllImport("kernel32.dll")]
     62         private static extern bool GetCommState(int hFile, ref DCB lpDCB);
     63         [DllImport("kernel32.dll")]
     64         private static extern bool GetCommTimeouts(int hFile, ref COMMTIMEOUTS lpCommTimeouts);
     65         public void Open()
     66         {
     67             DCB structure = new DCB();
     68             COMMTIMEOUTS lpCommTimeouts = new COMMTIMEOUTS();
     69             this.hComm = CreateFile("COM" + this.iPort, 0xc0000000, 0, 0, 3, 0, 0);
     70             if (this.hComm == -1)
     71             {
     72                 this.Opened = false;
     73                 throw new ApplicationException("打开所选串口失败!!");
     74             }
     75             GetCommTimeouts(this.hComm, ref lpCommTimeouts);
     76             lpCommTimeouts.ReadTotalTimeoutConstant = this.iTimeout;
     77             lpCommTimeouts.ReadTotalTimeoutMultiplier = 0;
     78             lpCommTimeouts.WriteTotalTimeoutMultiplier = 0;
     79             lpCommTimeouts.WriteTotalTimeoutConstant = 0;
     80             SetCommTimeouts(this.hComm, ref lpCommTimeouts);
     81             structure.DCBlength = Marshal.SizeOf(structure);
     82             GetCommState(this.hComm, ref structure);
     83             structure.BaudRate = this.iRate;
     84             structure.Parity = this.bParity;
     85             structure.ByteSize = (byte) this.bSize;
     86             structure.StopBits = this.bStopBits;
     87             SetCommState(this.hComm, ref structure);
     88             this.Opened = true;
     89         }
     90 
     91         public byte[] Read(int NumBytes)
     92         {
     93             byte[] lpBuffer = new byte[NumBytes];
     94             if (this.hComm == -1)
     95             {
     96                 throw new ApplicationException("串口没有打开");
     97             }
     98             OVERLAPPED lpOverlapped = new OVERLAPPED();
     99             int lpNumberOfBytesRead = 0;
    100             ReadFile(this.hComm, lpBuffer, NumBytes, ref lpNumberOfBytesRead, ref lpOverlapped);
    101             byte[] destinationArray = new byte[lpNumberOfBytesRead];
    102             Array.Copy(lpBuffer, destinationArray, lpNumberOfBytesRead);
    103             return destinationArray;
    104         }
    105 
    106         [DllImport("kernel32.dll")]
    107         private static extern bool ReadFile(int hFile, byte[] lpBuffer, int nNumberOfBytesToRead, ref int lpNumberOfBytesRead, ref OVERLAPPED lpOverlapped);
    108         public string ReadS(int NumBytes)
    109         {
    110             byte[] lpBuffer = new byte[NumBytes];
    111             if (this.hComm == -1)
    112             {
    113                 throw new ApplicationException("串口没有打开");
    114             }
    115             OVERLAPPED lpOverlapped = new OVERLAPPED();
    116             int lpNumberOfBytesRead = 0;
    117             ReadFile(this.hComm, lpBuffer, NumBytes, ref lpNumberOfBytesRead, ref lpOverlapped);
    118             byte[] destinationArray = new byte[lpNumberOfBytesRead];
    119             Array.Copy(lpBuffer, destinationArray, lpNumberOfBytesRead);
    120             return Encoding.Default.GetString(destinationArray);
    121         }
    122 
    123         [DllImport("kernel32.dll")]
    124         private static extern bool SetCommState(int hFile, ref DCB lpDCB);
    125         [DllImport("kernel32.dll")]
    126         private static extern bool SetCommTimeouts(int hFile, ref COMMTIMEOUTS lpCommTimeouts);
    127         public int Write(byte[] WriteBytes)
    128         {
    129             int lpNumberOfBytesWritten = 0;
    130             if (this.hComm == -1)
    131             {
    132                 throw new ApplicationException("串口没有打开");
    133             }
    134             OVERLAPPED lpOverlapped = new OVERLAPPED();
    135             WriteFile(this.hComm, WriteBytes, WriteBytes.Length, ref lpNumberOfBytesWritten, ref lpOverlapped);
    136             return lpNumberOfBytesWritten;
    137         }
    138 
    139         public int Write(string s)
    140         {
    141             byte[] bytes = Encoding.Default.GetBytes(s);
    142             int lpNumberOfBytesWritten = 0;
    143             if (this.hComm == -1)
    144             {
    145                 throw new ApplicationException("串口没有打开");
    146             }
    147             OVERLAPPED lpOverlapped = new OVERLAPPED();
    148             WriteFile(this.hComm, bytes, bytes.Length, ref lpNumberOfBytesWritten, ref lpOverlapped);
    149             return lpNumberOfBytesWritten;
    150         }
    151 
    152         [DllImport("kernel32.dll")]
    153         private static extern bool WriteFile(int hFile, byte[] lpBuffer, int nNumberOfBytesToWrite, ref int lpNumberOfBytesWritten, ref OVERLAPPED lpOverlapped);
    154 
    155         public byte BParity
    156         {
    157             get
    158             {
    159                 return this.bParity;
    160             }
    161             set
    162             {
    163                 this.bParity = value;
    164             }
    165         }
    166 
    167         public int BSize
    168         {
    169             get
    170             {
    171                 return this.bSize;
    172             }
    173             set
    174             {
    175                 this.bSize = value;
    176             }
    177         }
    178 
    179         public byte BStopBits
    180         {
    181             get
    182             {
    183                 return this.bStopBits;
    184             }
    185             set
    186             {
    187                 this.bStopBits = value;
    188             }
    189         }
    190 
    191         public int IPort
    192         {
    193             get
    194             {
    195                 return this.iPort;
    196             }
    197             set
    198             {
    199                 this.iPort = value;
    200             }
    201         }
    202 
    203         public int IRate
    204         {
    205             get
    206             {
    207                 return this.iRate;
    208             }
    209             set
    210             {
    211                 this.iRate = value;
    212             }
    213         }
    214 
    215         [StructLayout(LayoutKind.Sequential)]
    216         private struct COMMTIMEOUTS
    217         {
    218             public int ReadIntervalTimeout;
    219             public int ReadTotalTimeoutMultiplier;
    220             public int ReadTotalTimeoutConstant;
    221             public int WriteTotalTimeoutMultiplier;
    222             public int WriteTotalTimeoutConstant;
    223         }
    224 
    225         [StructLayout(LayoutKind.Sequential)]
    226         private struct DCB
    227         {
    228             public int DCBlength;
    229             public int BaudRate;
    230             public int fBinary;
    231             public int fParity;
    232             public int fOutxCtsFlow;
    233             public int fOutxDsrFlow;
    234             public int fDtrControl;
    235             public int fDsrSensitivity;
    236             public int fTXContinueOnXoff;
    237             public int fOutX;
    238             public int fInX;
    239             public int fErrorChar;
    240             public int fNull;
    241             public int fRtsControl;
    242             public int fAbortOnError;
    243             public int fDummy2;
    244             public ushort wReserved;
    245             public ushort XonLim;
    246             public ushort XoffLim;
    247             public byte ByteSize;
    248             public byte Parity;
    249             public byte StopBits;
    250             public char XonChar;
    251             public char XoffChar;
    252             public char ErrorChar;
    253             public char EofChar;
    254             public char EvtChar;
    255             public ushort wReserved1;
    256         }
    257 
    258         [StructLayout(LayoutKind.Sequential)]
    259         private struct OVERLAPPED
    260         {
    261             public int Internal;
    262             public int InternalHigh;
    263             public int Offset;
    264             public int OffsetHigh;
    265             public int hEvent;
    266         }
    267     }
    268 }
    View Code

    3.组帧函数

      1 namespace RemoteReceiveComm.BaseClass
      2 {
      3     using System;
      4     using System.Windows.Forms;
      5 
      6     public class SetFrames
      7     {
      8         private string dataLength = "04";
      9 
     10         private string AddThirtyThree(string str)
     11         {
     12             str = this.SetTransFrame(str);
     13             string[] strArray = str.Split(new char[] { ' ' });
     14             str = "";
     15             for (int i = strArray.Length - 1; i >= 0; i--)
     16             {
     17                 int num2 = Convert.ToByte(strArray[i], 0x10) + 0x33;
     18                 if (num2 > 0xff)
     19                 {
     20                     num2 = Convert.ToByte((int) (num2 - 0x100));
     21                 }
     22                 str = str + Convert.ToByte(num2).ToString("x2");
     23             }
     24             return str;
     25         }
     26 
     27         public string FramesConfig(string strDataCode, int selectedIndex, string dataLen, string meterNum,string ctrl)
     28         {
     29             byte[] buffer = null;
     30             byte num = 0;
     31             int num2 = 0;
     32             string str2 = "";
     33             string str3 = meterNum.Substring(10, 2) + meterNum.Substring(8, 2) + meterNum.Substring(6, 2) + meterNum.Substring(4, 2) + meterNum.Substring(2, 2) + meterNum.Substring(0, 2);
     34             this.dataLength = dataLen.Trim();
     35             if (this.dataLength.Length == 1)
     36             {
     37                 this.dataLength = "0" + this.dataLength;
     38             }
     39             else if (this.dataLength.Length > 2)
     40             {
     41                 MessageBox.Show("应输入两位十六进制数!", "银河龙芯提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
     42                 return "";
     43             }
     44             string str4 = "";
     45             string[] strArray = strDataCode.Split(new char[] { '|' });
     46             if (selectedIndex == 4)
     47             {
     48                 if (strArray.Length == 4)
     49                 {
     50                     str4 = (this.AddThirtyThree(strArray[0]) + this.AddThirtyThree(strArray[1])) + this.AddThirtyThree(strArray[2]) + this.AddThirtyThree(strArray[3]);
     51                 }
     52             }
     53             else if (((selectedIndex == 3) || (selectedIndex == 8)) || (selectedIndex == 11))
     54             {
     55                 if (strArray.Length == 3)
     56                 {
     57                     str4 = this.AddThirtyThree(strArray[0]) + this.AddThirtyThree(strArray[1]) + this.AddThirtyThree(strArray[2]);
     58                 }
     59             }
     60             else if ((selectedIndex == 9) || (selectedIndex == 10))
     61             {
     62                 if (strArray.Length == 2)
     63                 {
     64                     str4 = this.AddThirtyThree(strArray[0]) + this.AddThirtyThree(strArray[1]);
     65                 }
     66             }
     67             else if (selectedIndex == 0)
     68             {
     69                 str3 = "111111111111";
     70                 meterNum = "111111111111";
     71                 this.dataLength = "06";
     72                 str4 = this.AddThirtyThree(strDataCode);
     73             }
     74             else
     75             {
     76                 str4 = this.AddThirtyThree(strDataCode);
     77             }
     78             string str5 = "68" + str3 + "68" + ctrl + this.dataLength + str4;
     79             num2 = str5.Length / 2;
     80             buffer = new byte[num2];
     81             for (int i = 0; i < (str5.Length / 2); i++)
     82             {
     83                 buffer[i] = Convert.ToByte(str5.Substring(i * 2, 2), 0x10);
     84                 num = (byte) (num + buffer[i]);
     85             }
     86             str2 = num.ToString("x2");
     87             return (str5 + str2 + "16");
     88         }
     89 
     90         public static string GetCS(string strData)
     91         {
     92             byte[] buffer = null;
     93             byte num = 0;
     94             buffer = new byte[strData.Length / 2];
     95             for (int i = 0; i < (strData.Length / 2); i++)
     96             {
     97                 buffer[i] = Convert.ToByte(strData.Substring(i * 2, 2), 0x10);
     98                 num = (byte) (num + buffer[i]);
     99             }
    100             return num.ToString("x2");
    101         }
    102 
    103         private string SetTransFrame(string str)
    104         {
    105             int length = str.Length;
    106             for (int i = 1; i < (length / 2); i++)
    107             {
    108                 str = str.Insert(((2 * i) + i) - 1, " ");
    109             }
    110             return str;
    111         }
    112 
    113         public string TelecontFramesConfig(string strDataCode, string dataLen, string meterNum, string controlNum)
    114         {
    115             byte[] buffer = null;
    116             int num3;
    117             byte num = 0;
    118             int num2 = 0;
    119             string str2 = "";
    120             string str3 = meterNum.Substring(10, 2) + meterNum.Substring(8, 2) + meterNum.Substring(6, 2) + meterNum.Substring(4, 2) + meterNum.Substring(2, 2) + meterNum.Substring(0, 2);
    121             this.dataLength = dataLen.Trim();
    122             if (this.dataLength.Length == 1)
    123             {
    124                 this.dataLength = "0" + this.dataLength;
    125             }
    126             else if (this.dataLength.Length > 2)
    127             {
    128                 MessageBox.Show("应输入两位十六进制数!", "银河龙芯提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
    129                 return "";
    130             }
    131             string str4 = "";
    132             string[] strArray = strDataCode.Split(new char[] { '|' });
    133             for (num3 = 0; num3 < strArray.Length; num3++)
    134             {
    135                 str4 = str4 + this.AddThirtyThree(strArray[num3]);
    136             }
    137             string str5 = "68" + str3 + "68" + controlNum + this.dataLength + str4;
    138             num2 = str5.Length / 2;
    139             buffer = new byte[num2];
    140             for (num3 = 0; num3 < (str5.Length / 2); num3++)
    141             {
    142                 buffer[num3] = Convert.ToByte(str5.Substring(num3 * 2, 2), 0x10);
    143                 num = (byte) (num + buffer[num3]);
    144             }
    145             str2 = num.ToString("x2");
    146             return (str5 + str2 + "16");
    147         }
    148     }
    149 }
    View Code

    4.连接加密机

     1  private void button4_Click(object sender, EventArgs e)
     2         {
     3             int i=ConnectDevice(textBox1.Text.Trim(), textBox2.Text.Trim(), "5000");
     4             if ( i!= 0)
     5             {
     6                 MessageBox.Show("打开设备失败,请重试!" + ConnectDevice(textBox1.Text.Trim(), textBox2.Text.Trim(), "5000"), "提示", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
     7             }
     8             else
     9             {
    10                 button2.Enabled = false;
    11                 txtState.Text += "打开设备成功";
    12             }
    13         }

    5.认证

     1 private void button3_Click(object sender, EventArgs e)
     2         {
     3             if (txt_Addr.Text.ToString() == "")
     4             {
     5                 MessageBox.Show("通讯地址不能为空", "提示");
     6                 txt_Addr.Focus();
     7             }
     8             else if (txt_Addr.Text.Length < 12)
     9             {
    10                 MessageBox.Show("输入地址小于12位!", "提示");
    11                 txt_Addr.Focus();
    12             }
    13             else if (txtMeter.Text.ToString() == "")
    14             {
    15                 MessageBox.Show("表号不能为空", "提示");
    16                 txtMeter.Focus();
    17             }
    18             else if (txtMeter.Text.Length < 12)
    19             {
    20                 MessageBox.Show("输入的表号小于12位!", "提示");
    21                 txtMeter.Focus();
    22             }
    23             else
    24             {
    25                 string seed = "0000" + txtMeter.Text.Trim();
    26                 string Address = txt_Addr.Text.Trim();
    27                 string dataLen = "20";
    28                 string str3 = "";
    29                 if (txtEffectTime.Text == "")
    30                 {
    31                     MessageBox.Show("请输入有效时长", "提示");
    32                     txtEffectTime.Focus();
    33                 }
    34                 else if (txtOperator.Text == "")
    35                 {
    36                     MessageBox.Show("请输入操作者代码", "提示");
    37                     txtOperator.Focus();
    38                 }
    39                 else if (txtOperator.Text.Length < 8)
    40                 {
    41                     MessageBox.Show("操作者代码小于8位", "提示");
    42                     txtOperator.Focus();
    43                 }
    44                 else
    45                 {
    46                     try
    47                     {
    48                         System.Text.StringBuilder OutRand = new System.Text.StringBuilder(2048);
    49                         System.Text.StringBuilder OutEndata = new System.Text.StringBuilder(2048);
    50                         int i = 9999;
    51                         i=Meter_Formal_IdentityAuthentication(0, seed, OutRand, OutEndata);
    52                         if (i == 0)
    53                         {
    54                             txtReceFrame.AppendText("获取加密机认证数据成功! " + Environment.NewLine + "随机数:" + OutRand + Environment.NewLine + "密文:" + OutEndata + Environment.NewLine);
    55                             //string data_area = reverse("070000FF")+ reverse (txtOperator.Text.Trim())  +reverse(OutRand.ToString()) +reverse(OutEndata.ToString()) +reverse(seed);
    56                             string data_area = seed + OutRand.ToString() + OutEndata.ToString() + txtOperator.Text.Trim() + "070000FF";
    57                             SetFrames frame = new SetFrames();
    58                             int length = data_area.Length/2;
    59                             string str5 =frame.FramesConfig(data_area, 1, length.ToString("X2"), txt_Addr.Text,"03");
    60                             SendData(str5);
    61                             ReceiveData();
    62                         }
    63 
    64                     }
    65                     catch (Exception exception)
    66                     {
    67                        MessageBox.Show(exception.Message,"提示");
    68                     }
    69                 }
    70             }
    71         }
    View Code

    6.其中用到的发送及接收函数

    (1)发送数据函数

     1  private void SendData(string str)
     2         {
     3             if (!mycom1.Opened)
     4             {
     5                 mycom1.Open();
     6             }
     7 
     8             int num = 0;
     9             try
    10             {
    11                 if (!str.Contains("68aaaaaaaaaaaa68110452243337"))
    12                 {
    13                     SetText(txtReceFrame, "发送:" + SetTransFrame(str.ToUpper()) + "
    ");
    14                 }
    15                 byte[] writeBytes = mysendb(delspace(str.ToUpper()));
    16                 num = mycom1.Write(writeBytes);
    17             }
    18             catch (Exception exception)
    19             {
    20                 SetText(txtReceFrame, exception.Message + "
    ");
    21                 MessageBox.Show("发送失败,请重试!", "提示!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
    22                 return;
    23             }
    24             DateTime time = DateTime.Now;
    25         }
    View Code

    (2)接收函数(PS:其中与认证无关的请自行略过吧,以后后续还有加抄读和远控功能,都在里边了,也懒得整理了)

     private void ReceiveData()
            {
                try
                {
                    byte[] reb = mycom1.Read(0x400);
                    string str = dis_package(reb);
                    if (!str.Contains("68 91 0F "))
                    {
                        SetText(txtReceFrame, "接收:" + str + "  " + DateTime.Now.ToString() + "
    ");
                    }
                    string[] strArray = new string[reb.Length];
                    string strings = "";
                    int index = 0;
                    int num4 = 0;
                    string character = "";
                    bool flag = false;
                    foreach (byte num5 in reb)
                    {
                        strings = strings + num5.ToString("X2");
                        strArray[index] = num5.ToString("X2");
                        index++;
                    }
                    if (strings.Substring(0, 0x10).Contains("FEFEFEFE"))
                    {
                        num4 = 4;
                        character = "FEFEFEFE";
                    }
                    else if (strings.Substring(0, 0x10).Contains("FEFEFE"))
                    {
                        num4 = 3;
                        character = "FEFEFE";
                    }
                    else if (strings.Substring(0, 0x10).Contains("FEFE"))
                    {
                        num4 = 2;
                        character = "FEFE";
                    }
                    else if (strings.Substring(0, 0x10).Contains("FE"))
                    {
                        num4 = 1;
                        character = "FE";
                    }
                    else
                    {
                        num4 = 0;
                        character = "68" + txt_Addr.Text.Substring(10, 2) + txt_Addr.Text.Substring(8, 2) + txt_Addr.Text.Substring(6, 2) + txt_Addr.Text.Substring(4, 2);
                    }
                    int[] numArray = SearchString.RegexTest(character, strings);
                    for (int i = 0; i < numArray.Length; i++)
                    {
                        string str6;
                        int num8;
                        string str8;
                        string str4 = strArray[numArray[i] + num4];
                        string str5 = strArray[(numArray[i] + 8) + num4];
                        int num7 = 0;
                        if (((str4 == "68") && ((strArray.Length - numArray[i]) > 13)) && ((str5 == "83") || (str5 == "91")))
                        {
                            num7 = Convert.ToInt32(strArray[(numArray[i] + 9) + num4], 0x10) - 4;
                            if (num7 < 0)
                            {
                                num7 = 0;
                            }
                            byte[] buffer2 = new byte[num7];
                            str6 = "";
                            num8 = num7 - 1;
                            while (num8 > -1)
                            {
                                if ((reb[((numArray[i] + 14) + num8) + num4] - 0x33) >= 0)
                                {
                                    buffer2[num8] = Convert.ToByte((int)(reb[((numArray[i] + 14) + num8) + num4] - 0x33));
                                }
                                else
                                {
                                    buffer2[num8] = Convert.ToByte((int)((reb[((numArray[i] + 14) + num8) + num4] - 0x33) + 0x100));
                                }
                                str6 = str6 + buffer2[num8].ToString("x2");
                                num8--;
                            }
                            string str7 = "";
                            for (int j = (numArray[i] + 5) + num4; j > (numArray[i] + num4); j--)
                            {
                                str7 = str7 + strArray[j];
                            }
                            receive = str6;
                            SetDataText("数据:" + str6 + "
    ");
                            string randdata2 = str6.Substring(16,8);
                            string ESAMNO = str6.Substring(0,16);
                            txtReceFrame.AppendText("随机数2:"+randdata2+"  "+"ESAM序列号:"+ESAMNO+"
    ");
                            txtReceFrame.AppendText("认证成功!
    ");
                            if (str5 != "91")
                            {
                                SetText(txtReceFrame, "操作成功!
    ");
                            }
                            if (receive == "")
                            {
                                receive = "83";
                            }
                            flag = true;
                        }
                        if ((str4 == "68") && (str5 == "C3"))
                        {
                            MessageBox.Show("安全认证失败,请重试!", "提示!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                            str6 = "";
                            num7 = Convert.ToInt32(strArray[(numArray[i] + 9) + num4], 0x10);
                            string[] strArray2 = new string[num7];
                            if (num7 != 2)
                            {
                                MessageBox.Show("返回的不是两个字节的状态字,请重试!" + num7, "提示!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                                return;
                            }
                            for (num8 = 0; num8 < num7; num8++)
                            {
                                if ((reb[(numArray[i] + 10) + num4] - 0x33) >= 0)
                                {
                                    strArray2[num8] = TenToTwo(Convert.ToByte((int)(reb[((numArray[i] + 10) + num8) + num4] - 0x33)));
                                }
                                else
                                {
                                    strArray2[num8] = TenToTwo(Convert.ToByte((int)((reb[((numArray[i] + 10) + num8) + num4] - 0x33) + 0x100)));
                                }
                                str6 = str6 + strArray2[num8] + " ";
                            }
                            SetDataText("数据:" + str6 + ErrState(str6) + "
    ");
                            if (receive == "")
                            {
                                receive = "C3";
                            }
                        }
                        if ((str4 == "68") && (str5 == "94"))
                        {
                            MessageBox.Show("写入成功!", "提示!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                        }
                        if ((str4 == "68") && (str5 == "D4"))
                        {
                            MessageBox.Show("写入失败!", "提示!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                            str6 = "";
                            if ((reb[(numArray[i] + 10) + num4] - 0x33) >= 0)
                            {
                                str6 = TenToTwo(Convert.ToByte((int)(reb[(numArray[i] + 10) + num4] - 0x33)));
                            }
                            else
                            {
                                str6 = TenToTwo(Convert.ToByte((int)((reb[(numArray[i] + 10) + num4] - 0x33) + 0x100)));
                            }
                            num7 = Convert.ToInt32(strArray[(numArray[i] + 9) + num4], 0x10);
                            if (num7 != 1)
                            {
                                MessageBox.Show("返回的不是一个字节的状态字,请重试!" + num7, "提示!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                                return;
                            }
                            SetDataText("数据:" + str6 + ErrOneState(str6) + "
    ");
                        }
                        if ((str4 == "68") && (str5 == "9C"))
                        {
                            MessageBox.Show(" 跳合闸、报警、保电成功!", "提示!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                        }
                        if ((str4 == "68") && (str5 == "DC"))
                        {
                            MessageBox.Show(" 跳合闸、报警、保电失败!", "提示!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                            num7 = Convert.ToInt32(strArray[(numArray[i] + 9) + num4], 0x10);
                            if (num7 != 1)
                            {
                                MessageBox.Show("返回的不是一个字节的状态字,请重试!" + num7, "提示!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                                return;
                            }
                            str6 = "";
                            if ((reb[(numArray[i] + 10) + num4] - 0x33) >= 0)
                            {
                                str6 = TenToTwo(Convert.ToByte((int)(reb[(numArray[i] + 10) + num4] - 0x33)));
                            }
                            else
                            {
                                str6 = TenToTwo(Convert.ToByte((int)((reb[(numArray[i] + 10) + num4] - 0x33) + 0x100)));
                            }
                            SetDataText("数据:" + str6 + ErrOneState(str6) + "
    ");
                        }
                        if ((str4 == "68") && ((str5 == "9A") || (str5 == "9B")))
                        {
                            str8 = "清零成功";
                            if (str5 == "9B")
                            {
                                str8 = "事件" + str8;
                            }
                            MessageBox.Show(str8, "提示!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                        }
                        if ((str4 == "68") && ((str5 == "DA") || (str5 == "DB")))
                        {
                            str8 = "清零失败";
                            if (str5 == "9B")
                            {
                                str8 = "事件" + str8;
                            }
                            MessageBox.Show(str8, "提示!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                            num7 = Convert.ToInt32(strArray[(numArray[i] + 9) + num4], 0x10);
                            if (num7 != 1)
                            {
                                MessageBox.Show("返回的不是一个字节的状态字,请重试!" + num7, "提示!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                                return;
                            }
                            str6 = "";
                            if ((reb[(numArray[i] + 10) + num4] - 0x33) >= 0)
                            {
                                str6 = TenToTwo(Convert.ToByte((int)(reb[(numArray[i] + 10) + num4] - 0x33)));
                            }
                            else
                            {
                                str6 = TenToTwo(Convert.ToByte((int)((reb[(numArray[i] + 10) + num4] - 0x33) + 0x100)));
                            }
                            SetDataText("数据:" + str6 + ErrOneState(str6) + "
    ");
                        }
                    }
                    if (!(flag || (reb.Length >= 1)))
                    {
                        MessageBox.Show("无返回数据,请检查户号、表号!", "提示!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                    }
                }
                catch (Exception)
                {
                    MessageBox.Show("读抄失败无返回数据,请重试!", "提示!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                }
                if (mycom1.Opened)
                {
                    mycom1.Close();
                }
            }
    View Code

    ————————————————————————————————————

    后边就没什么重要的函数了,这次认证的工作终于在节前结束了,可以安心过端午了,哈哈

    ————————————————————————————————————

    回来会继续做抄读和远控的功能,我也把部分代码分享出来,需要的可以参考下。不足之处还请大家指正!

  • 相关阅读:
    C/C++ string.h头文件小结
    linux根据进程pid查看进程详细信息
    《mysql必知必会》读书笔记
    安装vim with python
    vim正则表达式小结
    C语言指针篇(二)多级指针
    C语言指针篇(一)指针与指针变量
    递归函数
    lan口和wan口的配置
    C语言基础篇(三) 指针
  • 原文地址:https://www.cnblogs.com/dranched/p/3761207.html
Copyright © 2020-2023  润新知