本文介绍的所有Wi-Fi特性,MAC层特性等等都是针对HaaS EDU K1上Wi-Fi的说明。
1、Wi-Fi功能模块
HaaS1000芯片中有4个主力运算核,和一些辅助的小核。主力运算核包括两个A7和两个M33,其中BT和Wi-Fi就分别运行在独立的小核上。如下图所示,Wi-Fi功能模块在整个芯片上和其他硬件资源的关系:
2、Wi-Fi支持特性
- Wi-Fi® IEEE 802.11 a/b/g/n
- 支持 2.4GHz Wi-Fi
- 支持 20MHz, 40MHz 带宽模式
- 支持Wi-Fi 和Bluetooth 共存
2.1、Wi-Fi 链路层(MAC)
Wi-Fi 链路层支持以下特性:
- 能够同时支持station,softAP和P2P模式
- 支持A-MPDU和A-MSDU的发送和接收
- 支持WMM省电模式
- 支持自适应的发送速率
- 支持 WPA2 PSK,WPA2 Enterprise security
- 支持WEP和TKIP
- 支持AES-CCM硬件加速
- 支持 SMS4-WPI (WAPI) 硬件加速
2.2、Wi-Fi 基带
Wi-Fi 基带支持以下特性:
- 支持 IEEE 802.11a, 11b, 11g, 11n
- 支持20Mhz和40Mhz信道
- 支持 MCS 0-7 (BPSK, r=1/2 - 64 QAM, r=5/6),数据传输速率能够到达 150Mbps
- 支持shortguardinterval,greenfield和STBC
- 支持数字预失真技术
2.3、Wi-Fi RF
Wi-Fi RF 支持以下功能:
- 集成2.4GHz和5GHz的PA,LNA和射频开关
- 支持2400-2497MHz/4900-5950MHz
3、Wi-Fi Band Radio标准
3.1、Wi-Fi 2.4GHz Band Radio标准
2.4GHz RF 接收特性
2.4G射频发射器属性
3.2、Wi-Fi 5GHz Band Radio标准
5GHz 射频接收器属性
5GHz 射频发射器属性
4、射频接口
5、软件开发
5.1、网络管理模块基本介绍
Wi-Fi具体的操作通过Netmgr进行统一封装,对应用层提供接口,方便的对Wi-Fi网络进行管理。如下是Netgmr在主要架构。
netmgr主要对上APP提供API,对下的Wi-Fi对接提供HAL抽象层。netmgr内部由多个子模块组成,各个子模块主要是负责wifi初始化,wifi动态管理,DHCP获取ip地址,SNTP获取网络时间等。
5.2、函数介绍
初始化Wi-Fi
该函数主要用于初始化Wi-Fi模块。
int netmgr_init(void);
启动网络管理模块
定义:
int netmgr_start(bool autoconfig);
参数说明:
autoconfig: true 自动连接网络; false 不自动连接网络
连接Wi-Fi
注意修改其中的ssid和passwd参数。
定义:
int32_t netmgr_connect(const char *ssid, const uint8_t *password, uint32_t timeout);
参数说明:
ssid:连接Wi-Fi的名字
password:连接Wi-Fi的密码,如果为空则指定为NULL
timeout:连接超时时间,单位ms
用例:
netmgr_connect(“ssid”, “passwd”, 10 * 1000);
5.3、示例介绍
Wi-Fi的示例将基于helloworld_demo的历程进行学习。
主要分成四个步骤:
- 修改代码
- 编译代码
- 烧录镜像
- 查看日志
5.3.1、修改代码
修改网络连接代码
将如下代码替换文件application/example/helloworld_demo/appdemo.c中。
注意,同时需要添加netmgr.h和aos/yloop.h两个头文件。
注意修改代码中这一行:
netmgr_connect("test_wifi", "wifi_passwd", 10 * 1000);
修改其中的test_wifi为需要连接wifi的名字,
修改其中的wifi_passwd为需要连接wifi的密码。
-
#include <stdio.h>
-
-
#include <stdlib.h>
-
-
#include <aos/kernel.h>
-
-
#include "aos/init.h"
-
-
#include "board.h"
-
-
#include <k_api.h>
-
-
#include "netmgr.h"
-
-
#include "aos/yloop.h"
-
-
-
-
void start_netmgr(void) {
-
-
netmgr_init();
-
-
netmgr_start(
false);
-
-
netmgr_connect(
"test_wifi",
"wifi_passwd",
10 *
1000);
-
-
}
-
-
-
-
int application_start(int argc, char *argv[])
-
-
{
-
-
int count =
0;
-
-
printf(
"nano entry here!\r\n");
-
-
-
start_netmgr();
-
-
-
while(
1) {
-
-
printf(
"hello world! count %d \r\n", count++);
-
-
aos_msleep(
1000);
-
-
};
-
-
}
修改编译相关代码
模块编译包含方法是在application/example/helloworld_demo/Config.in里增加:"select AOS_COMP_NETMGR if !AOS_CREATE_PROJECT”
比如如下demo中需要netmgr组件,就添加该行:
-
config AOS_APP_HELLOWORLD_DEMO
-
-
bool
"Helloworld Demo"
-
-
select AOS_COMP_NETMGR
if !AOS_CREATE_PROJECT
这里使用select之后,当编译实验project的时候就会自动编译netmgr组件,如下图所示,在执行aos make的时候能够看到netmgr。具体编译方式Config.in其他修改可以参考编译环境章节。
5.3.2、编译代码
在命令行执行如下三条命令
-
aos
make distclean
-
-
aos
make helloworld_demo@haaseduk1 -c config
-
-
aos
make
参考编译日志:
aos make distclean
aos make helloworld_demo@haaseduk1 -c config
aos make
编译结束的标志是,看到“Build complete: helloworld_demo@haaseduk1”,如下所示:
5.3.3、烧录镜像
插上设备,然后执行如下命令
aos upload
烧录开始日志:
烧录过程日志:
烧录成功后的标志:
5.3.4、查看日志
使用串口软件打开串口,查看连接情况,执行如下命令,查看wifi连接情况:
netmgr -t wifi -p
如果有:NETWORK_CONNECTED ,说明连接成功。
6、命令行使用网络
Wi-Fi 支持使用命令的方式对Wi-Fi连网相关的操作,如对存储的连接信息的读/写/删除,打印当前网络内的所有AP的信息,连接AP,断开AP的连接,查询网络状态等。
命令行 |
说明 |
netmgr -t wifi -i |
初始化 |
netmgr -t wifi -a [0/1] |
设置是否自动重连。0,不自动重连;1,自动重连。 |
netmgr -t wifi -b [0/1] |
是否保存历史连接记录。0,不保存历史连接记录。1,保存历史连接记录。 |
netmgr -t wifi -c [ssid] [password] |
使用ssid password连网 |
netmgr -t wifi -e |
断开Wi-Fi连接 |
netmgr -t wifi -w [wifi_config] |
写Wi-Fi配置文件。wifi_config格式,如,network={\\nssid=\"aos\"\\npassword=\"123456\"\\nchannel=\"0\"\\n}\\n |
netmgr -t wifi -r |
读Wi-Fi配置文件 |
netmgr -t wifi -d |
删除Wi-Fi配置文件 |
netmgr -t wifi -p |
打印当前网络状态 |
netmgr -t wifi -s |
打印当前网络上的AP的信息 |
比如,连SSID是“aos” ,密码是“123456”的AP:
-
netmgr
-t wifi -i
-
-
netmgr
-t wifi -c aos 123456
7、分析手段
Netmgr关键日志主要是为了方便根据串口日志识别当前设备的网络状态,具体包括:
关键日志 |
说明 |
NETMGR_CONN conn_connecting |
表示Wi-Fi连接中 |
NETMGR_CONN conn_connected |
表示Wi-Fi连接成功 |
NETMGR_CONN conn_obtaining_ip |
表示正在获取IP地址 |
wifi_dhcp_start:1763 start dhcp |
表示启动DHCP client访问IP |
netmgr_ip_got_event |
表示获取到IP地址事件 |
start sntp task. |
表示启动了sntp服务器 |
[sntp] OK: sec 739241320 usec 1612343811 |
表示sntp成功获取到时间 |
平时在具体问题的分析中需要经常根据如上日志去判断当前网络的情况。尤其是最后一条sntp的日志,如果看到这则日志,说明当前网络的wifi已经连接上,并且能够访问广域网。
开发者技术支持
如需更多技术支持,可加入钉钉开发者群,或者关注微信公众号
更多技术与解决方案介绍,请访问阿里云AIoT首页https://iot.aliyun.com/
转载:https://blog.csdn.net/HaaSTech/article/details/114854590