嵌入式系统与单片机|技术阅读
登录|注册

您现在的位置是:嵌入式系统与单片机 > 技术阅读 > ESP8266入门(五)TCP通信之server

ESP8266入门(五)TCP通信之server


上一篇讲了8266作为client与电脑进行TCP通信,今天我们接着讲一下8266作为server与电脑进行TCP通信。


首先,我们让8266连接上路由,路由会分配一个IP地址给8266.连接成功后,我们把8266配置成server模式,监听客户端的连接,当有client连接时,就可以和8266进行TCP通信了。

我画了张TCP通信的示意图,如下

  • 注意,路由器分配给8266的IP要记录下来(通过串口打印出来),电脑的客户端是通过这个IP连接8266的。

  • 那我们怎么通过程序获取8266的IP呢?查看编程指南,有获取IP的函数(wifi_get_ip_info)。如下图


下面我们讲一下esp8266配置成server模式的步骤:

初始化espconn参数(本地IP和端口号)
注册连接成功回调函数和连接异常断开时的回调函数
监听TCP连接(espconn_accept函数)
TCP连接成功后,注册接收数据的回调函数、发送数据成功回调函数、断开连接回调函数

也是4个步骤,下面我们看下编程指南中的TCP监听函数

这个函数也很简单,就是把设置好的espconn传进去就可以了。

下面我们就开始写程序


void ICACHE_FLASH_ATTR syp_TCP_server_init() { struct ip_info info; ||获取8266IP  wifi_get_ip_info(0x00, &info);  ||TCP server端的业务主函数入口  syp_server_init( &info.ip, 9000); }void ICACHE_FLASH_ATTR syp_server_init(struct ip_addr *local_ip,int port){ LOCAL struct espconn esp_conn_syp;  ||初始化espconn参数 esp_conn_syp.type=ESPCONN_TCP; esp_conn_syp.state=ESPCONN_NONE; esp_conn_syp.proto.tcp=(esp_tcp *)os_malloc(sizeof(esp_tcp)); os_memcpy(esp_conn_syp.proto.tcp->local_ip,local_ip,4); esp_conn_syp.proto.tcp->local_port=port;
  ||注册连接成功回调函数和连接异常断开时的回调函数 espconn_regist_connectcb(&esp_conn_syp,server_listen_syp); espconn_regist_reconcb(&esp_conn_syp,server_recon_syp);
||监听客户端连接 espconn_accept(&esp_conn_syp);}
  • 端口号设置为9000(可以修改,只要和客户端一致就可以)


客户端连接成功回调函数和连接异常断开时的回调函数如下:

void ICACHE_FLASH_ATTR server_listen_syp(void *arg) { struct espconn *pespconn = arg; ||客户端连接成功后,注册回调函数 espconn_regist_recvcb(pespconn, server_recv_syp); espconn_regist_sentcb(pespconn, server_sent_syp); espconn_regist_disconcb(pespconn, server_discon_syp);}
void ICACHE_FLASH_ATTR server_recon_syp(void *arg,sint8 err){ os_printf("连接错误,错误代码为:%d\r\n",err);}


客户端连接成功后,接收数据的回调函数、发送数据成功回调函数、断开连接回调函数如下:

void ICACHE_FLASH_ATTR server_recv_syp(void *arg, char *pdata, unsigned short len){
os_printf("收到的数据:%s\r\n", pdata); ||发送数据 espconn_sent((struct espconn*)arg,"我是ESP8266,数据已收到\r\n",strlen("我是ESP8266,数据已收到\r\n"));
}void ICACHE_FLASH_ATTR server_sent_syp(void *arg){ os_printf("发送成功\r\n");}
void ICACHE_FLASH_ATTR server_discon_syp(void *arg){ os_printf("连接已经断开!");}


好了,到这里8266配置成TCP服务器的程序就写好了,下载测试如下:


8266的串口1打印输出如下:

电脑网络助手接收和发送的数据如下图

今天就 讲这么多,精彩继续,下一篇讲8266的AP模式。

原创不易,如果你喜欢我的公众号、觉得我 文章对你有所启发,

请务必“点赞、收藏、转发”,这对我很重要,谢谢!

欢迎订阅    嵌入式小书虫