背景
在嵌入式上開發藍牙BLE HID發現在啓動HID服務後,使用一些手機會掃描到兩個同名到設備。
分析UUID發現一個是經典藍牙,一個是低功耗藍牙(BLE HID)。
找藍牙配置發現,壓根沒有藍牙配置(惱)。
解決方法
複製一份ubuntu上/etc/bluetooth/main.conf將其中的ControllerMode改為le:
ControllerMode = le
然後複製到rootfs-overlay對應的/etc/bluetooth/main.conf(如果沒有就創建)
因為我只想讓設備作為一個BLE HID設備,所以需要在啓動時關閉一些不必要到插件。
找到藍牙啓動的腳本添加上不需要到插件:
--noplugin=sap,audio,avrcp,headset,network,hfp,obex,objpush
這個是bluetoothd啓動時的選項可以關閉不需要的插件。
c修改後啓動腳本如下(僅截取了啓動部分):
DAEMON="bluetoothd"
PIDFILE="/var/run/$DAEMON.pid"
BLUETOOTHD_ARGS="-n --noplugin=sap,audio,avrcp,headset,network,hfp,obex,objpush"
# shellcheck source=/dev/null
[ -r "/etc/default/$DAEMON" ] && . "/etc/default/$DAEMON"
start() {
printf 'Starting %s: ' "$DAEMON"
# shellcheck disable=SC2086 # we need the word splitting
start-stop-daemon -S -q -m -b -p "$PIDFILE" -x "/usr/libexec/bluetooth/$DAEMON" \
-- $BLUETOOTHD_ARGS
status=$?
if [ "$status" -eq 0 ]; then
echo "OK"
else
echo "FAIL"
fi
return "$status"
}
配置完成後刪除原來的bluez_utils重新編譯系統。
再次測試發現只有一個藍牙設備存在,連接後被識別為BLE HID設備。
遺留問題
這樣修改後藍牙是能正常使用,不過不能使用bluetoothctl命令(一旦使用就會找不到藍牙適配器)。
因為不影響使用所以就沒有去關注這個問題(估計和這個設備到驅動有關係)。