Converted as much ugly code as I could find into appropriate C#-friendly versions. For example, all the manual ByteHelper stuff, buffer index tracking, etc. are now BinaryWriters/BinaryReaders. Also cleaned up a bunch of getter and setter methods to use C# properties. There's still more to be done here, but this greatly simplifies the code for reading and comprehension.
141 lines
4.6 KiB
C#
141 lines
4.6 KiB
C#
using System;
|
|
using System.Diagnostics;
|
|
using System.Net.Sockets;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace ScreenLogicConnect
|
|
{
|
|
public class UnitConnection : IDisposable
|
|
{
|
|
TcpClient client;
|
|
|
|
public async Task ConnectTo(EasyTouchUnit unit)
|
|
{
|
|
if (client != null)
|
|
{
|
|
client.Dispose();
|
|
}
|
|
|
|
client = new TcpClient();
|
|
await client.ConnectAsync(unit.ipAddress, unit.port);
|
|
|
|
var connMsg = CreateConnectServerSoftMessage();
|
|
var stream = client.GetStream();
|
|
stream.Write(connMsg, 0, connMsg.Length);
|
|
stream.SendHLMessage(Messages.ChallengeString.QUERY(0));
|
|
Debug.WriteLine("sent challenge string");
|
|
var recvBuf = new byte[1024];
|
|
var readBytes = stream.Read(recvBuf, 0, recvBuf.Length);
|
|
Debug.WriteLine("read {0}", readBytes);
|
|
|
|
stream.SendHLMessage(createLoginMessage(new byte[16]));
|
|
Debug.WriteLine("sent login message");
|
|
readBytes = stream.Read(recvBuf, 0, recvBuf.Length);
|
|
Debug.WriteLine("read {0}", readBytes);
|
|
}
|
|
|
|
public Messages.GetPoolStatus GetPoolStatus()
|
|
{
|
|
client.GetStream().SendHLMessage(Messages.GetPoolStatus.QUERY(0));
|
|
Debug.WriteLine("sent status message");
|
|
return new Messages.GetPoolStatus(getMessage(client.GetStream()));
|
|
}
|
|
|
|
public Messages.GetControllerConfig GetControllerConfig()
|
|
{
|
|
client.GetStream().SendHLMessage(Messages.GetControllerConfig.QUERY(0));
|
|
Debug.WriteLine("sent controller config message");
|
|
return new Messages.GetControllerConfig(getMessage(client.GetStream()));
|
|
}
|
|
|
|
public Messages.GetMode GetMode()
|
|
{
|
|
client.GetStream().SendHLMessage(Messages.GetMode.QUERY(0));
|
|
Debug.WriteLine("sent get-mode message");
|
|
return new Messages.GetMode(getMessage(client.GetStream()));
|
|
}
|
|
|
|
private static Messages.HLMessage getMessage(NetworkStream ns)
|
|
{
|
|
int bytesRead = 0;
|
|
byte[] headerBuffer = new byte[8];
|
|
while (bytesRead < 8)
|
|
{
|
|
try
|
|
{
|
|
bytesRead += ns.Read(headerBuffer, bytesRead, 8 - bytesRead);
|
|
if (bytesRead < 0)
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
catch { }
|
|
}
|
|
int msgDataSize = Messages.HLMessage.extractDataSize(headerBuffer);
|
|
if (msgDataSize <= 0 || msgDataSize >= 100000)
|
|
{
|
|
return null;
|
|
}
|
|
byte[] dataBuffer = new byte[msgDataSize];
|
|
bytesRead = 0;
|
|
while (bytesRead < msgDataSize)
|
|
{
|
|
bytesRead += ns.Read((byte[])(Array)dataBuffer, bytesRead, msgDataSize - bytesRead);
|
|
if (bytesRead < 0)
|
|
{
|
|
return null;
|
|
}
|
|
}
|
|
return new Messages.HLMessage(headerBuffer, dataBuffer);
|
|
}
|
|
|
|
private static string connectionMessage = "CONNECTSERVERHOST";
|
|
private byte[] CreateConnectServerSoftMessage()
|
|
{
|
|
int iLen = connectionMessage.Length;
|
|
byte[] bytes = new byte[(iLen + 4)];
|
|
var connBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(connectionMessage);
|
|
for (int i = 0; i < iLen; i++)
|
|
{
|
|
bytes[i] = connBytes[i];
|
|
}
|
|
bytes[iLen + 0] = (byte)'\r';
|
|
bytes[iLen + 1] = (byte)'\n';
|
|
bytes[iLen + 2] = (byte)'\r';
|
|
bytes[iLen + 3] = (byte)'\n';
|
|
return bytes;
|
|
}
|
|
|
|
private Messages.HLMessage createLoginMessage(byte[] encodedPwd)
|
|
{
|
|
Messages.ClientLogin login = new Messages.ClientLogin((short)0, (short)27);
|
|
login.m_schema = 348;
|
|
login.m_connectionType = 0;
|
|
login.m_version = "Android";
|
|
if (encodedPwd.Length > 16)
|
|
{
|
|
byte[] temp = new byte[16];
|
|
for (int i = 0; i < 16; i++)
|
|
{
|
|
temp[i] = encodedPwd[i];
|
|
}
|
|
login.m_byteArray = temp;
|
|
}
|
|
else
|
|
{
|
|
login.m_byteArray = encodedPwd;
|
|
}
|
|
login.m_procID = 2;
|
|
return login;
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
if (client != null)
|
|
{
|
|
client.Dispose();
|
|
}
|
|
}
|
|
}
|
|
}
|