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

ops/2024/10/19 0:52:00/

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.ppmy.cn/ops/4093.html

相关文章

将一个文件夹的pdf都去掉第一页后生成在另一个文件夹

目录 一.前言 二.环境配置 三.完整代码 一.前言 在日常的工作和学习中&#xff0c;我们经常需要处理大量的PDF文件。有时候&#xff0c;我们可能希望将一个文件夹中的所有PDF文件进行一些特定的操作&#xff0c;例如去掉每个PDF文件的第一页。 为了解决这个问题&#xff0c…

网络篇06 | 应用层 自定义协议

网络篇06 | 应用层 自定义协议 01 固定协议设计&#xff08;简化版&#xff09;1&#xff09;总体设计2&#xff09;值设计 02 可变协议设计&#xff08;进阶版&#xff09;1&#xff09;固定头&#xff08;Fixed Header&#xff09;2&#xff09;可变头&#xff08;Variable H…

Git学习笔记(一)基础概念

场景描述 场景一&#xff1a;备份 在我们实际的开发场景中&#xff0c;一个完整的应用程序所需要的开发周期往往长达几个月甚至更久&#xff0c;假设我们的模块已经完成&#xff0c;就在即将Release之前的一瞬间&#xff0c;电脑突发故障&#xff0c;硬盘损坏&#xff0c;那么…

Swoole 实践篇之结合 WebRTC 实现音视频实时通信方案

原文首发链接&#xff1a;Swoole 实践篇之结合 WebRTC 实现音视频实时通信方案 大家好&#xff0c;我是码农先森。 引言 这次实现音视频实时通信的方案是基于 WebRTC 技术的&#xff0c;它是一种点对点的通信技术&#xff0c;通过浏览器之间建立对等连接&#xff0c;实现音频…

MDC搭配ttl

1.MDC 1.简介 MDC 介绍​ MDC&#xff08;Mapped Diagnostic Context&#xff0c;映射调试上下文&#xff09;是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能。MDC 可以看成是一个与当前线程绑定的Map&#xff0c;可以往其中添加键值对。MDC 中包含的内容可…

拼多多新店多久有生意

拼多多新店多久有生意 拼多多推广可以使用3an推客。3an推客&#xff08;CPS模式&#xff09;给商家提供的营销工具&#xff0c;由商家自主设置佣金比例&#xff0c;激励推广者去帮助商家推广商品链接&#xff0c;按最终有效交易金额支付佣金&#xff0c;不成交不扣费。是商家破…

c++IO

前言 大家好&#xff0c;我是jiantaoyab&#xff0c;本篇文章给大家介绍c中文件操作。 先回忆一下c语言文件操作 void Test_c_bin() {//二进制写ServerInfo info { "127.0.0.1", 8080 };FILE* fout fopen("test.bin", "wb");fwrite(&in…

微服务中Dubbo通俗易懂讲解及代码实现

当你在微服务架构中需要不同服务之间进行远程通信时&#xff0c;Dubbo是一个优秀的选择。Dubbo是一个高性能的Java RPC框架&#xff0c;它提供了服务注册、发现、调用、负载均衡等功能&#xff0c;使得微服务之间的通信变得简单而高效。 让我们来看一下Dubbo的通俗易懂的解释和…