なんかいろいろこんぴゅーたかんけいのなぐりがき

なんか勉強しているこんぴゅーた関係のことのメモやそれ以外のことを書こうかなあ...

logs

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

AndroidでBluetooth5

AndroidをクライアントとしたBluetootを利用したPC(Python)との通信がうまくいったのでメモっときます。

いままでうまくいかなかった原因:Pybluezのadvertise_serviceメソッドの引数が求められていたものと違った。

今までは、ネット上に落ちているサンプルコードを参考にして、


uuid = "fa87c0d0-afac-11de-8a39-0800200c9a66"

advertise_service( server_sock, "SampleServer",
service_id = uuid,
service_classes = [ uuid, SERIAL_PORT_CLASS ],
profiles = [ SERIAL_PORT_PROFILE ] )
とかいうふうにしていたが、
これを

uuid = "fa87c0d0-afac-11de-8a39-0800200c9a66"

advertise_service( server_sock, "SampleServer",
service_id = uuid,
service_classes = [ uuid] )
こんな風に書き換えるとうまくいった。

それでは今回の実験に使用した、コードを掲載しておく。
マニフェストのxmlファイルは前回と同じ感じでだと思うので省力する。

このプログラムは、デバイス取得ボタンを押すことにより、ペアリングしているデバイス情報を取得し、
サーバーに接続ボタンで、1番最初に取得したデバイス情報からアドレスをとりだし、そのアドレスに対して接続を試みる。

res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>

<Button android:text="デバイス取得" android:id="@+id/Button01" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
<Button android:text="サーバーに接続" android:id="@+id/Button02" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
</LinearLayout>



BluetoothClient.java

package foo.bar.BTClient;

import java.util.Set;
import java.util.UUID;
import java.util.Vector;

import foo.bar.BTClient.R.id;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class BluetoothClient extends Activity implements OnClickListener {

/** Called when the activity is first created. */
private static final UUID MY_UUID = UUID.fromString("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa");
Button b1,b2;
Communication comu;
Vector<BluetoothDevice> devices = new Vector<BluetoothDevice>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
b1 = (Button)findViewById(id.Button01);
b2 = (Button)findViewById(id.Button02);
b1.setOnClickListener(this);
b2.setOnClickListener(this);
}
public void onClick(View v)
{
if(v.getId()==b1.getId())
{
BluetoothAdapter bt_adapter = BluetoothAdapter.getDefaultAdapter();
if(bt_adapter==null)
{
Toast.makeText(this, "この端末ではBluetoothは利用できません。", Toast.LENGTH_LONG);
finish();
}
if(!bt_adapter.isEnabled())
{
Intent enable_bt = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivity(enable_bt);
}
//もしBluetoothがONに最初からなっていたら
else
{
//getBoundedDevicesによってピアリングが既になされているデバイスを取得する
Set<BluetoothDevice> paired_devices = bt_adapter.getBondedDevices();
//BluetoothDeviceのインスタンスをdevicesインスタンスに追加していく
for(BluetoothDevice device : paired_devices)
{
devices.addElement(device);
}
//devicesに保存されたBluetoothDeviceインスタンスを利用して順番に情報をログに出力していく
for(int i=0;i<devices.size();i++) Log.d("debug",devices.elementAt(i).getName()+":"+devices.elementAt(i).getAddress());

}
}
else if(v.getId()==b2.getId())
{
Log.d("debug","b2 was touched");
Log.d("debug","devices.size="+devices.size());
if(!devices.isEmpty())
{
Log.d("debug","try Communication with "+devices.elementAt(0).getName());
comu = new Communication(devices.elementAt(0), MY_UUID);
Log.d("debug","before run()");
comu.start();
}
else{
Log.d("debug","b2 else");
Toast.makeText(this, "ピアリングされているデバイスがみつかりません", Toast.LENGTH_LONG);
}


}

}
}


Communication.java

package foo.bar.BTClient;

import java.io.IOException;
import java.util.UUID;

import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.util.Log;

public class Communication extends Thread{
private BluetoothSocket bs;

Communication(BluetoothDevice device,UUID uuid)
{
BluetoothSocket tmp = null;
try {
tmp = device.createRfcommSocketToServiceRecord(uuid);
} catch (IOException e) {
// TODO Auto-generated catch block
Log.d("debug","create failed");
e.printStackTrace();
}
bs = tmp;


}
public void run()
{
try {
bs.connect();
} catch (IOException e) {
Log.d("debug","connect failed");
e.printStackTrace();
return;
}
while(true)
{
try {
bs.getOutputStream().write("this is Android".getBytes());
try {
sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (IOException e) {
// TODO Auto-generated catch block
Log.d("debug","outputStream.write failed");
e.printStackTrace();
}

}

}
}




PC(Python側)Pybluezモジュールが必要

from bluetooth import *

ss=BluetoothSocket( RFCOMM )
ss.bind(("",PORT_ANY))
ss.listen(1)

port = ss.getsockname()[1]

uuid = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"

advertise_service( ss, "FooBar", service_id = uuid,service_classes=[uuid])
print "Waiting for connection on RFCOMM channel %d" % port
client_sock, client_info = ss.accept()


いま気づいたんだけど、このJavaのほうのプログラムのToast....の部分、最後に.show()を書き加えるの忘れてるから、表示されないね。なるほど。
コピペして使うときは.show()を加えるの忘れずに。なくても一応動く。
スポンサーサイト

トラックバックURL

http://ilovevim.blog42.fc2.com/tb.php/143-80ee6932

この記事へのトラックバック

この記事へのコメント

コメント投稿フォーム

Paging Navigation

Navigations, etc.

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。