首先回顾上一讲,我们通过几行代码实现了定时器的设置和启动,并讲解了其参数代表什么,至于为什么不用循环延时,是因为看门狗不支持无限循环,即如果用户使用循环延时或进入某一事件太久,就会触发硬件看门口重启。
上一讲解决了wifi连接的问题,那么接下来就是和服务器通信问题,因为我在学校跟导师做的项目需要比较多的节点,所以是使用UDP协议的,至于如何建立TCP连接,就作为本讲的拓展练习吧。
这次要添加一个头文件#include "espconn.h"
,其次定义两个变量
struct espconn PhoneConn; //网络连接的结构体,里面定义了连接的类型和回调函数等
esp_udp PhoneConnUdp; //用来声明连接是udp,存放了端口、ip等数据
还是先来看看这两个结构体,代码都是文件里的,IDE中F3可以直接跳转到声明查看。
typedef struct _esp_udp {
int remote_port; //远程服务器端口
int local_port; //本地端口
uint8 local_ip[4]; //本地ip
uint8 remote_ip[4]; //远程服务器ip
} esp_udp;
/** A espconn descriptor */
struct espconn { //英文注释都说的很清楚了
/** type of the espconn (TCP, UDP) */
enum espconn_type type;
/** current state of the espconn */
/** Current state of the espconn. Non-TCP espconn are always in state ESPCONN_NONE! */
enum espconn_state state;
union {
esp_tcp *tcp;
esp_udp *udp;
} proto;
/** A callback function that is informed about events for this espconn */
espconn_recv_callback recv_callback;
espconn_sent_callback sent_callback;
uint8 link_cnt;
void *reverse;
};
因此,我们要建立udp连接,首先要对这些变量赋值,这里定义一个函数用于建立连接,还是先贴代码再解释。
//回调函数
void ICACHE_FLASH_ATTR
udpclient_recv(void *arg, char *pdata, unsigned short len)
{ //接收到消息后,通过串口和网络接口输出
//通过wifi发送消息
//参数一:对应网络传输的结构体;参数二:要发送的内容;参数三:要发送内容的长度
espconn_send(&PhoneConn, "Receive message!", os_strlen("Receive message!"));
os_printf("Receive message:%s\n",pdata);
}
void ICACHE_FLASH_ATTR
UDP_link()
{
PhoneConn.type = ESPCONN_UDP; //要建立的连接类型为UDP
PhoneConn.proto.udp = &PhoneConnUdp;
PhoneConn.proto.udp->local_port = 8080; //设置本地端口
PhoneConn.proto.udp->remote_port = 8080;//设置远程端口
//设置ip,我是放在一个全局数组里,方便学校里调试的时候修改,毕竟函数很多的话要找到这里太麻烦
PhoneConn.proto.udp->remote_ip[0] = server_ip[0];
PhoneConn.proto.udp->remote_ip[1] = server_ip[1];
PhoneConn.proto.udp->remote_ip[2] = server_ip[2];
PhoneConn.proto.udp->remote_ip[3] = server_ip[3];
//注册UDP数据包接收回调
//参数一:对应网络传输结构体;参数二:成功接收数据后的回调函数
espconn_regist_recvcb(&PhoneConn, udpclient_recv);
espconn_create(&PhoneConn);//建立UDP传输
}
这样,在确保wifi连接并且分配ip后就能通过该函数建立UDP连接了,这里接收到数据便通过串口显示内容,并告知对方接收到数据了,调试结果如下。
串口助手测试图
网络调试助手测试图
这样一来芯片就能和服务器进行通信了,至于通信内容,无非是采集数据然后反馈给服务器,亦或是接收服务器指令作为电路控制开关,因此下一讲我将讲解一下ESP8266的GPIO操作。