Advertisement

[国产MCU]-W801开发实例-WiFi连接

阅读量:

WiFi连接

文章目录

  • WiFi连接
    • 1、WiFi连接API介绍
    • 2、WiFi连接示例

在之前的文献中,我们完成了WiFi热点扫描这一技术。本篇将继续阐述如何将W801设备接入至 WiFi 网络这一操作流程。

1、WiFi连接API介绍

  • int tls_wifi_connect(u8 ssid, u8 ssid_len, u8 pwd, u8 pwd_len) **:使用给定的SSID连接WiFi热点
    • ssid:所使用的WiFi接入点名称
    • ssid_len:该SSID字符串的长度
    • pwd:所使用的密码字符串
    • pwd_len:密码字符串的长度
    • 返回值:
      • 当返回值为WM_SUCCESS时表明连接成功完成
      • 若返回值为WM_FAILED则表示连接操作未能完成

函数tls_wifi_connect_by_b ssid接收u8类型的b ssid、u8类型的p w d以及u16类型的p w d_length字段,并基于给定的B SSID名称建立WiFi接入。此函数的功能是通过指定的B SSID名称实现WiFi热点的连接。

  • int tls_wifi_connect_by_ssid_bssid(u8 ssid,u8 ssid_len,u8 bssid,u8* pwd,u8 pwd_len)**:通过BSSID和和BSSIDl连接WiFi

    • ssid:WiFi的SSID
    • ssid_len:SSID长度
    • bssid:BSSID名称
    • pwd:WiFi连接密码
    • pwd_len:连接密码长度
    • 返回值:
      • WM_SUCCESS:表示连接成功
      • WM_FAILED:表示连接失败
  • void tls_wifi_disconnect(void) :断开WiFi连接

请关注以下情况:当已知 SSID 和 BSSID 时(即已知 SSID 和 BSSID 的情况下),设备可被配置用于连接至相应的 Wi-Fi AP 设备。为了实现这一操作,请确保设备已正确配置并运行此功能,并访问指定链接以获取所需配置参数;其中的 wifi_status_change_cb 仅返回 WIFI 接口层的状态信息。同时建议用户注册 netif 状态回调函数以获取 TCP/IP 层的状态信息。

2、WiFi连接示例

1)WiFi连接任务定义

复制代码
    // wifi_connect_task.h
    #ifndef __WIFI_CONNECT_TASK_H__
    #define __WIFI_CONNECT_TASK_H__
    
    void create_wifi_connect_task(void);
    
    #endif

2)WiFi连接任务定义实现

复制代码
    // wifi_connect_task.c
    #include <stdio.h>
    #include "wifi_connect_task.h"
    #include "wm_include.h"
    #include "utils/delay.h"
    #include "wifi.h"
    #define    WIFI_CONNECT_TASK_SIZE      512
    // user prio 32 - 60
    #define  WIFI_CONNECT_TASK_PRIO		32
    static OS_STK 			__wifi_connect_task_stack[WIFI_CONNECT_TASK_SIZE];
    
    #define SSID "****"
    #define PWD "*******"
    
    // WiFi状态变化回调函数
    static void wifi_status_changed_event(u8 status )
    {
    switch(status)
    {
    case NETIF_WIFI_JOIN_SUCCESS: // 连接成功
        printf("NETIF_WIFI_JOIN_SUCCESS\n");
        break;
    case NETIF_WIFI_JOIN_FAILED: // 连接失败
        printf("NETIF_WIFI_JOIN_FAILED\n");
        break;
    case NETIF_WIFI_DISCONNECTED: // 连接断开
        printf("NETIF_WIFI_DISCONNECTED\n");
        break;
    case NETIF_IP_NET_UP: // 连接到热点并分配IP
    {
        struct tls_ethif *tmpethif = tls_netif_get_ethif();
    		// 打印IP信息
        print_ipaddr(&tmpethif->ip_addr);
    #if TLS_CONFIG_IPV6
        print_ipaddr(&tmpethif->ip6_addr[0]);
        print_ipaddr(&tmpethif->ip6_addr[1]);
        print_ipaddr(&tmpethif->ip6_addr[2]);
    #endif
    }
    break;
    default:
        printf("UNKONWN STATE:%d\n", status);
        break;
    }
    }
    
    // WiFi连接任务
    void wifi_connect_task(void*params){
    // 启动WiFi连接
    	wifi_connect(SSID,PWD,wifi_status_changed_event);
    	for(;;){
    		tls_os_time_delay(10);
    	}
    }
    
    void create_wifi_connect_task(void){
    	tls_os_task_create( 					 /*创建新任务*/
    		NULL,		    					 /*任务句柄*/
    		"hello_task",   					 /*任务名称*/
    		wifi_connect_task,							 /*任务函数*/
    		NULL,								 /*任务参数*/
    		(void*)__wifi_connect_task_stack,			 /*任务堆栈基地址*/
    		WIFI_CONNECT_TASK_SIZE * sizeof(uint32_t),  /*任务堆栈大小*/
    		WIFI_CONNECT_TASK_PRIO,					 /*任务优先级*/
    		0									 /*任务标志*/
    		);
    }

3)WiFi连接封装定义

复制代码
    // wifi.h
    #ifndef __WIFI_H__
    #define __WIFI_H__
    
    #include "wm_include.h"
    
    int wifi_connect(const char* ssid,const char* pwd,tls_netif_status_event_fn status_callback);
    #endif

4)WiFi连接封装定义实现

复制代码
    // wifi.c
    #include "wifi.h"
    
    int wifi_connect(const char* ssid,const char* pwd,tls_netif_status_event_fn status_callback){
    struct tls_param_ip *ip_param = NULL;
    u8 wireless_protocol = 0;
    
    if (!ssid){
        return WM_FAILED;
    }
    
    printf("\nssid:%s\n", ssid);
    printf("password=%s\n", pwd);
    	// 判断连接
    tls_wifi_disconnect();
    	
    	// 查询WiFi无线协议
    tls_param_get(TLS_PARAM_ID_WPROTOCOL, (void *) &wireless_protocol, TRUE);
    if (TLS_PARAM_IEEE80211_INFRA != wireless_protocol){
    		// 关闭WiFi热点
        tls_wifi_softap_destroy();
        wireless_protocol = TLS_PARAM_IEEE80211_INFRA;
    		// 设置WiFi无线协议
        tls_param_set(TLS_PARAM_ID_WPROTOCOL, (void *) &wireless_protocol, FALSE);
    }
    
    	// 关闭oneshot
    tls_wifi_set_oneshot_flag(0);
    
    ip_param = tls_mem_alloc(sizeof(struct tls_param_ip));
    if (ip_param){
        tls_param_get(TLS_PARAM_ID_IP, ip_param, FALSE);
    		// 使能DHCP
        ip_param->dhcp_enable = TRUE;
        tls_param_set(TLS_PARAM_ID_IP, ip_param, FALSE);
        tls_mem_free(ip_param);
    }
    	
    	// 设置WiFi状态回调函数
    tls_netif_add_status_event(status_callback);
    	// 连接WiFi
    tls_wifi_connect((u8 *)ssid, strlen(ssid), (u8 *)pwd, strlen(pwd));
    printf("\nplease wait connect net......\n");
    
    return WM_SUCCESS;
    }

5)应用程序启动

复制代码
    // app.c
    #include "app.h"
    #include "tasks/wifi_connect_task.h"
    
    
    void app_start(void){
    	create_wifi_connect_task();
    }

全部评论 (0)

还没有任何评论哟~