質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

8155閲覧

swift : BLEデバイスから送信される文字列の受信方法

sandalwalk

総合スコア77

Bluetooth

Bluetoothとは短距離の間でデータを交換するための無線通信規格である。固定・モバイル両方のデバイスから、短波の電波送信を行うことで、高いセキュリティをもつパーソナルエリアネットワーク(PAN)を構築する。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2016/11/12 01:16

編集2016/11/13 00:07

xcode8.0 + iOS10.0でBLEデバイス間でのテキストメッセージの送受信アプリを作っています。アプリ側からBLEデバイスにメッセージを送信する機能の実装はできたのですが、相手側から送られてくるメッセージを監視し続けて、アプリ上の(例えばラベル内)にリアルタイムに表示させる方法が分からずに困っています。

ちなみに、アプリストアからダウンロードしたメッセージ送受のアプリではBLEデバイスとのメッセージのやりとりは出来ているので、相手側BLEデバイスの問題で無いことは確認済みです。

また、メッセージ送信はネット上の情報で見よう見真似で以下の様に実装しました。

@IBAction func sendButton(_ sender: AnyObject) { //キャラクタリスティックに値を書き込む let data : NSData = inputText.text!.data(using: String.Encoding.utf8, allowLossyConversion: true) as NSData! BLEPeripheral.writeValue(data as Data, for: characteristic_1, type: CBCharacteristicWriteType.withResponse) /// 送信後textfiledをクリアする inputText.text = nil } func peripheral(_ peripheral: CBPeripheral, didWriteValueFor characteristic: CBCharacteristic, error: Error?) { if(error != nil){ print("エラー:\(error!)") return } print("書き込み成功") }

受信データを読み込むには以下の方法でできるかと思ったのですが、上手く行きません。

let RX = BLEPeripheral.readValue(for: characteristics_1) print("RX Data is: \(RX)")

いつ送られてくるか分からないデータを常に監視し、送られてきたタイミングでデータを読み取りを行うにはどうしたら良いのか、どなたかアドバイスをお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

func setNotifyValue(_ enabled: Bool, for characteristic: CBCharacteristic)

を使うと、characteristicのvalueに変化が起こった時だけ情報を更新できる。
具体的には

func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) { if error != nil { print("エラー\(error)") } if !((service.characteristics?.count)!>0) { print("キャラクタリスティックがありません") } let characteristics = service.characteristics! characteristicTX = characteristics[0] characteristicRX = characteristics[1] //BLEPeripheral.readValue(for: characteristicRX) // notify をセットする BLEPeripheral.setNotifyValue(true, for: characteristicRX) } // notification ON/OFFの状態を確認するためのメソッド func peripheral(_ peripheral: CBPeripheral, didUpdateNotificationStateFor characteristicRX: CBCharacteristic, error: Error?) { if error != nil { print("Notify状態更新失敗...error: \(error)") } else { print("Notify状態更新成功! isNotifying: \(characteristicRX.isNotifying)") } } // notificationが来た時だけ以下が実行される func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristicRX: CBCharacteristic, error: Error?) { print("RX value:\(characteristicRX.value!)") let data = NSString(data: characteristicRX.value!, encoding: String.Encoding.utf8.rawValue) print("RX text : \(data!)") rxTextLabel.text = data as String? }

投稿2016/11/15 03:28

sandalwalk

総合スコア77

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

readValue(for:)はリクエストするだけではないでしょうか?(関数の戻り値がVoidなので何かの値を取得する関数ではないです)

少し調べてみましたが(以下、Swift2なので適宜Swift3に差し替えてください)、リクエスト後、データを受信すると、

swift

1func peripheral(peripheral: CBPeripheral, didUpdateValueForCharacteristic characteristic: CBCharacteristic, error: NSError?)

が呼ばれるので、この中で、

swift

1let value = characteristic.value

で取得できるようです。(その前に要errorチェック)

BLE知らないので外してたらすみません。

投稿2016/11/14 04:40

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問