小熊派鸿蒙社区
直播中

小熊派开源社区

4年用户 123经验值
擅长:嵌入式技术 物联网
私信 关注
[经验]

BearPi-HM_Nano开发板WiFi编程开发——Wifi连接热点

BearPi-HM_Nano开发板WiFi编程开发——Wifi连接热点本示例将演示如何在BearPi-HM_Nano开发板上编写一个Wifi连接热点业务程序

Wifi API分析本案例主要使用了以下几个API完成Wifi联网
RegisterWifiEvent()WifiErrorCode RegisterWifiEvent (WifiEvent * event)

描述: 为指定的Wi-Fi事件注册回调函数。当WifiEvent中定义的Wi-Fi事件发生时,将调用已注册的回调函数
参数:
名字
描述

event
表示要注册回调的事件.
EnableWifi()WifiErrorCode EnableWifi (void )

描述:
启用STA模式
AddDeviceConfig()WifiErrorCode AddDeviceConfig (const WifiDeviceConfig * config, int * result )

描述:
添加用于配置连接到热点信息,此函数生成一个networkId
参数:
名字
描述

config
表示要连接的热点信息.

result
表示生成的networkId。每个networkId匹配一个热点配置
ConnectTo()WifiErrorCode ConnectTo (int networkId)

描述:
连接到指定networkId的热点
参数:
名字
描述

networkId
表示与目标热点匹配的网络id.
netifapi_netif_find()struct netif *netifapi_netif_find(const char *name);

描述:
获取netif用于IP操作
dhcp_start()err_t dhcp_start(n)

描述:
启动DHCP, 获取IP
软件设计主要代码分析
完成Wifi热点的连接需要以下几步
  • 通过 RegisterWifiEvent 接口向系统注册扫描状态监听函数,用于接收扫描状态通知,如扫描动作是否完成等
  • OnWifiConnectionChangedHandler 用于绑定连接状态监听函数,该回调函数有两个参数 state 和 info ;

    • state表示扫描状态,取值为0和1,1表示热点连接成功;
    • info表示Wi-Fi连接信息,包含以下参数;
      名字
      描述

      ssid [WIFI_MAX_SSID_LEN]
      连接的热点名称.

      bssid [WIFI_MAC_LEN]
      MAC地址.

      rssi
      接收信号强度(RSSI).

      connState
      Wifi连接状态.

      disconnectedReason
      Wi-Fi断开的原因.

  • 调用 EnableWifi 接口,使能 Wifi。
  • 调用 AddDeviceConfig 接口,配置连接的热点信息。
  • 调用 ConnectTo 接口,连接到指定networkId的热点。
  • 调用 WaitConnectResult 接口等待,该函数中会有15s的时间去轮询连接成功标志位 g_ConnectSuccess,当g_ConnectSuccess 为 1 时退出等待。
  • 调用 netifapi_netif_find 接口,获取 netif 用于 IP 操作
  • 调用 dhcp_start 接口,启动 DHCP, 获取 IP
static BOOL WifiSTATask(void){    WifiScanInfo *info = NULL;    unsigned int size = WIFI_SCAN_HOTSPOT_LIMIT;    static struct netif *g_lwip_netif = NULL;    WifiDeviceConfig select_ap_config = {0};    osDelay(200);    printf("<--System Init-->rn");    //初始化WIFI    WiFiInit();    //使能WIFI    if (EnableWifi() != WIFI_SUCCESS)    {        printf("EnableWifi failed, error = %drn", error);        return -1;    }    //判断WIFI是否激活    if (IsWifiActive() == 0)    {        printf("Wifi station is not actived.rn");        return -1;    }    //分配空间,保存WiFi信息    info = malloc(sizeof(WifiScanInfo) * WIFI_SCAN_HOTSPOT_LIMIT);    if (info == NULL)    {        return -1;    }    //轮询查找WiFi列表    do{        //重置标志位        ssid_count = 0;        g_staScanSuccess = 0;        //开始扫描        Scan();        //等待扫描结果        WaitSacnResult();        //获取扫描列表        error = GetScanInfoList(info, &size);    }while(g_staScanSuccess != 1);    //打印WiFi列表    printf("********************rn");    for(uint8_t i = 0; i < ssid_count; i++)    {        printf("no:%03d, ssid:%-30s, rssi:%5drn", i+1, info.ssid, info.rssi/100);    }    printf("********************rn");        //连接指定的WiFi热点    for(uint8_t i = 0; i < ssid_count; i++)    {        if (strcmp(SELECT_WIFI_SSID, info.ssid) == 0)        {            int result;            printf("Select:%3d wireless, Waiting...rn", i+1);            //拷贝要连接的热点信息            strcpy(select_ap_config.ssid, info.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!rn");                    g_lwip_netif = netifapi_netif_find(SELECT_WLAN_PORT);                    break;                }            }        }        if(i == ssid_count-1)        {            printf("ERROR: No wifi as expectedrn");            while(1) osDelay(100);        }    }    //启动DHCP    if (g_lwip_netif)    {        dhcp_start(g_lwip_netif);        printf("begain to dhcprn");    }    //等待DHCP    for(;;)    {        if(dhcp_is_bound(g_lwip_netif) == ERR_OK)        {            printf("<-- DHCP state:OK -->rn");            //打印获取到的IP信息            netifapi_netif_common(g_lwip_netif, dhcp_clients_info_show, NULL);            break;        }        printf("<-- DHCP state:Inprogress -->rn");        osDelay(100);    }    //执行其他操作    for(;;)    {        osDelay(100);    }}

编译调试修改对接热点的账号密码修改wifi_sta_connect.c第51行和52行的热点账号密码
#define SELECT_WIFI_SSID "BearPi"#define SELECT_WIFI_PASSWORD "0987654321"

修改 BUILD.gn 文件修改 applicationsBearPiBearPi-HM_Nanosample 路径下 BUILD.gn 文件,指定 wifi_sta_connect 参与编译。
#"D1_iot_wifi_sta:wifi_sta","D2_iot_wifi_sta_connect:wifi_sta_connect",        #"D3_iot_udp_client:udp_client",#"D4_iot_tcp_server:tcp_server",#"D5_iot_mqtt:iot_mqtt",        #"D6_iot_cloud_oc:oc_mqtt",#"D7_iot_cloud_onenet:onenet_mqtt",

运行结果示例代码编译烧录代码后,按下开发板的RESET按键,通过串口助手查看日志,会打印连接到的Wifi热点信息。
<--System Init--><--Wifi Init-->register wifi event succeed!+NOTICE:SCANFINISHWaitSacnResult:wait success[1]sSelect:  2 wireless, Waiting...+NOTICE:CONNECTEDcallback function for wifi connectWaitConnectResult:wait success[1]sWiFi connect succeed!begain to dhcp<-- DHCP state:Inprogress --><-- DHCP state:OK -->server :        server_id : 192.168.0.1        mask : 255.255.255.0, 1        gw : 192.168.0.1        T0 : 7200        T1 : 3600        T2 : 6300clients <1> :        mac_idx mac             addr            state   lease   tries   rto             0       801131801388    192.168.0.151   10      0       1       4      


更多回帖

×
20
完善资料,
赚取积分