mirror of
https://github.com/jwetzell/QControlKit.git
synced 2026-08-17 13:23:33 +00:00
rework TCPClient yet again to try to nail down this SLIP framing problem
This commit is contained in:
@@ -6,7 +6,7 @@
|
|||||||
<Authors>Joel Wetzell</Authors>
|
<Authors>Joel Wetzell</Authors>
|
||||||
<Version>1.0.0-devel</Version>
|
<Version>1.0.0-devel</Version>
|
||||||
<PackOnBuild>true</PackOnBuild>
|
<PackOnBuild>true</PackOnBuild>
|
||||||
<PackageVersion>0.0.31</PackageVersion>
|
<PackageVersion>0.0.32</PackageVersion>
|
||||||
<PackageId>QControlKit</PackageId>
|
<PackageId>QControlKit</PackageId>
|
||||||
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
<PackageLicenseExpression>MIT</PackageLicenseExpression>
|
||||||
<Summary>Unofficial C# port of Figure53's QLabKit.objc</Summary>
|
<Summary>Unofficial C# port of Figure53's QLabKit.objc</Summary>
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Serilog" Version="2.12.0" />
|
<PackageReference Include="Serilog" Version="2.12.0" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
||||||
<PackageReference Include="SuperSimpleTcp" Version="3.0.5" />
|
<PackageReference Include="TcpSharp" Version="1.2.0" />
|
||||||
<PackageReference Include="Zeroconf" Version="3.5.11" />
|
<PackageReference Include="Zeroconf" Version="3.5.11" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
@@ -2,10 +2,8 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Net.Sockets;
|
|
||||||
using System.Threading;
|
|
||||||
using Serilog;
|
using Serilog;
|
||||||
using SuperSimpleTcp;
|
using TcpSharp.Events;
|
||||||
|
|
||||||
namespace SharpOSC
|
namespace SharpOSC
|
||||||
{
|
{
|
||||||
@@ -37,9 +35,9 @@ namespace SharpOSC
|
|||||||
|
|
||||||
string _address;
|
string _address;
|
||||||
|
|
||||||
SimpleTcpClient tcpClient;
|
TcpSharp.TcpSharpSocketClient tcpClient;
|
||||||
|
|
||||||
|
|
||||||
|
private List<byte> frameStream = new List<byte>();
|
||||||
|
|
||||||
public TCPClient(string address, int port)
|
public TCPClient(string address, int port)
|
||||||
{
|
{
|
||||||
@@ -52,11 +50,11 @@ namespace SharpOSC
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
tcpClient = new SimpleTcpClient(Address, Port);
|
tcpClient = new TcpSharp.TcpSharpSocketClient(Address, Port);
|
||||||
tcpClient.Events.Connected += ClientConnected;
|
tcpClient.OnConnected += ClientConnected;
|
||||||
tcpClient.Events.DataReceived += DataReceived;
|
tcpClient.OnDataReceived += DataReceived;
|
||||||
tcpClient.Events.Disconnected += ClientDisconneted;
|
tcpClient.OnDisconnected += ClientDisconneted;
|
||||||
tcpClient.Logger += TCPLog;
|
tcpClient.OnError += ClientError;
|
||||||
tcpClient.Connect();
|
tcpClient.Connect();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -67,55 +65,65 @@ namespace SharpOSC
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
private void ClientError(object sender, OnClientErrorEventArgs e)
|
||||||
|
{
|
||||||
|
_log.Error("client error");
|
||||||
|
_log.Error(e.Exception.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
private void TCPLog(string obj)
|
private void TCPLog(string obj)
|
||||||
{
|
{
|
||||||
_log.Verbose($"{obj}");
|
_log.Verbose($"{obj}");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ClientDisconneted(object sender, ConnectionEventArgs e)
|
private void ClientDisconneted(object sender, OnClientDisconnectedEventArgs e)
|
||||||
{
|
{
|
||||||
_log.Verbose($"{e.IpPort} client disconnected: {e.Reason}");
|
_log.Verbose($"client disconnected: {e.Reason}");
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DataReceived(object sender, DataReceivedEventArgs e)
|
private void DataReceived(object sender, OnClientDataReceivedEventArgs e)
|
||||||
{
|
{
|
||||||
|
frameStream.AddRange(e.Data);
|
||||||
|
|
||||||
_log.Verbose($"Raw Data Received contents: {Encoding.UTF8.GetString(e.Data.Array, 0, e.Data.Count)}");
|
int i = 0;
|
||||||
_log.Verbose($"Raw Data Received size: {e.Data.Count}");
|
int frameEnd = frameStream.FindIndex(1, frameByte=>frameByte.Equals(SlipFrame.END));
|
||||||
List<byte[]> messages = SlipFrame.Decode(e.Data.Array);
|
while(frameEnd > 0)
|
||||||
_log.Verbose($"Slip decoded {messages.Count} osc messages");
|
{
|
||||||
foreach (var message in messages)
|
List<byte> frame = frameStream.GetRange(0, frameEnd+1);
|
||||||
{
|
frameStream.RemoveRange(0, frameEnd + 1);
|
||||||
_log.Verbose($"Raw message contents: {Encoding.UTF8.GetString(message, 0, message.Length)}");
|
List<byte[]> messages = SlipFrame.Decode(frame.ToArray());
|
||||||
try
|
foreach (var message in messages)
|
||||||
{
|
{
|
||||||
OscPacket packet = OscPacket.GetPacket(message);
|
try
|
||||||
OscMessage responseMessage = (OscMessage)packet;
|
{
|
||||||
if (packet == null)
|
OscPacket packet = OscPacket.GetPacket(message);
|
||||||
{
|
OscMessage responseMessage = (OscMessage)packet;
|
||||||
_log.Error("packet is null");
|
if (packet == null)
|
||||||
}
|
{
|
||||||
|
_log.Error("packet is null");
|
||||||
if (responseMessage == null)
|
}
|
||||||
{
|
|
||||||
_log.Error("responeMessage is null");
|
if (responseMessage == null)
|
||||||
}
|
{
|
||||||
|
_log.Error("responeMessage is null");
|
||||||
_log.Debug($"OSC Message Received: {responseMessage.Address}");
|
}
|
||||||
OnMessageReceived(responseMessage);
|
|
||||||
_log.Debug($"After OnMessageReceived Event");
|
_log.Debug($"OSC Message Received: {responseMessage.Address}");
|
||||||
|
OnMessageReceived(responseMessage);
|
||||||
}
|
_log.Debug($"After OnMessageReceived Event");
|
||||||
catch (Exception ex)
|
|
||||||
{
|
}
|
||||||
_log.Error($"Exception parsing OSC message: {ex.ToString()}");
|
catch (Exception ex)
|
||||||
}
|
{
|
||||||
|
_log.Error($"Exception parsing OSC message: {ex.ToString()}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
frameEnd = frameStream.FindIndex(0, frameByte => frameByte.Equals(SlipFrame.END));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ClientConnected(object sender, ConnectionEventArgs e)
|
private void ClientConnected(object sender, OnClientConnectedEventArgs e)
|
||||||
{
|
{
|
||||||
_log.Debug($"connected to <{Address}:{Port}>");
|
_log.Debug($"connected to <{Address}:{Port}>");
|
||||||
}
|
}
|
||||||
@@ -123,7 +131,7 @@ namespace SharpOSC
|
|||||||
public void Send(byte[] message)
|
public void Send(byte[] message)
|
||||||
{
|
{
|
||||||
byte[] slipData = SlipFrame.Encode(message);
|
byte[] slipData = SlipFrame.Encode(message);
|
||||||
tcpClient.Send(slipData.ToArray());
|
tcpClient.SendBytes(slipData.ToArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Send(OscPacket packet)
|
public void Send(OscPacket packet)
|
||||||
@@ -139,7 +147,7 @@ namespace SharpOSC
|
|||||||
if (tcpClient == null)
|
if (tcpClient == null)
|
||||||
return false;
|
return false;
|
||||||
else
|
else
|
||||||
return tcpClient.IsConnected;
|
return tcpClient.Connected;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -147,14 +155,13 @@ namespace SharpOSC
|
|||||||
{
|
{
|
||||||
if (tcpClient != null)
|
if (tcpClient != null)
|
||||||
{
|
{
|
||||||
tcpClient.Events.Connected -= ClientConnected;
|
tcpClient.OnConnected -= ClientConnected;
|
||||||
tcpClient.Events.DataReceived -= DataReceived;
|
tcpClient.OnDataReceived -= DataReceived;
|
||||||
tcpClient.Events.Disconnected -= ClientDisconneted;
|
tcpClient.OnDisconnected -= ClientDisconneted;
|
||||||
if (tcpClient.IsConnected)
|
if (tcpClient.Connected)
|
||||||
{
|
{
|
||||||
_log.Debug($"closing connection to {Address}");
|
_log.Debug($"closing connection to {Address}");
|
||||||
tcpClient.Disconnect();
|
tcpClient.Disconnect();
|
||||||
tcpClient.Dispose();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user