using HighWayIot.TouchSocket.Entity; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; namespace HighWayIot.TouchSocket { /// /// 消息工厂 /// public class MessageFactory { private static readonly Lazy lazy = new Lazy(() => new MessageFactory()); public static MessageFactory Instance => lazy.Value; private ServerBufferAnalysis serverBufferAnalysis = ServerBufferAnalysis.Instance; private TcpServer tcpServer = TcpServer.Instance; /// /// 消息分类工厂 /// public void Factory(BaseMessagePack messagePack, string id) { if (messagePack == null) { return; } int functionCode = BitConverter.ToUInt16(messagePack.FunctionCode, 0); if (functionCode == 0) //心跳报文 { HeartbeatProcess(messagePack, id); } if (functionCode == 1) //连接注册请求报文 { RegisterProcess(messagePack, id); } if (functionCode == 600) //读码报文接收 { ReadCodeReportProcess(messagePack); } if (functionCode == 610) //状态上报报文 { StateReportProcess(messagePack, id); } } /// /// 心跳报文处理 /// private void HeartbeatProcess(BaseMessagePack messagePack, string id) { //直接反馈 tcpServer.SendMessage( serverBufferAnalysis.BasePackedServerBufferAnalysis( HeartbeatResponse(messagePack) ), id); } /// /// 注册报文处理 /// private void RegisterProcess(BaseMessagePack messagePack, string id) { //直接反馈 tcpServer.SendMessage( serverBufferAnalysis.BasePackedServerBufferAnalysis( StandardResponse(messagePack) ), id); } /// /// 读码应答报文处理 /// private void ReadCodeReportProcess(BaseMessagePack messagePack) { //存数据库,无需反馈 } /// /// 状态上报报文处理 /// private void StateReportProcess(BaseMessagePack messagePack, string id) { //存数据库,需反馈 tcpServer.SendMessage( serverBufferAnalysis.BasePackedServerBufferAnalysis( StandardResponse(messagePack) ), id); } /// /// 包封装(心跳响应) /// /// public BaseMessagePack HeartbeatResponse(BaseMessagePack messagePack) { PackedData(ref messagePack, 0, new byte[0]); return messagePack; } /// /// 包封装(注册和状态上报响应) /// /// public BaseMessagePack StandardResponse(BaseMessagePack messagePack) { //解析来时报文 //看了一眼协议好像不太用解析 //封包应答报文 byte[] data = new byte[6]; int index = 0; //来时报文序列号 Array.Reverse(messagePack.SerialCode); Array.Copy(messagePack.SerialCode, 0, data, index, 4); Array.Reverse(messagePack.SerialCode); index += 4; //来时报文功能码 Array.Reverse(messagePack.FunctionCode); Array.Copy(messagePack.FunctionCode, 0, data, index, 2); Array.Reverse(messagePack.FunctionCode); index += 2; PackedData(ref messagePack, 10, data); return messagePack; } /// /// 封装数据部分(版本号沿用,序列号自动加一) /// /// 源数据包 /// 新的功能码 /// 新的DataContent public void PackedData(ref BaseMessagePack messagePack, ushort functionCode, byte[] dataContent) { if (dataContent == null) { return; } messagePack.Length = BitConverter.GetBytes(functionCode); uint code = BitConverter.ToUInt32(messagePack.SerialCode, 0); code++; messagePack.SerialCode = BitConverter.GetBytes(code); messagePack.TimeStamp = BitConverter.GetBytes(Convert.ToUInt64(DateTimeOffset.UtcNow.ToUnixTimeMilliseconds())); messagePack.DataContent = dataContent; messagePack.Length = BitConverter.GetBytes(Convert.ToUInt16(messagePack.DataContent.Length + 13u)); } } }