You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C语言存储并在终端打印hcitool lescan扫描结果

解决hcitool lescan输出捕获与格式化问题

问题根源

你的代码存在三个关键问题:

  • popen用错了模式:"w"是用来给子进程发数据的,要读取hcitool lescan的输出得用"r"模式。
  • hcitool lescan的部分输出会直接走stderr,默认管道抓不到这部分内容,得重定向到stdout。
  • 错误处理有问题:popen失败后调用pclose(x_pipe)会操作空指针,触发异常。

修正后的代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define BUFFER_LEN 256

int main() {
    FILE *scan_pipe;
    char buffer[BUFFER_LEN];

    // 用r模式读取输出,同时把stderr重定向到stdout,确保所有内容能被捕获
    scan_pipe = popen("/usr/bin/hcitool lescan 2>&1", "r");
    if (!scan_pipe) {
        perror("popen failed!");
        return -1;
    }

    sleep(3); // 预留3秒扫描时间

    // 打开文件存储扫描结果,也可以改用数组实现内存存储
    FILE *result_file = fopen("bt_scan_results.txt", "w");
    if (result_file) {
        while (fgets(buffer, BUFFER_LEN, scan_pipe) != NULL) {
            // 打印带Debug前缀的内容
            printf("Debug: %s", buffer);
            // 把结果写入文件保存
            fputs(buffer, result_file);
        }
        fclose(result_file);
    } else {
        perror("Failed to open result file");
    }

    pclose(scan_pipe);
    return 0;
}

关键修改说明

  1. 管道模式调整:把popen的第二个参数从"w"改成"r",让管道连接到子进程的标准输出,才能读取扫描结果。
  2. 输出重定向:在命令末尾加2>&1,把hcitool lescan的标准错误输出转到标准输出,保证所有扫描内容都能通过管道捕获。
  3. 错误处理修复:去掉popen失败后的pclose调用,避免空指针操作。
  4. 结果存储:新增文件写入逻辑,扫描结果会被保存到bt_scan_results.txt,如果需要内存存储,换成数组或者动态链表即可。

验证效果

运行修正后的程序,终端输出会和你预期的一致:

root@device100:~# bt_service
Debug: LE Scan ...
Debug: 76:AC:17:0C:B8:CF (unknown)
Debug: 23:61:7A:13:08:E2 (unknown)
...

同时扫描结果会被写入指定文件,方便后续处理。

内容的提问来源于stack exchange,提问作者CHC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 13:22:07