目录:

1. 蓝牙简史,现状

2. 蓝牙的应用场景

3. 蓝牙相关概念

4. Android蓝牙开发

 

1. 蓝牙简史:

蓝牙( Bluetooth)是一种无线技术标准,可以实现短距离(通常是几米范围之内)的无线通信。蓝牙技术始于1994年,迄今已经发展了超过20年。本质上它和其它几种射频通信技术类似,比如手机移动通信,近场通信技术(NFC),都是通过电磁波来实现不同设备的信息交换。区别在于无线电波的频率和发射功率不一样,从而传输距离也不一样。


2. 蓝牙的应用场景:

移动电话和免提设备之间的无线通讯,这也是最初流行的应用。

电脑间的无线网络

电脑与外设的无线连接,如:鼠标、耳机、打印机等

蓝牙设备之间的文件传输

传统有线设备的无线化,如:医用器材、GPS、条形码扫描仪、交管设备

通过蓝牙支持,使PC能通过手机的调制解调器实现拨号上网

车载蓝牙,可穿戴式设备的信息传输

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蓝牙开发

BluetoothAdapter

在进行任何的蓝牙操作之前,你需要先获取一个BluetoothAdapter对象:

BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
// 如果bluetootAdapter是空,表明设备不支持蓝牙
}

 

打开和关闭蓝牙

if (!mBluetoothAdapter.isEnabled()) {

// 如果蓝牙没打开,我们需要发送一个Intent,让系统打开蓝牙

// 这时候系统会掉出一个对话框提示用户,应用正在打开蓝牙
    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}

你也可以直接调用mBluetoothAdapter.enable()来强制打开蓝牙,这个调用不会有任何提示。

查找其它设备

调用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); 

 

连接和匹对蓝牙设备, 

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");