jy-plc/Services/HJ212SocketServer.cs

340 lines
13 KiB
C#
Raw Permalink 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 IceCoffee.FastSocket.Tcp;
using IceCoffee.HJ212;
using IceCoffee.HJ212.Models;
using LangGuan.Command.Model;
using LangGuan.Command.Model.EntityModel;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace LangGuan.Services
{
/// <summary>
/// 启动socket
/// </summary>
public class HJ212SocketServer
{
private Hj212Service _hj212Service;
private DeviceSerive _deviceSerive;
/// <summary>
///
/// </summary>
/// <param name="hj212Service"></param>
/// <param name="deviceSerive"></param>
public HJ212SocketServer(Hj212Service hj212Service, DeviceSerive deviceSerive)
{
_hj212Service = hj212Service;
_deviceSerive = deviceSerive;
}
/// <summary>
/// 缓冲器
/// </summary>
private byte[] result = new byte[1024];
/// <summary>
/// 最大连接数
/// </summary>
private int maxClientCount;
/// <summary>
/// 服务IP地址
/// </summary>
private string ip;
/// <summary>
/// 服务端口号
/// </summary>
private int port => 9001;
// 编码
// 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();
//client = new IceCoffee.FastSocket.Tcp.TcpClient(ip, port);
//client.ConnectAsync();
//client.Connected += OnClient_Connected;
//try
//{
// ip = IPAddress.Any.ToString();
// maxClientCount = 256; //设定最大连接数
// ClientSockets = new List<Socket>();
// ipEndPoint = new IPEndPoint(IPAddress.Any, port); //初始化IP终端
// ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //初始化服务端Socket
// ServerSocket.Bind(this.ipEndPoint); //端口绑定
// ServerSocket.Listen(100); //设置监听数目
// Console.WriteLine($"socket服务已经启动端口{port}");
// var handler = await ServerSocket.AcceptAsync();
// string data = null;
// byte[] bytes = null;
// while (true)
// {
// bytes = new byte[1024];
// int bytesRec = handler.Receive(bytes);
// data = Encoding.UTF8.GetString(bytes, 0, bytesRec);
// Console.WriteLine($"客户端发来数据:{data}");
// if (data.IndexOf("/r/n") > -1)
// {
// break;
// }
// }
// Console.WriteLine($"客户端发来数据:{data}");
// handler.Send(PackData("1"));
// handler.Shutdown(SocketShutdown.Both);
// handler.Close();
// //while (true)
// //{
// // if (handler.Connected)
// // {
// // var buffer = new byte[1_024];
// // var received = await handler.ReceiveAsync(buffer, SocketFlags.None);
// // var strData = Encoding.UTF8.GetString(buffer, 0, received);
// // if (!string.IsNullOrEmpty(strData))
// // {
// // if (!string.IsNullOrEmpty(strData))
// // {
// // HJ212_2017 hj = new HJ212_2017();
// // if (hj.DecodeData(strData))
// // {
// // Console.WriteLine($"客户端发来数据:{strData}");
// // var body = JsonConvert.SerializeObject(hj.CP);
// // var entity = JsonConvert.DeserializeObject<HJ212>(body);
// // entity.deviceId = hj.DATA_HEAD["MN"];
// // //校验通过,开始入库
// // Console.WriteLine($"数据开始入库");
// // _ = _hj212Service.Add(entity, handler.RemoteEndPoint.ToString());
// // Console.WriteLine($"数据入库end");
// // }
// // }
// // }
// // }
// // else
// // {
// // break;
// // }
// //}
// //连接客户端
//}
//catch (Exception ex)
//{
// Console.WriteLine($"socket服务异常{ex}");
//}
}
private void OnClient_Connected()
{
string message = "##0285QN=20190925181031464;ST=22;CN=2061;PW=BF470F88957588DE902D1A52;MN=Z13401000010301;Flag=5;CP=&&DataTime=20190924220000;a34006-Avg=2.69700,a34006-Flag=N;a34007-Avg=7.96600,a34007-Flag=N;a34048-Avg=3.30600,a34048-Flag=N;a34047-Avg=7.35700,a34047-Flag=N;a34049-Avg=10.66300,a34049-Flag=N&&C181\r\n";
byte[] data = Encoding.UTF8.GetBytes(message);
client.SendAsync(data);
}
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 void OnNetServer_ReceivedData(TcpSession session, NetPackage netPackage, string rawText)
{
Console.WriteLine("收到自: " + session.RemoteIPEndPoint + ": " + rawText);
HJ212_2017 hj = new HJ212_2017();
if (hj.DecodeData(rawText))
{
var body = JsonConvert.SerializeObject(hj.CP);
var entity = JsonConvert.DeserializeObject<HJ212>(body);
entity.deviceId = hj.DATA_HEAD["MN"];
//校验通过,开始入库
Console.WriteLine($"数据开始入库");
_ = _hj212Service.Add(entity, session.RemoteIPEndPoint.ToString());
}
}
private void OnNetServer_ExceptionCaught(Exception ex)
{
Console.WriteLine("Error in NetServer" + ex);
}
private void Receive(Socket socket)
{
string strData = null;
byte[] bytes = null;
while (true)
{
bytes = new byte[1024];
int bytesRec = socket.Receive(bytes);
strData = Encoding.UTF8.GetString(bytes, 0, bytesRec);
if (!string.IsNullOrEmpty(strData))
{
HJ212_2017 hj = new HJ212_2017();
if (hj.DecodeData(strData))
{
Console.WriteLine($"客户端发来数据:{strData}");
var body = JsonConvert.SerializeObject(hj.CP);
var entity = JsonConvert.DeserializeObject<HJ212>(body);
entity.deviceId = hj.DATA_HEAD["MN"];
//校验通过,开始入库
Console.WriteLine($"数据开始入库");
_ = _hj212Service.Add(entity, socket.RemoteEndPoint.ToString());
}
}
}
}
/// <summary>
/// 后台线程接收数据
/// </summary>
/// <param name="obj"></param>
private void ReceiveMessage(object obj)
{
Socket _ClientSocket = (Socket)obj;
while (true)
{
try
{
//获取数据长度
int receiveLength = _ClientSocket.Receive(result);
//获取客户端发来的数据
string strData = Encoding.UTF8.GetString(result, 0, receiveLength);
if (string.IsNullOrEmpty(strData))
{
break;
}
HJ212_2017 hj = new HJ212_2017();
if (hj.DecodeData(strData))
{
var body = JsonConvert.SerializeObject(hj.CP);
var entity = JsonConvert.DeserializeObject<HJ212>(body);
entity.deviceId = hj.DATA_HEAD["MN"];
//校验通过,开始入库
_ = _hj212Service.Add(entity, _ClientSocket.RemoteEndPoint.ToString());
_ClientSocket.Close();
_ClientSocket.Dispose();
}
}
catch (Exception e)//通讯出现异常
{
//从客户端列表中移除该客户端
//this.ClientSockets.Remove(_ClientSocket);
////断开连接
Console.WriteLine($"客户端{_ClientSocket.RemoteEndPoint},通讯出现异常:{e.Message}");
//_ClientSocket.Shutdown(SocketShutdown.Both);
_ClientSocket.Close();
break;
}
}
}
byte[] PackData(string data)
{
Encoding gb = Encoding.GetEncoding("gb2312");
List<byte> arr = new List<byte>();
arr.Add(0x23);
arr.Add(0x23);//固定包头##
arr.AddRange(Encoding.ASCII.GetBytes(data.Length.ToString().PadLeft(4, '0')));//数据段字符串长度(长度不足4左补0)的ASCII编码
byte[] dataSegment = gb.GetBytes(data);//数据段的gb2312编码
arr.AddRange(dataSegment);
arr.AddRange(CallCRC(dataSegment));// CRC-16/Modbus校验值 4个字节
arr.Add(0x0D);//回车
arr.Add(0x0A);//换行
return arr.ToArray();
}
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;
}
}
}