Wi-Fi - Wi-Fi Manager
Wi-Fi 简介
FreeRTOS 上的网络,驱动部分源码没有开源,用户实际使用时也无需关系具体实现,更多的是做网络管理的逻辑接口开发,所以我们提供了网络中间件 Wi-Fi Manager
,Wi-Fi Manager
支持sta
, ap
, monitor
等多种网络工作模式的管理,本文档重点介绍 Wi-Fi Manager
中间件的使用,配置,框架,接口。
Wi‑Fi 工作的几种模式
目前R128 平台上的Wi‑Fi 一般可处于3 种工作模式,分别是STATION,AP,MONITOR。
- STATION:连接无线网络的终端,大部分无线网卡默认都处于该模式,也是常用的一种模式。
- AP:无线接入点,常称热点,比如路由器功能。
- MONITOR:也称为混 杂设备监听模式,所有数据包无过滤传输到主机。
代码路径
FreeRTOS 中wlan 相关代码主要分布在四个地方:
1)驱动部分:lichee/rtos/drivers/drv/wireless/xradio
2)协议栈部分:lichee/rtos‑components/thirdparty/network/lwip‑2.1.2
3)应用协议部分:lichee/rtos‑components/aw/network/service
4)中间件部分:lichee/rtos‑components/aw/wireless/Wi-Fi Manager
配置介绍
FreeRTOS 中 wlan 相关配置分为 c906 和 m33:
C906 配置
- Wi-Fi Manager demo 配置
> System components > aw components > wireless
[*] wireless common
[*] Wi-Fi Manager‑v2.0 ‑‑‑>
Wi-Fi Manager‑v2.0 Configuration ‑‑‑>
[ ] CONFIG_WMG_PROTOCOL_SOFTAP
[ ] CONFIG_WMG_PROTOCOL_BLE
[ ] CONFIG_WMG_PROTOCOL_XCONFIG
[ ] CONFIG_WMG_PROTOCOL_SOUNDWAVE
Wi-Fi Manager support platform (FREERTOS PLATFORM OS) ‑‑‑>
(X) FREERTOS PLATFORM OS
[*] Wi-Fi Manager unregister callback function
[*] Wi-Fi Manager support send expand cmd
Wi-Fi Manager support mode Configuration ‑‑‑>
[*] Wi-Fi Manager support sta mode enable
[*] Wi-Fi Manager support ap mode enable
[ ] Wi-Fi Manager support monitor mode enable
[ ] Wi-Fi Manager support p2p mode enable
Wi-Fi Manager set default debug level (default debug level: to info) ‑‑‑>
(X) default debug level: to info
- driver 配置
> Drivers Options > other drivers
[*] rfkill drivers
> Drivers Options > other drivers > wireless devices
[*] XRADIO driver ‑‑‑>
[*] Enable xradio test cmd
Xradio chip (Enable r128 driver) ‑‑‑>
[*] Wi‑Fi Certification of WFA
[*] wlan station mode
[ ] wlan station mode with wps support
[*] wlan monitor mode
[*] wlan ap mode
select the source of frequency offset (SDD file) ‑‑‑>
[ ] wlan ETF test
- 应用协议配置
> System components > aw components > aw network
[*] tcp ip adapter
[ ] loop interface test demo
[ ] wifi test demo
[ ] wifi fast connect test demo
[ ] get mac_addr test demo
[ ] set/get country code optional
service ‑‑‑>
[ ] udhcpd demo
[ ] sntp demo
[*] iperf demo
[*] ping demo
[ ] nopoll demo
[ ] mqtt demo
[ ] shttpd demo
[ ] mbedtls demo
[ ] httpc demo
[ ] mini_wget
[ ] telnet
- AMP 网络配置
> System components > aw components > AMP Components Support
[*] AMP Network Stub Functions
[*] AMP Network Service
- 协议配置
> System components > thirdparty components > network
‑*‑ lwip ‑‑‑>
lwip version (lwip‑2.1.2) ‑‑‑>
‑*‑ udhcpd (DHCP Server)
[*] ping
‑*‑ mbedtls ‑‑‑>
mbedtls version (mbedtls‑2.16.0) ‑‑‑>
[ ] httpclient
[ ] websocket
[ ] nghttp2
[ ] sntp
[ ] nopoll
[ ] shttpd
[ ] mqtt
M33 配置
- driver 配置
> Drivers Options > other drivers
[*] rfkill drivers
> Drivers Options > other drivers > wireless devices
[*] XRADIO driver ‑‑‑>
[*] Enable xradio test cmd
Xradio chip (Enable r128 driver) ‑‑‑>
[*] Wi‑Fi Certification of WFA
[*] wlan station mode
[ ] wlan station mode with wps support
[*] wlan monitor mode
[*] wlan ap mode
select the source of frequency offset (SDD file) ‑‑‑>
[ ] wlan ETF test
- AMP 网络配置
> System components > aw components > AMP Components Support
[*] AMP Network Stub Functions
[*] AMP Network Service
- 协议配置
> System components > thirdparty components > network
[ ] lwip ‑‑‑‑
[ ] udhcpd (DHCP Server)
[ ] ping
‑*‑ mbedtls ‑‑‑>
mbedtls version (mbedtls‑2.16.0) ‑‑‑>
[ ] httpclient
[ ] nghttp2
[ ] sntp
[ ] nopoll
[ ] shttpd
[ ] mqtt
Wi-Fi Manager 简介
Wi-Fi Manager 用于wifi 的连接管理,通信以及wifi 的一些额外功能。支持sta、ap、monitor、p2p 模式,并且集成了配网模式以及其他功能。屏蔽了底层系统的具体实现,能对接各种差异化系统平台例如 linux,rtos,xrlink(linux 系统mcu 模组)。用户如果需要进行独自的2 次开发(把对应的wifi 功能集成到各自的应用里),请重点查阅 Wi-Fi Manager 框架,Wi-Fi Manager 代码目录结构,核心层代码章节。用户如果不需要独自的2 次开发,可以直接使用 Wi-Fi Manager 提供的命令行demo,仅需查看Wi-Fi Manager demo 介绍章节。
Wi-Fi Manager 框架
Wi-Fi Manager: 兼容linux,xrlink,freertos 等系统。支持sta,ap,monitor 和p2p 等模式,集成了softap,ble,xconfig,soundwave 等配网功能。提供了完善的api 接口方便用户调用,同时提供了一个基本完整功能的demo,方便用户直接使用和测试。上图是Wi-Fi Manager 的软件结构,整体分为3 部分:应用层,lib 层(接口抽象层,模式抽象层,os 抽象层),os 具体实现层。
- 应用层:主要提供一个基本完整功能的demo,方便用户直接使用,用户也可以不使用该 demo,直接调用lib 库提供的api 接口。把具体功能集成到自己 的应用。
- lib 层:包含了接口层,模式抽象层,os 抽象层,对上提供统一的api 接口(wifimg.h),处理各种模式的逻辑以及共存功能,对下屏蔽os 的具体模式功能。
- 具体 os 实现层:该层主要是不同系统对 wifi 功能的具体功能。
Wi-Fi Manager 代码目录结构
wifimager 开发包在FreeRTOS SDK 里的路径如下:
rtos/lichee/rtos‑components/aw/wireless/Wi-Fi Manager
Wi-Fi Manager 的主要目录结构如下:
├── app // 用于保存配网时使用的一些配网工具。
├── core // 核心代码
│ ├── include // 存放核心代码相关头文件
│ │ └── wifimg.h // 对上提供的api接口头文件
│ └── src // 核心代码具体实现
│ ├── linkd.c // 配网抽象层代码
│ ├── wifimg.c // 对上提供的api接口实现代码
│ ├── wmg_common.c // 模式切换共存逻辑处理层实现代码
│ ├── wmg_sta.c // sta模式抽象层代码
│ ├── wmg_ap.c // ap模式抽象层代码
│ ├── wmg_monitor.c // monitor模式抽象层代码
│ ├── wmg_p2p.c // p2p模式抽象层代码
│ ├── expand_cmd.c // 扩展命令(与模组或系统特殊功能有关,例如获取或设置mac地址,设置特殊模组的ioct等)
│ └── os // 具体os(linux,xrlink,freertos)模式功能实现代码
├── demo // 比较完整功能的demo实例
│ ├── wifi.c
│ └── wifi_daemon.c
├── files // 相关的配置文件
- app 目录:存放用于配网测试的apk 安装包。
- core 目录:存放Wi-Fi Manager 核心代码的目录,会编译出libwifimg‑v2.0 库
- demo 目录:存放一个使用libwifimg‑v2.0 接口的demo,用户可以直接使用该demo,也可以 参考该demo 对libwifimg‑v2.0 库api 的使用方式,把功能集成到自己的应用中去。
- files:存放相关的配置文件
Wi-Fi Manager 核心代码
Wi-Fi Manager 核心代码目录结构
.
├── include
│ ├── linkd.h
│ ├── os
│ ├── wifi_log.h
│ ├── wifimg.h
│ ├── wmg_ap.h
│ ├── wmg_common.h
│ ├── wmg_monitor.h
│ ├── wmg_p2p.h
│ ├── expand_cmd.h
│ └── wmg_sta.h
└── src
├── linkd.c
├── log
├── os
│ ├── linux // (在非linux系统该目录不存在)
│ ├── xrlink // (在非xrlink系统该目录不存在)
│ └── freertos // (在非freertos系统该目录不存在)
├── wifimg.c
├── wmg_ap.c
├── wmg_common.c
├── wmg_monitor.c
├── wmg_p2p.c
├── expand_cmd.c
└── wmg_sta.c
- include: 保存核心代码相关头文件目录
- src : 保存核心代码源码文件目录
- src/log:打印相关代码
- src/wifimg.c : 用户接口对接口层文件(提供用户对接层API 接口文件,对接api 请查看 wifimg.h)
- src/wmg_common.c:wifi 模式抽象层(各种模式的抽象层,处理切换和共存逻辑)
- src/wmg_sta.c:station 模式抽象层
- src/wmg_ap.c:ap 模式抽象层
- src/wmg_monitor.c: monitor 模式抽象层。
- src/expand_cmd.c:特殊额外功能抽象层。
- src/os : 对应的系统模式实现层代码。
- src/os/linux:linux 平台wifi 模式功能具体实现代码存放目录(在非linux 系统该目录不存在)
- src/os/xrlink:xrlink 平台wifi 模式功能具体实现代码存放目录(在非xrlink 系统该目录不存在)
- src/os/freertos:freertos 平台wifi 模式功能具体实现代码存放目录(在非freertos 系统该目录不存在)
核心代码里各文件调用关系图如下:
- 用户会调用wifimg.c 提供的接口函数
- wifimg.c 的接口函数会调用到模式抽象层wmg_common.c 里的函数
- wmg_common.c 里的函数会根据不同的模式调用到wmg_sta.c(sta 模式抽象层),wmg_ap.c(ap 模式抽象层)wmg_monitor.c(monitor 模式抽象层)wmg_p2p.c(p2p 模式抽象层) 里的函数
- wmg_sta.c(sta 模式抽象层) 会根据不同的平台调用到linux_sta.c(linux 平台具体实现文件),xrlink_sta.c(xrlink 平台具体实现文件),freertos_sta.c(rtos 平台具体实现文件)。
- wmg_ap.c(ap 模式抽象层) 会根据不同的平台调用到freertos_ap.c(linux 平台具体实现文件),xrlink_ap.c(xrlink 平台具体实现文件),freertos_ap.c(rtos 平台具体实现文件)。
- wmg_monitor.c(monitor 模式抽象层) 会根据不同的平台调用到linux_monitor.c(linux 平台具体实现文件),xrlink_monitor.c(xrlink 平台具体实现文件),freertos_monitor.c(rtos 平台具体实现文件)。
- wmg_p2p.c(p2p 模式抽象层) 会根据不同的平台调用到linux_p2p.c(linux 平台具体实现文件)。
- 自定义扩展(expand_cmd.c) 与系统或模组特殊功能有关,例如设置或获取mac 地址,特殊ioct等功能。
Wi-Fi Manager 核心代码关键结构体说明
该章节主要用于描述核心代码中使用到的一些关键的结构体。不需要单独阅读该章节,该章节属于查询性质,当在其他章节中查看到需要查询的结构体时再查询该章节即可。该章节的关键结构体都在 Wi-Fi Manager/core/include/wifimg.h
文件里定义。
定义Wi-Fi Manager 的错误码
结构体描述:该结构体主要用于定义Wi-Fi Manager 各函数执行后的返回码
typedef enum {
WMG_STATUS_SUCCESS = 0,
WMG_STATUS_FAIL = ‑1,
WMG_STATUS_NOT_READY = ‑2,
WMG_STATUS_NOMEM = ‑3,
WMG_STATUS_BUSY = ‑4,
WMG_STATUS_UNSUPPORTED = ‑5,
WMG_STATUS_INVALID = ‑6,
WMG_STATUS_TIMEOUT = ‑7,
WMG_STATUS_UNHANDLED = ‑8,
} wmg_status_t;
- WMG_STATUS_SUCCESS:函数执行成功
- WMG_STATUS_FAIL:函数执行失败
- WMG_STATUS_NOT_READY:函数没有准备好
- WMG_STATUS_NOMEM:函数无法申请到需要的内存
- WMG_STATUS_BUSY:函数处于忙状态
- WMG_STATUS_UNSUPPORTED:函数不支持该功能
- WMG_STATUS_INVALID:函数收到无效数据
- WMG_STATUS_TIMEOUT:函数执行超时
- WMG_STATUS_UNHANDLED:函数不处理该次调用
定义Wi-Fi Manager 支持的模式
结构体描述:该结构体主要用于定义Wi-Fi Manager 的模式
typedef enum {
WIFI_MODE_UNKNOWN = 0b0,
WIFI_STATION = 0b1,
WIFI_AP = 0b10,
WIFI_MONITOR = 0b100,
WIFI_P2P = 0b1000,
} wifi_mode_t;
- WIFI_STATION:station 模式
- WIFI_AP:ap 模式
- WIFI_MONITOR:monitor 模式
- WIFI_P2P:p2p 模式
- WIFI_MODE_UNKNOWN:未定义模式
定义Wi-Fi Manager 网络接口状态
结构体描述:该结构体主要用于定义Wi-Fi Manager 对网卡设备状态的识别
typedef enum {
WLAN_STATUS_DOWN,
WLAN_STATUS_UP,
} wifi_dev_status_t;
- WLAN_STATUS_DOWN:网卡设备关闭
- WLAN_STATUS_UP:网卡设备启动
定义Wi-Fi Manager 收到的消息类型
结构体描述:该结构体主要用于定义Wi-Fi Manager 收到的回调消息的类型
typedef enum {
WIFI_MSG_ID_DEV_STATUS,
WIFI_MSG_ID_STA_CN_EVENT,
WIFI_MSG_ID_STA_STATE_CHANGE,
WIFI_MSG_ID_AP_CN_EVENT,
WIFI_MSG_ID_P2P_CN_EVENT,
WIFI_MSG_ID_P2P_STATE_CHANGE,
WIFI_MSG_ID_MONITOR,
WIFI_MSG_ID_MAX,
} wifi_msg_id_t;
- WIFI_MSG_ID_DEV_STATUS:设备状态发生了改变的消息
- WIFI_MSG_ID_STA_CN_EVENT:sta 模式在连接过程中事件发生改变的消息
- WIFI_MSG_ID_STA_STATE_CHANGE:sta 模式状态发生改变的消息
- WIFI_MSG_ID_AP_CN_EVENT:ap 模式在连接过程中事件发生改变的消息
- WIFI_MSG_ID_P2P_CN_EVENT:p2p 模式在连接过程中事件发生改变的消息
- WIFI_MSG_ID_P2P_STATE_CHANGE:p2p 模式状态发生改变的消息
- WIFI_MSG_ID_MONITOR:monitor 模式的消息
- WIFI_MSG_ID_MAX:无意义消息类型,界限结构体用