安卓与HC-05蓝牙模块通信,安卓蓝牙串口通信源码,学会智能家居控制的基础

使用安卓设备通过蓝牙模块控制单片机非常容易做到智能家居等场景的实现,接下来我以安卓开发和HC-05蓝牙模块介绍完整的通信过程以及相关代码实现。

获取相应权限

<uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <!-- 6.0以上需要加的额外权限 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BROADCAST_STICKY" />
    <uses-feature
        android:name="android.hardware.bluetooth_le"
        android:required="true" />

注册蓝牙广播

IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
        registerReceiver(receiver, filter);
        filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        registerReceiver(receiver, filter);

注册广播接收者

// 注册广播接收者
    private BroadcastReceiver receiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context arg0, Intent intent) {
            // 获取到广播的action
            String action = intent.getAction();
            // 判断广播是搜索到设备还是搜索完成
            if (action.equals(BluetoothDevice.ACTION_FOUND)) {
                // 找到设备后获取其设备
                BluetoothDevice device = intent
                        .getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                // 判断这个设备是否是之前已经绑定过了,如果是则不需要添加,在程序初始化的时候已经添加了
                if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
                    // 设备没有绑定过,则将其保持到arrayList集合中
                    bluetoothDevices.add(device.getName() + ":"
                            + device.getAddress() + "\n");
                    // 更新字符串数组适配器,将内容显示在listView中
                    arrayAdapter.notifyDataSetChanged();
                }
            } else if (action
                    .equals(BluetoothAdapter.ACTION_DISCOVERY_FINISHED)) {
                setTitle("搜索完成");
            }
        }
    };

搜索蓝牙设备

mBluetoothAdapter.startDiscovery();

发送数据

private void sendCode(byte[] code)
    {
        try {
            // 判断客户端接口是否为空
            if (clientSocket == null) {
                // 获取到客户端接口
                clientSocket = selectDevice
                        .createRfcommSocketToServiceRecord(MY_UUID);
                // 向服务端发送连接
                clientSocket.connect();
                // 获取到输出流,向外写数据
                os = clientSocket.getOutputStream();
                if (commected) {
                    commected = false;
                    // 实例接收客户端传过来的数据线程
                    thread = new ConnectedThread(clientSocket);
                    // 线程开始
                    thread.start();
                }
            }
            // 判断是否拿到输出流
            if (os != null) {
                os.write(code);
            }
            Toast.makeText(BuletoothClientActivity.this, "发送信息成功,请查收", Toast.LENGTH_SHORT).show();
        } catch (IOException e) {
            e.printStackTrace();
            // 如果发生异常则告诉用户发送失败
            Toast.makeText(BuletoothClientActivity.this, "发送信息失败", Toast.LENGTH_SHORT).show();
        }

    }

接收数据线程

private class ConnectedThread extends Thread {
        private final BluetoothSocket mmSocket;
        private final InputStream mmInStream;
        private final OutputStream mmOutStream;

        public ConnectedThread(BluetoothSocket socket) {
            Log.d("logcat", "create ConnectedThread");
            mmSocket = socket;
            InputStream tmpIn = null;
            OutputStream tmpOut = null;

            try {
                tmpIn = socket.getInputStream();
                tmpOut = socket.getOutputStream();
            } catch (IOException e) {
                Log.d("logcat", "temp sockets not created" + e);
            }
            mmInStream = tmpIn;
            mmOutStream = tmpOut;
        }

        public void run() {
            if (Thread.interrupted()) {
                Log.d("logcat", "return");
                return;
            }
            Log.d("logcat", "BEGIN mConnectedThread");
            byte[] buffer = new byte[128];
            int bytes;

            while (true) {
                synchronized (this) {

                    try {
                        while (mmInStream.available() == 0) {
                        }
                        try {
                            Thread.sleep(100);  //当有数据流入时,线程休眠一段时间
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        bytes = mmInStream.read(buffer);
                        Log.d("logcat", "count   " + bytes);
                        Message msg = new Message();
                        msg.obj = new String(buffer, 0, bytes, "utf-8");
                        Log.d("logcat", "data   " + msg.obj);
                        handler.sendMessage(msg);
                    } catch (IOException e) {
                        Log.e("logcat", "disconnected", e);

                        break;
                    }
                }


            }
        }

        public void cancel() {
            try {
                mmSocket.close();
            } catch (IOException e) {
                Log.e("logcat", "断开连接", e);
            }
        }
    }


}

测试通信

安卓端发送 test
服务端接受到数据,反馈ok客户端
客户端成功接收到消息

将APP安装到安卓手机当作客户端
安卓APP
HC-05蓝牙模块连线如下:
HC-05蓝牙模块连线
使用串口调试工具测试HC-05串口通信
串口调试工具
完整DEMO有需要可以评论区要Github地址

发布了33 篇原创文章 · 获赞 1 · 访问量 4171

猜你喜欢

转载自blog.csdn.net/qq_39827677/article/details/103420839
今日推荐