Службы периферийных устройств показывают ноль во всех приложениях BLE Scanner для iOS, но не в коде Android - PullRequest
0 голосов
/ 16 мая 2018

Номер детали: CC2640R2F

Инструмент / программное обеспечение: Code Composer Studio

Я работаю над проектом, и в моем проекте CC2640R2F выполняет рекламу и сканирование.Я использую пользовательский сервис BLE для получения данных из приложения (Android или iOS) в CC2640R2F.Всякий раз, когда я подключаю устройство с BLE Scanner в Android, я получаю все услуги и все характеристики, и я также могу отправлять и получать данные без каких-либо проблем.Это также работает в моем приложении для Android.

Но всякий раз, когда я подключаю устройство CC2640R2F к сканеру BLE в приложении iOS, устройство подключается, но я не получаю никаких услуг или характеристик в приложении.Та же ситуация и с нашим разработанным приложением ios.Почему это происходит?Если я получаю все вещи на Android, то это также должно работать на iOS.

Снимок экрана приложения Android сканера BLE: Screenshot of Ble scanner Android app

Приложение iOS Сканер BLE iOS app BLE scanner

Код для проверки, включен ли Bluetooth и сканирования периферийных устройств: [! [Код для проверки, включен ли Bluetooth и сканирования периферийных устройств] [3]] [3]

Код для подключения к устройству при обнаружении периферийного устройства: [! [Код для подключения к устройству при обнаружении периферийного устройства] [4]] [4]

Код для поиска служб после устройстваподключен (если найдены службы, то он будет прерывать таймер (), иначе поиск службы снова):

Code to search for services after the device is connected

func centralManagerDidUpdateState (_ central: CBCentralManager){print ("--- centralManagerDidUpdateState")

    if central.state == CBManagerState.poweredOn {
        debugPrint("poweredOn")

        let serviceUUIDs:[AnyObject] = [serviceCBUUID_READ]
        let lastPeripherals = centralManager.retrieveConnectedPeripherals(withServices: serviceUUIDs as! [CBUUID])

        if lastPeripherals.count > 0{
            let device = lastPeripherals.last! as CBPeripheral;
            deviceX = device;
            centralManager.connect(deviceX, options: nil)
            if(device.state == .disconnected){
                self.alertShowing(msg: "Device is disconnected restart the device and connect again.")
            }
        }
        else {
            centralManager.scanForPeripherals(withServices: nil, options: nil)
        }

        debugPrint(lastPeripherals)
    } else if(central.state == CBManagerState.poweredOff) {
        self.alertShowing(msg: "Make sure that your bluetooth is turned on.")
    }
    else if(central.state == CBManagerState.unsupported) {
        self.alertShowing(msg: "This device is unsupported.")
    }else{
        self.alertShowing(msg: "Try again after restarting the device.")
    }
}

// DidDiscoverPeripheral

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
    if(peripheral.name == "Peripheral Observer") || (peripheral.name == "BLE Device"){
        if let services = peripheral.services{
            for service in services{
                debugPrint(service)
            }
        }
        debugPrint("advertisementData :\(advertisementData)")
        deviceX = peripheral
        peripheral.delegate = self
        centralManager.stopScan()
        centralManager.connect(peripheral)
    }
}

// внутри didConnect

func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
    debugPrint("Connected")
    var i = 0
    timerForService = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { (timer) in
        if(self.service_Read == nil) && (self.service_Write == nil){
            i += 1

            if(i%2 == 1){
                debugPrint("loop1")
                peripheral.discoverServices(nil)
                self.deviceX!.discoverServices(nil)
            }else if( i&2 == 0){
                debugPrint("loop0")
                self.deviceX!.discoverServices([self.serviceCBUUID_READ, self.serviceCBUUID_Write])
            }

        }else{
            self.timerForService.invalidate()
        }
    })
}

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

после долгих поисков я обнаружил проблему, которая находится на стороне устройства, мы устранили проблему, увеличив память кучи устройства CC2640R2F и установив размер MTU ATT, после этого нам удалось получить услугу, приблизительно 6 или 7 раз отсоединяемое соединениес периферийным ядром Bluetooth не может найти сервис даже на устройстве.окончательное решение для этого увеличить размер буфера периферийного устройства.

https://github.com/NordicPlayground/ANT-Shared-Channel-Demo/issues/1 https://forums.developer.apple.com/thread/73871

0 голосов
/ 16 мая 2018

Вы используете неправильный способ обнаружения служб BLE в iOS-центре. (Боюсь, мой ответ написан на Objective-c, однако, он дает вам точку зрения, и преобразование в Swift будет простым)

Вы должны определить глобальный CBPeriphal экземпляр и использовать его в своем коде

@interface CentralManager()
property (nonatomic, strong) CBPeripheral *golablePeripheral;
@end

- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI {
    self.golablePeripheral = peripheral;
    self.golablePeripheral.delegate = self;
}

Затем вы можете начать обнаруживать свои службы, как только получите делегата подключения:

- (void)centralManager:(CBCentralManager *)central didConnectPeripheral:(CBPeripheral *)peripheral {
    [self.golablePeripheral discoverServices: _serviceUUID];
}

Тогда вы получите следующий делегат. Настало время открыть для себя характеристики:

- (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error {
    for (CBService *service in peripheral.services) {
        if ([_serviceUUID containsObject: service.UUID]) {
            [self.golablePeripheral discoverCharacteristics:_serviceCharacteristics forService:service];
            [self.golablePeripheral discoverCharacteristics:_serviceNotifyCharacteristics forService:service];
        }
    }
}

Я настоятельно рекомендую вам использовать BluetoothLEManager для ваших проектов, связанных с BLE. Я использовал его в нескольких своих корпоративных проектах.

...