Xamarin.iOS CoreBluetooth/внешний вопрос

Я смотрю здесь на форумах, на узлах monotouch GIT и никогда не нашел действительно функционального образца для использования CoreBluetooth, чтобы добиться следующего: 1.Проверьте, есть ли устройство, которое соответствует критерию (по имени или некоторому идентификатору устройства) в паре и подключенном 2.Если сопряжено, но не подключено, попробуйте подключиться к нему 3. Если соединение не удалось, затем отобразите список устройств Bluetooth, соответствующих критерию по теме 1, чтобы пользователь мог выбрать и подключиться к нему.

Примечание. Устройство, которое я пытаюсь подключить, использует SPP, но сертифицировано Apple MFI. Это устройство для чтения кредитных карт по Bluetooth, а некоторые из них даже реализуют протоколы ExternalAccessory.

Страница образцов CoreBluetooth пуста http://developer.xamarin.com/samples/ios/CoreBluetooth/

Я пробовал этот довольно простой пример, который никогда не получает события, вызванные после сканирования:

public static class BTHelper
    {
        private static CBCentralManager manager;
        private static CBUUID UUID;

        static BTHelper()
        {
            manager =
            manager.DiscoveredPeripheral += OnDiscovery;
            manager.ConnectedPeripheral += OnConnected;
            manager.DisconnectedPeripheral += OnDisconnected;
            UUID = CBUUID.FromString("00001101-0000-1000-8000-00805F9B34FB");
        }

        public static void CheckBluetooth()
        {
            manager.ScanForPeripherals(new[] { UUID });
        }

        static void OnDisconnected(object sender, CBPeripheralErrorEventArgs e)
        {
            Console.WriteLine("Disconnected - " + e.Peripheral.Name);
        }

        static void OnConnected(object sender, CBPeripheralEventArgs e)
        {
            Console.WriteLine("Connected - " + e.Peripheral.Name);
        }

        static void OnDiscovery(object sender, CBDiscoveredPeripheralEventArgs e)
        {
            Console.WriteLine("Found - " + e.Peripheral.Name);
        }
    }

Может ли кто-нибудь помочь? Я действительно устал от поиска в Google и много вопросов о SO без реального ответа.

@XamarinTeam, вы, ребята, должны предоставить образец того, как его использовать... Мы потеряны без ссылки...

Спасибо, очень ценю любую помощь...

Gutemberg

Ответ 1

Похоже, вы смотрите на неправильные документы. Bluetooth поддерживает только связь с устройствами Bluetooth Low Energy (BLE) с использованием профиля GATT. вы не можете сканировать SPP-устройство с помощью corebluetooth.

Для вашего устройства MFI вам необходимо проверить структуру внешних аксессуаров, он позволяет общаться с "устаревшими" устройствами Bluetooth, используя такие профили, как протокол последовательного порта (SPP).

Чтобы ответить на ваш вопрос: : 1.Проверьте, есть ли устройство, которое соответствует критерию (по имени или некоторому идентификатору устройства) в паре и подключенном

Вы можете использовать showBluetoothAccessoryPicker функцию EAAccessoryManager, чтобы получить список доступных устройств, подробнее здесь

2.Если спаренный, но не подключенный, попробуйте подключиться к нему

Нет никакого документального способа проверить это. Вы не можете инициировать подключение из приложения без showBluetoothAccessoryPicker. Вы можете следить за   EAAccessoryDidConnect. если этот метод не вызывается, а вызов showbluetoothaccessorypicker вызывается, ваше устройство не подключено.

3.Если соединение завершается с ошибкой, тогда покажите список устройств Bluetooth, которые соответствуют критериям по теме 1, чтобы пользователь мог выбрать и подключиться к нему 1)

После завершения showBluetoothAccessoryPicker Вы можете проверить ConnectedAccessories. Если он не доступен, вызовите showBluetoothAccessoryPicker, чтобы отобразить список аксессуаров.

Пример кода для использования структуры внешнего аксессуара в вашем коде

EAAccessoryManager manager= EAAccessoryManager.SharedAccessoryManager;
var allaccessorries= manager.ConnectedAccessories;
foreach(var accessory in allaccessorries)
{
    yourlable.Text = "find accessory";
    Console.WriteLine(accessory.ToString());
    Console.WriteLine(accessory.Name);
    var protocol = "com.Yourprotocol.name";

    if(accessory.ProtocolStrings.Where(s => s == protocol).Any())
    {
        yourlable.Text = "Accessory  found";
        //start session
        var session = new EASession(accessory, protocol);
        var outputStream = session.OutputStream;
        outputStream.Delegate = new MyOutputStreamDelegate(yourlable);
        outputStream.Schedule(NSRunLoop.Current, "kCFRunLoopDefaultMode");
        outputStream.Open();
    }
}

и

public class MyOutputStreamDelegate : NSStreamDelegate
{
    UILabel label;
    bool hasWritten = false;

    public MyOutputStreamDelegate(UILabel label)
    {
        this.label = label;
    }
    public override void HandleEvent(NSStream theStream, NSStreamEvent streamEvent)
    {
         //write code to handle  stream.

    }
}

Существует нет какой-либо перкулярной демонстрации для использования инфраструктуры Exeternal Accessory, но вы можете проверить этот пример кода, чтобы понять, как он работает.

Целый проект

Класс AccessoryBrowser