android 安卓端和pc端蓝牙串口通讯踩坑记

操作步骤

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,我的已经调通了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值