優化Android搜尋藍牙裝置方式(API 21)

Android 6.0(API 21)以後, 搜尋藍芽裝置的方式改成:

BluetoothAdapter.startScan (ScanCallback callback)

這種方式我一直用了很久, 也沒遇到問題.

直到有一個需求是隨時監控廣播封包,

這種寫法就會遇到問題, 無法快速取得周遭藍牙廣播資料, 因此需要修改寫法, 把能下的藥都下下去(但耗電):

final List<ScanFilter> filters = new ArrayList<>();
ScanFilter filter = new ScanFilter.Builder().build();
filters.add(filter);

final ScanSettings scanSettings =
        new ScanSettings.Builder() .setNumOfMatches(ScanSettings.MATCH_NUM_MAX_ADVERTISEMENT).setMatchMode(ScanSettings.MATCH_MODE_STICKY).setCallbackType(ScanSettings.CALLBACK_TYPE_ALL_MATCHES).setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY).build();


BluetoothAdapter.getBluetoothLeScanner().startScan(filters,scanSettings,mLeScanCallback);

Android NFC啟用 小工具 NfcToggler

咖啡偶手機小米6原本刷成 LineageOS 15.1 , 但後來為了使用NFC-SIM 悠遊卡 , 只好捨去 LOS , 改刷成小米國際版, 這個版本可以讓NFC功能從Google Pay的HCE功能, 切換 SIM 錢包(也就是nfc-sim)功能.

但是問題來了, 我認為 NFC 平常要關閉,

原本 LOS 15.1內建快速切換工具, 滑下來按一下就可以啟用與停用.

但小米的國際版本不行, 只能選來選去然後停用, 因此寫了一隻小工具widget (需要ROOT) , 按一下就可以方便的啟用與停用, 有興趣可以點選這裡參考看看.

#android

#taiwan

#nfc

 

ubuntu 無法辨識android裝置no permissions

ubuntu連線到android裝置很方便, 安裝程式很簡單:

sudo apt install android-tools-adb android-tools-fastboot

但是常常卡到執行指令 adb devices 想要列出手機時, 出現 no premissions的錯誤

List of devices attached 
????????????    no permissions

原來是要設定usb連線權限
1. 找出google 的裝置

$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 8087:0a2b Intel Corp. 
Bus 001 Device 002: ID 05c8:03a2 Cheng Uei Precision Industry Co., Ltd (Foxlink) 
Bus 001 Device 006: ID 18d1:4ee7 Google Inc.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

2. 將該device加到 /etc/udev/rules.d/70-android.rules
70代號可改, 無此檔案也可自行新增
新增內容如下:

SUBSYSTEM=="usb",ATTRS{idVendor}=="18d1",ATTRS{idProduct}=="4ee7",MODE="0666"

3. 重開

  sudo /etc/init.d/udev restart 

PS.

手機不同狀態下(sideload , recovery , system) 都可能有不同的usb id , 因此可能要設定多次

android 刷機好法子"側邊載入(sideload)"

咖啡偶的目前手機是小米6, 因為常常刷機, 版本差異又大,每次刷機,必須重新格式化手機,

因此會用到usb otg, 把要刷的rom放到usb磁碟上, 當手機進入 recovery 的時候, 就可以放心格式化手機, 並且把usb上的rom刷入手機.

但是這方式有點麻煩,需要準備平時也用不著的usb ota,

所以很久以前android就發展sideload的方式刷機, 電腦直接刷rom進去手機, 這就方便多了.

1.手機進入recovery的sideload等待畫面

 

 

 

 

 

 

 

 

 

2.電腦使用adb sideload 指令刷入rom

藍牙罩門UUID

關於藍芽SDP UUID解釋
需要到 www.bluetooth.org  裡面尋找有關 Service Discovery Protocol訊息

https://www.bluetooth.org/Technical/AssignedNumbers/service_discovery.htm

裡面提到 UUID分成BASE UUID 128bits 與 SHORT UUID(32bits, 16bits)

BASE UUID 格式如下:
00000000-0000-1000-8000-00805F9B34FB

SHORT UUID 再分成 UUID32(2的32次方) 與 UUID16(2的16次方)

UUID32 、UUID16 都是短款的格式

為了相容以往舊款 SDP UUI D格式
在BASE UUID前32bits即是UUID32 , 接下來16bits即UUID16

因此重看BASE UUID:
00000000-0000-1000-8000-00805F9B34FB
桃紅色加上綠色為UUID32, 綠色為UUID16

接下來我們想要使用程式註冊SPP, 透過serial port連線,
根據 www.bluetooth.org 的規範, 須將UUID改成
00001101-0000-1000-8000-00805F9B34FB

1 2