android开发之蓝牙配对连接的方法
来源:互联网 发布:mac 命令行链接mysql 编辑:程序博客网 时间:2024/05/16 01:16
新年第一篇。
最近在做蓝牙开锁的小项目,手机去连接单片机总是出现问题,和手机的连接也不稳定,看了不少蓝牙方面的文档,做了个关于蓝牙连接的小结。
在做Android蓝牙串口连接的时候一般会使用
- BluetoothSocket tmp = null;
- // Get a BluetoothSocket for a connection with the
- // given BluetoothDevice
- try {
- tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
- } catch (IOException e) {
- Log.e(TAG, "create() failed", e);
- }
然后是tmp赋给BluetoothSocket,接着调用connect方法进行蓝牙设备的连接。
可是 BluetoothSocket 的connect方法本身就会报很多异常错误。
以下根据对蓝牙开发的一点研究可通过以下方法解决:
方法1.先进行蓝牙自动配对,配对成功,通过UUID获得BluetoothSocket,然后执行connect()方法。
方法2.通过UUID获得BluetoothSocket,然后先根据mDevice.getBondState()进行判断是否需要配对,最后执行connnect()方法。
- private class ConnectThread extends Thread {
- String macAddress = "";
- public ConnectThread(String mac) {
- macAddress = mac;
- }
- public void run() {
- connecting = true;
- connected = false;
- if(mBluetoothAdapter == null){
- mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
- }
- mBluetoothDevice = mBluetoothAdapter.getRemoteDevice(macAddress);
- mBluetoothAdapter.cancelDiscovery();
- try {
- socket = mBluetoothDevice.createRfcommSocketToServiceRecord(uuid);
- } catch (IOException e) {
- // TODO Auto-generated catch block
- //e.printStackTrace();
- Log.e(TAG, "Socket", e);
- }
- //adapter.cancelDiscovery();
- while (!connected && connetTime <= 10) {
- connectDevice();
- }
- // 重置ConnectThread
- //synchronized (BluetoothService.this) {
- //ConnectThread = null;
- //}
- }
- public void cancel() {
- try {
- socket.close();
- socket = null;
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- connecting = false;
- }
- }
- }
接下来是调用的连接设备方法connectDevice():
- protected void connectDevice() {
- try {
- // 连接建立之前的先配对
- if (mBluetoothDevice.getBondState() == BluetoothDevice.BOND_NONE) {
- Method creMethod = BluetoothDevice.class
- .getMethod("createBond");
- Log.e("TAG", "开始配对");
- creMethod.invoke(mBluetoothDevice);
- } else {
- }
- } catch (Exception e) {
- // TODO: handle exception
- //DisplayMessage("无法配对!");
- e.printStackTrace();
- }
- mBluetoothAdapter.cancelDiscovery();
- try {
- socket.connect();
- //DisplayMessage("连接成功!");
- //connetTime++;
- connected = true;
- } catch (IOException e) {
- // TODO: handle exception
- //DisplayMessage("连接失败!");
- connetTime++;
- connected = false;
- try {
- socket.close();
- socket = null;
- } catch (IOException e2) {
- // TODO: handle exception
- Log.e(TAG, "Cannot close connection when connection failed");
- }
- } finally {
- connecting = false;
- }
- }
方法3.利用反射通过端口获得BluetoothSocket,然后执行connect()方法。
- private class ConnectThread extends Thread {
- String macAddress = "";
- public ConnectThread(String mac) {
- macAddress = mac;
- }
- public void run() {
- connecting = true;
- connected = false;
- if(mBluetoothAdapter == null){
- mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
- }
- mBluetoothDevice = mBluetoothAdapter.getRemoteDevice(macAddress);
- mBluetoothAdapter.cancelDiscovery();
- initSocket();
- //adapter.cancelDiscovery();
- while (!connected && connetTime <= 10) {
- try {
- socket.connect();
- connected = true;
- } catch (IOException e1) {
- connetTime++;
- connected = false;
- // 关闭 socket
- try {
- socket.close();
- socket = null;
- } catch (IOException e2) {
- //TODO: handle exception
- Log.e(TAG, "Socket", e2);
- }
- } finally {
- connecting = false;
- }
- //connectDevice();
- }
- // 重置ConnectThread
- //synchronized (BluetoothService.this) {
- //ConnectThread = null;
- //}
- }
- public void cancel() {
- try {
- socket.close();
- socket = null;
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- connecting = false;
- }
- }
- }
接下来是初始化并得到BluetoothSocket的方法
- /**
- * 取得BluetoothSocket
- */
- private void initSocket() {
- BluetoothSocket temp = null;
- try {
- Method m = mBluetoothDevice.getClass().getMethod(
- "createRfcommSocket", new Class[] { int.class });
- temp = (BluetoothSocket) m.invoke(mBluetoothDevice, 1);//这里端口为1
- } catch (SecurityException e) {
- e.printStackTrace();
- } catch (NoSuchMethodException e) {
- e.printStackTrace();
- } catch (IllegalArgumentException e) {
- e.printStackTrace();
- } catch (IllegalAccessException e) {
- e.printStackTrace();
- } catch (InvocationTargetException e) {
- e.printStackTrace();
- }
- socket = temp;
- }
要点:1.蓝牙配对和连接是两回事,不可混为一谈。
2.蓝牙串口连接可通过端口 (1-30)和UUID两种方法进行操作。
3.通过UUID进行蓝牙连接最好先进行配对操作。
作者:jason0539
博客:http://blog.csdn.net/jason0539(转载请说明出处)
0 0
- android开发之蓝牙配对连接的方法
- android开发之蓝牙配对连接的方法
- android开发之蓝牙配对连接的方法
- android开发之蓝牙配对连接的方法
- android开发之蓝牙配对连接的方法
- Android之蓝牙开发初编(发现蓝牙,配对蓝牙,连接蓝牙)
- android开发之蓝牙主动配对连接手机
- android开发之蓝牙主动配对连接手机
- android开发之蓝牙主动配对连接手机
- Android 蓝牙开发之搜索、配对、连接、通信大全
- Android 蓝牙开发之搜索、配对、连接、通信大全
- Android 蓝牙开发之搜索、配对、连接、通信大全
- Android 蓝牙开发之搜索、配对、连接、通信大全
- Android 蓝牙开发之搜索、配对、连接、通信大全
- Android开发之蓝牙连接与配对设备
- Android 蓝牙开发之搜索、配对、连接、通信大全
- Android 蓝牙设备通讯的开发(配对/连接/传输数据)
- Android开发蓝牙篇之蓝牙配对、连接与接收数据
- 备忘录 java 添加 jar 包 到 环境变量
- Tools - Editor, JAD. (JD-GUI notepad++ editplus)
- Leetcode 22 Generate Parentheses 搜索与DP的纠结
- C++虚函数和纯虚函数和抽象类
- 算法复杂度分析
- android开发之蓝牙配对连接的方法
- [代码篇].net实现拍照上传到本地和ftp服务器
- nginx + rails完整版配置文件
- Linux串口设置参数
- java synchronized详解
- 手机网页制作的认识(有关meta标签)
- Android SharedPreferences复杂存储
- P1102 陶陶摘苹果
- Tensorflow安装教程(Ubuntu14.04+cuda-7.5+cudnn-v4)