安卓经典蓝牙开发,包括自动连接开发板蓝牙并通信
蓝牙开发首先弄清楚两点:
手机蓝牙连接手机蓝牙与手机蓝牙连接外设蓝牙(比如开发板上的蓝牙),这两者连接方式要区分开来,前者需要两个手机同时安装开发的APP,APP里面的代码指定了唯一的UUID用于通信,而后者只能在手机APP里面通过反射的方式获取外设蓝牙的UUID,然后连接通信。本文是使用后者。
第二是要知道经典蓝牙开发与低功耗蓝牙开发(即Ble)二者是不一样的。所以要指出本文是针对经典蓝牙开发。
下面正式进入开发流程:
最先要添加的蓝牙开发权限:
具体按照下面四步走:
第一步:打开蓝牙 第二步:搜索蓝牙,并找到目标蓝牙 第三步:连接目标蓝牙 第四步:写数据以及读数据
//获取蓝牙实例
mBtManage = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBtAdapter = mBtManage.getAdapter();
//第一步:打开蓝牙
if (mBtAdapter!=null)//支持蓝牙
{
mBtAdapter.enable();//开启蓝牙
if (mBtAdapter.isEnabled())//蓝牙已开启
{
Toast.makeText(this,"蓝牙已打开",Toast.LENGTH_LONG);
}
else Toast.makeText(this,"蓝牙未打开",Toast.LENGTH_LONG);
}
if (!mBtAdapter.isEnabled()){
Toast.makeText(this,"请先打开蓝牙",Toast.LENGTH_LONG);
return;
}
if (listDevices!=null)listDevices.clear();
if (mBtAdapter.isDiscovering())
{
Toast.makeText(this,"正在搜索",Toast.LENGTH_LONG);
return;
}
Set deviceSet= mBtAdapter.getBondedDevices();
Iterator iterator=deviceSet.iterator();
for (BluetoothDevice device:deviceSet){
String str = device.getName() + "|" + device.getAddress();
listDevices.add(str);//由于下次搜索不到上次连接过的设备,每次要添加连接过的设备
}
//一般搜索12秒
mBtAdapter.startDiscovery();
if (!mBtAdapter.isEnabled()){
Toast.makeText(this,"请先打开蓝牙",Toast.LENGTH_LONG);
return;
}
mBtAdapter.cancelDiscovery();
int position = -1;
//自动连接目标蓝牙,比如开发板上面的SEC1001蓝牙,如果有多个目标符合,则默认连接第一个
for (int i=0;i
new WriteTask(etData.getText().toString()).start();//写数据
new Readtask().start();//开启线程读数据
所有流程走完,下面是代码中使用到的工具类及相关方法
1.写数据线程
2.读数据线程
3.搜索蓝牙设备的广播
4.连接蓝牙的方法
代码如下:
public class WriteTask extends Thread{
private String srt;
public WriteTask(String str){
this.srt=str;
}
@Override
public void run(){
OutputStream outputStream=null;
byte[] st=srt.getBytes();
try{
outputStream=btSocket.getOutputStream();
outputStream.write(st);
}catch (Exception e){e.printStackTrace();}
}
}
public class Readtask extends Thread{
@Override
public void run(){
byte[] buffer = new byte[1024];
int bytes;
InputStream inputStream ; //建立输入流读取数据
while (true) {
try {
inputStream = btSocket.getInputStream();
if ((bytes = inputStream.read(buffer)) > 0) {
byte[] buf_data= new byte[bytes];
for (int i = 0; i < bytes; i++) {
buf_data[i] = buffer[i];
}
String s = new String(buf_data);
Message msg = handler.obtainMessage();
msg.what = MESSAGE_READ;
msg.obj = s;
handler.sendMessage(msg);
}
} catch (Exception e) {
Log.e("TAG", e.toString());break;}
}
if (btSocket != null) {
try {
btSocket.close();
} catch (Exception e) {Log.e("TAG", e.toString());}
}
}
}
private BroadcastReceiver receiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
//搜索设备时,取得设备的MAC地址
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
BluetoothDevice device = intent
.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
String str = device.getName() + "|" + device.getAddress();
if (listDevices.indexOf(str) == -1)// 防止重复添加
{
Log.d("ccc",listDevices.indexOf(str)+"");
listDevices.add(str); // 获取设备名称和mac地址
}
}
for (int i=0;i
public void connect(final BluetoothSocket btSocket) {
try {
if (btSocket.isConnected()){
Toast.makeText(this,"已连接SEC蓝牙",Toast.LENGTH_LONG);
return;
}
btSocket.connect();//连接
if (btSocket.isConnected()) {
btAllData.setText("蓝牙连接成功");
Toast.makeText(getApplicationContext(), "蓝牙连接成功", Toast.LENGTH_SHORT).show();
new Readtask().start();//开启线程读数据
} else {
Toast.makeText(getApplicationContext(), "蓝牙连接失败", Toast.LENGTH_SHORT).show();
btSocket.close();
}
} catch (Exception e) {e.printStackTrace();}
}
最后在onResume()方法注册广播
@Override
protected void onResume() {
super.onResume();
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(receiver, filter);
}
运行结果:第一次连接时需要输入外设蓝牙的密码,这个由硬件工程师提供。连接成功即可直接发送数据。