| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- // The MIT License (MIT)
- // Copyright (c) 2018 liu2guang <liuguang@rt-thread.com>
- // Permission is hereby granted, free of charge, to any person obtaining a copy
- // of this software and associated documentation files (the "Software"), to deal
- // in the Software without restriction, including without limitation the rights
- // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- // copies of the Software, and to permit persons to whom the Software is
- // furnished to do so, subject to the following conditions:
- // The above copyright notice and this permission notice shall be included in all
- // copies or substantial portions of the Software.
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
- // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
- // OR OTHER DEALINGS IN THE SOFTWARE.
- #include <rtthread.h>
- #include <librws.h>
- #include <string.h>
- #include <stdlib.h>
- #if (RTTHREAD_VERSION < 30100)
- #define DBG_SECTION_NAME "[LIBRWS.Test] "
- #else
- #define DBG_SECTION_NAME "LIBRWS.Test"
- #endif
- #define DBG_ENABLE
- #define DBG_LEVEL DBG_LOG
- #define DBG_COLOR
- #include <rtdbg.h>
- struct librws_app
- {
- rt_bool_t init;
- rws_socket *socket;
- };
- typedef struct librws_app *librws_app_t;
- static librws_app_t app;
- static void onopen(rws_socket socket)
- {
- LOG_D("websocket connected. ");
- }
- static void onclose(rws_socket socket)
- {
- rws_error error = rws_socket_get_error(socket);
- if (error)
- {
- LOG_E("websocket disconnect, error: %i, %s ", rws_error_get_code(error), rws_error_get_description(error));
- }
- else
- {
- LOG_D("websocket disconnect! ");
- }
- rws_socket_disconnect_and_release(app->socket);
- app->init = RT_FALSE;
- }
- static void onmessage_text(rws_socket socket, const char *text, const unsigned int len)
- {
- char *buff = RT_NULL;
- buff = (char *)rt_malloc(2048);
- rt_memset(buff, 0x00, 2048);
- rt_memcpy(buff, text, len);
- LOG_D("message(txt), %d(byte): %s ", len, buff);
- if (buff != RT_NULL)
- {
- rt_free(buff);
- }
- }
- static void onmessage_bin(rws_socket socket, const void *data, const unsigned int len)
- {
- char *buff = RT_NULL;
- buff = (char *)rt_malloc(2048);
- rt_memset(buff, 0x00, 2048);
- rt_memcpy(buff, data, len);
- LOG_D("message(bin), %d(byte): %s ", len, buff);
- if (buff != RT_NULL)
- {
- rt_free(buff);
- }
- }
- // rws_connect ws echo.websocket.org 80
- // rws_connect wss echo.websocket.org 443
- // rws_send "hello tls!"
- static int _rws_connect(int argc, char *argv[])
- {
- int port = -1;
- rws_bool ret = rws_false;
- if (argc < 3)
- {
- LOG_E("the msh cmd format: rws_conn ws/wss host [port]. ");
- return RT_EOK;
- }
- if (app->init == RT_TRUE)
- {
- LOG_E("the websocket connection has been opened. ");
- return (-RT_EBUSY);
- }
- app = (librws_app_t)rt_malloc_align(sizeof(struct librws_app), 4);
- if (app == RT_NULL)
- {
- LOG_E("librws_conn cmd memory malloc failed. ");
- return (-RT_ENOMEM);
- }
- rt_memset(app, 0x00, sizeof(struct librws_app));
- app->socket = rws_socket_create();
- if (app->socket == RT_NULL)
- {
- LOG_E("librws socket create failed. ");
- return (-RT_ERROR);
- }
- if (strcmp(argv[1], "ws") == 0)
- {
- port = ((argv[3] == RT_NULL) ? (80) : (atoi(argv[3])));
- rws_socket_set_url(app->socket, "ws", argv[2], port, "/");
- }
- else if (strcmp(argv[1], "wss") == 0)
- {
- port = ((argv[3] == RT_NULL) ? (443) : (atoi(argv[3])));
- rws_socket_set_url(app->socket, "wss", argv[2], port, "/");
- }
- else
- {
- LOG_E("protocol types are not supported, only support ws/wss. ");
- return (-RT_EINVAL);
- }
- rws_socket_set_on_connected(app->socket, &onopen);
- rws_socket_set_on_disconnected(app->socket, &onclose);
- rws_socket_set_on_received_text(app->socket, &onmessage_text);
- rws_socket_set_on_received_bin(app->socket, &onmessage_bin);
- /* set custom mode */
- rws_socket_set_custom_mode(app->socket);
- ret = rws_socket_connect(app->socket);
- if (ret == rws_false)
- {
- if (strcmp(argv[1], "ws") == 0)
- {
- LOG_E("connect %s://%s:%d/ failed. ", argv[1], argv[2], port);
- }
- else if (strcmp(argv[1], "wss") == 0)
- {
- LOG_E("connect %s://%s:%d/ failed. ", argv[1], argv[2], port);
- }
- }
- else
- {
- if (strcmp(argv[1], "ws") == 0)
- {
- LOG_D("try connect %s://%s:%d/ ", argv[1], argv[2], port);
- }
- else if (strcmp(argv[1], "wss") == 0)
- {
- LOG_D("try connect %s://%s:%d/ ", argv[1], argv[2], port);
- }
- }
- app->init = RT_TRUE;
- return RT_EOK;
- }
- MSH_CMD_EXPORT_ALIAS(_rws_connect, rws_connect, websocket connect);
- static int _rws_disconnect(int argc, char *argv[])
- {
- if (app->init == RT_FALSE)
- {
- LOG_W("no websocket connection. ");
- return (-RT_ERROR);
- }
- rws_socket_disconnect_and_release(app->socket);
- LOG_I("try disconnect websocket connection. ");
- return RT_EOK;
- }
- MSH_CMD_EXPORT_ALIAS(_rws_disconnect, rws_disconnect, websocket disconnect);
- static int _rws_send(int argc, char *argv[])
- {
- if (argc == 1)
- {
- LOG_E("The command format: rws_send \"content\". ");
- return RT_EOK;
- }
- if (app->init == RT_FALSE)
- {
- LOG_W("no websocket connection. ");
- return (-RT_ERROR);
- }
- LOG_W("string = %s, len = %d", argv[1], rt_strlen(argv[1]));
- rws_socket_send_text(app->socket, argv[1]);
- return RT_EOK;
- }
- MSH_CMD_EXPORT_ALIAS(_rws_send, rws_send, websocket send text);
|