描述
本文来源电子发烧友社区,作者:华仔stm32, 帖子地址:
https://bbs.elecfans.com/jishu_2284739_1_1.html根据连老师的教程:鸿蒙第4节 Hi3861 Wifi操作,热点连接。但是我用的liteOs直接复制过去还是不行的,仔细阅读源码后,修改好后可以连上热点了,下面分享一下我的例程:1、在appdemosrc下新建wifi_demo.c:然后建立如下代码:
-
#include
-
-
#include
-
-
#include
-
#include "hi_wifi_api.h"
-
#include "lwip/ip_addr.h"
-
#include "lwip/netifapi.h"
-
-
#define APP_INIT_VAP_NUM 2
-
#define APP_INIT_USR_NUM 2
-
-
static struct netif *g_lwip_netif = NULL;
-
-
/* clear netif's ip, gateway and netmask */
-
void hi_sta_reset_addr(struct netif *pst_lwip_netif)
-
{
-
ip4_addr_t st_gw;
-
ip4_addr_t st_ipaddr;
-
ip4_addr_t st_netmask;
-
printf("%s %d rn", __FILE__, __LINE__);
-
if (pst_lwip_netif == NULL) {
-
printf("hisi_reset_addr::Null param of netdevrn");
-
return;
-
}
-
-
IP4_ADDR(&st_gw, 0, 0, 0, 0);
-
IP4_ADDR(&st_ipaddr, 0, 0, 0, 0);
-
IP4_ADDR(&st_netmask, 0, 0, 0, 0);
-
-
netifapi_netif_set_addr(pst_lwip_netif, &st_ipaddr, &st_netmask, &st_gw);
-
}
-
-
void wifi_wpa_event_cb(const hi_wifi_event *hisi_event)
-
{
-
if (hisi_event == NULL)
-
return;
-
-
switch (hisi_event->event) {
-
case HI_WIFI_EVT_SCAN_DONE:
-
printf("WiFi: Scan results availablen");
-
break;
-
case HI_WIFI_EVT_CONNECTED:
-
printf("WiFi: Connectedn");
-
netifapi_dhcp_start(g_lwip_netif);
-
break;
-
case HI_WIFI_EVT_DISCONNECTED:
-
printf("WiFi: Disconnectedn");
-
netifapi_dhcp_stop(g_lwip_netif);
-
hi_sta_reset_addr(g_lwip_netif);
-
break;
-
case HI_WIFI_EVT_WPS_TIMEOUT:
-
printf("WiFi: wps is timeoutn");
-
break;
-
default:
-
break;
-
}
-
}
-
-
int hi_wifi_start_connect(void)
-
{
-
int ret;
-
errno_t rc;
-
hi_wifi_assoc_request assoc_req = {0};
-
-
/* copy SSID to assoc_req */
-
//热点名称
-
rc = memcpy_s(assoc_req.ssid, HI_WIFI_MAX_SSID_LEN + 1, "you ssid", sizeof("you ssid")); /* 9:ssid length */
-
if (rc != EOK) {
-
printf("%s %d rn", __FILE__, __LINE__);
-
return -1;
-
}
-
-
/*
-
* OPEN mode
-
* for WPA2-PSK mode:
-
* set assoc_req.auth as HI_WIFI_SECURITY_WPA2PSK,
-
* then memcpy(assoc_req.key, "12345678", 8).
-
*/
-
//热点加密方式
-
assoc_req.auth = HI_WIFI_SECURITY_WPA2PSK;
-
-
/* 热点密码 */
-
memcpy(assoc_req.key, "you pwd", sizeof("you pwd"));
-
-
-
ret = hi_wifi_sta_connect(&assoc_req);
-
if (ret != HISI_OK) {
-
printf("%s %d rn", __FILE__, __LINE__);
-
return -1;
-
}
-
printf("%s %d rn", __FILE__, __LINE__);
-
//printf("%srn",g_lwip_netif->flags);
-
return 0;
-
}
-
-
int hi_wifi_start_sta(void)
-
{
-
int ret;
-
char ifname[WIFI_IFNAME_MAX_SIZE + 1] = {0};
-
int len = sizeof(ifname);
-
const unsigned char wifi_vap_res_num = APP_INIT_VAP_NUM;
-
const unsigned char wifi_user_res_num = APP_INIT_USR_NUM;
-
unsigned int num = WIFI_SCAN_AP_LIMIT;
-
-
printf("%s %d rn", __FILE__, __LINE__);
-
-
ret = hi_wifi_init(wifi_vap_res_num, wifi_user_res_num);
-
if (ret != HISI_OK) {
-
printf("%s %d rn", __FILE__, __LINE__);
-
//return -1;
-
}
-
-
printf("%s %d rn", __FILE__, __LINE__);
-
ret = hi_wifi_sta_start(ifname, &len);
-
if (ret != HISI_OK) {
-
printf("%s %d rn", __FILE__, __LINE__);
-
return -1;
-
}
-
-
/* register call back function to receive wifi event, etc scan results event,
-
* connected event, disconnected event.
-
*/
-
ret = hi_wifi_register_event_callback(wifi_wpa_event_cb);
-
if (ret != HISI_OK) {
-
printf("register wifi event callback faiLEDn");
-
}
-
-
/* acquire netif for IP operation */
-
g_lwip_netif = netifapi_netif_find(ifname);
-
if (g_lwip_netif == NULL) {
-
printf("%s: get netif failedn", __FUNCTION__);
-
return -1;
-
}
-
-
/* start scan, scan results event will be received soon */
-
ret = hi_wifi_sta_scan();
-
if (ret != HISI_OK) {
-
printf("%s %d rn", __FILE__, __LINE__);
-
return -1;
-
}
-
-
sleep(5); /* sleep 5s, waiting for scan result. */
-
-
hi_wifi_ap_info *pst_results = malloc(sizeof(hi_wifi_ap_info) * WIFI_SCAN_AP_LIMIT);
-
if (pst_results == NULL) {
-
printf("%s %d rn", __FILE__, __LINE__);
-
return -1;
-
}
-
-
ret = hi_wifi_sta_scan_results(pst_results, &num);
-
if (ret != HISI_OK) {
-
printf("%s %d rn", __FILE__, __LINE__);
-
free(pst_results);
-
return -1;
-
}
-
-
for (unsigned int loop = 0; (loop < num) && (loop < WIFI_SCAN_AP_LIMIT); loop++) {
-
printf("SSID: %sn", pst_results[loop].ssid);
-
}
-
free(pst_results);
-
-
/* if received scan results, select one SSID to connect */
-
ret = hi_wifi_start_connect();
-
if (ret != 0) {
-
printf("%s %d rn", __FILE__, __LINE__);
-
return -1;
-
}
-
-
-
return 0;
-
}
-
-
void hi_wifi_stop_sta(void)
-
{
-
int ret;
-
-
ret = hi_wifi_sta_stop();
-
if (ret != HISI_OK) {
-
printf("failed to stop stan");
-
}
-
-
ret = hi_wifi_deinit();
-
if (ret != HISI_OK) {
-
printf("failed to deinit wifin");
-
}
-
-
g_lwip_netif = NULL;
-
-
}
-
-
复制代码
大家把you ssid、you pwd更换成自己的wifi热点名称与密码。然后在app_main函数中增加:
-
extern int hi_wifi_start_sta(void);
-
hi_wifi_start_sta();
复制代码
编后编译下载就可以连上自己家的路由器了:从路由器上看到连上一个客户端,ip地址为192.168.3.14,然后可以ping通:【总结】经过这个示例的学习,可以设置自己的ssidpwd连上wifi。下一步学习tcpmqtt等示例。
打开APP阅读更多精彩内容