你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

ESP32作为接入点AP

[复制链接]
aimejia 发布时间:2018-5-31 10:16
本帖最后由 aimejia 于 2018-5-31 10:17 编辑

作为接入点的第一个任务是使用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。

此结构的初始化示例是:
  1. wifi_config_t apConfig = {
  2.    .ap = {
  3.       .ssid="<access point name>",
  4.       .ssid_len=0,
  5.       .password="<password>",
  6.       .channel=0,
  7.       .authmode=WIFI_AUTH_OPEN,
  8.       .ssid_hidden=0,
  9.       .max_connection=4,
  10.       .beacon_interval=100
  11.    }
  12. };
复制代码
然后,我们调用

esp_wifi_set_config(WIFI_IF_AP,&apConfig);

将参数进行设置,最后调用esp_wifi_start()使WIFI开始工作。

下面是ESP32作为接入点的相关源码:
  1. #include <string.h>
  2. #include "freertos/FreeRTOS.h"
  3. #include "freertos/task.h"
  4. #include "freertos/event_groups.h"
  5. #include "esp_system.h"
  6. #include "esp_wifi.h"
  7. #include "esp_event_loop.h"
  8. #include "esp_log.h"
  9. #include "nvs_flash.h"

  10. #include "driver/gpio.h"
  11. #include "esp_types.h"

  12. /* FreeRTOS Task Handle -------------------------------------------------------*/

  13. /* FreeRTOS Semaphore Handle --------------------------------------------------*/

  14. /* FreeRTOS event group to signal when we are connected & ready to make a request */


  15. static const char *TAG = "example";


  16. //#define     LED_GPIO_NUM    GPIO_NUM_25
  17. #define     LED_GPIO_NUM    GPIO_NUM_4//LED闪烁接口,为以后通过LED显示连接状态做拓展准备。


  18. #define CONFIG_AP_SSID    "ESP32"
  19. #define CONFIG_AP_PASSWORD    "12345678"//配置AP的SSID 和password

  20. uint8_t ApMac[6];//网卡地址

  21. /**
  22.     * @brief  no .   
  23.     * @note   no.
  24.     * @param  no.
  25.     * @retval no.
  26.     */
  27. esp_err_t event_handler(void *ctx, system_event_t *event)//等待回调事件
  28. {
  29.     switch (event->event_id)//对事件进行识别
  30.     {
  31.     case SYSTEM_EVENT_STA_START:
  32.         ESP_LOGI(TAG, "Connecting to AP...");
  33.         esp_wifi_connect();
  34.         break;

  35.     case SYSTEM_EVENT_STA_GOT_IP:
  36.         ESP_LOGI(TAG, "Connected.");
  37.         break;

  38.     case SYSTEM_EVENT_STA_DISCONNECTED:
  39.         //ESP_LOGI(TAG, "Wifi disconnected, try to connect again...");
  40.         esp_wifi_connect();
  41.         break;

  42.     default:
  43.         break;
  44.     }
  45.    
  46.     return ESP_OK;
  47. }

  48. /**
  49.     * @brief  no .   
  50.     * @note   no.
  51.     * @param  no.
  52.     * @retval no.
  53.     */
  54. void led_init( void )
  55. {
  56.     gpio_set_direction( LED_GPIO_NUM , GPIO_MODE_OUTPUT );
  57. }

  58. /**
  59.     * @brief  no .   
  60.     * @note   no.
  61.     * @param  no.
  62.     * @retval no.
  63.     */
  64. void led_task( void *pvParameters )
  65. {
  66.     int level = 0;
  67.    
  68.     for( ;; )
  69.     {
  70.         gpio_set_level( LED_GPIO_NUM , level);
  71.         level = !level;
  72.         vTaskDelay(300 / portTICK_PERIOD_MS);
  73.     }
  74. }

  75. void app_main(void)
  76. {
  77.     nvs_flash_init();//初始化NVS内存
  78.     led_init();
  79.     tcpip_adapter_init();//tcp/IP配置
  80.     ESP_ERROR_CHECK( esp_event_loop_init(event_handler, NULL) );//回调,当ESP32检测到某些类型的WiFi相关事件时调用。
  81.     wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();//定义一个名为cfg的wifi_init_config_t结构体。wifi_init_config_t中的参数可由menuconfig配置
  82.     ESP_ERROR_CHECK( esp_wifi_init(&cfg) );
  83.     ESP_ERROR_CHECK( esp_wifi_set_storage(WIFI_STORAGE_RAM) );//指示ESP32将这些设置记录到闪存
  84.     ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_AP) );//模式设置为AP

  85.     esp_wifi_get_mac( ESP_IF_WIFI_AP , ApMac );//获取DHCP分配的IP接口的mac。
  86.    
  87.     wifi_config_t ap_config = {
  88.         .ap = {
  89. //            .ssid = ssid,
  90.             .password = CONFIG_AP_PASSWORD,
  91.             .ssid_len = 0,
  92.             .max_connection = 4,
  93.             .authmode = WIFI_AUTH_WPA_PSK
  94.         }
  95.     };//ap接入点参数配置。

  96.     sprintf( (char *)ap_config.ap.ssid , "%s_%02X%02X" , CONFIG_AP_SSID , ApMac[4] , ApMac[5] );

  97.     esp_err_t tmp =  esp_wifi_set_config(WIFI_IF_AP, &ap_config);
  98.     ESP_ERROR_CHECK(esp_wifi_start());
  99.     esp_wifi_connect();
  100.    
  101.     xTaskCreate( &led_task, "led task", 512, NULL, 3, NULL );

  102. }
复制代码
实验现象:

打开minicom可以看到输出:

1.png

打开手机WIFI,可以看到名为ESP32_44F1的WIFI热点,打开热点,输入设置的PASSWORD:12345678即可连接成功,说明AP接口设置

2.png

编程讲解:

使用连接站

当我们的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()明确地释放此调用与分配的存储。

以下是一个代码段的示例,其中列出了连接站的详细信息:
  1. uint8 stationCount = wifi_softap_get_station_num();
  2. os_printf("stationCount = %d\n", stationCount);
  3. wifi_sta_list_t *stationInfo = wifi_softap_get_station_info();
  4. if (stationInfo != NULL) {
  5.    while (stationInfo != NULL) {
  6.       os_printf("Station IP: %d.%d.%d.%d\n", IP2STR(&(stationInfo->ip)));
  7.       stationInfo = STAILQ_NEXT(stationInfo, next);
  8.    }
  9.    wifi_softap_free_station_info();
  10. }
复制代码
如果由于某种原因,我们环境中的程序想强制断开当前的连接的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地址.如果想详细了解,可以看如下链接

http://baike.baidu.com/item/DHCP/218195?fr=aladdin

本文这里重点讲解其在ESP32中的应用和配置。

DHCP客户端

当ESP32作为站点连接到接入点时,它还运行DHCP客户端连接到它在接入点的DHCP服务器。 在那里,站点提供其IP地址,网关地址和网络掩码, 我们可以这样做:调用 tcpip_adapter_set_ip_info()在程序编写时。

函数逻辑如下
  1. tcpip_adapter_init();
  2. tcpip_adapter_dhcpc_stop();
  3. tcpip_adapter_set_ip_info();
  4. esp_wifi_init();
  5. esp_wifi_set_mode();
  6. esp_wifi_set_config();
  7. esp_wifi_start();
  8. esp_wifi_config();
复制代码
但是当我们想为这些数据设置我们自己的值时。调用的tcpip_adapter_set_ip_info()时需要的参数可以按如下方法设置
tcpip_adapter_ip_info_t ipInfo;
IP4_ADDR(&ipInfo.ip, 192,168,1,99);
IP4_ADDR(&ipInfo.gw, 192,168,1,1);
IP4_ADDR(&ipInfo.netmask, 255,255,255,0);
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即可成功的连入计入端。




转载自noticeable

收藏 评论2 发布时间:2018-5-31 10:16

举报

2个回答
wolfgang2015 回答时间:2018-5-31 14:05:37
不错,介绍很详细,有具体的电路连接方式就更好了~~
木森林的年轮 回答时间:2018-6-1 08:12:03
那么强大的esp32就这么使用不浪费吗

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版