MyBluetooth继承Thread,用Thread监听数据的接收并处理
想要通过蓝牙通信,首先需要打开蓝牙,然后与蓝牙匹配,最后建立通信连接
打开蓝牙:
调用startActivityForResult()并使用ACTION_REQUEST_ENABLE方法,这将发出一个请求来利用系统设置开启蓝牙
Intent turnOn = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(turnOn, 0);//打开蓝牙,状态改变,在注册事件中show Toast
IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED);
registerReceiver(receiver, filter);//注册蓝牙连接状态改变事件
蓝牙匹配:
搜索获取周围蓝牙设备列表->显示并选择配对的设备
Set<BluetoothDevice>pairedDevices;
pairedDevices=mybluetooth.getpairedDevices();//搜索获取周围蓝牙设备列表
if(pairedDevices.size()<=0)
//没有可连接的设备.
else{
int i=0;
final String[] Devicesname = new String[pairedDevices.size()];
final String[] Devicesadress = new String[pairedDevices.size()];
for(BluetoothDevice bt : pairedDevices)
{
Devicesname[i]=bt.getName();
Devicesadress[i]=bt.getAddress();
i++;
}
AlertDialog.Builder builder = new Builder(MainActivity.this);
builder.setTitle("选择配对的设备");
builder.setItems(Devicesname, new OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
if(which>=0)
{
mybluetooth.setDevice(BA.getRemoteDevice(Devicesadress[which]));
if(mybluetooth.getDevicename()==null)
DisplayToast("无法与"+Devicesname[which]+"进行连接.");
else mybluetooth.buildconnection(0);
}
}
});
builder.show();
}
几个月没碰Android Studio,自己都看不懂自己的代码了,我也不知道我写的是什么,贴出来证明我还活着
public class MyBluetooth extends Thread{
private BluetoothAdapter BA= BluetoothAdapter.getDefaultAdapter();//获取本机蓝牙
private SetpairedDevices; //pairedDevices(用于存放搜索得到的蓝牙设备集合)
private BluetoothDevice Device; //Device(将要连接的蓝牙设备)
private BluetoothSocket clientSocket; //建立BluetoothSocket 通信
//该UUID表示串口服务(!!!这个十分重要)
private final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
private Handler myHandler;
public MyBluetooth(Handler myHandler)
{
this.myHandler=myHandler;
pairedDevices=BA.getBondedDevices();
}
public String getmacadress(){
return Device.getAddress();
}
public String getDevicename(){
return Device.getName();
}
public Set getpairedDevices(){
return pairedDevices;
}
public void setDevice(BluetoothDevice bluetoothdevice){
Device=bluetoothdevice;
}
public boolean senddata(int dat)
{
if(!clientSocket.isConnected())
{
return false;
}
try {
OutputStream os = clientSocket.getOutputStream();
os.write(dat);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}
public void buildconnection(int type)
{
try {
clientSocket = Device.createRfcommSocketToServiceRecord(MY_UUID);
if(!clientSocket.isConnected())
clientSocket.connect();
OutputStream os = clientSocket.getOutputStream();
InputStream is = clientSocket.getInputStream();
int a=0xff;
byte b=(byte)a;
os.write(b);
if(type==1)//type==1与单片机连接
if(is.read()!=255)//单片机连接后,单片机回发0xff
{
isStable=false;
return ;
}
socket.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void run(){
try {
InputStream is = clientSocket.getInputStream();
OutputStream os = clientSocket.getOutputStream();
Bundle bundle= new Bundle();// 存放Message数据
Message msg;
while(true)
{
msg = new Message();//每次读取信息都要新建Message,不然会报错!!!!!!!!
int which=is.read();
switch(which)
{
case 0x01://which=0x01单片机发送未处理的温度测量值
int t;
byte[] b=new byte[2];
is.read(b);
t=b[0] & 0xff;
t<<=8;
t|=b[1] & 0xff;
double temp=0;
if(t< 0) //为负数,需要-1,取反
{
t=t-1;
t=~t;
temp=t*0.0625;
}
else
{
temp=t*0.0625;
}
bundle.putString("temp",String.valueOf(temp));//数据存入bundle
msg.what=0x01;
msg.setData(bundle);//设置msg的数据
myHandler.sendMessage(msg); //数据传递至MainActivity的myHandler
break;
default://纯文本信息,不处理
msg.what=0xff;
bundle= new Bundle();// 存放Message数据
bundle.putChar("textinfo", (char)which);
msg.setData(bundle);
myHandler.sendMessage(msg);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}