[经验分享] 【平头哥RVB2601创意应用开发】实践8-TCP连接ESP8266节点控制LED亮灭

DDZZ669   2022-5-27 23:02 楼主


 

 

本篇介绍RVB2601与ESP8266无线TCP通信,使得RVB2601无线控制ESP8266上的LED亮灭。

1.png

1 RVB2601程序

1.1 连网后连接服务器

这里将RVB2601作为客户端,ESP8266板子作为服务器,当RVB2601连上WIFI后,再连接ESP8266板子。RVB2601与ESP8266处于同一局域网下,我这个ESP8266连上网后的IP为192.168.5.108,端口号可任选,我用的是666。

void connect_tcp_server(char *server_ip, uint16_t port)
{
    char ssid[32];
    int bssid[6];
    int channel;
    int rssi;
    
    
    w800_ap_info( ssid, bssid , &channel,  &rssi);
    printf("ssid: %s\r\n", ssid);
    printf("channel: %d\r\n", channel);
    printf("rssi: %d\r\n", rssi);
    
    w800_connect_remote(0, NET_TYPE_TCP_CLIENT, server_ip, port);
}
​
static void network_event(uint32_t event_id, const void *param, void *context)
{
    switch(event_id) {
    case EVENT_NETMGR_GOT_IP:
        LOGD(TAG, "net got ip");
        connect_tcp_server("192.168.5.108", 666); //网络连接成功之后连接服务器(测试另一个ESP8266上的LED控制)
        break;
    case EVENT_NETMGR_NET_DISCON:
        LOGD(TAG, "net disconnect");
        break;
    }
​
    /*do exception process */
    app_exception_event(event_id);
}

1.2 注册自定义指令

为了方便测试LED控制指令,可以先利用串口指令来测试:

static void cmd_tcp_client_handler(char *wbuf, int wbuf_len, int argc, char **argv)
{
    const uint8_t pdata[] = "Hello RVB2601!";
    const uint8_t pledon[] = "led on";
    const uint8_t pledoff[] = "led off";
    int timeout=120;
    
    LOGD(TAG, "[%s] argc:%d\n", __func__, argc);
    for (int i=0; i<argc; i++)
    {
        LOGD(TAG, "[%s] argv:%s\n", __func__, argv[i]);
    }
    
    if (argc == 3 && strcmp(argv[1],"led") == 0)
    {
        if (strcmp(argv[2],"on") == 0)
        {
            w800_send_data(pledon, sizeof(pledon), timeout);
        }
        else if (strcmp(argv[2],"off") == 0)
        {
            w800_send_data(pledoff, sizeof(pledoff), timeout);
        }
        else
        {
            LOGD(TAG, "[%s] para err\n", __func__);
        }
    }
    else
    {
        w800_send_data(pdata, sizeof(pdata), timeout);
    }
}
    
int cli_reg_cmd_tcp_client_test(void)
{
    static const struct cli_command tcp_client_cmd_info = {
        "tcp_client_test",
        "tcp client test",
        cmd_tcp_client_handler,
    };
    aos_cli_register_command(&tcp_client_cmd_info);
    return 0;
}
​
void board_cli_init()
{
    aos_cli_init();
​
    extern void cli_reg_cmd_ps(void);
    cli_reg_cmd_ps();
​
    extern void cli_reg_cmd_free(void);
    cli_reg_cmd_free();
    
    cli_reg_cmd_kvtool();
    
    cli_reg_cmd_ping();
    cli_reg_cmd_ifconfig();
    cli_reg_cmd_factory();
    cli_reg_cmd_sysinfo();
    
    cli_reg_cmd_tcp_client_test();//<--------加上这句
}

2 ESP8266程序

ESP8266使用Arduino IDE进行开发与程序编写,主程序逻辑如下,主要就是等待客户端连接,并接收客户端的指令,接收到后,对指令进行解析,执行对应的LED亮灭操作。

这里是以字符串的形式进行数据传送,比如“led on”就是开灯,“led off”就是关灯,如果还想控制其它电器,如风扇,可以定义如“fan on"和“fan off”这类的指令。

void loop()
{
  uint8_t i;
​
  if (server.hasClient())
  { //判断是否有新的client请求进来
    for (i = 0; i < MAX_SRV_CLIENTS; i++)
    {
      //释放旧无效或者断开的client
      if (!serverClients[i] || !serverClients[i].connected())
      {
        if (!serverClients[i])
        {
          serverClients[i].stop();  //停止指定客户端的连接
        }
​
        serverClients[i] = server.available();//分配最新的client
        Serial.print("1个新的客户端: ");
        Serial.println(i);
        break; //跳出一层for循环
      }
    }
​
    //当达到最大连接数 无法释放无效的client,需要拒绝连接
    if (i == MAX_SRV_CLIENTS)
    {
      WiFiClient client = server.available();
      client.stop();
      Serial.println("连接被拒绝 ");
    }
  }
​
​
  //检测client发过来的数据
  for (i = 0; i < MAX_SRV_CLIENTS; i++)
  {
    if (serverClients[i] && serverClients[i].connected())
    {
      if (serverClients[i].available())
      {
        String recvStr = "";
        while (serverClients[i].available())
        {
          recvStr += char(serverClients[i].read());
        }
        Serial.println("收到客户端的信息:");
        Serial.println(recvStr);
        std::vector<String> splitStr;
        splitBySpace(recvStr, splitStr);
        if (splitStr.size() == 2)
        {
          if (splitStr[0] == "led")
          {
            if (splitStr[1] == "on")
            {
              Serial.println("开灯");
              digitalWrite(2, LOW); // 点亮LED
            }
            else if (splitStr[1] == "off")
            {
              Serial.println("关灯");
              digitalWrite(2, HIGH); // 熄灭LED
            }
          }
        }
      }
    }
  }
}

 

3 测试效果

通过串口指令,可以先测试通信是否正常:

2.png

然后可以通过按键以及屏幕来进行LED的亮灭控制:


 

4 总结

本篇介绍了RVB2601,作为客户端,通过TCP协议,与作为服务端的ESP8266进行无线通信,控制ESP8266上LED的亮灭。

最后,感谢之前各位网友关于RVB2601对于WIFI的使用介绍,本篇参考如下几篇,收获颇多:

【平头哥RVB2601开发板试用体验】WiFi无线通信

RVB2601评估板试用3: 以太网通讯测试

【平头哥RVB2601创意应用开发】3、wifi网络通信

 

回复评论 (1)

ESP8266连上网后的IP为192.168.5.108,端口号可任选,楼主用的是666
这个端口任意选,应该也是3位就行

点赞  2022-5-28 07:37
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复