174 lines
5.9 KiB
C#
174 lines
5.9 KiB
C#
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 => 5001;
|
||
// 编码
|
||
// 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;
|
||
}
|
||
|
||
}
|
||
}
|