10a7ce71fSopenharmony_ci/* 20a7ce71fSopenharmony_ci * Copyright (C) 2022 HiHope Open Source Organization . 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 * 140a7ce71fSopenharmony_ci * limitations under the License. 150a7ce71fSopenharmony_ci */ 160a7ce71fSopenharmony_ci 170a7ce71fSopenharmony_ci#include "wifi_device.h" 180a7ce71fSopenharmony_ci#include "cmsis_os2.h" 190a7ce71fSopenharmony_ci 200a7ce71fSopenharmony_ci#include "lwip/netifapi.h" 210a7ce71fSopenharmony_ci#include "lwip/api_shell.h" 220a7ce71fSopenharmony_ci#define ZERO 0 230a7ce71fSopenharmony_ci#define ONE 1 240a7ce71fSopenharmony_ci#define TWO 2 250a7ce71fSopenharmony_ci#define THREE 3 260a7ce71fSopenharmony_ci#define FOUR 4 270a7ce71fSopenharmony_ci#define FIVE 5 280a7ce71fSopenharmony_ci#define TEN 10 290a7ce71fSopenharmony_ci#define ONE_HUNDRED 100 300a7ce71fSopenharmony_ci 310a7ce71fSopenharmony_cistatic void PrintLinkedInfo(WifiLinkedInfo* info) 320a7ce71fSopenharmony_ci{ 330a7ce71fSopenharmony_ci if (!info) return; 340a7ce71fSopenharmony_ci 350a7ce71fSopenharmony_ci static char macAddress[32] = {0}; 360a7ce71fSopenharmony_ci unsigned char* mac = info->bssid; 370a7ce71fSopenharmony_ci if (snprintf_s(macAddress, sizeof(macAddress), "%02X:%02X:%02X:%02X:%02X:%02X", 380a7ce71fSopenharmony_ci mac[ZERO], mac[ONE], mac[TWO], mac[THREE], mac[FOUR], mac[FIVE]) == TRUE) { 390a7ce71fSopenharmony_ci} 400a7ce71fSopenharmony_ci printf("bssid: %s, rssi: %d, connState: %d, reason: %d, ssid: %s\r\n", 410a7ce71fSopenharmony_ci macAddress, info->rssi, info->connState, info->disconnectedReason, info->ssid); 420a7ce71fSopenharmony_ci} 430a7ce71fSopenharmony_ci 440a7ce71fSopenharmony_cistatic volatile int g_connected = 0; 450a7ce71fSopenharmony_ci 460a7ce71fSopenharmony_cistatic void OnWifiConnectionChanged(int state, WifiLinkedInfo* info) 470a7ce71fSopenharmony_ci{ 480a7ce71fSopenharmony_ci if (!info) return; 490a7ce71fSopenharmony_ci 500a7ce71fSopenharmony_ci printf("%s %d, state = %d, info = \r\n", __FUNCTION__, __LINE__, state); 510a7ce71fSopenharmony_ci PrintLinkedInfo(info); 520a7ce71fSopenharmony_ci 530a7ce71fSopenharmony_ci if (state == WIFI_STATE_AVALIABLE) { 540a7ce71fSopenharmony_ci g_connected = 1; 550a7ce71fSopenharmony_ci } else { 560a7ce71fSopenharmony_ci g_connected = 0; 570a7ce71fSopenharmony_ci } 580a7ce71fSopenharmony_ci} 590a7ce71fSopenharmony_ci 600a7ce71fSopenharmony_cistatic void OnWifiScanStateChanged(int state, int size) 610a7ce71fSopenharmony_ci{ 620a7ce71fSopenharmony_ci printf("%s %d, state = %X, size = %d\r\n", __FUNCTION__, __LINE__, state, size); 630a7ce71fSopenharmony_ci} 640a7ce71fSopenharmony_ci 650a7ce71fSopenharmony_cistatic WifiEvent g_defaultWifiEventListener = { 660a7ce71fSopenharmony_ci .OnWifiConnectionChanged = OnWifiConnectionChanged, 670a7ce71fSopenharmony_ci .OnWifiScanStateChanged = OnWifiScanStateChanged 680a7ce71fSopenharmony_ci}; 690a7ce71fSopenharmony_ci 700a7ce71fSopenharmony_cistatic struct netif* g_iface = NULL; 710a7ce71fSopenharmony_ci 720a7ce71fSopenharmony_cierr_t netifapi_set_hostname(struct netif *netif, char *hostname, u8_t namelen); 730a7ce71fSopenharmony_ci 740a7ce71fSopenharmony_ciint ConnectToHotspot(WifiDeviceConfig* apConfig) 750a7ce71fSopenharmony_ci{ 760a7ce71fSopenharmony_ci WifiErrorCode errCode; 770a7ce71fSopenharmony_ci int netId = -1; 780a7ce71fSopenharmony_ci 790a7ce71fSopenharmony_ci errCode = RegisterWifiEvent(&g_defaultWifiEventListener); 800a7ce71fSopenharmony_ci printf("RegisterWifiEvent: %d\r\n", errCode); 810a7ce71fSopenharmony_ci 820a7ce71fSopenharmony_ci errCode = EnableWifi(); 830a7ce71fSopenharmony_ci printf("EnableWifi: %d\r\n", errCode); 840a7ce71fSopenharmony_ci 850a7ce71fSopenharmony_ci errCode = AddDeviceConfig(apConfig, &netId); 860a7ce71fSopenharmony_ci printf("AddDeviceConfig: %d\r\n", errCode); 870a7ce71fSopenharmony_ci 880a7ce71fSopenharmony_ci g_connected = 0; 890a7ce71fSopenharmony_ci errCode = ConnectTo(netId); 900a7ce71fSopenharmony_ci printf("ConnectTo(%d): %d\r\n", netId, errCode); 910a7ce71fSopenharmony_ci 920a7ce71fSopenharmony_ci while (!g_connected) { // wait until connect to AP 930a7ce71fSopenharmony_ci osDelay(TEN); 940a7ce71fSopenharmony_ci } 950a7ce71fSopenharmony_ci printf("g_connected: %d\r\n", g_connected); 960a7ce71fSopenharmony_ci 970a7ce71fSopenharmony_ci g_iface = netifapi_netif_find("wlan0"); 980a7ce71fSopenharmony_ci if (g_iface) { 990a7ce71fSopenharmony_ci err_t ret = 0; 1000a7ce71fSopenharmony_ci char* hostname = "hispark"; 1010a7ce71fSopenharmony_ci ret = netifapi_set_hostname(g_iface, hostname, strlen(hostname)); 1020a7ce71fSopenharmony_ci printf("netifapi_set_hostname: %d\r\n", ret); 1030a7ce71fSopenharmony_ci 1040a7ce71fSopenharmony_ci ret = netifapi_dhcp_start(g_iface); 1050a7ce71fSopenharmony_ci printf("netifapi_dhcp_start: %d\r\n", ret); 1060a7ce71fSopenharmony_ci 1070a7ce71fSopenharmony_ci osDelay(ONE_HUNDRED); // wait DHCP server give me IP 1080a7ce71fSopenharmony_ci#if 1 1090a7ce71fSopenharmony_ci ret = netifapi_netif_common(g_iface, dhcp_clients_info_show, NULL); 1100a7ce71fSopenharmony_ci printf("netifapi_netif_common: %d\r\n", ret); 1110a7ce71fSopenharmony_ci#else 1120a7ce71fSopenharmony_ci // 下面这种方式也可以打印 IP、网关、子网掩码信息 1130a7ce71fSopenharmony_ci ip4_addr_t ip = {0}; 1140a7ce71fSopenharmony_ci ip4_addr_t netmask = {0}; 1150a7ce71fSopenharmony_ci ip4_addr_t gw = {0}; 1160a7ce71fSopenharmony_ci ret = netifapi_netif_get_addr(g_iface, &ip, &netmask, &gw); 1170a7ce71fSopenharmony_ci if (ret == ERR_OK) { 1180a7ce71fSopenharmony_ci printf("ip = %s\r\n", ip4addr_ntoa(&ip)); 1190a7ce71fSopenharmony_ci printf("netmask = %s\r\n", ip4addr_ntoa(&netmask)); 1200a7ce71fSopenharmony_ci printf("gw = %s\r\n", ip4addr_ntoa(&gw)); 1210a7ce71fSopenharmony_ci } 1220a7ce71fSopenharmony_ci printf("netifapi_netif_get_addr: %d\r\n", ret); 1230a7ce71fSopenharmony_ci#endif 1240a7ce71fSopenharmony_ci } 1250a7ce71fSopenharmony_ci return netId; 1260a7ce71fSopenharmony_ci} 1270a7ce71fSopenharmony_ci 1280a7ce71fSopenharmony_civoid DisconnectWithHotspot(int netId) 1290a7ce71fSopenharmony_ci{ 1300a7ce71fSopenharmony_ci if (g_iface) { 1310a7ce71fSopenharmony_ci err_t ret = netifapi_dhcp_stop(g_iface); 1320a7ce71fSopenharmony_ci printf("netifapi_dhcp_stop: %d\r\n", ret); 1330a7ce71fSopenharmony_ci } 1340a7ce71fSopenharmony_ci 1350a7ce71fSopenharmony_ci WifiErrorCode errCode = Disconnect(); // disconnect with your AP 1360a7ce71fSopenharmony_ci printf("Disconnect: %d\r\n", errCode); 1370a7ce71fSopenharmony_ci 1380a7ce71fSopenharmony_ci errCode = UnRegisterWifiEvent(&g_defaultWifiEventListener); 1390a7ce71fSopenharmony_ci printf("UnRegisterWifiEvent: %d\r\n", errCode); 1400a7ce71fSopenharmony_ci 1410a7ce71fSopenharmony_ci RemoveDevice(netId); // remove AP config 1420a7ce71fSopenharmony_ci printf("RemoveDevice: %d\r\n", errCode); 1430a7ce71fSopenharmony_ci 1440a7ce71fSopenharmony_ci errCode = DisableWifi(); 1450a7ce71fSopenharmony_ci printf("DisableWifi: %d\r\n", errCode); 1460a7ce71fSopenharmony_ci} 1470a7ce71fSopenharmony_ci 148