lg_backend/langguanApi/Service/HJ212SocketServer.cs

176 lines
5.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
{
public class HJ212SocketServer
{
private Hj212Service _hj212Service;
private DeviceService _deviceService;
public HJ212SocketServer(Hj212Service hj212Service, DeviceService deviceService)
{
_hj212Service = hj212Service;
_deviceService = deviceService;
}
/// <summary>
/// 缓冲器
/// </summary>
private byte[] result = new byte[1024];
/// <summary>
/// 最大连接数
/// </summary>
private int maxClientCount;
/// <summary>
/// 服务IP地址
/// </summary>
private string ip;
/// <summary>
/// 服务端口号
/// </summary>
private int port => 5003;
// 编码
// 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();
}
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 微站
if (hj.DecodeData(rawText))
{
var body = JsonConvert.SerializeObject(hj.CP);
Console.WriteLine("解析成功: " + body);
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;
}
await _deviceService.Add(new DeviceAddDto
{
deviceMN = hj.DATA_HEAD["MN"],
DeviceType = deviceType,
Ip = session.RemoteIPEndPoint.ToString(),
});
//校验通过,开始入库
await _hj212Service.Add(entity, session.RemoteIPEndPoint.ToString());
}
}
/// <summary>
/// 设置设备类型
/// </summary>
/// <param name="st"></param>
/// <returns></returns>
private int SetDeviceType(string st)
{
//st 27 =voc,st=31 cems, st=22,微站,( st=22&&a34001>0 tsp)
//1 voc,2 cems,3,tsp,4 video
switch (st)
{
case "27": return 1;
case "31": return 2;
case "22": return 3;
// case "33": return 4;
}
return 0;
}
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;
}
}
}