当前位置: 首页 > news >正文

深圳宝安网站建设工营销推广活动策划

深圳宝安网站建设工,营销推广活动策划,wordpress添加微信,社区网站免费制作ESP-C3入门10. 创建TCP Client一、创建 tcp client的一般步骤1. 创建 tcp 套接字2. 配置服务器地址3. 连接服务器4. 发送数据5. 接收数据6. 关闭套接字二、创建tcp_client任务三、示例代码1. tcpClient.h2. tcpClient.c3. main.c一、创建 tcp client的一般步骤 本文示例使用的…

ESP-C3入门10. 创建TCP Client

  • 一、创建 tcp client的一般步骤
    • 1. 创建 tcp 套接字
    • 2. 配置服务器地址
    • 3. 连接服务器
    • 4. 发送数据
    • 5. 接收数据
    • 6. 关闭套接字
  • 二、创建tcp_client任务
  • 三、示例代码
    • 1. tcpClient.h
    • 2. tcpClient.c
    • 3. main.c

在这里插入图片描述

一、创建 tcp client的一般步骤

本文示例使用的是阻塞IO进行网络通讯。 在高性能的网络编程中,可能会使用非阻塞IO或异步IO进行网络通讯。

1. 创建 tcp 套接字

使用 socket函数:

int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);

2. 配置服务器地址

struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(server_port);
inet_pton(AF_INET, server_ip, &server_addr.sin_addr);

3. 连接服务器

int ret = connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr));
if (ret != 0) {ESP_LOGE(TAG, "Failed to connect to server, errno=%d", errno);close(sock);return;
}

4. 发送数据


int bytes_sent = send(sock, send_buf, send_len, 0);
if (bytes_sent < 0) {ESP_LOGE(TAG, "Failed to send data to server, errno=%d", errno);close(sock);return;
}

5. 接收数据

// 接收数据
int bytes_recv = recv(sock, recv_buf, recv_buf_size, 0);
if (bytes_recv < 0) {ESP_LOGE(TAG, "Failed to receive data from server, errno=%d", errno);close(sock);return;
}

6. 关闭套接字

close(sock);

二、创建tcp_client任务

由于网络通信涉及到阻塞IO操作,如果在主线程中直接调用网络API,会导致主线程被阻塞,无法处理其他任务。为了避免这种情况发生,可以将网络通信放在RTOS任务中处理,使得主线程可以继续运行。
另外,使用RTOS任务的好处还在于可以方便地控制任务的优先级、堆栈大小等参数,以及在需要的时候暂停、恢复、删除任务等操作。这样可以更加灵活地管理程序中的各个任务,实现复杂的多任务协作。
示例使用 xTaskCreate函数创建freeRTOS的任务:

xTaskCreate(tcp_client_task, "tcp_client_task", 4096, NULL, 5, NULL);

任务优先级是5,栈大小是4096

定义连接tcp 的任务时,注意需要保留参数:

void tcp_client_task(void* pvParameters);

三、示例代码

本示例会接前面章节连接WIFI的部分,帮wifi.c wifi.h部分代码不重复编写 。
下面示例中,tcpClient连接上服务器后,会发送ping消息,并等待服务器回应。如果服务器回应pong,则握手成功, 客户端继续发送10个报文, 然后关闭连接,重新请求连接服务端。

参考项目目录结构如下:
在这里插入图片描述

1. tcpClient.h

//
// Created by hs26661 on 2023/2/16.
//#ifndef ESP32_LEARN_TCPCLIENT_H
#define ESP32_LEARN_TCPCLIENT_H#include <string.h>
#include <sys/socket.h>
#include <netdb.h>
#include <unistd.h>
void tcp_client_task(void* pvParameters);#endif //ESP32_LEARN_TCPCLIENT_H

2. tcpClient.c

//
// Created by hs26661 on 2023/2/16.
//
#include <lwip/sockets.h>
#include <esp_log.h>#define SERVER_HOST "192.18.200.28"
#define SERVER_PORT 3000
#define MESSAGE "ping"
#define MAX_RETRY 5 // 最大重试次数
#define DATA_SIZE 256 // 数据包大小static const char *TAG = "TCP_CLIENT";/*** 创建 freeRtos任务, 这里的参数注意不能删除* @param pvParameters*/
void tcp_client_task(void* pvParameters){// 重试次数int retry_count = 0;// 接收缓冲区char rx_buffer[DATA_SIZE];// 发送缓冲区char tx_buffer[DATA_SIZE];while(1){// 创建套接字struct sockaddr_in dest_addr;dest_addr.sin_addr.s_addr = inet_addr(SERVER_HOST);dest_addr.sin_family = AF_INET;dest_addr.sin_port = htons(SERVER_PORT);int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);// 连接服务端int err = connect(sock, (struct sockaddr*) &dest_addr, sizeof(dest_addr));if(err != 0){if(retry_count++ >= MAX_RETRY){ESP_LOGE(TAG, "connect failure retry limit");break;}ESP_LOGW(TAG, "connect failure, retry count=%d", retry_count);vTaskDelay(2000 / portTICK_PERIOD_MS);continue;}ESP_LOGI(TAG, "connect to server success");retry_count = 0;// 发送pingint tx_len = sprintf(tx_buffer, MESSAGE);err = send(sock, tx_buffer, tx_len, 0);if(err <0){ESP_LOGE(TAG, "send ping failure");close(sock);continue;}// 接收pongint rx_len = recv(sock,rx_buffer, sizeof(rx_buffer) -1, 0);if(rx_len<0){ESP_LOGE(TAG, "receive pong failure");close(sock);continue;}rx_buffer[rx_len] = 0;if(strcmp(rx_buffer, "pong") !=0){ESP_LOGE(TAG, "handshake failure");close(sock);continue;}ESP_LOGI(TAG, "handshake success");// 发送数据包for(int i =0;i<10;i++){// 获取当前时间字符串time_t now = time(NULL);struct tm timeinfo;localtime_r(&now, &timeinfo);char strftime_buf[64];strftime(strftime_buf , sizeof(strftime_buf), "%c", &timeinfo);// 发送数据包tx_len = sprintf(tx_buffer, "time:%s", strftime_buf);err = send(sock, tx_buffer, tx_len, 0);if(err <0){ESP_LOGE(TAG, "send data error");close(sock);break;}ESP_LOGI(TAG, "send data %d success", i+1);// 5秒后再发送vTaskDelay(5000 / portTICK_PERIOD_MS);}// 发送byetx_len = sprintf(tx_buffer, "bye");err = send(sock, tx_buffer, tx_len, 0);if(err<0){ESP_LOGE(TAG, "send bye error");close(sock);continue;}// 关闭连接close(sock);ESP_LOGI(TAG, "connection closed");// 重建 连接ESP_LOGI(TAG, "reconnect");vTaskDelay(2000/ portTICK_PERIOD_MS);}vTaskDelete(NULL);
}

3. main.c

#include <string.h>#include "freertos/FreeRTOS.h"
#include "freertos/task.h"#include <nvs_flash.h>
#include "network/include/wifi.h"
#include "network/include/tcpClient.h"static const char *TAG = "wifi connection";void app_main()
{int i = 0;ESP_LOGE(TAG, "app_main");// 初始化NVS存储区esp_err_t ret = nvs_flash_init();if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {ESP_ERROR_CHECK(nvs_flash_erase());ret = nvs_flash_init();}ESP_ERROR_CHECK(ret);// Wi-Fi初始化ESP_LOGI(TAG, "Wi-Fi initialization");wifi_initialize();// Wi-Fi Station初始化wifi_station_initialize();// 创建 tcp client任务,优先级为5,栈大小为4096xTaskCreate(tcp_client_task, "tcp_client_task", 4096, NULL, 5, NULL);while (1) {vTaskDelay(pdMS_TO_TICKS(500));}
}

运行结果:
在这里插入图片描述
示例中使用阻塞IO通讯,也可以将收发放在不同的任务中执行,这样提高程序并发性;在这种情况下,可以创建两个套接字并使用同一服务器地址和端口号。在发送和接收数据时,将不同的套接字分别用于不同的任务,从而实现并发的发送和接收。

具体来说,在两个任务中,需要使用不同的套接字句柄(socket handle)来访问相同的服务器地址和端口。在每个任务中,可以通过调用 socket()、connect() 和 close() 等函数来创建和管理套接字。发送和接收数据时,需要在每个任务中使用不同的套接字句柄来分别发送和接收数据。

需要注意的是,如果两个任务共用同一套接字句柄来进行发送和接收,那么就可能会出现竞争条件,导致数据错误或不完整。因此,为了避免这种情况,最好在每个任务中分别使用独立的套接字来进行通信。

本文不演示上述方案。

http://www.shuangfujiaoyu.com/news/3034.html

相关文章:

  • 漳州北京网站建设公司哪家好自助友链平台
  • vi设计公司模板seo顾问是什么职业
  • 汝州住房和城乡建设局网站北京网站快速排名优化
  • 用wordpress建站域名和空间哪里买比较好seo教程最新
  • 公司网站设计 上海百度推广业务电话
  • 大地资源影视免费观看南沙seo培训
  • 南昌公司网站开发上海站优云网络科技有限公司
  • 可做产品预售的网站百度端口开户推广
  • 网站开发规划宣传推广图片
  • 抖音代运营价格seo网站分析工具
  • 高端网站开发什么是sem推广
  • 豆芽网站建设douyanet站长之家网站排行榜
  • Gzip 网站 能够压缩图片吗深圳开发公司网站建设
  • .net wap网站模板新站优化案例
  • 什么是电子商务网站建设的基本要求全国疫情地区查询最新
  • win2003VPS装网站seo每日
  • 深圳网站建设制作设计公司视频外链平台
  • 国外网站设计欣赏百度app安装下载
  • vs做网站头部的代码武汉seo网络营销推广
  • 网站建设 设计创意企业营销策略有哪些
  • 网站做乘法表seo论坛
  • 网上做网站任务近期国际新闻热点大事件
  • 工业设计 做自己的网站 知乎北京全网营销推广
  • 属于网络营销站点推广的是广告网址
  • 网站搭建是哪个岗位做的事儿seo云优化如何
  • 成都代理记账搜索引擎优化结果
  • 一站式做网站开发申请网站域名要多少钱
  • 网站访客天津seo霸屏
  • 网站logo图怎么做商城系统开发
  • 做建材网站北京seo网络优化招聘网