纳尼?昨天刚刚打印了个“Hello World!”,今天你就让我学习TCP通信?有没有搞错~哈哈,相信很多读者会很迷,其实学习这东西嘛,单单学一些比较简单的,相信没两天就没人看了,所以咱就在基础篇和网络篇穿插着去学习一下ESP8266,毕竟兴趣才是最好的老师嘛!大家以后遇到问题了,来翻文章建议大家根据[XX篇]去快速定位该去哪一篇文章中去查找问题,当然具体会在哪一篇文章中有讲,也不一定了,后面也会穿插着写一点[项目篇][进阶篇][闲扯篇],总的来说就是,本系列文章并没有固定的路线,大家不如忍忍?当然这里写的文章也不一定是对的,大家在实际测试中如果遇到了问题,还请私信我,或者在Github上提交issue!
闲话少说,既然要学习TCP通信的知识,那么我们得先要了解一下TCP到底是个什么东西(玩意),正所谓孙子曾经曰过“知彼知己,百战不殆”,那我们先补一些关于TCP的知识吧!
TCP基础知识:
- 是什么?
TCP(Transmission Control Protocol传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。(百度词条搜到的~)
说白了就是一种传输协议,就像我们串口、232、485等一样的通讯协议,只不过TCP多用于网络间的通讯,不过TCP是在IP层之上的,相信你肯定见过或者听说过TCP/IP协议,没错,这哥俩是绑在一块的,TCP是依赖IP协议的。
- 通讯机制
TCP与我们常使用的串口等通讯协议有什么不同呢?首先是两台主机建立TCP连接机制是比较麻烦的,要经过三次握手协议,才能建立连接,过程用汉字描述如下:
- 客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。
- 服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态。
- 客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态。
看字比较麻烦,我们还是看图吧!
既然有建立连接,那么肯定也有断开连接,但是没想到断开连接比建立连接还要麻烦,还有四次挥手协议,纳尼?是的,断开连接需要经过四次挥手协议,直接看图吧:
- 可靠性
上面说的通讯机制之所以这么麻烦,主要还是为了传输的可靠性,因为TCP是在整个网络中去传输,只要你有IP地址,并且在广域网中访问,那我们就可以建立TCP连接,说会悄悄话~所以,两者之间的可靠性就显得很重要了,客户端与服务端之间的连接可靠性靠很多策略去实现的比如心跳包机制,这里就不再详细叙述了,有点跑题了,这是ESP8266学习笔记~
- 数据包格式
TCP的数据包相对来说是比较麻烦的,确认信息占据了整个数据包的很大一部分,设计的这么复杂主要原因还是保证在整个网络当中每包数据传输的正确性,这里我们就看一下数据包到底有多么复杂:
可以看到在整个数据包中,数据只占了很小一部分,更多的是各种确认信息,感兴趣的可以去再了解一下,好好学习一下网络传输协议对学习物联网也是很有帮助的,只可惜作者这里也还是菜鸟一个~
- ESP8266作为TCP Client跟Server(PC)通信
了解了一点点基础知识后,我们还是要落实到实践上,下面我们正式开始,首先我们需要先看一下官方SDK编程指导手册,还没有?不知道去哪里下?好嘞,直接戳下面卡片下载好了~
https://www.espressif.com/sites/default/files/documentation/2c-esp8266_non_os_sdk_api_reference_cn.pdfwww.espressif.com
英文版戳这里,如果你英语跟小编一样好的话,建议看英文版,要不断提升自己的英语~
https://www.espressif.com/sites/default/files/documentation/2c-esp8266_non_os_sdk_api_reference_en.pdfwww.espressif.com
咳咳咳,那我们先打开这个英文文档,找到97页的TCP/UDP接口,我们先看一下接口分了几类:
咳咳咳,不要怀疑,使用的PDF查看软件有自动翻译动能,手动滑稽.jpg,可以看到一共分了4类,本篇文章我们先研究下通用 API和TCP API,关于UDP和mDNS的我们再后面的文章中再继续学习,你可以先大体看一下,每个API的注释都讲的很明白,我们不妨直接copy点代码直接跑一下?
#如果之前有clong过,可以直接 git pull,不会用?那肯定是没好好看廖雪峰的git教程
下载完成后,打开ESP_IDE导入在makingfunxyz-esp8266-NONOS文件中的6.TCP_UDP_Server_Client这个工程,然后先修改一点东西,这一步很重要,请不要忽略:
Wi-Fi名称跟密码相信你肯定知道,TCP_SERVER_IP应该要修改成什么呢?就是你电脑的IP地址,这里每个人的都不一样,建议你先去查看一下,方法看视频~
PC查看本机IPhttps://www.zhihu.com/video/1053785725551677440
可以看到我这里是192.168.0.109,那我就将它修改成192.168.0.109,这三个地方都修改好了后,我们直接先编译代码,先跑一下看看!编译好代码后,下载到ESP8266,这里跟上篇文章中是一样的,就不再详述,下载地址参考:
- eagle.flash.bin-------->0x00000
- eagle.irom0text.bin---->0x10000
- esp_init_data_default_v08.bin --> 0x3FC000
- blank.bin --> 0x3FE000
下载完成后,我们先不要急着去看结果,因为我们还没有开启TCP Server,那我们该怎么开启TCP Server呢?我这里用Python写了一个很简单的Server端程序,大家可以使用我这个,要是使用别的TCP调试助手,注意TCP_SERVER_PORT也要修改一下,运行我们的Server很简单,但是你需要安装一下Python,我这里没有打包成可执行文件,先去安装一下Python吧,我用的是Python3,建议大家也安装Python3,因为Python2跟Python3有些语法不一样,戳卡片下载:
Download Pythonwww.python.org
下载安装完成后,开始搞起来,我们需要在6.TCP_UDP_Server_Client这个文件夹下找到TCP_Server.py这个文件夹,然后打开修改一下IP地址,将IP地址修改成上面我们查看的本机地址,看图:
最后我们还需要设置一下开放端口,这里步骤有点多,就不再细述了,大家可以直接看这个百度知道,写的很详细:
https://jingyan.baidu.com/article/09ea3ede7311dec0afde3977.htmljingyan.baidu.com
然后打开命令窗口,具体操作办法,在此文件下按住shift键,然后右键选择打开powershell窗口(WIN7 应该是cmd窗口),然后:
#可以直接在powershell里面执行,但是我还是比较喜欢cmd窗口,所以就~win7不用,因为打开的就是cmd窗口
ESP8266 TCP Clienthttps://www.zhihu.com/video/1053785893437112320
- ESP8266作为TCP Server跟Client(PC)通信
上面是ESP8266作为Client去跟Server通信,但是ESP8266不仅可以作为Client还可以作为Server等待Client去建立连接去通信,这里我们修改几个地方,就可以将ESP8266作为Server去跟Client通信了,我在源码中已经都写好了,这里我们将同样将ESP8266的6666作为PC去连接的端口号:
其中TCP_Client.py文件中的IP地址需要在ESP8266上电打印后修改一下,我们将上面小节中的tcp_client_init()注释掉,tcp_server_init()取消注释,然后重新编译代码下载就好了,PC上的Client程序跟Server程序运行一样,这里我们直接看一下视频吧!
ESP8266 TCP Serverhttps://www.zhihu.com/video/1053786028644626432
这里代码就不再解释了,我写的注释还算全,大家一看就懂,主要代码:
/****************************
user_main.c中的主要代码:
struct