目录:
1. 蓝牙简史,现状
2. 蓝牙的应用场景
3. 蓝牙相关概念
4. Android蓝牙开发
1. 蓝牙简史:
蓝牙( Bluetooth)是一种无线技术标准,可以实现短距离(通常是几米范围之内)的无线通信。蓝牙技术始于1994年,迄今已经发展了超过20年。本质上它和其它几种射频通信技术类似,比如手机移动通信,近场通信技术(NFC),都是通过电磁波来实现不同设备的信息交换。区别在于无线电波的频率和发射功率不一样,从而传输距离也不一样。
2. 蓝牙的应用场景:
l 移动电话和免提设备之间的无线通讯,这也是最初流行的应用。
l 电脑间的无线网络
l 电脑与外设的无线连接,如:鼠标、耳机、打印机等
l 蓝牙设备之间的文件传输
l 传统有线设备的无线化,如:医用器材、GPS、条形码扫描仪、交管设备
l 通过蓝牙支持,使PC能通过手机的调制解调器实现拨号上网
l 车载蓝牙,可穿戴式设备的信息传输
3. 蓝牙的相关概念:
蓝牙设备有两个最重要的参数:类别(Class)和规格(Profile)
类别(Class):类别表明了蓝牙的有效范围。有三个类别,大多数设备都是类别2,这个类别的蓝牙传输范围在10m之内,类别1的设备很少,它的传输范围能达到100m。
蓝牙规范(profile):表明了蓝牙连接的类型和使用场景。最常见的是HSP(Headset profile,蓝牙耳机) 和 HFP(Hands-free profile,车载免提设备)。其它的还有OBEX(Object Exchange,文件传输,联系人、日历信息传输),A2DP和AVRCP是跟音频传输、控制相关的两个规范。
蓝牙匹对:
2.0之前,蓝牙匹对,必须要两个设备输入相同的PIN码才能匹对,有的设备将匹对的PIN码硬编码到设备里面,这样你只要在另外一台设备上输入一个固定的PIN码就可以实现匹对。
2.1之后,有了一个新的匹对模式SSP(Secure Simple Pairing),无需用户输入,直接匹对。
4. Android蓝牙开发
l BluetoothAdapter
在进行任何的蓝牙操作之前,你需要先获取一个BluetoothAdapter对象:
BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
// 如果bluetootAdapter是空,表明设备不支持蓝牙
}
l 打开和关闭蓝牙
if (!mBluetoothAdapter.isEnabled()) {
// 如果蓝牙没打开,我们需要发送一个Intent,让系统打开蓝牙
// 这时候系统会掉出一个对话框提示用户,应用正在打开蓝牙
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
l 你也可以直接调用mBluetoothAdapter.enable()来强制打开蓝牙,这个调用不会有任何提示。
l 查找其它设备
调用bluetoothAdapter.startDiscovery()来扫描附近的蓝牙设备,发现蓝牙设备之后,系统会发送一个广播,因此你需要监听系统广播来获取扫描到的设备:
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
BluetoothDevice device =intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
}
}
};
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, filter);
l 连接和匹对蓝牙设备,
BluetoothSocket / BluetoothServerSocket
如果需要向其它的设备发送信息,你需要在本机上获取一个BluetoothSocket:
BluetoothSocket socket = bluetoothDevice.createRfcommSocketToServiceRecord(MY_UUID);
如果是其它设备想你的设备发送信息,那么你需要获取一个BluetoothServerSocket:
BluetoothServerSocket serverSocket = bluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
有了socket之后,你就可以通过socket.getOutputStream()发送数据了:
socket.getOutputStream().write(bytes);
备注:
1. 权限:
通常你需要两个权限:
android.permission.BLUETOOTH_ADMIN"
android:name="android.permission.BLUETOOTH"
6.0上面扫描其它设备需要这个权限:
android:name="android.permission.ACCESS_COARSE_LOCATION"
2. UUID,如果你需要建立不安全的匹对,那么我们使用这个公共的UUID:
00001101-0000-1000-8000-00805F9B34FB.
建立安全的匹对需要用到不同的UUID,并且对不同的profile,该值并不一样,可以参考:
/frameworks/base/core/java/android/bluetooth/BluetoothUuid.java
public static final ParcelUuid AudioSink =
ParcelUuid.fromString("0000110B-0000-1000-8000-00805F9B34FB");
public static final ParcelUuid AudioSource =
ParcelUuid.fromString("0000110A-0000-1000-8000-00805F9B34FB");
public static final ParcelUuid HSP =
ParcelUuid.fromString("00001108-0000-1000-8000-00805F9B34FB");