10a7ce71fSopenharmony_ci/* 20a7ce71fSopenharmony_ci * Copyright (c) 2022 HiSilicon (Shanghai) Technologies CO., LIMITED. 30a7ce71fSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 40a7ce71fSopenharmony_ci * you may not use this file except in compliance with the License. 50a7ce71fSopenharmony_ci * You may obtain a copy of the License at 60a7ce71fSopenharmony_ci * 70a7ce71fSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 80a7ce71fSopenharmony_ci * 90a7ce71fSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 100a7ce71fSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 110a7ce71fSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 120a7ce71fSopenharmony_ci * See the License for the specific language governing permissions and 130a7ce71fSopenharmony_ci * limitations under the License. 140a7ce71fSopenharmony_ci */ 150a7ce71fSopenharmony_ci 160a7ce71fSopenharmony_ci#include "wifi_device.h" 170a7ce71fSopenharmony_ci#include "cmsis_os2.h" 180a7ce71fSopenharmony_ci 190a7ce71fSopenharmony_ci#include "lwip/netifapi.h" 200a7ce71fSopenharmony_ci#include "lwip/api_shell.h" 210a7ce71fSopenharmony_ci 220a7ce71fSopenharmony_cistatic void PrintLinkedInfo(const WifiLinkedInfo* info) 230a7ce71fSopenharmony_ci{ 240a7ce71fSopenharmony_ci int ret = 0; 250a7ce71fSopenharmony_ci 260a7ce71fSopenharmony_ci if (!info) { 270a7ce71fSopenharmony_ci return; 280a7ce71fSopenharmony_ci } 290a7ce71fSopenharmony_ci 300a7ce71fSopenharmony_ci static char macAddress[32] = {0}; 310a7ce71fSopenharmony_ci unsigned char* mac = info->bssid; 320a7ce71fSopenharmony_ci if (snprintf_s(macAddress, sizeof(macAddress) + 1, sizeof(macAddress), "%02X:%02X:%02X:%02X:%02X:%02X", 330a7ce71fSopenharmony_ci mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]) < 0) { /* mac地址从0,1,2,3,4,5位 */ 340a7ce71fSopenharmony_ci return; 350a7ce71fSopenharmony_ci } 360a7ce71fSopenharmony_ci} 370a7ce71fSopenharmony_ci 380a7ce71fSopenharmony_cistatic volatile int g_connected = 0; 390a7ce71fSopenharmony_ci 400a7ce71fSopenharmony_cistatic void OnWifiConnectionChanged(int state, const WifiLinkedInfo* info) 410a7ce71fSopenharmony_ci{ 420a7ce71fSopenharmony_ci if (!info) { 430a7ce71fSopenharmony_ci return; 440a7ce71fSopenharmony_ci } 450a7ce71fSopenharmony_ci 460a7ce71fSopenharmony_ci printf("%s %d, state = %d, info = \r\n", __FUNCTION__, __LINE__, state); 470a7ce71fSopenharmony_ci PrintLinkedInfo(info); 480a7ce71fSopenharmony_ci 490a7ce71fSopenharmony_ci if (state == WIFI_STATE_AVAILABLE) { 500a7ce71fSopenharmony_ci g_connected = 1; 510a7ce71fSopenharmony_ci } else { 520a7ce71fSopenharmony_ci g_connected = 0; 530a7ce71fSopenharmony_ci } 540a7ce71fSopenharmony_ci} 550a7ce71fSopenharmony_ci 560a7ce71fSopenharmony_cistatic void OnWifiScanStateChanged(int state, int size) 570a7ce71fSopenharmony_ci{ 580a7ce71fSopenharmony_ci printf("%s %d, state = %X, size = %d\r\n", __FUNCTION__, __LINE__, state, size); 590a7ce71fSopenharmony_ci} 600a7ce71fSopenharmony_ci 610a7ce71fSopenharmony_cistatic WifiEvent g_defaultWifiEventListener = { 620a7ce71fSopenharmony_ci .OnWifiConnectionChanged = OnWifiConnectionChanged, 630a7ce71fSopenharmony_ci .OnWifiScanStateChanged = OnWifiScanStateChanged 640a7ce71fSopenharmony_ci}; 650a7ce71fSopenharmony_ci 660a7ce71fSopenharmony_cistatic struct netif* g_iface = NULL; 670a7ce71fSopenharmony_ci 680a7ce71fSopenharmony_ciint ConnectToHotspotconst (const WifiDeviceConfig* apConfig) 690a7ce71fSopenharmony_ci{ 700a7ce71fSopenharmony_ci WifiErrorCode errCode; 710a7ce71fSopenharmony_ci int netId = -1; 720a7ce71fSopenharmony_ci 730a7ce71fSopenharmony_ci errCode = RegisterWifiEvent(&g_defaultWifiEventListener); 740a7ce71fSopenharmony_ci printf("RegisterWifiEvent: %d\r\n", errCode); 750a7ce71fSopenharmony_ci 760a7ce71fSopenharmony_ci errCode = EnableWifi(); 770a7ce71fSopenharmony_ci printf("EnableWifi: %d\r\n", errCode); 780a7ce71fSopenharmony_ci 790a7ce71fSopenharmony_ci errCode = AddDeviceConfig(apConfig, &netId); 800a7ce71fSopenharmony_ci printf("AddDeviceConfig: %d\r\n", errCode); 810a7ce71fSopenharmony_ci 820a7ce71fSopenharmony_ci g_connected = 0; 830a7ce71fSopenharmony_ci errCode = ConnectTo(netId); 840a7ce71fSopenharmony_ci printf("ConnectTo(%d): %d\r\n", netId, errCode); 850a7ce71fSopenharmony_ci 860a7ce71fSopenharmony_ci while (!g_connected) { // wait until connect to AP 870a7ce71fSopenharmony_ci osDelay(10); /* OS Sleep 10 ms */ 880a7ce71fSopenharmony_ci } 890a7ce71fSopenharmony_ci printf("g_connected: %d\r\n", g_connected); 900a7ce71fSopenharmony_ci 910a7ce71fSopenharmony_ci g_iface = netifapi_netif_find("wlan0"); 920a7ce71fSopenharmony_ci if (g_iface) { 930a7ce71fSopenharmony_ci err_t ret = netifapi_dhcp_start(g_iface); 940a7ce71fSopenharmony_ci printf("netifapi_dhcp_start: %d\r\n", ret); 950a7ce71fSopenharmony_ci 960a7ce71fSopenharmony_ci osDelay(100); // 100 : OS Sleep 100ms ,and wait DHCP server give me IP 970a7ce71fSopenharmony_ci ret = netifapi_netif_common(g_iface, dhcp_clients_info_show, NULL); 980a7ce71fSopenharmony_ci printf("netifapi_netif_common: %d\r\n", ret); 990a7ce71fSopenharmony_ci } 1000a7ce71fSopenharmony_ci return netId; 1010a7ce71fSopenharmony_ci} 1020a7ce71fSopenharmony_ci 1030a7ce71fSopenharmony_civoid DisconnectWithHotspot(int netId) 1040a7ce71fSopenharmony_ci{ 1050a7ce71fSopenharmony_ci if (g_iface) { 1060a7ce71fSopenharmony_ci err_t ret = netifapi_dhcp_stop(g_iface); 1070a7ce71fSopenharmony_ci printf("netifapi_dhcp_stop: %d\r\n", ret); 1080a7ce71fSopenharmony_ci } 1090a7ce71fSopenharmony_ci 1100a7ce71fSopenharmony_ci WifiErrorCode errCode = Disconnect(); // disconnect with your AP 1110a7ce71fSopenharmony_ci printf("Disconnect: %d\r\n", errCode); 1120a7ce71fSopenharmony_ci 1130a7ce71fSopenharmony_ci errCode = UnRegisterWifiEvent(&g_defaultWifiEventListener); 1140a7ce71fSopenharmony_ci printf("UnRegisterWifiEvent: %d\r\n", errCode); 1150a7ce71fSopenharmony_ci 1160a7ce71fSopenharmony_ci RemoveDevice(netId); // remove AP config 1170a7ce71fSopenharmony_ci printf("RemoveDevice: %d\r\n", errCode); 1180a7ce71fSopenharmony_ci 1190a7ce71fSopenharmony_ci errCode = DisableWifi(); 1200a7ce71fSopenharmony_ci printf("DisableWifi: %d\r\n", errCode); 1210a7ce71fSopenharmony_ci} 1220a7ce71fSopenharmony_ci 123