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