fix(bt): M49 蓝牙控制面重建 — paired-devices/a2dp list-pcms+info/run_cmd 四态+写后真态复查+扫描 ANSI 解析
真机 0.8.49 现场 /usr/bin/meow_netmgrd 是 P1(eb07415) 之前的旧件:`bt status` 无
connected= 字段、`bt connected|devices|a2dp` 连子命令都不存在(被当成写级拒绝)、
`bt paired` 落到 `bluetoothctl paired` → "Invalid command in menu main"。上游只有
NETMGR_UNREACH 才回退直连,INVAL/PERM 直接返回 → 三个列表恒空。
本单修掉「部署新件后依然存在」的三个真 bug + 一个解析缺陷:
1. `bluetoothctl paired` → `paired-devices`(bt_status 计数、bt paired 子命令两处);
`devices` 只用于补名,不再当配对权威。
2. A2DP:v4.1.1 没有 `a2dp list`。改为 `list-pcms` 取端点 → 每端点 `info <path>`;
MAC 只从 D-Bus 路径的 `dev_XX_..` 段解(真机路径带 `/a2dpsrc/source` 段,
按「最后一段取 token」会拿到 "source")。info 查不到就跳过,不编造。
3. `run_cmd` 四态(成功有输出/成功无输出/非 0 退出/超时/起不来)+ stderr 有界抓取
(≤256B):旧实现只回字节数、失败也返回 0 → on/off/connect/disconnect/pair 恒报成功。
写操作改为下发后复查真态(hcitool con / bluetoothctl info Paired: / hciconfig
power),超时或未收敛如实报 MEOW_ERR_NODEV。兼容外壳 run_cmd() 契约不变。
4. 扫描缓存:实时 `[NEW] Device` 行以 ANSI ESC 开头(真机 od -c 证据),旧解析器只认
行首 → 实时行全丢。新增 bt_clean_ansi()/bt_scan_line_parse():剥 ESC/CSI/控制符、
去 `[bluetooth]# ` 提示符、只认 [NEW] 与裸 Device、排除 [CHG]/[DEL];bt_scan_on 改用
g_bluetoothctl(原来硬编码,桩对 scan 无效)。
解析器全部抽成纯函数并用真机原始字节做单测(test_bt_ctl.c 扩充:四态、ANSI 样本、
截断/空输出、list-pcms/info、hcitool con)。test_netmgrd.sh 桩改 list-pcms/info +
真机 ANSI 缓存样本;顺带修掉两处宿主可移植性问题(/tmp 不可写→$TMPDIR、桩脚本在
PATH=/bin:/usr/bin 下用了 cat/rm→改 shell 内建,test_wifi_connect 的 g_wpa_cli 悬垂
栈指针)。
按塔要求:本 commit 不含二进制、不改 fw_content.conf(netmgrd 产物由 M51 统一重编)。
build_netmgrd.sh 只做 ROOT/ZIGCC/OUT 环境变量化(旧硬编码 $HOME/Project/R3ProII),
M51 复用;time32 接入仍归 M43。
This commit is contained in:
1 parent
00e7271395
commit
370c290160
5 files changed
+1267
-312
No files matched your search
@@ -65,10 +65,12 @@ static void write_stub(void)
|
||||
fputs(
|
||||
"#!/bin/sh\n"
|
||||
"D=\"${MN_WIFI_DIR:-/tmp}\"\n"
|
||||
"catf() { [ -f \"$1\" ] || return 0; while IFS= read -r l || [ -n \"$l\" ]; do echo \"$l\"; done < \"$1\"; }\n"
|
||||
"echo \"$@\" >> \"$D/log\"\n"
|
||||
"case \"$1\" in\n"
|
||||
" status)\n"
|
||||
" m=$(cat \"$D/status_mode\" 2>/dev/null || echo completed)\n"
|
||||
" m=completed\n"
|
||||
" if [ -f \"$D/status_mode\" ]; then IFS= read -r m < \"$D/status_mode\"; fi\n"
|
||||
" if [ \"$m\" = \"associating\" ]; then\n"
|
||||
" echo \"wpa_state=ASSOCIATING\"; echo \"ssid=MyWiFi\"\n"
|
||||
" else\n"
|
||||
@@ -77,7 +79,7 @@ static void write_stub(void)
|
||||
" fi\n"
|
||||
" ;;\n"
|
||||
" list_networks)\n"
|
||||
" if [ -f \"$D/list\" ]; then cat \"$D/list\"\n"
|
||||
" if [ -f \"$D/list\" ]; then catf \"$D/list\"\n"
|
||||
" else printf 'network id / ssid / bssid / flags\\n0\\tMyWiFi\\tany\\t[CURRENT]\\n'\n"
|
||||
" fi\n"
|
||||
" ;;\n"
|
||||
@@ -87,7 +89,9 @@ static void write_stub(void)
|
||||
" select_network) echo OK ;;\n"
|
||||
" disconnect) echo OK ;;\n"
|
||||
" save_config)\n"
|
||||
" if [ -f \"$D/save_fail_once\" ]; then rm -f \"$D/save_fail_once\"; echo FAIL; else echo OK; fi\n"
|
||||
" v=\"\"\n"
|
||||
" if [ -f \"$D/save_fail_once\" ]; then IFS= read -r v < \"$D/save_fail_once\"; fi\n"
|
||||
" if [ \"$v\" = \"1\" ]; then echo \"\" > \"$D/save_fail_once\"; echo FAIL; else echo OK; fi\n"
|
||||
" ;;\n"
|
||||
" set) echo OK ;;\n"
|
||||
" remove_network) echo OK ;;\n"
|
||||
@@ -101,7 +105,10 @@ static void write_stub(void)
|
||||
|
||||
int main(void)
|
||||
{
|
||||
snprintf(g_dir, sizeof g_dir, "/tmp/mnwifi.XXXXXX");
|
||||
/* 宿主临时目录:Termux/Android 上 /tmp 不可写 → 跟随 $TMPDIR */
|
||||
const char *tmp = getenv("TMPDIR");
|
||||
if (!tmp || !tmp[0]) tmp = "/tmp";
|
||||
snprintf(g_dir, sizeof g_dir, "%s/mnwifi.XXXXXX", tmp);
|
||||
if (!mkdtemp(g_dir)) { fprintf(stderr, "mkdtemp fail\n"); return 2; }
|
||||
write_stub();
|
||||
setenv("MN_WIFI_DIR", g_dir, 1);
|
||||
@@ -110,7 +117,7 @@ int main(void)
|
||||
g_connect_wait_ms = 400;
|
||||
g_connecth_wait_ms = 400;
|
||||
{
|
||||
char p[192];
|
||||
static char p[192];
|
||||
snprintf(p, sizeof p, "%s/wpa_cli", g_dir);
|
||||
g_wpa_cli = p;
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user