跳转至

SoftAP 上报

SLP Radar + WiFi SoftAP + TCP Socket

前置阅读:基础雷达SoftAP

学习目标

  • 掌握雷达 + WiFi SoftAP 的组合使用
  • 理解 SoftAP 直连场景的适用性
  • 能够在 WS63 上实现雷达感知 → 对端直连 → 数据上报

规格与功能

雷达感知 → SoftAP 创建热点 → PC 连接热点 → 通过 TCP Socket 接收雷达数据。

规格项 说明
雷达 SLP Radar,同基础感知
热点 SoftAP,SSID=WS63-Radar
传输 TCP Socket(Server 模式)
对端 PC 连接热点后自动接收数据

程序运行流程:雷达初始化 → SoftAP 启动 + DHCP Server → TCP Server 监听 → PC 连接热点 → TCP accept → 雷达结果回调 → send() → PC 接收。

基本概念

SoftAP 上报链路

flowchart LR
    Radar[雷达感知] --> CB[结果回调]
    CB --> Pack[打包数据帧]
    Pack --> TCP[TCP Server]
    TCP --> AP[WiFi SoftAP]
    AP --> PC[PC 直连]

STA vs SoftAP

WiFi STA 上报 WiFi SoftAP 上报
需要路由器
适合 远程云端上报 本地调试 / 无路由器环境
对端 云端服务器(公网 IP) PC/手机(直连)
传输 UDP(高频) TCP(可靠)

涉及 API

API 用途
uapi_radar_register_result_cb() Radar 结果回调
wifi_softap_enable() 开启 SoftAP
socket() / bind() / listen() / accept() TCP Server
send() TCP 发送数据

案例操作指导

PC 连接 WS63-Radar 热点,运行数据接收程序,自动接收雷达数据。

关键配置

参数 说明
SoftAP SSID WS63-Radar 热点名称
TCP 端口 8888 自定义
最大连接数 1 雷达调试通常一对一

代码详解

SoftAP 启动后创建 TCP Server

static void softap_ready_cb(void)
{
    radar_init();
    radar_start();

    // 创建 TCP Server
    g_tcp_sock = socket(AF_INET, SOCK_STREAM, 0);
    struct sockaddr_in server_addr = {
        .sin_family = AF_INET,
        .sin_port   = htons(8888),
        .sin_addr   = { .s_addr = INADDR_ANY },
    };
    bind(g_tcp_sock, (struct sockaddr *)&server_addr, sizeof(server_addr));
    listen(g_tcp_sock, 1);

    // 等待客户端连接
    g_client_sock = accept(g_tcp_sock, NULL, NULL);
    printf("[Radar] client connected\n");
}

雷达结果回调中推送

static void radar_result_cb(radar_result_t *result)
{
    if (g_client_sock < 0) return;  // 客户端未连接

    radar_frame_t frame = {
        .target_count      = result->target_count,
        .is_human_presence = result->is_human_presence,
    };
    memcpy(frame.targets, result->targets,
           result->target_count * sizeof(radar_target_info_t));

    send(g_client_sock, &frame, sizeof(frame), 0);
}

对端断开处理

if (send_ret <= 0) {
    // 客户端断开
    close(g_client_sock);
    g_client_sock = -1;
    // 继续 accept 等待新客户端
    g_client_sock = accept(g_tcp_sock, NULL, NULL);
}