Я использую 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)}
}