掌握Android低功耗蓝牙的通讯过程以及了解温度传感器读写数据

Android低功耗蓝牙

蓝牙4.0

• 蓝牙4.0 = BLE
• 特性
• 超低的峰值、平均和待机功耗• 低成本

• 不同厂商设备交互性• 无线覆盖范围增强
• 完全向下兼容
• 低延时

Android 蓝牙4.0

• BLE是蓝牙4.0的核心Profile,主打功能是快速搜索,快速连接, 超低功耗保持连接和传输数据

• 弱点是数据传输速率低,由于BLE的低功耗特点,因此普遍用于 穿戴设备。

应用场景 – iBeacon技术

• 在2013年9月苹果公司发布了iBeacon技术

• ShellBeacon, BrightBeacon在基于iBeacon技术,和运用蓝 牙4.0标准为通信方式的前提下,提供了一整套基于ibeacon的 技术解决方案和供便于开发的SDK。

蓝牙防丢器

• 蓝牙4.0防丢器即智能蓝牙(Smart Bluetooth)防丢器
• 采用最新蓝牙4.0技术,专门为iphone/ipad设计的防丢器• 简单轻巧的设计,方便携带
• 工作原理主要是通过距离变化来判断物品是否 还控制在你的安全范围。

SensorTag

  • IR Temperature, both object and ambient temperature
  • Movement, 9 axis (accelerometer, gyroscope,magnetometer)
  • Humidity, both relative humidity and temperature
  • Barometer, both pressure and temperature
  • Optical, light intensity

使用蓝牙设备

• 申请使用蓝牙设备权限
• 查看手机是否支持蓝牙设备和蓝牙4.0功能• 打开蓝牙功能
• 扫描附近的设备

使用蓝牙设备权限

android.permission.ACCESS_COARSE_LOCATION    在Android 6.0上需要动态申请权限

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

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

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

蓝牙4.0 Feature

清单文件里添加BLE的feature

<uses-featureandroid:name="android.hardware.bluetooth.le"android:required="true"/>

蓝牙4.0 Feature

查看设备是否支持BLE功能

if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { Toast.makeText(MainActivity.this, "Not support BLE", Toast.LENGTH_SHORT).show(); finish();

}

1-打开蓝牙

检测如果蓝牙没有打开的话,需要申请打开蓝牙开关
if (mBluetoothAdapter != null && !mBluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivity(enableBtIntent);

}

2-扫描附近蓝牙4.0设备

通过ScanCallback 来获取附近蓝牙设备

public void scan(boolean enable) {
final ScanCallback mScanCallback = new ScanCallback() {

@Override

public void onScanResult(int callbackType, ScanResult result) { }

};

if(enable) {mLeScanner.startScan(mScanCallback);

} else {mLeScanner.stopScan(mScanCallback);

}

}

GattCallback

• BluetoothGattCallback 是BLE设备连接以及通信过冲中状态 变化的主要返回调函数。

连接/断开 BLE设备

连接:

final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);if (device == null) {

Log.w(TAG, "Device not found, cannot to connect");

    return false;
}
mBluetoothGatt = device.connectGatt(this, false, mGattCallback); Log.d(TAG, "Trying to create a new connection");

连接/断开 BLE设备

断开:

if (mBluetoothGatt != null) mBluetoothGatt.disconnect();

BLE连接状态变化

@Override

public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {super.onConnectionStateChange(gatt, status, newState);
Log.d(TAG, "+onConnectionStateChange+ status = " + status +

", newState = " + newState);mMainHandler.sendEmptyMessage(newState);

}

注意:

在onConnectionStateChange返回调函数里面不能直接操作刷新UI控件, 需要使用Handler来通知主线程来刷新UI界面。

发现蓝牙设备的Service和特征值

每一个Service和Characteristic对应一个UUID,通过这个UUID来设备不同设备中不同数据的协议。

比如在SensorTag里面的温度传感器的Service UUID为:

f000aa00-0451-4000-b000-000000000000

温度传感器数据特征值的UUID为:

f000aa01-0451-4000-b000-000000000000

Android对BLE设备的数据操作

• readValue

• writeValue

• notify

读/写数据

• 通过Service里面的特征值来读/写数据

• byte[] data = characteristic.getValue();
• gattCharacteristic.setValue(new byte[] {0x01});
mBluetoothGatt.writeCharacteristic(gattCharacteristic);



具体看demo