ESP32作为接入点AP
作为接入点的第一个任务是使用esp_wifi_set_mode()函数设置ESP32 函数并传递请求,作为接入点,可以把ESP32设置为AP或者APSTA,即
esp_wifi_set_mode(WIFI_MODE_STA)
或者
esp_wifi_set_mode(WIFI_MODE_APSTA)
接下来我们需要提供配置信息。 我们通过填充wifi_ap_config_t 来做到这一点。
该 wifi_ap_config_t 包含:
• SSID - WiFi的SSID名称,用于连接站。
• ssid_len - SSID的字节长度,如果不是NULL终止。
• 密码 - 用于站验证的密码。
• 渠道 - 这个例子中我们使用的网络通道。
• authmode - 我们如何想站进行身份验证(如果人)。 选择是
◦ OPEN
◦ WEP
◦ WPA
◦ WPA2
◦ wpa_wpa2
• ssid_hidden - 我们是否应该广播SSID我们。
• max_connection - 并发站的数量。 默认值和最大值是4。
• beacon_interval - 未知。 100。
此结构的初始化示例是:
wifi_config_t apConfig = {
.ap = {
.ssid="<access point name>",
.ssid_len=,
.password="<password>",
.channel=,
.authmode=WIFI_AUTH_OPEN,
.ssid_hidden=,
.max_connection=,
.beacon_interval=
}
};
然后,我们调用
esp_wifi_set_config(WIFI_IF_AP,&apConfig);
将参数进行设置,最后调用esp_wifi_start()使WIFI开始工作。
下面是ESP32作为接入点的相关源码:
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "esp_system.h"
#include "esp_wifi.h"
#include "esp_event_loop.h"
#include "esp_log.h"
#include "nvs_flash.h" #include "driver/gpio.h"
#include "esp_types.h" /* FreeRTOS Task Handle -------------------------------------------------------*/ /* FreeRTOS Semaphore Handle --------------------------------------------------*/ /* FreeRTOS event group to signal when we are connected & ready to make a request */ static const char *TAG = "example"; //#define LED_GPIO_NUM GPIO_NUM_25
#define LED_GPIO_NUM GPIO_NUM_4//LED闪烁接口,为以后通过LED显示连接状态做拓展准备。 #define CONFIG_AP_SSID "ESP32"
#define CONFIG_AP_PASSWORD "12345678"//配置AP的SSID 和password uint8_t ApMac[];//网卡地址 /**
* @brief no .
* @note no.
* @param no.
* @retval no.
*/
esp_err_t event_handler(void *ctx, system_event_t *event)//等待回调事件
{
switch (event->event_id)//对事件进行识别
{
case SYSTEM_EVENT_STA_START:
ESP_LOGI(TAG, "Connecting to AP...");
esp_wifi_connect();
break; case SYSTEM_EVENT_STA_GOT_IP:
ESP_LOGI(TAG, "Connected.");
break; case SYSTEM_EVENT_STA_DISCONNECTED:
//ESP_LOGI(TAG, "Wifi disconnected, try to connect again...");
esp_wifi_connect();
break; default:
break;
} return ESP_OK;
} /**
* @brief no .
* @note no.
* @param no.
* @retval no.
*/
void led_init( void )
{
gpio_set_direction( LED_GPIO_NUM , GPIO_MODE_OUTPUT );
} /**
* @brief no .
* @note no.
* @param no.
* @retval no.
*/
void led_task( void *pvParameters )
{
int level = ; for( ;; )
{
gpio_set_level( LED_GPIO_NUM , level);
level = !level;
vTaskDelay( / portTICK_PERIOD_MS);
}
} void app_main(void)
{
nvs_flash_init();//初始化NVS内存
led_init();
tcpip_adapter_init();//tcp/IP配置
ESP_ERROR_CHECK( esp_event_loop_init(event_handler, NULL) );//回调,当ESP32检测到某些类型的WiFi相关事件时调用。
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();//定义一个名为cfg的wifi_init_config_t结构体。wifi_init_config_t中的参数可由menuconfig配置
ESP_ERROR_CHECK( esp_wifi_init(&cfg) );
ESP_ERROR_CHECK( esp_wifi_set_storage(WIFI_STORAGE_RAM) );//指示ESP32将这些设置记录到闪存
ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_AP) );//模式设置为AP esp_wifi_get_mac( ESP_IF_WIFI_AP , ApMac );//获取DHCP分配的IP接口的mac。 wifi_config_t ap_config = {
.ap = {
// .ssid = ssid,
.password = CONFIG_AP_PASSWORD,
.ssid_len = ,
.max_connection = ,
.authmode = WIFI_AUTH_WPA_PSK
}
};//ap接入点参数配置。 sprintf( (char *)ap_config.ap.ssid , "%s_%02X%02X" , CONFIG_AP_SSID , ApMac[] , ApMac[] ); esp_err_t tmp = esp_wifi_set_config(WIFI_IF_AP, &ap_config);
ESP_ERROR_CHECK(esp_wifi_start());
esp_wifi_connect(); xTaskCreate( &led_task, "led task", , NULL, , NULL ); }
实验现象:
打开minicom可以看到输出:
打开手机WIFI,可以看到名为ESP32_44F1的WIFI热点,打开热点,输入设置的PASSWORD:12345678即可连接成功,说明AP接口设置
编程讲解:
使用连接站
当我们的ESP32是接入点时,我们说我们希望允许电台
合作 nnect它。 这带来了管理这些电台的故事。 常见的事情
我们可能想做的是:
• 确定新车站何时连接
• 确定以前连接的电台何时离开
• 列出当前连接的电台
• 断开ÒNE 或多个当前连接的站
我们可以注册一个事件处理程序来检测新站连接和与现有站断开。 当我们成为接入点时,会产生ESP32 WiFi事件SYSTEM_EVENT_AP_START。当一个站连接时,ESP32西港岛线提高 SYSTEM_EVENT_AP_STACONNECTED事件。 当一个站断开,我们将看到 SYSTEM_EVENT_AP_DISCONNECTED事件。
我们可以使esp_wifi_get_station_list()函数获取当前连接的电台,函数返回站的链表。 这个列表的存储被分配给我们,我们应该调用 esp_wifi_free_station_list()释放它当我们不再存在需要它时 。
从ESP32中,我们可以判断很多为static项,比如当前连接数通过调用 wifi_softap_get_station_num()。 如果我们想找到那些站的细节,我们可以调用 wifi_softap_get_station_info(),它将返回链接列表wifi_sta_list_t,所以 我们必须调用wifi_softap_free_station_info()明确地释放此调用与分配的存储。
以下是一个代码段的示例,其中列出了连接站的详细信息:
uint8 stationCount = wifi_softap_get_station_num();
os_printf("stationCount = %d\n", stationCount);
wifi_sta_list_t *stationInfo = wifi_softap_get_station_info();
if (stationInfo != NULL) {
while (stationInfo != NULL) {
os_printf("Station IP: %d.%d.%d.%d\n", IP2STR(&(stationInfo->ip)));
stationInfo = STAILQ_NEXT(stationInfo, next);
}
wifi_softap_free_station_info();
}
如果由于某种原因,我们环境中的程序想强制断开当前的连接的station,我们可以使用 esp_wifi_kick_station()来断开。
WiFi在启动时
ESP32可以将WiFi启动信息存储在闪存中。 这允许它在启动时执行其功能,而无需向用户询问任何特殊的或附加信息。这种能力由函数esp_wifi_set_auto connect()和esp_wifi_get_auto_connect()完成。它们被用来自动连接的设置值和读取保存在闪存中的值,设置赋值的函数为esp_wifi_set_config(),存储方法通过esp_wifi_set_storage()来设置WiFi API配置存储类型。
首先讲解DHCP前需要了解什么是DHCP,DHCP即动态主机配置协议,它的作用是集中分配IP地址给主机,使网络环境中的主机可以动态的获得IP地址.如果想详细了解,可以看如下两个链接
https://baike.baidu.com/item/DHCP/218195?fr=aladdin
http://blog.csdn.net/u012359618/article/details/51872678
本文这里重点讲解其在ESP32中的应用和配置。
DHCP客户端
当ESP32作为站点连接到接入点时,它还运行DHCP客户端连接到它在接入点的DHCP服务器。 在那里,站点提供其IP地址,网关地址和网络掩码, 我们可以这样做:调用 tcpip_adapter_set_ip_info()在程序编写时。
函数逻辑如下(详情请回头看上篇文章结尾):
tcpip_adapter_init();
tcpip_adapter_dhcpc_stop();
tcpip_adapter_set_ip_info();
esp_wifi_init();
esp_wifi_set_mode();
esp_wifi_set_config();
esp_wifi_start();
esp_wifi_config();
但是当我们想为这些数据设置我们自己的值时。调用的tcpip_adapter_set_ip_info()时需要的参数可以按如下方法设置
tcpip_adapter_ip_info_t ipInfo;
IP4_ADDR(&ipInfo.ip, ,,,);
IP4_ADDR(&ipInfo.gw, ,,,);
IP4_ADDR(&ipInfo.netmask, ,,,);
tcpip_adapter_set_ip_info(TCPIP_ADAPTER_IF_STA, &ipInfo);
或者用字符串表示
tcpip_adapter_ip_info_t ipInfo;
inet_pton(AF_INET,“192.168.1.99”,&ipInfo.ip);
inet_pton(AF_INET,“192.168.1.1”,&ipInfo.gw);
inet_pton(AF_INET,“255.255.255.0”,&ipInfo.netmask);
tcpip_adapter_set_ip_info(TCPIP_ADAPTER_IF_STA,&ipInfo);
DHCP服务器
当ESP32作为接入点时,可能需要它作为DHCP服务器,以便连接站将能够自然而然的分配IP地址,并获得他们的子网掩码和网关。DHCP服务器可以启动和使用API调用设备中停止wifi_softap_dhcps_start() 和 wifi_softap_dhcps_stop(),当前DHCP服务器的状态(启动或停止),可以通过调用
wifi_softap_dhcps_status()查看。
由DHCP服务器提供的IP地址的默认范围是192.168.4.1向上。第一个地址成为分配给ESP32本身。我们需要注意的是它的地址和我们工作的LAN范围是不一样。即他形成了自己的网络地址空间,它们也许是一相同种类的网络IP(192.168.XX)出现的。当我们连接到它时,我们可以在PC上PING到它。
当前的IP地址,子网掩码和网关
当我们需要知道,当前环境中我们的ESP32中的IP地址,子网掩码和网关时,我们已经知道这些值是由DHCP服务器设置的,我们可以调用tcpip_adapter_get_ip_info()得到这些值,因为,由于ESP32可以有两个IP接口(一个用于接入点和一个用于站),我们需要通过参数使程序知道我们想要检索的接口。
WiFi保护设置 - WPS(定义)
该ESP32支持在站模式下的WiFi保护设置,这意味着,如果接入点支持,ESP32可以连接到接入点不呈现出密码。目前支持的只有“按钮模式”实现。利用这种机制,一个物理按钮被按下接入点,并且,对于一个周期的两分钟,在范围内的任何站可以使用加入网络WPS协议。官方给出了一个实际的应用例子是,当我们按下WPS的按键后,ESP32将调用wifi_wps_enable()和wifi_wps_start(),ESP32即可成功的连入计入端。
TCP服务器
到这里,WIFI的连接基本讲解完成了,还有ESP32即做AP又做STAION的设置没讲(后面的Smartconfig会讲到,就不做详细讲解了),下面即是ESP32连接后的通讯了,因为网络通讯与一般的串口通讯不同,起需要特定的通讯协议来完成数据间的传输,首先,下一篇文章讲解的是
TCP服务器
相关知识:wifi相关的API接口
ESP32作为接入点AP的更多相关文章
- ESP32随笔汇总
版权声明:本文为博主原创文章,未经博主本人不得转载.联系邮箱:mynoticeable@gmail.com 1.ubuntu 14.04下搭建esp32开发环境 2.UBUNTU14.0.4安装ecl ...
- 关于esp32的省电模式的WiFi连接
对于ESP32,其作为一款集成了2.4GHz WiFi和蓝牙双模块的单芯片,所有基于wifi和蓝牙开发是学习esp32的重要一环,今天WiFi原理和网络结构 可以点击链接进行详细的了解,这里就不做详细 ...
- Wi-Fi定位,AP定位
Wi-Fi实时定位系统 基于Wi-Fi的无线局域网实时定位系统(Wi-Fi RTLS)结合无线局域网络(WLAN).射频识别(RFID)和实时定位等多种技术,广泛地应用在有无线局域网覆盖的区域,实现复 ...
- 转 WiFi的STA和AP模式指什么?
1):AP,也就是无线接入点,是一个无线网络的创建者,是网络的中心节点.一般家庭或办公室使用的无线路由器就一个AP. 2):STA站点,每一个连接到无线网络中的终端(如笔记本电脑.PDA及其它可以联网 ...
- 华为eNSP环境,WLAN简介与组网,AP+AC详细配置
WLAN简单组网一.概述 无线局域网(Wireless Local Area Networks: WLAN)利用无线技术在空中传输数据.话音和视频信号.作为传统布线网络的一种替代方案或延伸,无线 ...
- ·通过wifi_scan学习esp32wifi程序编写
在ESP32的设计开发中,我们必然会需要使用到wifi或ble功能,今天就讲解下如何将WIFI功能纳入到ESP32中来. 初始化WiFi环境 首先,WiFi子系统的初始化需要由我们自己来自行,当我们写 ...
- 360路由器刷openwrt后设置wifi中继
上一篇文章(360路由器刷openwrt.不死uboot.双系统 .wifi中继 - 飞鸿影~ - 博客园)讲了如何在360路由器C301上安装openwrt以及安装双系统.这篇文章讲如何设置无线中继 ...
- Aircrack-ng官方文档翻译[中英对照]---Aireplay-ng
Aircrack-ng官方文档翻译---Aireplay-ng[90%] Description[简介] Aireplay-ng is used to inject frames. Aireplay- ...
- Aircrack-ng 工具箱
官网为:http://www.aircrack-ng.org/, 它就是一个与WiFi 相关的工具啦,可以进行一些注入,抓包.破解WiFI等.里面有很多不同的套件. 另外,http://blog.cs ...
随机推荐
- vs与linux的交叉编译环境搭建
很久之前就想写一个linux服务器,但是对linux的vim编译工具又不是很熟,只能在win环境下写好代码拷贝到linux环境下编译运行,现在VS出了一个插件可以对linux代码远程在linux环境下 ...
- Java 学习 UUID 与 时间格式化、时间操作
UUID : UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分.其目的,是让分 ...
- ipv6无网络访问权限怎么办
有时IP4和IP6都正常连接,但突然又出现“IPV6无网络访问权限” 这是win7系统下经常发生的事情,如下图. 方法/步骤 1.IPV6没网络权限是正常的因为你没有IPV6的网络环境,那个只有部分教 ...
- 【学习】通用函数:快速的元素级数组函数【Numpy】
通用函数(即ufunc)是一种对ndarray中的数据执行元素级运算的函数.可以将其看做简单函数(接受一个或多个标量值,并产生一个或多个标量值)的矢量化包装器. sqrt 和 exp为一元(unary ...
- git自定义项目钩子和全局钩子
钩子介绍 自定义钩子分为:项目钩子和全局钩子 自定义全局钩子: 全局钩子目录结构: (注意:excludes目录结构是我们自定义的目录,规则逻辑在update.d/update.py脚本里实现的,非g ...
- leetcode5
public class Solution { private int lo, maxLen; public String LongestPalindrome(String s) { int len ...
- model.form使用,配合form的钩子
一次model.form的使用记录,配合form钩子的过程 在写信息采集功能的时候,需要添加资产信息,使用modelform组件减少工作量 官网介绍:版本1.9.https://docs.django ...
- java应用健康检查
本文主要针对自己手写shell监控应用状态,有可系统解决方案的,比如K8S,可以略过 #!/bin/sh#health_check.sh count=`ps -ef | grep test.jar | ...
- ImportError: No module named pycocotools.coco,pycocotools/_mask.so: undefined symbol: _Py_ZeroStruct
准确的说是没有安装 pycocotools 可以借鉴下面链接: https://blog.csdn.net/ab0902cd/article/details/79085797 因为我通常用Python ...
- pyton 模块之 pysmb 文件上传和下载(linux)
首先安装pysmb模块 下载文件 from smb.SMBConnection import SMBConnection conn = SMBConnection('anonymous', '', ' ...