ESP32 之 ESP-IDF 教学(十二)WiFi篇—— LwIP 之 TCP 通信

2023-05-16

本文章 来自原创专栏《ESP32教学专栏 (基于ESP-IDF)》,讲解如何使用 ESP-IDF 构建 ESP32 程序,发布文章并会持续为已发布文章添加新内容! 每篇文章都经过了精打细磨!

↓↓↓通过下方对话框进入专栏目录页↓↓↓
CSDN 请求进入目录       _ O x

是否进入ESP32教学导航(基于ESP-IDF)?

       确定


文章目录

    • 一、建立连接 —— ESP32 作 TCP Client客户端
      • 1. TCP Client 的基本思路
      • 2. TCP Client 代码示例
    • 二、建立连接 —— ESP32 做 TCP Server服务器
      • 1. 代码示例
    • 三、收发数据
    • 四、LwIP BSD API 与TCP/UDP 有关的函数

一、建立连接 —— ESP32 作 TCP Client客户端

1. TCP Client 的基本思路

在这里插入图片描述

2. TCP Client 代码示例

以下代码是一个函数tcp_task_client实现的是一个FreeRTOS的Task,在这个任务里完成了以下内容:

  • 等待WiFi连接成功(基于FreeRTOS API 之 事件组Event Group
  • 创建Socket对象并初始为TCP(注意代码第7行),并检测Socket是否创建成功。
  • 配置连接参数结构(结构体struct sockaddr_in类型的desk_addr
  • 循环连接服务端,直至连接成功

具体请见注释

void tcp_task_client(void *arg){
    xEventGroupWaitBits(wifiEvent, wifiConnectedBit, pdFALSE, pdFALSE, portMAX_DELAY);
    int _socket;

createSocket:	// 标签

    _socket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    // AF_INET表示IPv4,AF_INET6表示IPv6

    // SOCK_STREAM表示TCP;
    // SOCK_DGRAM表示UDP;
    // SOCK_RAW表示RAW

    // protocol, 规定套接字发送和接送哪类型协议数据。
    // 最常见的是 IPPROTO_TCP, IPPROTO_UDP, IPPROTO_UDPLITE、IPPROTO_ICMP。
    // 如果 domain 和 type已经确定唯一的协议,“0(IPPROTO_IP)” 可以用来表示选择一个默认的协议。

    if(_socket < 0){
        printf("Socket 创建失败, 错误代码:%d\n", errno);
        vTaskDelete(NULL);
    }else{
        printf("Socket 创建成功");
    }

    struct sockaddr_in desk_addr = {
    // 下边这个IP 192.168.31.138和端口号8080是自己设置的,请按需要修改
        .sin_addr.s_addr = inet_addr("192.168.31.138"),	
        .sin_family = AF_INET,
        .sin_port = htons(8080),    // 小端模式转为大端模式
    };


    int err;
    while (1) {
        err = connect(_socket, (struct sockaddr*)&desk_addr, sizeof(desk_addr));
        if (err == 0){
            ESP_LOGI("CLIENT", "连接成功");
            break;
        }else{
            ESP_LOGI("CLIENT", "连接失败,错误代码:%d", errno);
            close(_socket);
            vTaskDelay(pdMS_TO_TICKS(200));
            
            goto createSocket; // goto标签
            
        }
    }
    vTaskDelete(NULL);
}

二、建立连接 —— ESP32 做 TCP Server服务器

1. 代码示例

以下代码是一个函数tcp_task_server实现的是一个FreeRTOS的Task,在这个任务里完成了以下内容:

  • 等待WiFi连接成功(基于FreeRTOS API 之 事件组Event Group
  • 创建Socket对象并初始为TCP(注意代码第7行),并检测Socket是否创建成功。
  • 配置连接参数结构(结构体struct sockaddr_in类型的desk_addr
  • 绑定
  • 开始监听
  • 执行accept函数,从已建立TCP连接的客户端Sockets中去除Socket(此函数会阻塞,因此请按需使其出现在恰当的位置)

具体请见注释

void tcp_task_server(void *arg){
    xEventGroupWaitBits(wifiEvent, wifiConnectedBit, pdFALSE, pdFALSE, portMAX_DELAY);

    int _socket = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    if(_socket < 0){
        printf("Socket 创建失败, 错误代码:%d\n", errno);
        vTaskDelete(NULL);
    }else{
        printf("Socket 创建成功");
    }

    struct sockaddr_in desk_addr = {
        .sin_addr.s_addr = INADDR_ANY,
        .sin_family = AF_INET,
        .sin_port = htons(2501),  // 小端模式转为大端模式
    };

    int err;
    while(1){
        err = bind(_socket, (struct sockaddr*)&desk_addr, sizeof(desk_addr));
        if(err == 0){
            ESP_LOGI("SERVICE", "绑定成功");
            break;
        }else{
            ESP_LOGI("SERVICE", "绑定失败, 错误代码: %d", errno);
        }
        vTaskDelay(pdMS_TO_TICKS(1000));
    }

    err = listen(_socket, 5);
    if (err != 0){
        ESP_LOGI("SERVICE", "监听失败,错误代码: %d", errno);
        vTaskDelete(NULL);
    }else{
        ESP_LOGI("SERVICE", "监听成功");
    }

    while (1){
        struct sockaddr_in6 source_addr;
        uint addr_len;
        ESP_LOGI("SERVICE", "准备accept");
        int remote_sock = accept(_socket, (struct sockaddr *) &source_addr, &addr_len);
        //xTaskNotifyGive(tcp_client_handle);

        if(remote_sock < 0){
            ESP_LOGI("SERVICE", "accept失败,错误代码: %d", errno);
        }else{
            ESP_LOGI("SERVICE", "连接成功");
            break;
        }
        vTaskDelay(pdMS_TO_TICKS(1000));
    }

    vTaskDelete(NULL);
}

三、收发数据

四、LwIP BSD API 与TCP/UDP 有关的函数

socket()
bind()
listen()
connect()
accept()
send(), recv(), sendto(), recvfrom()
close()
gethostbyname()
select()
pool()
getsockopt(), setsockopt()
函数名socket()
函数原型int socket(int domain, int type, int protocol)
含义函数socket()为通信创建一个端点,并为该套接字返回一个文件描述符。
返回值int,若发生错误则返回-1
参数domain类型为:int;表示欲创建的协议族。
如:AF_INET表示IPv4,
AF_INET6表示IPv6,
AF_UNIX表示本地套接字


type类型为:int
如:SOCK_STREAM表示TCP,
SOCK_DGRAM表示UDP,
SOCK_SEQPACKET表示可靠的顺序包服务,
SOCK_RAW表示网络层上的原始协议


protocol类型为:int;表示指定要使用的实际传输协议。最常见的有IPPROTO_TCP, IPPROTO_SCTP, IPPROTO_UDP, IPPROTO_DCCP。如果填0(IPPRORO_IP)则根据前两个参数自动选择协议
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ESP32 之 ESP-IDF 教学(十二)WiFi篇—— LwIP 之 TCP 通信 的相关文章

  • Wi-Fi 直连技术

    我正在考虑创建一个通过 Wi Fi Direct 传输视频流的应用程序 我已经用谷歌搜索过 甚至在 Stackoverflow 中 但我还没有找到指定支持设备的列表 我的问题是 是否可以在 Samsung Galaxy Mini 带有 An
  • 计算 AP 的距离,包括信噪比

    出于某种原因 我和一个朋友正在讨论根据从设备获取的信息 RSSI 频率 SNR 等 计算您自己 笔记本电脑 手机等 与 AP 之间的距离 因此 在花了一些时间研究三边测量 三角测量和自由空间路径损耗之后 在一些博客文章和 wiki 的帮助下
  • 【ESP32接入国产大模型之文心一言】

    1 怎样接入文心一言 随着人工智能技术的不断发展 自然语言处理领域也得到了广泛的关注和应用 在这个领域中 文心一言作为一款强大的自然语言处理工具 具有许多重要的应用价值 本文将重点介绍如何通过ESP32接入国产大模型之文心一言api 以及其
  • 【ESP32接入国产大模型之文心一言】

    1 怎样接入文心一言 随着人工智能技术的不断发展 自然语言处理领域也得到了广泛的关注和应用 在这个领域中 文心一言作为一款强大的自然语言处理工具 具有许多重要的应用价值 本文将重点介绍如何通过ESP32接入国产大模型之文心一言api 以及其
  • 多点连接 - 在 Swift 5 中获取文件传输(互联网)速度和文件大小

    我正在点对点传输照片 一切正常 但我无法获得照片 文件 传输速度 例如互联网速度 与MB 一样 文件也被传输 其次我想获取该文件的大小 我们使用数据格式传递照片MCSession 由于隐私原因 我无法在此处添加项目代码 但我将分享我关注的参
  • 如何更新已创建的 Wi-Fi 配置(或“UID XXX 无权更新 [Wi-Fi] 配置错误”)?

    我正在开发一个管理 Wi Fi 连接的应用程序 我的场景如下 假设整个大楼都有一个名为 testing tls 的 Wi Fi 网络 我的应用程序应该能够仅连接到选定的接入点 基于 BSSID 或 MAC ID 我们用TLS 认证验证用户的
  • Android :: 如何断开与 wifi 网络的连接?

    我用谷歌搜索发现很多网站都在说 禁用 Wifi 无线电 但就我而言 我只想让 Android 设备断开与特定 wifi 网络 SSID 已知 的连接 而不关闭 WiFi 无线电 请给我一些关于这个问题的见解 哇 这不应该花一个月的时间才能得
  • VSCode 上的 PlatformIO 未编译:collect2.exe:错误:ld 返回 1 退出状态

    我最近不得不擦拭我的计算机 在一切准备就绪并运行之后 是时候打开我之前正在处理的一些 ESP32 程序了 发现 VSCode 上的 Platform IO 将不再编译 运行编译器后 我收到以下错误 Compiling pio build e
  • 我如何连接到名为“A”的受密码保护的 wifi

    如何连接到受密码保护的特定 WiFi 场景 有四个 wifi 网络 但我的应用程序需要连接到特定的网络 同时提供密码 你不能这样做 因为没有公共 API 可以做到这一点
  • 通过发送意图来启动 Android WiFi 管理器?

    我正在开发一个应用程序 我想要一个按钮 打开Android内置的WiFi菜单 我真的不想自己实现扫描和连接代码 我可以发送任何打开此菜单的意图吗 你应该使用ACTION PICK WIFI NETWORK http developer an
  • 获取WIFI信号强度-寻求最佳方法(IOCTL、iwlist(iw)等)

    我想扫描从3个AP接收到的信号强度 如果每 300 毫秒 最多 500 毫秒 发生一次 我会很高兴 我在路由器上刷了 OpenWRT 我正在寻找一个好的工具来做到这一点 首先 我发现 iwconfig 可以工作 但仅限于我连接到的网络 所以
  • Github (SSH) 通过公共 WIFI,端口 22 被阻止

    我目前在公共 WIFI 站点上 但无法使用 SSH 他们可能阻止了该端口 但是 我需要该连接来执行git push ssh T email protected cdn cgi l email protection ssh connect t
  • 如何使用Python连接WiFi网络? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试用 Python 编写一个脚本 该脚本将使我能够搜索无线网络并连接到它们 有没有为此目的的Python 库 None
  • 我可以在 Android 中找到我的接入点的 MAC 地址吗?

    我的 Android 应用程序可以找到它所连接的 Wifi 接入点的 MAC 地址吗 android net wifi WifiInfo getMacAddress 的文档未提供任何详细信息 See http developer andro
  • 如何捕获无线路由器的原始信号?

    我现在看到了几个项目 它们从典型无线路由器收集的无线电数据中获取新颖的空间信息 http wisee cs washington edu http wisee cs washington edu http www extremetech c
  • 我可以使用 WiFi 在两部未连接路由器的 Android 手机之间传输数据/消息吗?

    我知道如果两个Android手机连接到同一个wifi网络 它们可以实现套接字编程来在它们之间传输数据 但我其实想知道是否可以使用wifi作为两部Android手机之间的传输介质 就像蓝牙一样 使用 Android 2 2 可以在一台设备上创
  • 是否可以强制通过 Wifi 或 TMobile 网络进行网络流量?

    我想知道使用 G1 是否可以强制网络流量通过 Wifi 或通过 Cell GSM 网络 我需要强制应用程序通过塔式网络连接以获取一些登录信息 这可能吗 有人对这如何可能有任何想法吗 我正在尝试使用 Android SDK 在应用程序内完成此
  • Android 智能手机与其他设备之间的直接 Wifi 通信

    我想在 Android 设备和另一个设备 不是另一个 Android 智能手机 而是使用 C 实现的带 wifi 的设备 之间建立通信 通过 WIFI 我已经发现android提供了直接无线网络 http developer android
  • NTP请求包

    我试图弄清楚我需要在 NTP 请求包中发送 客户端 什么才能从服务器检索 NTP 包 我正在 Cortex M3 Stellaris LM3S6965 上使用 LWIP 据我了解 我将收到 UDP 标头 然后收到具有不同时间戳的 NTP 协
  • Java获取无线网络的SSID等信息

    我正在尝试用 Java 获取无线网络设备的 SSID 我尝试了官方网络教程http java sun com docs books tutorial networking nifs retriving html http java sun

随机推荐

  • C++析构函数调用顺序

    文章目录 析构函数工作过程 1 执行析构函数的函数体 2 如果该类中拥有类对象成员 xff0c 且类对象有析构函数 xff0c 则以类对象成员声明次序的相反顺序调用其析构函数 xff0c 销毁类对象成员 3 按原来构造顺序的相反顶序向上依次
  • TCP通信C++实现小例子

    TCP通信C 43 43 实现案例 https www bilibili com video BV1Dt411p74c t 61 1746 61 61 全部来自以上视频 xff0c 纯属搬运 xff0c 小可爱有问题可以举手提问哈 61 6
  • 串行通信简介

    一 串行通信与并行通信 计算机与外界的数据交换称为通信 xff0c 通信分为并行通信和串行通信两种基本方式 并行通信 串行通信 并行通信 xff1a 并行通信指各个数据位同时进行传送的数据通信方式 xff0c 因此有多少个数据位 xff0c
  • 使用寄存器点亮一个LED灯 普中科技stm32(stm32f1103zeb6)

    板子 xff1a 普中科技stm32F1 芯片stm32f1103zet6 1 程序如下 xff1a include 34 stm32f10x h 34 导入头文件 typedef unsigned int u32 typedef是系统关键
  • day 5 select服务器和客户端

    select客户端代码 xff1a include lt stdio h gt include lt string h gt include lt sys socket h gt include lt netinet in h gt inc
  • python Requests添加Auth和Cert

    最近通过postman发起另外一个项目的请求 xff0c 鉴权较为复杂 xff0c 首先需要设置cert xff0c postman中设置如下 xff1a 需要设置basic auth的参数 然后将接口返回的token放入auth的bear
  • STM32笔记(三)---寄存器映射--BSRR分析

    STM32笔记 xff08 三 xff09 寄存器映射 BSRR分析 GPIO与引脚区别 GPIO包含在引脚内 xff08 引脚内还有电源 晶振等特殊功能引脚 xff09 xff0c 除GPIO拓展内容即为单片机最小系统 GPIO功能如何检
  • ROS赵虚左6.5 Rviz中控制机器人模型运动_选了odom坐标系后小车变白不能动

    原因 xff1a 配置文件中的参考坐标不应该是base footprint xff0c 而是你自己小车最下面那个 小脚 的坐标系 xff0c 我的是footprint 所以把参考坐标换一下就可以了
  • 超声波传感器的基础

    超声波传感器已经有几十年的历史了 xff0c 但是由于它们的性能 灵活性和低成本 xff0c 它们仍然占据着传感市场的很大一部分 随着越来越多的产品实现了自动化 xff0c 随着机器人 自动驾驶汽车和无人驾驶飞机的出现 xff0c 需求进一
  • pthread_create未定义的引用

    在ubuntu使用gcc编译时出现 pthread create未定义的引用 问题 解决如下 xff1a 在编译时加入 l pthread 例如gcc thread c o thr l pthread 原因 xff1a pthread不是l
  • Linux下vscode实现调试

    1 安装好vscode xff0c 安装对应的插件 2 编写代码 xff0c 点击右上角的三角形 xff0c 生成对应可执行文件 3 点击菜单栏中的终端 配置任务 xff0c 选择 c c 43 43 xff1a GCC build act
  • 二进制数与十进制之间的转换以及使用一个函数实现任意进制之间的转换

    其他进制转为十进制都可以实现 xff0c 只需要将函数中的10和2换掉你需要的就行 include lt stdio h gt include lt math h gt 1 二进制转换为十进制 int twoConvertTen long
  • vscode配置C语言编译调试的方法

    一 安装GCC 官方下载 如果你能从在线安装 xff0c 那最好就在线安装吧 不过在线安装太容易中断失败了 如果你能连上官网 xff0c 也可以选择从官网去下载离线安装包 https sourceforge net projects min
  • C语言之补漏(1)

    typedef 1 define与typedef区别 xff1f 相比起宏定义的直接替换 xff0c typedef是对类型的封装 xff08 通俗说就是对类型起一个别名 xff09 2 typedef可以给多个别名 typedef int
  • 关于学习如何组装基于F4V3S飞控的竞速穿越机

    广西 河池学院 广西高校重点实验室培训基地 系统控制与信息处理重点实验室 本篇博客来自河池学院 智控无人机小组 创作时间2020 8 22 组装一架穿越机 xff0c 你需要的一些最基本的 xff0c 能让它飞起来的配件有 xff1a 机架
  • STM32—串口

    串口介绍 串行接口简称串口 xff0c 也称串行通信接口或串行通讯接口 xff08 通常指COM接口 xff09 xff0c 是采用串行通信方式的扩展接口 串行接口 xff08 Serial Interface xff09 是指数据一位一位
  • 2021电赛元件清单(评论区有题目预测)

    2021 年全国大学生电子设计竞赛仪器设备和主要元器件及器材清单 本科组 1 仪器设备清单 数字示波器 xff08 100MHz xff0c 双通道 xff09 函数发生器 xff08 50 MHz xff0c 双通道 xff09 任意波信
  • 通过TCP实现客户端与服务端之间通信

    客户端发送的消息 xff0c 服务端接收并在终端中显示出来 服务端代码 xff08 server c include lt stdio h gt include lt sys socket h gt include lt netinet i
  • Qt导入Opencv出现undefined reference to cv::xxx

    Qt配置Opencv在Qt运行时报错undefined reference to cv xxx Face Recognizer报错 FaceRecognizer load const char 41 报错 首先 xff0c 如果出现cv x
  • ESP32 之 ESP-IDF 教学(十二)WiFi篇—— LwIP 之 TCP 通信

    本文章 来自原创专栏 ESP32教学专栏 基于ESP IDF xff0c 讲解如何使用 ESP IDF 构建 ESP32 程序 xff0c 发布文章并会持续为已发布文章添加新内容 xff01 每篇文章都经过了精打细磨 xff01 通过下方对