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

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

ただいまの
回答率

88.62%

【iOS】【Core bluetooth】8バイトのデータをBLEデバイスにwriteしたい

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,121

zetsubouriarie

score 10

 前提・実現したいこと

BLEデバイスにiPhoneからデータを送信するアプリを作っています。ペアリングはできていますが、データ送信がうまくいっていません。データの記述方法と、Charadteristic UUIDの記述方法をご教授いただきたいです。

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

エラー等は発生していませんが、データ送信ができていません。
下記のソースコードの、
writeValue(data, for: writeChar, type: .withoutResponse)
の引数が正しくないと思われます。
writeChar にUUIDを持たせるのは
self.writeChar = CBMutableCharacteristic(type: characteristicUUID, properties: properties, value: nil, permissions: permissions)
では不可能なのでしょうか?

 該当のソースコード

import UIKit
import CoreBluetooth;

class ViewController: UIViewController,CBCentralManagerDelegate, CBPeripheralDelegate {

    var serviceUUID : CBUUID!
    var characteristicUUID : CBUUID!

    var manager : CBCentralManager!
    var peripheral : CBPeripheral!
    var characteristic : CBCharacteristic!
    var writeChar : CBMutableCharacteristic!

    let properties = (CBCharacteristicProperties.write)
    let permissions = (CBAttributePermissions.writeable)


    @IBOutlet var ConnectButton: UIButton!
    @IBOutlet var DisconnectButton: UIButton!
    @IBOutlet var OnButton: UIButton!
    @IBOutlet var OffButton: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.serviceUUID = CBUUID(string: Constants.SERVICE_UUID)
        self.characteristicUUID = CBUUID(string: Constants.CHARACTERISTIC_UUID)
        self.manager = CBCentralManager(delegate : self, queue : nil)
        self.ConnectButton.isEnabled = true
        self.DisconnectButton.isEnabled = true
        self.writeChar = CBMutableCharacteristic(type: characteristicUUID, properties: properties, value: nil, permissions: permissions)


    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    @IBAction func ConnectClicked(_ sender: Any) {
        self.manager.scanForPeripherals(withServices: [self.serviceUUID], options: nil)
    }
    @IBAction func DisconnectClicked(_ sender: Any) {
        self.manager.cancelPeripheralConnection(peripheral)
    }

    @IBAction func OnClicked(_ sender: Any) {
        let ondata: [UInt8] = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01];
        let data = Data(ondata)
        peripheral.writeValue(data, for: writeChar, type: .withoutResponse)

    }

    @IBAction func OffClicked(_ sender: Any) {
        let offdata: [UInt8] = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
        let data = Data(offdata)
        peripheral.writeValue(data, for: writeChar, type: .withoutResponse)

    }


    func centralManagerDidUpdateState(_ central: CBCentralManager) {
    }

    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {

        self.peripheral = peripheral
        self.peripheral.delegate = self
        self.manager.connect(peripheral, options: nil)
        self.manager.stopScan()
    }

    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
        self.peripheral.discoverServices([self.serviceUUID])
    }

    func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
        if (error != nil) {
            return
        }
        let services : [CBService]? = peripheral.services
        for service in services! {
            if service.uuid.isEqual(self.serviceUUID) {
                self.peripheral.discoverCharacteristics(nil, for:service)
            }
        }
    }

    func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
        if error != nil {
            return
        }
        let characteristics : [CBCharacteristic]? = service.characteristics
        for c in characteristics! {
            if c.uuid.isEqual(self.characteristicUUID) {
                self.peripheral.readValue(for: c)
            }
        }
    }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

-1

ペリフェラルは市販のデバイスでしょうか?

コメントと間違えて投稿してしまいました。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/29 12:03

    ペリフェラルは、市販のデバイスではありません。
    搭載されているチップは市販のもので、UUIDやMacアドレスは決まっています。

    キャンセル

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

  • ただいまの回答率 88.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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