Websockets por Markus Satler

Buen día estimados,

Actualmente estoy desarrollando un proyecto y es vital detectar la conexión, desconexión y estado actual del cliente conectado al websocket, estoy usando un NodeMCU ESP8266 y la librería es Websockets de Markus Satler

Para detectar la conexión y desconexión, logré hacerlo con la función definida para los eventos

void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) {
  if (type == WStype_TEXT) {
    dataIn = (float) atof((const char *) &payload[0]);
  }
  else if (type == WStype_CONNECTED) {
    //Client connection detected
    Serial.print("Client: ");
    Serial.print(num);
    Serial.println(" Connected");
  }
  else if (type == WStype_DISCONNECTED) {
    //Client disconnection detected
    Serial.print("Client: ");
    Serial.print(num);
    Serial.println(" Disconnected");
   }
}

En esta función el argumento "uint8_t num" me indica el numero de cada cliente particular.

Para la detección del estado actual, presumo que la librería tiene definida la función

bool WebSocketsServer::clientIsConnected(WSclient_t * client) {
    if(!client->tcp) {
        return false;
    }

    if(client->tcp->connected()) {
        if(client->status != WSC_NOT_CONNECTED) {
            return true;
        }
    } else {
        // client lost
        if(client->status != WSC_NOT_CONNECTED) {
            DEBUG_WEBSOCKETS("[WS-Server][%d] client connection lost.\n", client->num);
            // do cleanup
            clientDisconnect(client);
        }
    }

    if(client->tcp) {
        // do cleanup
        DEBUG_WEBSOCKETS("[WS-Server][%d] client list cleanup.\n", client->num);
        clientDisconnect(client);
    }

    return false;
}

Pero no sé como darle el argumento para que me regrese si es verdadero o falso el estado de conexión de un cliente particular.

Con la siguiente función logro determinar la cantidad de clientes conectados, pero lo que requiero es poder determinar que un cliente específico esta conectado en algún momento

int WebSocketsServer::connectedClients(bool ping) {
    WSclient_t * client;
    int count = 0;
    for(uint8_t i = 0; i < WEBSOCKETS_SERVER_CLIENT_MAX; i++) {
        client = &_clients[i];
		Serial.print("DEBUG WS ");
		//Serial.println(String(client));
        if(client->status == WSC_CONNECTED) {
            if(ping != true || sendPing(i)) {
                count++;
            }
        }
    }
    return count;
}

Espero haberme explicado, gracias de antemano

Ok ya resolví la situación

Resulta que la funcion "clientIsConnected(WSclient_t * client)" es de una parte que dice "protected", asumo que no se puede usar en el sketch como las funciones en el apartado "public" de la librería.

Por si a alguien le interesa como, hice un arreglo para establecer un flag de conexión de cada cliente, al tener el flag activo, se hace un ping contra ese cliente, si no responde, se envía la instrucción de desconectar ese cliente particular (la biblioteca también tiene esa funcion).

Saludos,