【星闪技术】WS63E模块的WiFi客户端测试

引言

我所计划的WS63E测试要实现MQTT联网,所以首先需要确保开发板连接WiFi。今天来测试一下WiFi功能。

程序分析

WiFi客户端的例子在src/application/samples/wifi/sta_sample目录下。这个例子看上去和hi3861的例子差不多。

这段程序是一个用于嵌入式设备的Wi-Fi Station(STA)模式的示例程序,它使用了LwIP网络堆栈和CMSIS-RTOS API。程序的主要目的是连接到一个指定的Wi-Fi网络,并获取IP地址。以下是对程序的分析:

  1. 头文件包含:程序包含了多个头文件,这些头文件提供了网络接口、Wi-Fi热点配置、基础类型定义、标准库、串口通信、操作系统服务、应用初始化和系统抽象层等功能的支持。

  2. 宏定义:定义了一些常量,如Wi-Fi接口名称的最大长度、SSID的最大长度、扫描AP的限制、MAC地址的长度等。

  3. 事件回调函数:定义了两个静态函数wifi_scan_state_changedwifi_connection_changed,它们分别在Wi-Fi扫描状态变化和连接状态变化时被调用。

  4. Wi-Fi事件结构体:定义了一个wifi_event_stru结构体,用于注册Wi-Fi事件回调。

  5. 状态枚举:定义了一个枚举wifi_state_enum,用于跟踪STA模式下的不同状态。

  6. 全局变量:定义了一个全局变量g_wifi_state,用于保存当前的Wi-Fi状态。

  7. 扫描事件回调函数wifi_scan_state_changed函数在扫描完成时被调用,它将全局状态设置为扫描完成。

  8. 关联事件回调函数wifi_connection_changed函数在连接状态变化时被调用,它根据连接是否成功更新全局状态。

  9. 匹配目标AP函数example_get_match_network函数用于在扫描结果中找到指定的网络,并填充连接请求信息。

  10. 关联状态查询函数example_check_connect_status函数用于检查是否成功连接到AP。

  11. DHCP状态查询函数example_check_dhcp_status函数用于检查是否成功获取IP地址。

  12. STA功能函数example_sta_function函数是STA模式的主要逻辑,它按照状态枚举的顺序执行操作,包括启动扫描、连接到AP、获取IP地址等。

  13. 初始化函数sta_sample_init函数用于初始化Wi-Fi事件回调、等待Wi-Fi初始化完成,并调用example_sta_function函数。

  14. 任务入口函数sta_sample_entry函数用于创建一个名为sta_sample_task的线程,该线程运行sta_sample_init函数。

  15. 程序入口app_run函数调用sta_sample_entry函数,启动STA模式的任务。

整体来看,这个程序是一个完整的Wi-Fi Station模式的示例,它展示了如何使用事件回调、状态机和网络接口来连接到一个Wi-Fi网络并获取IP地址。程序使用了CMSIS-RTOS API来创建线程和延时,以及LwIP API来处理网络相关的操作。

程序测试

编译程序之前,需要先修改程序中的SSID和密码设置。这个参数在example_get_match_network函数中。

td_s32 example_get_match_network(wifi_sta_config_stru *expected_bss)
{td_s32  ret;td_u32  num = 64; /* 64:扫描到的Wi-Fi网络数量 */td_char expected_ssid[] = "my_softAP";td_char key[] = "my_password"; /* 待连接的网络接入密码 */td_bool find_ap = TD_FALSE;td_u8   bss_index;/* 获取扫描结果 */td_u32 scan_len = sizeof(wifi_scan_info_stru) * WIFI_SCAN_AP_LIMIT;wifi_scan_info_stru *result = osal_kmalloc(scan_len, OSAL_GFP_ATOMIC);if (result == TD_NULL) {return -1;}memset_s(result, scan_len, 0, scan_len);ret = wifi_sta_get_scan_info(result, &num);if (ret != 0) {osal_kfree(result);return -1;}/* 筛选扫描到的Wi-Fi网络,选择待连接的网络 */for (bss_index = 0; bss_index < num; bss_index ++) {if (strlen(expected_ssid) == strlen(result[bss_index].ssid)) {if (memcmp(expected_ssid, result[bss_index].ssid, strlen(expected_ssid)) == 0) {find_ap = TD_TRUE;break;}}}/* 未找到待连接AP,可以继续尝试扫描或者退出 */if (find_ap == TD_FALSE) {osal_kfree(result);return -1;}/* 找到网络后复制网络信息和接入密码 */if (memcpy_s(expected_bss->ssid, WIFI_MAX_SSID_LEN, expected_ssid, strlen(expected_ssid)) != 0) {osal_kfree(result);return -1;}if (memcpy_s(expected_bss->bssid, WIFI_MAC_LEN, result[bss_index].bssid, WIFI_MAC_LEN) != 0) {osal_kfree(result);return -1;}expected_bss->security_type = result[bss_index].security_type;if (memcpy_s(expected_bss->pre_shared_key, WIFI_MAX_SSID_LEN, key, strlen(key)) != 0) {osal_kfree(result);return -1;}expected_bss->ip_type = 1; /* 1:IP类型为动态DHCP获取 */osal_kfree(result);return 0;
}

修改好SSID和密码,就可以编译并下载程序了。程序启动后扫描附近的所有WiFi热点,如果找到制定的热点,就自动连接。 

a46fc0f58c064143b65fde92a7f6e9ad.png

从这段日志看,程序成功的连接到热点,并通过DHCP协议获得了IP地址。

完整的程序日志如下: 

boot.
Flash Init Fail! ret = 0x80001341
verify_public_rootkey secure verify disable!
verify_params_key_area secure verify disable!
verify_params_area_info secure verify disable!
verify_image_key_area secure verify disable!
verify_image_code_info secure verify disable!
SSB Uart Init Succ!
SSB Flash Init Succ!
verify_image_key_area secure verify disable!
verify_image_code_info secure verify disable!
Flashboot Uart Init Succ!
Flashboot Malloc Init Succ!
Flash Init Succ!
No need to fix SR!
flashboot version : 1.10.101
[UPG] upgrade init OK!
No need to upgrade...
flash_encrypt disable.
verify_image_key_area secure verify disable!
verify_image_code_info secure verify disable!
APP|Debug uart init succ.
[UPG] upgrade init OK!
APP|init_dev_addr, mac_addr:0x80,0x 0,0x73,0xdb,0x**,0x**,
xo_trim_temp_comp val:0 0
APP|AT uart init succ.
los_at_plt_cmd_register EXCUTE
APP|WARNING: main_initialise::thread[11] func is null
APP|[WIFI_STA_SAMPLE]::Create sta_sample_task succ.
cpu 0 entering schedulerAPP|btc open
[RADAR_LOG] alg ctrl read from nv [1][2][0][0][1][1][20]
device_main_init: 0!
===hal_initialize_phy===225===
device_module_init:: succ!
cali_set_cali_mask:old[0x0] -> new[0x1fa2]fe_rf_initialize
cali_offline_cali_entry enter
cali_set_cali_done_flag:old[0x0] -> new[0x1]rf cali OK. time cost:22, ret:0
APP|[WIFI_STA_SAMPLE]::wifi_event_cb register succ.
APP|[WIFI_STA_SAMPLE]::wifi init succ.
drv_soc_ioctl ioctl_cmd->cmd=7.
drv_soc_ioctl ioctl_cmd->cmd=9.
drv_soc_ioctl ioctl_cmd->cmd=17.
drv_soc_ioctl ioctl_cmd->cmd=13.
drv_soc_ioctl ioctl_cmd->cmd=35.
drv_soc_ioctl ioctl_cmd->cmd=2.
drv_soc_ioctl ioctl_cmd->cmd=2.
drv_soc_ioctl ioctl_cmd->cmd=2.
drv_soc_ioctl ioctl_cmd->cmd=2.
drv_soc_ioctl ioctl_cmd->cmd=2.
drv_soc_ioctl ioctl_cmd->cmd=2.
drv_soc_ioctl ioctl_cmd->cmd=41.
APP|[WIFI_STA_SAMPLE]::STA enable succ.
APP|[WIFI_STA_SAMPLE]::Scan start!
drv_soc_ioctl ioctl_cmd->cmd=14.
hmac_single_hal_device_scan_complete:vap[1] time[761] chan_cnt[13] chan_0[1] back[0] event[6] mode[0]
Scan::vap[1] find bss_num[28] in regdomain, other bss_num[0]
Srv:548:recive event = 1
APP|[WIFI_STA_SAMPLE]::Scan done!.
Srv:1723:sta_scan_results cnt 28
APP|[WIFI_STA_SAMPLE]::Connect start.
Srv:find ssid[CU_fjGX] auth type[2] pairwise[1] ft_flag[0]
drv_soc_ioctl ioctl_cmd->cmd=47.
drv_soc_ioctl ioctl_cmd->cmd=47.
drv_soc_ioctl ioctl_cmd->cmd=47.
drv_soc_ioctl ioctl_cmd->cmd=16.
drv_soc_ioctl ioctl_cmd->cmd=6.
drv_soc_ioctl ioctl_cmd->cmd=6.
drv_soc_ioctl ioctl_cmd->cmd=47.
APP|Hello world!
drv_soc_ioctl ioctl_cmd->cmd=6.
drv_soc_ioctl ioctl_cmd->cmd=5.
drv_soc_ioctl ioctl_cmd->cmd=6.
drv_soc_ioctl ioctl_cmd->cmd=6.
drv_soc_ioctl ioctl_cmd->cmd=5.
drv_soc_ioctl ioctl_cmd->cmd=1.
drv_soc_ioctl ioctl_cmd->cmd=3.
drv_soc_ioctl ioctl_cmd->cmd=1.
+NOTICE:CONNECTED
drv_soc_ioctl ioctl_cmd->cmd=6.
Srv:548:recive event = 2
APP|[WIFI_STA_SAMPLE]::Connect succ!.
APP|[WIFI_STA_SAMPLE]::DHCP start.
xo update temp:4,diff:0,xo:0x3083c
APP|[WIFI_STA_SAMPLE]::STA DHCP success.
APP|[SYS INFO] mem: used:134448, free:229572; log: drop/all[0/0], at_recv 0.
APP|[SYS INFO] mem: used:134448, free:229572; log: drop/all[0/0], at_recv 0.
APP|[SYS INFO] mem: used:134448, free:229572; log: drop/all[0/0], at_recv 0.

结语

WS63E上实现WiFi比较容易,下一阶段将添加MQTT连接华为云的代码。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/56658.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国产AI逆袭!零一万物新模型Yi-Lightning超越 GPT-4o

近日&#xff0c;由全球千万用户盲测投票产生的 AI 模型排行榜公布&#xff0c;国产 AI 模型“Yi-Lightning”逆袭&#xff0c;超越了此前长期占据榜首的 GPT-4。 “Yi-Lightning”模型由国内知名 AI 公司零一万物研发&#xff0c;在多个分榜中均名列前茅&#xff0c;其中数学…

HDU RSA

翻译成中文后&#xff1a; 思路&#xff1a;由题易得&#xff0c;d * e y * f ( n ) 1 ,且gcd ( e , f ( n ) ) 1,所以用扩展欧几里得求出 d &#xff0c;但要保证 d 是非负的&#xff0c;最有用快速幂求出每个字符即可。 #include<bits/stdc.h> using namespace std;…

HTML5教程(二)- HTML语法及基本结构

1. 介绍 HTML 超文本标记语言&#xff08;HyperText Markup Language&#xff09;浏览器能够识别和解析的语言&#xff0c;通过标签的形式构建页面结构和填充内容&#xff08;用来描述网页的语言&#xff09;。HTML 不是一种编程语言&#xff0c;而是一种标记语言&#xff08;是…

基于SpringBoot+Vue+uniapp微信小程序的教学质量评价系统的详细设计和实现

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

决策树(1)

原理 基础概念 决策树属于判别模型。 决策树算法属于监督学习方法。 决策树是一种树状结构&#xff0c;通过做出一系列决策&#xff08;选择&#xff09;来对数据进行划分&#xff0c;这类似于针对一系列问题进行选择。 决策树的决策过程就是从根节点开始&#xff0c;测试待分…

UNION 联合查询

1.UNION ALL联合查询 同样为了演示方便&#xff0c;先向 teacher 表插入多条测试数据&#xff1a; INSERT INTO teacher (name,age,id_number,email) VALUES (姓名一,17,42011720200604077X,NULL), (姓名二,18,42011720200604099X,123qq.com), (姓名三,19,42011720200604020X…

007、链表的回文结构

0、题目描述 链表回文结构 1、法1 一个复杂的问题可以拆解成几个简单的问题&#xff0c;找中间节点和逆置链表&#xff08;翻转链表&#xff09;之前都做过。 class PalindromeList { public://1、找中间节点ListNode* FindMid(ListNode* A){if (A nullptr || A->next …

流程图 LogicFlow

流程图 LogicFlow 官方文档&#xff1a;https://site.logic-flow.cn/tutorial/get-started <script setup> import { onMounted, ref } from vue import { forEach, map, has } from lodash-es import LogicFlow, { ElementState, LogicFlowUtil } from logicflow/core …

Jmeter监控服务器性能

目录 ServerAgent 安装 打开Jmeter ServerAgent 在Jmeter上监控服务器的性能比如CPU&#xff0c;内存等我们需要用到ServerAgent&#xff0c;这里可以下载我分享 ServerAgent-2.2.3.zip 链接: https://pan.baidu.com/s/1oZKsJGnrZx3iyt15DP1IYA?pwdedhs 提取码: edhs 安装…

FPGA图像处理之均值滤波

文章目录 一、什么是图像滤波&#xff1f;1.1 噪声类型1.2 滤波类型 二、均值滤波原理2.1 3*3窗口滑动过程2.2 图像扩展 三、Matlab实现均值滤波四、FPGA实现均值滤波4.1 生成 3*3 矩阵4.2 仿真3*3矩阵4.3 计算均值4.4 仿真均值滤波 一、什么是图像滤波&#xff1f; 图像滤波是…

得物App3D创新应用引关注,世界设计之都大会启幕

近日&#xff0c;2024世界设计之都大会&#xff08;WDCC&#xff09;在上海盛大启幕。此次大会以“设计无界 新质生长”为主题&#xff0c;汇聚了全球设计领域的精英与前沿成果&#xff0c;展现了设计作为新质生产力的巨大潜力。主场展览占据了整整3个楼面&#xff0c;总面积达…

C#学习笔记(十)

C#学习笔记&#xff08;十&#xff09; 第七章 对象的构造方法与实例方法一、对象的构造方法1. 构造方法初识2. 构造方法的创建3. this关键字4. 构造方法的规范和重载4.1 构造方法的规范 5. 对象初始化器5.1 对象初始化器和构造方法的区别 二、对象的实例方法1. 简单应用2.实例…

代码随想录算法训练营第二天(补) | 滑动窗口、模拟、前缀和

目录 3.4 长度最小的子数组 3.5螺旋矩阵II 3.6 区间和 文章讲解&#xff1a;[58. 区间和 | 代码随想录 3.4 长度最小的子数组 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;拿下滑动窗口&#xff…

Linux历史

Linux 于 1991 年由芬兰学生 Linus Torvalds 作为个人项目开始&#xff0c;旨在创建一个新的免费操作系统内核。在其历史发展中&#xff0c;Linux 内核经历了持续的增长。自 1991 年首次发布源代码以来&#xff0c;Linux 内核从少量的 C 语言文件&#xff0c;且受限于禁止商业发…

机器视觉基础系列四—简单了解背景建模算法

机器视觉基础系列四—简单了解背景建模算法 首先我们应该了解的是背景建模的定义是什么&#xff1f;又有哪些应用场景呢&#xff1f; 背景建模是指通过分析视频序列中的像素值变化情况&#xff0c;从中提取出静态背景部分&#xff0c;并将其用于目标检测、运动跟踪等计算机视觉…

渗透测试导论

渗透测试的定义和目的 渗透测试&#xff08;Penetration Testing&#xff09;是一项安全演习&#xff0c;网络安全专家尝试查找和利用计算机系统中的漏洞。 模拟攻击的目的是识别攻击者可以利用的系统防御中的薄弱环节。 这就像银行雇用别人假装盗匪&#xff0c;让他们试图闯…

LeetCode1004.最大连续1的个数

题目链接&#xff1a;1004. 最大连续1的个数 III - 力扣&#xff08;LeetCode&#xff09; 1.常规解法&#xff08;会超时&#xff09; 遍历数组&#xff0c;当元素是1时个数加一&#xff0c;当元素是0时且已有的0的个数不超过题目限制时&#xff0c;个数加一&#xff0c;若上…

Lumerical学习——优化和参数扫描(Optimization and parameter sweeps)

一、概要介绍 这部分介绍优化和参数扫描项目设定的方法。在有大量数据模拟计算过程中这个特性允许用户使处理方法自动地查找期望的参数值。 ① 创建一个参数扫描任务 ② 创建一个优化任务 ③ 创建一个良率分析任务 ⑤ 打开所选择项目的编辑窗口&#xff0c;编辑其属性…

基于Java+SpringBoot+Uniapp的博客系统设计与实现

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

嵌入式C++中内存分配基本实现方法

大家好,今天主要给大家分享一下,如何使用计算机中的内存空间进行分配,观察具体现象。 第一:C语言动态空间分配方式 第二:C++中动态内存分配方法 new 可以自动计算数据类型的大小 与 类型的转换 malloc 只能手动进行。 2.new 可以在分配空间的时候初始化 malloc 不行。 第三…