android4.3 蓝牙BLE编程

1、蓝牙4.0简介html

蓝牙4.0标准包含两个蓝牙标准,准确的说,是一个双模的标准,它包含传统蓝牙部分(也有称之为经典蓝牙Classic Bluetooth)和低功耗蓝牙部分(Bluetooth Low Energy)。这两个部分适用于不一样的应用或者应用条件。传统蓝牙是在以前的1.0.1.2,2.0+EDR,2.1+EDR,3.0+EDR等基础上发展和完善起来的,低功耗蓝牙是Nokia的Wibree标准上发展起来的。 android

 传统蓝牙能够用与数据量比较大的传输,如语音,音乐,较高数据量传输等,低功耗蓝牙这样应用于实时性要求比较高,可是数据速率比较低的产品,如遥控类的,如鼠标,键盘,遥控鼠标(Air Mouse),传感设备的数据发送,如心跳带,血压计,温度传感器等。传统蓝牙有3个功率级别,Class1,Class2,Class3,分别支持100m,10m,1m的传输距离,而低功耗蓝牙无功率级别,通常发送功率在7dBm,通常在空旷距离,达到20m应该。因此蓝牙4.0是集成了传统蓝牙和低功耗蓝牙两个标准的,并不仅是低功耗蓝牙。
数组

 蓝牙4.0是蓝牙3.0+HS规范的补充,专门面向对成本和功耗都有较高要求的无线方案,较3.0版本更省电、低成本和跨厂商互操做性、3毫秒低延迟、超长有效链接距离、AES-128加密等;蓝牙4.0可普遍用于卫生保健、体育健身、家庭娱乐、安全保障等诸多领域。一般用在蓝牙耳机、蓝牙音箱、计步器、心律监视器、智能仪表、传感器物联网等设备上,大大扩展蓝牙技术的应用范围。该技术拥有极低的运行和待机功耗,使用一粒纽扣电池甚至可连续工做数年之久。安全

2、蓝牙BLE简介架构

BLE是蓝牙低能耗的简称(Bluetooh Low Energy)。蓝牙低能耗(BLE)技术是低成本、短距离、可互操做的鲁棒性无线技术,工做在免许可的2.4GHz ISM射频频段。它从一开始就设计为超低功耗(ULP)无线技术。它利用许多智能手段最大限度地下降功耗。ide

蓝牙低能耗架构共有两种芯片构成:单模芯片和双模芯片。蓝牙单模芯片能够和其它单模芯片及双模芯片通讯,此时后者须要使用自身架构中的蓝牙低能耗技术部分进行收发数据。双模芯片也能与标准蓝牙技术及使用传统蓝牙架构的其它双模芯片通讯。双模芯片能够在目前使用标准蓝牙芯片的任何场合使用。这样安装有双模芯片的手机、PC、我的导航设备(PND)或其它应用就能够和市场上已经在用的全部传统标准蓝牙设备以及全部将来的蓝牙低能耗设备通讯。单模芯片能够用单节钮扣电池(如3V、220mAh的CR2032)工做很长时间(几个月甚至几年)。post

3、android中蓝牙开发ui

(1)权限及featurethis

 

      和经典蓝牙同样,应用使用蓝牙,须要声明BLUETOOTH权限,若是须要扫描设备或者操做蓝牙设置,则还须要BLUETOOTH_ADMIN权限:
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

 

 

     除了蓝牙权限外,若是须要BLE feature则还须要声明uses-feature:

 

<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>

 

 

     按时required为true时,则应用只能在支持BLE的Android设备上安装运行;required为false时,Android设备都可正常安装运行,须要在代码运行时判断设备是否支持BLE feature:

 

(!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
    Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show();
    finish();
}

(2)启动蓝牙加密

      在使用蓝牙BLE以前,须要确认Android设备是否支持BLE feature(required为false时),另外要须要确认蓝牙是否打开。 若是发现不支持BLE,则不能使用BLE相关的功能。若是支持BLE,可是蓝牙没打开,则须要打开蓝牙。打开蓝牙的步骤:
     一、获取BluetoothAdapter
        BluetoothAdapter是Android系统中全部蓝牙操做都须要的,它对应本地Android设备的蓝牙模块,在整个系统中BluetoothAdapter是单例的。当你获取到它的示例以后,就能进行相关的蓝牙操做了。获取BluetoothAdapter代码示例以下:
// Initializes Bluetooth adapter.
final BluetoothManager bluetoothManager =
        (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
注: 这里经过getSystemService获取BluetoothManager,再经过BluetoothManager获取BluetoothAdapter。BluetoothManager在Android4.3以上支持(API level 18)。
     二、判断是否支持蓝牙,并打开蓝牙
      获取到BluetoothAdapter以后,还须要判断是否支持蓝牙,以及蓝牙是否打开。若是没打开,须要让用户打开蓝牙:
private BluetoothAdapter mBluetoothAdapter;
...
// Ensures Bluetooth is available on the device and it is enabled. If not,
// displays a dialog requesting user permission to enable Bluetooth.
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}

 (3)搜索BLE设备

      经过调用BluetoothAdapter的 startLeScan()搜索BLE设备。调用此方法时须要传入  BluetoothAdapter.LeScanCallback参数。所以你须要实现  BluetoothAdapter. LeScanCallback 接口,BLE设备的搜索结果将经过这个callback返回。搜索的示例代码以下:
/**
 * Activity for scanning and displaying available BLE devices.
 */
public class DeviceScanActivity extends ListActivity {

    private BluetoothAdapter mBluetoothAdapter;
    private boolean mScanning;
    private Handler mHandler;

    // Stops scanning after 10 seconds.
    private static final long SCAN_PERIOD = 10000;
    ...
    private void scanLeDevice(final boolean enable) {
        if (enable) {
            // Stops scanning after a pre-defined scan period.
            mHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    mScanning = false;
                    mBluetoothAdapter.stopLeScan(mLeScanCallback);
                }
            }, SCAN_PERIOD);

            mScanning = true;
            mBluetoothAdapter.startLeScan(mLeScanCallback);
        } else {
            mScanning = false;
            mBluetoothAdapter.stopLeScan(mLeScanCallback);
        }
        ...
    }
    // Device scan callback.
private BluetoothAdapter.LeScanCallback mLeScanCallback =
new BluetoothAdapter.LeScanCallback() {

@Override
public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
runOnUiThread(new Runnable() {
@Override
public void run() {
mLeDeviceListAdapter.addDevice(device);
mLeDeviceListAdapter.notifyDataSetChanged();
}
});
}
};
}
注:(1)因为搜索须要尽可能减小功耗,所以在实际使用时须要注意:
             一、当找到对应的设备后,当即中止扫描;
              二、不要循环搜索设备,为每次搜索设置适合的时间限制。避免设备不在可用范围的时候持续不停扫描,消耗电量。
     (2)若是你只须要搜索指定UUID的外设,你能够调用  startLeScan(UUID[], BluetoothAdapter.LeScanCallback)方法。其中UUID数组指定你的应用程序所支持的GATT Services的UUID;
     (3)
相关文章
相关标签/搜索