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