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

2023-11-01

本节主要介绍如何在HiSpark WiFi IoT套件上使用Hamony 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个文件中定义了上述接口相关的类型,例如扫描结果、热点配置、热点连接状态等;

鸿蒙WiFi API参考:https://gitee.com/openharmony/docs/blob/master/api/api-LinkIoT/Wifiservice.md

想要简单易用WiFi接口,可以使用我们封装的:easy_wifi: 让WiFi IoT套件的WiFi功能更容易使用

STA模式编程指南

STA模式API

API 功能说明
WifiErrorCode EnableWifi(void); 开启STA
WifiErrorCode DisableWifi(void); 关闭STA
int IsWifiActive(void); 查询STA是否已开启
WifiErrorCode Scan(void); 触发扫描
WifiErrorCode GetScanInfoList(WifiScanInfo* result, unsigned int* size); 获取扫描结果
WifiErrorCode AddDeviceConfig(const WifiDeviceConfig* config, int* result); 添加热点配置,成功会通过result传出netId
WifiErrorCode GetDeviceConfigs(WifiDeviceConfig* result, unsigned int* size); 获取本机所有热点配置
WifiErrorCode RemoveDevice(int networkId); 删除热点配置
WifiErrorCode ConnectTo(int networkId); 连接到热点
WifiErrorCode Disconnect(void); 断开热点连接
WifiErrorCode GetLinkedInfo(WifiLinkedInfo* result); 获取当前连接热点信息
WifiErrorCode RegisterWifiEvent(WifiEvent* event); 注册事件监听
WifiErrorCode UnRegisterWifiEvent(const WifiEvent* event); 解除事件监听
WifiErrorCode GetDeviceMacAddress(unsigned char* result); 获取Mac地址
WifiErrorCode AdvanceScan(WifiScanParams *params); 高级搜索

扫描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接口

API 说明
WifiErrorCode EnableHotspot(void); 打开AP模式
WifiErrorCode DisableHotspot(void); 关闭AP模式
WifiErrorCode SetHotspotConfig(const HotspotConfig* config); 设置当前热点配置参数
WifiErrorCode GetHotspotConfig(HotspotConfig* result); 获取当前热点配置参数
int IsHotspotActive(void); 查询AP是否已开启
WifiErrorCode GetStationList(StationInfo* result, unsigned int* size); 获取接入的设备列表
int GetSignalLevel(int rssi, int band); 获取信号强度等级
WifiErrorCode SetBand(int band); 设置当前频段
WifiErrorCode GetBand(int* result); 获取当前频段

创建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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Harmony OS WiFi编程——连接热点、创建热点 的相关文章

  • 创建vue脚手架时,npmERR报错的解决方法

    创建vue脚手架 1 我是刚学vue的小白 在安装vue脚手架的时候 遇到了安装时出现的问题 查阅了我几个小时 苦苦在挣扎着 确实难受 想借此机会把它给记录下来 希望能帮助更多的初学者解决疑惑 2 我在安装时遇到了这个问题 当时我一直在网上
  • Ubuntu安装nvidia显卡驱动,CUDA与CUDNN

    本文提到的文件可以在这里下载 链接 https pan baidu com s 1cfo0xqrXoK3pA4pHUN3Mcw 提取码 kdjq 目录 1 安装nvidia显卡驱动 2 安装CUDA 3 安装CUDNN 1 安装nvidia
  • [错误解决] paramiko.ssh_exception.SSHException: Error reading SSH protocol banner

    最近项目中需配置sftp上传下载 配置好环境后连接报错 报错信息如图 paramiko ssh exception SSHException Error reading SSH protocol banner 解决方式一 设置banner
  • 域名解析的查看

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 目录 一 配置域名解析 DNS与Host 1 hosts文件 2 配置DNS 3 Host表解析与DNS机械的次序由文件 etc host conf决定 Hosts优先于DN

随机推荐

  • 图的广度优先遍历 + 拓扑排序(笔记)

    广度优先遍历 模板题 广度优先遍历的大体思路就是 每次扩展当前一步能到达的未标记的点加入队列中并标记 每次也从队列中拿出一个点进行扩展 该题是让求最权值都相等的短路我们就可以利用广度优先搜索来求 include
  • 数据仓库理论知识

    一 数据仓库与数据集市 可以简单理解为数据仓库是面向整个企业 而数据集市是面向某个部门的 数据集市的数据来自数据仓库 当然 如果没有数据仓库 数据集市的数据也可以直接取自业务数据库 1 离线与实时 离线数仓 从业务上看 对已知范围的数据定时
  • linux 动态库 段错误,dlopen加载so动态链接库出现段错误的问题

    so库中暴露出来的函数 写在某基类头文件中 大体如下 ifdef cplusplus extern C endif Object construct return new Object void destroy Object object
  • Linux操作系统基础知识学习

    Q1 什么是GNU Linux与GNU有什么关系 A 1 GNU是GNU is Not Unix的递归缩写 是自由软件基金会 Free Software Foundation FSF 的一个项目 该项目已经开发了许多高质量的编程工具 包括e
  • STM32串口调试一直打印 00 00

    在STM32串口调试过程中 通过printf函数往串口打印英文字母 串口助手却一直收到 00 凭直觉 这种情况一般都是时钟没配置好 但是查代码很难找到原因 经过反复查找 发现是STM32CubeMX中时钟源选择错误 就是下面这个地方 切记一
  • Go 语言运行时环境变量快速导览

    原文 http dave cheney net 2015 11 29 a whirlwind tour of gos runtime environment variables Go 语言运行时环境变量快速导览 介绍 Go Runtime除
  • ubuntu 打包deb并带有安装目录

    0 简介 当在ubuntu下开发了一个工程 期望以deb包的形式发布出去的时候 会涉及到打包操作 基本指令是 dpkg b
  • docker registry2 仓库搭建与使用

    docker registry2 仓库搭建与使用 docker pull registry 1 docker io distribution registry 2 1 1 以TLS证书认证启动docker registry2 产生证书 mk
  • hibernate关联关系

    前言 今天要分享的知识是hibernate框架的关联关系 码字不易 点个赞 转载请说明 开发工具 eclipse 目录 一 一对多的配置 二 懒加载 1 定义 懒加载可以这样理解 只加载某一项东西 其他的东西不会加载 2 操作 在我们进行项
  • 问题解决:WSL2 中进行 apt-get-update 失败

    WSL2 子系统在一些操作上还是很方便的 但因为有些配置和 Windows 共用的原因 总会出现这样那样的问题 比如今天安装 Redis 的时候需要提前进行包更新 结果却报错 Failed to fetch 这个问题的出现我首先是考虑国外源
  • Error: JAVA_HOME is not set

    启动Hadoop时显示这句话 解决方法 通过echo JAVA HOME找到java安装目录 在hadoop的配置目录etc hadoop中 我的是 usr local hadoop etc hadoop 修改hadoop env sh配置
  • jenkins - Manage and Assign Roles

    Role Strategy Plugin 插件 针对多个project进行权限控制 访问 上几张图 希望你能看明白 哈哈 1 png 710dba0dgy1fkgqp3cze1j219g0kmn24 jpg 710dba0dgy1fkgqp
  • MySQL查询语句in子查询的优化

    项目中有需要 使用MySQL的in子查询 查询符合in子查询集合中条件的数据 但是没想到的是 MySQL的in子查询会如此的慢 让人无法接收 于是上网搜索解决办法 下面记录下 一 原始in子查询 SELECT FROM basic zdjb
  • Ubuntu系统上安装WPS

    前言 在Ubuntu系统下 想使用WPS的功能 觉得用起来更加方便 所以在此记录一下安装的步骤 记录两种安装方法 方法一 Ubuntu Software中搜索WPS 如图所示 在Ubuntu Software中搜索WPS 可能需要稍等一会再
  • python使用局部敏感性哈希算法,在海量数据中查询相似序列

    文章目录 一 原生python实现 二 第三方库datasketch使用 1 官方示例 2 LSH算法 3 MinHashLSHForest 局部敏感性哈希是指 相似的哈希具有相似的原始序列 整体思路 首先将数据装在不同的桶里 通过桶之间的
  • 2023国赛数学建模思路 - 案例:随机森林

    文章目录 1 什么是随机森林 2 随机深林构造流程 3 随机森林的优缺点 3 1 优点 3 2 缺点 4 随机深林算法实现 建模资料 0 赛题思路 赛题出来以后第一时间在CSDN分享 https blog csdn net dc sinor
  • 隐私计算S2赛季-谁是真正的王者

    去年至今 隐私计算大约经历了如火如荼的一年 身为局中人 看穿居中事 道尽居中话 为的无非是让更多的来了解这个比较细分的AI领域 秋天本是硕果累累的丰收季 隐私计算这个行业算是金秋吗 一喜一悲 一喜为百花齐放 我所知道在布 挂 局 钩 隐私计
  • VL53L0X调试总结

    最近调VL53L0X花了不少时间 特总结下 https www st com content st com en search html q vl53l t products page 1 VL53L0X测距2m VL53L1X测距4m 支
  • networkx 中文学习手册

    文章目录 创建图表 节点 边 检查图的元素 从图中删除元素 使用图构造函数 什么用作节点和边 访问边和邻居 向图 节点和边添加属性 图形属性 节点属性 边缘属性 多图 图生成器和图操作 1 应用经典的图操作 例如 2 使用对经典小图之一的调
  • Harmony OS WiFi编程——连接热点、创建热点

    本节主要介绍如何在HiSpark WiFi IoT套件上使用Hamony OS的WiFi相关编程接口 相关知识点 WiFi的工作模式 AP模式 热点模式 提供无线接入服务 允许其它无线设备接入 提供数据访问 一般的无线路由 网桥工作在该模式