2

블루투스 낮은 에너지로 작동하는 대시 버튼이 있습니다. 나는 그것을 스캔하고 발견하고 그것에 연결하고 그 서비스를 발견 할 수있다.신속한 이벤트 무도회 블루투스 주변 기기 청취

이제 버튼을 눌렀는지 여부를 확인하고 싶습니다.하지만이 부분에 심각한 문제가있는 것으로 보입니다. 나는 일종의 Swift에서 새로운 일을하고 있습니다. 당신이 저를 어떻게 해결할 수 있는지 알려 주시면, 정말로 고맙습니다.

이 내 SWIFT 코드 :

import CoreBluetooth 
import UIKit 

struct DisplayPeripheral{ 
    var peripheral: CBPeripheral? 
    var lastRSSI: NSNumber? 
    var isConnectable: Bool? 
} 

class PeripheralViewController: UIViewController { 

    @IBOutlet weak var statusLabel: UILabel! 
    @IBOutlet weak var bluetoothIcon: UIImageView! 
    @IBOutlet weak var scanningButton: ScanButton! 

    var centralManager: CBCentralManager? 
    var peripherals: [DisplayPeripheral] = [] 
    var viewReloadTimer: Timer? 
    let BEAN_NAME = "Security Tag" 
    let BEAN_SCRATCH_UUID = CBUUID(string: "90946c81-e466-4a43-9974-949e465d35a1") 
    let BEAN_SERVICE_UUID = CBUUID(string: "00001c00-d102-11e1-9b23-000efb0000a7") 

    var selectedPeripheral: CBPeripheral? 

    @IBOutlet weak var tableView: UITableView! 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 

     //Initialise CoreBluetooth Central Manager 
     centralManager = CBCentralManager(delegate: self, queue: DispatchQueue.main) 
    } 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 

     viewReloadTimer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(PeripheralViewController.refreshScanView), userInfo: nil, repeats: true) 
    } 

    override func viewWillDisappear(_ animated: Bool) { 
     super.viewWillDisappear(animated) 

     viewReloadTimer?.invalidate() 
    } 

    func updateViewForScanning(){ 
     statusLabel.text = "Scanning BLE Devices..." 
     bluetoothIcon.pulseAnimation() 
     bluetoothIcon.isHidden = false 
     scanningButton.buttonColorScheme(true) 
    } 

    func updateViewForStopScanning(){ 
     let plural = peripherals.count > 1 ? "s" : "" 
     statusLabel.text = "\(peripherals.count) Device\(plural) Found" 
     bluetoothIcon.layer.removeAllAnimations() 
     bluetoothIcon.isHidden = true 
     scanningButton.buttonColorScheme(false) 
    } 

    @IBAction func scanningButtonPressed(_ sender: AnyObject){ 
     if centralManager!.isScanning{ 
      centralManager?.stopScan() 
      updateViewForStopScanning() 
     }else{ 
      startScanning() 
     } 
    } 

    func startScanning(){ 
     peripherals = [] 
     self.centralManager?.scanForPeripherals(withServices: nil, options: [CBCentralManagerScanOptionAllowDuplicatesKey: true]) 
     updateViewForScanning() 
     let triggerTime = (Int64(NSEC_PER_SEC) * 10) 
     DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double(triggerTime)/Double(NSEC_PER_SEC), execute: {() -> Void in 
      if self.centralManager!.isScanning{ 
       self.centralManager?.stopScan() 
       self.updateViewForStopScanning() 
      } 
     }) 
    } 

    func refreshScanView() 
    { 
     if peripherals.count > 1 && centralManager!.isScanning{ 
      tableView.reloadData() 
     } 
    } 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if let destinationViewController = segue.destination as? PeripheralConnectedViewController{ 
      destinationViewController.peripheral = selectedPeripheral 
     } 
    } 
} 

extension PeripheralViewController: CBCentralManagerDelegate{ 
    func centralManagerDidUpdateState(_ central: CBCentralManager){ 
     //if (central.state == CBCentralManagerState.poweredOn){ 
      startScanning() 
     //}else{ 
      // do something like alert the user that ble is not on 
     //} 
    } 

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

     for (index, foundPeripheral) in peripherals.enumerated(){ 
      if foundPeripheral.peripheral?.identifier == peripheral.identifier{ 
       peripherals[index].lastRSSI = RSSI 
       return 
      } 
     } 

     let isConnectable = advertisementData["kCBAdvDataIsConnectable"] as! Bool 
     if(peripheral.name == BEAN_NAME) 
     { 
      print(peripheral.name) 
      print(peripheral.identifier) 
      print("is?",isConnectable) 
      let displayPeripheral = DisplayPeripheral(peripheral: peripheral, lastRSSI: RSSI, isConnectable: isConnectable) 
      peripherals.append(displayPeripheral) 
     } 

     tableView.reloadData() 
    } 


} 

extension PeripheralViewController: CBPeripheralDelegate { 
    func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) { 
     print("Error connecting peripheral: \(error?.localizedDescription)") 
    } 

    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) 
    { 
     print("Peripheral connected") 
     performSegue(withIdentifier: "PeripheralConnectedSegue", sender: self) 
     peripheral.discoverServices(nil) 

    } 
    func peripheral(peripheral: CBPeripheral, didDiscoverServices error: NSError?) 
    { 
     print("jdbsud") 

     for service in peripheral.services! 
     { 
      let thisService = service as CBService 

      if service.uuid == BEAN_SERVICE_UUID { 
       peripheral.discoverCharacteristics(nil,for: thisService) 
      } 
     } 
    } 


} 

extension PeripheralViewController: UITableViewDataSource { 
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{ 

     let cell = self.tableView.dequeueReusableCell(withIdentifier: "cell")! as! DeviceTableViewCell 
     cell.displayPeripheral = peripherals[indexPath.row] 
     cell.delegate = self 
     return cell 
    } 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{ 
     return peripherals.count 
    } 
} 

extension PeripheralViewController: DeviceCellDelegate{ 
    func connectPressed(_ peripheral: CBPeripheral) { 
     if peripheral.state != .connected { 
      selectedPeripheral = peripheral 
      peripheral.delegate = self 
      centralManager?.connect(peripheral, options: nil) 
      //you can listen to the commands here 


     } 
    } 

    } 

나는 FUNC 주변에 뭔가를 인쇄 (주변 : CBPeripheral, didDiscoverServices 오류 : NSError가) 심지어 거기 여부를 입력하면 분명히 그렇게하지, 확인 코드의 해당 부분을 입력하십시오.

답변

1

문제에 열심히 노력한 결과, 나 자신도이를 해결할 수있었습니다.

내가 코드에이 두 가지 기능을 추가했습니다해야 서비스를 찾는 후

하고 그것이 마치 마법처럼 작동합니다 :

func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) { 
    debugPrint("Enabling ...") 

    for characteristic in service.characteristics! { 
     let thisCharacteristic = characteristic as CBCharacteristic 

     debugPrint("Characteristic: ", thisCharacteristic.uuid) 

     if thisCharacteristic.uuid == BEAN_SCRATCH_UUID { 
      debugPrint("Set to notify: ", thisCharacteristic.uuid) 

      // Prepare to show data 

      self.peripheral.setNotifyValue(true, for: thisCharacteristic) 
     } 
    } 
} 

func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) { 
    if characteristic.uuid == BEAN_SCRATCH_UUID { 
     let content = String(data: characteristic.value!, encoding: String.Encoding.utf8) 

     debugPrint("Notified.") 
    } 
}