Как получить список сопряженных устройств Bluetooth в Swift?
Мне нужно получить список сопряженных устройств Bluetooth (iOS-устройств) так же, как список в разделе "Bluetooth" в настройках iOS, как показано на рисунке ниже.
Является ли это возможным?
Видели ли вы какие-либо приложения, выполняющие такую функцию?
Я пробовал следующее: ссылка1, ссылка2, ссылка3, ссылка4, ссылка5, ссылка6
Но ничто не помогло мне четко получить точный список. Я надеюсь, что должен быть способ достичь этого. Пожалуйста, помогите мне, поделившись своим опытом. Спасибо.
3 ответа
Невозможно получить список сопряженных периферийных устройств из iOS. Также невозможно проверить, является ли конкретное периферийное устройство сопряженным.
Извлечение периферийных устройств, которые сопряжены
Есть два случая, которые вы должны рассмотреть:
Периферийное устройство может быть уже подключено к системе (iOS автоматически подключается к некоторым периферийным устройствам, например, для отображения уровня заряда батареи). В этом случае периферийное устройство не будет транслировать и обнаруживать, используя
scanForPeripherals
не сработаетПериферийное устройство сопряжено, но отключено. В этом случае
retrieveConnectedPeripherals(withServices:)
не сработает
Поэтому, чтобы получить периферийные устройства, вам нужно объединить обе вещи. Во-первых, вам нужно проверить, если это в периферийных устройствах, возвращенных из retrieveConnectedPeripherals(withServices:)
, Если нет, вы должны scanForPeripherals
,
Если вы хотите получить периферийное устройство, находящееся вне диапазона, вы можете попробовать использовать retrievePeripherals(withIdentifiers:)
Однако он также может возвращать непарные устройства и полагаться на периферийные устройства. UUID
которые вы должны сохранить после сопряжения.
Обнаружение, если периферийное устройство сопряжено
Существует один способ определить, является ли конкретное периферийное устройство сопряженным. Вам нужно попытаться прочитать защищенную характеристику (которая требует шифрования - связывания). Если вы получили ожидаемые данные, это означает, что пользователь принял запрос на сопряжение. В противном случае вы получите пустой ответ или ни одного.
Рекомендации
Вы можете узнать больше о Bluetooth в моих статьях:
Ты можешь использовать ShowBluetoothAccessoryPicker
если вы используете Classic Bluetooh в устройстве MFi.
Код ниже - это C#, но вы можете легко преобразовать его в IOS (объект c ваш swift)
EAAccessoryManager.SharedAccessoryManager.ShowBluetoothAccessoryPicker(null, completion: ((Foundation.NSError error) => {
Console.WriteLine("My callback");
if (error != null && (uint)error.Code != (uint)EABluetoothAccessoryPickerError.AlreadyConnected)
{
Console.WriteLine(String.Format("Error code: {0} Desc: {1}", error.Code, error.DebugDescription));
Console.WriteLine("Failed? " + EABluetoothAccessoryPickerError.Failed.ToString());
Console.WriteLine("Failed? " + Convert.ToInt64(EABluetoothAccessoryPickerError.Failed));
}
}));
Получить список сопряженных / подключенных устройств можно, только если у вас есть UUID их рекламы.
dispatch_queue_t centralQueu = dispatch_queue_create("A_NAME", NULL);
_centralManager = [[CBCentralManager alloc]
initWithDelegate:self
queue:centralQueu
options: @{CBCentralManagerOptionRestoreIdentifierKey:@"RESTORE_KEY",
CBCentralManagerOptionShowPowerAlertKey: @YES}];
_ServiceUUIDs = @[[CBUUID UUIDWithString:@"THE_UUID"]] //the array of CBUUIDs which you are looking for
[_centralManager retrieveConnectedPeripheralsWithServices:_ServiceUUIDs]
Вы можете получить UUID рекламы устройств BLE, используя некоторые приложения для iOS, такие как LightBlue и nRFConnect
Вам нужно найти сервис UUID, в котором вы заинтересованы, в моем случае он работает отлично,
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], CBCentralManagerScanOptionAllowDuplicatesKey, nil];
[self.centralManager scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:SERVICE_UUID]]
options:options];
и когда он найдет какое-либо устройство, которое рекламирует тот же UUID службы, то оно появится на экране, который вы указали выше.
обработайте didDiscoverperiphereherel таким образом:
-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{
_discoveredPeripheral = peripheral;
if(![self.mRemoteDevices containsObject:_discoveredPeripheral])
{
NSArray *peripherels = [self.centralManager retrievePeripheralsWithIdentifiers:@[_discoveredPeripheral.identifier]];
[self.mRemoteDevices addObject:[peripherels objectAtIndex:0]];
}
}