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

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

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

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

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

3回答

4692閲覧

BLE通信での複数のデータの送信方法について

46psm

総合スコア16

Bluetooth

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

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2019/05/17 07:48

私は今、BLEモジュール(ペリフェラル)とAndroid端末(セントラル)でBLE通信を行っております。
動作としては、BLEモジュールに接続された加速度センサの値(X,Y,Z)をBLE通信でAndroidへ送信し、画面上でリアルタイムで値が更新されているのを確認したいです。

今現在の実装状況としては、ペリフェラルから任意のデータ一つをセントラルに送信し、Android端末上で値が更新されていることを確認できています。
しかし加速度データは3軸あるので複数のデータの送信をしたいです。

そこで方法についての提案が2つあるのですが、
・1)送信したいデータごとにcharacteristicを作成し、それぞれ送信する。
・2)使用するcharacteristicは1つにする。ペリフェラルではデータ送信する関数の引数でX,Y,Zと分けて(送信する関数は計3回呼ぶ)、セントラルでXを受け取ったら配列[0]に代入、Yを受け取ったら配列[1]に代入というようにしてデータがそろったら表示する。というのを繰り返す。(説明分かりにくくてごめんなさい)

ということが考えられるのですが、BLE通信で複数のデータを送信する際の一般的な方法はどちらでしょうか?
BLE通信初心者で一般的な方法が分からずにいます。
どなたか回答よろしくお願いします。

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

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

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

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

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

guest

回答3

0

すご~く大雑把で感覚的な話をすれば、普通に提供されているような通信経路では、単発のデータサイズが10の3乗バイトより大きいとか、通信のタイミングで10の-3乗秒より小さい数値が出てこないようなら、やりとりに矛盾さえなければなんとでもなる、と思っちゃってもいいかも知れません。

今回、データ量はたかだかワードのデータが3軸分で、目で確認するのであれば更新レートは100ms程度出れば十分。思いついた方法でやってみればいいでしょう。何なら、考えられるバリエーションをいろいろ試してみてはいかがでしょう。その環境では多少いじったところで見えるような差は出ないと思いますけどね。

なお、

X_high,X_lowのようにX軸だけで2つに分かれている

それって、x_high*256+x_lowでxの値が出る、というだけのことではないですか?
なんでそうなっているのかぐらいの意味は理解しておいた方がいいとは思います。

投稿2019/05/18 23:19

thkana

総合スコア7610

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

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

46psm

2019/05/22 03:55

回答ありがとうございます とても分かりやすい説明に感謝します。
guest

0

BLEのペリフェラルからの通信は、分かりやすく大きく分けて2つあり、ビーコンのようにセントラルに対して送りっぱなしにするもの(アドバタイジング)と、セントラルからの要求に対して1対1で接続し、(characteristicはここから必要になる)任意の長さのデータをやる取りするものがあります。

ここで質問者さんが心配されている「一回の送信が20バイト」までと言うのはアドバタイジングのパケットでの状況ですが、送りたいデータをいちパケットに詰め込めるのであれば、アドバタイジングパケットに載せてしまっても良いと思います。

有名なiBeaconのアドバタイジングパケットは以下のようなものですが、

Tech Web IoT - iBeaconとは

この内、UUID/Major/Minor/TxPowerのサイズ分を自分用のオリジナルのデータに割り当てて使うようなことになると思います。アドバタイジングは送信周期の最低~最高値が決まっていたりするので、数ミリオーダーでのデータ送信はできません。詳細はBluetooth Low Energyの仕様書などをあたってください。

もし、ペリフェラルとセントラル間でコマンド/リクエストやレスポンスのような対話型のやり取りが必要なのであれば、アドバタイジングを終えて、characteristicを使って1対1で接続し、相互にやり取りすることが必須となります。接続が確立するとあらかじめ決めたプロトコルに沿って、整形したデータを送りたいときに送れるようになります。要は用途次第です。

投稿2019/05/17 08:39

dodox86

総合スコア9183

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

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

46psm

2019/05/22 03:55

回答ありがとうございます。 勉強になりました。
guest

0

ベストアンサー

characteristicってのがなにかよーわからんですが、、

単に3つのセンサの値をそれぞれテキストに変換、結合して(例えばコンマで区切るとか)、文字列の最後に\nくっつけて送信、受信すればいいんではないかと。

投稿2019/05/17 07:54

y_waiwai

総合スコア87719

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

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

46psm

2019/05/17 08:11

y_waiwai様 回答ありがとうございます。 なるほど 確かにそれなら一回の送信で全部送れそうですね。 しかしBLE通信は一回の送信が20バイトまでとされていて、加速度データ3軸を文字列とすると超えてしまう可能性が出てきてしまいます。 処理を軽くするという点では適していると思うので参考にさせていただきます。
y_waiwai

2019/05/17 09:22

加速度センサの生データはせいぜい2バイト程度。 それをHexで文字列にすると4文字。で、それを3軸で12文字。 デリミタ\n1文字入れても13文字ですぜ 数値変換はAndroid側ですればよろしい
46psm

2019/05/17 15:53

私の使用している加速度センサがX_high,X_lowのようにX軸だけで2つに分かれているので合計で6つのデータを送信することになってしまいます。説明していなくてすみません。 でもそうすると2回に分けて送信すればよさそうなんですかね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問