BES2800 WIFI 开发

目录


一、框架

1.1 标准网络框架

网络协议栈架构介绍

层次 主要协议 / 技术 核心功能 典型用例
应用层 HTTP、HTTPS、FTP、SSH、RTP、私有协议等 面向具体应用,定义数据格式和交互规则 浏览器、文件传输等
传输层 TCP、UDP 端到端通信、端口寻址、可靠传输(TCP)或无连接传输(UDP)、流量控制、拥塞控制 操作系统内核协议栈
网络层 IP(IPv4/IPv6)、ICMP、ICMPv6、ARP 逻辑寻址、路由选择、分组转发 路由器、交换机
网络接口层 以太网、Wi-Fi(802.11) 物理传输、帧封装、MAC 寻址、介质访问控制 网卡、AP、交换机、Hub、调制解调器

网络协议栈封包过程

image


1.2 BES2800 WIFI 协议栈架构

image-4


1.3 WAPI

介绍:WAPI 是 C 语言编写的 Linux 无线网卡配置开源库,主要用作无线接口的参数读取、修改、路由配置等底层网络操作。

开源地址:https://github.com/vy/wapi

核心功能:

  • 扫描 AP、设置 SSID / 密码、切换 STA/AP 模式
  • 设置发射功率、信道、网卡 MAC、IP
┌─────────────────────────────────────────────────────────┐
│  应用层: wapi_demo / netinit_associate.c / wifi_recorder │
├─────────────────────────────────────────────────────────┤
│  WAPI 公共 API 头文件: apps/include/wireless/wapi.h      │
├─────────────────────────────────────────────────────────┤
│  WAPI 库 (用户态)  rtos/apps/wireless/wapi/src/          │
│  ├─ wireless.c   无线参数 ioctl 封装 (频率/ESSID/扫描…)  │
│  ├─ driver_wext.c WPA 密钥/认证/关联 (wpa_supplicant 移植)│
│  ├─ network.c    IP/掩码/路由 ioctl 封装                 │
│  ├─ util.c       socket 工具 + cJSON 配置持久化          │
│  └─ wapi.c       NSH 命令行工具 (main 入口, 可选编译)    │
├─────────────────────────────────────────────────────────┤



二、子模块介绍

2.1 LC3 PLUS

核心源码目录:BES\apps\hl_wifi_lc3_test

开源地址:https://github.com/google/liblc3/tree/main

LC3 是蓝牙 LE Audio 强制标准;LC3plus 是 LC3 增强版,向下兼容 LC3,主打超低延迟、高保真、强丢包鲁棒性,可用于 BLE Audio、DECT。

LC3 vs LC3plus 对比:

参数 LC3(BLE Audio 标准) LC3plus(增强扩展)
标准 Bluetooth SIG LE Audio ETSI TS 103 634
帧长 7.5ms、10ms 2.5ms、5ms、7.5ms、10ms
最高采样率 48kHz 96kHz(HR 高清模式)
适用场景 普通 TWS 音乐、通话 游戏耳机、无线麦克风、专业监听、高清音乐

2.2 Socket

核心源码目录:BES\rtos\nuttx\net\socket

NuttX socket 抽象层:向上为应用提供标准 BSD socket 接口,向下通过 sockif 接口表分发到 TCP/UDP 等具体协议实现。核心能力包括套接字生命周期管理(socket / bind / connect / listen / accept / close)、数据收发(send / recv / sendto / recvfrom / sendmsg / recvmsg)、多路复用与文件操作(poll / sendfile / fstat / dup2)以及通用套接字选项管理(getsockopt / setsockopt)。

常用接口(应用可直接调用的 BSD API):

socket() / close()                      /* 创建 / 关闭套接字 */
bind() / listen() / accept()            /* 服务端:绑定地址、监听、接受连接 */
connect() / shutdown()                  /* 客户端:连接对端 / 关闭读写 */
send() / sendto() / sendmsg()           /* 发送数据(TCP / UDP / 消息式) */
recv() / recvfrom() / recvmsg()         /* 接收数据(TCP / UDP / 消息式) */
setsockopt() / getsockopt()             /* 读写套接字选项 */
poll()                                  /* 多路复用等待 I/O 事件 */

2.3 TCP

核心源码目录:BES\rtos\nuttx\net\tcp

TCP 协议完整实现。核心能力包括连接管理(三次握手/挥手、连接结构与端口分配、backlog 队列)、可靠传输(输入状态机与序号校验、接收窗口、重传/延迟 ACK/保活定时器)、数据收发(缓冲与非缓冲发送、接收按序重组)、拥塞控制(cwnd/ssthresh 维护),以及 select/poll 轮询支撑与连接事件通知/监控。

常用接口(内核内部,由 socket 层经 sockif 分发调用):

psock_tcp_connect()                     /* 发起连接(三次握手) */
tcp_listen()                            /* 监听端口(管理 backlog 队列) */
psock_tcp_accept()                      /* 接受连接 */
psock_tcp_send()                        /* 缓冲发送 */
psock_tcp_recvfrom()                    /* 接收数据(按序重组后交付) */
tcp_close() / tcp_shutdown()            /* 关闭连接(四次挥手)/ 半关闭 */
tcp_input()                             /* 入站报文段状态机处理 */
tcp_timer()                             /* 重传 / 延迟 ACK / 保活定时器 */
tcp_callback()                          /* 连接事件回调通知 */

2.4 IP

核心源码目录:BES\rtos\nuttx\net\inet

IPv4/IPv6 公共套接字层(inet 域)。核心能力包括 IP 首部构建、本端/对端地址获取(getsockname / getpeername)、IPv4/IPv6 层套接字选项处理,以及 INET 域公共套接字操作与发送排空。

常用接口(内核内部):

ipv4_build_header() / ipv6_build_header()   /* 构建 IP 首部 */
ipv4_getsockname() / ipv6_getsockname()     /* 获取本端地址(getsockname 底层) */
ipv4_getpeername() / ipv6_getpeername()     /* 获取对端地址(getpeername 底层) */
ipv4_setsockopt() / ipv6_setsockopt()       /* IP 层套接字选项设置 */
ipv4_getsockopt() / ipv6_getsockopt()       /* IP 层套接字选项读取 */
inet_txdrain()                              /* 发送排空(等待发送缓冲清空) */

注:IP 报文收发、分片重组、转发与路由等实现位于 net 目录下的 devif、ipfrag、ipforward、route 等子目录。

2.5 ARP

核心源码目录:BES\rtos\nuttx\net\arp

ARP 地址解析协议实现:将 IP 地址解析为链路层 MAC 地址并维护 ARP 缓存。核心能力包括缓存表管理(arp_find 查询 / arp_update 更新 / arp_delete 删除、表项超时老化)、出站地址解析(arp_out 在发包时查表,命中则填充以太帧头,未命中则先发送 ARP 请求并挂起待发帧)、请求与应答收发(arp_send 带重试的请求发送,arp_input 接收应答更新缓存并唤醒等待中的发送者;arp_ipin 可选从入站 IP 报文学习地址),并支持地址冲突检测(ACD)。WiFi 链路与以太网共用同一套 ARP 流程。

常用接口(内核内部):

arp_find()                              /* 查询 ARP 表:IP → MAC */
arp_update()                            /* 新增 / 更新 ARP 表项 */
arp_delete()                            /* 删除 ARP 表项 */
arp_send()                              /* 发送 ARP 请求(带重试) */
arp_out()                               /* 出站发包:查表填以太帧头,未命中触发请求 */
arp_input()                             /* 入站 ARP 报文处理(应答更新缓存并唤醒等待者) */
arp_ipin()                              /* 从入站 IP 报文学习 ARP 表项(可选) */

2.6 NetDev

核心源码目录:BES\rtos\nuttx\drivers\net

NuttX 通用网络设备驱动目录(按 Kconfig 选择编入)。核心内容包括 netdev 上半部框架(管理 lowerhalf 网卡的注册、RX/TX 队列与收发任务)、基础与虚拟驱动(回环网卡、驱动开发模板、PHY 链路状态通知、RPMsg、TUN/TAP、SLIP、WiFi 模拟等)以及一批常用以太网芯片驱动(DM90x0、E1000、ENC28J60、W5500 等)。

常用接口(上半部框架,内核/驱动适配层使用):

netdev_register() / netdev_unregister()         /* 注册 / 注销网络设备 */
netdev_ifup() / netdev_ifdown()                 /* 启停网络接口 */
netdev_carrier_on() / netdev_carrier_off()      /* 载波(链路)状态通知 */
netdev_lower_register()                         /* lowerhalf 驱动注册(rwnx 使用) */
netdev_lower_carrier_on() / netdev_lower_carrier_off()  /* 驱动侧链路状态通知 */
netdev_lower_rxready()                          /* RX 就绪:触发协议栈收包任务 */
netdev_lower_txdone()                           /* 发送完成通知 */

2.7 WLAN Dev(网卡)

核心接口目录:BES\framework\services\net\wifi_stack\v2\drv\rwnx_drv\fullmac

BES2800 WiFi 驱动(RWNX fullmac):驱动本体以预编译库形式提供(framework/services/lib 下对应平台的 libwifidrv.a、libwifistack.a 等),对外仅开放两个接口头文件——rwnx_drv.h 为驱动主入口(初始化/反初始化/复位);rwnx_control.h 为控制类接口(MAC/IP 地址配置、站点链路信息、省电模式等)。

2.8 WAPI

核心源码目录:BES\rtos\apps\wireless\wapi\src

wapi.h 常用 API 介绍

a. 链路建立(连接管理)—— 最核心的用途

wapi_scan_init() / wapi_escan_init() / wapi_scan_coll()   /* 扫描周围 AP */
wapi_set_mode()                                            /* 选 STA/AP/Monitor 模式 */
wapi_set_essid() / wapi_set_ap()                           /* 指定要连的网络 */
wpa_driver_wext_set_key_ext()                              /* 下发密码/密钥 */
wpa_driver_wext_associate()                                /* 一次性完成关联 */
wpa_driver_wext_disconnect()                               /* 断开 */
wapi_set_pmksa()                                           /* 缓存密钥加速重连 */

b. 无线电参数调节

wapi_set_freq() / wapi_freq2chan()      /* 信道/频率 */
wapi_set_bitrate() / wapi_set_txpower() /* 速率/发射功率 */
wapi_set_country()                      /* 国家码(决定可用信道与功率上限)*/
wapi_set_pta_prio()                     /* 蓝牙/WiFi 共存优先级 */
wapi_set_power_save()                   /* 省电开关 */

c. IP 层配置(等价 ifconfig + route)

wapi_set_ifup() / wapi_set_ifdown()       /* 启停网络接口(等价 ifconfig up/down) */
wapi_set_ip() / wapi_set_netmask()        /* 配置本机 IP 地址与子网掩码 */
wapi_add_route_gw() / wapi_del_route_gw() /* 增加/删除默认网关路由 */

d. 状态查询

wapi_get_essid()                        /* 获取当前关联 AP 的 SSID(WiFi 名称) */
wapi_get_ap()                           /* 获取当前关联 AP 完整信息(BSSID/信号等) */
wapi_get_sensitivity()                  /* RSSI 信号强度 */
wapi_get_country() / wapi_get_mode()    /* 当前国家码 / 工作模式(STA/AP/Monitor) */



三、WIFI 基本概念介绍

STA(Station,站点):WiFi 客户端工作模式,主动连接已有热点(路由器、手机 / PC 热点等)接入网络。对应第四章 STA 模式(wapi mode wlan0 2,MANAGED)。

AP(Access Point,接入点 / 热点):WiFi 热点工作模式,自身发出热点,供手机、PC 等设备接入。对应第四章 AP 模式(wapi mode wlan1 3,MASTER)。

Port(端口):TCP/UDP 传输层用于区分应用的 16 位编号(0~65535),与 IP 地址共同标识一个通信端点(套接字地址)。如 FTP 用 21、Web 用 80、DEMO wifi_recorder 推流用 1991。

WLAN(Wireless LAN,无线局域网):基于 IEEE 802.11 标准系列的无线局域网。NuttX 中 WiFi 网络接口命名为 wlan0、wlan1、wlan2,对应三个不同功能的接口。

/* bes_netdev_ax_driver.c */
#define NETDEV_NAME   "wlan0"   /* STA 接口 */
#define AP_DEV_NAME   "wlan1"   /* AP 接口 */
#define P2P_DEV_NAME  "wlan2"   /* P2P 接口 */



四、BES2800 WIFI 使用介绍

4.1 WIFI demo

以下命令均在设备端 NSH(NuttX Shell)执行,按用途分为三类:WiFi 组网、传输、网络服务。

命令注册位置

NuttX 的 NSH 命令有两种注册方式:

  • NSH 内置命令:直接登记在 nshlib 命令表 g_cmdmap(rtos/apps/nshlib/nsh_command.c)中,命令功能实现在 nsh_netcmds.c
  • builtin 应用:由各 app 的 Makefile 以 PROGNAME 声明命令名,编译时注册进内置应用表(rtos/apps/builtin/builtin_list.c 的 g_builtins[]);需开启 CONFIG_NSH_BUILTIN_APPS,NSH 通过 nsh_builtin() → exec_builtin() 查找并创建任务执行
命令 注册位置 注册方式
ifup / ifconfig rtos/apps/nshlib/nsh_command.c(命令表 g_cmdmap,实现于 nsh_netcmds.c) NSH 内置命令
wapi rtos/apps/wireless/wapi/Makefile:PROGNAME = $(CONFIG_WIRELESS_WAPI_PROGNAME)(默认 wapi) builtin 应用
dhcpd / dhcpd_start / dhcpd_stop rtos/apps/examples/dhcpd/Makefile:PROGNAME = dhcpd_start dhcpd_stop dhcpd builtin 应用
renew rtos/apps/system/dhcpc/Makefile:PROGNAME = $(CONFIG_DHCPC_RENEW_PROGNAME)(默认 renew) builtin 应用
ftpd_start / ftpd_stop rtos/apps/examples/ftpd/Makefile:PROGNAME = ftpd_start ftpd_stop builtin 应用
webserver rtos/apps/examples/webserver/Makefile:PROGNAME = webserver builtin 应用
wifi_recorder apps/wifi_recorder/Makefile:PROGNAME = wifi_recorder builtin 应用

4.2 WiFi 组网

AP 模式 —— 模块作为热点,供 PC、手机等设备接入:

ifup wlan1                   # 启用 wlan1 接口
wapi mode wlan1 3            # 工作模式:MASTER(AP)
wapi psk wlan1 12345678 3    # 设置 WiFi 密码(WPA3)
wapi essid wlan1 test_wifi 1 # 设置热点名称(SSID):test_wifi
dhcpd wlan1 &                # 启动 DHCP 服务器,为接入设备分配 IP(后台运行)

STA 模式 —— 模块作为客户端连接热点:

连接命令行侧热点(test_wifi):

ifup wlan0                   # 启用 wlan0 接口
wapi mode wlan0 2            # 工作模式:MANAGED(STA)
wapi psk wlan0 12345678 3    # 设置 WiFi 密码(WPA3)
wapi essid wlan0 test_wifi 1 # 指定要连接的热点:test_wifi
renew wlan0                  # 通过 DHCP 获取 IP 地址
ifconfig                     # 查看接口 IP,确认连接成功

连接 PC 热点(SWGroupTwo):

ifup wlan0
wapi mode wlan0 2
wapi psk wlan0 12345678 3
wapi essid wlan0 SWGroupTwo 1 # 不同点:SSID 为 PC 侧热点
renew wlan0
ifconfig

注:wapi 命令末尾的数字为枚举索引——mode:2 = MANAGED(STA)、3 = MASTER(AP);psk:3 = WPA3;essid:1 = ON(立即生效)。

实现与调用流程

  • ifup / ifconfig:NSH 内置命令(rtos/apps/nshlib/nsh_netcmds.c)
  • wapi:WAPI 库附带的 NSH 工具(rtos/apps/wireless/wapi/src/wapi.c)
  • dhcpd / renew:DHCP 服务器 / 客户端(rtos/apps/netutils/dhcpd、rtos/apps/system/dhcpc)

4.3 网络服务

在完成 4.2 组网后执行:

ftpd_start -4   # 启动 FTP 服务器(-4:使用 IPv4;ftpd_stop 停止)
webserver &     # 后台启动 Web 服务器

实现与调用流程

  • ftpd_start:rtos/apps/examples/ftpd(基于 rtos/apps/netutils/ftpd 库)
  • webserver:rtos/apps/examples/webserver(基于 rtos/apps/netutils/webserver 库)

4.4 录音与传输

wifi_recorder —— 无线录音推流:将录音数据通过 TCP 实时发送到 PC(需 PC 端配合接收)。

wifi_recorder 192.168.137.1 1991 &  # 推流至 192.168.137.1:1991(后台运行)

参数:wifi_recorder <PC 端 IP> <端口> [流数]。

实现与调用流程

  • wifi_recorder:apps/wifi_recorder/Main.c,录音数据源为 VPM 语音预处理模块的回调
启动:main() → pthread_create(bufsend_workerthread)(流数=1)→ socket() + connect(192.168.137.1:1991)
数据:MIC 采集 → VPM 处理 → 回调 wifi_recorder_process_hook() → captureq 队列 → 发送线程 send() → TCP → PC
posted @ 2026-09-30 20:01  自由的Charles  阅读(9)  评论(0)    收藏  举报