Ответ 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, но вы можете проверить этот пример кода, чтобы понять, как он работает.