Hatena::ブログ(Diary)

_development, RSSフィード Twitter

2009-11-04

backport-android-bluetooth

android 1.5/1.6 のbluetooth APIを2.0のインターフェイス(http://developer.android.com/reference/android/bluetooth/package-summary.html)で使用するプロジェクトbackport-android-bluetoothをホストしました。

作業中につき、一部機能しか動きませんが興味のある方は以下のサイトからどうぞ

http://code.google.com/p/backport-android-bluetooth/


実際に使用する場合は、backport-android-bluetooth.jarダウンロードしてプロジェクトのライブラリに追加してください。

パッケージ名はオリジナルの名前の前にbackport.のプレフィクスがついています。

以下のように使います。

import backport.android.bluetooth.*;

BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter();
Log.d("Bluetooth", bluetooth.getName());

GavinGavin 2010/01/24 17:32 Hi, I am new to Android programming but I need to do a project on writing Android program with Bluetooth. I want to make use of your Bluetooth library but I need some extra functions, which I need to modify some of the source code of your library and compile it again.

However, after I have imported the project into Eclipse, it says
"The import android.bluetooth.IBluetoothDevice cannot be resolved", I would like to ask whether I have miss something? How can I get the backport-android-bluetooth project compiled?

esmasuiesmasui 2010/01/24 18:29 Hi, Gavin
Please build(clean) project after import.
Thanks

GavinGavin 2010/01/25 23:45 Thank you very much~~

nikoniko 2010/07/08 12:19 auのIS01でも動きました。ありがとうございます。

kwmrkwmr 2010/10/25 20:35 netwalker PC-T1 の /etc/bluetooth/rfcomm.conf に、携帯printerを登録し、
sudo chmod 666 /dev/rfcomm0 を実行し、
ruby のスクリプトで、/dev/rfcomm0 に書き込みを行うことで
netwalker PC-T1 から携帯printer に印刷しています。

HTC desire(X06HT)から携帯プリンタに印刷したいと思い、Javaの勉強を始めたところです。

backport-android-bluetooth を使って HTC desire(X06HT)から携帯プリンタに印刷できるのでしょうか。

もし、できるのでしたら、簡単なサンプルを教えていただけないでしょうか。

esmasuiesmasui 2010/10/26 02:41 kwmrさん

desireは標準APIでBluetoothが使えるので、backport-android-bluetoothは不要です。
携帯プリンタに何を印字させるのかは存じませんが、写真などであればOBEXインテントを使えば(プリンタが対応しているなら)印刷できると思います。
BPP(印刷プロファイル)を使って印刷したい場合は、標準では非対応だと思うので自前でプロファイルの仕様を実装するかサードパーティのライブラリを使うことになるのではないでしょうか。
私自身は試したことがないので、サンプルはご提供できません。

kwmrkwmr 2010/10/26 07:42 お返事ありがとうございます。
Android 2.1 プログラミングバイブルという本には、2台の端末(serverとclient)でbluetooth を介して
チャットを行うサンプルが載っているのですが、Java初心者の私には、複雑すぎてまだ良く分かりません。
これからしっかり勉強しようと思っていますが、その前にまず、標準Bluetooth APIで,
Bluetooth 携帯プリンタに、印刷できるのかどうかを知りたくて情報収集していたところ、このページを
見つけ、質問した次第です。
BluetoothSocket に書き込みすることで、印刷できると思ってよろしいでしょうか。
なお、印刷するのは、"This is test" といった程度の、英文テキストです。
また、これからもたびたび質問すると思いますので、よろしくお願いします。

kwmrkwmr 2010/10/29 19:35 cannot write
cannot connect
android.bluetooth.BluetoothSocket@4619b0f0
BLM-80
-------------------------------------------------
BLM-80という携帯プリンタに印字テストを以下のようなソースで行ってみましたら、上のように表示されました。
標準API を用いました。非公式APIなら可能になるのでしょうか。

途中省略。
static BluetoothAdapter btAdapter;
static BluetoothDevice device;
static BluetoothSocket socket;
static OutputStream output;

btAdapter=BluetoothAdapter.getDefaultAdapter();

String address="00:01:90:E1:CD:41";
device=btAdapter.getRemoteDevice(address);
addText(device.getName());

UUID MY_UUID=
UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
try {
socket=device.createRfcommSocketToServiceRecord(MY_UUID);
addText(socket.toString());
} catch (IOException e) {
addText("cannot get socket");
}

try {
socket.connect();
} catch (IOException e) {
addText("cannot cennect");
}

try {
output=socket.getOutputStream();
} catch (IOException e) {
addText("cannot get outputstream");
}

try {
String message="This is test message";
output.write(message.getBytes());
output.flush();
} catch (IOException e) {
addText("cannot write");
}

try {
socket.close();
} catch (IOException e) {
addText("cannot close socket");
}

kwmrkwmr 2010/10/29 19:48 追伸。
標準APIの説明を読むと、サーバー側の MY_UUID と同じものを
socket=device.createRfcommSocketToServiceRecord(MY_UUID);
で使うとあるので、socket.connect()できないはずですよね。
プリンタに、接続する方法はないのでしょうか。
非公式のAPIのほうにあると良いのですが。

kwmrkwmr 2010/10/29 20:29 たびたびすみません。
AndroidBluetoothAPI_javadoc_0.3 を少し読んでみたのですが、ありそうな気配なので、色々実験してみたいです。
非公式APIを、android2.2 で利用することは、可能でしょうか。
どうすれば、利用できるのでしょうか。

esmasuiesmasui 2010/10/30 19:26 kwmrさん

おっしゃっている非公式APIが、公開APIではないAPI(Frameworkのソースで@hideされているもの)を指しているのであれば、コンパイル時にF/Wのソースを解決できるようにしておくか、またはリフレクションAPIによって使うことができます。

netwalkerの/dev/rfcomm0に対して書き込んでいるrubyスクリプトが何をしているかは知りませんが、単純にソケットに対して書き込みをしているのであれば、SPPプロファイルが使われている可能性があるので、createRfcommSocketToServiceRecord()でSPPを指定して接続してみてはいかがでしょうか。

件のrubyスクリプトを見せていただければ、もうすこしわかるかもしれませんが。。

kwmrkwmr 2010/10/30 20:41 ruby のスクリプトは、単純なものです。これで rfcomm が接続して送信してくれます。
    w = open("/dev/rfcomm0","w")
    w.print "This is test sentence."
    w.close

非公式API は、以下のものです。
http://code.google.com/p/android-bluetooth/

「Project を右クリックして Properties から Java Build Path を指定し Library に
  Download した AndroidBluetooth API 0.3.jar をExternal JARS で追加する。」
というのをネットで見つけたので、やってみました。
簡単なソースを書いて実験してみましたが、最初の段階でつまづいています。
public void onCreate(Bundle icicle) {
      途中省略...
   try {
btAdapter=LocalBluetoothDevice.initLocalDevice(this);
} catch (Exception e) {
addText("cannot get local bluetooth device");
}
}

でいきなり、cannot get local bluetooth device と表示されます。
ところで、
createRfcommSocketToServiceRecord()でSPPを指定するとは、どのようにするのでしょうか。
ドキュメントを読むと、
createRfcommSocketToServiceRecord(UUID uuid)となっているのですが。
SPPを指定する方法がわかりません。

esmasuiesmasui 2010/10/30 21:03 kwmrさん

非公式API(http://code.google.com/p/android-bluetooth/ )を使っているのであれば、質問はそちらの作者の方に投げるのがよいのではないでしょうか。

SPPでの接続は http://www.google.co.jp/search?hl=ja&q=android+bluetooth+spp+uuid&btnG=%E6%A4%9C%E7%B4%A2&aq=f&aqi=&aql=&oq=&gs_rfai= あたりを調べるか、http://www.amazon.co.jp/dp/487311456X に解説が載っていますのでご参照ください。

kwmrkwmr 2010/10/31 08:39 esmasuiさま。いろいろ情報をありがとうございます。購入して解説を読んでみます。
それから、Linux から見たところ,下のようになりDesire にSPP が見当たりません。
hcitool scan
Scanning ...
00:23:76:F5:CA:27 X06HT
sdptool browse
Inquiring ...
Browsing 00:23:76:F5:CA:27 ...
Service RecHandle: 0x10000
Service Class ID List:
"PnP Information" (0x1200)

Service Name: Headset Gateway
Service RecHandle: 0x10001
Service Class ID List:
"Headset Audio Gateway" (0x1112)
"Generic Audio" (0x1203)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 1
Profile Descriptor List:
"Headset" (0x1108)
Version: 0x0100

Service Name: Handsfree Gateway
Service RecHandle: 0x10002
Service Class ID List:
"Handfree Audio Gateway" (0x111f)
"Generic Audio" (0x1203)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 2
Profile Descriptor List:
"Handsfree" (0x111e)
Version: 0x0105

Service Name: Object Push
Service RecHandle: 0x10003
Service Class ID List:
"OBEX Object Push" (0x1105)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 3
"OBEX" (0x0008)
Profile Descriptor List:
"OBEX Object Push" (0x1105)
Version: 0x0100

Service RecHandle: 0x10004
Service Class ID List:
"AV Remote Target" (0x110c)
Protocol Descriptor List:
"L2CAP" (0x0100)
PSM: 23
"AVCTP" (0x0017)
uint16: 0x100
Profile Descriptor List:
"AV Remote" (0x110e)
Version: 0x0100

Service Name: BRCM Advanced Audio
Service RecHandle: 0x10005
Service Class ID List:
"Audio Source" (0x110a)
Protocol Descriptor List:
"L2CAP" (0x0100)
PSM: 25
"AVDTP" (0x0019)
uint16: 0x102
Profile Descriptor List:
"Advanced Audio" (0x110d)
Version: 0x0102

Service Name: Phonebook Access PSE
Service RecHandle: 0x10006
Service Class ID List:
"Phonebook Access - PSE" (0x112f)
Protocol Descriptor List:
"L2CAP" (0x0100)
"RFCOMM" (0x0003)
Channel: 4
"OBEX" (0x0008)
Profile Descriptor List:
"" (0x1130)
Version: 0x0100

kwmrkwmr 2010/10/31 14:14 esmasuiさま。印刷はできていませんが、少し、進展しましたので、報告します。
SPP のUUID を使ったところ、以下のような結果を得ました。印刷できないのがなぜなのかは不明です。
---------------------
socket closed
wrote
got outputstream
connected
got socket
BLM-80
--------------------BLM-80の電源を切ると
socket closed
cannot write
got outputstream
cannot connect
got scoket
BLM-80
--------------------
btAdapter=BluetoothAdapter.getDefaultAdapter();
String address="00:01:90:E1:CD:41";
device=btAdapter.getRemoteDevice(address);
addText(device.getName());

UUID MY_UUID= UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
try {
socket=device.createRfcommSocketToServiceRecord(MY_UUID);
addText("got socket");
} catch (IOException e) {
addText("cannot get socket");
}
try {
socket.connect();
addText("connected");
} catch (IOException e) {
addText("cannot connect");
}
try {
output=socket.getOutputStream();
addText("got outputstream");
} catch (IOException e) {
addText("cannot get outputstream");
}
try {
String message="This is test message\nThis is test message2\nThis is test message2\n";
output.write(message.getBytes());
addText("wrote");
} catch (IOException e) {
addText("cannot write");
}
try {
socket.close();
addText("socket closed");
} catch (IOException e) {
addText("cannot close socket");
}

kwmrkwmr 2010/10/31 17:36 esmasuiさま。経過報告です。
印刷ができるのかどうか知りたくてマーケットを巡回していたら GetBlue というデモ版を
見つけ試したところ、Desire から BLM-80 に印刷できました。
少し希望が持てました。

kwmrkwmr 2010/10/31 19:11 esmasuiさま。ついに印刷できました。一連の作業が速すぎるのではないかと思い、
[Open]ボタンを作って、
btAdapter=BluetoothAdapter.getDefaultAdapter();
String address="00:01:90:E1:CD:41";
device=btAdapter.getRemoteDevice(address);
UUID MY_UUID= UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
socket=device.createRfcommSocketToServiceRecord(MY_UUID);
socket.connect();
output=socket.getOutputStream();
までを割り当て、[印刷]ボタンに
String message="This is test message\nThis is test message2\nThis is test message3\n";
output.write(message.getBytes());
[Close]ボタンに
socket.close();
を割り当てたところ、印刷できました。ありがとうございました。

kwmrkwmr 2010/11/02 12:16 esmasui さま。今日、アマゾンから「ANDROID HACKS」が届きました。
まず、どこを読んだと思いますか。Bluetooth の解説部分でしょうか。
いいえ。ちがいます。執筆者一覧です。
ありました。もしやと思っていたのですが、やっぱりありました。
esmasui さまが載っていました。

僭越ですが、一言。
amazon での本の紹介部分では、この本に Bluetooth の解説があることが分かりません。
ぜひ、含めるべきだと思います。

esmasuiesmasui 2010/11/02 16:29 kwmrさん

印刷できたとのことで良かったです。
SPPで印字できるプリンタがあるとは知らず、こちらも勉強させていただきました。
& お買い上げありがとうございます〜、感謝感謝。

kwmrkwmr 2010/11/03 23:14 esmasui さま。
今日、日本語の印刷に成功しましたので、報告いたします。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/esmasui/20091104/1257287612