CoreBluetooth peripheral:didDiscoverServices 未启动
CoreBluetooth peripheral:didDiscoverServices not firing
我有一个简单的应用程序,我在其中实现了一个可以连接到外围设备并向其读取或写入的中央设备。
出于某些原因,这始终有效,但现在我不知道为什么委托方法 didDiscoverServices 没有触发。我在 didConnect 方法中调用 peripheral.discoverServices() 。当调用 discoverServices 方法时,我不断收到 委托方法未实现或为 nil 的错误。但是方法实现了,我正在寻找存在的服务。
这是我的代码
class SearchForPeripheralsTableViewController: UITableViewController, CBCentralManagerDelegate, CBPeripheralDelegate {
var centralManager: CBCentralManager?
var cbPeripheral: CBPeripheral!
var peripherals: [DiscoveryPeripherals] = []
var listOfServices: [ServiceIdentifier] = []
fileprivate func fillServices(){
listOfServices.append(ServiceIdentifier(CBUUID(string: "FFF0")))
}
override func viewWillAppear(_ animated: Bool) {
tableViewSearchPeripherals.dataSource = self
tableViewSearchPeripherals.delegate = self
initCentralManager()
}
override func viewDidAppear(_ animated: Bool) {
tableViewSearchPeripherals.reloadData()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
print("Peripheral connected")
let service = listOfServices.first(where: { [=11=].uuid == CBUUID(string:"FFF0")})
peripheral.discoverServices([(service?.uuid)!])
}
override func viewDidLoad() {
super.viewDidLoad()
fillServices()
}
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
if error != nil {
print("Error discovering services: \(String(describing: error?.localizedDescription))")
return
}
if let services = peripheral.services {
for service in services {
let characteristics = listOfCharacteristics.map({ (element) -> CBUUID in return element.uuid})
// let characteristic = GetCharacteristicByCBUUID(uuid: CBUUID(string: "FFF1"))
peripheral.discoverCharacteristics(characteristics, for: service)
}
}
}
}
您还需要初始化 CBCentralManagera 并在 info.plist
中添加 "Privacy - Bluetooth Peripheral Usage Description" 消息
请检查Swift 3.0 中的这段代码会对您有所帮助。 https://github.com/JCGuidi/BLE-iOS-Swift-3.0/blob/master/Project/BluetoothLE/ViewController.swift
您必须将对象设置为 CBPeripheral
的委托才能调用 CBPeripheralDelegate
函数:
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
print("Peripheral connected")
peripheral.delegate = self
let service = listOfServices.first(where: { [=10=].uuid == CBUUID(string:"FFF0")})
peripheral.discoverServices([(service?.uuid)!])
}
swift 3
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
peripheral.delegate = self
self.selectPeripheral.discoverServices(nil)
}
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
if let errorService = error{
print(errorService)
return
}
else if let services = peripheral.services as [CBService]!{
for service in services{
peripheral.discoverCharacteristics(nil, for: service)
}
}
print("==>",peripheral.services!)
}
我有一个简单的应用程序,我在其中实现了一个可以连接到外围设备并向其读取或写入的中央设备。
出于某些原因,这始终有效,但现在我不知道为什么委托方法 didDiscoverServices 没有触发。我在 didConnect 方法中调用 peripheral.discoverServices() 。当调用 discoverServices 方法时,我不断收到 委托方法未实现或为 nil 的错误。但是方法实现了,我正在寻找存在的服务。
这是我的代码
class SearchForPeripheralsTableViewController: UITableViewController, CBCentralManagerDelegate, CBPeripheralDelegate {
var centralManager: CBCentralManager?
var cbPeripheral: CBPeripheral!
var peripherals: [DiscoveryPeripherals] = []
var listOfServices: [ServiceIdentifier] = []
fileprivate func fillServices(){
listOfServices.append(ServiceIdentifier(CBUUID(string: "FFF0")))
}
override func viewWillAppear(_ animated: Bool) {
tableViewSearchPeripherals.dataSource = self
tableViewSearchPeripherals.delegate = self
initCentralManager()
}
override func viewDidAppear(_ animated: Bool) {
tableViewSearchPeripherals.reloadData()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
print("Peripheral connected")
let service = listOfServices.first(where: { [=11=].uuid == CBUUID(string:"FFF0")})
peripheral.discoverServices([(service?.uuid)!])
}
override func viewDidLoad() {
super.viewDidLoad()
fillServices()
}
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
if error != nil {
print("Error discovering services: \(String(describing: error?.localizedDescription))")
return
}
if let services = peripheral.services {
for service in services {
let characteristics = listOfCharacteristics.map({ (element) -> CBUUID in return element.uuid})
// let characteristic = GetCharacteristicByCBUUID(uuid: CBUUID(string: "FFF1"))
peripheral.discoverCharacteristics(characteristics, for: service)
}
}
}
}
您还需要初始化 CBCentralManagera 并在 info.plist
中添加 "Privacy - Bluetooth Peripheral Usage Description" 消息请检查Swift 3.0 中的这段代码会对您有所帮助。 https://github.com/JCGuidi/BLE-iOS-Swift-3.0/blob/master/Project/BluetoothLE/ViewController.swift
您必须将对象设置为 CBPeripheral
的委托才能调用 CBPeripheralDelegate
函数:
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
print("Peripheral connected")
peripheral.delegate = self
let service = listOfServices.first(where: { [=10=].uuid == CBUUID(string:"FFF0")})
peripheral.discoverServices([(service?.uuid)!])
}
swift 3
func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
peripheral.delegate = self
self.selectPeripheral.discoverServices(nil)
}
func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
if let errorService = error{
print(errorService)
return
}
else if let services = peripheral.services as [CBService]!{
for service in services{
peripheral.discoverCharacteristics(nil, for: service)
}
}
print("==>",peripheral.services!)
}