ESP8266 SDK开发: 综合篇-8266TCP服务器与C#TCP客户端实现无线网络通信控制

实现的功能

前言

1.用户在看这一节之前请先学习

https://www.cnblogs.com/yangfengwu/p/12397146.html   C# TCP客户端

https://www.cnblogs.com/yangfengwu/p/12393478.html   8266 TCP服务器

2.控制继电器引脚

协议规定

C#TCP客户端发送给ESP8266TCP服务器控制继电器吸合指令:

0xaa  0x55  0x01 0x01

ESP8266执行以后回复给C#TCP客户端:

0x55  0xaa  0x01 0x01

 

 

C#TCP客户端发送给ESP8266TCP服务器控制继电器断开指令:

0xaa  0x55  0x01 0x00

ESP8266执行以后回复给C#TCP客户端:

0x55  0xaa  0x01 0x00

ESP8266程序编写

1.处理程序在这节的基础上修改添加

https://www.cnblogs.com/yangfengwu/p/12393478.html

2.配置GPIO5为普通引脚

    /*设置GPIO5为普通引脚*/
    PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U , FUNC_GPIO5);

3.定义用于返回继电器状态的数组

/*用于返回继电器的状态*/
u8 RelayOn[4]={0x55,0xaa,0x01,0x01};//继电器吸合
u8 RelayOff[4]={0x55,0xaa,0x01,0x00};//继电器断开

4.编写TCP接收处理程序

 

/**
* @brief   TCP接收数据
* @param   arg:tcp_arg函数传入的参数
* * @param   p:接收的数据缓存
* @param   err:错误信息
* @param   None
* @retval  None
* @warning None
* @example
**/
static err_t net_tcp_recv_cb(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err) {
    struct pbuf *q;
    u32 length = 0,i=0;
    tcp_pcb_server = tpcb;
    tcp_pcb_server_state = 1;
    if (!p || err!=ERR_OK) {
        if(p){
            pbuf_free(p);
        }
        tcp_pcb_server_state = 0;
        tcp_close(tcp_pcb_server);//关闭连接
        return ERR_CLSD;
    }
    //接收TCP数据(固定)
    for(q=p;q!=NULL;q=q->next){
        if(q->len > (TcpServerBuffLen-length))//接收的数据个数大于了数组可以接收的数据个数
            memcpy(TcpServerBuff+length,q->payload,(TcpServerBuffLen-length));//只接收数组可以接收的数据个数
        else
            memcpy(TcpServerBuff+length,q->payload,q->len);//接收TCP所有数据
        length += q->len;
        if(length > TcpServerBuffLen) break;
    }

    if(TcpServerBuff[0] == 0xaa && TcpServerBuff[1] == 0x55){
        if(TcpServerBuff[2] == 0x01){
            if(TcpServerBuff[3] == 0x01){
                GPIO_OUTPUT_SET(5, 1);//设置GPIO5输出高电平
                tcp_write(tcp_pcb_server, RelayOn, 4, TCP_WRITE_FLAG_COPY);//TCP_WRITE_FLAG_COPY:拷贝到发送缓存
                tcp_output(tcp_pcb_server);//立即发送
            }
            else if(TcpServerBuff[3] == 0x00){
                GPIO_OUTPUT_SET(5, 0);//设置GPIO5输出低电平
                tcp_write(tcp_pcb_server, RelayOff, 4, TCP_WRITE_FLAG_COPY);//TCP_WRITE_FLAG_COPY:拷贝到发送缓存
                tcp_output(tcp_pcb_server);//立即发送
            }
        }
    }

    //固定处理
    tcp_recved(tcp_pcb_server, p->tot_len);/*更新接收,告诉底层可以接着缓存数据了*/
    pbuf_free(p);//释放链表
    return ERR_OK;
}

5.先用TCP调试助手测试

5.1 电脑连接 8266 的无线

5.2 打开TCP客户端,连接8266

5.3 发送16进制指令测试

控制继电器吸合

aa  55  01 01

 

控制继电器断开

aa  55  01 00

C#上位机程序编写

1.处理程序在这节的基础上修改添加

https://www.cnblogs.com/yangfengwu/p/12397146.html

2.页面修改如下

猜你喜欢

转载自www.cnblogs.com/yangfengwu/p/12399078.html