Files
License_plate_recognition/wifi_connecter.c
2025-10-18 16:05:39 +08:00

147 lines
4.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "cmsis_os2.h" // CMSIS-RTOS API V2
#include "wifi_device.h" // Wi-Fi设备接口station模式
#include "lwip/netifapi.h" // lwIP TCP/IP协议栈网络接口API
#include "lwip/api_shell.h" // lwIP TCP/IP协议栈SHELL命令API
static void PrintLinkedInfo(WifiLinkedInfo* info)
{
if (!info) return;
static char macAddress[32] = {0};
unsigned char* mac = info->bssid;
snprintf(macAddress, sizeof(macAddress), "%02X:%02X:%02X:%02X:%02X:%02X",
mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
printf("bssid: %s, rssi: %d, connState: %d, reason: %d, ssid: %s\r\n",
macAddress, info->rssi, info->connState, info->disconnectedReason, info->ssid);
}
static volatile int g_connected = 0;
static void OnWifiConnectionChanged(int state, WifiLinkedInfo* info)
{
if (!info) return;
printf("%s %d, state = %d, info = \r\n", __FUNCTION__, __LINE__, state);
PrintLinkedInfo(info);
if (state == WIFI_STATE_AVALIABLE) {
g_connected = 1;
} else {
g_connected = 0;
}
}
static void OnWifiScanStateChanged(int state, int size)
{
printf("%s %d, state = %X, size = %d\r\n", __FUNCTION__, __LINE__, state, size);
}
static WifiEvent g_defaultWifiEventListener = {
.OnWifiConnectionChanged = OnWifiConnectionChanged,
.OnWifiScanStateChanged = OnWifiScanStateChanged
};
static struct netif* g_iface = NULL;
err_t netifapi_set_hostname(struct netif *netif, char *hostname, u8_t namelen);
int ConnectToHotspot(WifiDeviceConfig* apConfig)
{
WifiErrorCode errCode;
int netId = -1;
errCode = RegisterWifiEvent(&g_defaultWifiEventListener);
printf("RegisterWifiEvent: %d\r\n", errCode);
errCode = EnableWifi();
printf("EnableWifi: %d\r\n", errCode);
errCode = AddDeviceConfig(apConfig, &netId);
printf("AddDeviceConfig: %d\r\n", errCode);
g_connected = 0;
errCode = ConnectTo(netId);
printf("ConnectTo(%d): %d\r\n", netId, errCode);
while (!g_connected) { // wait until connect to AP
// printf("connecting\n");
osDelay(10);
}
printf("g_connected: %d\r\n", g_connected);
g_iface = netifapi_netif_find("wlan0");
if (g_iface) {
err_t ret = 0;
char* hostname = "hispark";
ret = netifapi_set_hostname(g_iface, hostname, strlen(hostname));
printf("netifapi_set_hostname: %d\r\n", ret);
ret = netifapi_dhcp_start(g_iface);
printf("netifapi_dhcp_start: %d\r\n", ret);
osDelay(100); // wait DHCP server give me IP
#if 0
ret = netifapi_netif_common(g_iface, dhcp_clients_info_show, NULL);
printf("netifapi_netif_common: %d\r\n", ret);
#else
// 下面这种方式也可以打印 IP、网关、子网掩码信息
ip4_addr_t ip = {0};
ip4_addr_t netmask = {0};
ip4_addr_t gw = {0};
ret = netifapi_netif_get_addr(g_iface, &ip, &netmask, &gw);
if (ret == ERR_OK) {
printf("ip = %s\r\n", ip4addr_ntoa(&ip));
printf("netmask = %s\r\n", ip4addr_ntoa(&netmask));
printf("gw = %s\r\n", ip4addr_ntoa(&gw));
}
printf("netifapi_netif_get_addr: %d\r\n", ret);
#endif
}
return netId;
}
void DisconnectWithHotspot(int netId)
{
if (g_iface) {
err_t ret = netifapi_dhcp_stop(g_iface);
printf("netifapi_dhcp_stop: %d\r\n", ret);
}
WifiErrorCode errCode = Disconnect(); // disconnect with your AP
printf("Disconnect: %d\r\n", errCode);
errCode = UnRegisterWifiEvent(&g_defaultWifiEventListener);
printf("UnRegisterWifiEvent: %d\r\n", errCode);
RemoveDevice(netId); // remove AP config
printf("RemoveDevice: %d\r\n", errCode);
errCode = DisableWifi();
printf("DisableWifi: %d\r\n", errCode);
}
// 获取本机IP地址
int GetLocalIpAddress(char* ip_buffer, int buffer_size)
{
if (!ip_buffer || buffer_size < 16 || !g_iface) {
return -1;
}
ip4_addr_t ip = {0};
ip4_addr_t netmask = {0};
ip4_addr_t gw = {0};
err_t ret = netifapi_netif_get_addr(g_iface, &ip, &netmask, &gw);
if (ret == ERR_OK) {
const char* ip_str = ip4addr_ntoa(&ip);
if (ip_str && strlen(ip_str) < buffer_size) {
strcpy(ip_buffer, ip_str);
return 0;
}
}
return -1;
}