zoukankan      html  css  js  c++  java
  • ESP8266 SDK开发: 网络篇-综合-8266TCP服务器与C#TCP客户端实现无线网络通信控制

    实现的功能

    C#TCP客户端连接8266的TCP服务器,网络控制开发板继电器

    1.控制继电器吸合

     

    2.控制继电器断开

     

     

    前言

    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.页面修改如下

    3.点击控制继电器按钮

                byte[] SendData = new byte[4];
                SendData[0] = 0xaa;
                SendData[1] = 0x55;
                SendData[2] = 0x01;
                SendData[3] = 0x01;
                if (button2.Text == "吸合")
                {
                    SendData[3] = 0x01;
                }
                else if (button2.Text == "断开")
                {
                    SendData[3] = 0x00;
                }
                try
                {
                    MySocket.BeginSend(SendData, 0, SendData.Length, 0, null, null); //发送数据
                }
                catch (Exception) { }

    4.处理8266返回的数据

                    if (TCPBuffer[0] == 0x55 && TCPBuffer[1] == 0xaa)
                    {
                        if (TCPBuffer[2] == 0x01)
                        {
                            if (TCPBuffer[3] == 0x01)//继电器吸合
                            {
                                Invoke((new Action(() => {//C# 3.0以后代替委托的新方法
                                    label3.Text = "吸合";
                                    button2.Text = "断开";
                                })));
                            }
                            else if (TCPBuffer[3] == 0x00)//继电器断开
                            {
                                Invoke((new Action(() => {//C# 3.0以后代替委托的新方法
                                    label3.Text = "断开";
                                    button2.Text = "吸合";
                                })));
                            }
                        }
                    }

    启动测试

    电脑连接8266无线

    客户端连接TCP服务器

    1.控制继电器吸合

     

    2.控制继电器断开

     

     

  • 相关阅读:
    菜鸟记录:如何获取LOGINVIEW控件状态模板中的子控件
    无法安装dotnetFramework35sp1的解决方法
    MOSS2007小技巧:不用SPD轻松删除错误页面上的问题Webpart
    在动态页面里象静态页面一样控制整个网页的缓存和更新
    烦人的网页iframe去除
    经典sql注入教程
    自己写的后台静态权限验证类
    Asp.net项目从Vs2003转换到Vs2005的常见问题大全及解决方法
    C# 相当于ASP里Eval中的计算公式的方法(超简单的方法)
    1 UNIX与Linux的发展
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/12399078.html
Copyright © 2011-2022 走看看