ESP8266 SDK开发篇(四)——UDP通信

首先回顾上一讲,我们通过几行代码实现了定时器的设置和启动,并讲解了其参数代表什么,至于为什么不用循环延时,是因为看门狗不支持无限循环,即如果用户使用循环延时或进入某一事件太久,就会触发硬件看门口重启。
上一讲解决了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 SDK开发篇(四)——UDP通信_第1张图片
串口助手测试图
ESP8266 SDK开发篇(四)——UDP通信_第2张图片
网络调试助手测试图


这样一来芯片就能和服务器进行通信了,至于通信内容,无非是采集数据然后反馈给服务器,亦或是接收服务器指令作为电路控制开关,因此下一讲我将讲解一下ESP8266的GPIO操作。

你可能感兴趣的:(ESP8266)