151 lines
6.0 KiB
C
151 lines
6.0 KiB
C
#include "lwip/sockets.h"
|
|
#include "lwip/netdb.h"
|
|
#include <nopoll.h>
|
|
#include "os/os_api.h"
|
|
|
|
//#define WEBSOCKET_SSL_ENABLE
|
|
//#define DEBUG_ENABLE
|
|
|
|
#if defined(WEBSOCKET_SSL_ENABLE)
|
|
//wss://192.168.10.169:443
|
|
static char *serverHost = "192.168.10.100";
|
|
static char *serverPort = "443";
|
|
#else
|
|
//ws://192.168.10.169:80
|
|
static char *serverHost = "192.168.10.100";
|
|
static char *serverPort = "80";
|
|
#endif // WEBSOCKET_SSL_ENABLE
|
|
|
|
static char *websocket_server_ca =
|
|
"-----BEGIN CERTIFICATE-----\r\n"
|
|
"MIID4DCCA0mgAwIBAgIJAN+fokFBG4UhMA0GCSqGSIb3DQEBBQUAMIGnMQswCQYD\r\n"
|
|
"VQQGEwJFUzEPMA0GA1UECBMGTWFkcmlkMRswGQYDVQQHFBJBbGNhbMOhIGRlIEhl\r\n"
|
|
"bmFyZXMxNzA1BgNVBAoTLkFTUEwgKEFkdmFuY2VkIFNvZnR3YXJlIFByb2R1Y3Rp\r\n"
|
|
"b24gTGluZSwgUy5MLikxEzARBgNVBAsTClRJIFN1cHBvcnQxHDAaBgNVBAMTE3Rl\r\n"
|
|
"c3Qubm9wb2xsLmFzcGwuZXMwHhcNMTMwMzAzMDkxOTU2WhcNMjMwMzAxMDkxOTU2\r\n"
|
|
"WjCBpzELMAkGA1UEBhMCRVMxDzANBgNVBAgTBk1hZHJpZDEbMBkGA1UEBxQSQWxj\r\n"
|
|
"YWzDoSBkZSBIZW5hcmVzMTcwNQYDVQQKEy5BU1BMIChBZHZhbmNlZCBTb2Z0d2Fy\r\n"
|
|
"ZSBQcm9kdWN0aW9uIExpbmUsIFMuTC4pMRMwEQYDVQQLEwpUSSBTdXBwb3J0MRww\r\n"
|
|
"GgYDVQQDExN0ZXN0Lm5vcG9sbC5hc3BsLmVzMIGfMA0GCSqGSIb3DQEBAQUAA4GN\r\n"
|
|
"ADCBiQKBgQC4GcLeRL4busZZ5IqJQunH5wxYgVHEIgt499HBJ78BYv5Wi0lVvD4x\r\n"
|
|
"/fUlvGsvsID0WQGzsgim03KUInDA30vFqBhsz2Eooi0aO0evOrVQmnK1RCL6EQzv\r\n"
|
|
"L+EVYIBWk4FVWlxYxsFMyf7rLSz8wrJThDFcyNeq1lIBFlOzGNnHwQIDAQABo4IB\r\n"
|
|
"EDCCAQwwHQYDVR0OBBYEFE/5BX/ShOWk6EbFgbcf4XQGpSJBMIHcBgNVHSMEgdQw\r\n"
|
|
"gdGAFE/5BX/ShOWk6EbFgbcf4XQGpSJBoYGtpIGqMIGnMQswCQYDVQQGEwJFUzEP\r\n"
|
|
"MA0GA1UECBMGTWFkcmlkMRswGQYDVQQHFBJBbGNhbMOhIGRlIEhlbmFyZXMxNzA1\r\n"
|
|
"BgNVBAoTLkFTUEwgKEFkdmFuY2VkIFNvZnR3YXJlIFByb2R1Y3Rpb24gTGluZSwg\r\n"
|
|
"Uy5MLikxEzARBgNVBAsTClRJIFN1cHBvcnQxHDAaBgNVBAMTE3Rlc3Qubm9wb2xs\r\n"
|
|
"LmFzcGwuZXOCCQDfn6JBQRuFITAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUA\r\n"
|
|
"A4GBAKucVMTXYsW8x06XxTNXFbsLYGMc/UIMx5w4DbYIOXJz3yvIdJ8Alzg2O7DR\r\n"
|
|
"XDzDJUE+WHlq7ZafVIFIWyY+eB5lINAMMTiwrVoqoyTT1X3vNd3W7Y0/v5afXxQ1\r\n"
|
|
"UvTcOPeIkxs3Iee51BkjU98k7FwNBccPuVSyMKhdbIolC7Zb\r\n"
|
|
"-----END CERTIFICATE-----\r\n";
|
|
|
|
static char *websocket_private_key =
|
|
"-----BEGIN RSA PRIVATE KEY-----\r\n"
|
|
"MIICXAIBAAKBgQC4GcLeRL4busZZ5IqJQunH5wxYgVHEIgt499HBJ78BYv5Wi0lV\r\n"
|
|
"vD4x/fUlvGsvsID0WQGzsgim03KUInDA30vFqBhsz2Eooi0aO0evOrVQmnK1RCL6\r\n"
|
|
"EQzvL+EVYIBWk4FVWlxYxsFMyf7rLSz8wrJThDFcyNeq1lIBFlOzGNnHwQIDAQAB\r\n"
|
|
"AoGAIGUIESxvd1mqRW8doYGQuYhCd+BpjuWety6ETkS8K3ZL4tanlNqG5y0U0gsR\r\n"
|
|
"oVahml1/Gyucsh5K7x4QUR/5qQWqN+da9zndO2ssH0Viyu6vxvPeMEbPe74qMsT4\r\n"
|
|
"eO+slkpJVFZzpYP8sPsoBlJ5nZHtpD47UjfZBKXXbEyNY/ECQQDjq1yIMIb/W8YJ\r\n"
|
|
"7rwiEYHUdMD9YeTHjkDZWVfuwwdoM4ut7O0UXuScME/XY3PbAjpDO/utTL/cKhSJ\r\n"
|
|
"pIlXH7fzAkEAzwJ5HJfBaBz0dhYIG4Y7P/AnhRBgCA6m7mrzAci4vqwLw1poD573\r\n"
|
|
"gSNMCxZPk2vm6pO+b3cEeu18KJvvgcGCewJAQcyb8Kx9x73Bbct2yi3fJQUdZd3u\r\n"
|
|
"HhKqAWdF97acJGyJWRoZpwKJ9e4slSakLE7ngdkLMxn0dXAgAWvxWaHMKwJAWMPQ\r\n"
|
|
"twgDsOcplDEiTNskMOiDqbU52Hqf7gACL7OoNGqFqMDtejVKIB/IjcCFYsuT+uZb\r\n"
|
|
"dGRukV+gK7Gh49vcXQJBAJdCc9PAaj1w729vMl+uXZX7luHOa5/rxMcNsjUR25q9\r\n"
|
|
"BnByCR1YUnSr2H6PEfX0qxA8jt38BgZj0zb90Kt2p64=\r\n"
|
|
"-----END RSA PRIVATE KEY-----\r\n";
|
|
|
|
void listener_on_message(noPollCtx *ctx, noPollConn *conn, noPollMsg *msg, noPollPtr user_data)
|
|
{
|
|
if (nopoll_msg_is_fragment(msg)) {
|
|
printf("Found fragment, FIN = %d (%p)?..\n", nopoll_msg_is_final(msg), msg);
|
|
return;
|
|
}
|
|
|
|
printf("the data received : %s\n", (const char *) nopoll_msg_get_payload(msg));
|
|
|
|
/* send reply as received */
|
|
printf("Sending reply... (same message size: %d)\n", nopoll_msg_get_payload_size(msg));
|
|
nopoll_conn_send_text(conn, (const char *) nopoll_msg_get_payload(msg),
|
|
nopoll_msg_get_payload_size(msg));
|
|
}
|
|
|
|
static int nopoll_server_test(void)
|
|
{
|
|
noPollConn *listener = NULL;
|
|
noPollCtx *ctx = NULL;
|
|
|
|
/* create the context */
|
|
ctx = nopoll_ctx_new();
|
|
if (!ctx) {
|
|
printf("ERROR: nopoll_ctx_new fail\n");
|
|
return -1;
|
|
}
|
|
|
|
#if defined(DEBUG_ENABLE)
|
|
nopoll_log_enable(ctx, nopoll_true);
|
|
#endif
|
|
|
|
#if defined(WEBSOCKET_SSL_ENABLE)
|
|
/* now start a TLS version */
|
|
listener = nopoll_listener_tls_new(ctx, serverHost, serverPort);
|
|
#else
|
|
/* call to create a listener */
|
|
listener = nopoll_listener_new(ctx, serverHost, serverPort);
|
|
#endif // WEBSOCKET_SSL_ENABLE
|
|
|
|
if (! nopoll_conn_is_ok(listener)) {
|
|
printf("ERROR: Expected to find proper listener connection status, but found..\n");
|
|
return -1;
|
|
}
|
|
|
|
#if defined(WEBSOCKET_SSL_ENABLE)
|
|
/* configure certificates to be used by this listener */
|
|
if (!nopoll_listener_set_certificate(listener, websocket_server_ca, strlen(websocket_server_ca) + 1, websocket_private_key, strlen(websocket_private_key) + 1, NULL, 0)) {
|
|
printf("ERROR: unable to configure certificates for TLS websocket..\n");
|
|
return -1;
|
|
}
|
|
|
|
/* register certificates at context level */
|
|
if (! nopoll_ctx_set_certificate(nopoll_server_ctx, NULL, websocket_server_ca, strlen(websocket_server_ca) + 1, websocket_private_key, strlen(websocket_private_key) + 1, NULL, 0)) {
|
|
printf("ERROR: unable to setup certificates at context level..\n");
|
|
return -1;
|
|
}
|
|
#endif //WEBSOCKET_SSL_ENABLE
|
|
|
|
// now set a handler that will be called when a message (fragment or not) is received
|
|
nopoll_ctx_set_on_msg(ctx, listener_on_message, NULL);
|
|
|
|
// now call to wait for the loop to notify events
|
|
nopoll_loop_wait(ctx, 0);
|
|
|
|
/* finish */
|
|
printf("Listener: finishing references: %d\n", nopoll_ctx_ref_count(ctx));
|
|
|
|
/* unref connection */
|
|
nopoll_conn_close(listener);
|
|
|
|
nopoll_ctx_unref(ctx);
|
|
|
|
/* call to release all pending memory allocated as a
|
|
* consequence of using nopoll (especially TLS) */
|
|
nopoll_cleanup_library();
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void websocket_test_task(void *priv)
|
|
{
|
|
nopoll_server_test();
|
|
}
|
|
|
|
void nopoll_server_main(void)
|
|
{
|
|
if (thread_fork("websocket_test_task", 10, 4 * 1024, 0, NULL, websocket_test_task, NULL) != OS_NO_ERR) {
|
|
printf("thread fork fail\n");
|
|
}
|
|
}
|