• Home
Name Date Size #Lines LOC

..--

BUILD.gnD12-May-2024836 2521

README.mdD12-May-20244.6 KiB175122

wifi_ap.cD12-May-20246.8 KiB213159

README.md

1# BearPi-HM_Nano开发板WiFi编程开发——Wifi AP 热点
2
3
4本示例将演示如何在BearPi-HM_Nano开发板上编写一个创建Wifi热点程序。
5
6
7## Wifi API分析
8本案例主要使用了以下几个API完成Wifi热点创建。
9
10### RegisterWifiEvent()
11```c
12WifiErrorCode RegisterWifiEvent (WifiEvent * event)
13```
14 **描述:**
15
16为指定的Wi-Fi事件注册回调函数。当WifiEvent中定义的Wi-Fi事件发生时,将调用已注册的回调函数。
17
18**参数:**
19
20|参数名|描述|
21|:--|:------|
22| event | 表示要注册回调的事件。  |
23
24
25### EnableHotspot()
26```c
27WifiErrorCode EnableHotspot (void )
28```
29
30**描述:**
31
32启用Wifi热点模式。
33
34### SetHotspotConfig()
35```c
36WifiErrorCode SetHotspotConfig(const HotspotConfig* config)
37```
38**描述:**
39
40设置指定的热点配置。
41
42### IsHotspotActive()
43```c
44int IsHotspotActive(void);
45```
46**描述:**
47
48检查AP热点模式是否启用。
49
50### GetStationList()
51```c
52WifiErrorCode GetStationList(StationInfo* result, unsigned int* size)
53```
54**描述:**
55
56获取连接到该热点的一系列STA。
57
58**参数:**
59
60|参数名|描述|
61|:--|:------|
62| result | 表示连接到该热点的STA列表。  |
63| size | 表示连接到该热点的STA数量。  |
64
65
66
67## 软件设计
68
69**主要代码分析**
70
71完成Wifi热点的扫描需要以下几步。
72
731. 通过 `RegisterWifiEvent` 接口向系统注册热点状态改变事件、STA站点加入事件、STA站点退出事件。
74
75    * `OnHotspotStateChangedHandler` 用于绑定热点状态改变事件,该回调函数有一个参数 `state` 。
76
77        * state表示是否开启AP模式,取值为0和1,0表示已启用Wifi AP模式,1表示已禁用Wifi AP模式。
78
79    * `OnHotspotStaLeaveHandler` 用于绑定STA站点退出事件,当有STA站点退出,该回调函数会打印出退出站点的MAC地址。
80    * `OnHotspotStaJoinHandler` 用于绑定STA站点加入事件,当有新的STA站点加入时,该回调函数会创建 `HotspotStaJoinTask`,在该任务中会调用 `GetStationList` 函数获取当前接入到该AP的所有STA站点信息,并打印出每个STA站点的MAC地址。
812. 调用 `SetHotspotConfig` 接口,设置指定的热点配置。
823. 调用 `EnableHotspot` 接口,使能 Wifi AP 模式。
83
84
85```c
86static BOOL WifiAPTask(void)
87{
88    //延时2S便于查看日志
89    osDelay(TASK_DELAY_2S);
90
91    //注册wifi事件的回调函数
92    g_wifiEventHandler.OnHotspotStaJoin = OnHotspotStaJoinHandler;
93    g_wifiEventHandler.OnHotspotStaLeave = OnHotspotStaLeaveHandler;
94    g_wifiEventHandler.OnHotspotStateChanged = OnHotspotStateChangedHandler;
95    error = RegisterWifiEvent(&g_wifiEventHandler);
96    if (error != WIFI_SUCCESS) {
97        printf("RegisterWifiEvent failed, error = %d.\r\n", error);
98        return -1;
99    }
100    printf("RegisterWifiEvent succeed!\r\n");
101        //检查热点模式是否使能
102    if (IsHotspotActive() == WIFI_HOTSPOT_ACTIVE) {
103        printf("Wifi station is  actived.\r\n");
104        return -1;
105    }
106    //设置指定的热点配置
107    HotspotConfig config = { 0 };
108
109    strcpy_s(config.ssid, strlen(AP_SSID) + 1, AP_SSID);
110    strcpy_s(config.preSharedKey, strlen(AP_PSK) + 1, AP_PSK);
111    config.securityType = WIFI_SEC_TYPE_PSK;
112    config.band = HOTSPOT_BAND_TYPE_2G;
113    config.channelNum = CHANNEL_NUM;
114
115    error = SetHotspotConfig(&config);
116    if (error != WIFI_SUCCESS) {
117        printf("SetHotspotConfig failed, error = %d.\r\n", error);
118        return -1;
119    }
120    printf("SetHotspotConfig succeed!\r\n");
121
122    //启动wifi热点模式
123    error = EnableHotspot();
124    if (error != WIFI_SUCCESS) {
125        printf("EnableHotspot failed, error = %d.\r\n", error);
126        return -1;
127    }
128    printf("EnableHotspot succeed!\r\n");
129
130    StartUdpServer();
131}
132```
133
134## 编译调试
135
136### 修改 BUILD.gn 文件
137
138修改 `device\bearpi\bearpi_hm_nano\app` 路径下 BUILD.gn 文件,指定 `wifi_ap` 参与编译。
139```r
140"D1_iot_wifi_ap:wifi_ap",
141#"D2_iot_wifi_sta_connect:wifi_sta_connect",
142#"D3_iot_udp_client:udp_client",
143#"D4_iot_tcp_server:tcp_server",
144#"D5_iot_mqtt:iot_mqtt",
145#"D6_iot_cloud_oc:oc_mqtt",
146```
147
148
149### 运行结果
150
151示例代码编译烧录代码后,按下开发板的RESET按键,通过串口助手查看日志,使用手机去连接该热点,会打印出一下信息。
152```
153RegisterWifiEvent succeed!
154
155SetHotspotConfig succeed!
156
157HotspotStateChanged:state is 1.
158
159EnableHotspot succeed!
160
161Wifi station is actived!
162
163+NOTICE:STA CONNECTED
164New Sta Join
165HotspotSta[0]: macAddress=EC:5C:68:5B:2D:3D.
166
167netifapi_netif_set_addr succeed!
168
169netifapi_dhcps_start succeed!
170
171Waiting to receive data...
172```
173
174
175