2017-10-03 28 views
0

私は、単一の周辺機器と通信する簡単なBLEアプリケーションを作成しています。電話は中央として機能します。私はテスト用の周辺機器として使用しているiPadを持っています。周辺機器をシミュレートするために、LightBlueアプリがインストールされています。ペリフェラルは、この形式の一連のデータを送信することになっています。Bluetooth経由で文字列データを受信する

TEM:25.11 | HUM:70 | PM10:43 | PM25:32

LightBlueで1つのサービスで空の仮想周辺機器を作成しました。以下は

enter image description here

enter image description here

Bluetooth接続処理のための私のコードです。

import UIKit 
import CoreBluetooth 

class ViewController: UIViewController { 

    fileprivate let serviceUUID = CBUUID(string: "19B10010-E8F2-537E-4F6C-D104768A1214") 
    fileprivate let characteristicUUID = CBUUID(string: "19B10011-E8F2-537E-4F6C-D104768A1214") 

    fileprivate var manager: CBCentralManager! 
    fileprivate var peripheral: CBPeripheral! 
    fileprivate var characteristic: CBCharacteristic! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     manager = CBCentralManager(delegate: self, queue: nil) 
    } 

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

    fileprivate func startScan() { 
     manager.scanForPeripherals(withServices: [serviceUUID], options: nil) 
    } 

    fileprivate func stopScan() { 
     manager.stopScan() 
    } 

    fileprivate func disconnectFromDevice() { 
     guard let peripheral = peripheral else { return } 
     manager.cancelPeripheralConnection(peripheral) 
    } 

    fileprivate func restoreCentralManager() { 
     manager.delegate = self 
    } 

} 

// MARK: - CBCentralManagerDelegate 
extension ViewController: CBCentralManagerDelegate { 
    func centralManagerDidUpdateState(_ central: CBCentralManager) { 
     switch central.state { 
     case .unsupported: 
      print("Unsupported") 
     case .unauthorized: 
      print("Unauthorized") 
     case .poweredOn: 
      print("Powered On") 
      startScan() 
     case .resetting: 
      print("Resetting") 
     case .poweredOff: 
      print("Powered Off") 
     case .unknown: 
      print("Unknown") 
     } 
    } 

    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) { 
     print("Discovered \(String(describing: peripheral.name)) at \(RSSI)") 

     if peripheral.name == nil || peripheral.name == "" { 
      return 
     } 

     if self.peripheral == nil || self.peripheral.state == .disconnected { 
      stopScan() 

      self.peripheral = peripheral 
      central.connect(peripheral, options: nil) 
     } 
    } 

    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) { 
     peripheral.delegate = self 
     peripheral.discoverServices([serviceUUID]) 
    } 

    func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) { 

     self.peripheral = nil 
     central.scanForPeripherals(withServices: nil, options: nil) 
    } 

    func centralManager(_ central: CBCentralManager, didFailToConnect peripheral: CBPeripheral, error: Error?) { 
     self.peripheral = nil 
    } 

    func centralManager(_ central: CBCentralManager, willRestoreState dict: [String : Any]) { 
    } 
} 

// MARK: - CBPeripheralDelegate 
extension ViewController: CBPeripheralDelegate { 
    func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) { 
     guard let services = peripheral.services else { return } 
     print("No. of services: \(services.count)") 

     for service in services { 
      print(service.uuid) 
      if service.uuid == serviceUUID { 
       peripheral.discoverCharacteristics(nil, for: service) 
      } 
     } 
    } 

    func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) { 
     guard let characteristics = service.characteristics else { return } 

     for characteristic in characteristics { 
      print("characteristic: \(characteristic.uuid)") 
      if characteristic.uuid == characteristicUUID { 
       self.characteristic = characteristic 
       peripheral.setNotifyValue(true, for: characteristic) 
       peripheral.readValue(for: characteristic) 
      } 
     } 
    } 

    func peripheral(_ peripheral: CBPeripheral, didWriteValueFor characteristic: CBCharacteristic, error: Error?) { 
     print(error) 
    } 

    func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {   
     if characteristic.uuid == characteristicUUID { 
      print("Got reply from: \(characteristic.uuid)") 
      print(characteristic.value) 
      if let data = characteristic.value, let string = String(data: data, encoding: String.Encoding.utf8) { 
       print(string) 
      } else { 
       print("No response!") 
      } 
     } 
    } 

} 

検出と接続の部分は問題ありません。問題は、私は周辺機器からそのデータ文字列を受け取らないということです。

方法peripheral(_:didUpdateValueFor:error:)は解雇されますか?私はから回答を得ました:19B10011-E8F2-537E-4F6C-D104768A1214コンソールでの出力。しかし、characteristic.valueを印刷してデータがあるかどうかを調べると、nilが返されます。

コードに問題があるかどうかはわかりません。またはLightBlueで周辺機器を間違って設定しました。 LightBlueは自動的にデータを送信しますか? ボタンを送信するか、どこにでも送信します。

デモプロジェクトhereもアップロードしました。あなただけがこれを行う必要があり、その特定の特性に値を書き込むことができることを示す

+0

も読んで、あなたの新しい仮想周辺の構成は何ですか? –

+0

@VarunNaharia LightBlueアプリでは? – Isuru

+0

はい同じように設定してから問題を見つけようとします –

答えて

1

あなたの水色の設定は

関連する問題