BearPi-HM_Nano开发板WiFi编程开发——Wifi AP 热点
本示例将演示如何在BearPi-HM_Nano开发板上编写一个创建Wifi热点程序

Wifi API分析
本案例主要使用了以下几个API完成Wifi热点创建
依赖文件:
foundation\communication\interfaces\kits\wifi_lite\wifiservice\wifi_device.h
foundation\communication\interfaces\kits\wifi_lite\wifiservice\wifi_hotspot.h
RegisterWifiEvent()
描述:
为指定的Wi-Fi事件注册回调函数。当WifiEvent中定义的Wi-Fi事件发生时,将调用已注册的回调函数
参数:
EnableHotspot()
描述:
启用Wifi热点模式
SetHotspotConfig()
描述:
设置指定的热点配置
IsHotspotActive()
描述:
检查AP热点模式是否启用
GetStationList()
描述:
获取连接到该热点的一系列STA
参数:
名字 |
描述 |
result |
表示连接到该热点的STA列表. |
size |
表示连接到该热点的STA数量 |
软件设计
主要代码分析
完成Wifi热点的扫描需要以下几步
-
通过 RegisterWifiEvent
接口向系统注册热点状态改变事件、STA站点加入事件、STA站点退出事件
-
OnHotspotStateChangedHandler
用于绑定热点状态改变事件,该回调函数有一个参数 state
;
- state表示是否开启AP模式,取值为0和1,0表示已启用Wifi AP模式,1表示已禁用Wifi AP模式;
-
OnHotspotStaLeaveHandler
用于绑定STA站点退出事件,当有STA站点退出,该回调函数会打印出退出站点的MAC地址;
-
OnHotspotStaJoinHandler
用于绑定STA站点加入事件,当有新的STA站点加入时,该回调函数会创建 HotspotStaJoinTask
,在该任务中会调用 GetStationList
函数获取当前接入到该AP的所有STA站点信息,并打印出每个STA站点的MAC地址;
-
调用 SetHotspotConfig
接口,设置指定的热点配置;
-
调用 EnableHotspot
接口,使能 Wifi AP 模式;
-
调用 IsHotspotActive
接口,检查AP热点模式是否启用;
-
调用 netifapi_netif_set_addr
函数设置网卡信息;
-
调用 netifapi_dhcps_start
函数启动dhcp服务;
static BOOL WifiAPTask(void)
{
osDelay(200);
g_wifiEventHandler.OnHotspotStaJoin = OnHotspotStaJoinHandler;
g_wifiEventHandler.OnHotspotStaLeave = OnHotspotStaLeaveHandler;
g_wifiEventHandler.OnHotspotStateChanged = OnHotspotStateChangedHandler;
error = RegisterWifiEvent(&g_wifiEventHandler);
if (error != WIFI_SUCCESS)
{
printf("RegisterWifiEvent failed, error = %d.\r\n",error);
return -1;
}
printf("RegisterWifiEvent succeed!\r\n");
HotspotConfig config = {0};
strcpy(config.ssid, AP_SSID);
strcpy(config.preSharedKey, AP_PSK);
config.securityType = WIFI_SEC_TYPE_PSK;
config.band = HOTSPOT_BAND_TYPE_2G;
config.channelNum = 7;
error = SetHotspotConfig(&config);
if (error != WIFI_SUCCESS)
{
printf("SetHotspotConfig failed, error = %d.\r\n", error);
return -1;
}
printf("SetHotspotConfig succeed!\r\n");
error = EnableHotspot();
if (error != WIFI_SUCCESS)
{
printf("EnableHotspot failed, error = %d.\r\n", error);
return -1;
}
printf("EnableHotspot succeed!\r\n");
if (IsHotspotActive() == WIFI_HOTSPOT_NOT_ACTIVE)
{
printf("Wifi station is not actived.\r\n");
return -1;
}
printf("Wifi station is actived!\r\n");
g_lwip_netif = netifapi_netif_find("ap0");
if (g_lwip_netif)
{
ip4_addr_t bp_gw;
ip4_addr_t bp_ipaddr;
ip4_addr_t bp_netmask;
IP4_ADDR(&bp_gw, 192, 168, 1, 1);
IP4_ADDR(&bp_ipaddr, 192, 168, 1, 1);
IP4_ADDR(&bp_netmask, 255, 255, 255, 0);
err_t ret = netifapi_netif_set_addr(g_lwip_netif, &bp_ipaddr, &bp_netmask, &bp_gw);
if(ret != ERR_OK)
{
printf("netifapi_netif_set_addr failed, error = %d.\r\n", ret);
return -1;
}
printf("netifapi_netif_set_addr succeed!\r\n");
ret = netifapi_dhcps_start(g_lwip_netif, 0, 0);
if(ret != ERR_OK)
{
printf("netifapi_dhcp_start failed, error = %d.\r\n", ret);
return -1;
}
printf("netifapi_dhcps_start succeed!\r\n");
}
int sock_fd;
struct sockaddr_in server_sock;
if ((sock_fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1)
{
perror("socket is error.\r\n");
return -1;
}
bzero(&server_sock, sizeof(server_sock));
server_sock.sin_family = AF_INET;
server_sock.sin_addr.s_addr = htonl(INADDR_ANY);
server_sock.sin_port = htons(8888);
if (bind(sock_fd, (struct sockaddr *)&server_sock, sizeof(struct sockaddr)) == -1)
{
perror("bind is error.\r\n");
return -1;
}
int ret;
char recvBuf[512] = {0};
struct sockaddr_in client_addr;
int size_client_addr= sizeof(struct sockaddr_in);
while (1)
{
printf("Waiting to receive data...\r\n");
memset(recvBuf, 0, sizeof(recvBuf));
ret = recvfrom(sock_fd, recvBuf, sizeof(recvBuf), 0, (struct sockaddr*)&client_addr,(socklen_t*)&size_client_addr);
if(ret < 0)
{
printf("UDP server receive failed!\r\n");
return -1;
}
printf("receive %d bytes of data from ipaddr = %s, port = %d.\r\n", ret, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
printf("data is %s\r\n",recvBuf);
ret = sendto(sock_fd, recvBuf, strlen(recvBuf), 0, (struct sockaddr *)&client_addr, sizeof(client_addr));
if (ret < 0)
{
printf("UDP server send failed!\r\n");
return -1;
}
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
- 113.
- 114.
- 115.
- 116.
- 117.
- 118.
- 119.
- 120.
- 121.
- 122.
- 123.
- 124.
- 125.
- 126.
- 127.
- 128.
- 129.
- 130.
- 131.
- 132.
编译调试
修改 BUILD.gn 文件
修改 applications\BearPi\BearPi-HM_Nano\sample
路径下 BUILD.gn 文件,指定 wifi_ap
参与编译。
运行结果
示例代码编译烧录代码后,按下开发板的RESET按键,通过串口助手查看日志,使用手机去连接该热点,会打印出一下信息。
请问用3.0的代码开启热点的时候第71行启动DHCP为什么会失败呢?
ret = netifapi_dhcps_start(g_lwip_netif, 0, 0);
其他都是正常的 ,就这里会返回-1,日志如下:
[21:54:17.892]收←◆RegisterWifiEvent succeed!
SetHotspotConfig succeed!
[21:54:18.329]收←◆HotspotStateChanged:state is 1.
wifi hotspot active.
EnableHotspot succeed!
Wifi station is actived!
netifapi_netif_set_addr succeed!
netifapi_dhcp_start failed, error = -1.
然后我的gn文件是这样改的:
static_library("wifi_ap") {
sources = [
"wifi_ap.c"
]
cflags = [ "-Wno-unused-variable" ]
include_dirs = [
"//utils/native/lite/include",
"//kernel/liteos_m/components/cmsis/2.0",
"//base/iot_hardware/peripheral/interfaces/kits",
"//foundation/communication/wifi_lite/interfaces/wifiservice",
"//vendor/hisi/hi3861/hi3861/third_party/lwip_sack/include/",
]
}
其他都没有改动。
链接成功之后,但无法上网,请问是什么原因?
IP地址、网关、子网掩码已经设置好,是电脑的地址,还有哪里要设置吗
这么做就OK了