private async Task _ReceiveAsync() { await Task.Run(async() => { bool error = false; while (true) { try { if (TcpClient.Available > 0) { byte[] buffer = new byte[TcpClient.Available]; var size = await NetworkStream.ReadAsync(buffer, 0, TcpClient.Available); Device.BeginInvokeOnMainThread(() => { MessageReceived?.Invoke(this, buffer); TranspondCharacteristicWrapper.Value = buffer; TranspondCharacteristicWrapper.NotifyAll(); }); } } catch (Exception exception) { Debug.WriteLine(exception.Message); error = true; break; } } if (error) { State = TcpConnState.Error; StateChanged?.Invoke(this, State); } }); }
public TcpTranspondServiceWrapper(IBluetoothManager bluetoothManager) { BluetoothManager = bluetoothManager; TranspondCharacteristicWrapper = new TranspondCharacteristicWrapper(bluetoothManager); IGattServiceBuilder builder = bluetoothManager.NewGattServiceBuilder(); GattServerService = builder.SetUuid(Uuid) .AddCharacteristics(TranspondCharacteristicWrapper.GattServerCharacteristic) .Build(); TranspondCharacteristicWrapper.GattServerCharacteristic.OnRead += GattServerCharacteristic_OnRead; TranspondCharacteristicWrapper.GattServerCharacteristic.OnWrite += GattServerCharacteristic_OnWrite; State = TcpConnState.Created; TcpClient = new TcpClient(); }
public async Task SendAsync(byte[] message) { if (NetworkStream == null) { throw new NotImplementedException("NetworkStream is null"); } try { await NetworkStream.WriteAsync(message, 0, message.Length); } catch (Exception exception) { Debug.WriteLine(exception); State = TcpConnState.Error; StateChanged?.Invoke(this, State); } }
/// <summary> /// Will Retry connect until you cancel it /// </summary> public async Task ConnectAsync() { await Task.Run(async() => { if (State != TcpConnState.Created) { throw new NotImplementedException("WTF"); } State = TcpConnState.Connecting; StateChanged?.Invoke(this, State); bool successful = false; while (!successful && !_CancelConnect) { try { await TcpClient.ConnectAsync(IPEndPoint.Address, IPEndPoint.Port); successful = true; } catch (Exception e) { Debug.WriteLine(e.Message); continue; } } if (_CancelConnect) { State = TcpConnState.Created; TcpClient = new TcpClient(); _CancelConnect = false; StateChanged?.Invoke(this, State); } else if (successful) { State = TcpConnState.Connected; NetworkStream = TcpClient.GetStream(); StateChanged?.Invoke(this, State); _ReceiveTask = _ReceiveAsync(); } }); }
public void Restore() { if (State == TcpConnState.Error) { try { NetworkStream.Close(); } catch (Exception) { } try { TcpClient.Close(); } catch (Exception) { } TcpClient = new TcpClient(); NetworkStream = null; State = TcpConnState.Created; StateChanged?.Invoke(this, State); } }