🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Bluetooth

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

Xcode

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

Swift

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

Q&A

解決済

1回答

4482閲覧

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

kkk555

総合スコア1

Bluetooth

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

Xcode

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

Swift

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

1グッド

0クリップ

投稿2020/12/16 14:35

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

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

ソースコード

ViewController(swift)

1 2import UIKit 3import CoreBluetooth 4 5class ViewController: UIViewController, CBCentralManagerDelegate, CBPeripheralDelegate { 6 7 private var isScanning = false 8 private var centralManager: CBCentralManager! 9 private var peripheral: CBPeripheral! 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 14 // セントラルマネージャ初期化 15 centralManager = CBCentralManager(delegate: self, queue: nil) 16 } 17 18 override func didReceiveMemoryWarning() { 19 super.didReceiveMemoryWarning() 20 } 21 22 // ========================================================================= 23 // MARK: CBCentralManagerDelegate 24 25 // セントラルマネージャの状態が変化すると呼ばれる 26 func centralManagerDidUpdateState(_ central: CBCentralManager) { 27 if central.state == CBManagerState.poweredOn{ 28 print("state: (central.state)") 29 } 30 } 31 32 // 周辺にあるデバイスを発見すると呼ばれる 33 private func centralManager(central: CBCentralManager, 34 didDiscoverPeripheral peripheral: CBPeripheral, 35 advertisementData: [String : AnyObject], 36 RSSI: NSNumber) 37 { 38 print("発見したBLEデバイス: (peripheral)") 39 40 if let name = peripheral.name, name.hasPrefix("DSD TECH") { 41 self.peripheral = peripheral 42 centralManager.connect(peripheral, options: nil) 43 } 44 } 45 46 // ペリフェラルへの接続が成功すると呼ばれる 47 func centralManager(central: CBCentralManager, 48 didConnectPeripheral peripheral: CBPeripheral) 49 { 50 print("接続成功!") 51 52 // サービス探索結果を受け取るためにデリゲートをセット 53 peripheral.delegate = self 54 55 // サービス探索開始 56 peripheral.discoverServices(nil) 57 } 58 59 // ペリフェラルへの接続が失敗すると呼ばれる 60 private func centralManager(central: CBCentralManager, 61 didFailToConnectPeripheral peripheral: CBPeripheral, 62 error: NSError?) 63 { 64 print("接続失敗・・・") 65 } 66 67 // ========================================================================= 68 // MARK:CBPeripheralDelegate 69 70 // サービス発見時に呼ばれる 71 private func peripheral(peripheral: CBPeripheral, didDiscoverServices error: NSError?) { 72 73 if let error = error { 74 print("エラー: (error)") 75 return 76 } 77 78 guard let services = peripheral.services, services.count > 0 else { 79 print("no services") 80 return 81 } 82 print("(services.count) 個のサービスを発見! (services)") 83 84 for service in services { 85 // キャラクタリスティック探索開始 86 peripheral.discoverCharacteristics(nil, for: service) 87 } 88 } 89 90 // キャラクタリスティック発見時に呼ばれる 91 private func peripheral(peripheral: CBPeripheral, 92 didDiscoverCharacteristicsForService service: CBService, 93 error: NSError?) 94 { 95 if let error = error { 96 print("エラー: (error)") 97 return 98 } 99 100 guard let characteristics = service.characteristics, characteristics.count > 0 else { 101 print("no characteristics") 102 return 103 } 104 print("(characteristics.count) 個のキャラクタリスティックを発見! (characteristics)") 105 106 for characteristic in characteristics { 107 // Readプロパティを持つのキャラクタリスティックの値を読み出す 108 if characteristic.properties.contains(.read) { 109 peripheral.readValue(for: characteristic) 110 } 111 } 112 } 113 114 // データ読み出しが完了すると呼ばれる 115 private func peripheral(peripheral: CBPeripheral, didUpdateValueForCharacteristic characteristic: CBCharacteristic, error: NSError?) 116 { 117 if let error = error { 118 print("読み出し失敗...error: (error), characteristic uuid: (characteristic.uuid)") 119 return 120 } 121 122 print("読み出し成功!service uuid: (characteristic.service.uuid), characteristic uuid: (characteristic.uuid), value: (String(describing: characteristic.value))") 123 124 // バッテリーレベルのキャラクタリスティックかどうかを判定 125 if characteristic.uuid.isEqual(CBUUID(string: "2A19")) 126 { 127 var _: CUnsignedChar = 0 128 129 // 1バイト取り出す 130// characteristic.value?.getBytes( byte, length: 1) 131 132 func getbytes(_ byte:UnsafeMutablePointer<UInt8>){ 133 print("Battery Level: (byte)") 134 } 135 } 136 } 137 138 // ========================================================================= 139 // MARK: Actions 140 141 @IBAction func scanBtnTapped(sender: UIButton) { 142 if !isScanning { 143 isScanning = true 144 centralManager.scanForPeripherals(withServices: nil, options: nil) 145 146 sender.setTitle("STOP SCAN", for: UIControl.State.normal) 147 } else { 148 centralManager.stopScan() 149 sender.setTitle("START SCAN", for: UIControl.State.normal) 150 isScanning = false 151 } 152 } 153} 154

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

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

試したこと

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

MaeharaKenji👍を押しています

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

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

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

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

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

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

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

回答1

0

ベストアンサー

BLEはAppleがサンプルコードを提供しているため、下記を参考にしてみてはいかがでしょうか。
Transferring Data Between Bluetooth Low Energy Devices

投稿2020/12/24 09:34

編集2020/12/24 09:36
MasatoUchida

総合スコア134

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

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

kkk555

2020/12/24 14:25

ありがとうございます。 正常に動きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問