SwiftでBluetoothで受けとる更新データを別のビューで反映させる方法がわかりません
・言語:Swift
・使用しているBluetoothデバイス:テキサス・インスツルメンツCC2541 SensorTag
初心者質問ですみません。
初めて質問させて頂きますので、もしこういう表記した方が答えやすいなどありましたらご教示頂けましたら幸いです。
現在、Bluetoothのボタンが押された時にView上にデータの更新が反映されるものを試しに作っております。
「iOS×BLE Core Bluetoothプログラミング」という書籍を参考に進めてはおりまして、セントラルマネージャーやペリフェラルの記述をしているクラス(ViewController)では、sensorTagのボタンが押されるたびに「左」「右」などの更新データをリアルタイムで表示することができました。
しかし、このデータを別クラスのViewControllerで表示しようとしても、リアルタイムにデータが反映されずにうまくいきません。segueでデータを渡す方法など試してみましたが、リアルタイムでの更新ではなく、渡した時のデータのまま表示されてしまいます。
どのような方法で解決したらいいのか検討がつかず、質問させて頂きました。
簡単な内容かもしれませんが、プログラミング初心者ゆえお許し下さい。
下記がコードです。
ViewController.swift
import UIKit
import CoreBluetooth
class ViewController: UIViewController, CBCentralManagerDelegate, CBPeripheralDelegate {
var isScanning = false
var centralManager: CBCentralManager!
var peripheral: CBPeripheral!
@IBOutlet weak var label: UILabel!
var chara = NSData()
override func viewDidLoad() {
super.viewDidLoad()
// セントラルマネージャ初期化
self.centralManager = CBCentralManager(delegate: self, queue: nil)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// =========================================================================
// MARK: CBCentralManagerDelegate
// セントラルマネージャの状態が変化すると呼ばれる
func centralManagerDidUpdateState(central: CBCentralManager!) {
println("state: \(central.state)")
}
// 周辺にあるデバイスを発見すると呼ばれる
func centralManager(central: CBCentralManager!,
didDiscoverPeripheral peripheral: CBPeripheral!,
advertisementData: [NSObject : AnyObject]!,
RSSI: NSNumber!)
{
println("発見したBLEデバイス: \(peripheral)")
if (peripheral.name?.hasPrefix("konashi") != nil) {
self.peripheral = peripheral
self.centralManager.connectPeripheral(self.peripheral, options: nil)
}
}
// ペリフェラルへの接続が成功すると呼ばれる
func centralManager(central: CBCentralManager!,
didConnectPeripheral peripheral: CBPeripheral!)
{
println("接続成功!")
// サービス探索結果を受け取るためにデリゲートをセット
peripheral.delegate = self
// サービス探索開始
peripheral.discoverServices(nil)
}
// ペリフェラルへの接続が失敗すると呼ばれる
func centralManager(central: CBCentralManager!,
didFailToConnectPeripheral peripheral: CBPeripheral!,
error: NSError!)
{
println("接続失敗・・・")
}
// =========================================================================
// MARK:CBPeripheralDelegate
// サービス発見時に呼ばれる
func peripheral(peripheral: CBPeripheral!, didDiscoverServices error: NSError!) {
if (error != nil) {
println("エラー: \(error)")
return
}
let services: NSArray = peripheral.services
println("\(services.count) 個のサービスを発見! \(services)")
for obj in services {
if let service = obj as? CBService {
// キャラクタリスティック探索開始
peripheral.discoverCharacteristics(nil, forService: service)
}
}
}
// キャラクタリスティック発見時に呼ばれる
func peripheral(peripheral: CBPeripheral!,
didDiscoverCharacteristicsForService service: CBService!,
error: NSError!)
{
if (error != nil) {
println("エラー: \(error)")
return
}
let characteristics: NSArray = service.characteristics
for obj in characteristics {
if let characteristic = obj as? CBCharacteristic {
// 更新通知受け取りを開始する
peripheral.setNotifyValue(
true,
forCharacteristic: characteristic)
}
}
}
// Notify開始/停止時に呼ばれる
func peripheral(peripheral: CBPeripheral!,
didUpdateNotificationStateForCharacteristic characteristic: CBCharacteristic!,
error: NSError!)
{
if error != nil {
println("Notify状態更新失敗...error: \(error)")
}
else {
println("Notify状態更新成功!characteristic UUID:\(characteristic.UUID), isNotifying: \(characteristic.isNotifying)")
}
}
// データ更新時に呼ばれる
func peripheral(peripheral: CBPeripheral!,
didUpdateValueForCharacteristic characteristic: CBCharacteristic!,
error: NSError!)
{
if error != nil {
println("データ更新通知エラー: \(error)")
return
}
println("データ更新! characteristic UUID: \(characteristic.UUID), value: \(characteristic.value)")
/**
Sensor Tag の場合 ボタンから
* <00>
* ボタンが離された
* <01>
* 右ボタンが押された
* <02>
* 左ボタンが押された
のいずれかの NSData が返ってくる
*/
var keyPress : UInt8 = 0
characteristic.value .getBytes(&keyPress, length: 1)
chara = characteristic.value
println("キャラの中身は\(chara)です")
if (keyPress == 0){
println("ボタンは押されていない")
label?.text = "押されていない"
} else if (keyPress == 1){
label?.text = "右"
println("右のボタンが押されている")
} else if (keyPress == 2){
label?.text = "左"
println("左のボタンが押されている")
} else if (keyPress == 3){
}
}
// =========================================================================
// MARK: Actions
@IBAction func scanBtnTapped(sender: UIButton) {
if !isScanning {
isScanning = true
self.centralManager.scanForPeripheralsWithServices(nil, options: nil)
sender.setTitle("STOP SCAN", forState: UIControlState.Normal)
}
else {
self.centralManager.stopScan()
sender.setTitle("START SCAN", forState: UIControlState.Normal)
isScanning = false
}
}
}
NextViewController.swift
import UIKit
class NextViewController: UIViewController {
@IBOutlet weak var label2: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
var chara2 = ViewController().chara
println(chara2)
var keyPress2 : UInt8 = 0
chara2 .getBytes(&keyPress2, length: 1)
println(keyPress2)
if (keyPress2 == 0){
println("ボタンは押されていない2")
} else if (keyPress2 == 1){
println("右のボタンが押されている2")
} else if (keyPress2 == 2){
println("左のボタンが押されている2")
} else if (keyPress2 == 3){
println("両方のボタンが押されている2")
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
SensorTagのボタンを押すたびにUILabelに「右」「左」というふうに、文字が表示されます。これを別のクラス(別のUIViewController?)では表示できません状況です。