2016-03-25 22 views
4

bluetooth周辺機器のRSSI値を頻繁に更新できるOS Xクライアントを作成しようとしています。didReadRSSIはiOSでは呼び出されましたが、OS Xでは呼び出されません

私のクライアントアプリケーションは、私がブルートゥースサービスを宣伝しているテストアプリケーションを実行している私のiPhoneデバイスを探しています。クライアントアプリケーションには、peripheral.readRSSI()が3秒ごとに実行されるタイマーがあります。

OS Xで実行しているときにdidReadRSSIを呼び出すのに成功していませんが、iOS上で同じSwiftコードを実行すると正常に動作します。

iOS 9.3では - didReadRSSIが有効なRSSI値で期待通りに呼び出されます。

OS X 10.11.4で - didReadRSSIは呼び出されません。

import Foundation 
import CoreBluetooth 

class SampleClient:NSObject, CBCentralManagerDelegate, CBPeripheralDelegate { 

var manager: CBCentralManager! 
var peripheral: CBPeripheral! 
var characteristic: CBCharacteristic! 
var readRSSITimer: NSTimer! 

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

func centralManagerDidUpdateState(central: CBCentralManager) { 
    if self.manager.state == .PoweredOn { 
     self.manager.scanForPeripheralsWithServices(nil, options: nil) 
    } 
} 

func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber) { 
    if let name = peripheral.name { 
     print(name) 
     self.peripheral = peripheral 
     self.manager.connectPeripheral(self.peripheral, options: 
      [CBConnectPeripheralOptionNotifyOnDisconnectionKey : true]) 
    } 
} 

func centralManager(central: CBCentralManager, didConnectPeripheral peripheral: CBPeripheral) { 
    peripheral.readRSSI() 
    self.startReadRSSI() 
    peripheral.delegate = self 
    peripheral.discoverServices(nil) 
} 

func centralManager(central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: NSError?) { 
    self.stopReadRSSI() 
    if self.peripheral != nil { 
     self.peripheral.delegate = nil 
     self.peripheral = nil 
    } 
} 

func centralManager(central: CBCentralManager, didFailToConnectPeripheral aPeripheral: CBPeripheral, error: NSError?) { 
    if self.peripheral != nil { 
     self.peripheral.delegate = nil 
     self.peripheral = nil 
    } 
} 

func disconnect() { 
    if self.characteristic != nil { 
     self.peripheral.setNotifyValue(false, forCharacteristic: self.characteristic) 
    } 
    if self.peripheral != nil { 
     self.manager.cancelPeripheralConnection(self.peripheral) 
    } 
} 

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

func peripheral(peripheral: CBPeripheral, didDiscoverServices error: NSError?) { 
    for service: CBService in peripheral.services! { 
     peripheral.discoverCharacteristics(nil, forService: service) 
    } 
} 

func peripheral(peripheral: CBPeripheral, didReadRSSI RSSI: NSNumber, error: NSError?) { 
    print("RSSI = \(RSSI)") 
} 

func readRSSI() { 
    if (self.peripheral != nil) { 
     self.peripheral.delegate = self 
     print("RSSI Request - \(peripheral.name!)") 
     self.peripheral.readRSSI() 
    } else { 
     print("peripheral = nil") 
    } 
} 

func startReadRSSI() { 
    if self.readRSSITimer == nil { 
     self.readRSSITimer = NSTimer.scheduledTimerWithTimeInterval(3.0, target: self, selector: #selector(SampleClient.readRSSI), userInfo: nil, repeats: true) 
    } 
} 

func stopReadRSSI() { 
    if (self.readRSSITimer != nil) { 
     self.readRSSITimer.invalidate() 
     self.readRSSITimer = nil 
    } 
} 

} 

iOSの上で実行し、出力は次のとおりです:私はiOSとOS X上で次のまったく同じスウィフトコードを実行しています

iPhone 
RSSI = -38 
RSSI Request - iPhone 
RSSI = -44 
RSSI Request - iPhone 
RSSI = -45 

OS X上で動作し、出力は次のようになります。

My iPhone 6 
RSSI Request - My iPhone 6 
RSSI Request - My iPhone 6 

返されるペリフェラル名は、2つのプラットフォームで異なることに注意してください。それが重要かどうかは分かりません。

didReadRSSIをOS Xで呼び出すにはどうすればよいですか?

答えて

1

OSXでは古いスタイルが使用されていますが、これをクラスに追加して動作を期待してください。

func peripheralDidUpdateRSSI(peripheral: CBPeripheral!, error: NSError!) { 
    print("peripheralDidUpdateRSSI \(peripheral.name!) = \(peripheral.RSSI)") 
} 
関連する問題