using HighWayIot.Repository.domain;
using HighWayIot.Repository.service.Impl;
using HighWayIot.TouchSocket.Entity;
using Org.BouncyCastle.Crypto;
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;
public Action MessegeSend;
///
/// 消息分类工厂
///
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);
FirstHeartbeat(id);
}
if (functionCode == 600) //读码报文接收
{
ReadCodeReportProcess(messagePack, id);
}
if (functionCode == 610) //状态上报报文
{
StateReportProcess(messagePack, id);
}
}
///
/// 心跳报文处理
///
private void HeartbeatProcess(BaseMessagePack messagePack, string id)
{
//数据库操作
if (BaseHeartbeatServiceImpl.Instance.UpdateHeartbeatInfo(id) == 0)
{
RFIDHeartbeat heartbeat = new RFIDHeartbeat()
{
LineNo = id,
BeatTime = DateTime.Now,
};
BaseHeartbeatServiceImpl.Instance.AddHeartbeatInfo(heartbeat);
}
//反馈
MessegeSend.Invoke(
serverBufferAnalysis.BasePackedServerBufferAnalysis(
HeartbeatResponse(messagePack)
),
id);
}
///
/// 注册报文处理
///
private void RegisterProcess(BaseMessagePack messagePack, string id)
{
//直接反馈
MessegeSend.Invoke(
serverBufferAnalysis.BasePackedServerBufferAnalysis(
StandardResponse(messagePack)
),
id);
}
///
/// 读码应答报文处理
///
private void ReadCodeReportProcess(BaseMessagePack messagePack, string id)
{
//存数据库,无需反馈
//解析数据内容
RFIDContent rfidContent = new RFIDContent();
int index = 0;
index += 4;
byte[] temp = new byte[2];
Array.Copy(messagePack.DataContent, index, temp, 0, 2);
Array.Reverse(temp);
rfidContent.DeviceNo = BitConverter.ToUInt16(temp, 0);
index += 2;
rfidContent.ReadKind = ASCIIEncoding.UTF8.GetString(messagePack.DataContent, index, 2);
index += 2;
int length = messagePack.DataContent[index];
index++;
rfidContent.Content = ASCIIEncoding.UTF8.GetString(messagePack.DataContent, index, length);
rfidContent.LineNo = id;
rfidContent.LogTime = DateTime.Now;
BaseContentServiceImpl.Instance.AddContentInfo(rfidContent);
}
///
/// 状态上报报文处理
///
private void StateReportProcess(BaseMessagePack messagePack, string id)
{
//存数据库,需反馈
byte[] temp = new byte[2];
Array.Copy(messagePack.DataContent, 0, temp, 0, 2);
Array.Reverse(temp);
int deviceno = BitConverter.ToUInt16(temp, 0);
RFIDState rFIDState = new RFIDState()
{
DeviceNo = deviceno,
DeviceState = messagePack.DataContent[2] == 0 ? true : false,
LogTime = DateTime.Now,
LineNo = id
};
BaseStateServiceImpl.Instance.AddStateInfo(rFIDState);
MessegeSend.Invoke(
serverBufferAnalysis.BasePackedServerBufferAnalysis(
StandardResponse(messagePack)
),
id);
}
///
/// 读码请求报文处理
///
///
public void ReadCodeRequestProcess(string id)
{
MessegeSend.Invoke(
serverBufferAnalysis.BasePackedServerBufferAnalysis(
ReadRequest()
),
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);
index += 2;
PackedData(ref messagePack, 10, data);
return messagePack;
}
///
/// 读码请求报文(主动)
///
///
public BaseMessagePack ReadRequest()
{
BaseMessagePack messagePack = new BaseMessagePack();
messagePack.SerialCode = BitConverter.GetBytes((uint)0);
messagePack.VersionCode = 0x01;
var datacontent = BitConverter.GetBytes((ushort)481);
Array.Reverse(datacontent);
PackedData(ref messagePack, 500, datacontent);
return messagePack;
}
///
/// 封装数据部分(版本号沿用,序列号自动加一)
///
/// 源数据包
/// 新的功能码
/// 新的DataContent
public void PackedData(ref BaseMessagePack messagePack, ushort functionCode, byte[] dataContent)
{
if (dataContent == null)
{
return;
}
messagePack.FunctionCode = 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));
}
///
/// 初次心跳发送
///
public void FirstHeartbeat(string id)
{
BaseMessagePack messagePack = new BaseMessagePack();
messagePack.FunctionCode = BitConverter.GetBytes((ushort)0);
messagePack.VersionCode = 0x01;
messagePack.SerialCode = BitConverter.GetBytes((uint)0);
//反馈
MessegeSend.Invoke(
serverBufferAnalysis.BasePackedServerBufferAnalysis(
HeartbeatResponse(messagePack)
),
id);
}
}
}