0

내 CoreBluetooth 코드 중 일부를 iOS에서 OS X로 이식하려고합니다. 다음과 같이 공유되는 CoreBluetooth 래퍼 집합을 설정했습니다. iOS 앱과 OS X 앱 모두 동일한 BLE 장치를 사용하는 것과 똑같습니다. 주변CBPeripheral advertisingData OSX vs iOS (GAP/GATT)에서 주변 장치를 검색 할 때 다른 경우

검색 : 내 iOS 앱에

override init() { 
    super.init() 
    let queue = DispatchQueue.global(qos: .background) 
    centralManager = CBCentralManager(delegate: self, queue: queue) 
} 

func startScanning() { 
    let options: [String: Any] = [CBCentralManagerScanOptionAllowDuplicatesKey: true] 
    let deviceUUID = CBUUID(string: Project.Service.Device) 
    let recoveryUUID = CBUUID(string: Project.Service.DFURecovery) 
    centralManager?.scanForPeripherals(withServices: [deviceUUID, recoveryUUID], options: options) 
} 

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber){ 
    // Inspect advertisementData here to decipher what kind of device 
} 

는 didDiscoverPeripheral가 발생합니다. 나는 광고 데이터를 검사 할 때 그리고 내가 기대하고 모든 키/값을 얻을 :이 같은 코드는 OS의 X 응용 프로그램에서 (같은 장치에 대한 검사)를 실행하지만

{ 
    kCBAdvDataIsConnectable = 1; 
    kCBAdvDataLocalName = "My Device"; 
    kCBAdvDataManufacturerData = <34045254 5877f283 43fdd12d ff530978 45000000 000050c2 6500>; 
    kCBAdvDataServiceData =  { 
     Battery = <64>; 
    }; 
    kCBAdvDataServiceUUIDs =  (
     "My Inforamtion" 
    ); 
} 

을, 광고 데이터입니다 일부 필드가 누락되었습니다.

{ 
    kCBAdvDataIsConnectable = 1; 
    kCBAdvDataManufacturerData = <34045254 5877f36e 43fdd12d ff530978 45000000 000050c2 6500>; 
} 

다음 키/값 쌍이 advertisedData에서 누락되었습니다. 나는 scanForPeripherals에 그 열쇠를 추가하려고했습니다

kCBAdvDataLocalName 
kCBAdvDataServiceData 
kCBAdvDataServiceUUIDs 

은과 같이 전화 :

let options: [String: Any] = [CBCentralManagerScanOptionAllowDuplicatesKey: true, 
            CBAdvertisementDataLocalNameKey: true, 
            CBAdvertisementDataServiceDataKey: true, 
            CBAdvertisementDataServiceUUIDsKey: true] 
    let deviceUUID = CBUUID(string: Nightlight.Service.Device) 
    let recoveryUUID = CBUUID(string: Nightlight.Service.DFURecovery) 
    centralManager?.scanForPeripherals(withServices: [deviceUUID, recoveryUUID], options: options) 

을 전혀 효과.

답변

0

OSX는 각 advertiser마다 서로 다른 advertisinData를 사용하여 didDiscoverPeripheral을 여러 번 호출 할 수 있습니다. 필자가 생각해 낸 해결책은 캐시를 작성하는 것입니다. didDiscoverPeripheral에서

수입 재단 수입 CoreBluetooth

class AdvertisementDataCache { 

    fileprivate var map = [UUID: [String: Any]]() 

    func append(peripheral: CBPeripheral, advertisementData: [String: Any]) -> [String: Any] { 
     var ad = (map[peripheral.identifier]) ?? [String: Any]() 
     for (key, value) in advertisementData { 
      ad[key] = value 
     } 
     map[peripheral.identifier] = ad 
     return ad 
    } 

    func clear() { 
     map.removeAll() 
    } 
} 

: 그리고

var advertisementDataCache = AdvertisementDataCache() 

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber){ 
    let advertisementDataCache = self.advertisementDataCache.append(peripheral: peripheral, advertisementData: advertisementDataCache) 
    // cache may contain all 5 of the advertisements, depending on how may have been delivered 
    if let device = AdvertisementData.isTheDeviceIAmLookingFor(peripheral: peripheral, advertisementData: cache) { 
     // Do stuff with device 
    } 
}