OpenHarmony轻量系统开发【9】WiFi之STA模式连接热点

9.1AT指令操作WiFi

我们可以使用AT指令进行Hi3861 WiFi操作,连接热点、ping服务器等。

但是很多时候,我们需要实现开机后自动连接到某个热点,光靠AT指令不行。
Hi3861 为我们提供了WiFi操作的相关API,方便我们编写代码,实现热点连接。

9.2 代码实现

先直接上代码和操作演示。
跟我们最早的hello world代码一样,在app下新增业务demo_wifi_sta,其中demo_wifi_sta.c为业务代码,BUILD.gn为编译脚本,具体规划目录结构如下:

其中BUILD.gn文件内容如下:

static_library("demo_wifi_sta") {sources = ["demo_wifi_sta.c"]include_dirs = ["//utils/native/lite/include","//kernel/liteos_m/components/cmsis/2.0","//base/iot_hardware/peripheral/interfaces/kits","//device/soc/hisilicon/hi3861v100/hi3861_adapter/hals/communication/wifi_lite/wifiservice","//device/soc/hisilicon/hi3861v100/hi3861_adapter/kal","//device/soc/hisilicon/hi3861v100/sdk_liteos/third_party/lwip_sack/include",]
}

hi_wifi_start_sta函数:设置WiFi参数、扫描热点

int hi_wifi_start_sta(void)
{int ret;char ifname[WIFI_IFNAME_MAX_SIZE + 1] = {0};int len = sizeof(ifname);const unsigned char wifi_vap_res_num = APP_INIT_VAP_NUM;const unsigned char wifi_user_res_num = APP_INIT_USR_NUM;unsigned int  num = WIFI_SCAN_AP_LIMIT;//这里不需要重复进行WiFi init,因为系统启动后就自己会做WiFi init
#if 0printf("_______>>>>>>>>>> %s %d \r\n", __FILE__, __LINE__);ret = hi_wifi_init(wifi_vap_res_num, wifi_user_res_num);if (ret != HISI_OK) {return -1;}
#endifret = hi_wifi_sta_start(ifname, &len);if (ret != HISI_OK) {return -1;}/* register call back function to receive wifi event, etc scan results event,* connected event, disconnected event.*/ret = hi_wifi_register_event_callback(wifi_wpa_event_cb);if (ret != HISI_OK) {printf("register wifi event callback failed\n");}/* acquire netif for IP operation */g_lwip_netif = netifapi_netif_find(ifname);if (g_lwip_netif == NULL) {printf("%s: get netif failed\n", __FUNCTION__);return -1;}/* 开始扫描附件的WiFi热点 */ret = hi_wifi_sta_scan();if (ret != HISI_OK) {return -1;}sleep(5);   /* sleep 5s, waiting for scan result. */hi_wifi_ap_info *pst_results = malloc(sizeof(hi_wifi_ap_info) * WIFI_SCAN_AP_LIMIT);if (pst_results == NULL) {return -1;}//把扫描到的热点结果存储起来ret = hi_wifi_sta_scan_results(pst_results, &num);if (ret != HISI_OK) {free(pst_results);return -1;}//打印扫描到的所有热点for (unsigned int loop = 0; (loop < num) && (loop < WIFI_SCAN_AP_LIMIT); loop++) {printf("SSID: %s\n", pst_results[loop].ssid);}free(pst_results);/* 开始接入热点 */ret = hi_wifi_start_connect();if (ret != 0) {return -1;}return 0;
}

连接热点:

int hi_wifi_start_connect(void)
{int ret;errno_t rc;hi_wifi_assoc_request assoc_req = {0};/* copy SSID to assoc_req */rc = memcpy_s(assoc_req.ssid, HI_WIFI_MAX_SSID_LEN + 1, "RedmiK40", 8); /* 9:ssid length */if (rc != EOK) {return -1;}//热点加密方式assoc_req.auth = HI_WIFI_SECURITY_WPA2PSK;/* 热点密码 */memcpy(assoc_req.key, "07686582488", 11);ret = hi_wifi_sta_connect(&assoc_req);if (ret != HISI_OK) {return -1;}return 0;
}

热点连接结果回调函数

void wifi_wpa_event_cb(const hi_wifi_event *hisi_event)
{if (hisi_event == NULL)return;switch (hisi_event->event) {case HI_WIFI_EVT_SCAN_DONE:printf("WiFi: Scan results available\n");break;case HI_WIFI_EVT_CONNECTED:printf("WiFi: Connected\n");netifapi_dhcp_start(g_lwip_netif);break;case HI_WIFI_EVT_DISCONNECTED:printf("WiFi: Disconnected\n");netifapi_dhcp_stop(g_lwip_netif);hi_sta_reset_addr(g_lwip_netif);break;case HI_WIFI_EVT_WPS_TIMEOUT:printf("WiFi: wps is timeout\n");break;default:break;}
}

hi_sta_reset_addr:重新复位sta的地址、网关等参数。

/* clear netif's ip, gateway and netmask */
void hi_sta_reset_addr(struct netif *pst_lwip_netif)
{ip4_addr_t st_gw;ip4_addr_t st_ipaddr;ip4_addr_t st_netmask;if (pst_lwip_netif == NULL) {printf("hisi_reset_addr::Null param of netdev\r\n");return;}IP4_ADDR(&st_gw, 0, 0, 0, 0);IP4_ADDR(&st_ipaddr, 0, 0, 0, 0);IP4_ADDR(&st_netmask, 0, 0, 0, 0);netifapi_netif_set_addr(pst_lwip_netif, &st_ipaddr, &st_netmask, &st_gw);
}

9.3 WiFi相关API

Hi3861 提供了非常多的wifi相关API,主要文件是 hi_wifi_api.h
我们这里只列举最重要的几个API

(1)开启STA

int hi_wifi_sta_start(char *ifname, int *len);

(2)停止STA

int hi_wifi_sta_stop(void);

(3)扫描附件的热点

int hi_wifi_sta_scan(void);

(4)连接热点

int hi_wifi_sta_connect(hi_wifi_assoc_request *req);

其中hi_wifi_assoc_request *req 结构的定义如下:

typedef struct {char ssid[HI_WIFI_MAX_SSID_LEN + 1];    /**< SSID. CNcomment: SSID 只支持ASCII字符.CNend */hi_wifi_auth_mode auth;                 /**< Authentication mode. CNcomment: 认证类型.CNend */char key[HI_WIFI_MAX_KEY_LEN + 1];      /**< Secret key. CNcomment: 秘钥.CNend */unsigned char bssid[HI_WIFI_MAC_LEN];   /**< BSSID. CNcomment: BSSID.CNend */hi_wifi_pairwise pairwise;              /**< Encryption type. CNcomment: 加密方式,不需指定时置0.CNend */
} hi_wifi_assoc_request;

这里需要注意的是,通常加密方式是:HI_WIFI_SECURITY_WPA2PSK

例如我家的热点的连接方式的代码实现如下:

int hi_wifi_start_connect(void)
{int ret;errno_t rc;hi_wifi_assoc_request assoc_req = {0};/* copy SSID to assoc_req */rc = memcpy_s(assoc_req.ssid, HI_WIFI_MAX_SSID_LEN + 1, "RedmiK40", 8); /* 9:ssid length */if (rc != EOK) {return -1;}//热点加密方式assoc_req.auth = HI_WIFI_SECURITY_WPA2PSK;/* 热点密码 */memcpy(assoc_req.key, "07686582488", 11);ret = hi_wifi_sta_connect(&assoc_req);if (ret != HISI_OK) {return -1;}return 0;
}

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

《鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向

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

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

相关文章

如何用ServBay快速构建下一代GraphQL应用

在本指南中&#xff0c;我们将深入探讨如何利用ServBay一站式环境和Docker&#xff0c;构建可扩展的GraphQL微服务。我们将从微服务架构和GraphQL的基础知识入手&#xff0c;逐步深入到如何利用现代工具和技术构建、容器化并部署我们的微服务。 理解微服务架构 微服务架构是一…

举个栗子!Tableau 技巧(270):用 Lookup 函数创建多 KPI 文本表

在 Tableau 中&#xff0c;文本表常用于呈现明细数据。但其实&#xff0c;数据粉如果想在同一视图中查看多个数据指标&#xff0c;也可以用到文本表。 如下示例&#xff0c;是不是很直观的就可以查看&#xff1a;不同区域随时间推移的数据指标情况呢&#xff1f; 如何在 Tablea…

前后端分离vue.js+nodejs新闻文章发布论坛网站系统44x94

Vue&#xff1a; Vue是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。另一方面&#xff0c;当与现代化的工具链以及…

数据库SQL语言实战(二)

目录 检索查询 题目一 题目二 题目三 题目四 题目五 题目六 题目七 题目八 题目九&#xff08;本篇最难的题目&#xff09; 分析 实现&#xff08;两种方式&#xff09; 模板 总结 检索查询 按照要求查找数据库中的数据 题目一 找出没有选修任何课程的学…

计算机毕业设计 工厂车间设备管理系统php+vue.js

该系统是以PHP为主要开发语言&#xff0c;集合MySQL数据库技术构建基于Web的以信息为目标的&#xff0c;动态的交互平台 PHP与Apache&#xff0c;MySQL的组合虽然有着诸多优势&#xff0c;但三种出自不同作者的开源软件要能很好的配合工作&#xff0c;需要很多手工配置&#x…

图解数学:拉格朗日松弛方法的直观理解

昨晚写了拉格朗日松弛方法的原理分析&#xff0c;今天意犹未尽&#xff0c;图解一下&#xff0c;从直观上进一步理解这种方法。 一、一个简单例子 我们先来看一个简单的例子&#xff0c;下面数学规划问题没有约束条件&#xff1a; min ⁡ f ( x ) − x 2 8 x − 10 \begin…

velero备份恢复k8s集群 —— 筑梦之路

官网&#xff1a;Velero 简介 Velero 是vmware开源的一个云原生的灾难恢复和迁移工具&#xff0c;它本身也是开源的,采用Go语言编写&#xff0c;可以安全的备份、恢复和迁移Kubernetes集群资源数据&#xff1b;官网https://velero.io/。 Velero 是西班牙语意思是帆船&#xf…

halcon 3.2标定相机

参考《solution_guide_iii_c_3d_vision.pdf》 3.2.2.2 Which Distortion Model to Use 选用何种畸变模型 对于面阵相机&#xff0c;halcon中两种畸变模型&#xff1a;The division model and the polynomial model&#xff08;差分模型和多项式模型&#xff09;&#xff0c;前…

电子元器件线上交易商城搭建的价值和必要性-加速度jsudo

随着科技的飞速发展&#xff0c;电子元器件行业正迎来前所未有的变革。为了满足市场对于电子元器件采购的便捷性、高效性和多样性的需求&#xff0c;电子元器件商城的开发显得尤为重要。本文将探讨电子元器件商城开发的重要性、主要功能以及它如何助力行业发展。 电子元器件商城…

更优性能与性价比,从自建 ELK 迁移到 SLS 开始

作者&#xff1a;荆磊 背景 ELK (Elasticsearch、Logstash、Kibana) 是当下开源领域主流的日志解决方案&#xff0c;在可观测场景下有比较广泛的应用。 随着数字化进程加速&#xff0c;机器数据日志增加&#xff0c;自建 ELK 在面临大规模数据、查询性能等方面有较多问题和挑…

3d动画如何连续渲染?云渲染批量渲染3d动画

在3D动画的生产过程中&#xff0c;从多个角度渲染同一场景既是时间消耗大户&#xff0c;也对设计人员的技术能力提出了高要求。好在云渲染技术的进步为这一挑战提供了高效的解决办法。通过利用云渲染服务进行批量渲染&#xff0c;设计师们可以大幅节约时间并提升工作效率。 3d动…

YooAsset快速入门

文章目录 YooAsset快速入门指南&#xff1a;YooAsset学习核心要掌握的要点主要包括以下几个方面&#xff1a;基于YooAsset进行游戏资源管理的应用实例 YooAsset快速入门指南&#xff1a; YooAsset是一款专为游戏开发设计的资产管理和分发系统&#xff0c;它能够帮助开发者高效…