掌握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