操作步骤
1.扫描附近蓝牙设备
2.配对蓝牙
3.建立蓝牙串口通道
4.发送字符串
扫描和配对网上代码挺多的,这里就不贴了,主要说明3和4
建立蓝牙串口通道需要用到BluetoothSocket对象,建立串口通讯通道, BluetoothDevice对象createRfcommSocketToServiceRecord方法返回BluetoothSocket对象,方法参数是UUID,相当于端口的意思,pc端需要和移动端保持一致这里的UUID,一般来说最好自己生成UUID,如果别人也用这个UUID,可能会造成干扰,这里我使用的是公共的串口UUID>>00001102-0000-1000-8000-00805F9B34FB, 需要查询其它UUID,可以点击https://blog.csdn.net/weixin_30559481/article/details/99611477(因为业务需求是传输字符串到pc端应用软件上显示,然后就没了,应用软件是别人开发的,我一脸懵逼,所以只能用这个,不支持我也莫的办法了。)
private static final UUID MY_UUID_SECURE = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
private class ClientThread extends Thread {
private BluetoothDevice device;
public ClientThread(BluetoothDevice device) {
this.device = device;
}
@Override
public void run() {
BluetoothSocket socket;
try {
socket = device.createRfcommSocketToServiceRecord(MY_UUID_SECURE);
Log.d("蓝牙配对", "第一次连接服务端...");
socket.connect();
Log.d("蓝牙配对", "第一次连接建立.");
// 开始往服务器端发送数据。
sendDataToServer(socket);
} catch (Exception e) {
Log.d("蓝牙配对", "通信连接失败>>"+e.getMessage());
try {
socket = (BluetoothSocket) device.getClass().getMethod("createRfcommSocket", new Class[] {int.class}).invoke(device,1);
if (socket!=null){
socket.connect();
Log.d("蓝牙配对", "第二次连接建立.");
sendDataToServer(socket);
}
}catch (Exception ex){
Log.d("蓝牙配对", "第二次连接失败>>"+e.getMessage());
}
}
}
private void sendDataToServer(BluetoothSocket socket) {
try {
OutputStream os = socket.getOutputStream();
os.write(new String("hello world,this me first bluetooth connect").getBytes());
os.flush();
os.close();//TODO 如果需要一直发送数据就关闭掉,不然第二次发送会提示socket close
Log.i("蓝牙配对", "发送成功");
} catch (Exception e) {
e.printStackTrace();
}
}
}
正常使用BluetoothSocket对象connect可能会java.io.IOException: read failed, socket might closed or timeout, read ret: -1异常,所以下面又调用了反射,然后再去连接,我代码跑起来是可以正常连接的,然后发送也正常,串口调试工具可以使用SSCOM来调试,是否确认pc端能成功接收数据。看下面,OK,我的已经调通了。