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、调制解调器 |
网络协议栈封包过程

1.2 BES2800 WIFI 协议栈架构

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
浙公网安备 33010602011771号