CBPeripheral对象的名称始终为nil值,并且处于断开连接状态

时间:2017-10-11 12:00:30

标签: ios swift xcode bluetooth core-bluetooth

我正在编写一个应用程序,允许我通过BLE将图像发送给其他人的应用程序。

为了正确测试它,我需要能够连接到设备,但我的扫描外围设备总是断开连接并且值为零。我不确定我是否正确行事。我一直在阅读指南,我正在遵循正确的程序,所以有人可以指出我可能做错了什么?我正在检测哪些外围设备?

输出:

<CBPeripheral: 0x165b9c90, identifier = 6B74A074-6F5B-0E3A-94EB-6E7BB890569C, name = (null), state = disconnected>
<CBPeripheral: 0x165a0940, identifier = A35AC32E-5668-BD0D-4DBC-D4BF959B9242, name = (null), state = disconnected>
<CBPeripheral: 0x166a8220, identifier = 4D9FA1A1-0090-465F-B53D-363B0F3BBD27, name = (null), state = disconnected>

编辑:添加了更多代码

这是我的代码

import Foundation
import CoreBluetooth
import UIKit

class BluetoothController: UITableViewController, CBCentralManagerDelegate, CBPeripheralManagerDelegate,  CBPeripheralDelegate {

    var centralManager: CBCentralManager!
    var peripheralManager: CBPeripheralManager!
    var service : CBMutableService!

    let uuid:CBUUID = CBUUID(string: "09d921ff-b80c-47b1-bc2b-5bbaadf62010")
    let charaUuid:CBUUID = CBUUID(string: "09d921ff-b80c-47b1-bc2b-5bbaadf62021")

    override func viewDidLoad() {
        print("Initialzing managers")
        peripheralManager = CBPeripheralManager(delegate: self, queue: nil)
        centralManager = CBCentralManager(delegate: self, queue: nil)
        service = CBMutableService(type: uuid, primary: true) //<--Probably not causing it but without a service...

        let properties: CBCharacteristicProperties = [.notify, .read, .write]
        let permissions: CBAttributePermissions = [.readable, .writeable]
        let characteristic = CBMutableCharacteristic(
            type: charaUuid,
            properties: properties,
            value: nil,
            permissions: permissions)

        service.characteristics = [characteristic];
        peripheralManager.add(service)
    }

    func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) {
        print("peripheral state updated")
        print("\(peripheral.description)")
    }

    func peripheralManagerDidStartAdvertising(_ peripheral: CBPeripheralManager, error: Error?)
    {
        print("started advertising")
    }

    // Check if the bluetooth is powered on
    // Start looking for devices
    func centralManagerDidUpdateState(_ central: CBCentralManager) {
        if central.state == .poweredOn {
            print("Scanning for devices")
            centralManager.scanForPeripherals(withServices: nil, options: nil)
            startAdvert()
        }  else {
            print("Bluetooth not available.")
        }
    }

    func startAdvert(){
        let advertisingData = [CBAdvertisementDataLocalNameKey:"Test Device", CBAdvertisementDataServiceUUIDsKey: uuid] as [String : Any]
        peripheralManager.startAdvertising(advertisingData)
    }

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

        print(peripheral)
        //didReadPeripheral(peripheral, rssi: RSSI)
    }

}

1 个答案:

答案 0 :(得分:0)

正如Paulw11所说,你没有联系,因为你从不打电话给connect()。您发现周围的随机BLE设备与您的应用无关。这是因为您正在扫描所有可能的服务:

centralManager.scanForPeripherals(withServices: nil, options: nil)

你几乎不应该这样做。这对电池来说很糟糕,很少你想要它。您想要扫描您的服务。

centralManager.scanForPeripherals(withServices: [uuid], options: nil)

然后当您发现其他设备宣传您的服务时,您需要连接到它们。