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

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

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

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

Xcode

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

Swift

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

解決済

Bluetoothモジュールを用いてArduinoとiOSアプリを接続したい

kkk555
kkk555

総合スコア1

Bluetooth

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

Xcode

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

Swift

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

1回答

1評価

0クリップ

2762閲覧

投稿2020/12/16 14:35

周辺にあるデバイスの発見ができない

アプリ作成初心者なので至らないところがあると思いますがよろしくお願いします。
Xcode 12.3
Swift 5
iOS 14.2
を用いています。
ArduinoからデータをBluetoothで送信して、iPhoneでデータを受け取るアプリを作成しています。
bluetoothモジュールを用いて、接続を行おうとしているのですがうまくいっていないため質問させていただきました。以下のソースで行っています。

ソースコード

ViewController(swift)

import UIKit import CoreBluetooth class ViewController: UIViewController, CBCentralManagerDelegate, CBPeripheralDelegate { private var isScanning = false private var centralManager: CBCentralManager! private var peripheral: CBPeripheral! override func viewDidLoad() { super.viewDidLoad() // セントラルマネージャ初期化 centralManager = CBCentralManager(delegate: self, queue: nil) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } // ========================================================================= // MARK: CBCentralManagerDelegate // セントラルマネージャの状態が変化すると呼ばれる func centralManagerDidUpdateState(_ central: CBCentralManager) { if central.state == CBManagerState.poweredOn{ print("state: (central.state)") } } // 周辺にあるデバイスを発見すると呼ばれる private func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber) { print("発見したBLEデバイス: (peripheral)") if let name = peripheral.name, name.hasPrefix("DSD TECH") { self.peripheral = peripheral centralManager.connect(peripheral, options: nil) } } // ペリフェラルへの接続が成功すると呼ばれる func centralManager(central: CBCentralManager, didConnectPeripheral peripheral: CBPeripheral) { print("接続成功!") // サービス探索結果を受け取るためにデリゲートをセット peripheral.delegate = self // サービス探索開始 peripheral.discoverServices(nil) } // ペリフェラルへの接続が失敗すると呼ばれる private func centralManager(central: CBCentralManager, didFailToConnectPeripheral peripheral: CBPeripheral, error: NSError?) { print("接続失敗・・・") } // ========================================================================= // MARK:CBPeripheralDelegate // サービス発見時に呼ばれる private func peripheral(peripheral: CBPeripheral, didDiscoverServices error: NSError?) { if let error = error { print("エラー: (error)") return } guard let services = peripheral.services, services.count > 0 else { print("no services") return } print("(services.count) 個のサービスを発見! (services)") for service in services { // キャラクタリスティック探索開始 peripheral.discoverCharacteristics(nil, for: service) } } // キャラクタリスティック発見時に呼ばれる private func peripheral(peripheral: CBPeripheral, didDiscoverCharacteristicsForService service: CBService, error: NSError?) { if let error = error { print("エラー: (error)") return } guard let characteristics = service.characteristics, characteristics.count > 0 else { print("no characteristics") return } print("(characteristics.count) 個のキャラクタリスティックを発見! (characteristics)") for characteristic in characteristics { // Readプロパティを持つのキャラクタリスティックの値を読み出す if characteristic.properties.contains(.read) { peripheral.readValue(for: characteristic) } } } // データ読み出しが完了すると呼ばれる private func peripheral(peripheral: CBPeripheral, didUpdateValueForCharacteristic characteristic: CBCharacteristic, error: NSError?) { if let error = error { print("読み出し失敗...error: (error), characteristic uuid: (characteristic.uuid)") return } print("読み出し成功!service uuid: (characteristic.service.uuid), characteristic uuid: (characteristic.uuid), value: (String(describing: characteristic.value))") // バッテリーレベルのキャラクタリスティックかどうかを判定 if characteristic.uuid.isEqual(CBUUID(string: "2A19")) { var _: CUnsignedChar = 0 // 1バイト取り出す // characteristic.value?.getBytes( byte, length: 1) func getbytes(_ byte:UnsafeMutablePointer<UInt8>){ print("Battery Level: (byte)") } } } // ========================================================================= // MARK: Actions @IBAction func scanBtnTapped(sender: UIButton) { if !isScanning { isScanning = true centralManager.scanForPeripherals(withServices: nil, options: nil) sender.setTitle("STOP SCAN", for: UIControl.State.normal) } else { centralManager.stopScan() sender.setTitle("START SCAN", for: UIControl.State.normal) isScanning = false } } }

発生している問題・エラーメッセージ

表示されているのは以下のメッセージのみです。 state: CBManagerState 周辺のデバイスを発見するところからできていないです。 これ以降、どのようにしたら表示されるか教えていただきたいです。

試したこと

Bluetoothモジュールは3種類ほど試しましたが同じ状態で止まっています。
iPhoneアプリ「LightBlue」でbluetoothモジュールは表示され、接続することはできています。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

TsukubaDepot

2020/12/18 22:47

delegateとして呼び出されるはずのメソッドがすべて private になっているようですが、参考にされた記事が古いということはないでしょうか。 例えば、 func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber) は、最新では func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) という具合に引数名などが変更されています。 おそらく、どこかの記事を参考にしてコピーされた際、Xcode の補完機能などを使ったのではないでしょうか。
kkk555

2020/12/18 23:49

回答ありがとうございます。 古いコードであったため、Xcodeの補完機能を使用しました。 補完機能は使用しない方がよいでしょうか。 よろしくお願いします。
TsukubaDepot

2020/12/22 20:37

補完機能は便利ですし、古いメソッドを新しいメソッドに置き換えてくれることもあるのですが、それは完璧ではないため、Swift のバージョン変更に伴い引数名やメソッド名に変更が生じ他場合には、逐一人力で変更していく必要はあるかと思います。
kkk555

2020/12/23 00:51

ありがとうございます。 手直しでやってみたいと思います。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Bluetooth

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

Xcode

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

Swift

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