public void ParseAndAddMessageToQueue(byte[] RecvBytes, int RecvCount, TcpClient Client, ref int parseCount, byte[] arrayParse) { //匹配比较数组, -1表示不需要比较,忽略 int[] arrayCompare = new int[Message.MessageLength] { Message.MessStartCode, Message.MessVID1, Message.MessVID2, -1, Message.MessRightState, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, Message.MessEndCode, }; for (int i = 0; i < RecvCount; i++) { if (arrayCompare[parseCount] != -1) //需要匹配 { if (RecvBytes[i] == arrayCompare[parseCount]) //相等 { arrayParse[parseCount++] = RecvBytes[i]; } else //不相等,复位计数器 { parseCount = 0; } } else //不需要比较,直接赋值,并更新计数器 { arrayParse[parseCount++] = RecvBytes[i]; } if (parseCount >= Message.MessageLength) { parseCount = 0; //和校验 if (MyMath.CheckSum(arrayParse, Message.MessageLength)) //分析数据,把数据添加到队列m_TcpMeas { TcpMeasType MeasType = TcpMeasType.MEAS_TYPE_ARM; byte MeasCode = arrayParse[Message.MessageCommandIndex]; if (MeasCode == (byte)Message.MessageCodeCamera.GetCameraCoords) { MeasType = TcpMeasType.MEAS_TYPE_CAMERA; } TcpMeas TempMeas = new TcpMeas(); if (TempMeas != null) { TempMeas.Client = Client; TempMeas.MeasType = MeasType; TempMeas.MeasCode = MeasCode; Array.Copy(RecvBytes, TempMeas.Param, TempMeas.Param.Length); m_RecvMeasQueue.Enqueue(TempMeas); } Array.Clear(arrayParse, 0, arrayParse.Length); } else //校验和错误,则更新错误码后发回 { arrayParse[Message.MessageStateIndex] = Message.MessErrorState; using (NetworkStream stream = Client.GetStream()) { stream.Write(arrayParse, 0, arrayParse.Length); } } } } }
public void ProcessTcpServerMessage() { if (m_MyTcpServerArm != null) { while (m_MyTcpServerArm.m_RecvMeasQueue.Count != 0) { TcpMeas TempMeas = m_MyTcpServerArm.m_RecvMeasQueue.Dequeue(); if (TempMeas != null && TempMeas.Client != null) { if (TempMeas.MeasType == TcpMeasType.MEAS_TYPE_ARM) // 处理和PLC之间的消息 { Message.MessageCodeARM Code = (Message.MessageCodeARM)TempMeas.MeasCode; Debug.WriteLine(Code); switch (Code) { case Message.MessageCodeARM.ArmUpdate: { //断开服务后重新创建 m_MyTcpServerArm.CloseServer(); Thread.Sleep(1000); if (m_MyTcpServerArm != null) { IPAddress ServerIp = IPAddress.Parse(TextBoxIp.Text); int ServerPort = int.Parse(TextBoxPort.Text); m_MyTcpServerArm.CreatServer(ServerIp, ServerPort); } } break; case Message.MessageCodeARM.ArmUpdateFileLength: { m_FileSize = BitConverter.ToInt32(TempMeas.Param, Message.MessageCommandIndex + 1); } break; case Message.MessageCodeARM.ArmUpdateFileData: { m_TotalPages++; if (m_TotalPages != 0 && m_TotalPages * 16 >= m_FileSize) { m_Writer.Write(TempMeas.Param, Message.MessageCommandIndex + 3, (m_FileSize - (m_TotalPages - 1) * 16)); } else { m_Writer.Write(TempMeas.Param, Message.MessageCommandIndex + 3, 16); } m_CurrentPage = BitConverter.ToInt16(TempMeas.Param, Message.MessageCommandIndex + 1); Debug.WriteLine("Current Page: " + m_CurrentPage); if (m_TotalPages != 0 && m_TotalPages * 16 >= m_FileSize) { TempMeas.Param[Message.MessageCommandIndex] = (byte)Message.MessageCodeARM.ArmUpdateSucceed; TempMeas.Param[TempMeas.Param.Length - 2] = 0x00; byte Sum = MyMath.CalculateSum(TempMeas.Param, TempMeas.Param.Length); TempMeas.Param[TempMeas.Param.Length - 2] = Sum; } } break; default: break; } NetworkStream stream = TempMeas.Client.GetStream(); stream.Write(TempMeas.Param, 0, TempMeas.Param.Length); } } } } }