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_starter.h" 170a7ce71fSopenharmony_ci#include "cmsis_os2.h" 180a7ce71fSopenharmony_ci 190a7ce71fSopenharmony_ci#include "lwip/netifapi.h" 200a7ce71fSopenharmony_ci 210a7ce71fSopenharmony_cistatic volatile int g_hotspotStarted = 0; 220a7ce71fSopenharmony_ci 230a7ce71fSopenharmony_cistatic void OnHotspotStateChanged(int state) 240a7ce71fSopenharmony_ci{ 250a7ce71fSopenharmony_ci printf("OnHotspotStateChanged: %d.\r\n", state); 260a7ce71fSopenharmony_ci if (state == WIFI_HOTSPOT_ACTIVE) { 270a7ce71fSopenharmony_ci g_hotspotStarted = 1; 280a7ce71fSopenharmony_ci } else { 290a7ce71fSopenharmony_ci g_hotspotStarted = 0; 300a7ce71fSopenharmony_ci } 310a7ce71fSopenharmony_ci} 320a7ce71fSopenharmony_ci 330a7ce71fSopenharmony_cistatic volatile int g_joinedStations = 0; 340a7ce71fSopenharmony_ci 350a7ce71fSopenharmony_cistatic void PrintStationInfo(const StationInfo* info) 360a7ce71fSopenharmony_ci{ 370a7ce71fSopenharmony_ci int len = 0; 380a7ce71fSopenharmony_ci 390a7ce71fSopenharmony_ci if (!info) { 400a7ce71fSopenharmony_ci return; 410a7ce71fSopenharmony_ci } 420a7ce71fSopenharmony_ci static char macAddress[32] = {0}; 430a7ce71fSopenharmony_ci unsigned char* mac = info->macAddress; 440a7ce71fSopenharmony_ci if (snprintf_s(macAddress, sizeof(macAddress) + 1, sizeof(macAddress), "%02X:%02X:%02X:%02X:%02X:%02X", 450a7ce71fSopenharmony_ci mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]) < 0) { /* mac地址从0,1,2,3,4,5位 */ 460a7ce71fSopenharmony_ci return; 470a7ce71fSopenharmony_ci } 480a7ce71fSopenharmony_ci} 490a7ce71fSopenharmony_ci 500a7ce71fSopenharmony_cistatic void OnHotspotStaJoin(const StationInfo* info) 510a7ce71fSopenharmony_ci{ 520a7ce71fSopenharmony_ci g_joinedStations++; 530a7ce71fSopenharmony_ci PrintStationInfo(info); 540a7ce71fSopenharmony_ci printf("+OnHotspotStaJoin: active stations = %d.\r\n", g_joinedStations); 550a7ce71fSopenharmony_ci} 560a7ce71fSopenharmony_ci 570a7ce71fSopenharmony_cistatic void OnHotspotStaLeave(const StationInfo* info) 580a7ce71fSopenharmony_ci{ 590a7ce71fSopenharmony_ci g_joinedStations--; 600a7ce71fSopenharmony_ci PrintStationInfo(info); 610a7ce71fSopenharmony_ci printf("-OnHotspotStaLeave: active stations = %d.\r\n", g_joinedStations); 620a7ce71fSopenharmony_ci} 630a7ce71fSopenharmony_ci 640a7ce71fSopenharmony_ciWifiEvent g_defaultWifiEventListener = { 650a7ce71fSopenharmony_ci .OnHotspotStaJoin = OnHotspotStaJoin, 660a7ce71fSopenharmony_ci .OnHotspotStaLeave = OnHotspotStaLeave, 670a7ce71fSopenharmony_ci .OnHotspotStateChanged = OnHotspotStateChanged, 680a7ce71fSopenharmony_ci}; 690a7ce71fSopenharmony_ci 700a7ce71fSopenharmony_cistatic struct netif* g_iface = NULL; 710a7ce71fSopenharmony_ci 720a7ce71fSopenharmony_ci#define SSID_LEN (11) 730a7ce71fSopenharmony_ci 740a7ce71fSopenharmony_ciint StartHotspot(void) 750a7ce71fSopenharmony_ci{ 760a7ce71fSopenharmony_ci WifiErrorCode errCode; 770a7ce71fSopenharmony_ci errCode = WIFI_SUCCESS; 780a7ce71fSopenharmony_ci 790a7ce71fSopenharmony_ci HotspotConfig config = {0}; 800a7ce71fSopenharmony_ci 810a7ce71fSopenharmony_ci // 准备AP的配置参数 820a7ce71fSopenharmony_ci strcpy_s(config.ssid, SSID_LEN, "HiSpark-AP"); 830a7ce71fSopenharmony_ci config.securityType = WIFI_SEC_TYPE_OPEN; 840a7ce71fSopenharmony_ci config.band = HOTSPOT_BAND_TYPE_2G; 850a7ce71fSopenharmony_ci config.channelNum = 7; /* 7: channel number */ 860a7ce71fSopenharmony_ci 870a7ce71fSopenharmony_ci errCode = RegisterWifiEvent(&g_defaultWifiEventListener); 880a7ce71fSopenharmony_ci printf("RegisterWifiEvent: %d\r\n", errCode); 890a7ce71fSopenharmony_ci 900a7ce71fSopenharmony_ci errCode = SetHotspotConfig(&config); 910a7ce71fSopenharmony_ci printf("SetHotspotConfig: %d\r\n", errCode); 920a7ce71fSopenharmony_ci 930a7ce71fSopenharmony_ci g_hotspotStarted = 0; 940a7ce71fSopenharmony_ci errCode = EnableHotspot(); 950a7ce71fSopenharmony_ci printf("EnableHotspot: %d\r\n", errCode); 960a7ce71fSopenharmony_ci 970a7ce71fSopenharmony_ci while (!g_hotspotStarted) { 980a7ce71fSopenharmony_ci osDelay(10); /* 10 : OS Sleep 10 ms */ 990a7ce71fSopenharmony_ci } 1000a7ce71fSopenharmony_ci printf("g_hotspotStarted = %d.\r\n", g_hotspotStarted); 1010a7ce71fSopenharmony_ci 1020a7ce71fSopenharmony_ci g_iface = netifapi_netif_find("ap1"); 1030a7ce71fSopenharmony_ci if (g_iface) { 1040a7ce71fSopenharmony_ci ip4_addr_t ipaddr; 1050a7ce71fSopenharmony_ci ip4_addr_t gateway; 1060a7ce71fSopenharmony_ci ip4_addr_t netmask; 1070a7ce71fSopenharmony_ci 1080a7ce71fSopenharmony_ci IP4_ADDR(&ipaddr, 192, 168, 1, 1); /* input your IP for example: 192.168.1.1 */ 1090a7ce71fSopenharmony_ci IP4_ADDR(&gateway, 192, 168, 1, 1); /* input your gateway for example: 192.168.1.1 */ 1100a7ce71fSopenharmony_ci IP4_ADDR(&netmask, 255, 255, 255, 0); /* input your netmask for example: 255.255.255.0 */ 1110a7ce71fSopenharmony_ci err_t ret = netifapi_netif_set_addr(g_iface, &ipaddr, &netmask, &gateway); 1120a7ce71fSopenharmony_ci printf("netifapi_netif_set_addr: %d\r\n", ret); 1130a7ce71fSopenharmony_ci 1140a7ce71fSopenharmony_ci ret = netifapi_dhcps_start(g_iface, 0, 0); 1150a7ce71fSopenharmony_ci printf("netifapi_dhcp_start: %d\r\n", ret); 1160a7ce71fSopenharmony_ci } 1170a7ce71fSopenharmony_ci return errCode; 1180a7ce71fSopenharmony_ci} 1190a7ce71fSopenharmony_ci 1200a7ce71fSopenharmony_civoid StopHotspot(void) 1210a7ce71fSopenharmony_ci{ 1220a7ce71fSopenharmony_ci if (g_iface) { 1230a7ce71fSopenharmony_ci err_t ret = netifapi_dhcps_stop(g_iface); 1240a7ce71fSopenharmony_ci printf("netifapi_dhcps_stop: %d\r\n", ret); 1250a7ce71fSopenharmony_ci } 1260a7ce71fSopenharmony_ci 1270a7ce71fSopenharmony_ci WifiErrorCode errCode = UnRegisterWifiEvent(&g_defaultWifiEventListener); 1280a7ce71fSopenharmony_ci printf("UnRegisterWifiEvent: %d\r\n", errCode); 1290a7ce71fSopenharmony_ci 1300a7ce71fSopenharmony_ci errCode = DisableHotspot(); 1310a7ce71fSopenharmony_ci printf("EnableHotspot: %d\r\n", errCode); 1320a7ce71fSopenharmony_ci} 133