Terminal for Bluetooth
Terminal for Bluetoothは、Android端末とBluetoothデバイスの間で、SPP(RFCOMM)を利用してシリアル通信する為のAndroidアプリです。
データをアスキー形式又はバイナリ(16進数)形式で入力して、Bluetoothデバイスと送受信することが出来ます。
接続するBluetoothデバイスは、SPP(シリアルポートプロファイル)に対応している必要があります。
このアプリは電子工作等でBluetoothデバイスを作成するような方向けに作っています。
主な使い方
- Bluetoothデバイスから接続
アプリを起動すると、Android端末は自動的に接続待機状態になります。
Bluetoothデバイス側がマスターで有れば、この状態でAndroidへ接続が可能です。
- Bluetoothデバイスに接続
メニューから接続を選択すると、ペアリング済みBluetoothデバイス一覧が表示されます。
この中から接続したいBluetoothデバイスを選択して接続を行います。
- 送受信表示
画面には、送受信のログが表示されます。
受信データは赤色
送信データは青色
で表示されます。
- データ送信
Bluetoothデバイスと接続後、画面下の文字入力欄に文字を入力して送信ボタンを押すと、データが送信されます。
ASCII表示モード時には入力した内容がそのまま送信されます。
HEX(16進数)表示モード時では入力文字を16進変換して送信します。HEX表示モード時に入力出来る文字は0-9A-Fのみです。その他の文字を入力すると送信に失敗します。
- ASCII表示/HEX表示のモード変更
画面上部の左端のボタンでて切り換えます。
ダウンロード & インストール
現在、Google Play(Android Market)にて公開中です。
![]() 無料版 (広告表示有り) |
|
更新履歴
Version | Memo |
Ver 4.0.1 (2013/5/19) | |
Ver 3.1.0 (2012/4/26) | 接続時にSecure / Insecureの選択を追加(Android 2.3.3以降限定) |
Ver 3.0.0 (2012/4/22) | Ver3 初公開 |
Ver 2.1.2 (2012/2/17) | 自動スクロールの追加 |
Ver 2.0.1 (2012/2/6) |
・データ受信時のバグの修正 |
Ver 2.0.0 (2011/5/8) | Android 2.1以降向け 初公開 |
Ver 1.01 (2011/5/8) | マニフェストでAndroid1.6専用の指定 |
Ver 1.00 | Android 1.6用 初公開 |
Ver2でご寄付を頂いた方へ
誠に勝手ながら、Ver3ではアプリ内広告を採用させて頂き、アプリ内課金による寄付の募集は廃止致しました。
Ver2のアプリ内課金によりご寄付を頂いた方々へは、そのお礼としましてVer3の広告解除の手順をメールにて送信させて頂きました。
Google Checkoutに記載されているメールアドレス宛に既に送信済みですが、もしもメールが届いていない方がおられましたらご連絡下さい。
お手数をお掛けして申し訳ございませんが、何卒ご理解の程よろしくお願いいたします。
公開日:
Comment (63件)
はじめまして。
S2 BluetoothTerminalを便利に使用させて頂いております。
現在、あるandroidアプリとBluetoothデバイスとの接続が出来ず、
検証にS2 BlueTermを用いていますが、「Use secure connect」がOFFでは
接続できますが、ONにするとペアリング済みにもかかわらず、
パスコードを再度要求され接続出来ません。
これはBluetoothデバイスが「2.1+EDR」に対応していないからでしょうか。
この端末はandroidは4.0です。
因みに、別のandroid2.3.4端末のS2からはON・OFFに関わらず接続できます。
何かヒントでも頂ければ幸いです。
よろしくお願い致します。
はじめまして。
多分ですが、単純にお使いのBluetoothデバイスがセキュアな接続に対応していないのだと思います。
もし自作のアプリで、接続に躓いていると言うのであれば
http://s2jp.com/apps/bluetooth-terminal/comment-page-2/#comment-303
を参考にしてみて下さい。
有難う御座いました。
sampleアプリで同様の現象が再現出来ました。
どうもandroidのバージョンや機種により挙動が異なるようで、
createRfcommSocketToServiceRecordでもセキュア接続未対応のBluetoothアダプターに
接続出来る場合があり、疑問が残ります。
S2 BluetoothTerminal、使用させて頂いております。
受信メッセージの表示が非常に安定している点がうれしいのですが、アプリBluetoothChatでは稀に、データが欠けることがあります。特に高い頻度でデータを受信する場合に欠けます。
S2 BluetoothTerminalでは何か特別なことをされているのでしょうか?
BluetoothChat.javaの該当部
byte[] readBuf = (byte[]) msg.obj;
String readMessage = new String(readBuf, 0, msg.arg1);
受信バッファの取り込み部分だけでも教えて頂ければ
幸いです。
アプリのご利用ありがとうございます。
件の症状は、BluetoothChatのバグだと思います。
BluetoothChatでは、BTからデータを受信する部分がUIスレッドとは別のスレッドで処理されています。
この別スレッドでは、受信したデータを画面に表示するために、Handlerを使ってUIスレッドに「受信バッファ」ごと投げてしまっています。
この部分が問題です。
can coffeeさんが示されたBluetoothChat.javaの該当部は、handler内のUIスレッド側の処理部分だと思いますが、
その部分では、別スレッドから送られてきた「受信バッファ」から直接Stringを生成しています。
当然ながら、Stringを生成している間も、別スレッドではデータ受信処理が行われます。
しかし「受信バッファ」は共用されているため、String生成の途中でも新たにデータを受信すると、「受信バッファ」は上書きさてしまいます。
これが原因で、データ欠けが発生していると思われます。
問題を解決するには、これらの処理を排他制御するか、別スレッドで「受信バッファ」を一旦コピーしてからUIスレッドに投げるか・・・
ちなみに当BluetoothTerminalでは、後者の方法、コピーしてからUIスレッドへ投げるようにしています。
BluetoothChatService.javaの456行辺り
// Send the obtained bytes to the UI Activity
mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes, -1, buffer)
.sendToTarget();
の部分を
byte[] buf = new byte[bytes];
for(int i = 0; i < bytes; i++) buf[i] = buffer[i]; // Send the obtained bytes to the UI Activity mHandler.obtainMessage(BluetoothChat.MESSAGE_READ, bytes, -1, buf).sendToTarget(); と言うような感じです。
返信、ありがとうございます。
困っていたことでしたので、Futaba様よりこれほど早く解説を頂き、恐縮と感謝の気持ちです。
早速、トライしてみます。
こんにちは.アプリ拝借させていただきました.
今,自分でもアプリ開発に挑戦しているのですが行き詰ってしまったため,ご教示戴きたく書き込ませていただきます.
サンプルアプリBluetoothChatを改変して,Bluetoothモジュールからのデータ(数値)を受信するアプリを作っています.
データの受信までは成功したのですが,表示時にデータが途切れ途切れになってしまいます.
123.45
と表示させたいところ,たまに
1
23.45
と思わぬところで改行されてしまいます.送信側プログラムはARDUINOで
Serial.println(123.45);
としているだけです.
Futada様のアプリを拝借させていただきますと,理想の形で表示されます.なので受信側プログラムに問題があると思うのですが,送信側にも問題があるのでしょうか?
受信側のプログラムを書き換えるとすれば,どこをどのように書き換えれば改行問題が解決しますでしょうか?
何もかも初心者で大変恐縮です.ご教示いただければ幸いです.
以下に受信側プログラムのデータ(readMessage)表示部分を記します.
case MESSAGE_READ:
byte[] readBuf = (byte[]) msg.obj;
// construct a string from the valid bytes in the buffer
String readMessage = new String(readBuf, 0, msg.arg1);
mConversationArrayAdapter.add(readMessage);
break;
長駄文失礼しました.よろしくお願いします.
補足失礼いたします.
先の質問は上のcan coffee様の質問と類似しているようにも思えるのですが,Futada様のご指南どおりにプログラムを書き換えても,自分の場合うまくいきませんでした.
実力不足で申し訳ないです.よろしくお願いします.
>margarineさま
コメントありがとうございます。
Bluetoothはパケット単位で通信しているので通信のタイミングによっては途中で途切れたようになってしまうのは仕方が無いかと思います。
当アプリでも、改行していないだけで、実際にはコマ切れのデータとなっている場合があります。
ですので、受信データのバッファリングは不可欠かなと・・・
例えば、送信時にはデータの最後に必ず改行コードを付けるようにして、受信時は受信したデータをそのまま使うのでは無く、一度バッファに貯めておいて、改行コードの受信を待ってデータを取り出す・・・と言う様な処理はいかがでしょうか?
>Futada様
返信ありがとうございます.
can coffee様の質問の件のように
byte[] buf = new byte[bytes];
for(int i = 0; i < bytes; i++) buf[i] = buffer[i];
がデータをバッファに貯めるということになるのでしょうか?
そして改行コードの受信を待ってということはif文ですかね?
色々調べたのですが知識もなく探し方も下手で,まったくわかりません.
重ね重ね申し訳ありません.またご返信いただけたら幸いです.
>margarine様
その部分もバッファリングと言えばそうなのですが、その部分はBT受信スレッドとメインスレッドのデータ受け渡しのためにデータをコピーしているだけで、margarineさんの抱えてる問題の解決にはなりません。
また、その部分に改行待機のコードを加えても良いと思いますが、ちょっとここでは説明できないです・・・
代わりに、先の
case MESSAGE_READ:
部分への改行待機のコードを考えてみました。
先ずクラスの最初で
public class BluetoothChat extends Activity {
String readMessageBuffer="";
として、String型のreadMessageBufferを作成しておきます。
次に
case MESSAGE_READ:
byte[] readBuf = (byte[]) msg.obj;
// construct a string from the valid bytes in the buffer
readMessageBuffer += new String(readBuf, 0, msg.arg1);
int linefeed = readMessageBuffer.indexOf("\n");
if(linefeed>=0)
{
String readMessage = readMessageBuffer.substring(0, linefeed);
mConversationArrayAdapter.add(mConnectedDeviceName+": " + readMessage);
readMessageBuffer=readMessageBuffer.substring(linefeed+1);
}
break;
実際に動くかどうか試してませんが、こんな感じで・・・
処理としては、
受信したデータを先ず一度readMessageBufferにくっ付けて、
次に.indexOf(“\n”)で改行コードを探します。
改行コードが見つかれば、改行コード部分で文字列を分割して、Adapterに渡します。
分割で余った部分は再びreadMessageBufferに戻して処理終了。
これはあくまでも一つの例えと言うことで悪しからず。
>Futada様
ご返信ありがとうございます.Futada様のおかげで,無事改行問題を解決いたしました.感謝感激です.
アプリ開発素人の自分に,ここまで丁寧にご指南してくださりありがとうございました.
次にグラフ化や別のデータとの両立を考えているので,まだまだ道のりは長いですが,アプリ完成のために頑張ります.
本当にありがとうございました.
>margarine様
無事に動いたようで何よりです。
何かのセンサーのデータのログ取りなんですね?
グラフ化は結構面倒臭いですが、頑張って下さい。
はじめまして。Oguoと申します。
Terminal for Bluetoothを使用させていただいています。
シンプルで非常に使用しやすいですね。
ところで、現在私もSPPを使ったアプリの開発(人生初開発です!)を試みているのですが、
どうしても分からない点がでてきてしまったので、もしよろしければ少々ご教示お願いできませんか?
まず、SPPの接続相手は、シリアル通信で決められたHEX値を受信すると、
自分が内部に持っている値をHEXで返す、という機器です。
まず、Futaba様のS2 Terminal for Bluetoothを使用したところ、
正しく送受信ができることを確認しました。
次に、BlueToothChatを以下の点だけ変更してアプリからHEX値を送りました。
——————————————————————————————————
・BluetoothChatService.java 51行目
UUIDを00001101-0000-1000-8000-00805F9B34FBに変更
・送信データを、データ取得に必要な値決め打ちに変更
BluetoothChat.java 217行目
変更前:byte[] send = message.getBytes();
変更後:byte[] send = {0x02,0x00,0x00,0x03,0x75,0x01,0x00,0x02,0x7e};
・受信データをまずはbyteデータのまま確認。各値の区切りもわかりやすくするために、文字間にパイプを追記。
(ちからまかせのソースでお恥ずかしいかぎりです。。。)
BluetoothChat.java 271行目コメントアウト
BluetoothChat.java 272行目
変更前:mConversationArrayAdapter.add(mConnectedDeviceName+”: ” + readMessage);
変更後:mConversationArrayAdapter.add(mConnectedDeviceName+”: “+ readBuf[0]+”|”+
readBuf[1]+”|”+readBuf[2]+”|”+readBuf[3]+”|”+readBuf[4]+”|”+readBuf[5]+”|”+readBuf[6]+
readBuf[7]+”|”+ readBuf[8]+”|”+ readBuf[9]);
——————————————————————————————————
このアプリを実行した結果以下のような結果になってしまいました。
●受信側で希望の値が表示さない。文字化けをしているわけではなく目的外の数字が入っていました。
(2の補数として計算しても全く合わないような数字で、127以下の値でも目的外の数字になってしまっています。)
ただし配列の一部には場所のずれがありますが希望データが並んでいます。
●上記の値は同じデータを3回受信したように3行表示されました。
ためしに、mConversationArrayAdapter.add(mConnectedDeviceName+”: ” + “受信”);)というように
変更しても、やはり、「受信」を3回表示しました。
改めて書きますが、Futaba様のS2 Terminal for Bluetoothを使用したところ、正しく送受信ができます。
そこでお願いがあるのですが、もし上記挙動に思い当たる点があり、
HEXで受信する際に何か必要な修正がありましたらご教示いただけないでしょうか?
ずうずうしいお願いであることは十分承知しておりますが、
なにとぞよろしくお願いいたします。
こんにちは、Oguo様
コメントありがとうございます。
もう長くAndroidのプログラムから離れているので的外れかもしれませんが、
仰られている症状で思い当たる点と言えば、10バイトのデータを送信しても一度に10バイト受信できるとは限らず、複数回に分割されて送信または受信することがあると言う点です。
つまり、“「受信」を3回表示しました。”と言う症状は10バイトのデータが3回に分割されて送られたせいでは無いかと思います。
この点は、「受信」の表示と共に、その回に何バイト受信したのかを表示するようにして確認してみるといいかも。
mConversationArrayAdapter.add(mConnectedDeviceName+”: ” + “受信”+msg.arg1);
次にメモリの使われ方ですが、BlueToothChatのプログラムでは、データを受信した時のメモリは使いまわされていて、データが受信される度に上書きされています。
“受信側で希望の値が表示さない”と言う症状は、3回に分割されて受信した時に、表示処理をしている最中にどんどん上書きされて内容が壊されているのでは無いかと思います。
ですので、表示の部分を10バイト固定で表示するのでは無く、受信したバイト数分だけを表示するように変更してみると、正しく表示されるんじゃないかな?と思います。
ただ、そのままだと表示が追いつかないとデータが欠けたりしますが・・・
この辺りも参考にして下さい。
http://s2jp.com/apps/bluetooth-terminal/comment-page-3/#comment-9798
以上、偉そうに書きましたが、間違ってたらごめんなさい^^;
突然のお願いに対し、早急かつ丁寧な回答まことにありがとうございます。
さっそくチャレンジしてみます。
Oguoです。
受信したデータを表示する前にログ出力をするようにして確認した結果、
確かに受信データが分割されていることを確認しました。
今回の作っているものの受信データのサイズは固定だったので、
bufferを別の配列にためて、あるサイズになったら表示する、
のように変更したところ正しく動作させることができました。
受信データが複数回に分割されることがある、というアドバイスはドンピシャでした。
ぶしつけなお願いに対し丁寧に対応していただき、
まことにありがとうございました。
初めまして、TK_ISLANDと申します。
S2 BluetoothTerminal、使用させて頂いております。
私は、PICというマイコンからBluetoothモジュールを経由して
シリアルデータを送信し、当アプリで受信した内容を表示させて
もらっています。
大変恐縮ながら1点ご質問させてください。
当アプリに対し、1秒ごとにデータを送信した場合には、
リアルタイムで反映されるのですが、0.1秒ごとにデータを送信した
場合にはリアルタイムで上手く反映されず、一括でしかもランダムな
タイミングでデータが受信されてしまいます。
アプリ側で何か受信タイミング等の制約を掛けられておるのでしょうか?
お手数お掛け致しますが、何卒ご教授の程、宜しくお願い致します。
コメントありがとうございます。
長く放置していて、プログラムの内容もうろ覚えではありますが、
アプリ側では受信のタイミングを変えたりはして無いと思います。
Futaba様
ご回答有難う御座います。
アプリ側での設定は特に無いのですね…
やはり外部モジュールとスマホ双方のBluetoothの性能が
影響を及ぼしているのでしょうか…
一度調べてみたいと思います。
Good morning.
I cannot find the purchase version of BT Term S2 Futaba software. I have much need because I have to export lots of data to Excel.
Thanks and best regards.
Anna
おはようございます。
私は、ソフトウェアBT用語S2双葉の有料版を見つけることができません。私は、Excelにデータをエクスポートする必要がありますので、私はあまり必要としています。
おかげで、宜しく
Anna
Hi, sorry to bother you but I would like to buy the paid version of BT Term and can’t find it on GooglePlay. I need to save as file and get rid of adverts. Hope you can help.
Many thanks
Richard