行业知识
鸿蒙实战开发:【WLAN使用】
2026-11-15 23:19:57
来源:互联网转载
在eTS中WLAN的基本使用,包括禁用和启用WLAN、WLAN扫描和获取扫描结果、WLAN状态监听、WiFi连接状态监听、获取IP信息、获取国家码、判断设备是否支持WLAN相关特性。
样例展示
WLAN(仅对系统应用开放)
介绍
本示例通过[@ohos.wifiManager] 相关API实现wlan激活和关闭、扫描和连接WIFI等功能。
效果预览
| 连接wifi | 主页 | wifi详情 |
|---|---|---|
使用说明
- 启动应用后会判断WLAN是否激活,如果是激活状态,会扫描并展示可用WiFi列表,同时获取已连接WiFi信息并展示;
- 点击界面的Switch开关可以禁用和激活WLAN,界面会监听WLAN状态扫描可用WiFi列表,也会监听WiFi连接状态展示已连接WiFi;
- 点击可用WLAN列表中的WLAN信息,可以连接WiFi,如果是加密类型,会弹窗输入密码后连接;
- 点击首页右上角的关于图标,进入关于界面,展示获取的IP信息、国家码和支持WLAN相关特性信息。
具体实现
- wlan激活和关闭功能:点击首页的切换按钮,如果是打开,使用wifi.enableWifi()开启wifi;如果是关闭,则使用wifi.disconnect()断开wifi, 然后使用wifi.disableWifi()关闭wifi, 源码参考:[Index.ets] 。
/* * Copyright (c) 2022-2023 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */import wifi from '@ohos.wifiManager'import { AvailableWifi } from '../component/AvailableWifi'import Logger from '../model/Logger'import { TitleBar } from '../component/TitleBar'import { WifiModel, WifiType } from '../model/WifiModel'const TAG = 'Index'@Entry@Componentstruct Index { private wifiModel: WifiModel = new WifiModel() private linkedInfo: wifi.WifiLinkedInfo = null @State isLinked: boolean = false @State isSwitchOn: boolean = false // 扫描wifi async scan() { // 获取有关Wi-Fi连接的信息,存入linkedInfo await this.getLinkedInfo() // 不停地扫描wifi let result: Array = await this.wifiModel.getScanInfos() if (this.isSwitchOn) { AppStorage.SetOrCreate('wifiList', result) setTimeout(async () => { await this.scan() }, 3000) } } // 获取有关Wi-Fi连接的信息,存入linkedInfo async getLinkedInfo() { try { let wifiLinkedInfo = await wifi.getLinkedInfo() if (wifiLinkedInfo === null || wifiLinkedInfo.bssid === '') { this.isLinked = false this.linkedInfo = null return } this.isLinked = true this.linkedInfo = wifiLinkedInfo } catch (err) { Logger.info(`getLinkedInfo failed err is ${JSON.stringify(err)}`) } } // 监听wifi的变化 addListener() { // 连接状态改变时,修改连接信息 wifi.on('wifiConnectionChange', async state => { Logger.log(TAG, `wifiConnectionChange: ${state}`) await this.getLinkedInfo() }) // wifi状态改变时,先清空wifi列表,然后判断是否是开启状态,如果是就扫描 wifi.on('wifiStateChange', state => { Logger.log(TAG, `wifiStateLisener state: ${state}`) AppStorage.SetOrCreate('wifiList', []) if (state === 1) { // 1: wifi is enable, 0:wifi is disable this.scan() } }) } aboutToAppear() { // 如果wifi是开的,就记录下状态,然后扫描wifi,并获取连接信息 if (wifi.isWifiActive()) { Logger.log(TAG, 'wifi is active') this.isSwitchOn = true wifi.scan() this.scan() this.getLinkedInfo() } // 启动监听 this.addListener() } build() { Column() { TitleBar() Row() { Text($r('app.string.wlan')) .fontSize(22) .fontWeight(FontWeight.Bold) .height(40) Column() { Toggle({ type: ToggleType.Switch, isOn: this.isSwitchOn }) .id('switch') .onChange((isOn: boolean) => { Logger.log(`LSQ: wifi swtich is: ${isOn}`) AppStorage.SetOrCreate('wifiList', []) try { // 如果是打开状态,记录状态,打开网络,开始扫描 if (isOn) { this.isSwitchOn = true wifi.enableWifi() return } else { // 记录状态,断开网络禁用网络 this.isSwitchOn = false this.isLinked = false wifi.disconnect() wifi.disableWifi() } } catch (error) { Logger.error(TAG, `failed,code:${JSON.stringify(error.code)},message:${JSON.stringify(error.message)}`) } }) } } .width('100%') .padding({ left: 16, right: 16 }) if (this.isLinked && this.isSwitchOn) { Column() { Text($r('app.string.connected')) .fontSize(22) .width('100%') Row() { Text(this.linkedInfo.ssid) .fontSize(20) .fontColor(Color.Black) .layoutWeight(1) Text($r('app.string.connected')) .fontSize(18) .fontColor(Color.Black) } .width('100%') .padding(10) .margin({ left: 16, right: 16 }) .border({ radius: 15, color: Color.Gray, width: 1 }) .backgroundColor(Color.White) } .width('100%') .padding({ left: 16, right: 16 }) } if (this.isSwitchOn) { AvailableWifi({ linkedInfo: this.linkedInfo }) } } .width('100%') .height('100%') .backgroundColor($r('app.color.index_bg')) } aboutToDisappear() { wifi.off('wifiConnectionChange') wifi.off('wifiStateChange') }}- wifi的连接、扫描、获取详细信息等功能封装在WifiModel模块中,源码参考:[WifiModel.ets]。
/* * Copyright (c) 2022-2023 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */import prompt from '@ohos.promptAction'import wifi from '@ohos.wifiManager'import Logger from '../model/Logger'const TAG: string = 'WiFiModel'export type WifiType = { ssid: string, bssid: string, securityType: wifi.WifiSecurityType, rssi: number, band: number, frequency: number, timestamp: number}export class WifiModel { async getScanInfos(): Promise> { Logger.log(TAG, 'scanWifi begin') let wifiList: Array = [] let result: Array = [] try { result = await wifi.getScanResults() } catch (err) { Logger.log(TAG, `scan info err: ${JSON.stringify(err)}`) return wifiList } Logger.log(TAG, `scan info call back: ${result.length}`) for (var i = 0; iwifi的连接功能:点击wifi列表中加密的wifi,并在弹窗中输入密码后,会在[AvailableWifi.ets]连接wifi,如图中的连接wifi。
/* * Copyright (c) 2022-2023 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */import prompt from '@ohos.promptAction'import Logger from '../model/Logger'import { PswDialog } from '../component/PswDialog'import { WifiModel } from '../model/WifiModel'import { WifiView } from '../component/WifiView'import WifiDataSource from '../component/BasicDataSource'import wifi from '@ohos.wifiManager'const TAG = 'AvailableWiFi'let self = null@Componentexport struct AvailableWifi { private wifiModel = new WifiModel() private linkedInfo: wifi.WifiLinkedInfo = null @StorageLink('wifiList') @Watch('wifiListRefresh') wifiList: Array = [] @State wifiDataResource: WifiDataSource = new WifiDataSource(this.wifiList) @State scanInfo: wifi.WifiScanInfo = undefined private pswDialogController: CustomDialogController = new CustomDialogController({ builder: PswDialog({ scanInfo: $scanInfo, action: this.onAccept }), autoCancel: true }) build() { List() { ListItem() { Row() { Text($r('app.string.available_wlan')) .fontSize(22) .layoutWeight(1) } .id('validWlan') .width('100%') } LazyForEach(this.wifiDataResource, (item, index) => { ListItem() { WifiView({ wifi: item }) } .id(`Wifi${index}`) .onClick(() => { Logger.info(TAG, 'wifi click') this.scanInfo = item if (this.linkedInfo !== null && item.ssid === this.linkedInfo.ssid) { prompt.showToast({ message: 'this wifi is connected' }) return } if (item.securityType === 0 || item.securityType === 1) { this.wifiModel.connectNetwork(item, '') return } this.pswDialogController.open() }) }, item => JSON.stringify(item)) } .width('100%') .height('100%') .padding({ left: 16, right: 16 }) .layoutWeight(1) .pider({ strokeWidth: 1, color: Color.Gray, startMargin: 10, endMargin: 10 }) .margin({ top: 10 }) } onAccept(scanInfo, psw) { Logger.info(TAG, 'connect wifi') self.wifiModel.connectNetwork(scanInfo, psw) } aboutToAppear() { self = this } wifiListRefresh() { this.wifiDataResource['dataArray'] = this.wifiList this.wifiDataResource.notifyDataReload() }}wifi的扫描功能:进入[Index.ets]后就会间歇性的调用wifi.scan()开启扫描,然后通过WifiModel模块中的getScanInfos()调用wifi.getScanResults()来获取扫描的结果,如图中的主页。
/* * Copyright (c) 2022-2023 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */import wifi from '@ohos.wifiManager'import { AvailableWifi } from '../component/AvailableWifi'import Logger from '../model/Logger'import { TitleBar } from '../component/TitleBar'import { WifiModel, WifiType } from '../model/WifiModel'const TAG = 'Index'@Entry@Componentstruct Index { private wifiModel: WifiModel = new WifiModel() private linkedInfo: wifi.WifiLinkedInfo = null @State isLinked: boolean = false @State isSwitchOn: boolean = false // 扫描wifi async scan() { // 获取有关Wi-Fi连接的信息,存入linkedInfo await this.getLinkedInfo() // 不停地扫描wifi let result: Array = await this.wifiModel.getScanInfos() if (this.isSwitchOn) { AppStorage.SetOrCreate('wifiList', result) setTimeout(async () => { await this.scan() }, 3000) } } // 获取有关Wi-Fi连接的信息,存入linkedInfo async getLinkedInfo() { try { let wifiLinkedInfo = await wifi.getLinkedInfo() if (wifiLinkedInfo === null || wifiLinkedInfo.bssid === '') { this.isLinked = false this.linkedInfo = null return } this.isLinked = true this.linkedInfo = wifiLinkedInfo } catch (err) { Logger.info(`getLinkedInfo failed err is ${JSON.stringify(err)}`) } } // 监听wifi的变化 addListener() { // 连接状态改变时,修改连接信息 wifi.on('wifiConnectionChange', async state => { Logger.log(TAG, `wifiConnectionChange: ${state}`) await this.getLinkedInfo() }) // wifi状态改变时,先清空wifi列表,然后判断是否是开启状态,如果是就扫描 wifi.on('wifiStateChange', state => { Logger.log(TAG, `wifiStateLisener state: ${state}`) AppStorage.SetOrCreate('wifiList', []) if (state === 1) { // 1: wifi is enable, 0:wifi is disable this.scan() } }) } aboutToAppear() { // 如果wifi是开的,就记录下状态,然后扫描wifi,并获取连接信息 if (wifi.isWifiActive()) { Logger.log(TAG, 'wifi is active') this.isSwitchOn = true wifi.scan() this.scan() this.getLinkedInfo() } // 启动监听 this.addListener() } build() { Column() { TitleBar() Row() { Text($r('app.string.wlan')) .fontSize(22) .fontWeight(FontWeight.Bold) .height(40) Column() { Toggle({ type: ToggleType.Switch, isOn: this.isSwitchOn }) .id('switch') .onChange((isOn: boolean) => { Logger.log(`LSQ: wifi swtich is: ${isOn}`) AppStorage.SetOrCreate('wifiList', []) try { // 如果是打开状态,记录状态,打开网络,开始扫描 if (isOn) { this.isSwitchOn = true wifi.enableWifi() return } else { // 记录状态,断开网络禁用网络 this.isSwitchOn = false this.isLinked = false wifi.disconnect() wifi.disableWifi() } } catch (error) { Logger.error(TAG, `failed,code:${JSON.stringify(error.code)},message:${JSON.stringify(error.message)}`) } }) } } .width('100%') .padding({ left: 16, right: 16 }) if (this.isLinked && this.isSwitchOn) { Column() { Text($r('app.string.connected')) .fontSize(22) .width('100%') Row() { Text(this.linkedInfo.ssid) .fontSize(20) .fontColor(Color.Black) .layoutWeight(1) Text($r('app.string.connected')) .fontSize(18) .fontColor(Color.Black) } .width('100%') .padding(10) .margin({ left: 16, right: 16 }) .border({ radius: 15, color: Color.Gray, width: 1 }) .backgroundColor(Color.White) } .width('100%') .padding({ left: 16, right: 16 }) } if (this.isSwitchOn) { AvailableWifi({ linkedInfo: this.linkedInfo }) } } .width('100%') .height('100%') .backgroundColor($r('app.color.index_bg')) } aboutToDisappear() { wifi.off('wifiConnectionChange') wifi.off('wifiStateChange') }}获取wifi的详细信息:在[About.ets]中通过WiFiModel中的getIpInfo()、getCountryCode()、getFeatureSupport()分别调用wifi.getIpInfo()、wifi.getCountryCode()、wifi.isFeatureSupported()来获取对应信息。 如图中的wifi详情。
/* * Copyright (c) 2022-2023 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */import router from '@ohos.router'import { WifiModel } from '../model/WifiModel'import { InfoView } from '../component/InfoView'@Entry@Componentstruct About { private wifiModel: WifiModel = new WifiModel() build() { Column() { Row() { Image($r('app.media.ic_back')) .size({ width: 50, height: '100%' }) .objectFit(ImageFit.Contain) .onClick(() => { router.back() }) .id('back') Text($r('app.string.about')) .fontColor(Color.White) .fontSize(25) .layoutWeight(1) } .width('100%') .height('8%') .constraintSize({ minHeight: 50 }) .backgroundColor($r('app.color.button_color')) Scroll() { Column() { InfoView({ infoList: this.wifiModel.getIpInfo() }) InfoView({ infoList: this.wifiModel.getCountryCode() }) InfoView({ infoList: this.wifiModel.getFeatureSupport() }) } } .layoutWeight(1) } }}鸿蒙OpenHarmony知识已更新←前往
- wifi的连接、扫描、获取详细信息等功能封装在WifiModel模块中,源码参考:[WifiModel.ets]。
上一篇:小米怎么下载新马服务器?
下一篇:服务器的工作域在哪里?