You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

101 lines
3.3 KiB
C#

using AsyncSocket;
using SLH.SSDMS.Common;
using SLH.SSDMS.Services;
using SLH.SSDMS.Services.serviceImpl;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SLH.SSDMS.Collect
{
public class AsyncSocket
{
private static AsyncSocketServer server = new AsyncSocketServer();
private static IBufferParse bufferParse = new BufferParse();
public static void init()
{
server.Completed += new Action<string, EnSocketAction>((key, enAction) =>
{
switch (enAction)
{
case EnSocketAction.Connect:
LogHelper.Info(String.Format("接收到来自{0}的连接", key));
break;
case EnSocketAction.SendMsg:
LogHelper.Info(String.Format("向客户端{0}发送了一条消息", key));
break;
case EnSocketAction.Close:
LogHelper.Info(String.Format("{0}关闭了连接", key));
break;
default:
break;
}
});
server.Received += new Action<string, byte[]>((key, msg) =>
{
string bufferStr = StringChange.bytesToHexStr(msg, msg.Length);
LogHelper.Info(String.Format("收到客户端:{0}的数据:{1}", key, StringChange.bytesToHexStr(msg, msg.Length)));
if(bufferStr.Contains("A55A") && bufferStr.Contains("0D0A"))
{
byte[] bufferLength = msg.Skip(2).Take(2).ToArray();
int dataLen = Convert.ToInt32(StringChange.bytesToHexStr(bufferLength, bufferLength.Length), 16) + 1;
try
{
byte[] calByte = new byte[dataLen];
Array.Copy(msg, 2, calByte, 0, dataLen);
var info = checkUtil.BCC(calByte);
var test = msg[msg.Length - 2];
//判断校验
if (msg[msg.Length - 3] == info)
{
if (calByte[2] == 132)
{
sendMessage(bufferParse.ReadAnalysis(calByte).Result);
}
if (calByte[2] == 98)
{
sendMessage(bufferParse.HeartAnalysis(calByte).Result);
}
if (calByte[2] == 164)
{
//终端IO返回
}
}
}
catch (Exception ex)
{
LogHelper.Error("接收数据异常", ex);
throw;
}
}
else
{
LogHelper.Info("异常指令:" + StringChange.bytesToHexStr(msg, msg.Length));
}
});
server.StartAsync(7788);
}
private static void sendMessage(byte[] buffer)
{
server.SendAsync(buffer);
}
}
}