diff --git a/Kaenx.Konnect/Connections/KnxIpRouting.cs b/Kaenx.Konnect/Connections/KnxIpRouting.cs index 8955c42..5c530d7 100644 --- a/Kaenx.Konnect/Connections/KnxIpRouting.cs +++ b/Kaenx.Konnect/Connections/KnxIpRouting.cs @@ -37,7 +37,6 @@ public class KnxIpRouting : IKnxConnection public UnicastAddress PhysicalAddress { get; set; } private ProtocolTypes CurrentType { get; set; } = ProtocolTypes.cEmi; - private byte _communicationChannel; private bool StopProcessing = false; private byte _sequenceCounter = 0; @@ -45,7 +44,6 @@ public class KnxIpRouting : IKnxConnection private List _udpList = new List(); private readonly BlockingCollection _sendMessages; private readonly ReceiverParserDispatcher _receiveParserDispatcher; - private bool _flagCRRecieved = false; /* public KnxIpRouting(string ip = "224.0.23.12", int port = 3671) @@ -128,7 +126,7 @@ private void Init(string ip, int port) ProcessReceivingMessages(client); IsConnected = true; - + ConnectionChanged?.Invoke(true); } public static int GetFreePort() @@ -181,20 +179,21 @@ public void Search() //Send(new MsgSearchReq()); } - public async Task Connect() + public Task Connect() { //Nothing to do here - + return Task.CompletedTask; } - public async Task Disconnect() + public Task Disconnect() { //Nothing to do here + return Task.CompletedTask; } - public async Task SendStatusReq() + public Task SendStatusReq() { - return true; + return Task.FromResult(true); } diff --git a/Kaenx.Konnect/Connections/KnxRemote.cs b/Kaenx.Konnect/Connections/KnxRemote.cs deleted file mode 100644 index 85bff43..0000000 --- a/Kaenx.Konnect/Connections/KnxRemote.cs +++ /dev/null @@ -1,198 +0,0 @@ -using Kaenx.Konnect.Addresses; -using Kaenx.Konnect.Interfaces; -using Kaenx.Konnect.Messages; -using Kaenx.Konnect.Remote; -using Newtonsoft.Json; -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Net.WebSockets; -using System.Text; -using System.Threading; -using System.Threading.Tasks; - -namespace Kaenx.Konnect.Connections -{ - public class KnxRemote : IKnxConnection - { - public string Group { get; set; } - public int ChannelId { get; set; } - public bool IsConnected { get; set; } - public ConnectionErrors LastError { get; set; } - public UnicastAddress PhysicalAddress { get; set; } = UnicastAddress.FromString("1.1.255"); - public int SequenceNumber - { - get { return _sequenceNumber; } - set - { - _sequenceNumber = value; - if (_sequenceNumber > 255) - _sequenceNumber = 0; - } - } - - public event IKnxConnection.TunnelRequestHandler OnTunnelRequest; - public event IKnxConnection.TunnelResponseHandler OnTunnelResponse; - public event IKnxConnection.TunnelAckHandler OnTunnelAck; - public event IKnxConnection.SearchResponseHandler OnSearchResponse; - public event IKnxConnection.SearchRequestHandler OnSearchRequest; - public event IKnxConnection.ConnectionChangedHandler ConnectionChanged; - - private ClientWebSocket socket { get; set; } = new ClientWebSocket(); - private CancellationTokenSource ReceiveTokenSource { get; set; } - private Dictionary Responses { get; set; } = new Dictionary(); - - private string Hash; - private int _sequenceNumber = 0; - private int _connId = 0; - private RemoteConnection _conn; - private IKnxConnection _knxConn; - - public KnxRemote(string hash, RemoteConnection conn) - { - Hash = hash; - _conn = conn; - - _conn.OnRequest += _conn_OnRequest; - - for (int i = 0; i < 256; i++) - { - Responses.Add(i, null); - } - } - - public async Task Init(KnxInterfaceHelper.GetUsbDeviceHandler getDevice) - { - IKnxInterface inter = _conn.GetInterface(Hash); - Debug.WriteLine("Request to Connect to: " + inter.Name); - _knxConn = await KnxInterfaceHelper.GetConnection(inter, _conn, getDevice); - _knxConn.OnTunnelResponse += OnTunnelActivity; - _knxConn.OnTunnelRequest += OnTunnelActivity; - } - - public async Task ConnectToInterface(TunnelRequest req) - { - try - { - _connId = new Random().Next(1, 255); - await _knxConn.Connect(); - TunnelResponse res = new TunnelResponse(); - res.Type = TunnelTypes.Connect; - res.SequenceNumber = req.SequenceNumber; - res.Group = req.Group; - res.ChannelId = req.ChannelId; - res.ConnId = _connId; - Group = req.Group; - ChannelId = req.ChannelId; - _ = _conn.Send(res, false); - } - catch (Exception ex) - { - TunnelResponse res = new TunnelResponse(); - res.Group = req.Group; - res.ChannelId = req.ChannelId; - res.ConnId = 0; - res.Data = Encoding.UTF8.GetBytes(ex.Message); - _ = _conn.Send(res, false); - } - - return _connId; - } - - private async void _conn_OnRequest(IRemoteMessage message) - { - if (message is TunnelRequest) - { - TunnelRequest req = message as TunnelRequest; - if (req.ConnId != 0 && req.ConnId != _connId) return; - - switch (req.Type) - { - case TunnelTypes.Tunnel: - IMessage msg = (IMessage)JsonConvert.DeserializeObject(Encoding.UTF8.GetString(req.Data), new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.Auto }); - Debug.WriteLine("Tunnel: " + msg); - byte seq = await _knxConn.Send(msg); - - TunnelResponse req2 = new TunnelResponse(new byte[] { seq }); - req2.Type = TunnelTypes.Response; - req2.ConnId = req.ConnId; - req2.SequenceNumber = req.SequenceNumber; - _ = _conn.Send(req2, false); - break; - } - } - } - - private void OnTunnelActivity(IMessage message) - { - TunnelResponse req = new TunnelResponse(); - req.Type = TunnelTypes.Tunnel; - req.ConnId = _connId; - req.Data = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message, new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All })); - _ = _conn.Send(req, false); - } - - public async Task Connect() - { - Debug.WriteLine(DateTime.Now); - TunnelRequest req = new TunnelRequest(Encoding.UTF8.GetBytes(Hash)); - req.Type = TunnelTypes.Connect; - IRemoteMessage resp = await _conn.Send(req); - - if (resp == null) - throw new Exception("Keine Antwort vom Remote Server"); - - TunnelResponse response = resp as TunnelResponse; - if (response == null) - throw new Exception("Unerwartete Antwort vom Remote Server: " + response.ToString()); - - IsConnected = true; - _connId = response.ConnId; - Debug.WriteLine(DateTime.Now); - Debug.WriteLine("Verbunden"); - } - - public async Task Disconnect() - { - IsConnected = false; - - _conn.RemoveInterface(_connId); - } - - public Task Send(byte[] data, bool ignoreConnected = false) - { - throw new NotImplementedException(); - } - - public async Task Send(IMessage message, bool ignoreConnected = false) - { - if (!ignoreConnected && !IsConnected) - throw new Exception("Not connected with interface"); - - - Debug.WriteLine("Sende nun einen normalen Request"); - Debug.WriteLine("------------------------------------------------------------------------------------"); - - TunnelRequest req = new TunnelRequest(); - req.Type = TunnelTypes.Tunnel; - req.ConnId = _connId; - req.Data = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message, new JsonSerializerSettings() { TypeNameHandling = TypeNameHandling.All })); - - IRemoteMessage resp = await _conn.Send(req); - - if (resp is TunnelResponse) - { - return (resp as TunnelResponse).Data[0]; - } - - return 0; - } - - public Task SendStatusReq() - { - throw new NotImplementedException(); - } - - - } -} \ No newline at end of file diff --git a/Kaenx.Konnect/Connections/KnxUsbTunneling.cs b/Kaenx.Konnect/Connections/KnxUsbTunneling.cs deleted file mode 100644 index 6c505b5..0000000 --- a/Kaenx.Konnect/Connections/KnxUsbTunneling.cs +++ /dev/null @@ -1,317 +0,0 @@ -using Device.Net; -using Kaenx.Konnect.Addresses; -using Kaenx.Konnect.Builders; -using Kaenx.Konnect.Messages; -using Kaenx.Konnect.Messages.Request; -using System; -using System.Collections; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using static Kaenx.Konnect.Connections.IKnxConnection; - -namespace Kaenx.Konnect.Connections -{ - public class KnxUsbTunneling : IKnxConnection - { - public bool IsConnected { get; set; } - - public event TunnelRequestHandler OnTunnelRequest; - public event TunnelResponseHandler OnTunnelResponse; - public event TunnelAckHandler OnTunnelAck; - public event SearchResponseHandler OnSearchResponse; - public event SearchRequestHandler OnSearchRequest; - public event ConnectionChangedHandler ConnectionChanged; - - private readonly BlockingCollection _sendMessages; - private IDevice DeviceKnx { get; } - private ProtocolTypes CurrentType { get; set; } - public ConnectionErrors LastError { get; set; } - public UnicastAddress PhysicalAddress { get; set; } - - - public KnxUsbTunneling(IDevice device) - { - DeviceKnx = device; - _sendMessages = new BlockingCollection(); - } - - - //TODO Adresse der Schnitstelle schreibt man im Speicher an Adresse 279 - - public async Task Connect() - { - byte[] packet = new byte[64]; //Create packet which will be fixed 64 bytes long - - //Report Header - packet[0] = 1; //Report Id (fixed) - packet[1] = 0x13; // First Packet with start and end - packet[2] = 9; // Data length - - //Transfer Header - packet[3] = 0; // Version fixed 0 - packet[4] = 8; // Header length - packet[5] = 0; // Body length - packet[6] = 1; // Body length - packet[7] = 0x0F; // Protocol ID - packet[8] = 0x01; // Service Identifier - packet[9] = 0; // Manufacturer Code - packet[10] = 0; // Manufacturer Code - - // Body - packet[11] = 1; // Supported Emis - - bool isInited = DeviceKnx.IsInitialized; - - if (!isInited) - { - try - { - await DeviceKnx.InitializeAsync(); - } - catch - { - throw new Exception("Es konnte keine Verbindung mit dem USB Gerät hergestellt werden."); - } - } - - CancellationTokenSource source = new CancellationTokenSource(1000); - - TransferResult read = await DeviceKnx.WriteAndReadAsync(packet, source.Token); - - BitArray emis = new BitArray(new byte[] { read.Data[13] }); - - if (emis.Get(2)) - { - Debug.WriteLine("USB: Verwende cEmi"); - CurrentType = ProtocolTypes.cEmi; - } else if (emis.Get(1)) - { - Debug.WriteLine("USB: Verwende Emi2"); - CurrentType = ProtocolTypes.Emi2; - } else if (emis.Get(0)) - { - CurrentType = ProtocolTypes.Emi1; - Debug.WriteLine("USB: Verwende Emi1"); - } else - { - Debug.WriteLine("USB: unterstützt kein Emi1/Emi2/cEmi"); - } - - - packet[6] = 0x02; - packet[8] = 0x03; //Device Feature Set - packet[11] = 0x05; //Set Emi Type - packet[12] = Convert.ToByte(CurrentType); //Selected Emi type - - source = new CancellationTokenSource(1000); - await DeviceKnx.WriteAsync(packet, source.Token); - - packet[6] = 0x01; - packet[8] = 0x01; //Device Feature Get - packet[11] = 0x03; //Bus Status - packet[12] = 0x00; - - source = new CancellationTokenSource(1000); - read = await DeviceKnx.WriteAndReadAsync(packet, source.Token); - - int status = read.Data[12]; - - if(status == 0) - { - throw new Exception("Schnittstelle hat keine Verbindung zum Bus."); - } - - - packet[2] = 0x0c; - packet[6] = 0x04; //Body length - packet[7] = 0x01; //Tunnel - packet[8] = Convert.ToByte(CurrentType); //Selected Emi - packet[11] = 0x4c; //Memory Read - packet[12] = 0x02; //Length - packet[13] = 0x01; //Address High - packet[14] = 0x17; //Address Low - - source = new CancellationTokenSource(1000); - read = await DeviceKnx.WriteAndReadAsync(packet, source.Token); - - PhysicalAddress = UnicastAddress.FromByteArray(new byte[] { read.Data[15], read.Data[16] }); - - if (source.IsCancellationRequested) - { - DeviceKnx.Close(); - throw new Exception("Schnittstelle antwortet nicht."); - } - - IsConnected = true; - ConnectionChanged?.Invoke(true); - - ProcessReceiveMessages(); - ProcessSendMessages(); - } - - public async Task Disconnect() - { - DeviceKnx.Close(); - DeviceKnx.Dispose(); - } - - public async Task Send(byte[] data, bool ignoreConnected = false) - { - throw new NotImplementedException(); - } - - public async Task Send(IMessage message, bool ignoreConnected = false) - { - if (!ignoreConnected && !IsConnected) - throw new Exception("Roflkopter"); - - _sendMessages.Add(message); - - return 0x01; - } - - public async Task SendStatusReq() - { - byte[] packet = new byte[64]; //Create packet which will be fixed 64 bytes long - - //Report Header - packet[0] = 1; // Report ID fixed 1; - packet[1] = 0x13; // First Packet with start and end - packet[2] = 9; // Data length - - - //Transfer Header - packet[3] = 0; // Version fixed 0 - packet[4] = 8; // Header length - packet[5] = 0; // Body length - packet[6] = 1; // Body length - packet[7] = 0x0F; // Protocol ID - packet[8] = 0x01; // Service Identifier - packet[9] = 0; // Manufacturer Code - packet[10] = 0; // Manufacturer Code - - // Body - packet[11] = 3; // Bus Status - - await DeviceKnx.InitializeAsync(); - - await DeviceKnx.WriteAsync(packet); - - DeviceKnx.Close(); - - return true; - } - - private void ProcessReceiveMessages() - { - Task.Run(async () => - { - while(true) - { - try - { - //CancellationTokenSource source = new CancellationTokenSource(1000); - TransferResult res = await DeviceKnx.ReadAsync(); // source.Token); - } - catch - { - - } - } - }); - } - - - private void ProcessSendMessages() - { - Task.Run(async () => - { - while(true) - { - foreach (var sendMessage in _sendMessages.GetConsumingEnumerable()) - { - try - { - if (sendMessage is byte[]) - { - - - } - else if (sendMessage is MsgSearchReq) - { - return; //SearchRequest not supported on USB - } - else if (sendMessage is IMessage) - { - IMessage message = sendMessage as IMessage; - message.SourceAddress = UnicastAddress.FromString("0.0.0"); - List xdata = new List(); - - //Report Header - xdata.Add(0x01); //Report ID fixed 1 - xdata.Add(0x13); //First Packet with start and end - xdata.Add(0x09); //Data Length - - //Transfer Header - xdata.Add(0x00); //Protocoll Version - xdata.Add(0x08); //Header Length fixed - xdata.Add(0x00); //Body Length - xdata.Add(0x08); //Body Length - xdata.Add(0x01); //Protocol ID 1=KNX Tunnel - xdata.Add(0x01); //EMI Version 1=EMI1 - xdata.Add(0x00); //Manufacturer Code - xdata.Add(0x00); //Manufacturer Code - - - byte[] body; - - switch (CurrentType) - { - case ProtocolTypes.Emi1: - body = message.GetBytesEmi1(); - break; - - case ProtocolTypes.Emi2: - body = message.GetBytesEmi1(); //Todo check diffrences between emi1 - //xdata.AddRange(message.GetBytesEmi2()); - break; - - case ProtocolTypes.cEmi: - body = message.GetBytesCemi(); - break; - - default: - throw new Exception("Unbekanntes Protokoll"); - } - - xdata[2] = (byte)(body.Length + xdata[4] - 1); - xdata[6] = (byte)(body.Length - 1); - - xdata.AddRange(body); - - - - int toadd = (64 - xdata.Count); - for (int i = 0; i < toadd; i++) - xdata.Add(0x00); - - CancellationTokenSource source = new CancellationTokenSource(1000); - - await DeviceKnx.WriteAsync(xdata.ToArray(), source.Token); - } - } - catch - { - - } - } - } - }); - } - } -} diff --git a/Kaenx.Konnect/Connections/RemoteConnection.cs b/Kaenx.Konnect/Connections/RemoteConnection.cs deleted file mode 100644 index 06bb429..0000000 --- a/Kaenx.Konnect/Connections/RemoteConnection.cs +++ /dev/null @@ -1,337 +0,0 @@ -using Kaenx.Konnect.Connections; -using Kaenx.Konnect.Interfaces; -using Kaenx.Konnect.Remote; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Diagnostics; -using System.Linq; -using System.Net.WebSockets; -using System.Reflection; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using static Kaenx.Konnect.Interfaces.KnxInterfaceHelper; - -namespace Kaenx.Konnect.Connections -{ - public class RemoteConnection : INotifyPropertyChanged - { - public event PropertyChangedEventHandler PropertyChanged; - - - private CancellationTokenSource source = new CancellationTokenSource(); - private CancellationTokenSource ReceiveTokenSource { get; set; } - private Dictionary Responses { get; set; } = new Dictionary(); - private Dictionary Remotes { get; set; } = new Dictionary(); - - - private ClientWebSocket socket { get; set; } = new ClientWebSocket(); - - public delegate void MessageHandler(IRemoteMessage message); - public event MessageHandler OnRequest; - public event MessageHandler OnResponse; - - - public delegate IKnxInterface RequestHandler(string hash); - public event RequestHandler OnRequestInterface; - - - private bool _isActive = false; - public bool IsActive - { - get { return _isActive; } - set { _isActive = value; Changed("IsActive"); } - } - - private bool _isConnected = false; - public bool IsConnected - { - get { return _isConnected; } - set { _isConnected = value; Changed("IsConnected"); } - } - - - private string _state = "Getrennt"; - public string State - { - get { return _state; } - set { _state = value; Changed("State"); } - } - - - private int _sequenceNumber = 0; - public int SequenceNumber - { - get { return _sequenceNumber; } - set - { - _sequenceNumber = value; - if (_sequenceNumber > 255) - _sequenceNumber = 0; - } - } - public string Group { get; set; } - public string GroupRemote { get; set; } - public int ChannelId { get; set; } - public string Hostname { get; private set; } - public string Authentification { get; private set; } - - - private GetUsbDeviceHandler getUsbHandler; - - - - - public RemoteConnection(GetUsbDeviceHandler getDevice) - { - getUsbHandler = getDevice; - socket.Options.AddSubProtocol("chat"); - - for (int i = 0; i < 256; i++) - { - Responses.Add(i, null); - } - } - - - public async Task Connect(string host, string auth, bool isSecure, string group = null, string code = null) - { - Hostname = host; - Authentification = auth; - State = "Verbinde..."; - IsActive = true; - - try - { - socket = new ClientWebSocket(); - socket.Options.AddSubProtocol("chat"); - await socket.ConnectAsync(new Uri((isSecure ? "wss://":"ws://") + host), source.Token); - int seq = SequenceNumber++; - AuthRequest msg = new AuthRequest(auth, seq, group, code); - ReceiveTokenSource = new CancellationTokenSource(); - ProcessReceivingMessages(); - await socket.SendAsync(msg.GetBytes(), WebSocketMessageType.Binary, true, source.Token); - IRemoteMessage resp = await WaitForResponse(seq); - - if (resp is StateResponse) - { - StateResponse response = (StateResponse)resp; - switch (response.Code) - { - case StateCodes.WrongKey: - throw new Exception("Authentifizierung am Server fehlgeschlagen"); - - case StateCodes.GroupNotFound: - throw new Exception("Angegebene Gruppe ist nicht auf dem Server vorhanden"); - - case StateCodes.WrongGroupKey: - throw new Exception("Authentifizierung in der Gruppe fehlgeschlagen"); - } - } - else if (resp is AuthResponse) - { - AuthResponse response = (AuthResponse)resp; - Group = response.Group; - State = "Verbunden (" + Group + ")"; - } else - { - throw new Exception("Ungültige Antwort erhalten: " + resp.GetType().ToString()); - } - } catch(Exception ex) - { - State = ex.Message; - IsActive = false; - IsConnected = false; - } - } - - public async Task Send(IRemoteMessage message, bool waitForResponse = true) - { - if (socket == null || socket.State != WebSocketState.Open) - { - return null; - } - IRemoteMessage mesg = null; - - try - { - if(message.SequenceNumber == -1) message.SequenceNumber = SequenceNumber++; - if (message is TunnelRequest) - { - TunnelRequest req = message as TunnelRequest; - if (req.ChannelId == 0 && Remotes.ContainsKey(req.ConnId)) - { - req.ChannelId = Remotes[req.ConnId].ChannelId; - } else - { - req.ChannelId = ChannelId; - } - - if (req.Group == "" && Remotes.ContainsKey(req.ConnId)) - { - req.Group = Remotes[req.ConnId].Group; - } else - { - req.Group = GroupRemote; - } - } - if (message is TunnelResponse) - { - TunnelResponse res = message as TunnelResponse; - if (res.ChannelId == 0 && Remotes.ContainsKey(res.ConnId)) - { - res.ChannelId = Remotes[res.ConnId].ChannelId; - } - else if(res.ChannelId == 0) - { - res.ChannelId = ChannelId; - } - - if (res.Group == "" && Remotes.ContainsKey(res.ConnId)) - { - res.Group = Remotes[res.ConnId].Group; - } - else if( res.Group == "0") - { - res.Group = GroupRemote; - } - } - if(message is SearchRequest) - { - (message as SearchRequest).Group = Group; - } - await socket.SendAsync(message.GetBytes(), WebSocketMessageType.Binary, true, source.Token); - mesg = await WaitForResponse(message.SequenceNumber); - }catch(Exception ex) - { - - } - - return mesg; - } - - public async Task Disconnect() - { - if ( socket != null && socket.State == WebSocketState.Open) - await socket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Übertragung beendet", source.Token); - - IsActive = false; - State = "Getrennt"; - } - - - private async Task WaitForResponse(int seq) - { - Responses[seq] = null; - CancellationTokenSource source = new CancellationTokenSource(10000); - while (Responses[seq] == null && !source.Token.IsCancellationRequested) - await Task.Delay(1000); - - return Responses[seq]; - } - - - private void ProcessReceivingMessages() - { - Task.Run(async () => - { - while (socket.State == WebSocketState.Open) - { - ArraySegment buffer; - WebSocketReceiveResult result = null; - try - { - buffer = new ArraySegment(new byte[1024]); - result = await socket.ReceiveAsync(buffer, ReceiveTokenSource.Token); - } - catch (Exception ex) - { - socket = null; - IsActive = false; - IsConnected = false; - return; - } - - if (result == null || result.Count == 0) continue; - - Kaenx.Konnect.Remote.MessageCodes code = (Konnect.Remote.MessageCodes)buffer.Array[0]; - - Debug.WriteLine("Got Remote Message: " + code); - - //Check if assemby from this genügt - var q = from t in Assembly.LoadFrom("Kaenx.Konnect.dll").GetTypes() - where t.IsClass && t.IsNested == false && t.Namespace == "Kaenx.Konnect.Remote" - select t; - - IRemoteMessage message = null; - - foreach (Type t in q.ToList()) - { - IRemoteMessage down = (IRemoteMessage)Activator.CreateInstance(t); - if (down != null && code == down.MessageCode) - { - message = down; - break; - } - } - - if (message == null) - { - Debug.WriteLine("Unbekannte Nachricht: " + code); - } - try - { - message.Parse(buffer.Array.Take(result.Count).ToArray()); - } - catch (Exception ex) - { - - } - - if(message is TunnelRequest && (message as TunnelRequest).Type == TunnelTypes.Connect) - { - TunnelRequest req = message as TunnelRequest; - KnxRemote rem = new KnxRemote(Encoding.UTF8.GetString(req.Data), this); - await rem.Init(getUsbHandler); - int connId = await rem.ConnectToInterface(req); - Remotes.Add(connId, rem); - continue; - } - - - if (message.ToString().EndsWith("Response")) - { - Responses[message.SequenceNumber] = message; - OnResponse?.Invoke(message); - } - else - { - OnRequest?.Invoke(message); - } - } - - Debug.WriteLine("Verbindung abgebrochen"); - }); - } - - - public IKnxInterface GetInterface(string hash) - { - IKnxInterface inter = OnRequestInterface?.Invoke(hash); - return inter; - } - - public void RemoveInterface(int connId) - { - Remotes.Remove(connId); - } - - - - private void Changed(string name) - { - PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name)); - } - } -} diff --git a/Kaenx.Konnect/Interfaces/KnxInterfaceHelper.cs b/Kaenx.Konnect/Interfaces/KnxInterfaceHelper.cs deleted file mode 100644 index 752598c..0000000 --- a/Kaenx.Konnect/Interfaces/KnxInterfaceHelper.cs +++ /dev/null @@ -1,36 +0,0 @@ -using Device.Net; -using Kaenx.Konnect.Connections; -using Kaenx.Konnect.Remote; -using System; -using System.Collections.Generic; -using System.Net; -using System.Text; -using System.Threading.Tasks; - -namespace Kaenx.Konnect.Interfaces -{ - public class KnxInterfaceHelper - { - public delegate Task GetUsbDeviceHandler(KnxInterfaceUsb inter); - - public static async Task GetConnection(IKnxInterface inter, RemoteConnection conn, GetUsbDeviceHandler getDevice) - { - switch (inter) - { - case KnxInterfaceUsb interUsb: - IDevice dev = await getDevice(interUsb); - return new KnxUsbTunneling(dev); - - case KnxInterfaceIp interIp: - return new KnxIpTunneling(interIp.Endpoint); //TODO check for Routing - - case KnxInterfaceRemote interRem: - KnxRemote rconn = new KnxRemote(interRem.RemoteHash, conn); - await rconn.Init(getDevice); - return rconn; // TODO check if needed - } - - throw new Exception("Für das Interface gibt es keine Connection " + inter.ToString()); - } - } -} diff --git a/Kaenx.Konnect/Interfaces/KnxInterfaceUsb.cs b/Kaenx.Konnect/Interfaces/KnxInterfaceUsb.cs deleted file mode 100644 index ecf3643..0000000 --- a/Kaenx.Konnect/Interfaces/KnxInterfaceUsb.cs +++ /dev/null @@ -1,92 +0,0 @@ -using Device.Net; -using Hid.Net.Windows; -using Usb.Net.Windows; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text; -using System.Threading.Tasks; -using System.Xml.Linq; -using Microsoft.Extensions.Logging; -using System.Runtime.Serialization; -using Newtonsoft.Json; - -namespace Kaenx.Konnect.Interfaces -{ - [Serializable] - public class KnxInterfaceUsb : IKnxInterface - { - public string Name { get; set; } - [field: NonSerialized] - public ConnectedDeviceDefinition ConnDefinition { get; set; } - public string Serial { get; set; } - public DateTime LastFound { get; set; } - public bool IsRemote { get; } = false; - public Type InterfaceType - { - get - { - return this.GetType(); - } - } - - - public static KnxInterfaceUsb CheckHid(ConnectedDeviceDefinition def) - { - var assembly = Assembly.GetExecutingAssembly(); - string resourceName = assembly.GetManifestResourceNames().Single(str => str.EndsWith("knx_interfaces.xml")); - - using (Stream stream = assembly.GetManifestResourceStream(resourceName)) - using (StreamReader reader = new StreamReader(stream)) - { - string result = reader.ReadToEnd(); - XDocument doc = XDocument.Parse(result); - var inters = doc.Descendants(XName.Get("Interface")); - - if (!inters.Any(inter => inter.Attribute("VendorID").Value == Convert.ToInt32(def.VendorId).ToString("X") && inter.Attribute("ProductID").Value == Convert.ToInt32(def.ProductId).ToString("X"))) - return null; - - XElement xinter = inters.Single(inter => inter.Attribute("VendorID").Value == Convert.ToInt32(def.VendorId).ToString("X") && inter.Attribute("ProductID").Value == Convert.ToInt32(def.ProductId).ToString("X")); - IEnumerable trans = xinter.Descendants(XName.Get("Translation")); - - string name = xinter.Attribute("DefaultDisplayText").Value; - string current = System.Globalization.CultureInfo.CurrentCulture.Name; - - if(trans.Any(t => t.Attribute("Language").Value == current)) - { - XElement translation = trans.Single(t => t.Attribute("Language").Value == current); - name = translation.Attribute("Text").Value; - } else if(trans.Any(t => t.Attribute("Language").Value.StartsWith(current.Substring(0, 3)))){ - XElement translation = trans.First(t => t.Attribute("Language").Value.StartsWith(current.Substring(0, 3))); - name = translation.Attribute("Text").Value; - } - - - return new KnxInterfaceUsb() - { - Name = name, - ConnDefinition = def - }; - } - } - - - public string Description - { - get - { - return "USB Gerät kommt hier ganz viel rein" + (IsRemote ? "Remote" : ""); - } - } - - public string Hash - { - get - { - return Name + "#USB#" + Serial + (IsRemote ? " Remote" : ""); - } - } - } -} diff --git a/Kaenx.Konnect/Kaenx.Konnect.csproj b/Kaenx.Konnect/Kaenx.Konnect.csproj index e88334c..5687bca 100644 --- a/Kaenx.Konnect/Kaenx.Konnect.csproj +++ b/Kaenx.Konnect/Kaenx.Konnect.csproj @@ -4,20 +4,20 @@ netstandard2.0 true de - 0.1.4.0 - 0.1.4.0 + 1.0.0.0 + 1.0.0.0 Bibliothek für den Zugriff auf den KNX Bus mittels IP oder USB. - 0.1.4 + 1.0.0 Logo.png knx, bus, communication Verbesserungen bei der Buskommunikation License - https://github.com/thewhobox/Kaenx.Konnect - https://github.com/thewhobox/Kaenx.Konnect + https://github.com/OpenKnx/Kaenx-Konnect + https://github.com/OpenKnx/Kaenx-Konnect Github true - 2020 - Mike Gerst + 2023 - Mike Gerst 8.0 Logo.ico @@ -42,11 +42,8 @@ - - - diff --git a/Readme.md b/Readme.md index 538a7d3..653598f 100644 --- a/Readme.md +++ b/Readme.md @@ -5,10 +5,10 @@ [Nuget Package](https://www.nuget.org/packages/Kaenx.Konnect/) is availible. Kaenx.Konnect is a library to connect to a KNX Interface. -Its supports IP Tunneling, USB* and IP Routing*. +Its supports IP Tunneling, USB* and IP Routing. -*Not implemented yet +*Not fully implemented yet, need of additional nuget package # How to use