Harmony OS WiFi编程——连接热点、创建热点

相关知识点

  • WiFi的工作模式
    • AP模式:热点模式,提供无线接入服务,允许其它无线设备接入,提供数据访问,一般的无线路由/网桥工作在该模式。
    • STA模式:类似于无线终端,本身并不接受其他设备的接入,它可以连接到AP,一般无线网卡即工作在该模式。
  • Harmony OS的WiFi相关API头文件位于foundation\communication\interfaces\kits\wifi_lite\wifiservice目录,该目录下有9个文件;
    • wifi_device.h中定义的是STA模式的主要接口,例如扫描其他热点、添加热点配置(热点名称、密码等)、连接其他热点;
    • wifi_hotspot.h中定义的是AP模式的主要接口,例如设置热点信息(热点名称、密码等)、查询连接的设备列表;
    • wifi_hotspot_config.h中定义了设置和获取当前工作在2.4G或者5G频段的接口SetBandGetBand
    • 另外6个文件中定义了上述接口相关的类型,例如扫描结果、热点配置、热点连接状态等;

STA模式编程指南

STA模式API

扫描WiFi热点

在Harmony OS上STA模式扫描其他WiFi热点,需要注意以下事项

  1. 功能相关接口都有WifiErrorCode类型的返回值:

    • 需要接收并判断返回值是否为WIFI_SUCCESS,用于确认是否调用成功;
    • 不为WIFI_SUCCESS表示失败,通过枚举值查找错误原因;
  2. EnableWifi接口使能STA模式之前:

    • 需要使用RegisterWifiEvent接口,向系统注册状态监听函数,用于接收状态通知,STA模式需要绑定如下两个回调函数;
      • OnWifiScanStateChanged用于绑定扫描状态监听函数,该回调函数有两个参数statesize
        • state表示扫描状态,取值为0和1,1表示扫描动作完成;编程时可以与WifiEventState枚举值的WIFI_STATE_NOT_AVALIABLEWIFI_STATE_AVALIABLE进行比较,避免魔法数字;
    • size表示扫描到的热点个数;
    • OnWifiConnectionChanged用于绑定WiFi连接状态监听函数,该回调函数有两个参数stateinfo
      • state表示WiFi连接状态,连接成功是WIFI_STATE_AVALIABLE值为1,连接失败时WIFI_STATE_NOT_AVALIABLE值为0;
      • info类型为WifiLinkedInfo*WifiLinkedInfo有多个成员,包括ssidbssidrssiconnStatedisconnectedReason
  3. Scan接口只是触发扫描动作,并不会等到扫描完成才返回;

  4. 调用Scan接口进行扫描之前,

    • 需要确保已经调用EnableWifi接口,并成功使能了STA模式;
  5. 扫描状态监听回调函数内,不能直接调用GetScanInfoList函数(否则会有运行时异常报错),正确用法:

    • 可以在状态更新回调函数中更新全局状态变量,另外一个线程中轮训状态变量,这种方式实现起来比较简单;但需要保证更新和查询操作的原子性(可以使用gcc内置原子操作函数),逻辑才是严格正确的;
    • 或者使用信号量进行通知,这种方式更好一些,更优雅;
  6. 扫描完成后要及时调用GetScanInfoList函数获取扫描结果;

    • 如果间隔时间太长(例如5秒以上),可能会无法获得上次扫描结果;
  7. GetScanResult函数有两个参数:

    • 第一个参数result指向用于存放结果的数组,需要大于等于WIFI_SCAN_HOTSPOT_LIMIT
    • 第二个参数size类型为指针是为了内部能够修改它的值,返回后size指向的值是实际搜索到的热点个数;
  • 调用GetScanResult函数前,第二个参数size指向的实际值不能为0,否则会包参数错误;
  1. DisableWifi关闭STA模式;

连接WiFi热点

在Harmony OS上STA模式连接其他WiFi热点,需要注意的事项和扫描WiFi热点类似,一下介绍差异的部分:

  1. 首先,需要使用RegisterWifiEvent接口,向系统注册状态监听函数,STA模式需要绑定两个回调;
  2. 然后,通过AddDeviceConfig接口,向系统添加热点配置,它有两个参数;
    • 第一个参数config,类型为const WifiDeviceConfig*,用于指定热点配置;
    • 第二个参数result,类型为int*,用于操作成功时返回netId
  3. 连接热点使用ConnectTo接口,他有一个参数;
    • netId,类型为int,应该使用AddDeviceConfig接口调用成功之后result参数得到值填充;
  4. ConnectTo是同步的,连接成功失败会通过返回值体现;
    • 同时,系统也会通过回调函数通知应用代码;
  5. 连接成功后,需要调用DHCP客户端,从热点获取IP地址;
    • struct netif* iface = netifapi_netif_find("wlan0"); 获取STA模式的网络接口
    • err_t netifapi_dhcp_start(struct netif*)接口,启动DHCP客户端;
  6. 断开热点使用Disconnect接口,无需参数,端口之前需要:
    • err_t netifapi_dhcp_stop(struct netif*)接口,停止DHCP客户端;
  7. 删除热点配置使用RemoveDevice,参数和ConnectTo类似,
    • 需要使用AddDeviceConfig接口调用成功之后result参数得到值填充;

AP模式编程指南

AP模式API接口

创建WiFi热点

在Harmony OS上创建WiFi热点,通用有一些事项需要注意:

  1. 首先,需要使用RegisterWifiEvent接口,向系统注册扫描状态监听函数,用于接收扫描状态通知,AP模式需要绑定三个函数;
    • OnHotspotStaJoin回调函数,其他设备连上当前热点时会被调用,参数StationInfo* info,其中包含macAddressdisconnectedReason
    • OnHotspotStaLeave回调函数,其他设备断开当前热点时会被调用,参数StationInfo* info
    • OnHotspotStateChanged回调函数,当热点本身状态变化时会被调用,参数int state表示热点状态;
  2. 然后,通过SetHotspotConfig接口,向系统设置当前热点配置信息;
  3. 是用EnableHotspot接口,开启热点,无需参数;
  4. 热点开启成功之后,需要启动DHCP服务端,Hi3861上使用如下SDK接口;
    • g_iface = netifapi_netif_find("ap0");,获取AP模式的网口
    • 使用netifapi_netif_set_addr接口设置热点本身的IP地址、网关、子网掩码;
    • 使用netifapi_dhcps_start接口启动DHCP服务端;
    • 使用netifapi_dhcps_stop接口停止DHCP服务端;
  5. 使用DisableHotspot接口关闭热点;
  6. 使用UnRegisterWifiEvent接口解除事件监听;

如何编译

有两种方法可以编译此目录下的样例程序:

  1. 前两章中的方法——将当前目录下的*.c文件和BUILD.gn拷贝到openharmony源码的applications\sample\wifi-iot\app\iothardware目录下;

    1. 再修改openharmony源码的applications\sample\wifi-iot\app\BUILD.gn文件,将其中的 features 改为:iothardware:wifi_demo
    2. 再修改applications\sample\wifi-iot\app\iothardware\BUILD.gn文件,决定需要编译哪个.c文件;
    3. 在openharmony源码顶层目录执行:python build.py wifiiot
  2. 可以将本仓整体拷贝到openharmony源码树下,和applications同级;

    1. 修改openharmony源码的build\lite\product\wifiiot.json文件,将其中的:

      //applications/sample/wifi-iot/app替换为://HarmonyOS-IoT-Application-Development:app

    2. 在openharmony源码顶层目录执行:python build.py wifiiot

为了能让大家更好的学习鸿蒙(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.mzph.cn/news/771408.shtml

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

相关文章

济南市瞪铃企业申报流程

(一)组织申报。各街道、产业办组织对符合条件的企业进行申报,由所属街道、产业办签字盖章推荐,通过资料审核后完成申报。 (二)项目初审。街道产业办负责对申报资料的形式要件进行审查初审,并由…

Linux:部署达梦数据库DM8(1)

0.安装DM8数据库安装包 产品下载-达梦数据 (dameng.com)https://www.dameng.com/list_103.html进入官方网站下载centos7的安装包,本章使用centos7进行部署,提前关闭好防火墙和selinux 建议你的系统运行内存为:2G或以上 1.部署基础环境 先安…

众创空间、孵化器、加速器!2024年度陕西省科技企业孵化器认定类型条件、奖补

2024年度陕西省科技企业孵化器认定类型 科技企业孵化载体是众创空间、科技企业孵化器、科技企业加速器等多种形态孵化载体的统称(以下简称孵化载体),是科技企业孵化链条中的重要组成部分,是引导各类人才创新创业、满足企业不同成…

spring核心组件

一、spring core组件:(spring核心容器) spring core提供spring框架的基本功能。包含了众多关键类,定义了资源的访问方式。 二、spring bean组件:实体对象 bean组件在spring的org.springframework.beans包下&#xff0c…

现在的市场对 C++ 的需求大吗?

先说结论:需求还是很大,但是没有什么初级程序员能干的岗位。 游戏引擎,存储,推荐引擎,infra,各种各样的性能敏感场景。 在开始前我分享下我的经历,我刚入行时遇到一个好公司和师父,…

移位寄存器的工艺结构原理及选型参数总结

🏡《总目录》 目录 1,概述2,工作原理2.1,逻辑左移2.2,逻辑右移3,结构特点3.1,基本单元3.2,串行输入/输出3.3,并行输入/输出3.4,移位操作3.5,循环或非循环4,工艺流程4.1,确定设计需求

在 nginx 中使用 JavaScript

前些日子尝试了在 nginx 中写 JavaScript 的效果。考虑到 JavaScript 作为编程语言不是强需求,在nginx生态上还是 lua 独大,并且还有 openresty 这样一直强力输血,大部分应用场景都能找到参考的解决方案。 插件生态来说,github 上…

USB Network Native Driver for ESXi 8.0U1 (v1.12) and 8.0U2 (v1.13)

因为 VMware 在被 Broadcom 收购后关闭了 Flings 网站,此社区版驱动文档迁移到了 USB Network Native Driver for ESXi Documentation - VMware Technology Network VMTN 之前发布的8.0U1 和 8.0U2 的下载链接暂时无法从 VMware 官网获得,不过有网友事先…

在线教程 | 一键启动 Sora 开源平替,俘获 45 万 AI 开发者

1888 年,爱迪生提交了一项名为「活动电影放映机」的专利,该设备首次实现连续播放静态照片,形成类似动态画面的效果,由此拉开了视频发展的序幕。 回顾历史,视频经历了从无到有、从黑白到彩色、从模拟信号到数字信号的迭…

Chrome 插件各模块之间的消息传递

Chrome 插件各模块之间的消息传递 一、消息传递 1. 消息传递分类 Chrome 插件的 Action、Background 和 content_script 三个模块之间的信息传输插件和插件之间的信息传输网页向插件进行信息传输与原生应用进行消息传递 2. 消息传递 API runtime API runtime.sendMessage(…

HTML作业2

作业1: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>table…

【实验室塑料器皿】耐受强酸强碱特氟龙量具PFA量筒量杯适用于半导体新材料

PFA量筒为上下等粗的直筒状&#xff0c;特氟龙量杯是上大下小的圆台形&#xff0c;底座均有宽台设计&#xff0c;保证稳定性&#xff0c;两者均可在实验室中作为定量量取液体的量具&#xff0c;上沿一侧有弧嘴设计&#xff0c;便于流畅地倾倒液体。 规格参考&#xff1a;5ml、…

P3919 【模板】可持久化线段树 1(可持久化数组)

题目描述 如题&#xff0c;你需要维护这样的一个长度为 N 的数组&#xff0c;支持如下几种操作 在某个历史版本上修改某一个位置上的值 访问某个历史版本上的某一位置的值 此外&#xff0c;每进行一次操作&#xff08;对于操作2&#xff0c;即为生成一个完全一样的版本&…

需求工程、需求规格说明的具体方式以及实践

需求规格说明&#xff08;SRS, Software Requirements Specification&#xff09;是需求工程过程中的关键产出之一。它详细描述了软件系统必须满足的功能和非功能需求&#xff0c;为项目团队提供了清晰的开发指南。一个好的需求规格说明书不仅能够指导开发和测试工作&#xff0…

curl在window及linux中的使用及区别

目录 内容介绍 测试一&#xff08;GET,application/json&#xff09; 归纳 测试二&#xff08;GET,x-www-form-urlencoded&#xff09; 归纳 测试三&#xff08;POST,FORM-DATA&#xff09; 归纳 测试四&#xff08;POST,x-www-form-urlencoded&#xff09; 归纳 总结…

yolov5交互式界面 V5.0-6.0版本通用界面-yolo-pyqt-gui(通用界面制作+代码)

往期热门博客项目回顾&#xff1a; 计算机视觉项目大集合 改进的yolo目标检测-测距测速 路径规划算法 图像去雨去雾目标检测测距项目 交通标志识别项目 yolo系列-重磅yolov9界面-最新的yolo 姿态识别-3d姿态识别 深度学习小白学习路线 yolo GUI OYQT界面 YOLOv5…

pycharm连接服务器运行时找不到文件或目录

选择你要修改的python interpreter 进入下图界面&#xff0c;默认选择的是Deployment configuration,需要将其改成SSH。 再将上图python interpreter path和pycharm helpers path 配置成服务器上相应地址即可。 over

校园跑腿小程序源码系统多校园版 跑腿达人入驻接单 带完整的安装代码包以及系统部署教程

在数字化时代的浪潮中&#xff0c;校园生活的便捷性和高效性成为了广大师生的共同追求。为了满足这一需求&#xff0c;罗峰给大家分享一款适用于多校园的跑腿小程序源码系统——校园跑腿小程序源码系统多校园版。该系统不仅提供了完整的安装代码包&#xff0c;还附带了详尽的系…

# 14 React 自定义Hook详解

自定义 Hook 是一个函数&#xff0c;其名称以 “use” 开头&#xff0c;函数内部可以调用其他 Hook。自定义 Hook 是一个函数&#xff0c;其名称以 “use” 开头&#xff0c;函数内部可以调用其他 Hook。下面是几个自定义 Hook 的例子以及需要注意的知识&#xff1a; 1. 使用状…

用指针处理链表(一)

1链表概述 链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。我们知道,用数组存放数据时,必须事先定义固定的长度(即元素个数)。比如,有的班级有100人&#xff0c;而有的班只有30人&#xff0c;如果要用同一个数组先后存放不同班级的学生数据,则必须定义长度…