一:Android中的蓝牙:
蓝牙解释(百度百科):连接地址:点击打开蓝牙百度百科
蓝牙( Bluetooth® ):是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换(使用2.4—2.485GHz的ISM波段的UHF无线电波)。蓝牙技术最初由电信巨头爱立信公司于1994年创制,当时是作为RS232数据线的替代方案。蓝牙可连接多个设备,克服了数据同步的难题。
蓝牙是基于数据包、有着主从架构的协议。一个主设备至多可和同一微微网中的七个从设备通讯。
还需注意:
蓝牙技术联盟于2010年6月30日正式推出蓝牙核心规格4.0 (称为Bluetooth Smart)。它包括经典蓝牙、高速蓝牙和蓝牙低功耗协议。高速蓝牙基于Wi-Fi,经典蓝牙则包括旧有蓝牙协议。 蓝牙低功耗,也就是早前的Wibree,是蓝牙4.0版本的一个子集,它有着全新的协议栈,可快速建立简单的链接。作为蓝牙1.0 – 3.0版本中蓝牙标准协议的替代方案,它主要面向对功耗需求极低、用纽扣电池供电的应用。芯片设计可有两种:双模、单模和增强的早期版本。早期的Wibree和蓝牙ULP(超低功耗)的名称被废除,取而代之的是后来用于一时的BLE。2011年晚些时候,新的商标推出,即用于主设备的 “Bluetooth Smart Ready”和用于传感器的“Bluetooth Smart”。
- 单模情况下,只能执行低功耗的协议栈。意法半导体、笙科电子、CSR、北欧半导体和德州仪器已经发布了单模蓝牙低功耗解决方案。
- 双模情况下,Bluetooth Smart功能整合入既有的经典蓝牙控制器。截至2011年3月,高通创锐讯、CSR、博通和德州仪器已宣布发表符合此标准的芯片。适用的架构共享所有经典蓝牙既有的射频和功能,相比经典蓝牙的价格上浮也几乎可以忽略不计
二:Android中相关的蓝牙API的基础知识:
射频通信(RFCOMM)常用于建立虚拟的串行数据流。RFCOMM提供了基于蓝牙带宽层的二进制数据转换和模拟EIA-232(即早前的的RS-232)串行控制信号,也就是说,它是串口仿真。 RFCOMM向用户提供了简单而且可靠的串行数据流。类似TCP。它可作为AT指令的载体直接用于许多电话相关的协议,以及通过蓝牙作为OBEX的传输层。 许多蓝牙应用都使用RFCOMM由于串行数据的广泛应用和大多数操作系统都提供了可用的API。所以使用串行接口通讯的程序可以很快的移植到RFCOMM上面。
从上面的图片我们就可以看出,蓝牙的api是在android包下面的bluetooth;
上面的是Api的版本比较老,不怎么全,我们会一一说明:
(1)BluetoothAdapter: 代表的是本地的蓝牙适配器,我们可以通过
BluetoothAdapter.getDefaultAdapter();
来获取一个BluetoothAdapter,要是这个对象返回的是null,说明设备不支持蓝牙模块.返回不是null,设备支持蓝牙模块.
mAdapter.isEnabled();
这是来获取蓝牙的是否是打开状态:
if (mAdapter != null && !mAdapter.isEnabled()) {
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
activity.startActivityForResult(intent, requestCode);
}
打开蓝牙的操作: 会打开蓝牙:
if (mAdapter != null && mAdapter.isEnabled()) {
mAdapter.disable();
}
获取配对的蓝牙设备:(打开蓝牙和授权)
//判断是否打开和授权
if ((mAdapter != null) && mAdapter.isEnabled()) {
return mAdapter.getBondedDevices();
}
打开蓝牙,进行 周边可见的蓝牙设备的搜索操作:
mAdapter.startDiscovery();
我们在打开蓝牙进行搜索的时候注意到我上面写的是 周边可见,我们打开蓝牙,但是并没有打开蓝牙的可被发现的能力,那么,其他蓝牙设备也是发现不到的,我们需要打开蓝牙的可发现的能力:
下面的实例是开启了蓝牙的发现能力,并且修改了蓝牙的可发现时间120修改为300,任何小于0或大于3600秒的值都会自动的被设为120秒.(注意:如果设备没有开启蓝牙功能,那么开启设备的可发现模式会自动开启蓝牙。)
Intent discoverableIntent = new
Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
//定义持续时间
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(discoverableIntent);
使用本地蓝牙适配器配对连接(作为服务器,后面会详细的说到)
mController.getmAdapter().listenUsingRfcommWithServiceRecord
("BluetoothServer", UUID.fromString(getPackageName()));
(2)BluetoothDevice
就是一个蓝牙类:可以获取到蓝牙设备的名称和mac地址
public final class BluetoothDevice implements Parcelable {
private static final String TAG = "BluetoothDevice";
private static final boolean DBG = false;
//其他代码
}
也可以打开一个 BluetoothSocket用于连接
mDevice.createRfcommSocketToServiceRecord(UUID.fromString(getPackageName()))
根据UUID创建并返回一个BluetoothSocket,是不是看到socket,可以对比tcp和udp的通信来看待,会更加的容易理解;
(3)BluetoothServerSocket 主要是蓝牙服务端,accept()会一致等待客户端的链接,BluetoothServerSocket会在连接被接收时返回一个被连接的BluetoothSocket对象。
public final class BluetoothServerSocket implements Closeable {
private static final String TAG = "BluetoothServerSocket";
/*package*/ final BluetoothSocket mSocket;
private Handler mHandler;
private int mMessage;
private int mChannel;
//其他代码................................
}
这个类一种只有三个方法两个重载的accept(),accept(inttimeout)两者的区别在于后面的方法指定了过时时间,需要注意的是,执行这两个方法的时候,直到接收到了客户端的请求(或是过期之后),都会阻塞线程,应该放在新线程里运行!
(4))BluetoothSocket 主要是蓝牙客户端的实现
跟BluetoothServerSocket相对,是客户端一共5个方法,不出意外,都会用到
close(),关闭
connect()连接
getInptuStream()获取输入流
getOutputStream()获取输出流
getRemoteDevice()获取远程设备,这里指的是获取bluetoothSocket指定连接的那个远程蓝牙设备
mDevice.createRfcommSocketToServiceRecord(UUID.fromString(getPackageName())
(5) 其他参考的链接: 点击打开链接
BluetoothProfile
代表一个蓝牙配置的接口。蓝牙配置是基于蓝牙通信的设备间的无线接口规范。一个例子是免提的配置。更多的配置讨论,请看下文的用配置来工作。
BluetoothHeadset
提供对使用蓝牙耳机的移动电话的支持。它同时包含了Bluetooth Headset和Hands-Free(v1.5)的配置。
BluetoothA2dp
定义如何把高品质的音频通过蓝牙连接从一个设备流向另一个设备。“A2DP”是Advanced Audio Distribution Profile的缩写。
BluetoothHealth
代表一个健康保健设备配置的控制蓝牙服务的代理。
BluetoothHealthCallback
用于实现BluetoothHealth回调的抽象类。你必须继承这个类,并实现它的回调方法,来接收应用程序的注册状态和蓝牙通道状态变化的更新。
BluetoothHealthAppConfiguration
代表蓝牙相关的第三方健康保健应用程序所注册的与远程蓝牙健康保健设备进行通信的配置。
BluetoothProfile.ServiceListener
BluetoothProfile IPC客户端连接或断开服务的通知接口(它是运行特俗配置的内部服务)。
三:蓝牙开发之权限,不要忘记:
权限就是上面的前两个:
一个是就是连接已经配对的设备需要的权限
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
第二就是允许应用程序有发现和配对的权限,一般不要太纠结,直接都添加上.
四:今天就实现基本的功能,下一次实现蓝牙通信功能:
功能简介:
1. 检测设备是否支持蓝牙模块:(实现)
2. 坚持蓝牙是否开启和(实现)
3. 使用手机系统提供的界面来开启蓝牙(实现)
4. 使用调用api来开启蓝牙(实现)
5. 关闭蓝牙(实现)
6. 设置蓝牙的可发性,并且修改发现时间(实现)
7. 展示已经配对过得蓝牙设备(实现)
8. 开始搜索周边的可见的蓝牙设备(实现)
上图:
小型的demo地址:点击打开github链接地址