| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 | using System;using System.Text;using System.Threading.Tasks;using Plugin.BLE.Abstractions;namespace InABox.Avalonia.Platform.iOS;public class iOS_ConnectedBluetoothDevice(IBluetoothDevice device)    : IConnectedBluetoothDevice{    public void Dispose()    {        Device.Dispose();    }    public iOS_BluetoothDevice Device { get; } = (iOS_BluetoothDevice)device;    public string ID => Device.ID;    public string Name => Device.Name;    public Guid[] AvailableServices => Device.AvailableServices;    public DateTime LastSeen    {        get => Device.LastSeen;         set => device.LastSeen = value;    }    public byte[]? ManufacturerData    {        get => Device.ManufacturerData;         set => Device.ManufacturerData = value;    }        public async Task<bool> WriteBytesAsync(Guid serviceid, Guid characteristicid, byte[] data)    {        System.Diagnostics.Debug.WriteLine($"{DateTime.Now:O} WriteBytesAsync::Getting Service {serviceid}...");        using (var service = await Device.Native.GetServiceAsync(serviceid))        {            if (service == null)            {                System.Diagnostics.Debug.WriteLine($"{DateTime.Now:O} WriteBytesAsync::Failed to find service");                return false;            }            System.Diagnostics.Debug.WriteLine($"{DateTime.Now:O} WriteBytesAsync::Getting Characteritsic {characteristicid}...");            var characteristic = await service.GetCharacteristicAsync(characteristicid);                        if (characteristic == null)            {                System.Diagnostics.Debug.WriteLine($"{DateTime.Now:O} WriteBytesAsync::Failed to find characteristic");                return false;            }            System.Diagnostics.Debug.WriteLine($"{DateTime.Now:O} WriteBytesAsync::Writing [{string.Join(" ",data.Select(x=>$"{x:X2}"))}]...");                        // for some reason the async call fails randomly            //var result = await characteristic.WriteAsync(data);                        // So lets hack in a one-second timeout...            var writeTask = characteristic.WriteAsync(data);            var waitTask = Task.Delay(1000);            await Task.WhenAny(writeTask, waitTask);            if (writeTask.Status == TaskStatus.RanToCompletion)            {                System.Diagnostics.Debug.WriteLine($"{DateTime.Now:O} WriteBytesAsync::Wrote {writeTask.Result} bytes.");                return writeTask.Result == data.Length;            }            System.Diagnostics.Debug.WriteLine($"{DateTime.Now:O} WriteBytesAsync::Timeout while writing!");            return false;        }    }    public async Task<bool> WriteStringAsync(Guid serviceid, Guid characteristicid, string data)    {        var encoded = Encoding.UTF8.GetBytes(data);        return await WriteBytesAsync(serviceid, characteristicid, encoded);    }    public async Task<byte[]?> ReadBytesAsync(Guid serviceid, Guid characteristicid)    {        System.Diagnostics.Debug.WriteLine($"{DateTime.Now:O} ReadBytesAsync::Getting Service {serviceid}...");        using (var service = await Device.Native.GetServiceAsync(serviceid))        {            if (service == null)            {                System.Diagnostics.Debug.WriteLine($"{DateTime.Now:O} ReadBytesAsync::Failed to find service");                return [];            }            System.Diagnostics.Debug.WriteLine($"{DateTime.Now:O} ReadBytesAsync::Getting Characteritsic {characteristicid}...");            var characteristic = await service.GetCharacteristicAsync(characteristicid);                        if (characteristic == null)            {                System.Diagnostics.Debug.WriteLine($"{DateTime.Now:O} ReadBytesAsync::Failed to find characteristic");                return [];            }            System.Diagnostics.Debug.WriteLine($"{DateTime.Now:O} ReadBytesAsync::Reading data...");            var result = await characteristic.ReadAsync();            System.Diagnostics.Debug.WriteLine($"{DateTime.Now:O} ReadBytesAsync:: [{result.resultCode}] => [{string.Join(" ",result.data.Select(x=>$"{x:X2}"))}].");                        return result.data;                    }            }    public async Task<string?> ReadStringAsync(Guid serviceid, Guid characteristicid)    {        var data = await ReadBytesAsync(serviceid,characteristicid);        return data != null ? Encoding.UTF8.GetString(data) : null;    }}
 |