<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
當掃碼槍與手機連線時,通常採用的是藍芽HID(Human Interface Device)模式。本質上是一個把掃碼槍作為一個硬體鍵盤,按照鍵盤協定把掃碼後的結果逐個輸入到對應的控制元件上。
優點:無需開發整合,配對就可以立即作為鍵盤輸入使用。可以使用輸入框等元件直接接收掃碼結果。
缺點:對非數位支援不佳,與輸入法相關,在某些時候會觸發英文聯想-_-||,與虛擬鍵盤會發生衝突,連線掃碼槍時需要切換鍵盤輸入法輸入。
而我們要掃描的標籤,不僅有英文,特殊符號,還有中文,因此以HID模式接入的藍芽掃碼槍,最終是不能滿足要求的。於是重新選型了支援BLE模式的掃碼槍。
BLE模式掃碼槍
優點:相容性好,遵循藍芽協定,與鍵盤輸入法無關。更底層,直接返回原始二進位制資料流,方便判定編碼以及進行字元編碼轉換。
缺點:需要進行原生開發, 處理裝置掃描,連線,資料讀寫等操作。
好在有github,其中的BLESSED for Android - BLE made easy 專案,就是一個致力於簡化android上BLE開發工作的開源庫。但在擼程式碼前還是要簡單理解下BLE協定的主要概念。
較為重要的兩個東西是Service(服務) 與Characteristic(特性,譯為功能可能更好理解),簡而言之,一個裝置可以提供多個服務,每個服務可以提供多個特性功能,每個服務及特性對應一個UUID。
與裝置的通訊通過功能進行,每個功能通過Properties(屬性)表明該特性支援讀,寫或者通知。
為了便於理解BLE協定,推薦下載一個叫做“BLE偵錯助手”的APP。下面是APP的截圖。
截圖演示瞭如何從一個支援BLE協定的裝置中讀取電量,不需要提前配對,開啟APP掃描到對應裝置後,點選Connect, 隨後列出的就是一堆上面說的Service(服務),能夠顯示服務名稱的如“Battery Service”,是根據UUID的約定取得的。
如電池服務為0x180F。點開服務後是Characteristic,其中的Battery Level(也是UUID約定 0x2A19)的Properties為 READ NOTIFY,表明該特性支援讀取和通知。
點選那個下箭頭,點選讀取,顯示出返回資料為0x5D(十進位制估計九十多:-0)。
電池服務是一個在協定中約定的標準服務,但掃碼槍的似乎不是,我們還需要找到掃碼後,是通過哪個Service的哪個Characteristic進行通知的,通過這個工具APP也不難找,注意,要開啟那個接受通知資料。
掃碼後會有資料顯示,找到之後就可以開始編碼了。
https://github.com/weliem/blessed-android
下面進入具體的擼程式碼環節
安裝 gradle file加入
allprojects { repositories { ... maven { url 'https://jitpack.io' } } } dependencies { implementation 'com.github.weliem:blessed-android:2.0.6'
掃描裝置
BluetoothCentralManager central = new BluetoothCentralManager(AppContext.baseAppContext, bluetoothCentralManagerCallback, new Handler(Looper.getMainLooper())); central.scanForPeripherals();
bluetoothCentralManagerCallback是掃描回撥方法,重要的有下面三個
//發現了一個裝置 @Override public void onDiscoveredPeripheral(BluetoothPeripheral peripheral, ScanResult scanResult) //連線裝置 @Override public void onConnectedPeripheral(BluetoothPeripheral peripheral) //裝置斷開 @Override public void onDisconnectedPeripheral(BluetoothPeripheral peripheral, HciStatus status)
發現裝置後onDiscoveredPeripheral,連線裝置,停止掃描 。bluetoothPeripheralCallback 為裝置回撥,用於接受通知
central.autoConnectPeripheral(peripheral, bluetoothPeripheralCallback); central.stopScan();
onConnectedPeripheral連線後查詢提供的服務及特性
Log.i("BLE","onConnectedPeripheral"); List<BluetoothGattService> serviceList = peripheral.getServices(); for (int i = 0; i < serviceList.size(); i++) { Log.i("BLE", "Service: " + serviceList.get(i).getUuid()); if(serviceList.get(i).getUuid().toString().equals("6e400001-b5a3-f393-e0a9-e50e24dcca9e")){ List<BluetoothGattCharacteristic> list= serviceList.get(i).getCharacteristics(); for (int j = 0; j < list.size(); j++) { Log.i("BLE", "Characteristic: " + list.get(j).getUuid()); } } }
onConnectedPeripheral後,對特性開啟通知,接受掃碼結果,服務的和特性的UUID,需要對應填寫,掃碼結果是以通知資訊返回的。
BluetoothGattCharacteristic currentTimeCharacteristic = peripheral.getCharacteristic(SERVICE_UUID, CURRENT_TIME_CHARACTERISTIC_UUID); if (currentTimeCharacteristic != null) { //開啟通知 peripheral.setNotify(currentTimeCharacteristic, true); } //與裝置通訊需要建立繫結 boolean bret= peripheral.createBond();
斷開重連可以在onDisconnectedPeripheral中處理
接收掃碼結果 在裝置回撥類 bluetoothPeripheralCallback中的下列方法處理。其中value為掃到的二維條碼值
@Override public void onCharacteristicUpdate(@NonNull BluetoothPeripheral peripheral, @NonNull byte[] value, @NonNull BluetoothGattCharacteristic characteristic, @NonNull GattStatus status)
另:
public static Boolean isUtf8(byte[] buffer) { boolean isUtf8 = true; int end = buffer.length; for (int i = 0; i < end; i++) { byte temp = buffer[i]; if ((temp & 0x80) == 0) {// 0xxxxxxx continue; } else if ((temp & 0xC0) == 0xC0 && (temp & 0x20) == 0) {// 110xxxxx 10xxxxxx if (i + 1 < end && (buffer[i + 1] & 0x80) == 0x80 && (buffer[i + 1] & 0x40) == 0) { i = i + 1; continue; } } else if ((temp & 0xE0) == 0xE0 && (temp & 0x10) == 0) {// 1110xxxx 10xxxxxx 10xxxxxx if (i + 2 < end && (buffer[i + 1] & 0x80) == 0x80 && (buffer[i + 1] & 0x40) == 0 && (buffer[i + 2] & 0x80) == 0x80 && (buffer[i + 2] & 0x40) == 0) { i = i + 2; } else if ((temp & 0xF0) == 0xF0 && (temp & 0x08) == 0) {// 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx if (i + 3 < end && (buffer[i + 1] & 0x80) == 0x80 && (buffer[i + 1] & 0x40) == 0 && (buffer[i + 2] & 0x80) == 0x80 && (buffer[i + 2] & 0x40) == 0 && (buffer[i + 3] & 0x80) == 0x80 && (buffer[i + 3] & 0x40) == 0) { i = i + 3; } isUtf8 = false; break; } return isUtf8; }
到此這篇關於Android BLE 藍芽開發之實現掃碼槍基於BLESSED開發的文章就介紹到這了,更多相關Android BLE 藍芽開發內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45