日期:2014-06-10  浏览次数:20875 次

这两天出了点问题,由于不会操作加密机,顺道学习了下加密机的硬件操作,不过已经实现了讲过网络加密机对新国网正式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()) + "\r\n");
14                 }
15                 byte[] writeBytes = mysendb(delspace(str.ToUpper()));
16                 num = mycom1.Write(writeBytes);
17             }
18             catch (Exception exception)
19             {
20                 SetText(txtReceFrame, exception.Message + "\r\n");
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() + "\r\n");
                }
                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 + "\r\n");
                        string randdata2 = str6.Substring(16,8);
                        string ESAMNO = str6.Substring(0,16);
                        txtReceFrame.AppendText("随机数2:"+randdata2+"  "+"ESAM序列号:"+ESAMNO+"\r\n");
                        txtReceFrame.AppendText("认证成功!\r\n");
                        if (str5 != "91")
                        {
                            SetText(txtReceFrame, "操作成功!\r\n");
                        }
                        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) + "\r\n");
                        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) + "\r\n");
                    }
                    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) + "\r\n");
                    }
                    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) + "\r\n");
                    }
                }
                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

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

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

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

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