前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >鸿蒙之WiFi联网

鸿蒙之WiFi联网

作者头像
跋扈洋
发布2022-03-29 08:40:23
6140
发布2022-03-29 08:40:23
举报
文章被收录于专栏:物联网知识

介绍

Station模式

从理论上来说,任何一个WiFi设备都可以称位STA。STA是支持IEEE802.11协议的设备。 在大多数情况下,当大家说到STA模式时,一般是指具有WiFi client行为的设备,可以连接到接入点。 STA会扫描可连接的接入点,选择一个想要连接的接入点,经过认证、关联等步骤后,将与接入点进行连接。

WiFi连接过程介绍

WiFi扫描有两种不同的方式,一种是主动扫描,另一种是被动扫描。

  1. 主动扫描。由WiFi client 在每个信道上发送探测请求帧,接入点收到探测请求之后,返回探测响应。主动扫描需要指定一定的条件。例如: SSID,根据指定的AP SSID扫描。 频段,根据特定的频带扫描,单位是MHz。 频带,根据特定的频带扫描。 如果没有指定任何参数,那么会认为这是一个被动扫描请求。
  2. 被动扫描。被动扫描即WiFi Client在每个信道上监听接入点发出的Beacon Frame。

具体设计

  1. 扫描WiFi接入点 WifiErrorCode Scan(void) 该函数触发WiFi接入点的扫描。若成功,则返回WIFI_SUCCESS;若错误,则返回相应的错误码。
  2. 初始化wifi
代码语言:javascript
复制
static void WiFiInit(void)
{
    printf("<--Wifi Init-->\r\n");
    g_wifiEventHandler.OnWifiScanStateChanged = OnWifiScanStateChangedHandler;
    g_wifiEventHandler.OnWifiConnectionChanged = OnWifiConnectionChangedHandler;
    g_wifiEventHandler.OnHotspotStaJoin = OnHotspotStaJoinHandler;
    g_wifiEventHandler.OnHotspotStaLeave = OnHotspotStaLeaveHandler;
    g_wifiEventHandler.OnHotspotStateChanged = OnHotspotStateChangedHandler;
    error = RegisterWifiEvent(&g_wifiEventHandler);
    if (error != WIFI_SUCCESS)
    {
        printf("register wifi event fail!\r\n");
    }
    else
    {
        printf("register wifi event succeed!\r\n");
    }
}
  1. 使能WIFI
代码语言:javascript
复制
if (EnableWifi() != WIFI_SUCCESS)
{
    printf("EnableWifi failed, error = %d\n", error);
    return -1;
}
  1. 判断WIFI是否激活
代码语言:javascript
复制
 if (IsWifiActive() == 0)
    {
        printf("Wifi station is not actived.\n");
        return -1;
    }
  1. 分配空间,保存WiFi信息
代码语言:javascript
复制
info = malloc(sizeof(WifiScanInfo) * WIFI_SCAN_HOTSPOT_LIMIT);
if (info == NULL)
{
    return -1;
}
  1. 轮询查找WiFi列表
代码语言:javascript
复制
do{
    //重置标志位
    ssid_count = 0;
    g_staScanSuccess = 0;

    //开始扫描
    Scan();

    //等待扫描结果
    WaitSacnResult();

    //获取扫描列表
    error = GetScanInfoList(info, &size);

}while(g_staScanSuccess != 1);
  1. 打印WiFi列表
代码语言:javascript
复制
printf("********************\r\n");
for(uint8_t i = 0; i < ssid_count; i++)
{
    printf("no:%03d, ssid:%-30s, rssi:%5d\r\n", i+1, info[i].ssid, info[i].rssi/100);
}
printf("********************\r\n");
  1. 连接指定的WiFi热点
代码语言:javascript
复制
 for(uint8_t i = 0; i < ssid_count; i++)
    {
        if (strcmp(SELECT_WIFI_SSID, info[i].ssid) == 0)
        {
            int result;

            printf("Select:%3d wireless, Waiting...\r\n", i+1);

            //拷贝要连接的热点信息
            strcpy(select_ap_config.ssid, info[i].ssid);
            strcpy(select_ap_config.preSharedKey, SELECT_WIFI_PASSWORD);
            select_ap_config.securityType = SELECT_WIFI_SECURITYTYPE;

            if (AddDeviceConfig(&select_ap_config, &result) == WIFI_SUCCESS)
            {
                if (ConnectTo(result) == WIFI_SUCCESS && WaitConnectResult() == 1)
                {
                    printf("WiFi connect succeed!\r\n");
                    g_lwip_netif = netifapi_netif_find(SELECT_WLAN_PORT);
                    break;
                }
            }
        }

        if(i == ssid_count-1)
        {
            printf("ERROR: No wifi as expected\r\n");
            while(1) osDelay(100);
        }
    }
  1. 启动DHCP
代码语言:javascript
复制
 if (g_lwip_netif)
    {
        dhcp_start(g_lwip_netif);
        printf("begain to dhcp");
    }
  1. 等待DHCP
代码语言:javascript
复制
 for(;;)
    {
        if(dhcp_is_bound(g_lwip_netif) == ERR_OK)
        {
            printf("<-- DHCP state:OK -->\r\n");

            //打印获取到的IP信息
            netifapi_netif_common(g_lwip_netif, dhcp_clients_info_show, NULL);
            break;
        }

        printf("<-- DHCP state:Inprogress -->\r\n");
        osDelay(100);
    }
  1. 执行其他操作
代码语言:javascript
复制
for(;; )
{
    osDelay(100);
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 物联网知识 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
    • Station模式
      • WiFi连接过程介绍
      • 具体设计
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档