![[ESP8266]ESP8266_RTOS_SDK V2.0下TCP 通讯](https://zouyingzheng.com/zb_users/theme/os_2019/static/images/article-default-cover.jpg)
[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服务端
希望楼主能够写一篇关于TCP Server搭建的帖子
近期事情比较多,会马上更新tcp server的源码的.