当前位置: 首页 > news >正文

【星闪技术】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连接华为云的代码。

 

相关文章:

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

引言 我所计划的WS63E测试要实现MQTT联网&#xff0c;所以首先需要确保开发板连接WiFi。今天来测试一下WiFi功能。 程序分析 WiFi客户端的例子在src/application/samples/wifi/sta_sample目录下。这个例子看上去和hi3861的例子差不多。 这段程序是一个用于嵌入式设备的Wi-F…...

Android面试之5个Kotlin深度面试题:协程、密封类和高阶函数

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 面试题目1&#xff1a;Kotlin中的协程与线程的区别是什么&#xff1f;如何在Android中使用协程进行异步编程&#xff1f; 解答&#xff1a; 协…...

操作系统 和 初识进程

目录 操作系统&#xff08;OS&#xff09; 进程 操作系统&#xff08;OS&#xff09; 概念 操作系统即os&#xff0c;是一款软件。 任何计算机系统都包含一个基本的程序集合&#xff0c;称为操作系统(OS)。 操作系统的本质是一种进行软硬件管理的软件 笼统的理解&#xf…...

QT--Qlabel学习、获取文本和设置文本、文本对齐方式、文本换行、显示图片

QLabel 是 Qt 中的标签类&#xff0c;通常用于显示提示性的文本&#xff0c;也可以显示图像 对齐方式 用于设置标签中的内容在水平和垂直两个方向上的对齐方式&#xff0c;比如左对齐、右对齐、上对齐、下对齐、水平居中、垂直居中等。 // 获取和设置文本的对齐方式 Qt::Ali…...

深度学习:终身学习(Life-Long Learning)详解

终身学习&#xff08;Life-Long Learning&#xff09;详解 终身学习&#xff08;也称为持续学习或增量学习&#xff09;是机器学习中的一个重要研究领域&#xff0c;它关注如何使机器学习模型在完成一系列任务后&#xff0c;能够持续学习新任务&#xff0c;而不会忘记之前学到…...

前端UI框架

组件UI类 1.Element-Plus 2.uView 3.Vant 4.TDesign 5.uni-app 6.Tuniao-vue3 7. 可视化图标类 1.可视化图标VUE Data UI 2.Echart 图标库ICON 1.yesicon 2.Flaticon 3.Google Fonts 4.fontawesome 5.阿里巴巴 其他 1.CSS布局 2.web前端样式布局 3.中国色-颜色合集 托管…...

最佳副屏串流解决方案:如何低成本打造电脑拓展副屏?

如何低成本打造电脑拓展副屏&#xff1f;如果你有一台平板和一台电脑&#xff0c;想要提高打游戏、办公或是学习的效率。那么&#xff0c;使用网易GameViewer远程&#xff0c;就能帮你低成本打造电脑拓展副屏。 简单来说&#xff0c;副屏串流就是能让你多出一块显示屏。在打游戏…...

SQL Injection | SQL 注入概述

关注这个漏洞的其他相关笔记&#xff1a;SQL 注入漏洞 - 学习手册-CSDN博客 0x01&#xff1a;SQL 注入漏洞介绍 SQL 注入就是指 Web 应用程序对用户输入数据的合法性没有判断&#xff0c;前端传入后端的参数是可控的&#xff0c;并且参数会带入到数据库中执行&#xff0c;导致…...

【Linux 从基础到进阶】磁盘I/O性能调优

磁盘I/O性能调优 1. 引言 磁盘I/O性能是决定服务器整体性能的关键因素之一。磁盘I/O性能的瓶颈常常会影响数据库、文件系统以及虚拟化平台等关键应用的响应时间。因此&#xff0c;磁盘I/O调优是系统管理员不可忽视的任务。 本文将介绍影响磁盘I/O性能的主要因素&#xff0c;…...

浅谈AGI时代的“数据枢纽”——向量数据库

一、前言 人工智能的关键&#xff0c;不只是构建好算力、算法、模型&#xff0c;更重要的是做好数据的清洗、处理、挖掘等问题。一定程度上&#xff0c;智能时代&#xff0c;企业数据处理能力有多强&#xff0c;决定了业务发展的天花板有多高。 在企业数智化转型过程中&#x…...

生成 Excel 表列名称

Excel 大家都用过&#xff0c;它的列名是用字母编号的&#xff0c;A 表示第一列&#xff0c;B 表示第二列&#xff0c;AA 表示第27列&#xff0c;AB 表示第28列等等。 现给定一个数字&#xff0c;如何得到列名称呢。比如输入28&#xff0c;输出 AB。 一开始以为就是一个简单的…...

基于yolov10的烟雾明火检测森林火灾系统python源码+pytorch模型+评估指标曲线+精美GUI界面+数据集

【算法介绍】 基于YOLOv10的烟雾明火检测森林火灾系统是一种先进的火灾预警系统&#xff0c;它结合了深度学习和计算机视觉技术&#xff0c;能够实时检测和分析森林中的烟雾和明火&#xff0c;从而有效预防和控制森林火灾的发生。 该系统主要基于YOLOv10模型进行构建&#xf…...

UltraISO(软碟通)制作U盘制作Ubuntu20.04启动盘

目录 一、启动盘制作 1、工具准备 2、打开UltraISO后&#xff0c;点击左上角的文件&#xff0c;在打开的下拉项中&#xff0c;选择打开准备好的Ubuntu系统20.04 LTS镜像文件(ubuntu-20.04-desktop-amd64.iso)&#xff1b; 3、然后点击启动->写入硬盘映像 4、在弹出的窗…...

【EtherCAT实践篇一】TwinCAT 3安装、使用

TwinCAT 基于 PC 的开放式控制技术 倍福推出的基于 PC 的控制技术定义了自动化领域的全球标准。在软件方面&#xff0c;1996 年推出的 TwinCAT&#xff08;The Windows Control and Automation Technology&#xff0c;基于 Windows 的控制和自动化技术&#xff09;自动化套件是…...

4、CSS3笔记

文章目录 四、CSS3CSS3简介css3概述CSS3私有前缀什么是私有前缀为什么要有私有前缀常见浏览器私有前缀 CSS3基本语法CSS3新增长度单位CSS3新增颜色设置方式CSS3新增选择器CSS3新增盒模型相关属性box-sizing 怪异盒模型resize 调整盒子大小box-shadow 盒子阴影opacity 不透明度 …...

Docker无法拉取镜像解决办法

Docker 无法拉取镜像解决办法 一.现象描述 在docker拉取镜像的时候重复拉取镜像然后超时。 二.解决办法 1.配置国内镜像源地址加速 vi /etc/docker/daemon.json在文件中增加如下内容 { "registry-mirrors": ["https://docker.m.daocloud.io","h…...

Ubuntu 20.04安装Qt 5.15(最新,超详细)

Ubuntu 20.04安装Qt 5.15 1. 准备注册Qt账号安装依赖下载安装工具 2. 安装3. 测试参考 前言 Qt 是一个跨平台的应用程序框架&#xff0c;它支持开发 C 图形用户界面应用程序。Qt 可以用于开发运行在多种操作系统上的应用程序&#xff0c;包括 Windows、Linux、macOS 和各种移动…...

桂林旅游一点通:SpringBoot平台应用

3系统分析 3.1可行性分析 通过对本桂林旅游景点导游平台实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本桂林旅游景点导游平台采用SSM框架&#xff0c;JAVA作…...

【WPF】04 Http消息处理类

这里引入微软官方提供的HttpClient类来实现我们的目的。 首先&#xff0c;介绍一下官方HttpClient类的内容。 HttpClient 类 定义 命名空间: System.Net.Http 程序集: System.Net.Http.dll Source: HttpClient.cs 提供一个类&#xff0c;用于从 URI 标识的资源发送 HTTP 请…...

如何精准设置线程数,提升系统性能的秘密武器!

线程数设定多少更合适&#xff1f; 线程数的设定需要根据任务的类型、系统资源、以及并发需求来进行权衡。设定合适的线程数可以有效提升系统的性能&#xff0c;但设置过多或过少都会影响程序的效率。以下是一些关键因素和计算方法&#xff0c;用于帮助确定最合适的线程数。 …...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

鸿蒙HarmonyOS 5军旗小游戏实现指南

1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;采用DevEco Studio实现&#xff0c;包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...

CTF show 数学不及格

拿到题目先查一下壳&#xff0c;看一下信息 发现是一个ELF文件&#xff0c;64位的 ​ 用IDA Pro 64 打开这个文件 ​ 然后点击F5进行伪代码转换 可以看到有五个if判断&#xff0c;第一个argc ! 5这个判断并没有起太大作用&#xff0c;主要是下面四个if判断 ​ 根据题目…...