[ESP8266]ESP8266_RTOS_SDK V2.0下TCP 通讯

[ESP8266]ESP8266_RTOS_SDK V2.0下TCP 通讯

ESP8266_RTOS_SDK V3.0为用户提供符合ESP-IDF风格的全新框架和API。考虑到这些重大变化可能会对现有项目产生重大影响,建议此版本仅用于实施新项目,而不是现在用作任何现有批量生产项目的升级。但是,我们计划在未来进一步升级SDK V3.0,因此它可以更好地支持已实现SDK 2.0(和eariler版本)的项目。

以上来自乐鑫Github更新说明翻译


TCP 客户端

暂时简单做了下自动重连(尚不完善,仅供借鉴参考!)


#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"

#include "esp_wifi.h"
#include "esp_event_loop.h"
#include "esp_log.h"

#include "nvs_flash.h"

#include <string.h>
#include <netdb.h>
#include <sys/socket.h>


#define EXAMPLE_WIFI_SSID "weiecn_IOT"
#define EXAMPLE_WIFI_PASS "iot.weiecn.com"
bool flg=false;
static EventGroupHandle_t wifi_event_group;
const int CONNECTED_BIT = BIT0;
static void tcp_client(void *pvParameters);
static const char *TAG = "example";


static esp_err_t event_handler(void *ctx, system_event_t *event)
{
    switch(event->event_id) {
    case SYSTEM_EVENT_STA_START:
        esp_wifi_connect();
        break;
    case SYSTEM_EVENT_STA_GOT_IP: 
        flg=true; 
        break;
    case SYSTEM_EVENT_STA_DISCONNECTED:
         flg=false; 
        esp_wifi_connect();
        break; default:
        break;
    }
    return ESP_OK;
}

static void initialise_wifi(void)
{
    tcpip_adapter_init();
    wifi_event_group = xEventGroupCreate();
    ESP_ERROR_CHECK( esp_event_loop_init(event_handler, NULL) );
    wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
    ESP_ERROR_CHECK( esp_wifi_init(&cfg) );
    ESP_ERROR_CHECK( esp_wifi_set_storage(WIFI_STORAGE_RAM) );
    wifi_config_t wifi_config = {
        .sta = {
            .ssid = EXAMPLE_WIFI_SSID,
            .password = EXAMPLE_WIFI_PASS,
        },
    };
    ESP_LOGI(TAG, "Setting WiFi configuration SSID %s...", wifi_config.sta.ssid);
    ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) );
    ESP_ERROR_CHECK( esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config) );
    ESP_ERROR_CHECK( esp_wifi_start() );
}

void tcp_clientStart()
{
  xTaskCreate(&tcp_client, "tcp_client", 16384, NULL, 5, NULL);
}

static void tcp_client(void *pvParameters)
{
    char *servInetAddr = "10.0.0.27";
    struct sockaddr_in sockaddr;
    char recvline[64];
    char sendline[64]="hello world\n";

   while(1)
   {
       if(flg==false)
       {
           printf("暂时没有wifi?\n");
           vTaskDelay(1000 / portTICK_PERIOD_MS);
           continue;
       }
    int s = socket(AF_INET, SOCK_STREAM, 0);
    if(s < 0) {
            printf("Socket分配失败:%d\n",s);
            close(s);
            vTaskDelay(1000 / portTICK_PERIOD_MS);
            continue;
        }
    memset(&sockaddr,0,sizeof(sockaddr));
    sockaddr.sin_family = AF_INET; //设定为ipv4
    sockaddr.sin_port = htons(60000); //设定端口号
    inet_pton(AF_INET,servInetAddr,&sockaddr.sin_addr);


        if((connect(s,(struct sockaddr*)&sockaddr,sizeof(sockaddr))) < 0 )
         {
            printf("Socket连接失败\n");
            vTaskDelay(1000 / portTICK_PERIOD_MS);
            continue;
        }
        if (write(s, sendline, strlen(sendline)) < 0) {
            printf("Socket发送失败\n");
            close(s);
            vTaskDelay(1000 / portTICK_PERIOD_MS);
            continue;
        }
            while(1)
            {
               // memset(&recvline,0,sizeof(recvline));
                int iDataNum= recv(s,recvline,64,0);
                if(iDataNum>0){
               // recvline[iDataNum]='\0';
                recvline[iDataNum]='\0'; 
                 printf("%s\n",recvline); //接收到的数据
                }else if(iDataNum==0)
                {
                //服务端或本地段意外/手动断开
                close(s);
                break;
                //跳出接收循环这样完成自动重连
                }
            }
   }


}

void app_main()
{
    ESP_ERROR_CHECK( nvs_flash_init() );
    initialise_wifi();
    tcp_clientStart();
}



TCP 客户端演示



TCP Server服务端