ESP-IDF 上使用 Mongoose 的 Websockets

物联网 ESP32 网络套接字
2021-06-01 07:00:10

我正在尝试在 ESP-IDF 平台上使用websocket_chat_client 示例,但statuson MG_EV_CONNECTevent的值始终为-1,即Connection error. 到目前为止,我所做的是采用esp32-idf 示例,将其与 websocket-client 合并,添加来自 WiFi 示例的内容并将其设置chat_server_url为 WS 服务器正在侦听的主机。根据服务器日志,它似乎从未访问过服务器。

我是这方面的新手,如何开始调查?如何调试?

代码(请注意wifi_event_group,由于导致不同的错误,这些行被注释掉了......):

#include <string.h>

#include "freertos/FreeRTOS.h"
#include "freertos/event_groups.h"
#include "freertos/task.h"

#include "esp_event.h"
#include "esp_event_loop.h"
#include "esp_log.h"
#include "esp_system.h"
#include "esp_wifi.h"
#include "nvs_flash.h"

#include "lwip/err.h"
#include "lwip/sys.h"

#include "../components/mongoose/mongoose.h"

void connect_ws();

#define WIFI_SSID CONFIG_WIFI_SSID
#define WIFI_PASS CONFIG_WIFI_PASSWORD
#define LOG_TAG CONFIG_LOG_TAG

/* FreeRTOS event group to signal when we are connected*/
// static EventGroupHandle_t wifi_event_group;

/* The event group allows multiple bits for each event,
   but we only care about one event - are we connected
   to the AP with an IP? */
const int WIFI_CONNECTED_BIT = BIT0;

static const char *TAG = LOG_TAG;
static int ws_done = 0;
static int ws_connected = 0;
static int wifi_connected = 0;

static esp_err_t event_handler(void *ctx, system_event_t *event) {
  switch (event->event_id) {
    case SYSTEM_EVENT_STA_START:
      esp_wifi_connect();
      break;

    case SYSTEM_EVENT_STA_GOT_IP:
      ESP_LOGI(TAG, "got ip:%s", ip4addr_ntoa(&event->event_info.got_ip.ip_info.ip));
      // xEventGroupSetBits(wifi_event_group, WIFI_CONNECTED_BIT);

      wifi_connected = 1;
      connect_ws();
      break;

    case SYSTEM_EVENT_STA_DISCONNECTED:
      esp_wifi_connect();
      // xEventGroupClearBits(wifi_event_group, WIFI_CONNECTED_BIT);

      wifi_connected = 0;
      break;

    default:
      break;
  }

  return ESP_OK;
}

static void mg_ev_handler(struct mg_connection *nc, int ev, void *ev_data) {
  ESP_LOGD(TAG, "mg_ev_handler");

  struct websocket_message *wm = (struct websocket_message *)ev_data;

  switch (ev) {
    case MG_EV_CONNECT: {
      int status = *((int *)ev_data);
      if (status != 0) {
        ESP_LOGI(TAG, "Connection error");
        printf("-- Connection error: %d\n", status);
      }
      break;
    }

    case MG_EV_WEBSOCKET_HANDSHAKE_DONE: {
      ESP_LOGI(TAG, "Connected");
      printf("-- Connected\n");
      ws_connected = 1;
      break;
    }

    case MG_EV_POLL: {
      char msg[500];
      int n = 0;

      fd_set read_set, write_set, err_set;
      struct timeval timeout = {0, 0};
      FD_ZERO(&read_set);
      FD_ZERO(&write_set);
      FD_ZERO(&err_set);
      FD_SET(0 /* stdin */, &read_set);
      if (select(1, &read_set, &write_set, &err_set, &timeout) == 1) {
        n = read(0, msg, sizeof(msg));
      }
      if (n <= 0)
        break;
      while (msg[n - 1] == '\r' || msg[n - 1] == '\n')
        n--;
      mg_send_websocket_frame(nc, WEBSOCKET_OP_TEXT, msg, n);
      break;
    }

    case MG_EV_WEBSOCKET_FRAME: {
      ESP_LOGI(TAG, "New shit");
      printf("%.*s\n", (int)wm->size, wm->data);
      break;
    }

    case MG_EV_CLOSE: {
      if (ws_connected) {
        ESP_LOGI(TAG, "Disconnected");
        printf("-- Disconnected\n");
      }
      ws_done = 1;
      break;
    }

    default: {
      printf("Unknown ev: %d\n", ev);
    }
  }
}

void connect_ws() {
  ESP_LOGI(TAG, "WS Connecting...");

  struct mg_mgr mgr;
  struct mg_connection *nc;
  const char *chat_server_url = "ws://9808a798.ngrok.io";
  // const char *chat_server_url = "ws://api.screeny.live/";

  mg_mgr_init(&mgr, NULL);
  ESP_LOGD(TAG, "WS mg_mgr_init");

  nc = mg_connect_ws(&mgr, mg_ev_handler, chat_server_url, "ws_chat", NULL);
  ESP_LOGD(TAG, "WS mg_connect_ws");

  if (nc == NULL) {
    ESP_LOGE(TAG, "WS Connection failed.");
    fprintf(stderr, "Invalid address\n");
    // return 1;
  }

  while (!ws_done && wifi_connected) {
    mg_mgr_poll(&mgr, 1000);
    ESP_LOGD(TAG, "WS mg_mgr_poll");
  }
  mg_mgr_free(&mgr);
  ESP_LOGD(TAG, "WS mg_mgr_free");

  // if (wifi_connected) {
  //   connect_ws();
  // }

  // return 0;
}

void app_main(void) {
  nvs_flash_init();
  tcpip_adapter_init();
  ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL));

  /* Initializing WiFi */
  wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  ESP_ERROR_CHECK(esp_wifi_init(&cfg));
  ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM));
  ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
  wifi_config_t sta_config = {
      .sta = {
        .ssid = WIFI_SSID,
        .password = WIFI_PASS,
        .bssid_set = false
      }
  };
  ESP_ERROR_CHECK(esp_wifi_set_config(WIFI_IF_STA, &sta_config));
  ESP_ERROR_CHECK(esp_wifi_start());
  ESP_ERROR_CHECK(esp_wifi_connect());
}
 

来自猫鼬 src:

#define MG_EV_POLL 0    /* Sent to each connection on each mg_mgr_poll() call */
#define MG_EV_ACCEPT 1  /* New connection accepted. union socket_address * */
#define MG_EV_CONNECT 2 /* connect() succeeded or failed. int *  */
#define MG_EV_RECV 3    /* Data has been received. int *num_bytes */
#define MG_EV_SEND 4    /* Data has been written to a socket. int *num_bytes */
#define MG_EV_CLOSE 5   /* Connection is closed. NULL */
#define MG_EV_TIMER 6   /* now >= conn->ev_timer_time. double * */ 

日志(这次我没有得到 -1,不知道为什么......这似乎是一些基于未知的 IO 发生ev):

V (3169) event: exit default callback
D (7819) tcpip_adapter: if0 dhcpc cb
D (7819) tcpip_adapter: if0 ip changed=1
D (7819) event: SYSTEM_EVENT_STA_GOT_IP, ip:192.168.1.237, mask:255.255.255.0, gw:192.168.1.254
V (7819) event: enter default callback
I (7829) event: sta ip: 192.168.1.237, mask: 255.255.255.0, gw: 192.168.1.254
V (7829) event: exit default callback
I (7839) my-thing: got ip:192.168.1.237
I (7839) my-thing: WS Connecting...
D (7849) my-thing: WS mg_mgr_init
D (7849) my-thing: WS mg_connect_ws
D (7859) my-thing: WS mg_mgr_poll
D (8359) my-thing: WS mg_mgr_poll
D (9359) my-thing: mg_ev_handler
D (9359) my-thing: WS mg_mgr_poll
D (10359) my-thing: mg_ev_handler
D (10359) my-thing: WS mg_mgr_poll
D (11359) my-thing: mg_ev_handler
D (11359) my-thing: WS mg_mgr_poll
D (12359) my-thing: mg_ev_handler
D (12359) my-thing: WS mg_mgr_poll
D (13359) my-thing: mg_ev_handler
D (13359) my-thing: WS mg_mgr_poll
D (14359) my-thing: mg_ev_handler
D (14359) my-thing: WS mg_mgr_poll
D (15359) my-thing: mg_ev_handler
D (15359) my-thing: WS mg_mgr_poll
D (16359) my-thing: mg_ev_handler
D (16359) my-thing: WS mg_mgr_poll
D (17359) my-thing: mg_ev_handler
D (17359) my-thing: WS mg_mgr_poll
D (18319) my-thing: mg_ev_handler
D (18319) my-thing: mg_ev_handler
Unknown ev: 4
D (18319) my-thing: mg_ev_handler
D (18319) my-thing: WS mg_mgr_poll
D (19319) my-thing: mg_ev_handler
D (19319) my-thing: WS mg_mgr_poll
D (20319) my-thing: mg_ev_handler
D (20319) my-thing: WS mg_mgr_poll
D (21319) my-thing: mg_ev_handler
D (21319) my-thing: WS mg_mgr_poll
D (21439) my-thing: mg_ev_handler
Unknown ev: 3
D (21439) my-thing: mg_ev_handler
Unknown ev: 102
D (21439) my-thing: mg_ev_handler
D (21439) my-thing: WS mg_mgr_poll 
0个回答
没有发现任何回复~