ESP8266 RTOS SDK 创建一个 TCP 服务器

ESP8266创建一个 TCP 服务器

在 ESP8266 RTOS SDK 中,创建一个 TCP 服务器需要以下步骤:

  1. 初始化 Wi-Fi:在STA模式下连接到 Wi-Fi,或者设置为 AP 模式。这里我们会设置为 AP 模式。

  2. 创建一个 socket:使用 socket() 函数创建一个新的 socket。

  3. 绑定 socket:使用 bind() 函数将新创建的 socket 绑定到一个 IP 地址和端口上。

  4. 监听连接:使用 listen() 函数开始监听新的客户端连接。

  5. 接受连接:使用 accept() 函数接受新的客户端连接。

  6. 处理连接:在连接被接受后,可以使用 read()write() 函数来读取和发送数据。

现在,我们来详细解释一下如何在 ESP8266 RTOS SDK 中做这些事情。

首先,让我们设置 ESP8266 为 AP 模式,并创建一个名为 “ChinaIOT--XXXX” 的 SSID,不用密码。

c
复制

#include “esp_wifi.h”

#define WIFI_SSID “ChinaIOT--XXXX”

void wifi_init_softap(void)
{
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK( esp_wifi_init(&cfg) );

wifi_config_t wifi_config = {
    .ap = {
        .ssid = WIFI_SSID,
        .ssid_len = strlen(WIFI_SSID),
        .channel = 1,
        .password = "",
        .authmode = WIFI_AUTH_OPEN,
        .ssid_hidden = ,
        .max_connection = 4,
        .beacon_interval = 100,
    },
};
ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_AP) );
ESP_ERROR_CHECK( esp_wifi_set_config(ESP_IF_WIFI_AP, &wifi_config) );
ESP_ERROR_CHECK( esp_wifi_start() );

ESP_LOGI(TAG, "wifi_init_softap finished. SSID:%s password:%s",
         WIFI_SSID, "");

}

接下来,我们创建一个 TCP 服务器。

c
复制

#include “lwip/err.h”
#include “lwip/sockets.h”
#include <string.h>

#define SERVER_PORT 80

void tcp_server_task(void *pvParameters)
{
char rx_buffer[128];
char addr_str[128];
int addr_family;
int ip_protocol;

struct sockaddr_in dest_addr;
dest_addr.sin_addr.s_addr = htonl(INADDR_ANY);
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(SERVER_PORT);
addr_family = AF_INET;
ip_protocol = IPPROTO_IP;
inet_ntoa_r(dest_addr.sin_addr, addr_str, sizeof(addr_str) - 1);

int listen_sock = socket(addr_family, SOCK_STREAM, ip_protocol);
if (listen_sock < ) {
    ESP_LOGE(TAG, "Unable to create socket: errno %d", errno);
    vTaskDelete(NULL);
    return;
}

int err = bind(listen_sock, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
if (err != ) {
    ESP_LOGE(TAG, "Socket unable to bind: errno %d", errno);
    vTaskDelete(NULL);
    return;
}

err = listen(listen_sock, 1);
if (err != ) {
    ESP_LOGE(TAG, "Error occurred during listen: errno %d", errno);
    vTaskDelete(NULL);
    return;
}

while (1) {
    ESP_LOGI(TAG, "Socket listening");

    struct sockaddr_in source_addr;
    uint addr_len = sizeof(source_addr);
    int sock = accept(listen_sock, (struct sockaddr *)&source_addr, &addr_len);
    if (sock < ) {
        ESP_LOGE(TAG, "Unable to accept connection: errno %d", errno);
        break;
    }

    // Convert ip address to string
    inet_ntoa_r(((struct sockaddr_in *)&source_addr)->sin_addr.s_addr, addr_str, sizeof(addr_str) - 1);

    while (1) {
        int len = recv(sock, rx_buffer, sizeof(rx_buffer) - 1, );
        if (len < ) {
            ESP_LOGE(TAG, "recv failed: errno %d", errno);
            break;
        } else if (len == ) {
            ESP_LOGI(TAG, "Connection closed");
            break;
        } else {
            rx_buffer[len] = ;    // Null-terminate whatever we received and treat it like a string
            ESP_LOGI(TAG, "Received %d bytes从 '%s'", len, rx_buffer);

            // Echo received data back
            int err = send(sock, rx_buffer, len, );
            if (err < ) {
                ESP_LOGE(TAG, "Error occurred during sending: errno %d", errno);
                break;
            }
        }
    }

    if (sock != -1) {
        ESP_LOGE(TAG, "Shutting down socket and restarting...");
        shutdown(sock, );
        close(sock);
    }
}

}

现在,我们有一个简单的 TCP 服务器,它会接收连接,读取数据,然后将接收到的数据发送回去。

如果你想关闭 STA 模式和 TCP 连接,并切换到 AP 模式,你可以先关闭 TCP 服务器的 socket,并调用 esp_wifi_set_mode(WIFI_MODE_AP) 来切换到 AP 模式。

如果你尝试关闭一个没有打开的 socket(比如,你没有调用 socket() 或者已经调用了 close() 的 socket),close() 函数将返回 -1,并设置 errno 为 EBADF(无效的文件描述符)。

在你的 Wi-Fi 配置中,ssid_hidden 是一个布尔值,决定了你的 SSID 是否被广播。如果 ssid_hidden 是 0,那么你的 SSID 将会被广播,并且可以在无线网络列表中看到。如果 ssid_hidden 是 1,那么你的 SSID 将不会被广播,你需要手动输入 SSID 才能连接到这个网络。

这个配置中的其他参数有:

  • .ssid 是你的 SSID,也就是你的网络的名称。
  • .ssid_len 是你的 SSID 的长度。
  • .channel 是你的 Wi-Fi 网络使用的无线信道。
  • .password 是你的 Wi-Fi 网络的密码。在这个例子中,我们将它设置为 “”,也就是没有密码。
  • .authmode 是你的 Wi-Fi 网络的认证模式,在这个例子中,我们使用的是 WIFI_AUTH_OPEN,也就是说我们的网络是开放的,没有密码保护。
  • .max_connection 是你的 Wi-Fi 网络允许的最大连接数。
  • .beacon_interval 是你的 Wi-Fi 网络的信标间隔,单位是毫秒。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您好!关于ESP8266 RTOS SDK编程的问题,我可以提供一些基本的信息和建议。 ESP8266 RTOS SDK是一种针对ESP8266芯片的实时操作系统(RTOS)软件开发工具包(SDK),它提供了一系列API和工具,可以帮助开发者进行ESP8266的嵌入式软件开发。下面是一些入门级别的建议和指导: 1. 学习ESP8266基础知识:在开始使用ESP8266 RTOS SDK之前,您需要了解ESP8266芯片的基本架构和功能。了解ESP8266的GPIO引脚、WiFi连接、内存分配等基本概念是非常有帮助的。 2. 下载和安装ESP8266 RTOS SDK:您可以从ESP8266官网上下载ESP8266 RTOS SDK的安装包,然后按照说明进行安装。安装完成后,您可以在IDE中进行编程。 3. 编写ESP8266 RTOS SDK程序:在ESP8266 RTOS SDK中,您可以使用C语言编写程序。您可以使用提供的API来访问GPIO、WiFi、内存等功能,并使用RTOS提供的任务管理、信号量、消息队列等功能来进行多任务开发。 4. 调试ESP8266 RTOS SDK程序:ESP8266 RTOS SDK提供了一些调试工具,例如调试输出和日志记录。您可以使用这些工具来定位和修复程序中的错误。 总之,ESP8266 RTOS SDK是一种非常强大的嵌入式软件开发工具,它可以帮助您开发出高效、稳定的ESP8266应用程序。如果您有具体的问题,可以随时向我提问,我会尽力帮助您。 ### 回答2: ESP8266 RTOS SDK是一种为ESP8266芯片开发的软件开发套件(SDK),它基于实时操作系统(RTOS)系统架构,提供了一种又快又容易的方法,将ESP8266用于各种应用程序的开发。它包括用于WIFI/网络通信的多个API、自动化任务管理、内存管理、调试和硬件控制等功能,是一种非常强大的SDK。 使用ESP8266 RTOS SDK编程,可以利用SDK提供的功能,开发出一些高效、稳定、可靠、功能强大的应用程序。同时,ESP8266 RTOS SDK编程还需要具备良好的C编程技巧,熟悉ESP8266芯片的基本架构与特性,并了解实时操作系统的基本概念,这对于开发高质量的应用程序是至关重要的。 在ESP8266 RTOS SDK编程中,常常需要处理网络通信等复杂的任务,利用RTOS系统架构可以方便地实现异步式编程。同时,ESP8266 RTOS SDK还提供了一个灵活的事件处理机制,允许开发者处理各种异步事件,从而使得应用程序能够更加高效地响应各种请求。 最后,ESP8266 RTOS SDK编程虽然复杂,但也是一类具有很高价值的技巧。可以帮助开发者实现一些非常有用且实用的应用程序,从而为社会和企业的发展带来更多的收益。 ### 回答3: ESP8266 RTOS SDK是一种基于FreeRTOS的编程框架,用于开发ESP8266芯片的应用程序。它提供了完整的工具链和库,使开发人员可以轻松地创建稳健的、高效的应用程序。 ESP8266 RTOS SDK开发过程需要熟悉C/C++语言和嵌入式设备的基本概念。其核心思想是将应用程序分为多个任务,每个任务负责完成不同的功能,并使用FreeRTOS的调度器实现任务之间的协作与资源共享。 在ESP8266 RTOS SDK中,程序的入口点为user_init函数,该函数通常用于初始化应用程序的任务、队列、控制块等基本结构。在任务的创建过程中,需要指定任务名、任务的优先级、任务处理函数等参数,以及为任务分配堆栈和堆空间等资源。 对于网络应用程序的开发,ESP8266 RTOS SDK提供了WiFi和TCP/IP协议栈API,可用于连接网络、实现数据传输。在应用程序的消息处理过程中,开发人员可以使用FreeRTOS的队列机制实现进程间通信,从而实现数据共享和处理。 ESP8266 RTOS SDK还提供了多种调试和故障排除工具,便于开发人员在应用程序运行过程中进行调试。同时,ESP8266 RTOS SDK还提供了易用的在线OTA(Over-The-Air)功能,开发人员可以远程更新设备的固件,提高开发效率和设备可靠性。 综上所述,ESP8266 RTOS SDK是一种强大的开发工具,为嵌入式设备的应用程序开发和部署提供了全面的支持和保障,使得开发人员可以专注于业务逻辑的实现,提高了开发效率和设备可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值