lg_backend/langguanApi/Service/HJ212SocketServer.cs

177 lines
5.9 KiB
C#
Raw Normal View History

2024-05-20 14:56:49 +00:00
using System.Net.Sockets;
using System.Net;
using System.Text;
using IceCoffee.FastSocket.Tcp;
using langguanApi.Model.Dto;
using Newtonsoft.Json;
using langguanApi.Model;
using langguanApi.Service.HJ212;
using langguanApi.Extensions.AutoDI;
namespace langguanApi.Service
{
2024-06-10 09:55:56 +00:00
2024-05-20 14:56:49 +00:00
public class HJ212SocketServer
{
private Hj212Service _hj212Service;
2024-06-10 09:55:56 +00:00
private DeviceService _deviceService;
public HJ212SocketServer(Hj212Service hj212Service, DeviceService deviceService)
2024-05-20 14:56:49 +00:00
{
_hj212Service = hj212Service;
2024-06-10 09:55:56 +00:00
_deviceService = deviceService;
2024-05-20 14:56:49 +00:00
}
/// <summary>
/// 缓冲器
/// </summary>
private byte[] result = new byte[1024];
/// <summary>
/// 最大连接数
/// </summary>
private int maxClientCount;
/// <summary>
/// 服务IP地址
/// </summary>
private string ip;
/// <summary>
/// 服务端口号
/// </summary>
private int port => 5001;
2024-05-20 14:56:49 +00:00
// 编码
// private string code;
/// <summary>
/// 客户端列表
/// </summary>
private List<Socket> ClientSockets;
/// <summary>
/// IP终端
/// </summary>
private IPEndPoint ipEndPoint;
/// <summary>
/// 服务端Socket
/// </summary>
private Socket ServerSocket;
private static NetServer server;
private static IceCoffee.FastSocket.Tcp.TcpClient client;
/// <summary>
/// 启动服务
/// </summary>
/// <returns></returns>
public async Task Start()
{
ip = IPAddress.Any.ToString();
server = new NetServer(ip, port);
server.Started += OnNetServer_Started;
server.ExceptionCaught += OnNetServer_ExceptionCaught;
server.SessionStarted += OnNetServer_SessionStarted;
server.SessionClosed += OnNetServer_SessionClosed;
server.ReceivedData += OnNetServer_ReceivedData;
server.SendData += OnNetServer_SendData;
server.Start();
}
2024-07-27 12:53:33 +00:00
2024-05-20 14:56:49 +00:00
private void OnNetServer_Started()
{
Console.WriteLine($"开始监听: {ip}:{port}");
}
private void OnNetServer_SendData(NetSession session, NetPackage netPackage, string rawText)
{
Console.WriteLine($"发送给: {session.RemoteIPEndPoint}: {rawText}");
}
private void OnNetServer_SessionClosed(TcpSession session)
{
Console.WriteLine("会话关闭: " + session.RemoteIPEndPoint + ", 当前会话总数: " + server.SessionCount);
}
private static void OnNetServer_SessionStarted(TcpSession session)
{
Console.WriteLine("会话开始: " + session.RemoteIPEndPoint + ", 当前会话总数: " + server.SessionCount);
}
private async void OnNetServer_ReceivedData(TcpSession session, NetPackage netPackage, string rawText)
{
Console.WriteLine("收到自: " + session.RemoteIPEndPoint + ": " + rawText);
HJ212_2017 hj = new HJ212_2017();
// st 27 =voc,st=31 cems, st=32,tsp, st=22 微站
2024-05-20 14:56:49 +00:00
if (hj.DecodeData(rawText))
{
var body = JsonConvert.SerializeObject(hj.CP);
2024-08-12 18:19:04 +00:00
2024-06-24 15:13:14 +00:00
Console.WriteLine("解析成功: " + body);
2024-05-20 14:56:49 +00:00
var entity = JsonConvert.DeserializeObject<Model.HJ212>(body);
entity.deviceMN = hj.DATA_HEAD["MN"];
int deviceType = SetDeviceType(hj.DATA_HEAD["ST"]);
if (entity.a34001 > 0 && deviceType == 3)
{
deviceType = 5;
}
2024-06-10 09:55:56 +00:00
await _deviceService.Add(new DeviceAddDto
{
deviceMN = hj.DATA_HEAD["MN"],
DeviceType = deviceType,
2024-06-24 15:13:14 +00:00
Ip = session.RemoteIPEndPoint.ToString(),
2024-06-10 09:55:56 +00:00
});
2024-05-20 14:56:49 +00:00
//校验通过,开始入库
2024-06-10 09:55:56 +00:00
await _hj212Service.Add(entity, session.RemoteIPEndPoint.ToString());
}
}
/// <summary>
/// 设置设备类型
/// </summary>
/// <param name="st"></param>
/// <returns></returns>
2024-06-10 09:55:56 +00:00
private int SetDeviceType(string st)
{
//st 27 =voc,st=31 cems, st=22,微站,( st=22&&a34001>0 tsp)
2024-06-10 09:55:56 +00:00
//1 voc,2 cems,3,tsp,4 video
switch (st)
{
case "27": return 1;
case "31": return 2;
case "22": return 3;
2024-07-27 12:53:33 +00:00
// case "33": return 4;
2024-05-20 14:56:49 +00:00
}
2024-06-10 09:55:56 +00:00
return 0;
2024-05-20 14:56:49 +00:00
}
private void OnNetServer_ExceptionCaught(Exception ex)
{
Console.WriteLine("Error in NetServer" + ex);
}
byte[] CallCRC(byte[] data)
{
string ccc = Convert.ToString(getCrc(data), 16).PadLeft(4, '0');
return Encoding.ASCII.GetBytes(ccc.ToUpper());
}
private int getCrc(byte[] data)
{
int high;
int flag;
// 16位寄存器所有数位均为1
int wcrc = 0xffff;
for (int i = 0; i < data.Length; i++)
{
// 16 位寄存器的高位字节
high = wcrc >> 8;
// 取被校验串的一个字节与 16 位寄存器的高位字节进行“异或”运算
wcrc = high ^ data[i];
for (int j = 0; j < 8; j++)
{
flag = wcrc & 0x0001;
// 把这个 16 寄存器向右移一位
wcrc = wcrc >> 1;
// 若向右(标记位)移出的数位是 1,则生成多项式 1010 0000 0000 0001 和这个寄存器进行“异或”运算
if (flag == 1)
wcrc ^= 0xa001;
}
}
return wcrc;
}
}
}