public bool send(byte[] buffer, int offset, int length) { string info = ""; if (userToken.DeviceInfo != null) { info = string.Format("向DTU客户端(序号为:{0})发送数据,十六进制表示为:{1}", userToken.DeviceInfo.SerialString, FormatHelper.ByteArrayToHexString(buffer, offset, length)); } else { info = string.Format("向DTU客户端发送数据,十六进制表示为:{0}", FormatHelper.ByteArrayToHexString(buffer, offset, length)); } ShowLogData.add(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":[" + userToken.ConnectedSocket.RemoteEndPoint.ToString() + "]发送:" + info); LogHelper.Info(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":[" + userToken.ConnectedSocket.RemoteEndPoint.ToString() + "]发送:" + info); AsyncSendBufferManager sendBufferManager = userToken.AsyncSendBufferManager; sendBufferManager.startPacket(); sendBufferManager.DynamicBufferManager.writeBuffer(buffer, offset, length); sendBufferManager.endPacket(); bool result = true; if (!isSending) { int packetOffset = 0; int packetCount = 0; if (sendBufferManager.getFirstPacket(ref packetOffset, ref packetCount)) { isSending = true; //每一次发送时,更新时间 userToken.ActiveDateTime = DateTime.Now; result = server.sendAsyncEvent(userToken.ConnectedSocket, userToken.SendAysncEvetnArgs, sendBufferManager.DynamicBufferManager.Buffer, packetOffset, packetCount); } } return(result); }
public bool processPacket(byte[] buffer, int offset, int length) { int pos = 0; while (pos < length) { try { if (buffer[pos] == HexStringUtility.StrToByteArray(ProtocolKey.ReceiveHeartThrob)[0] || length - pos < 14) { if (userToken.DeviceInfo != null && userToken.DeviceList != null) { userToken.DeviceList.Online = 1; userToken.DeviceList.LastUpdate = DateTime.Now; userToken.DeviceList.Remark = FormatHelper.ByteArrayToHexString(buffer, offset + pos, length - pos); userToken.DeviceList.TerminalState = "心跳"; updateDeviceList(userToken.DeviceList); string FullDeviceNo = DeviceModule.GetFullDeviceNoByID(userToken.DeviceList.Id); OnlineDeviceService.AddOnline(FullDeviceNo, userToken.DeviceList); DeviceEvent deviceEvent = new DeviceEvent(); deviceEvent.DeviceNo = userToken.DeviceInfo.DeviceNo; deviceEvent.EventTime = userToken.DeviceList.LastUpdate; deviceEvent.EventType = userToken.DeviceList.TerminalState; deviceEvent.Remark = ""; deviceEvent.RawData = FormatHelper.ByteArrayToHexString(buffer, offset + pos, length - pos); proxySendDeviceList(userToken.DeviceList, deviceEvent); } byte[] data = HexStringUtility.StrToByteArray("%"); send(data, 0, data.Length); if (SysCache.ShowInfoLog) { string info1 = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":[" + userToken.ConnectedSocket.RemoteEndPoint.ToString() + "]响应(信息不对):" + "长度不到14"; LogHelper.Info(info1); ShowLogData.add(info1); } if (length - pos < 14) { break; } else { pos += 1; } } else if (buffer[pos] == BaseProtocol.BeginChar) { int bodyLength = buffer[pos + 1]; //长度 byte[] bs = new byte[5 + bodyLength]; Array.Copy(buffer, pos, bs, 0, bs.Length); processCommandBase(bs); pos += 5 + bodyLength; } else if (buffer[pos] == WaterBaseProtocol.BeginChar[0] && buffer[pos + 1] == WaterBaseProtocol.BeginChar[1]) { byte[] bs_UpOrDown_Length = new byte[2]; Array.Copy(buffer, pos + 11, bs_UpOrDown_Length, 0, 2); string str_UpOrDown_Length = HexStringUtility.ByteArrayToHexString(bs_UpOrDown_Length).ToUpper(); string str_Length = str_UpOrDown_Length.Substring(1, 3); int bodyLength = Convert.ToInt32(str_Length, 16); //正文长度 int baseLength = 0; //其它长度 baseLength += 2; //帧起始符 baseLength += 6; //中心站及遥测站 baseLength += 2; //密码 baseLength += 1; //功能码 baseLength += 2; //报文上下行表示及长度 baseLength += 1; //报文起始符 baseLength += 1; //报文结束符 baseLength += 2; //校验码 byte[] bs = new byte[baseLength + bodyLength]; Array.Copy(buffer, pos, bs, 0, bs.Length); processCommandWater(bs); pos += baseLength + bodyLength; } else { pos += 1; } } catch (Exception ex) { if (userToken.DeviceInfo != null && userToken.DeviceList != null) { userToken.DeviceList.Online = 1; userToken.DeviceList.LastUpdate = DateTime.Now; userToken.DeviceList.Remark = FormatHelper.ByteArrayToHexString(buffer, offset, length); userToken.DeviceList.TerminalState = "心跳"; updateDeviceList(userToken.DeviceList); string FullDeviceNo = DeviceModule.GetFullDeviceNoByID(userToken.DeviceList.Id); OnlineDeviceService.AddOnline(FullDeviceNo, userToken.DeviceList); DeviceEvent deviceEvent = new DeviceEvent(); deviceEvent.DeviceNo = userToken.DeviceInfo.DeviceNo; deviceEvent.EventTime = userToken.DeviceList.LastUpdate; deviceEvent.EventType = userToken.DeviceList.TerminalState; deviceEvent.Remark = ""; deviceEvent.RawData = FormatHelper.ByteArrayToHexString(buffer, offset + pos, length - pos); proxySendDeviceList(userToken.DeviceList, deviceEvent); } byte[] data = HexStringUtility.StrToByteArray("%"); send(data, 0, data.Length); if (SysCache.ShowInfoLog) { string info1 = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + ":[" + userToken.ConnectedSocket.RemoteEndPoint.ToString() + "]响应(信息不对):" + "【错误】【pos:" + pos + "】:" + ex.Message; LogHelper.Info(info1); ShowLogData.add(info1); } break; } } return(true); }