Как мы можем подключить устройства Garmin к приложению iOS с помощью BLE

Я разрабатываю приложение iOS для мониторинга сердечного ритма и хочу подключить устройство Garmin к моему приложению с помощью Bluetooth.

Но я не могу перечислить какое-либо устройство Garmin, использующее Core bluetooth в Swift, используя (180D Service UUID).

  func startUpCentralManager() {
        print("Initializing central manager")
        centralManager = CBCentralManager(delegate: self, queue: nil)
    }

    func discoverDevices() {
        print("discovering devices")
        let services = [CBUUID(string: HRM_HEART_RATE_SERVICE_UUID),CBUUID(string:HRM_DEVICE_INFO_SERVICE_UUID),CBUUID(string:HRM_DEVICE_BATTERY_LEVEL_SERVICE_UUID),CBUUID(string:CALORIE_SERVICE)]
        centralManager.scanForPeripherals(withServices: services, options: nil)
    }

    //MARK: CBCentralManagerDelegate
    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        print("checking state")
        switch (central.state) {
        case .poweredOff:
            print("CoreBluetooth BLE hardware is powered off")

        case .poweredOn:
           print("CoreBluetooth BLE hardware is powered on and ready")
           blueToothReady = true;

        case .resetting:
            print("CoreBluetooth BLE hardware is resetting")

        case .unauthorized:
            print("CoreBluetooth BLE state is unauthorized")

        case .unknown:
            print("CoreBluetooth BLE state is unknown");

        case .unsupported:
            print("CoreBluetooth BLE hardware is unsupported on this platform");

        }
        if blueToothReady {
            discoverDevices()
        }
    }

    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {

        let nameOfDeviceFound = (advertisementData as NSDictionary).object(forKey: CBAdvertisementDataLocalNameKey) as? NSString
        print("\(String(describing: nameOfDeviceFound))")
        print("Discovered Peripheral name : ", peripheral.name ?? String())

           if !Utilities.allPeripheralList.contains(peripheral)
           {
               Utilities.allPeripheralList.add(peripheral)
        }
        let deviceObj = DeviceModel()
        deviceObj.deviceName = peripheral.name ?? String()
        deviceObj.UDID = String(format: "%@",(peripheral.identifier).uuidString)
        self.addingPeripheralToGlobalSearchArray(obj: deviceObj)

    }

    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
        peripheral.delegate = self
        peripheral.discoverServices(nil)
        self.connected = peripheral.state == CBPeripheralState.connected ? "YES" : "NO"
        print("Connection Status : %@", self.connected)
        if self.connected == "YES"{

    Utilities.sharedInstance.goToDashboardTabBarScreen(viewController: self)
        }
    }


func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
    //        central.scanForPeripherals(withServices: nil, options: nil)
}

func addingPeripheralToGlobalSearchArray(obj:DeviceModel){
    var isFound:Bool = false
    for i in 0..<Utilities.allDeviceList.count{
        let deviceObj = Utilities.allDeviceList[i] as! DeviceModel
        if obj.UDID == deviceObj.UDID{
            isFound = true
        }
    }

    if !isFound{
        Utilities.allDeviceList.add(obj)
    }
}

Выше приведен код, который я использую для перечисления устройств BLE. Я могу найти устройства Mio-Fuse, использующие тот же кусок кода, но не устройства Garmin.


person Abhishek    schedule 18.05.2017    source источник
comment
Что вы делаете, чтобы найти свое устройство? Вы создаете CBCentralManager? Вы вызываете scanForPeripheralsWithServices? Получаете ли вы какие-либо обратные вызовы после этого?   -  person fspirit    schedule 20.05.2017
comment
Да, я использую CBCentralManager, но я не могу перечислить ни одно устройство Garmin.   -  person Abhishek    schedule 22.05.2017
comment
Можете ли вы опубликовать фрагмент кода, показывающий, что вы делаете, чтобы найти его? Как, например, узнать, что это устройство Garmin? По открытым сервисным UUID? По имени?   -  person fspirit    schedule 22.05.2017
comment
@fspirit я обновил вопрос вместе с кодом.   -  person Abhishek    schedule 31.05.2017
comment
Попробуйте с centralManager.scanForPeripherals(withServices:nil, options: nil) Если ваше устройство не афиширует, что у него есть целевые сервисы (может скрывать, нет никаких обязательств), вы не найдете их, если сканируете только их.   -  person Larme    schedule 31.05.2017
comment
@Larme Я также пробовал CentralManager.scanForPeripherals(withServices:nil, options: nil), но результат тот же. :(   -  person Abhishek    schedule 31.05.2017
comment
Вы можете найти его с LightBlue.app? Можете ли вы дать реф вашего устройства Garmin?   -  person Larme    schedule 31.05.2017
comment
Нет, вместо самого приложения Garmin ни одно из приложений не может его найти.   -  person Abhishek    schedule 21.07.2017
comment
@Abhishek, вы уверены, что любое другое стороннее приложение (не само приложение germin) не могло программно найти устройство germin для измерения ЧСС? Я собираюсь сделать те же проекты, которые позволят использовать несколько типов устройств, таких как Mio-Fuse, Wahoo, Germin, с одним приложением? Спасибо.   -  person Jamshed Alam    schedule 19.05.2018


Ответы (1)


Вам необходимо использовать стандартный SDK Garmin. Свяжитесь с Garmin и зарегистрируйтесь как разработчик. Вы не можете подключиться напрямую с помощью BLE, вы должны подключиться через Garmin SDK API.

person Duncan Groenewald    schedule 27.04.2019