一、WLAN 簡介
無線局域網(wǎng)(Wireless Local Area Networks,WLAN),是通過無線電、紅外光信號或者其他技術(shù)發(fā)送和接收數(shù)據(jù)的局域網(wǎng),用戶可以通過 WLAN 實現(xiàn)結(jié)點之間無物理連接的網(wǎng)絡(luò)通訊。常用于用戶攜帶可移動終端的辦公、公眾環(huán)境中。 HarmonyOS WLAN 服務(wù)系統(tǒng)為用戶提供 WLAN 基礎(chǔ)功能、P2P(peer-to-peer)功能和 WLAN 消息通知的相應(yīng)服務(wù),讓應(yīng)用可以通過 WLAN 和其他設(shè)備互聯(lián)互通。 本開發(fā)指南提供多個開發(fā)場景的指導,涉及多個 API 接口的調(diào)用。在調(diào)用 API 前,應(yīng)用需要先申請對應(yīng)的訪問權(quán)限。
二、WLAN 基礎(chǔ)功能
① 應(yīng)用場景
獲取 WLAN 狀態(tài),查詢 WLAN 是否打開。 發(fā)起掃描并獲取掃描結(jié)果。 獲取連接態(tài)詳細信息,包括連接信息、IP 信息等。 獲取設(shè)備國家碼。 獲取設(shè)備是否支持指定的能力。
② API 說明
WLAN 基礎(chǔ)功能由 WifiDevice 提供,其接口說明如下:
接口名描述所需權(quán)限 getInstance(Context context)獲取WLAN功能管理對象實例,通過該實例調(diào)用WLAN基本功能APINA isWifiActive()獲取當前WLAN打開狀態(tài)ohos.permission.GET_WIFI_INFO scan()發(fā)起WLAN掃描ohos.permission.SET_WIFI_INFO ohos.permission.LOCATION getScanInfoList()獲取上次掃描結(jié)果ohos.permission.GET_WIFI_INFO ohos.permission.LOCATION isConnected?()獲取當前WLAN連接狀態(tài)ohos.permission.GET_WIFI_INFO getLinkedInfo()獲取當前的WLAN連接信息ohos.permission.GET_WIFI_INFO getIpInfo()獲取當前連接的WLAN IP信息ohos.permission.GET_WIFI_INFO getSignalLevel(int rssi, int band)通過RSSI與頻段計算信號格數(shù)NA getCountryCode()獲取設(shè)備的國家碼ohos.permission.LOCATION ohos.permission.GET_WIFI_INFO isFeatureSupported(long featureId)獲取設(shè)備是否支持指定的特性ohos.permission.GET_WIFI_INFO
③ 獲取 WLAN 狀態(tài)
調(diào)用 WifiDevice 的 getInstance?(Context context) 接口,獲取 WifiDevice 實例,用于管理本機 WLAN 操作。 調(diào)用 isWifiActive?() 接口查詢 WLAN 是否打開。
// 獲取WLAN管理對象WifiDevice wifiDevice = WifiDevice.getInstance(context);// 調(diào)用獲取WLAN開關(guān)狀態(tài)接口boolean isWifiActive = wifiDevice.isWifiActive(); // 若WLAN打開,則返回true,否則返回false
④ 發(fā)起掃描并獲取結(jié)果
調(diào)用 WifiDevice的getInstance?(Context context) 接口,獲取 WifiDevice 實例,用于管理本機 WLAN 操作。 調(diào)用 scan?() 接口發(fā)起掃描。 調(diào)用 getScanInfoList?() 接口獲取掃描結(jié)果。
// 獲取WLAN管理對象WifiDevice wifiDevice = WifiDevice.getInstance(context);// 調(diào)用WLAN掃描接口boolean isScanSuccess = wifiDevice.scan();// 調(diào)用獲取掃描結(jié)果List
< WifiScanInfo> scanInfos = wifiDevice.getScanInfoList();
⑤ 獲取連接態(tài)詳細信息
調(diào)用 WifiDevice 的 getInstance?(Context context) 接口,獲取 WifiDevice 實例,用于管理本機 WLAN 操作。 調(diào)用 isConnected?() 接口獲取當前連接狀態(tài)。 調(diào)用 getLinkedInfo() 接口獲取連接信息。 調(diào)用 getIpInfo() 接口獲取IP信息。
// 獲取WLAN管理對象WifiDevice wifiDevice = WifiDevice.getInstance(context);// 調(diào)用WLAN連接狀態(tài)接口,確定當前設(shè)備是否連接WLANboolean isConnected = wifiDevice.isConnected();if (isConnected) {// 獲取WLAN連接信息Optional
< WifiLinkedInfo> linkedInfo = wifiDevice.getLinkedInfo();// 獲取連接信息中的SSIDString ssid = linkedInfo.get().getSsid();// 獲取WLAN的IP信息Optional
< IpInfo> ipInfo = wifiDevice.getIpInfo();// 獲取IP信息中的IP地址與網(wǎng)關(guān)int ipAddress = ipInfo.get().getIpAddress();int gateway = ipInfo.get().getGateway();}
⑥ 獲取設(shè)備國家碼
調(diào)用 WifiDevice 的 getInstance?(Context context)接口,獲取 WifiDevice 實例,用于管理本機 WLAN 操作。 調(diào)用 getCountryCode?() 接口獲取設(shè)備的國家碼。
// 獲取WLAN管理對象WifiDevice wifiDevice = WifiDevice.getInstance(context);// 獲取當前設(shè)備的國家碼String countryCode = wifiDevice.getCountryCode();
⑦ 判斷設(shè)備是否支持指定的能力
調(diào)用 WifiDevice 的 getInstance?(Context context) 接口,獲取 WifiDevice 實例,用于管理本機 WLAN 操作。 調(diào)用 isFeatureSupported?(long featureId) 接口判斷設(shè)備是否支持指定的能力。
// 獲取WLAN管理對象WifiDevice wifiDevice = WifiDevice.getInstance(context);// 獲取當前設(shè)備是否支持指定的能力boolean isSupportInfra = wifiDevice.isFeatureSupported(WifiUtils.WIFI_FEATURE_INFRA);isSupportInfra5g = wifiDevice.isFeatureSupported(WifiUtils.WIFI_FEATURE_INFRA_5G);isSupportPasspoint = wifiDevice.isFeatureSupported(WifiUtils.WIFI_FEATURE_PASSPOINT);isSupportP2p = wifiDevice.isFeatureSupported(WifiUtils.WIFI_FEATURE_P2P);isSupportHotspot = wifiDevice.isFeatureSupported(WifiUtils.WIFI_FEATURE_MOBILE_HOTSPOT);isSupportAware = wifiDevice.isFeatureSupported(WifiUtils.WIFI_FEATURE_AWARE);isSupportApSta = wifiDevice.isFeatureSupported(WifiUtils.WIFI_FEATURE_AP_STA);isSupportWpa3Sae = wifiDevice.isFeatureSupported(WifiUtils.WIFI_FEATURE_WPA3_SAE);isSupportWpa3SuiteB = wifiDevice.isFeatureSupported(WifiUtils.WIFI_FEATURE_WPA3_SUITE_B);isSupportOwe = wifiDevice.isFeatureSupported(WifiUtils.WIFI_FEATURE_OWE);
三、不信任熱點配置
① 應(yīng)用場景
應(yīng)用可以添加指定的熱點,其選網(wǎng)優(yōu)先級低于已保存熱點。如果掃描后判斷該熱點為最合適熱點,自動連接該熱點。 應(yīng)用或者其他模塊可以通過接口完成以下功能:
② API 說明
WifiDevice 提供 WLAN 的不信任熱點配置功能,其接口說明如下:
接口名描述所需權(quán)限 getInstance(Context context)獲取WLAN功能管理對象實例,通過該實例調(diào)用不信任熱點配置的APINA addUntrustedConfig?(WifiDeviceConfig config)添加不信任熱點配置,選網(wǎng)優(yōu)先級低于已保存熱點ohos.permission.SET_WIFI_INFO removeUntrustedConfig(WifiDeviceConfig config)刪除不信任熱點配置ohos.permission.SET_WIFI_INFO
③ 添加不信任熱點配置
調(diào)用 WifiDevice 的 getInstance?(Context context) 接口,獲取 WifiDevice 實例,用于管理本機 WLAN 操作。 調(diào)用 addUntrustedConfig(WifiDeviceConfig config) 接口,設(shè)置三方添加的不信任配置。
// 獲取WLAN管理對象WifiDevice wifiDevice = WifiDevice.getInstance(context);// 設(shè)置三方添加的不信任配置WifiDeviceConfig config = new WifiDeviceConfig();config.setSsid("untrusted-exist");config.setPreSharedKey("123456789");config.setHiddenSsid(false);config.setSecurityType(WifiSecurity.PSK);boolean isSuccess = wifiDevice.addUntrustedConfig(config);
④ 刪除不信任熱點配置
調(diào)用 WifiDevice 的 getInstance?(Context context) 接口,獲取 WifiDevice 實例,用于管理本機 WLAN 操作。 調(diào)用 removeUntrustedConfig(WifiDeviceConfig config) 接口,刪除三方添加的不信任配置。
// 獲取WLAN管理對象WifiDevice wifiDevice = WifiDevice.getInstance(context);// 設(shè)置刪除三方添加的不信任配置WifiDeviceConfig config = new WifiDeviceConfig();config.setSsid("untrusted-exist");config.setPreSharedKey("123456789");config.setHiddenSsid(false);config.setSecurityType(WifiSecurity.PSK);boolean isSuccess = wifiDevice.removeUntrustedConfig(config);
四、P2P 功能
① 應(yīng)用場景
WLAN P2P 功能用于設(shè)備與設(shè)備之間的點對點數(shù)據(jù)傳輸。 應(yīng)用可以通過接口完成以下功能:
② API 說明
WifiP2pController 提供 WLAN P2P 功能,接口說明如下:
接口名描述所需權(quán)限 init(EventRunner eventRunner, WifiP2pCallback callback)初始化P2P的信使,當且僅當信使被成功初始化,P2P的其他功能才可以正常使用ohos.permission.GET_WIFI_INFO ohos.permission.SET_WIFI_INFO discoverDevices(WifiP2pCallback callback)搜索附近可用的P2P設(shè)備ohos.permission.GET_WIFI_INFO stopDeviceDiscovery(WifiP2pCallback callback)停止搜索附近的P2P設(shè)備ohos.permission.GET_WIFI_INFO createGroup(WifiP2pConfig wifiP2pConfig, WifiP2pCallback callback)建立P2P群組ohos.permission.GET_WIFI_INFO removeGroup(WifiP2pCallback callback)移除P2P群組ohos.permission.GET_WIFI_INFO requestP2pInfo(int requestType, WifiP2pCallback callback)請求P2P相關(guān)信息,如群組信息、連接信息、設(shè)備信息等ohos.permission.GET_WIFI_INFO connect(WifiP2pConfig wifiP2pConfig, WifiP2pCallback callback)向指定設(shè)備發(fā)起連接ohos.permission.GET_WIFI_INFO cancelConnect?(WifiP2pCallback callback)取消向指定設(shè)備發(fā)起的連接ohos.permission.GET_WIFI_INFO
③ 啟動與停止 P2P 搜索
調(diào)用 WifiP2pController 的 getInstance?(Context context) 接口,獲取 P2P 控制器實例,用于管理 P2P 操作。 調(diào)用 init(EventRunner eventRunner, WifiP2pCallback callback) 初始化 P2P 控制器實例。 發(fā)起 P2P 搜索。 獲取 P2P 搜索回調(diào)信息。 停止 P2P 搜索。
try {// 獲取P2P管理對象WifiP2pController wifiP2pController = WifiP2pController.getInstance(this);// 初始化P2P管理對象,用于建立P2P信使等行為wifiP2pController.init(EventRunner.create(true), null);// 創(chuàng)建P2P回調(diào)對象P2pDiscoverCallBack p2pDiscoverCallBack = new P2pDiscoverCallBack();// 發(fā)起P2P搜索wifiP2pController.discoverDevices(p2pDiscoverCallBack);// 停止P2P搜索wifiP2pController.stopDeviceDiscovery(p2pDiscoverCallBack);} catch (RemoteException re) {HiLog.error(LABEL, "exception happened.");}// 獲取P2P啟動與停止搜索的回調(diào)信息(失敗或者成功)private class P2pDiscoverCallBack extends WifiP2pCallback {@Overridepublic void eventExecFail(int reason) {HiLog.warn(LABEL, "discoverDevices eventExecFail reason : %{public}d", reason);}@Overridepublic void eventExecOk() {HiLog.info(LABEL, "discoverDevices eventExecOk");}}
④ 創(chuàng)建與移除群組
調(diào)用 WifiP2pController的getInstance?(Context context) 接口,獲取 P2P 控制器實例,用于管理 P2P 操作。 調(diào)用 init(EventRunner eventRunner, WifiP2pCallback callback) 初始化 P2P 控制器實例。 創(chuàng)建 P2P 群組。 移除 P2P 群組。
try {// 獲取P2P管理對象WifiP2pController wifiP2pController = WifiP2pController.getInstance(this);// 初始化P2P管理對象,用于建立P2P信使等行為wifiP2pController.init(EventRunner.create(true), null);// 創(chuàng)建用于P2P建組需要的配置WifiP2pConfig wifiP2pConfig = new WifiP2pConfig("DEFAULT_GROUP_NAME", "DEFAULT_PASSPHRASE");wifiP2pConfig.setDeviceAddress("02:02:02:02:03:04");wifiP2pConfig.setGroupOwnerBand(0);// 創(chuàng)建P2P回調(diào)對象P2pCreateGroupCallBack p2pCreateGroupCallBack = new P2pCreateGroupCallBack();// 創(chuàng)建P2P群組wifiP2pController.createGroup(wifiP2pConfig, p2pCreateGroupCallBack);// 移除P2P群組wifiP2pController.removeGroup(p2pCreateGroupCallBack);} catch (RemoteException re) {HiLog.error(LABEL, "exception happened.");}private class P2pCreateGroupCallBack extends WifiP2pCallback {@Overridepublic void eventExecFail(int reason) {HiLog.warn(LABEL, "CreateGroup eventExecFail reason : %{public}d", reason);}@Overridepublic void eventExecOk() {HiLog.info(LABEL, "CreateGroup eventExecOk");}}
⑤ 發(fā)起 P2P 連接
調(diào)用 WifiP2pController的getInstance?(Context context) 接口,獲取 P2P 控制器實例,用于管理 P2P 操作。 調(diào)用 init(EventRunner eventRunner, WifiP2pCallback callback) 初始化 P2P 控制器實例。 調(diào)用 requestP2pInfo() 查詢 P2P 可用設(shè)備信息。 根據(jù)場景不同,從可用設(shè)備信息中選擇目標設(shè)備。 調(diào)用 connect 接口發(fā)起連接。
try {// 獲取P2P管理對象WifiP2pController wifiP2pController = WifiP2pController.getInstance(this);// 初始化P2P管理對象,用于建立P2P信使等行為wifiP2pController.init(EventRunner.create(true), null);// 查詢可用P2P設(shè)備信息,通過回調(diào)獲取P2P設(shè)備信息P2pRequestPeersCallBack p2pRequestPeersCallBack = new P2pRequestPeersCallBack();wifiP2pController.requestP2pInfo(WifiP2pController.DEVICE_LIST_REQUEST, p2pRequestPeersCallBack);} catch (RemoteException re) {HiLog.error(LABEL, "exception happened.");}private class P2pRequestPeersCallBack extends WifiP2pCallback {@Overridepublic void eventP2pDevicesList(List
< WifiP2pDevice> devices) {HiLog.info(LABEL, "eventP2pDevicesList when start connect group");// 根據(jù)場景不同,選擇不同的設(shè)備進行連接,通過MAC地址搜索到指定設(shè)備WifiP2pConfig wifiP2pConfig = getSameP2pConfigFromDevices(devices);try {if (wifiP2pConfig != null) {// 向指定的設(shè)備發(fā)起連接wifiP2pController.connect(wifiP2pConfig, null);}} catch (RemoteException re) {HiLog.error(LABEL, "exception happened in connect.");}}}private WifiP2pConfig getSameP2pConfigFromDevices(List
< WifiP2pDevice> devices) {if (devices == null || devices.isEmpty()) {return null;}for (int i = 0; i < devices.size(); i++) {WifiP2pDevice p2pDevice = devices.get(i);HiLog.info(LABEL, "p2pDevice.getDeviceAddress() : %{private}s", p2pDevice.getDeviceAddress());if (p2pDevice.getDeviceAddress() != null&& p2pDevice.getDeviceAddress().equals(TARGET_P2P_MAC_ADDRESS)) {HiLog.info(LABEL, "received same mac address");WifiP2pConfig wifiP2pConfig = new WifiP2pConfig("DEFAULT_GROUP_NAME", "DEFAULT_PASSPHRASE"); // 根據(jù)實際情況配置名字和密碼wifiP2pConfig.setDeviceAddress(p2pDevice.getDeviceAddress());return wifiP2pConfig;}}return null;}
⑥ 請求 P2P 相關(guān)信息
調(diào)用 WifiP2pController 的 getInstance?() 接口,獲取 P2P 控制器實例,用于管理 P2P 操作。 調(diào)用 init() 初始化 P2P 控制器實例。 調(diào)用 requestP2pInfo() 查詢 P2P 群組信息。 調(diào)用 requestP2pInfo() 查詢 P2P 設(shè)備信息。 根據(jù)場景不同,可以調(diào)用 requestP2pInfo 獲取需要的信息。
try {// 獲取P2P管理對象WifiP2pController wifiP2pController = WifiP2pController.getInstance(this);// 初始化P2P管理對象,用于建立P2P信使等行為wifiP2pController.init(EventRunner.create(true), null);// 查詢可用P2P群組信息,通過回調(diào)獲取P2P群組信息P2pRequestGroupInfoCallBack p2pRequestGroupInfoCallBack = new P2pRequestGroupInfoCallBack();wifiP2pController.requestP2pInfo(WifiP2pController.GROUP_INFO_REQUEST, p2pRequestGroupInfoCallBack);// 查詢可用P2P設(shè)備信息,通過回調(diào)獲取P2P設(shè)備信息P2pRequestDeviceInfoCallBack p2pRequestDeviceInfoCallBack = new P2pRequestDeviceInfoCallBack();wifiP2pController.requestP2pInfo(WifiP2pController.DEVICE_INFO_REQUEST, p2pRequestDeviceInfoCallBack);// 通過調(diào)用requestP2pInfo接口,可以查詢以下關(guān)鍵信息wifiP2pController.requestP2pInfo(WifiP2pController.NETWORK_INFO_REQUEST, callback); // 網(wǎng)絡(luò)信息wifiP2pController.requestP2pInfo(WifiP2pController.DEVICE_LIST_REQUEST, callback); // 設(shè)備列表信息} catch (RemoteException re) {HiLog.error(LABEL, "exception happened.");}// 群組信息回調(diào)private class P2pRequestGroupInfoCallBack extends WifiP2pCallback {@Overridepublic void eventP2pGroup(WifiP2pGroup group) {HiLog.info(LABEL, "P2pRequestGroupInfoCallBack eventP2pGroup");doSthFor(group);}}// 設(shè)備信息回調(diào)private class P2pRequestDeviceInfoCallBack extends WifiP2pCallback {@Overridepublic void eventP2pDevice(WifiP2pDevice p2pDevice) {HiLog.info(LABEL, "P2pRequestDeviceInfoCallBack eventP2pDevice");doSthFor(p2pDevice);}}
五、WLAN 消息通知
① 應(yīng)用場景
WLAN 消息通知(Notification)是 HarmonyOS 內(nèi)部或者與應(yīng)用之間跨進程通訊的機制,注冊者在注冊消息通知后,一旦符合條件的消息被發(fā)出,注冊者即可接收到該消息并獲取消息中附帶的信息。
② API 說明
描述通知名附加參數(shù) WLAN狀態(tài)usual.event.wifi.POWER_STATEactive_state WLAN掃描usual.event.wifi.SCAN_FINISHEDscan_state WLAN RSSI變化usual.event.wifi.RSSI_VALUErssi_value WLAN連接狀態(tài)usual.event.wifi.CONN_STATEconn_state Hotspot狀態(tài)usual.event.wifi.HOTSPOT_STATEhotspot_active_state Hotspot連接狀態(tài)usual.event.wifi.WIFI_HS_STA_JOIN usual.event.wifi.WIFI_HS_STA_LEAVE- P2P狀態(tài)usual.event.wifi.p2p.STATE_CHANGEp2p_state P2P連接狀態(tài)usual.event.wifi.p2p.CONN_STATE_CHANGElinked_info net_info group_info P2P設(shè)備列表變化usual.event.wifi.p2p.DEVICES_CHANGE- P2P搜索狀態(tài)變化usual.event.wifi.p2p.PEER_DISCOVERY_STATE_CHANGEpeers_discovery P2P當前設(shè)備變化usual.event.wifi.p2p.CURRENT_DEVICE_CHANGEp2p_device
③ 開發(fā)步驟
構(gòu)建消息通知接收者 WifiEventSubscriber。 注冊 WLAN 變化消息。 WifiEventSubscriber 接收并處理 WLAN 廣播消息。
// 構(gòu)建消息接收者/注冊者class WifiEventSubscriber extends CommonEventSubscriber {WifiEventSubscriber(CommonEventSubscribeInfo info) {super(info);}@Overridepublic void onReceiveEvent(CommonEventData commonEventData) {if (commonEventData == null || commonEventData.getIntent() == null) {return;}if (WifiEvents.EVENT_ACTIVE_STATE.equals(commonEventData.getIntent().getAction())) {// 獲取附帶參數(shù)IntentParams params = commonEventData.getIntent().getParams();if (params == null) {return;}int wifiState= (int) params.getParam(WifiEvents.PARAM_ACTIVE_STATE);if (wifiState== WifiEvents.STATE_ACTIVE) { // 處理WLAN被打開消息HiLog.info(LABEL, "Receive WifiEvents.STATE_ACTIVE %{public}d", wifiState);} else if (wifiState == WifiEvents.STATE_INACTIVE) { // 處理WLAN被關(guān)閉消息 HiLog.info(LABEL, "Receive WifiEvents.STATE_INACTIVE %{public}d", wifiState);} else { // 處理WLAN異常狀態(tài)HiLog.warn(LABEL,"Unknown wifi state");}}}}// 注冊消息MatchingSkills match = new MatchingSkills();// 增加獲取WLAN狀態(tài)變化消息match.addEvent(WifiEvents.EVENT_ACTIVE_STATE);CommonEventSubscribeInfo subscribeInfo = new CommonEventSubscribeInfo(match);subscribeInfo.setPriority(100); WifiEventSubscriber subscriber = new WifiEventSubscriber(subscribeInfo);try {CommonEventManager.subscribeCommonEvent(subscriber);} catch (RemoteException e) {HiLog.warn(LABEL, "subscribe in wifi events failed!");}
總結(jié)
以上是生活随笔 為你收集整理的HarmonyOS之深入解析WLAN的功能和使用 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。