public IDataContainer Read(BinaryReader reader) { int count = reader.ReadInt32(); bool isOrdered = reader.ReadBoolean(); var data = Locator.CreateDataContainer(); var set = (IOrderedSet <IData, IData>)data; if (!isOrdered) { for (int i = 0; i < count; i++) { IData key = keyPersist.Read(reader); IData record = recordPersist.Read(reader); set.Add(key, record); } } else { KeyValuePair <IData, IData>[] orderedArray = new KeyValuePair <IData, IData> [count]; for (int i = 0; i < orderedArray.Length; i++) { IData key = keyPersist.Read(reader); IData record = recordPersist.Read(reader); orderedArray[i] = new KeyValuePair <IData, IData>(key, record); } set.AddOrdered(orderedArray, 0, orderedArray.Length); } return(data); }
/// <summary> /// 接收客户端发送的消息 /// </summary> /// <param name="newSocket"></param> void Receive(Socket newSocket) { while (newSocket.Connected) { try { byte[] temp_requetData1 = new byte[12]; //读取客户端发送过来的数据 temp_requetData1 = SocketRead(newSocket, temp_requetData1.Length); byte[] requetData = null; //0x03写字 - 0x00 读位 0x01 读字 0x02写位 0x03写字 if (temp_requetData1[0] == 0x03) { var lenght = temp_requetData1[11] * 2 * 256 + temp_requetData1[10] * 2; byte[] temp_requetData2 = new byte[lenght]; temp_requetData2 = SocketRead(newSocket, temp_requetData2.Length); requetData = temp_requetData1.Concat(temp_requetData2).ToArray(); } //0x02写位 else if (temp_requetData1[0] == 0x02) { var lenght = temp_requetData1[11] * 256 + temp_requetData1[10]; byte[] temp_requetData2 = new byte[lenght]; temp_requetData2 = SocketRead(newSocket, temp_requetData2.Length); requetData = temp_requetData1.Concat(temp_requetData2).ToArray(); } else { requetData = temp_requetData1; } //地址 var address = $"{requetData[8]}{requetData[9]}-{ requetData[5] * 256 + requetData[4]}"; var dataKey = $"{requetData[8]}{requetData[9]}"; var beginAddress = requetData[5] * 256 + requetData[4]; var byteArray = JsonConvert.DeserializeObject <byte[]>(dataPersist.Read(dataKey)) ?? new byte[65536]; switch (requetData[0]) { //读位 0x01 位 0x00 字节 case 0x00: { //数据存储长度 var lenght = requetData[10] + requetData[11] * 256; var value = dataPersist.Read(address); //把存储的数据转为字节数组 var bytes = JsonConvert.DeserializeObject <byte[]>(value); if (string.IsNullOrWhiteSpace(value)) { bytes = BitConverter.GetBytes(0); } //数据的字节长度 var dataLenght = (int)Math.Ceiling(lenght * 0.5); // 响应报文总长度 byte[] responseData = new byte[2 + dataLenght]; DataConvert.StringToByteArray("80 00").CopyTo(responseData, 0); if (lenght == 1) { var oldBitValue = byteArray[beginAddress / 2]; //一个字节存储两个点位数据 var bitOffset = beginAddress % 2; if (bitOffset == 0) { responseData[2] = (oldBitValue & 0b00010000) != 0 ? (byte)0b00010000 : (byte)0b00000000; } else { responseData[2] = (oldBitValue & 0b00000001) != 0 ? (byte)0b00010000 : (byte)0b00000000; } } else { Buffer.BlockCopy(byteArray, beginAddress / 2, responseData, 2, dataLenght); } newSocket.Send(responseData); } break; //读字 case 0x01: { var addressLenght = 2; //数据存储长度 var lenght = requetData[10] + requetData[11] * 256; var value = dataPersist.Read(address); //数据的字节长度 var dataLenght = lenght * 2; // 响应报文总长度 byte[] responseData = new byte[2 + dataLenght]; DataConvert.StringToByteArray("81 00").CopyTo(responseData, 0); Buffer.BlockCopy(byteArray, beginAddress * addressLenght, responseData, 2, dataLenght); newSocket.Send(responseData); } break; //写位 0x02写位 0x03写字 case 0x02: { ////[12]后面存的是数据 var valueByte = new byte[requetData.Length - 12]; Buffer.BlockCopy(requetData, 12, valueByte, 0, valueByte.Length); ////一个字节存储两个点位数据 //valueByte.CopyTo(byteArray, beginAddress / 2); var oldBitValue = byteArray[beginAddress / 2]; var bitOffset = beginAddress % 2; //一个字节存储两个点位数据 if (valueByte[0] == 0x10) //true { if (bitOffset == 0) { oldBitValue = (byte)(oldBitValue | 0b00010000); } else { oldBitValue = (byte)(oldBitValue | 0b00000001); } } else //false { if (bitOffset == 0) { oldBitValue = (byte)(oldBitValue & ~0b11111110); //修改成0b00000001或0b00000000 } else { oldBitValue = (byte)(oldBitValue & ~0b11101111); //修改成0b00010000或0b00000000 } } new byte[] { oldBitValue }.CopyTo(byteArray, beginAddress / 2); //存储字节数据到内存 dataPersist.Write(dataKey, JsonConvert.SerializeObject(byteArray)); byte[] responseData1 = DataConvert.StringToByteArray("82 00"); newSocket.Send(responseData1); } break; //写字 case 0x03: { var addressLenght = 2; //[12]后面存的是数据 var valueByte = new byte[requetData.Length - 12]; Buffer.BlockCopy(requetData, 12, valueByte, 0, valueByte.Length); valueByte.CopyTo(byteArray, beginAddress * addressLenght); //存储字节数据到内存 dataPersist.Write(dataKey, JsonConvert.SerializeObject(byteArray)); byte[] responseData1 = DataConvert.StringToByteArray("83 00"); newSocket.Send(responseData1); } break; } } catch (Exception ex) { //if (newSocket?.Connected ?? false) newSocket?.Shutdown(SocketShutdown.Both); //newSocket?.Close(); //throw ex; } } }
/// <summary> /// 接收数据回调用 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void DataReceived(object sender, SerialDataReceivedEventArgs e) { try { byte[] requetData = new byte[serialPort.BytesToRead]; serialPort.Read(requetData, 0, requetData.Length); var address = requetData[2] * 256 + requetData[3]; var stationNumberKey = $"{requetData[0]}-key";//站号 switch (requetData[1]) { //读取线圈 case 1: { var value = dataPersist.Read(stationNumberKey + "-Coil"); var byteArray = JsonConvert.DeserializeObject <byte[]>(value) ?? new byte[65536]; var registerLenght = requetData[4] * 256 + requetData[5]; var blenght = (byte)Math.Ceiling(registerLenght / 8f); var tempData = new byte[registerLenght]; Buffer.BlockCopy(byteArray, address, tempData, 0, tempData.Length); var rData = new byte[3 + registerLenght]; rData[0] = 1; rData[1] = 1; rData[2] = (byte)registerLenght; for (int i = 0; i < blenght; i++) { rData[3 + i] = (byte)DataConvert.BinaryArrayToInt(string.Join("", tempData.Skip(i * 8).Take(8).Reverse())); } var responseData = CRC16.GetCRC16(rData); serialPort.Write(responseData, 0, responseData.Length); } break; //写入线圈 case 5: { var value = new byte[2]; Buffer.BlockCopy(requetData, requetData.Length - 4, value, 0, value.Length); var byteArray = JsonConvert.DeserializeObject <byte[]>(dataPersist.Read(stationNumberKey + "-Coil")) ?? new byte[65536]; if (value[0] == 0 && value[1] == 0) { byteArray[address] = 0; } else { byteArray[address] = 1; } dataPersist.Write(stationNumberKey + "-Coil", JsonConvert.SerializeObject(byteArray)); serialPort.Write(requetData, 0, requetData.Length); } break; //读取 case 3: { var value = dataPersist.Read(stationNumberKey); var byteArray = JsonConvert.DeserializeObject <byte[]>(value) ?? new byte[65536]; var dlength = requetData[4] * 256 + requetData[5]; var dataHead = new byte[] { 1, 3, (byte)(dlength * 2) }; var dataContent = new byte[dlength * 2]; Buffer.BlockCopy(byteArray, address * 2, dataContent, 0, dataContent.Length); var tempData = dataHead.Concat(dataContent).ToArray(); var responseData = CRC16.GetCRC16(tempData); serialPort.Write(responseData, 0, responseData.Length); } break; //写入 case 16: { var value = new byte[requetData[6]]; Buffer.BlockCopy(requetData, 7, value, 0, value.Length); var byteArray = JsonConvert.DeserializeObject <byte[]>(dataPersist.Read(stationNumberKey)) ?? new byte[65536]; value.CopyTo(byteArray, address * 2); dataPersist.Write(stationNumberKey, JsonConvert.SerializeObject(byteArray)); var tempData = new byte[6]; Buffer.BlockCopy(requetData, 0, tempData, 0, tempData.Length); var responseData = CRC16.GetCRC16(tempData); serialPort.Write(responseData, 0, responseData.Length); } break; } } catch (Exception ex) { } }
/// <summary> /// 接收客户端发送的消息 /// </summary> /// <param name="newSocket"></param> void Receive(Socket newSocket) { while (newSocket.Connected) { try { byte[] requetData1 = new byte[8]; //读取客户端发送过来的数据 int readLeng = newSocket.Receive(requetData1, 0, requetData1.Length, SocketFlags.None); if (readLeng == 0)//客户端断开连接 { newSocket.Shutdown(SocketShutdown.Both); newSocket.Close(); return; } byte[] requetData2 = new byte[requetData1[5] - 2]; readLeng = newSocket.Receive(requetData2, 0, requetData2.Length, SocketFlags.None); if (readLeng == 0)//客户端断开连接 { newSocket.Shutdown(SocketShutdown.Both); newSocket.Close(); return; } var requetData = requetData1.Concat(requetData2).ToArray(); byte[] responseData1 = new byte[8]; //复制请求报文中的报文头 Buffer.BlockCopy(requetData, 0, responseData1, 0, responseData1.Length); DataPersist data = new DataPersist(redisConfig); switch (requetData[7]) { //读取线圈 case 1: //TODO break; //写入线圈 case 5: //TODO break; //读取 case 3: { var value = data.Read(requetData[9]);//TODO 数据存在 8、9 short.TryParse(value, out short resultValue); var bytes = BitConverter.GetBytes(resultValue); //当前位置到最后的长度 responseData1[5] = (byte)(3 + bytes.Length); //TODO byte[] responseData2 = new byte[3] { (byte)bytes.Length, bytes[1], bytes[0] }; var responseData = responseData1.Concat(responseData2).ToArray(); newSocket.Send(responseData); } break; //写入 case 16: { //TODO var value = requetData[requetData.Length - 2] * 256 + requetData[requetData.Length - 1]; data.Write(requetData[9], value.ToString()); var responseData = new byte[12]; Buffer.BlockCopy(requetData, 0, responseData, 0, responseData.Length); responseData[5] = 6; newSocket.Send(responseData); } break; } } catch (SocketException ex) { //todo if (ex.SocketErrorCode != SocketError.ConnectionRefused || ex.SocketErrorCode != SocketError.ConnectionReset) throw ex; } } }
/// <summary> /// 接收客户端发送的消息 /// </summary> /// <param name="newSocket"></param> void Receive(Socket newSocket) { while (newSocket.Connected) { try { byte[] completeRequetData = null; byte[] requetData1 = new byte[20]; //读取客户端发送过来的数据 requetData1 = SocketRead(newSocket, requetData1.Length); if (ByteArryThan(requetData1, BasicCommand)) { var response = DataConvert.StringToByteArray("46 49 4E 53 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 01"); newSocket.Send(response); continue; } byte[] requetData2 = new byte[34 - 20]; requetData2 = SocketRead(newSocket, requetData2.Length); completeRequetData = requetData1.Concat(requetData2).ToArray(); var isBit = completeRequetData[28] == 0x02 || completeRequetData[28] == 0x30 || completeRequetData[28] == 0x31 || completeRequetData[28] == 0x32 || completeRequetData[28] == 0x33; var addressLenght = isBit ? 1 : 2; //1 读 2 写 var readWriteCode = requetData2[27 - 20]; //读写数据长度 var readWriteLength = requetData2[32 - 20] * 256 + requetData2[33 - 20]; if (readWriteCode == 0x02)//写 { byte[] requetData3 = SocketRead(newSocket, readWriteLength * addressLenght); completeRequetData = completeRequetData.Concat(requetData3).ToArray(); } var dataKey = $"{completeRequetData[28]}"; var beginAddress = completeRequetData[30] + completeRequetData[29] * 256; var bitAddress = completeRequetData[31]; switch (completeRequetData[27]) { //读 case 0x01: { //把存储的数据转为字节数组 var dataValue = dataPersist.Read(dataKey); var byteArray = JsonConvert.DeserializeObject <byte[]>(dataValue) ?? new byte[65536]; //数据的字节长度 var dataLenght = readWriteLength * addressLenght; // 响应报文总长度 byte[] responseData = new byte[30 + dataLenght]; DataConvert.StringToByteArray("46 49 4E 53 00 00 00 1A 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00").CopyTo(responseData, 0); //存储的是后面还有多少长度 responseData[4] = BitConverter.GetBytes(22 + dataLenght)[3]; responseData[5] = BitConverter.GetBytes(22 + dataLenght)[2]; responseData[6] = BitConverter.GetBytes(22 + dataLenght)[1]; responseData[7] = BitConverter.GetBytes(22 + dataLenght)[0]; if (isBit) { Buffer.BlockCopy(byteArray, beginAddress * 16 + bitAddress, responseData, 30, dataLenght); } else { Buffer.BlockCopy(byteArray, beginAddress * addressLenght, responseData, 30, dataLenght); } newSocket.Send(responseData); } break; //写 case 0x02: { var byteArray = JsonConvert.DeserializeObject <byte[]>(dataPersist.Read(dataKey)) ?? new byte[65536]; //[32]后面存的是数据 var valueByte = new byte[completeRequetData.Length - 34]; Buffer.BlockCopy(completeRequetData, 34, valueByte, 0, valueByte.Length); //var tempValue1 = BitConverter.ToSingle(valueByte.Reverse().ToArray().ByteFormatting(EndianFormat.CDAB), 0); if (isBit) { valueByte.CopyTo(byteArray, beginAddress * 16 + bitAddress); } else { valueByte.CopyTo(byteArray, beginAddress * addressLenght); } dataPersist.Write(dataKey, JsonConvert.SerializeObject(byteArray)); newSocket.Send(DataConvert.StringToByteArray("46 49 4E 53 00 00 00 16 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00")); } break; } } catch (Exception ex) { //if (newSocket?.Connected ?? false) newSocket?.Shutdown(SocketShutdown.Both); //newSocket?.Close(); //throw ex; } } }
/// <summary> /// 接收客户端发送的消息 /// </summary> /// <param name="newSocket"></param> void Receive(Socket newSocket) { while (newSocket.Connected) { try { byte[] requetData1 = new byte[4]; //读取客户端发送过来的数据 requetData1 = SocketRead(newSocket, requetData1.Length); byte[] requetData2 = new byte[requetData1[3] - 4]; requetData2 = SocketRead(newSocket, requetData2.Length); var requetData = requetData1.Concat(requetData2).ToArray(); //如果是连接的时候发送的两次初始化指令 则直接跳过 if (requetData[3] == SiemensConstant.Command1_200Smart.Length || requetData[3] == SiemensConstant.Command2_200Smart.Length) { newSocket.Send(requetData); continue; } switch (requetData[17]) { //读 case 4: { var dbNumber = requetData[18]; //读取数据长度 var readLength = 0; for (int i = 0; i < dbNumber; i++) { readLength += requetData[23 + i * 12] * 256 + requetData[24 + i * 12]; } var dataContent = new byte[4 * dbNumber + readLength]; //可以从报文中获取Length? var cursor = 0; for (int i = 0; i < dbNumber; i++) { var address = requetData[28 + i * 12] * 256 * 256 + requetData[29 + i * 12] * 256 + requetData[30 + i * 12]; var tempReadLenght = requetData[23 + i * 12] * 256 + requetData[24 + i * 12]; var typeDB = requetData[27 + i * 12]; var stationNumberKey = $"s200-{typeDB}"; var value = dataPersist.Read(stationNumberKey);//TODO 数据存在 25、26 var byteArray = JsonConvert.DeserializeObject <byte[]>(value) ?? new byte[65536]; DataConvert.StringToByteArray("FF 09 00 04").CopyTo(dataContent, 0 + cursor); dataContent[1 + cursor] = readLength == 1 ? (byte)0x03 : (byte)0x04; //04 byte(字节) 03bit(位) dataContent[2 + cursor] = (byte)(readLength / 256); dataContent[3 + cursor] = (byte)(readLength % 256); Buffer.BlockCopy(byteArray, address / 8, dataContent, 4 + cursor, tempReadLenght); cursor += 4 + tempReadLenght; //dataContent[2] dataContent[3] 后半截数据数组的Length //dataContent[4]-[7] 返回给客户端的数据 } byte[] responseData1 = new byte[21 + dataContent.Length]; DataConvert.StringToByteArray("03 00 00 1A 02 F0 80 32 03 00 00 00 01 00 02 00 00 00 00 04 01").CopyTo(responseData1, 0); //responseData1[8] = 0x03;//1 客户端发送命令 3 服务器回复命令 responseData1[2] = (byte)(responseData1.Length / 256); responseData1[3] = (byte)(responseData1.Length % 256); responseData1[15] = (byte)(requetData.Length / 256); responseData1[16] = (byte)(requetData.Length % 256); responseData1[20] = requetData[18]; dataContent.CopyTo(responseData1, 21); //当读取的是字符串的时候[25]存储的后面的数据长度,参考SiemensClient的Write(string address, string value)方法。 //Buffer.BlockCopy(bytes, 0, responseData1, responseData1.Length - bytes.Length, bytes.Length); newSocket.Send(responseData1); } break; //写 case 5: { var address = requetData[28] * 256 * 256 + requetData[29] * 256 + requetData[30]; var typeDB = requetData[27]; var stationNumberKey = $"s200-{typeDB}"; var value = new byte[requetData.Length - 35]; Buffer.BlockCopy(requetData, 35, value, 0, value.Length); var byteArray = JsonConvert.DeserializeObject <byte[]>(dataPersist.Read(stationNumberKey)) ?? new byte[65536]; value.CopyTo(byteArray, address / 8); //存储字节数据到内存 dataPersist.Write(stationNumberKey, JsonConvert.SerializeObject(byteArray)); byte[] responseData1 = new byte[22]; DataConvert.StringToByteArray("03 00 00 16 02 F0 80 32 03 00 00 00 01 00 02 00 01 00 00 05 01 FF").CopyTo(responseData1, 0); newSocket.Send(responseData1); } break; } } catch (Exception ex) { //if (newSocket?.Connected ?? false) newSocket?.Shutdown(SocketShutdown.Both); //newSocket?.Close(); //throw ex; } } }
/// <summary> /// 接收客户端发送的消息 /// </summary> /// <param name="newSocket"></param> void Receive(Socket newSocket) { while (newSocket.Connected) { try { byte[] requetData1 = new byte[21]; //读取客户端发送过来的数据 requetData1 = SocketRead(newSocket, requetData1.Length); byte[] requetData = null; //[12] 0x14 写 0x04 读 if (requetData1[12] == 0x14) { var lenght = requetData1[20] * 2 * 256 + requetData1[19] * 2; //如果是按Bit存储 if (requetData1[13] == 0x01) { lenght = 1; } byte[] requetData2 = new byte[lenght]; requetData2 = SocketRead(newSocket, requetData2.Length); requetData = requetData1.Concat(requetData2).ToArray(); } else { requetData = requetData1; } //地址 //var address = $"{requetData[18]}-{requetData[17] * 256 * 256 + requetData[16] * 256 + requetData[15]}"; var dataKey = $"{requetData[18]}"; var beginAddress = requetData[17] * 256 * 256 + requetData[16] * 256 + requetData[15]; //[13]0x01 位 0x00 字节 var isBit = requetData1[13] == 0x01; var addressLenght = isBit ? 0.5 : 2; switch (requetData[12]) { //读 case 0x04: { //数据存储长度 var lenght = requetData[19] + requetData[20] * 256; //var value = dataPersist.Read(address); //把存储的数据转为字节数组 var dataValue = dataPersist.Read(dataKey); var byteArray = JsonConvert.DeserializeObject <byte[]>(dataValue) ?? new byte[65536]; //数据的字节长度 var dataLenght = isBit ? (int)Math.Ceiling(lenght * addressLenght) : lenght * 2; // 响应报文总长度 byte[] responseData = new byte[11 + dataLenght]; DataConvert.StringToByteArray("D0 00 00 FF FF 03 00 06 00 00 00").CopyTo(responseData, 0); //responseData1[7][8]存储的是后面还有多少长度 responseData[7] = BitConverter.GetBytes(2 + dataLenght)[0]; responseData[8] = BitConverter.GetBytes(2 + dataLenght)[1]; if (isBit && lenght == 1) { var oldBitValue = byteArray[beginAddress / 2]; //一个字节存储两个点位数据 var bitOffset = beginAddress % 2; if (bitOffset == 0) { responseData[11] = (oldBitValue & 0b00010000) != 0 ? (byte)0b00010000 : (byte)0b00000000; } else { responseData[11] = (oldBitValue & 0b00000001) != 0 ? (byte)0b00010000 : (byte)0b00000000; } } else { Buffer.BlockCopy(byteArray, (int)Math.Floor(beginAddress * addressLenght), responseData, 11, dataLenght); } newSocket.Send(responseData); } break; //写 case 0x14: { var byteArray = JsonConvert.DeserializeObject <byte[]>(dataPersist.Read(dataKey)) ?? new byte[65536]; //[21]后面存的是数据 var valueByte = new byte[requetData.Length - 21]; Buffer.BlockCopy(requetData, 21, valueByte, 0, valueByte.Length); //存储字节数据到内存 //dataPersist.Write(address, JsonConvert.SerializeObject(valueByte)); if (isBit) { var oldBitValue = byteArray[beginAddress / 2]; var bitOffset = beginAddress % 2; //一个字节存储两个点位数据 if (valueByte[0] == 0x10) //true { if (bitOffset == 0) { oldBitValue = (byte)(oldBitValue | 0b00010000); } else { oldBitValue = (byte)(oldBitValue | 0b00000001); } } else //false { if (bitOffset == 0) { oldBitValue = (byte)(oldBitValue & ~0b11111110); //修改成0b00000001或0b00000000 } else { oldBitValue = (byte)(oldBitValue & ~0b11101111); //修改成0b00010000或0b00000000 } } new byte[] { oldBitValue }.CopyTo(byteArray, (int)Math.Floor(beginAddress * addressLenght)); } else { valueByte.CopyTo(byteArray, (int)Math.Floor(beginAddress * addressLenght)); } dataPersist.Write(dataKey, JsonConvert.SerializeObject(byteArray)); byte[] responseData1 = DataConvert.StringToByteArray("D0 00 00 FF FF 03 00 02 00 00 00"); newSocket.Send(responseData1); } break; } } catch (Exception ex) { //if (newSocket?.Connected ?? false) newSocket?.Shutdown(SocketShutdown.Both); //newSocket?.Close(); //throw ex; } } }
/// <summary> /// 接收客户端发送的消息 /// </summary> /// <param name="newSocket"></param> void Receive(Socket newSocket) { while (newSocket.Connected) { try { byte[] completeRequetData = null; byte[] requetData1 = new byte[28]; //读取客户端发送过来的数据 requetData1 = SocketRead(newSocket, requetData1.Length); if (ByteArryThan(requetData1, GetBasicCommand())) { //连接握手 var response = DataConvert.StringToByteArray("65 00 04 00 57 01 56 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00"); newSocket.Send(response); continue; } byte[] requetData2 = new byte[40 - 28]; requetData2 = SocketRead(newSocket, requetData2.Length); var requetLength = requetData2[requetData2.Length - 1] * 256 + requetData2[requetData2.Length - 2]; byte[] requetData3 = SocketRead(newSocket, requetLength); completeRequetData = requetData1.Concat(requetData2).Concat(requetData3).ToArray(); var requst = string.Join(" ", completeRequetData.Select(t => t.ToString("X2"))); var address_ASCII_Length = completeRequetData[1 + 26 + 24] * 2 - 2; var address_ASCII = new byte[address_ASCII_Length]; Buffer.BlockCopy(completeRequetData, 4 + 26 + 24, address_ASCII, 0, address_ASCII_Length); var address = Encoding.ASCII.GetString(address_ASCII); var CIP_Length = completeRequetData[24 + 24] + completeRequetData[25 + 24] * 256; switch (completeRequetData[26 + 24]) { //读 case 0x4C: { var value_byte = JsonConvert.DeserializeObject <byte[]>(dataPersist.Read(address)) ?? new byte[4]; var response = DataConvert.StringToByteArray("66 00 1A 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 02 00 00 00 00 00 B2 00 0A 00 CC 00 00 00 00 00 7B 00 00 00"); BitConverter.GetBytes((ushort)(value_byte.Length + 6)).CopyTo(response, 38); value_byte.CopyTo(response, 46); var response_str = string.Join(" ", response.Select(t => t.ToString("X2"))); newSocket.Send(response); } break; //写 case 0x4D: { var value_Length = CIP_Length - address_ASCII_Length - 8; var value_byte = new byte[value_Length]; Buffer.BlockCopy(completeRequetData, 8 + 26 + 24 + address_ASCII.Length, value_byte, 0, value_Length); //var value = BitConverter.ToInt16(value_byte, 0); dataPersist.Write(address, JsonConvert.SerializeObject(value_byte)); var response = DataConvert.StringToByteArray("66 00 16 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 02 00 00 00 00 00 B2 00 06 00 CD 00 00 00 00 00"); newSocket.Send(response); } break; } } catch (Exception ex) { } } }
/// <summary> /// 接收客户端发送的消息 /// </summary> /// <param name="newSocket"></param> void Receive(Socket newSocket) { while (newSocket.Connected) { try { byte[] requetData1 = new byte[8]; //读取客户端发送过来的数据 requetData1 = SocketRead(newSocket, requetData1.Length); byte[] requetData2 = new byte[requetData1[5] - 2]; requetData2 = SocketRead(newSocket, requetData2.Length); var requetData = requetData1.Concat(requetData2).ToArray(); byte[] responseData1 = new byte[8]; //复制请求报文中的报文头 Buffer.BlockCopy(requetData, 0, responseData1, 0, responseData1.Length); var addressKey = $"{requetData[6]}-{requetData[8] * 256 + requetData[9]}"; switch (requetData[7]) { //读取线圈 case 1: { var value = dataPersist.Read(addressKey + "-Coil"); // 数据存在 8、9 var bytes = JsonConvert.DeserializeObject <byte[]>(value); if (bytes == null) { bytes = new byte[2]; } //当前位置到最后的长度 responseData1[5] = (byte)(2 + bytes.Length); byte[] responseData2 = new byte[2] { bytes[1], bytes[0] }; var responseData = responseData1.Concat(responseData2).ToArray(); newSocket.Send(responseData); } break; //写入线圈 case 5: { var value = new byte[2]; Buffer.BlockCopy(requetData, 10, value, 0, value.Length); dataPersist.Write(addressKey + "-Coil", JsonConvert.SerializeObject(value)); var responseData = new byte[10]; Buffer.BlockCopy(requetData, 0, responseData, 0, responseData.Length); responseData[5] = 4; //后面的长度 newSocket.Send(responseData); } break; //读取 case 3: { var value = dataPersist.Read(addressKey); // 数据存在 8、9 var bytes = JsonConvert.DeserializeObject <byte[]>(value); if (bytes == null) { var length = requetData[requetData.Length - 2] * 256 + requetData[requetData.Length - 1]; bytes = new byte[length * 2]; } //当前位置到最后的长度 responseData1[5] = (byte)(3 + bytes.Length); byte[] responseData2 = new byte[1 + bytes.Length]; responseData2[0] = (byte)bytes.Length; bytes.CopyTo(responseData2, 1); var responseData = responseData1.Concat(responseData2).ToArray(); newSocket.Send(responseData); } break; //写入 case 16: { var value = new byte[requetData[12]]; Buffer.BlockCopy(requetData, 13, value, 0, value.Length); dataPersist.Write(addressKey, JsonConvert.SerializeObject(value)); var responseData = new byte[12]; Buffer.BlockCopy(requetData, 0, responseData, 0, responseData.Length); responseData[5] = 6; //后面的长度 newSocket.Send(responseData); } break; //读离散 case 2: { //只返回false var bytes = new byte[2]; //当前位置到最后的长度 responseData1[5] = (byte)(2 + bytes.Length); byte[] responseData2 = new byte[2] { bytes[1], bytes[0] }; var responseData = responseData1.Concat(responseData2).ToArray(); newSocket.Send(responseData); } break; } } catch (Exception ex) { //if (newSocket?.Connected ?? false) newSocket?.Shutdown(SocketShutdown.Both); //newSocket?.Close(); //throw ex; } } }
/// <summary> /// 接收数据回调用 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void DataReceived(object sender, SerialDataReceivedEventArgs e) { try { byte[] requetData = new byte[serialPort.BytesToRead]; serialPort.Read(requetData, 0, requetData.Length); var address = $"{requetData[5]}-{requetData[6]}-{requetData[7]}-{requetData[8]}"; byte[] tempData = new byte[requetData.Length - 3]; Buffer.BlockCopy(requetData, 1, tempData, 0, tempData.Length); var requetAsciiData = DataConvert.AsciiArrayToByteArray(tempData); var type = $"{requetData[3].ToString("X2")}{requetData[4].ToString("X2")}"; switch (type) { //读取线圈 case "3031": { var value = dataPersist.Read(address); var bytes = JsonConvert.DeserializeObject <byte[]>(value); byte[] data = null; //没有存储过的数据的,默认响应false if (bytes == null) { data = DataConvert.StringToByteArray("01 01 01 00"); } else { if (bytes[0].ToString("X2") != "3A" || bytes[bytes.Length - 2].ToString("X2") != "0D" || bytes[bytes.Length - 1].ToString("X2") != "0A") { throw new Exception("标记验证失败"); } byte[] asciiData = new byte[bytes.Length - 3]; Buffer.BlockCopy(bytes, 1, asciiData, 0, asciiData.Length); var byteDataArray = DataConvert.AsciiArrayToByteArray(asciiData); //true if (byteDataArray[4].ToString("X2") == "FF" && byteDataArray[5].ToString("X2") == "00") { data = DataConvert.StringToByteArray("01 01 01 01"); } else //false { data = DataConvert.StringToByteArray("01 01 01 00"); } } var dataString = string.Join("", LRC.GetLRC(data).Select(t => t.ToString("X2"))); var databyte = Encoding.ASCII.GetBytes(dataString); var responseData = new byte[databyte.Length + 3]; Buffer.BlockCopy(databyte, 0, responseData, 1, databyte.Length); responseData[0] = 0x3A; responseData[responseData.Length - 2] = 0x0D; responseData[responseData.Length - 1] = 0x0A; serialPort.Write(responseData, 0, responseData.Length); } break; //写入线圈 case "3035": { dataPersist.Write(address, JsonConvert.SerializeObject(requetData)); serialPort.Write(requetData, 0, requetData.Length); } break; //读取 case "3033": { var value = dataPersist.Read(address); var bytes = JsonConvert.DeserializeObject <byte[]>(value); byte[] data = null; if (bytes == null) { data = new byte[2 + 3]; data[2] = 2; //数据长度 } else { if (bytes[0].ToString("X2") != "3A" || bytes[bytes.Length - 2].ToString("X2") != "0D" || bytes[bytes.Length - 1].ToString("X2") != "0A") { throw new Exception("标记验证失败"); } byte[] asciiData = new byte[bytes.Length - 3]; Buffer.BlockCopy(bytes, 1, asciiData, 0, asciiData.Length); var byteDataArray = DataConvert.AsciiArrayToByteArray(asciiData); data = new byte[byteDataArray[6] + 3]; data[2] = byteDataArray[6]; //数据长度 Buffer.BlockCopy(byteDataArray, 7, data, 3, data.Length - 3); } data[0] = requetAsciiData[0]; //站号 data[1] = 0x03; //功能码 var dataString = string.Join("", LRC.GetLRC(data).Select(t => t.ToString("X2"))); var databyte = Encoding.ASCII.GetBytes(dataString); var responseData = new byte[databyte.Length + 3]; Buffer.BlockCopy(databyte, 0, responseData, 1, databyte.Length); responseData[0] = 0x3A; responseData[responseData.Length - 2] = 0x0D; responseData[responseData.Length - 1] = 0x0A; serialPort.Write(responseData, 0, responseData.Length); } break; //写入3130 对应十进制16 十六进制 10 case "3130": { dataPersist.Write(address, JsonConvert.SerializeObject(requetData)); serialPort.Write(requetData, 0, requetData.Length); } break; } } catch (Exception ex) { } }
/// <summary> /// 接收客户端发送的消息 /// </summary> /// <param name="newSocket"></param> void Receive(Socket newSocket) { while (newSocket.Connected) { try { byte[] requetData1 = new byte[21]; //读取客户端发送过来的数据 int readLeng = newSocket.Receive(requetData1, 0, requetData1.Length, SocketFlags.None); if (readLeng == 0)//客户端断开连接 { newSocket.Shutdown(SocketShutdown.Both); newSocket.Close(); return; } byte[] requetData = null; //[12] 0x14 写 0x04 读 if (requetData1[12] == 0x14) { var lenght = requetData1[20] * 2 * 256 + requetData1[19] * 2; //如果是按Bit存储 if (requetData1[13] == 0x01) { lenght = 1; } byte[] requetData2 = new byte[lenght]; readLeng = newSocket.Receive(requetData2, 0, requetData2.Length, SocketFlags.None); if (readLeng == 0)//客户端断开连接 { if (newSocket?.Connected ?? false) { newSocket.Shutdown(SocketShutdown.Both); } newSocket?.Close(); return; } requetData = requetData1.Concat(requetData2).ToArray(); } else { requetData = requetData1; } //地址 var address = $"{requetData[18].ToString()}-{requetData[17] * 256 * 256 + requetData[16] * 256 + requetData[15]}"; switch (requetData[12]) { //读 case 0x04: { //[13]0x01 位 0x00 字节 var isBit = requetData1[13] == 0x01; //数据存储长度 var lenght = requetData[19] + requetData[20] * 256; var value = dataPersist.Read(address); //把存储的数据转为字节数组 var bytes = JsonConvert.DeserializeObject <byte[]>(value); if (string.IsNullOrWhiteSpace(value)) { bytes = BitConverter.GetBytes(0); } //数据的字节长度 var dataLenght = isBit ? 1 : lenght * 2; // 响应报文总长度 byte[] responseData = new byte[11 + dataLenght]; DataConvert.StringToByteArray("D0 00 00 FF FF 03 00 06 00 00 00").CopyTo(responseData, 0); //responseData1[7][8]存储的是后面还有多少长度 responseData[7] = BitConverter.GetBytes(2 + dataLenght)[0]; responseData[8] = BitConverter.GetBytes(2 + dataLenght)[1]; //正常数据应该是等于,则把数据全部附加过去 if (bytes.Length <= dataLenght) { bytes.CopyTo(responseData, 11); } else { Buffer.BlockCopy(bytes, 0, responseData, 11, dataLenght); } newSocket.Send(responseData); } break; //写 case 0x14: { //[21]后面存的是数据 var valueByte = new byte[requetData.Length - 21]; Buffer.BlockCopy(requetData, 21, valueByte, 0, valueByte.Length); //存储字节数据到内存 dataPersist.Write(address, JsonConvert.SerializeObject(valueByte)); byte[] responseData1 = DataConvert.StringToByteArray("D0 00 00 FF FF 03 00 02 00 00 00"); newSocket.Send(responseData1); } break; } } catch (SocketException ex) { } } }
/// <summary> /// 接收客户端发送的消息 /// </summary> /// <param name="newSocket"></param> void Receive(Socket newSocket) { while (newSocket.Connected) { try { byte[] requetData1 = new byte[8]; //读取客户端发送过来的数据 requetData1 = SocketRead(newSocket, requetData1.Length); byte[] requetData2 = new byte[requetData1[5] - 2]; requetData2 = SocketRead(newSocket, requetData2.Length); var requetData = requetData1.Concat(requetData2).ToArray(); byte[] responseData1 = new byte[8]; //复制请求报文中的报文头 Buffer.BlockCopy(requetData, 0, responseData1, 0, responseData1.Length); var addressKey = $"{requetData[6]}-{requetData[8] * 256 + requetData[9]}"; //站号-寄存器地址 var stationNumberKey = $"{requetData[6]}-key"; //站号 var address = requetData[8] * 256 + requetData[9]; //寄存器地址 var registerLenght = requetData[10] * 256 + requetData[11]; //寄存器的长度 switch (requetData[7]) { //读取线圈 case 1: { var value = dataPersist.Read(stationNumberKey + "-Coil"); // 数据存在 8、9 var byteArray = JsonConvert.DeserializeObject <byte[]>(value) ?? new byte[65536]; var blenght = (byte)Math.Ceiling(registerLenght / 8f); //当前位置到最后的长度 responseData1[5] = (byte)(3 + blenght); byte[] responseData2 = new byte[1 + blenght]; var tempData = new byte[registerLenght]; Buffer.BlockCopy(byteArray, address, tempData, 0, tempData.Length); responseData2[0] = blenght; //显示数据所占长度 for (int i = 0; i < blenght; i++) { responseData2[1 + i] = (byte)DataConvert.BinaryArrayToInt(string.Join("", tempData.Skip(i * 8).Take(8).Reverse())); } var responseData = responseData1.Concat(responseData2).ToArray(); newSocket.Send(responseData); } break; //写入线圈 case 5: { var value = new byte[2]; Buffer.BlockCopy(requetData, 10, value, 0, value.Length); var byteArray = JsonConvert.DeserializeObject <byte[]>(dataPersist.Read(stationNumberKey + "-Coil")) ?? new byte[65536]; if (value[0] == 0 && value[1] == 0) { byteArray[address] = 0; } else { byteArray[address] = 1; } dataPersist.Write(stationNumberKey + "-Coil", JsonConvert.SerializeObject(byteArray)); var responseData = new byte[10]; Buffer.BlockCopy(requetData, 0, responseData, 0, responseData.Length); responseData[5] = 4; //后面的长度 newSocket.Send(responseData); } break; //读取 case 3: { var value = dataPersist.Read(stationNumberKey); // 数据存在 8、9 var byteArray = JsonConvert.DeserializeObject <byte[]>(value) ?? new byte[65536]; //当前位置到最后的长度 responseData1[4] = (byte)((3 + registerLenght * 2) / 256); responseData1[5] = (byte)((3 + registerLenght * 2) % 256); byte[] responseData2 = new byte[1 + registerLenght * 2]; responseData2[0] = (byte)(registerLenght * 2); Buffer.BlockCopy(byteArray, address * 2, responseData2, 1, registerLenght * 2); var responseData = responseData1.Concat(responseData2).ToArray(); newSocket.Send(responseData); } break; //写入 case 16: { var value = new byte[requetData[12]]; Buffer.BlockCopy(requetData, 13, value, 0, value.Length); var byteArray = JsonConvert.DeserializeObject <byte[]>(dataPersist.Read(stationNumberKey)) ?? new byte[65536]; value.CopyTo(byteArray, address * 2); dataPersist.Write(stationNumberKey, JsonConvert.SerializeObject(byteArray)); var responseData = new byte[12]; Buffer.BlockCopy(requetData, 0, responseData, 0, responseData.Length); responseData[5] = 6; //后面的长度 newSocket.Send(responseData); } break; //读离散 case 2: { //只返回false var bytes = new byte[2]; //当前位置到最后的长度 responseData1[5] = (byte)(2 + bytes.Length); byte[] responseData2 = new byte[2] { bytes[1], bytes[0] }; var responseData = responseData1.Concat(responseData2).ToArray(); newSocket.Send(responseData); } break; } } catch (Exception ex) { //if (newSocket?.Connected ?? false) newSocket?.Shutdown(SocketShutdown.Both); //newSocket?.Close(); //throw ex; } } }
/// <summary> /// 接收客户端发送的消息 /// </summary> /// <param name="newSocket"></param> void Receive(Socket newSocket) { while (newSocket.Connected) { try { byte[] requetData1 = new byte[4]; //读取客户端发送过来的数据 int readLeng = newSocket.Receive(requetData1, 0, requetData1.Length, SocketFlags.None); if (readLeng == 0)//客户端断开连接 { newSocket.Shutdown(SocketShutdown.Both); newSocket.Close(); return; } byte[] requetData2 = new byte[requetData1[3] - 4]; readLeng = newSocket.Receive(requetData2, 0, requetData2.Length, SocketFlags.None); if (readLeng == 0)//客户端断开连接 { if (newSocket?.Connected ?? false) { newSocket.Shutdown(SocketShutdown.Both); } newSocket?.Close(); return; } var requetData = requetData1.Concat(requetData2).ToArray(); //如果是连接的时候发送的两次初始化指令 则直接跳过 if (requetData[3] == SiemensConstant.Command1_200Smart.Length || requetData[3] == SiemensConstant.Command2_200Smart.Length) { newSocket.Send(requetData); continue; } var address = requetData[28] * 256 * 256 + requetData[29] * 256 + requetData[30]; switch (requetData[17]) { //读 case 4: { var value = dataPersist.Read(address); //TODO 数据存在 25、26 //把存储的数据转为字节数组 var bytes = JsonConvert.DeserializeObject <byte[]>(value); if (string.IsNullOrWhiteSpace(value)) { bytes = BitConverter.GetBytes(0); } var dataContent = new byte[4 + bytes.Length]; //可以从报文中获取Length? DataConvert.StringToByteArray("FF 09 00 04").CopyTo(dataContent, 0); dataContent[1] = bytes.Length == 1 ? (byte)0x03 : (byte)0x04; //04 byte(字节) 03bit(位) dataContent[2] = (byte)(bytes.Length / 256); dataContent[3] = (byte)(bytes.Length % 256); //dataContent[0] 固定 //dataContent[2] dataContent[3] 后半截数据数组的Length //dataContent[4]-[7] 返回给客户端的数据 byte[] responseData1 = new byte[21 + dataContent.Length]; DataConvert.StringToByteArray("03 00 00 1A 02 F0 80 32 03 00 00 00 01 00 02 00 00 00 00 04 01").CopyTo(responseData1, 0); //responseData1[0] = 0x03; //responseData1[1] = 0x00; //固定协议头 //responseData1[8] = 0x03;//1 客户端发送命令 3 服务器回复命令 responseData1[2] = (byte)(responseData1.Length / 256); responseData1[3] = (byte)(responseData1.Length % 256); responseData1[15] = (byte)(requetData.Length / 256); responseData1[16] = (byte)(requetData.Length % 256); responseData1[20] = requetData[18]; dataContent.CopyTo(responseData1, 21); Buffer.BlockCopy(bytes, 0, responseData1, responseData1.Length - bytes.Length, bytes.Length); newSocket.Send(responseData1); } break; //写 case 5: { var valueByte = new byte[requetData.Length - 35]; Buffer.BlockCopy(requetData, 35, valueByte, 0, valueByte.Length); //存储字节数据到内存 dataPersist.Write(address, JsonConvert.SerializeObject(valueByte)); byte[] responseData1 = new byte[22]; DataConvert.StringToByteArray("03 00 00 16 02 F0 80 32 03 00 00 00 01 00 02 00 01 00 00 05 01 FF").CopyTo(responseData1, 0); //responseData1[15] = (byte)(responseData1.Length / 256); //responseData1[16] = (byte)(responseData1.Length % 256); newSocket.Send(responseData1); } break; } } catch (SocketException ex) { //todo //if (ex.SocketErrorCode != SocketError.ConnectionRefused && // ex.SocketErrorCode != SocketError.ConnectionReset) // throw ex; } } }
/// <summary> /// 接收客户端发送的消息 /// </summary> /// <param name="newSocket"></param> void Receive(Socket newSocket) { while (newSocket.Connected) { try { byte[] requetData1 = new byte[4]; //读取客户端发送过来的数据 requetData1 = SocketRead(newSocket, requetData1.Length); byte[] requetData2 = new byte[requetData1[2] * 256 + requetData1[3] - 4]; requetData2 = SocketRead(newSocket, requetData2.Length); var requetData = requetData1.Concat(requetData2).ToArray(); //如果是连接的时候发送的两次初始化指令 则直接跳过 if (requetData[3] == SiemensConstant.Command1_200Smart.Length || requetData[3] == SiemensConstant.Command2_200Smart.Length) { newSocket.Send(requetData); continue; } switch (requetData[17]) { //读 case 4: { //数据块个数 var dbNumber = requetData[18]; //读取数据总长度 var readLength = 0; for (int i = 0; i < dbNumber; i++) { //访问数据的个数,以byte为单位 var byteLength = requetData[23 + i * 12] * 256 + requetData[24 + i * 12]; if (byteLength == 1 && i < dbNumber - 1) //非最后一个bit/byte,需要补全。 { byteLength += 1; } readLength += byteLength; } var dataContent = new byte[4 * dbNumber + readLength]; //数据报文总长度 var cursor = 0; for (int i = 0; i < dbNumber; i++) { //DB块的偏移量 var beginAddress = requetData[28 + i * 12] * 256 * 256 + requetData[29 + i * 12] * 256 + requetData[30 + i * 12]; //访问数据的个数 var byteLength = requetData[23 + i * 12] * 256 + requetData[24 + i * 12]; if (byteLength == 1 && i < dbNumber - 1) //非最后一个bit/byte,需要补全。 { byteLength += 1; } //是否是bit类型 var isBit = requetData[22 + i * 12] == 0x01; //访问数据块的类型(V、I、DB...) var dbType = requetData[27 + i * 12]; var dataKey = $"s200-{dbType}"; var dataValue = dataPersist.Read(dataKey); var byteArray = JsonConvert.DeserializeObject <byte[]>(dataValue) ?? new byte[65536]; //DataConvert.StringToByteArray("FF 09 00 04").CopyTo(dataContent, cursor); dataContent[0 + cursor] = 0xFF; //dataContent[1 + cursor] = readLength == 1 ? (byte)0x03 : (byte)0x04;//04 byte(字节) 03bit(位) dataContent[1 + cursor] = isBit ? (byte)0x03 : (byte)0x04; //04 byte(字节) 03bit(位) dataContent[2 + cursor] = (byte)(byteLength / 256); //后半截数据数的Length dataContent[3 + cursor] = (byte)(byteLength % 256); //后半截数据数的Length if (isBit) //按bit { var bitOffset = beginAddress % 8; byte bitOffsetValue = (byte)Math.Pow(2, bitOffset); var oldBitValue = byteArray[beginAddress / 8]; //转成bit的形式所需的返回值 var bitValue = (oldBitValue & bitOffsetValue) != 0 ? 0x01 : 0x00; //[4 + cursor]返回给客户端的数据 new byte[] { (byte)bitValue }.CopyTo(dataContent, 4 + cursor); } else { //[4 + cursor]返回给客户端的数据 Buffer.BlockCopy(byteArray, beginAddress / 8, dataContent, 4 + cursor, byteLength); } cursor += 4 + byteLength; } byte[] responseData = new byte[21 + dataContent.Length]; DataConvert.StringToByteArray("03 00 00 1A 02 F0 80 32 03 00 00 00 01 00 02 00 00 00 00 04 01").CopyTo(responseData, 0); responseData[8] = 0x03; //1 客户端发送命令 3 服务器回复命令 responseData[2] = (byte)(responseData.Length / 256); //返回数据长度 responseData[3] = (byte)(responseData.Length % 256); responseData[15] = (byte)(requetData.Length / 256); //读取数据长度 responseData[16] = (byte)(requetData.Length % 256); responseData[20] = requetData[18]; //读取数据块个数 dataContent.CopyTo(responseData, 21); newSocket.Send(responseData); } break; //写 case 5: { var writesLength = requetData[18]; //写如数据的个数 Item count int cursor = 0; for (int i = 0; i < writesLength; i++) { //DB块的偏移量(存储数据的地址) var beginAddress = requetData[28 + i * 12] * 256 * 256 + requetData[29 + i * 12] * 256 + requetData[30 + i * 12]; //访问数据块的类型(V、I、DB...) var dbType = requetData[27 + i * 12]; var dataKey = $"s200-{dbType}"; //Data之前的下标 var dataBeforeIndex = 18 + writesLength * 12; //[2 + index]是否是bit类型 var isBit = requetData[dataBeforeIndex + 4 * (i + 1) - 2 + cursor] == 0x03; var coefficient = isBit ? 1 : 8; //初始化要写入的字节数组长度 var writeValue = new byte[requetData[dataBeforeIndex + 4 * (i + 1) + cursor] / coefficient]; //开始写入的地址(报文中的数据的位置) var requetBeginLocation = dataBeforeIndex + 4 * (i + 1) + cursor + 1; //非最后一个bit,需要补全。 if (writeValue.Length == 1 && i < writesLength - 1) { cursor++; } cursor += writeValue.Length; //数据赋值到writeValue中 Buffer.BlockCopy(requetData, requetBeginLocation, writeValue, 0, writeValue.Length); var byteArray = JsonConvert.DeserializeObject <byte[]>(dataPersist.Read(dataKey)) ?? new byte[65536]; if (isBit) { var oldBitValue = byteArray[beginAddress / 8]; var bitOffset = beginAddress % 8; byte bitOffsetValue = (byte)Math.Pow(2, bitOffset); if (writeValue[0] == 0x01) //true { oldBitValue = (byte)(oldBitValue | bitOffsetValue); //组合bitOffsetValue } else //false { oldBitValue = (byte)(oldBitValue & ~bitOffsetValue); //去掉bitOffsetValue } new byte[] { oldBitValue }.CopyTo(byteArray, beginAddress / 8); } else { writeValue.CopyTo(byteArray, beginAddress / 8); } //存储字节数据到内存 dataPersist.Write(dataKey, JsonConvert.SerializeObject(byteArray)); } byte[] responseData1 = new byte[22]; DataConvert.StringToByteArray("03 00 00 16 02 F0 80 32 03 00 00 00 01 00 02 00 01 00 00 05 01 FF").CopyTo(responseData1, 0); newSocket.Send(responseData1); } break; } } catch (Exception ex) { //if (newSocket?.Connected ?? false) newSocket?.Shutdown(SocketShutdown.Both); //newSocket?.Close(); //throw ex; } } }
/// <summary> /// 接收数据回调用 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void DataReceived(object sender, SerialDataReceivedEventArgs e) { try { byte[] requetData = new byte[serialPort.BytesToRead]; serialPort.Read(requetData, 0, requetData.Length); var address = requetData[2] * 256 + requetData[3]; switch (requetData[1]) { //读取线圈 case 1: { var value = dataPersist.Read(address); var bytes = JsonConvert.DeserializeObject <byte[]>(value).Reverse().ToArray(); var tempData = new byte[4]; tempData[0] = 1; tempData[1] = 1; Buffer.BlockCopy(bytes, 0, tempData, 2, 2); var responseData = CRC16.GetCRC16(tempData); serialPort.Write(responseData, 0, responseData.Length); } break; //写入线圈 case 5: { var value = new byte[2]; Buffer.BlockCopy(requetData, requetData.Length - 4, value, 0, value.Length); dataPersist.Write(address, JsonConvert.SerializeObject(value)); serialPort.Write(requetData, 0, requetData.Length); } break; //读取 case 3: { var value = dataPersist.Read(address); var bytes = JsonConvert.DeserializeObject <byte[]>(value); if (bytes == null) { var length = requetData[4] * 256 + requetData[5]; bytes = new byte[length * 2]; } var dataHead = new byte[] { 1, 3, (byte)bytes.Length }; var tempData = dataHead.Concat(bytes).ToArray(); var responseData = CRC16.GetCRC16(tempData); serialPort.Write(responseData, 0, responseData.Length); } break; //写入 case 16: { var value = new byte[requetData[6]]; Buffer.BlockCopy(requetData, 7, value, 0, value.Length); dataPersist.Write(address, JsonConvert.SerializeObject(value)); var tempData = new byte[6]; Buffer.BlockCopy(requetData, 0, tempData, 0, tempData.Length); var responseData = CRC16.GetCRC16(tempData); serialPort.Write(responseData, 0, responseData.Length); } break; } } catch (Exception ex) { } }
/// <summary> /// 接收客户端发送的消息 /// </summary> /// <param name="newSocket"></param> void Receive(Socket newSocket) { while (newSocket.Connected) { try { byte[] requetData1 = new byte[8]; //读取客户端发送过来的数据 int readLeng = newSocket.Receive(requetData1, 0, requetData1.Length, SocketFlags.None); if (readLeng == 0)//客户端断开连接 { if (newSocket.Connected) { newSocket.Shutdown(SocketShutdown.Both); } newSocket.Close(); return; } byte[] requetData2 = new byte[requetData1[5] - 2]; readLeng = newSocket.Receive(requetData2, 0, requetData2.Length, SocketFlags.None); if (readLeng == 0)//客户端断开连接 { if (newSocket.Connected) { newSocket.Shutdown(SocketShutdown.Both); } newSocket.Close(); return; } var requetData = requetData1.Concat(requetData2).ToArray(); byte[] responseData1 = new byte[8]; //复制请求报文中的报文头 Buffer.BlockCopy(requetData, 0, responseData1, 0, responseData1.Length); var address = requetData[8] * 256 + requetData[9]; switch (requetData[7]) { //读取线圈 case 1: { var value = dataPersist.Read(address); // 数据存在 8、9 var bytes = JsonConvert.DeserializeObject <byte[]>(value); //当前位置到最后的长度 responseData1[5] = (byte)(2 + bytes.Length); //TODO byte[] responseData2 = new byte[2] { bytes[1], bytes[0] }; var responseData = responseData1.Concat(responseData2).ToArray(); newSocket.Send(responseData); } break; //写入线圈 case 5: { var value = new byte[2]; Buffer.BlockCopy(requetData, 10, value, 0, value.Length); dataPersist.Write(address, JsonConvert.SerializeObject(value)); var responseData = new byte[10]; Buffer.BlockCopy(requetData, 0, responseData, 0, responseData.Length); responseData[5] = 4; //后面的长度 newSocket.Send(responseData); } break; //读取 case 3: { var value = dataPersist.Read(address); // 数据存在 8、9 var bytes = JsonConvert.DeserializeObject <byte[]>(value); if (bytes == null) { var length = requetData[requetData.Length - 2] * 256 + requetData[requetData.Length - 1]; bytes = new byte[length * 2]; } //当前位置到最后的长度 responseData1[5] = (byte)(3 + bytes.Length); byte[] responseData2 = new byte[1 + bytes.Length]; responseData2[0] = (byte)bytes.Length; bytes.CopyTo(responseData2, 1); var responseData = responseData1.Concat(responseData2).ToArray(); newSocket.Send(responseData); } break; //写入 case 16: { var value = new byte[requetData[12]]; Buffer.BlockCopy(requetData, 13, value, 0, value.Length); dataPersist.Write(address, JsonConvert.SerializeObject(value)); var responseData = new byte[12]; Buffer.BlockCopy(requetData, 0, responseData, 0, responseData.Length); responseData[5] = 6; //后面的长度 newSocket.Send(responseData); } break; } } catch (SocketException ex) { if (newSocket?.Connected ?? false) { newSocket?.Shutdown(SocketShutdown.Both); } newSocket?.Close(); } catch (Exception ex) { if (newSocket?.Connected ?? false) { newSocket?.Shutdown(SocketShutdown.Both); } newSocket?.Close(); } } }