蓝牙API

1.Android蓝牙的分类:

我们首先要建立起来的概念是Android的蓝牙分为经典蓝牙和低功耗蓝牙(Bluetooth Low Energy),它们两者之间有很大的区别。而本文主要讲解的是经典蓝牙。

经典蓝牙:顾名思义就是旧版的蓝牙,是Android4.2(API17)版本及以下所使用的蓝牙。

低功耗蓝牙:也称ble,是Android4.3(API18)版本及以上所使用的蓝牙,据说相对于经典蓝牙有许多的优势,Google为其提供了新的API。

2.对蓝牙的误解:

(1)配对连接的关系:需要首先说明的是蓝牙的配对连接是两回事。

配对是指两个设备之间首次建立连接后,系统会自动向用户显示的配对请求,当配对成功后,会自动存储已经配对的设备的信息。

连接就是使用设备存储的MAC地址,即客户端用向存储的MAC地址发起建立 RFCOMM通道的询问,服务端同意后两者的连接就建立起来了。而且利用远程设备的已知MAC地址可以随时向其发起连接(如果在范围内的话),而无需执行发现操作。所以我们可以得到这几个结论:

  • 配对了不一定连接着。
  • 连接一定要知道对方的蓝牙的MAC地址。
  • 配对只是第一次连接系统为确认安全所做的准备,因此大多数情况下只有一次。

(2)搜索设备:在我刚开始做蓝牙开发时我以为在建立连接时必须搜索设备,然而并不是。搜索设备就是需找附近可以连接或发起配对的设备。

(3)开发目的:蓝牙开发的目的并不是为了建立两个设备的配对,因为Google已经在这方面做了相当好的封装。我们的重点应该放在两个设备的连接上,因为连接的过程可以看作两个设备通信的过程,建立了通信我们才可以传输数据。

3.开发的准备:

(1)权限问题:Android设备蓝牙的使用必须添加这两个权限:

<uses-permission android:name="android.permission.BLUETOOTH"/>    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

其中BLUETOOTH权限用来执行蓝牙通信,例如请求连接、接受连接和传输数据等。而BLUETOOTH_ADMIN的权限使用来发现或操作蓝牙设备。

(2)API类

  • BluetoothAdapter:用来获得设备的蓝牙设备,是基础的蓝牙类。
  • BluetoothDevice:类似于蓝牙信息的元素类,当设备配对之后,存储的蓝牙信息就在这个类里面。
  • BluetoothSocket:蓝牙的连接类,客户端发起的连接请求就在这个类中操控。
  • BluetoothServerSocket:蓝牙的连接类,服务端等待客户端的信息就在这个类中控制。

4.蓝牙基本操作:

(1)获取BluetoothAdapter:有了这个才可以对蓝牙的进一步操作。

BluetoothAdapter mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();if(mBluetoothAdapter==null){//如果为空,则说明设备不支持蓝牙。}

(2)启动蓝牙:启动蓝牙有两种方法,一种比较人性化,另外一种比较直接。

人性化:系统将弹出一个对话框,询问用户是否开启蓝牙。其中REQUEST_ENABLE_BT是局部定义的整型(必须大于0),系统会将其作为 requestCode 参数传递回您的 onActivityResult() 实现。(启用蓝牙的可检测性也会自动开启蓝牙,这个部分我们在后面会做介绍)

Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);    startActivityForResult(intent, REQUEST_ENABLE_BT);

直接:系统将直接启动蓝牙,没有任何提示。也许可能有权限提示。

mBluetoothAdapter.enable(); 

(3)查找已经配对的设备:我们可以查询已经配对的设备,其中设备的信息在配对完成后系统自动保存,其中信息包括设备名称,MAC地址等。有些人可能不明白知道这些有什么用,但是必须明确的是知道了这个就可以知道一个设备的MAC地址,我们后面要了解的连接就是根据MAC地址进行连接。

Set pairedDevices = mBluetoothAdapter.getBondedDevices();// 其中的BluetoothDevice存储这蓝牙的信息,而getBondedDevices()方法顾名思义就是返回一组BluetoothDeviceif (pairedDevices.size() > 0) {    // 如果存储的设备信息大于0    for (BluetoothDevice device : pairedDevices) {        // 遍历然后打印出每个设备的信息        mArrayAdapter.add(device.getName() + "\n" + device.getAddress());    }}

(5)发现设备:要发现设备,只需要调用startDiscovery();便可。但是发现设备的结果我们不能直接得到,必须用Android的广播得到结果。这个方法我觉得不是很好用,在这里借用Google的一段话。

注意:执行设备发现对于蓝牙适配器而言是一个非常繁重的操作过程,并且会消耗大量资源。 在找到要连接的设备后,确保始终使用 cancelDiscovery() 停止发现,然后再尝试连接。 此外,如果您已经保持与某台设备的连接,那么执行发现操作可能会大幅减少可用于该连接的带宽,因此不应该在处于连接状态时执行发现操作。

(6)启用可检测性:设置本地设备可以被其他设备检测到,这个方法我觉得也没用什么用,但在开启可检测性的同时会自动开启蓝牙,所以还是说一下。具体内容可以到Android的API中查看,很详细。

很简单吧,其实这些都不是重点,因为通信的重点在于通信,所以下一篇博客才是重中之重。而且在连接的时候会分为客户端和服务端,但是接受消息和发送消息又会是另外一回事。

更多相关文章

  1. Android(安卓)OTA升级原理 - 实现流程(整理一)
  2. Android(安卓)内核相关内容总结
  3. android adb命令行
  4. Android(安卓)6.0中的新技术有哪些
  5. Android(安卓)开发中 iBeacon的使用
  6. Android(安卓)2.3.x WebView中的两个搞笑的bug
  7. AndroidManifest.xml uses-feature 详解
  8. Android(安卓)6.0中的新技术总结
  9. Android(安卓)Things简介

随机推荐

  1. 美丽新世界:linux 下的惬意生活
  2. Linux记录-HDFS副本机制
  3. Linux curl 命令模拟 POST/GET 请求
  4. 检查进程是否仍在运行
  5. LTP--linux稳定性测试 linux性能测试 ltp
  6. Linux Shell编程参考大全
  7. 高级Linux工程师常用软件清单
  8. linux系统更改目录和文件的权限总结
  9. linux基本操作(2)
  10. Linux-HA 入门指南(引用)