ESP8266---TCP Client

ESP8266WiFi库里面还有其他重要内容,比如跟http相关的 WiFiClient、WiFiServer,跟https相关的 WiFiClientSecure、WiFiServerSecure
至于是client还是Server,取决于ESP8266开发需求:
如果业务要求是获取其他server提供的数据(发送请求,比如请求天气信息),那么你就可以使用Client模式
如果业务要求是别人请求你获取某些数据(web请求),那么你可以使用Server模式
TCP client:

client,又名客户端,也就是需要通过获取server提供的服务数据来展示自己。Tcp client,只是架构在tcp协议之上的客户端 .上图中,ESP8266作为client端,通过路由,访问局域网内的Pc server或者广域网下的网络服务器信息,server收到请求后会处理请求并且把响应数据返回以供ESP8266使用

整体上来说,方法可以分为4类:
第一类方法,连接操作
第二类方法,发送请求操作
第三类方法,响应操作
第四类方法,普通设置
1.连接操作
int connect(IPAddress ip, uint16_t port); //启动tcp连接--方式一
//ip IP地址
//port 端口
//返回值:1 成功 0 失败 int connect(const char *host, uint16_t port); //启动tcp连接--方式二
//host tcpserver (192.xx.xx.xx)
//port 端口
//返回值:1 成功 0 失败 int connect(const String host, uint16_t port); //启动tcp连接--方式三
//host tcpserver (192.xx.xx.xx)
//port 端口
//返回值:1 成功 0 失败
2. 判断tcp连接是否建立起来
uint8_t connected(); //判断tcp连接是否建立起来
//返回值:1成功 0 失败
3.停止tcp连接
void stop(); //关闭tcp连接
4.连接状态
uint8_t status(); //获取tcp连接状态
/**
* @return result of tcp connect
* CLOSED = 0,
* LISTEN = 1,
* SYN_SENT = 2,
* SYN_RCVD = 3,
* ESTABLISHED = 4,
* FIN_WAIT_1 = 5,
* FIN_WAIT_2 = 6,
* CLOSE_WAIT = 7,
* CLOSING = 8,
* LAST_ACK = 9,
* TIME_WAIT = 10
*/
4.发送数据到client连接的server---write方法
size_t write(uint8_t str);//发送数据--方式一
//str 需要单个字节
//返回值:size_t 成功写入发送缓冲区的字节数 size_t write(const char *str); //发送数据--方式二
//str 需要发送字符串或者字符数组
//返回值:size_t 成功写入发送缓冲区的字节数 size_t write(const char *buffer, size_t size); //发送数据--方式三
//buffer 需要发送字符串或者字符数组
//size 数据字节数
//返回值:size_t 成功写入发送缓冲区的字节数 size_t write(Stream& stream); //发送数据--方式四
//stream 数据流,比如文件流
//返回值:size_t 成功写入发送缓冲区的字节数
注意点:write(uint8_t)函数是发送数据的底层方法,也就是说print、println底层也是调用write
write(const char *str) 函数底层是调用 write(const char *buffer, size_t size),通过strlen计算长度
5.发送数据到client连接的server---print方法
size_t print(const __FlashStringHelper *); //发送数据
//FlashStringHelper 需要发送的字符串,字符串存在flash中(PROGMEM)
//返回值:size_t 成功写入发送缓冲区的字节数 size_t print(const String &); //发送数据
//String 需要发送的字符串,字符串存在内存中
//返回值:size_t 成功写入发送缓冲区的字节数 size_t print(const char[]); //发送数据
//参数 需要发送的字符数组,字符数组存在内存中
//返回值:size_t 成功写入发送缓冲区的字节数 size_t print(char ch); //发送数据
//ch 需要发送的字符
//返回值:size_t 成功写入发送缓冲区的字节数 /**
* 发送数据
* @param String 需要发送的数据,多是数字,转成对应的进制,一般都是传输数字型数据
* @return size_t 成功写入发送缓冲区的字节数
*/
size_t print(unsigned char, int = DEC);
size_t print(int, int = DEC);
size_t print(unsigned int, int = DEC);
size_t print(long, int = DEC);
size_t print(unsigned long, int = DEC);
size_t print(double, int = );
//进制的英文表示法:BIN、OCT、HEX、DEC分别代表二、八、十六、十进制
注意点:读者需要特别关注 print(const __FlashStringHelper *) 这个函数,以后代码内存优化需用用到
例如:
WiFiClient client;
client.print( F("This is an flash string")); //字符串“This is an flash string”存在于flash
6.发送数据到client连接的server---println方法
size_t println(const __FlashStringHelper *);//发送数据,并且加上换行符 "\r\n"
//FlashStringHelper 需要发送的字符串,字符串存在flash中(PROGMEM)
//size_t 成功写入发送缓冲区的字节数 size_t println(const String &s);//发送数据,并且加上换行符 "\r\n"
//String 需要发送的字符串,字符串存在内存中
//size_t 成功写入发送缓冲区的字节数 size_t println(const char[]);//发送数据,并且加上换行符 "\r\n"
//String 需要发送的字符数组,字符数组存在内存中
//size_t 成功写入发送缓冲区的字节数 size_t println(char);//发送数据,并且加上换行符 "\r\n"
//String 需要发送的字符
//size_t 成功写入发送缓冲区的字节数 /**
* 发送数据,并且加上换行符 "\r\n"
* @param String 需要发送的数据,多是数字,转成对应的进制,一般都是传输数字型数据
* @return size_t 成功写入发送缓冲区的字节数
*/
size_t println(unsigned char, int = DEC);
size_t println(int, int = DEC);
size_t println(unsigned int, int = DEC);
size_t println(long, int = DEC);
size_t println(unsigned long, int = DEC);
size_t println(double, int = );
//进制的英文表示法:BIN、OCT、HEX、DEC分别代表二、八、十六、十进制 size_t println(void);//发送换行符 "\r\n"
//size_t 成功写入发送缓冲区的字节数
7.响应操作
int available();
//返回值:int 接收缓冲区可读取字节数
注意点:通过此方法,我们可以判断发送出去的请求是否有响应信息
size_t availableForWrite();
//返回值:int 发送缓冲区剩余可写字节数
注意点:一般来说,调用发送数据操作之后,并不会立刻发送出去,而是把数据放入发送缓冲区,通过机制不断读取发送缓冲区的数据不断发送出去
可以通过此函数判断请求是否发送完毕
int read(); //读取接收缓冲区一个字节
//返回值:int 一字节数据
注意点:此函数读取完数据后,会把该数据从缓冲区清掉
int read(uint8_t *buf, size_t size); //读取接收缓冲区size大小的字节数据
//buf 数据存储到该buf
//size 读取大小
注意点:此函数读取完数据后,会把该数据从缓冲区清掉
int peek(); //读取接收缓冲区一个字节
//返回值:int 一字节数据
注意点:此函数读取完数据后,不会把该数据从缓冲区清掉
size_t peekBytes(uint8_t *buffer, size_t length);//读取接收缓冲区length大小的字节数据
size_t peekBytes(char *buffer, size_t length);
//buffer 数据存储到该 buffer
//length 读取大小
//返回值:size_t 成功读取的大小
注意点:此函数读取完数据后,不会把该数据从缓冲区清掉
String readStringUntil(char end); //读取响应数据直到某个字符串为止
//end 结束字符
//返回值:String 读取成功的字符串
bool find(char *buffer); //查找某个字符串
//buffer 目标字符串
//返回值:bool 存在返回true
注意点:此函数会把数据从缓冲区清掉
void flush(void); //清除接收缓冲区
注意点:新版本flush功能是等待缓冲区中的所有传出字符都已发送。所以做不了清除缓冲区的作用
可以有以下代替:while(client.read()>0);
client的发送缓冲区的大小是256Bytes
void setNoDelay(bool nodelay); //是否禁用 Nagle 算法
//nodelay true表示禁用 Nagle 算法
注意点:Nagle 算法的目的是通过合并一些小的发送消息,然后一次性发送所有的消息来减少通过网络发送的小数据包的tcp/ip流量。这种方法的缺点是延迟了单个消息的发送,直到一个足够大的包被组装
实例:---向 TCP server收发数据
//例子介绍:本实验演示 WiFiClient 与 TCP server 之间的通信功能
//个人建议:用TCP调试工具 查看IP地址, 用tcpudp测试工具 进行通讯
//TCP调试工具 下载地址:链接:https://pan.baidu.com/s/1rwNQGcBSD-ogQljIeqgNxg 提取码:gibq
//tcpudp测试工具 下载地址:链接:https://pan.baidu.com/s/10vIVOi5JYeFRcb7oO19R0w 提取码:acrr
//STA模式下,演示WiFiClient与TCP server之间的通信功能(两个机子之间的数据传输)
#include <ESP8266WiFi.h> #define AP_SSID "jia" //这里改成你的wifi名字
#define AP_PSW "lm654321"//这里改成你的wifi密码 const uint16_t port = ;
const char * host = "192.168.188.166"; // ip or dns
WiFiClient client;//创建一个tcp client连接 void setup() {
Serial.begin();
delay();
WiFi.mode(WIFI_STA); //STA模式
WiFi.begin(AP_SSID,AP_PSW); //登陆WIFI Serial.println("正在登陆WIFI... ");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay();
}
Serial.println("");
Serial.println("WiFi连接成功");
Serial.print("IP地址是: ");
Serial.println(WiFi.localIP());
delay(); Serial.print("连接到 ");
Serial.println(host); if (!client.connect(host, port)) {
//client.connect(host, port) 连接TCP server端,连接成功返回True
Serial.println("TCP server端连接失败");
Serial.println("请等待5秒后重新连接...");
delay();
return;
}
Serial.println("TCP server端连接成功"); } void loop() { Serial.println("发送数据到Tcp server");
client.println(String("Send this data to server"));//发送数据,并且加上换行符 "\r\n"
//向Tcp server发送数据 //读取从server返回到响应数据
String line = client.readStringUntil('\r'); //读取响应数据直到某个字符串为止
//读取从Tcp server发来的数据 Serial.print("读取的数据是:");
Serial.println(line); //client.stop(); //关闭tcp连接--与Tcp server断开连接 Serial.println("wait 10 sec...");
delay();
}
client.connected() 判断客户端是否处于连接状态,是 返回True
天子骄龙
ESP8266---TCP Client的更多相关文章
- 六,ESP8266 TCP Client
今天不知道是不是让我姐挺失望.......很多时候都不知道自己努力的方向对不对,,以后能不能带给家人最美好的期盼...... Init.lua 没啥改变,,就改了一下加载Client.lua gpio ...
- 六,ESP8266 TCP Client(基于Lua脚本语言)
今天不知道是不是让我姐挺失望.......很多时候都不知道自己努力的方向对不对,,以后能不能带给家人最美好的期盼...... Init.lua 没啥改变,,就改了一下加载Client.lua gpio ...
- ESP8266开发之旅 网络篇⑦ TCP Server & TCP Client
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- [原]一个简单的Linux TCP Client所涉及到的头文件
今天在Linux环境下写了一个最简单的TCP Client程序,没想到Linux环境下的头文件竟然这么分散,让我这样的菜鸟很是郁闷啊.编译成功的代码如下: #include <iostream& ...
- STM32F407移植contiki2.6后使用LWIP库实现tcp client
最近在做智能家居,物联网项目,用到了C下的contiki移植 经过一阵调试,终于在 STM32F407移植contiki2.6后使用LWIP库实现tcp client. 一路艰辛谁人知道....唯有留 ...
- W5500EVB TCP Client模式设置说明
W5500EVB是WIZnet为了方便用户更好了解.使用W5500这款网络芯片所开发的评估板,该板採用了 STM32F103RCT6+W5500 的设计.基于 ARM 的 Cortex-M3 平台.那 ...
- (转)lwip TCP client & FreeRTOS 打开TCP 的 保活机制 LWIP_TCP_KEEPALIVE==1
参考大神教程:http://blog.sina.com.cn/s/blog_62a85b950101aw8x.html 老衲五木 :http://blog.sina.com.cn/s/blog_6 ...
- lwip TCP client & FreeRTOS 打开TCP 的 保活机制 LWIP_TCP_KEEPALIVE==1
参考大神教程:http://blog.sina.com.cn/s/blog_62a85b950101aw8x.html 老衲五木 :http://blog.sina.com.cn/s/blog_6 ...
- Modbus库开发笔记之四:Modbus TCP Client开发
这一次我们封装Modbus TCP Client应用.同样的我们也不是做具体的应用,而是实现TCP客户端的基本功能.我们将TCP客户端的功能封装为函数,以便在开发具体应用时调用. 对于TCP客户端我们 ...
- [Python 网络编程] TCP Client (四)
TCP Client 客户端编程步骤: 创建socket对象 连接到服务端的ip和port,connect()方法 传输数据 使用send.recv方法发送.接收数据 关闭连接,释放资源 最简单的客户 ...
随机推荐
- 使用vue做项目如何提高代码效率
最近做了两个vue项目,算上之前做的两个项目,总共有四个vue项目的经验了,但是总体来说写的代码质量不是很高,体现在以下几点 1.代码没有高效的复用 自从使用vue做项目之后,以前使用面向过程变成的习 ...
- 【VS开发】VC实现程序重启的做法
转载地址:http://blog.csdn.net/clever101/article/details/9327597 很多时候系统有很多配置项,修改了配置项之后能有一个按钮实现系统重启.所谓重启就是 ...
- XCode8.3真机调试设置
本文使用XCode8.3.3 首先XCode->Preferncs,进入下面的界面 点击左下角“+”号,并输入账号,然后点击Manage Certificates,左下角添加IOS develo ...
- [转帖]LSB
LSB 简介 冯 锐2006 年 8 月 07 日发布 https://www.ibm.com/developerworks/cn/linux/l-lsb-intr/ 学习一下 之前 不知道LSB_R ...
- linux-yum-downloadonly 下载rpm安装包到本地
注意 注意1:如果机器,本来就安装了相应的rpm包,则该rpm包不会下载. 参考 centos7离线安装rpm包自动解决依赖 查看linux系统版本信息(Oracle Linux.Centos Lin ...
- java tomcate 启动后cmd 出现乱码
今天windows 启动tomcat 后,出现cmd 乱码 尝试改cmd编码为UTF-8后无效,修改tomcat 注册表CodePage ,cmd 依然乱码, 后来把Conf 目录下的logging. ...
- 软考题型—PERT图(项目计划评审技术)
经历过软件危机和大量软件项目的失败,人们对软件工程产业现状进行分析后,得出普遍性结论便是:软件项目成功率低的原因很可能就是项目管理能力太弱.由于软件本身的特殊性和复杂性,将项目管理思想引入软件工程领域 ...
- Linux如何查看进程是否启动,查看端口占用
Linux系统中经常需要查看某个进程是否已经启动,启动位置在哪里,某个端口是否被占用,被哪个进程占用等,这些都可以通过命令来完成,本文讲述如何查看进程是否启动,查看端口占用 1.通过ps -ef | ...
- Hdu 4738【tanjan求无向图的桥】割边判定定理 dfn[x] < low[y]
题目: 曹操在长江上建立了一些点,点之间有一些边连着.如果这些点构成的无向图变成了连通图,那么曹操就无敌了.刘备为了防止曹操变得无敌,就打算去摧毁连接曹操的点的桥.但是诸葛亮把所有炸弹都带走了,只留下 ...
- pyhton接口自动化测试-requests.post()
一.方法定义 二.post方法简单使用 1.带数据的post 2.带header的post 3.带json的post 4.带参数的post 5.普通文件上传 6.定制化文件上传 7.多文件上传 一.方 ...