[国产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)
还没有任何评论哟~
