В: Периферийное устройство CoreBluetooth: didConnect вызывается дважды - PullRequest
0 голосов
/ 04 августа 2020

Я использую MacOS 10.14.6 и вижу, что периферийное устройство: didConnect вызывается дважды для одного и того же устройства каждый раз, когда я вызываю _centralManager? .Connect один раз. Кто-нибудь знает почему? Кажется, что я получаю 2 вызова didConnect в зависимости от того, к какому устройству я подключаюсь. Некоторые устройства вызываются один раз, а другие - дважды. Устройства, к которым я подключаюсь, относятся к разным моделям, поэтому все данные о рекламе и базе данных GATT разные. Это мой код:

func Init(){
    let centralQueue: DispatchQueue = DispatchQueue(label: "centralMsgQueue", attributes: .concurrent)
    let opts = [CBCentralManagerOptionShowPowerAlertKey: false]
    _centralManager = CBCentralManager(delegate: self, queue: centralQueue, options: opts)

  }


  func Open(id: Int) -> Int {
    let i = GetDevice(id: id)
    if (i != -1)
    {
        let uuid = UUID(uuidString:_deviceTable[i].uuid!);
        let data = _centralManager!.retrievePeripherals(withIdentifiers: [uuid!]) as [CBPeripheral]
        if data.count > 0 {
          _deviceTable[i]._periph = data[0]
          _deviceTable[i]._periph?.delegate = self
          _deviceTable[i].conn_status = CONN_STATUS_PENDING
          _centralManager?.connect(_deviceTable[i]._periph!, options: nil)
        }
    }
    else
    {
        return -1
    }
    return 0
  }

  func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
    let i = GetDevicePeriph(per: peripheral)
    if (i != -1) {
        if (_deviceTable[i].conn_status == CONN_STATUS_PENDING)
        {
            _deviceTable[i].conn_status = CONN_STATUS_DIDCONN
            peripheral.discoverServices(nil)
        }
    }
    else {
        _centralManager?.cancelPeripheralConnection(peripheral)
    }
  } // END func centralManager(... didConnect peripheral

  func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
      let peripheralID = peripheral.identifier.uuidString
      let deviceName = (advertisementData as NSDictionary).object(forKey: CBAdvertisementDataLocalNameKey) as? String
      if (deviceName == "Test"){
        _centralManager?.stopScan()
        let dev = device(_periph: nil, uuid: peripheralID, conn_status: CONN_STATUS_DISCOVERED)
        _deviceTable.append(dev)
      }
}

func Discover() {
self._centralManager?.scanForPeripherals(withServices: nil, options: [CBCentralManagerScanOptionAllowDuplicatesKey:_scanAllowDuplicates])
}

func Test() {
  Init()
  Discover()
  Thread.sleep(forTimeInterval: 5.0)
  if (_deviceTable.count > 0) {
    Open(0)}
}
...