Android 蓝牙开发基本流程之“连接指定水木行蓝牙模块”

Android 蓝牙开发基本流程之“连接指定水木行蓝牙模块”

根据我们实际项目需求,总结了建立蓝牙连接“指定水木行蓝牙模块”的必要四步:1.添加权限并判断设备是否支持蓝牙;2.打开蓝牙;3.连接设备;4.设备间数据交换。


一、首先,要操作蓝牙,先要在AndroidManifest.xml里加入权限
/**
*在AndroidManifest中配置权限
*/
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>


<!-- 在android 6.0 以后,要想获得蓝牙扫描结果,还需要下面的权限-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />




二、判断设备是否支持蓝牙,如果支持打开蓝牙


private static final int ENABLE_BLUETOOTH = 1;  //打开蓝牙
/**
* 初始化蓝牙,并判断蓝牙
*/
private void initBluetooth() {
//获取本机BluetoothAdapter
BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();
// 另一种获取获取本机BluetoothAdapter的方法
// BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();


// 检查设备上是否支持蓝牙设备
if (bluetoothAdapter == null) {
Log.d(TAG, "Device does not support Bluetooth");
Toast.makeText(LoginActivity.this, "Device does not support Bluetooth", Toast.LENGTH_SHORT).show();
// 不支持蓝牙设备,木法,巧妇难为无米之炊,退出!
finish();
return;
}


//使用inEnabled方法确认设备 蓝牙是否开启
if (!bluetoothAdapter.isEnabled()) {
//打开蓝牙,会提示用户 ; 接下去,在onActivityResult回调判断
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(intent, ENABLE_BLUETOOTH);


}


}


/**
*回调判断
*/
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);


        if (requestCode == ENABLE_BLUETOOTH) {    //打开蓝牙
            if (resultCode == RESULT_OK) {
                //打开蓝牙后的一系列操作
            } else {
                Toast.makeText(LoginActivity.this, "You must turn on Bluetooth", Toast.LENGTH_SHORT).show();
                finish();
            }


        }


    }
 
 三 、连接蓝牙
/**
     * 准备连接蓝牙
     */
    private void goConnectBluetooth() {
        //蓝牙连接是费时操作,所以要单起一个线程
        new Thread() {
            public void run() {
                //获取BluetoothAdapter
                BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
                BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();
               //连接默认的水木行蓝牙串口设备
               BluetoothDevice device = bluetoothAdapter.getRemoteDevice("20:17:10:24:44:16");
                //蓝牙连接并通信
                connect(device);


            }


            ;
        }.start();
    }


四、蓝牙通信:设备间数据交换


private BluetoothSocket socket = null;
/**
     * 蓝牙连接并通信
     *
     * @param device
     */
    protected void connect(BluetoothDevice device) {
        try {
            // Create a Socket connection: need the server's UUID number ofregistered
            socket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"));
            socket.connect();


            //蓝牙是否成功连接
            boolean isConnect = socket.isConnected();


    //获取蓝牙通信的输入输出流
            inputStream = socket.getInputStream();
            outputStream = socket.getOutputStream();


            while (true) { //保证socket一直连接
//读取服务端发来的信息
                readDataFromServer();
            }


        } catch (IOException e) {
            Log.e("EF-BTBee", ">>", e);
            ToastUtil.showToast(BluetoothClientActivity.this, "Socket connection failed");
            finish();
            return;
        } finally {
            if (socket != null) {
                try {
                    socket.close();
                    //finish();
                    return;
                } catch (IOException e) {
                }
            }
        }
    }


/**
*读取服务端发来的信息
*/
    private void readDataFromServer() {
        final byte[] bytes = new byte[1024];
        try {
            int cnt = inputStream.read(bytes);
            String s = new String(bytes, 0, cnt);
            if (!StringUtils.isEmpty(s)) {
//把读取到的信息用handler处理,改变界面显示
                Message msg = handler.obtainMessage();
                msg.what = 0;
                msg.obj = s;
                handler.sendMessage(msg);
            }


        } catch (Exception e) {
            ToastUtil.showToast(BluetoothClientActivity.this, "socket error");
            e.printStackTrace();
        }
    }


/**
*发送指令到服务端
*/
    private void sentMessage(String message) {
        if (!StringUtils.isEmpty(message)) {
            Log.d(TAG, "发送信息To服务器:   " + message);
            try {
                byte[] bytes = message.getBytes();
                outputStream.write(bytes);
                outputStream.flush();
            } catch (IOException e) {
                ToastUtil.showToast(BluetoothClientActivity.this, "socket error");
                e.printStackTrace();
            }
        }


    }


private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);


            switch (msg.what) {
                case 0:
//获取服务端发来的信息
                    String result = (String) msg.obj;
//然后自行处理
Log.d(TAG, "result:"+result);
                    break;


              


            }
        }
    };
 

猜你喜欢

转载自blog.csdn.net/rlw_1009/article/details/79129265