1

Я пытаюсь измерить индикатор RSSI на iOS (6 с BLE) с нескольких периферийных устройств bluetooth. я могу получить RSSI с scanForPeripheral:Обновление значения RSSI для многих периферийных устройств Bluetooth

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], CBCentralManagerScanOptionAllowDuplicatesKey, nil]; 

[_manager scanForPeripheralsWithServices:nil 
           options:options]; 

в сочетании с:

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI { 

это работает, но у меня нет контроля над скоростью пакетов приема и результат кажется неопределенным.

Я прочитал: https://stackoverflow.com/a/12486927/270209 но моя ставка не близка к 100мсу на всех (более 1 ~ 2 секунды)

Если я подключен к устройству результат с readRSSI кажется более надежным.

Я ищу способ «стимулировать» периферийные устройства для более частого обновления в режиме сканирования или для подключения к нескольким периферийным устройствам одновременно.

Благодаря

Edit: Я также попытался запустить/остановить сканирование быстро, кажется, что при запуске сканирования обнаруживает несколько устройств и обновления чаще

+0

вы имеете в виду, - (Недействительными) centralManager: (CBCentralManager *) центральный didDiscoverPeripheral: (CBPeripheral *) периферическая advertisementData: (NSDictionary *) advertisementData RSSI :(NSNumber *) Метод RSSI вызван слишком быстро, и ваш RSSI обновляется слишком часто? –

+0

Нет, на самом деле это не называется достаточно быстро. – luxcem

+0

На каком устройстве вы работаете? – cbowns

ответ

1

(Предполагая, что вы находитесь на устройстве IOS :) CoreBluetooth, вероятно, намеренно ограничивает скорость, с которой он активен на антенне. Bluetooth LE, Bluetooth Classic и Wi-Fi находятся на одной и той же антенне на устройствах iOS, поэтому радиоприемники стараются свести к минимуму ненужную болтовню. Вы можете попробовать подавать ошибку на CoreBluetooth, чтобы добавить опцию или способ контролировать частоту обновления, но я не думаю, что они ее реализуют, поскольку их основные цели дизайна: 1. Не сливать батарею устройства без необходимости и 2 Совместно с радиостанциями другой антенны. (Они также сказали в сообщениях на Apple devforums, что, например, если вам нужна более высокая скорость передачи данных, чем реализация iOS BTLE, вы должны использовать Bluetooth Classic или что-то, что было разработано для него. BTLE предназначен для низкоуровневых приложений, прежде всего, и они довели это до логического конца.)

4

Я уверен, что вы уже поняли это, но на всякий случай кто-то наткнулся на это (как я и сделал), ища другую информацию , если вы не используете другие устройства iOS с coreLocation, вам нужно позвонить делегату peripheralDidUpdateRSSI:, используя [self.myPeripheral readRSSI];.

Вы можете требовать обновления данных RSSI в didUpdateValueForCharacteristic: так часто, как вам нравится один раз в делегате updateValue.

Это не нужно в viewDidLoad: NSDictionary *options = etc... Этот NSDictionary создан в делегате didDiscoverPeripheral:.

Таким образом, общий поток будет:

Убедитесь, что вы получаете RSSI в NSLog, где вы получили данные RSSI ...

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI{ 

NSString *localName = [advertisementData objectForKey:CBAdvertisementDataLocalNameKey]; 

if ([localName length] > 0){ 
    NSLog(@"Discovered: %@ RSSI: %@", peripheral.name, RSSI); 
    // your other needs ... 
} 

Вызов peripheralDidUpdateRSSI: здесь, так как это, где обновление будет происходить непрерывно, если вы установите уведомит значение YES [peripheral setNotifyValue:YES forCharacteristic:characteristic];

- (void) peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error{ 

//Call the peripheralDidUpdateRSSI delegate .. 
[self.myPeripheral readRSSI]; 

// do all of your other characteristic value updates here 
} 

readRSSI будет вызывать делегат, где вы выполняете свои обновления RSSI на вашем UILabel (или независимо от того, что вы используете) каждый раз, когда вы обновляете предыдущие значения характеристик:

- (void)peripheralDidUpdateRSSI:(CBPeripheral *)peripheral error:(NSError *)error; 
{ 
_rssiLabel.text = [self.myPeripheral.RSSI stringValue]; 
NSLog(@"RSSI Method”); 
} 

Если вам не нужен символ для вашего приложения просто запускайте цикл там, где вам нужно значение RSSI для обновления.

0

Действительно, задержка между peripheral.readRSSI() и peripheralDidUpdateRSSI - как вторая!

Я думаю, что лучший способ - прочитать значение RSSI на самом устройстве BLE и отправить его на устройство iOS.

0

Периферийное устройство рекламируется на основе прошивки периферийного устройства. Это можно установить как минимум на 100 мс до почти до 2 секунд. При использовании устройства iOS в качестве периферийного устройства Bluetooth я не нашел способа его изменить. Вот яблоки документация: Смотрите в разделе 3.5 ... https://developer.apple.com/hardwaredrivers/BluetoothDesignGuidelines.pdf

 Смежные вопросы

  • Нет связанных вопросов^_^