Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
AT
esp8266 通讯问题
发布于 2019-04-24 09:52:06 浏览:2447
订阅该版
* 本帖最后由 w1019564793 于 2019-4-24 10:19 编辑 * mcu(AT客户) <------>(AT服务)esp8266(tcp服务)<-------->多个tcp客户端 大致是这么一个流程,目前esp8266初始化成功,多个tcp客户端也连上了。 看论坛说是要用sal组件,但具体有没有个例程呢,还有就是,我多个TCP客户端,怎么知道是谁发报文的,因为我mcu要对TCP客户端做出回应。有个帖子说AT 组件中对外的函数并不是 esp8266_socket_send 或者 esp8266_socket_connect 这类接口,而是用到 SAL 套接字抽象层抽象的标准 BSD Socket APIs ,那esp8266_socket_send一般是用在那个地方? 多谢大家!
查看更多
4
个回答
默认排序
按发布时间排序
Cheney_Chen
2019-04-24
这家伙很懒,什么也没写!
ESP8266 初始化完成,并且你还连接上多个 TCP 客户端,说明这时候已经 SAL 组件,SAL组件的作用就是抽象 BSD Socket API 接口,你使用的创建 TCP 连接的函数 socket()、connect() 等其实底层就是调用 SAL 组件抽象的 AT Socket 相关功能接口。 MCU 作为 AT 客户端, ESP8266 作为 AT 服务器,这时候如果有 TCP 客户端连接 ESP8266 TCP 服务器,ESP8266 应该会接收到设备连接的 URC 数据,URC 数据中包含连接的 Socket,地址和端口号,这个 URC 可以在 AT 客户端 MCU 中处理,这样 MCU 可以获取 TCP 连接的 Socket。当 TCP 客户端有数据发送给服务器时, ESP8266 应该也会收到数据接收 URC, URC 中可以解析发送数据的 Socket 值和数据,AT 客户端接收到 URC 可以判断是哪个 socket 值并可以做出响应。 URC(解析连接的 Socket 和数据) 连接 mcu(AT客户) <------(AT服务)esp8266(tcp服务)<--------多个tcp客户端 AT 命令(向指定 socket 发送数据) 发送 mcu(AT客户) ------>(AT服务)esp8266(tcp服务)-------->多个tcp客户端 这中模式可能和现在适配的 at_socket 框架有所不同,该功能如果可以实现,可能全部在 URC 中处理完成,包括连接的接收和数据的发送过程。
w1019564793
2019-04-24
这家伙很懒,什么也没写!
>ESP8266 初始化完成,并且你还连接上多个 TCP 客户端,说明这时候已经 SAL 组件,SAL组件的作用就是抽象 BS ... --- 多谢!
w1019564793
2019-05-05
这家伙很懒,什么也没写!
[i=s] 本帖最后由 w1019564793 于 2019-5-5 11:38 编辑 [/i] >多谢! --- 还有一个问题: 首先 我已经给esp8266发送指令了,用的是[https://github.com/RT-Thread-packages/at_device](https://github.com/RT-Thread-packages/at_device) 里的at_socket_esp8266.c。将esp8266设置位tcp服务端。成功了。(ip:192.168.4.1 port:8089),用电脑电脑(TCP客户端)连接成功,并且可以收发数据。 接着想用sal接收 手机或者电脑(TCP客户端)发过来的数据,以及和发送给手机或者电脑 , 然后在上面加,我没理清是要建立tcp 服务端还是客户端,所以我两个都试了 ``` /* * 程序清单:tcp 服务端 * * 这是一个 tcp 服务端的例程 * 导出 tcpserv 命令到控制终端 * 命令调用格式:tcpserv * 无参数 * 程序功能:作为一个服务端,接收并显示客户端发来的数据 ,接收到 exit 退出程序 */ #include
#include
/* 使用BSD socket,需要包含socket.h头文件 */ #include
#include
#include
#define BUFSZ (1024) static const char send_data[] = "This is TCP Server from RT-Thread."; /* 发送用到的数据 */ static void tcpserv(int argc, char **argv) { char *recv_data; /* 用于接收的指针,后面会做一次动态分配以请求可用内存 */ socklen_t sin_size; int sock, connected, bytes_received; struct sockaddr_in server_addr, client_addr; rt_bool_t stop = RT_FALSE; /* 停止标志 */ int ret; recv_data = rt_malloc(BUFSZ + 1); /* 分配接收用的数据缓冲 */ if (recv_data == RT_NULL) { rt_kprintf("No memory\n"); return; } /* 一个socket在使用前,需要预先创建出来,指定SOCK_STREAM为TCP的socket */
if ((sock = socket(AF_AT, SOCK_STREAM, 0)) == -1)
{ /* 创建失败的错误处理 */ rt_kprintf("Socket error\n"); /* 释放已分配的接收缓冲 */ rt_free(recv_data); return; }
/* 初始化服务端地址 */ server_addr.sin_family = AF_AT; server_addr.sin_port = htons(8089); /* 服务端工作的端口 */ server_addr.sin_addr.s_addr = ((u32_t)0xC0A80401UL);; // IP地址 192.168.4.1
rt_memset(&(server_addr.sin_zero), 0, sizeof(server_addr.sin_zero)); /* 绑定socket到服务端地址 */ if (bind(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1) { /* 绑定失败 */ rt_kprintf("Unable to bind\n"); /* 释放已分配的接收缓冲 */ rt_free(recv_data); return; } /* 在socket上进行监听 */ if (listen(sock, 5) == -1) { rt_kprintf("Listen error\n"); /* release recv buffer */ rt_free(recv_data); return; } rt_kprintf("\nTCPServer Waiting for client on port 8089...\n"); while (stop != RT_TRUE) { sin_size = sizeof(struct sockaddr_in); /* 接受一个客户端连接socket的请求,这个函数调用是阻塞式的 */ connected = accept(sock, (struct sockaddr *)&client_addr, &sin_size); /* 返回的是连接成功的socket */ if (connected< 0) {
rt_kprintf("accept connection failed! errno = %d\n", errno);
continue; } /* 接受返回的client_addr指向了客户端的地址信息 */ rt_kprintf("I got a connection from (%s , %d)\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port)); /* 客户端连接的处理 */ while (1) { /* 发送数据到connected socket */ ret = send(connected, send_data, strlen(send_data), 0); if (ret < 0) { /* 发送失败,关闭这个连接 */ closesocket(connected); rt_kprintf("\nsend error,close the socket.\r\n"); break; } else if (ret == 0) { /* 打印send函数返回值为0的警告信息 */ rt_kprintf("\n Send warning,send function return 0.\r\n"); } /* 从connected socket中接收数据,接收buffer是1024大小,但并不一定能够收到1024大小的数据 */ bytes_received = recv(connected, recv_data, BUFSZ, 0); if (bytes_received < 0) { /* 接收失败,关闭这个connected socket */ closesocket(connected); break; } else if (bytes_received == 0) { /* 打印recv函数返回值为0的警告信息 */ rt_kprintf("\nReceived warning,recv function return 0.\r\n"); closesocket(connected); break; } /* 有接收到数据,把末端清零 */ recv_data[bytes_received] = '\0'; if (strcmp(recv_data, "q") == 0 || strcmp(recv_data, "Q") == 0) { /* 如果是首字母是q或Q,关闭这个连接 */ closesocket(connected); break; } else if (strcmp(recv_data, "exit") == 0) { /* 如果接收的是exit,则关闭整个服务端 */ closesocket(connected); stop = RT_TRUE; break; } else { /* 在控制终端显示收到的数据 */ rt_kprintf("RECEIVED DATA = %s \n", recv_data); } } } /* 退出服务 */ closesocket(sock); /* 释放接收缓冲 */ rt_free(recv_data); return ; } ``` 效果:首先用电脑创建的tcp客户端连接上,是可以发送和接收数据的。这一部分执行的是at_socket_esp8266.c的程序。 接着在终端命令行上敲 tcpserv ,一直显示 accept connection failed! errno = 0 不知道是不是 at_socket_esp8266.c 和 tcpserv 冲突。 接着我试了试建 tcp 客户端 还是不行.
w1019564793
2019-05-05
这家伙很懒,什么也没写!
:hug:
撰写答案
登录
注册新账号
关注者
0
被浏览
2.4k
关于作者
w1019564793
这家伙很懒,什么也没写!
提问
18
回答
37
被采纳
0
关注TA
发私信
相关问题
1
rt-thread 2g/3g/4g通信模块的教程有吗?
2
基于AT指令,用esp8266如何连接mqtt?
3
AT组件使用问题
4
官方AT客户端应用笔记的几个小tip
5
RTT的SAL能够判断使用LWIP或者AT?
6
rt_therad AT组件移植不成功(结贴)
7
AT组件在哪个版本的?
8
AT组件 连接 Onenet 连接失败
9
esp8266 AT指令 MQTT连接问题
10
AT组件使用问题之模块主动上报【已解决】
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
使用RC522软件包驱动FM1722
2
常量数据类型和表达式陷阱分享
3
进行i2c驱动移植的经验总结
4
在VSCode中使用clang-format
5
我该如何使用这个微雪的WIFI400 WIFI-LPB-100在rtt里或者我该怎样为它开发驱动
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
freemodbus
PWM
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
msh
keil_MDK
ulog
C++_cpp
MicroPython
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
289
次被采纳
张世争
809
个答案
175
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
Woshizhapuren
1
篇文章
5
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部