1. 目标
学会调用wpa supplicant接口命令,来测试OpenHarmonyOS WiFi驱动是否安装成功。安装成功的表现是
开发板上的WiFi模组可以工作在STA状态,也可以工作在AP状态。
工作在STA状态时,开发板要能够连接上指定的热点(一般用
手机做热点测试);工作在AP状态时,手机要能够连接上开发板网卡生成的热点。
理解wpa_supplicant的开发框架,以便生产网卡的厂家进行HarmonyOS系统驱动的适配。
2. 把开源代码中提供的例程加入系统代码中提供了验证wifi基本功能的示例代码,默认未参与编译,修改`applica
tions/sample/camera/communication/BUILD.gn`,添加如下所示的feature,
- lite_component("sample") {
- features = [
- "wpa_supplicant:wpa_sample", #station模式的示例
- "hostapd:hostapd_sample", #ap模式的示例
- "wpa_cli:wpa_cli_sample" #使用client监听事件和控制wpa的示例
- ]
- }
"wpa_supplicant:wpa_sample"是station模式的示例,"hostapd:hostapd_sample"是ap模式的示例,"wpa_cli:wpa_cli_sample"是使用client监听事件和控制wpa的示例。这样,系统编译时就会生成我们需要的可执行程序以及把相应的配置文件添加到/etc目录里面去。
1. 系统启动及端口复用设置1.1. 文件烧录部分,本文不再赘述1.2. 系统启动项设置
上电复位后,进入uboot界面,输入如下uboot命令:
- setenv bootcmd 'sf probe 0;sf read 0x80000000 0x100000 0x600000;mw 0x112F0008 0x601;mw 0x112F000C 0x501;mw 0x112F0010 0x501;mw 0x112F0014 0x501;mw 0x112F0018 0x501;mw 0x112F001C 0x501;go 0x80000000';saveenv;
- setenv bootargs "ttyAMA0,115200n8 root=flash fstype=jffs2 rw rootaddr=7M rootsize=8M";saveenv;
关于这两条命令的含义,我们已经在sample_test的例程中详细讲过,请大家往前翻看下。对于不同的开发板,不同大小的应用程序,上述两行命令行中的参数会有所不同。我们着重讲一下,前面没有遇到过的部分:wifi模组端口引脚复用设置。这块由以下几条命令组成:
mw0x112F0008 0x601;
mw 0x112F000C 0x501;
mw 0x112F0010 0x501;
mw 0x112F0014 0x501;
mw0x112F0018 0x501;
mw 0x112F001C 0x501。
以“mw 0x112F0008 0x601”为例,它的作用就是修改寄存器Pin SDIO1_CCMD IO Config Register iocfg_reg68的值,将功能选择为SDIO1_CCMD,系统默认的是GPIO6_1。其余的命令可以依样查找相关产品文档进行确认。
1. 检查网卡驱动加载是否成功
程序烧录成功后,上电重新启动。进入鸿蒙系统后,第一件事要查看网卡驱动是否初始化成功。检查是否初始化成功的方法是在OpenHarmonyOS中运行命令ifconfig(network interface configuring),如果出现无线网卡,那么就说明驱动加载成功了。在鸿蒙系统中,无线网卡被统一命名为wlan0.
如果没有发现wlan0,可以重新插拔下无线网卡,看看接口是不是固定牢固了。
1. STA模式运行结果在 OpenHarmonyOS中,cd bin,然后输入命令:“./wpa_supplicant–i wlan0 –c ../etc/wpa_supplicant.conf”。为了便于理解命令的一些关键词,这里贴几张图,简单展示下鸿蒙系统的目录:
a) bin目录
b)根目录
c)etc目录
下面解释下这个命令:wpa_sufficant是二进制的可执行程序,它两个参数。第一个参数表示的是WiFi连接使用的是无线网卡wlan0,第二个参数是将要连接的热点的信息。本案例中,该热点信息配置如下:
命令运行成功后,利用手机(我们测试用的是android手机)创建ssid是example,密码是“12345678”的热点。等待一会,你会发现连接手机热点的终端个数从0变成了1。
1. AP模式运行结果:
在OpenHarmonyOS 的bin命令里面,执行命令:hostapd -i wlan0 /etc/hostapd.conf。hostapd.conf的配置如下:
运行命令后,打开手机,搜索热点。手机会找到testap热点,输入密码“12345678”后,就可以连上了。下图中红色区域是板子在等待连接,绿色区域表示已经连接成功。
1. Wpa_cli客户端运行结果开源出来的程序可能有点问题(编译条件非常严格的时候出现),编译的时候有两个bug,修改后编译通过。
1.1. int_t改成size_t(形参类型不匹配)
1.1. 把pad变量注释掉(这两个变量被定义了,却没有使用)
1.1. 先运行sta demo在bin目录下,输入命令“./wpa_supplicant–i wlan0 –c ../etc/wpa_supplicant.conf”,手机热点“example”暂时不要开。
1.2. 运行wpa_cli客户端,不开手机热点在bin目录下,输入命令“./wpa_cli”这个时候后台会wpa_cli会提示收到没有连接到热点的消息:
1.1. 打开手机热点,让开发板连接上
这个时候wpa_cli给出的消息如下,说明开发板已经连接上手机热点。这个和手机热点端给出的提示信息一致:连接手机热点的终端从0变成了1.
本文仅作为鸿蒙系统wifi部分的使用参考案例,对第三方开源软件wpa_supplicant没有做深入了解。
1. WIFI驱动程序的HDF框架解析Wifi驱动的实现极好地展现了鸿蒙系统HDF的
通信机制,下面我们略作讲解。
1.1. 用户端调用本示例中的wpa_supplicant和 hostapd两个用户态的可执行程序,最后都是通过调用内核态的Dispatch函数来执行指令。cmd的id不同,内核态就执行不同的函数。
OpenHarmonyOS系统根据wifi协议,把相关功能的实现总结成如下的几个函数。通过这几个函数,已经足够可以实现系统需要达到的能力。
1.1. 内核态的实现在系统启动,驱动初始化的过程中,wifi设备节点绑定的Dispatch函数其实就是WifiCmdProcess,而WifiCmdProcess的具体实现是靠g_wifiCmdHandle这个函数数组来实现的。这个函数数组里面包含了一系列函数,具体调用哪个函数(或者说取数组中的那个值),完全取决于用户态的调用(传递过来cmd编号)。
文件hdf_wifi_cmd.c中(*WifiCmdHandle)里面的执行函数,最后是通过调用海思芯片3881驱动中具体的函数来实现,hi3881的驱动文件目录如下图所示。
1. 源码
本文档介绍的案例的源码,在系统中已有提供,目录如下,请大家自助获取:
注:文档和视频中所有的图片及代码截图皆为示意图,具体以HarmonyOS官网发布内容为准。
文章来源:张飞实战
电子