編輯:關於Android編程
研究了一段時間的藍牙使用,發現網上相關的資料比較貧乏,不像其他Android相關資料那麼齊全,基本上大部分資料都是在藍牙聯盟SIG提供的官網https://www.bluetooth.com/zh-cn/specifications上查找得到,也沒有一個比較穩定好用的基礎操作框架,開發時遇到的各種問題也是非常頭疼。在此種情況下該框架應運而生,框架中包含了藍牙設備的基礎操作功能,調用簡單,已通過實際項目進行驗證,並且配有一個比較好用的demo演示,下文主要講述該框架的使用方式。
項目地址:https://github.com/xiaoyaoyou1212/BLE
項目引入:compile project('com.vise.xiaoyaoyou:baseble:1.0.0')
設備掃描
使用簡介
掃描包含三種方式,第一種方式是直接掃描所有設備,可以設置循環掃描,也可以設置超時時間,掃描到的設備可以添加到
BluetoothLeDeviceStore中統一進行處理,使用方式如下:
ViseBluetooth.getInstance(this).setScanTimeout(-1).startScan(new PeriodScanCallback() {
@Override
public void scanTimeout() {
}
@Override
public void onDeviceFound(BluetoothLeDevice bluetoothLeDevice) {
bluetoothLeDeviceStore.addDevice(bluetoothLeDevice);
}
});
第二種方式是掃描指定Mac地址的設備,一般需設置超時時間,掃描到指定設備後就停止掃描,使用方式如下:
ViseBluetooth.getInstance(this).setScanTimeout(5000).startScan(new PeriodMacScanCallback() {
@Override
public void scanTimeout() {
}
@Override
public void onDeviceFound(BluetoothLeDevice bluetoothLeDevice) {
}
});
第三種方式是掃描指定廣播名的設備,同第二種方式類似,也需設置超時時間,掃描到指定設備後也會停止掃描,使用方式如下:
ViseBluetooth.getInstance(this).setScanTimeout(5000).startScan(new PeriodNameScanCallback() {
@Override
public void scanTimeout() {
}
@Override
public void onDeviceFound(BluetoothLeDevice bluetoothLeDevice) {
}
});
其中掃描到的設備信息都統一放到
BluetoothLeDevice中,其中包含了設備的所有信息,以下會詳細講解具體包含哪些信息。
示例圖
設備連接
使用簡介
連接與掃描一樣也有三種方式,第一種方式是在掃描獲取設備信息
BluetoothLeDevice後才可使用,可設置連接超時時間,默認超時時間為10秒,使用方式如下:
ViseBluetooth.getInstance(this).connect(bluetoothLeDevice, false, new IConnectCallback() {
@Override
public void onConnectSuccess(BluetoothGatt gatt, int status) {
}
@Override
public void onConnectFailure(BleException exception) {
}
});
第二種方式是連接指定Mac地址的設備,該方式使用前不需要進行掃描,該方式直接將掃描和連接放到一起,在掃描到指定設備後自動進行連接,使用方式如下:
ViseBluetooth.getInstance(this).connectByMac(mac, false, new IConnectCallback() {
@Override
public void onConnectSuccess(BluetoothGatt gatt, int status) {
}
@Override
public void onConnectFailure(BleException exception) {
}
});
第三種方式是連接指定名稱的設備,該方式與第二種方式類似,使用方式如下:
ViseBluetooth.getInstance(this).connectByName(name, false, new IConnectCallback() {
@Override
public void onConnectSuccess(BluetoothGatt gatt, int status) {
}
@Override
public void onConnectFailure(BleException exception) {
}
});
連接成功後就可以進行相關處理,回調已在底層做了線程切換處理,可以直接操作視圖。如果知道該設備服務的UUID,可直接調用
ViseBluetooth.getInstance(this).withUUIDString(serviceUUID, characteristicUUID, descriptorUUID);,那麼在下面操作設備時就不需要傳特征(
BluetoothGattCharacteristic)和描述(
BluetoothGattDescriptor)相關參數,如果在連接成功後一直沒設置UUID,那麼在操作時則需要傳該參數,該內容在下文的設備操作中會詳細講解,此處就不一一講解了。
示例圖
設備詳情
使用簡介
DEVICE INFO(設備信息)
獲取設備名稱(Device Name):bluetoothLeDevice.getName(); 獲取設備地址(Device Address):bluetoothLeDevice.getAddress(); 獲取設備類別(Device Class):bluetoothLeDevice.getBluetoothDeviceClassName(); 獲取主要設備類別(Major Class):bluetoothLeDevice.getBluetoothDeviceMajorClassName(); 獲取服務類別(Service Class):bluetoothLeDevice.getBluetoothDeviceKnownSupportedServices(); 獲取配對狀態(Bonding State):bluetoothLeDevice.getBluetoothDeviceBondState();
RSSI INFO(信號信息)
獲取第一次信號時間戳(First Timestamp):bluetoothLeDevice.getFirstTimestamp(); 獲取第一次信號強度(First RSSI):bluetoothLeDevice.getFirstRssi(); 獲取最後一次信號時間戳(Last Timestamp):bluetoothLeDevice.getTimestamp(); 獲取最後一次信號強度(Last RSSI):bluetoothLeDevice.getRssi(); 獲取平均信號強度(Running Average RSSI):bluetoothLeDevice.getRunningAverageRssi();
SCAN RECORD INFO(廣播信息)
根據掃描到的廣播包
AdRecordStore獲取某個廣播數據單元
AdRecord的類型編號
record.getType(),再根據編號獲取廣播數據單元的類型描述
record.getHumanReadableType()以及該廣播數據單元的長度及數據內容,最後通過
AdRecordUtil.getRecordDataAsString(record)將數據內容轉換成具體字符串。
示例圖
設備操作
使用簡介
在操作設備前首先要保證設備已連接成功,那麼在設備連接成功獲取到
BluetoothGatt後直接對服務的特征值UUID進行相關處理,其中特征值UUID有可讀、可寫、可通知、指示器四種,獲取過程如下所示:
final String unknownServiceString = getResources().getString(R.string.unknown_service);
final String unknownCharaString = getResources().getString(R.string.unknown_characteristic);
final List
在獲取到
BluetoothGattCharacteristic後可進行如下操作:
- 設置通知服務
ViseBluetooth.getInstance(this).enableCharacteristicNotification(characteristic, new IBleCallback() {
@Override
public void onSuccess(BluetoothGattCharacteristic bluetoothGattCharacteristic, int type) {
}
@Override
public void onFailure(BleException exception) {
}
}, false);
其中最後一個參數是設置該通知是否是指示器方式,指示器方式為有應答的通知方式,在傳輸時更為靠譜。如果在連接成功時已經知道該設備可通知的UUID並且已經設置成功,那麼此處還可以如下設置:
ViseBluetooth.getInstance(this).enableCharacteristicNotification(new IBleCallback() {
@Override
public void onSuccess(BluetoothGattCharacteristic bluetoothGattCharacteristic, int type) {
}
@Override
public void onFailure(BleException exception) {
}
}, false);
讀取信息
ViseBluetooth.getInstance(this).readCharacteristic(characteristic, new IBleCallback() {
@Override
public void onSuccess(BluetoothGattCharacteristic bluetoothGattCharacteristic, int type) {
}
@Override
public void onFailure(BleException exception) {
}
});
同上,如果已設置過可讀的UUID,那麼此處也可以通過如下方式讀取信息:
ViseBluetooth.getInstance(this).readCharacteristic(new IBleCallback() {
@Override
public void onSuccess(BluetoothGattCharacteristic bluetoothGattCharacteristic, int type) {
}
@Override
public void onFailure(BleException exception) {
}
});
寫入數據
ViseBluetooth.getInstance(this).writeCharacteristic(characteristic, new byte[]{0x00,0x01,0x02}, new IBleCallback() {
@Override
public void onSuccess(BluetoothGattCharacteristic bluetoothGattCharacteristic, int type) {
}
@Override
public void onFailure(BleException exception) {
}
});
同樣,如果在連接成功時設置過可寫UUID,那麼此處也可以通過如下方式寫入數據:
ViseBluetooth.getInstance(this).writeCharacteristic(new byte[]{0x00,0x01,0x02}, new IBleCallback() {
@Override
public void onSuccess(BluetoothGattCharacteristic bluetoothGattCharacteristic, int type) {
}
@Override
public void onFailure(BleException exception) {
}
});
此處的數據
new byte[]{0x00,0x01,0x02}為模擬數據,在使用時替換為真實數據即可,切記每次發送的數據必須在20個字節內,如果大於20字節可采用分包機制進行處理。
示例圖
總結
從以上的描述中可以知道,設備相關的所有操作都統一交給
ViseBluetooth進行處理,並且該類是單例模式,全局只有一個,管理很方便,連接設備成功時會自動獲得一個
BluetoothGatt,在斷開連接時會將該
BluetoothGatt關閉,上層不用關心連接數最大為6的限制問題,只需要在需要釋放資源時調用
ViseBluetooth.getInstance(this).clear();就行,簡單易用,這也正是該項目的宗旨。
這個錯誤翻譯的意思是:不能在沒有Looper.prepare的線程裡面創建handler。起初我很疑惑,我根本沒有用到工作線程,也沒有創建handler。報錯的代碼如下:
當然現在不用這個工具也可,目前可以直接在布局中非常直觀地觀察到布局當中的錯誤和警告。不過有eclipse難免會報錯的時候,多知道一點沒什麼不好 以前這個工具不叫lint而
前言新版本ShareSDK的分享和短信驗證,按官網的文檔,都需要添加一個標簽,而分享和短息驗證的這個標簽內容都一樣。會沖突。解決辦法:分享用舊版本,短信驗證用新版本。後面
自定義view的第三篇,模仿的是微博運動界面的個人出生日期設置view,先看看我的效果圖: 支持設置初始年份,左右滑動選擇出生年份,對應的TextView的值也會改變。這