2.0协议完善加简单交管配置
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
using StandardScene.Magnetic.Protocol;
|
||||
using System;
|
||||
|
||||
namespace StandardScene.Magnetic.Tests.TestHelpers
|
||||
{
|
||||
internal static class Fass2TestFrameBuilder
|
||||
{
|
||||
public static byte[] BuildStateFrame(
|
||||
ushort car,
|
||||
byte state,
|
||||
ushort nodeId,
|
||||
ulong taskId = 0,
|
||||
byte command = 0)
|
||||
{
|
||||
var frame = new byte[Fass2Protocol.StateFrameLength];
|
||||
frame[0] = Fass2Protocol.Begin;
|
||||
frame[1] = command;
|
||||
WriteUInt16(frame, 2, car);
|
||||
WriteUInt16(frame, 4, 1200);
|
||||
WriteUInt16(frame, 6, 800);
|
||||
frame[28] = 100;
|
||||
frame[29] = 100;
|
||||
frame[36] = state;
|
||||
WriteUInt64(frame, 45, taskId);
|
||||
|
||||
var node = new Fass2NodeMessage
|
||||
{
|
||||
Node = nodeId,
|
||||
StartStop = 1,
|
||||
Distance = 500,
|
||||
Speed = 120
|
||||
};
|
||||
Buffer.BlockCopy(node.ToBytes(), 0, frame, 53, 25);
|
||||
|
||||
frame[98] = Fass2Protocol.Xor(frame, 1, 97);
|
||||
frame[99] = Fass2Protocol.End;
|
||||
return frame;
|
||||
}
|
||||
|
||||
public static string ToHex(byte[] bytes)
|
||||
{
|
||||
if (bytes == null)
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
var parts = new string[bytes.Length];
|
||||
for (var i = 0; i < bytes.Length; i++)
|
||||
{
|
||||
parts[i] = bytes[i].ToString("X2");
|
||||
}
|
||||
|
||||
return string.Join(" ", parts);
|
||||
}
|
||||
|
||||
private static void WriteUInt16(byte[] buffer, int offset, ushort value)
|
||||
{
|
||||
var bytes = BitConverter.GetBytes(value);
|
||||
buffer[offset] = bytes[0];
|
||||
buffer[offset + 1] = bytes[1];
|
||||
}
|
||||
|
||||
private static void WriteUInt64(byte[] buffer, int offset, ulong value)
|
||||
{
|
||||
var bytes = BitConverter.GetBytes(value);
|
||||
Buffer.BlockCopy(bytes, 0, buffer, offset, 8);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
using StandardScene.Magnetic.Protocol;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.Threading;
|
||||
|
||||
namespace StandardScene.Magnetic.Tests.TestHelpers
|
||||
{
|
||||
internal sealed class TestUdpCar : IFass2UdpCar, IDisposable
|
||||
{
|
||||
private readonly UdpClient _ackListener;
|
||||
private readonly object _syncRoot = new object();
|
||||
|
||||
public TestUdpCar(ushort vehicleCode, int remotePort)
|
||||
{
|
||||
VehicleCode = vehicleCode;
|
||||
RemotePort = remotePort;
|
||||
_ackListener = new UdpClient(new IPEndPoint(IPAddress.Loopback, remotePort));
|
||||
_ackListener.Client.ReceiveTimeout = 500;
|
||||
}
|
||||
|
||||
public ushort VehicleCode { get; }
|
||||
|
||||
public string RemoteAddress => "127.0.0.1";
|
||||
|
||||
public int RemotePort { get; }
|
||||
|
||||
public List<Fass2StateReport> Reports { get; } = new List<Fass2StateReport>();
|
||||
|
||||
public void OnUdpStateReceived(Fass2StateReport report)
|
||||
{
|
||||
lock (_syncRoot)
|
||||
{
|
||||
Reports.Add(report);
|
||||
}
|
||||
}
|
||||
|
||||
public byte[] WaitForAck(int timeoutMs = 2000)
|
||||
{
|
||||
var deadline = Environment.TickCount64 + timeoutMs;
|
||||
while (Environment.TickCount64 < deadline)
|
||||
{
|
||||
try
|
||||
{
|
||||
var remote = new IPEndPoint(IPAddress.Any, 0);
|
||||
return _ackListener.Receive(ref remote);
|
||||
}
|
||||
catch (SocketException)
|
||||
{
|
||||
Thread.Sleep(20);
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_ackListener?.Close();
|
||||
_ackListener?.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user