network/websocket_server/main.c

/*******************************************************************************
* # License
* Copyright 2019 Silicon Laboratories Inc. www.silabs.com
*******************************************************************************
*
* The licensor of this software is Silicon Laboratories Inc. Your use of this
* software is governed by the terms of Silicon Labs Master Software License
* Agreement (MSLA) available at
* www.silabs.com/about-us/legal/master-software-license-agreement. This
* software is distributed to you in Source Code format and is governed by the
* sections of the MSLA applicable to Source Code.
*
******************************************************************************/
/* Documentation for this app is available online.
* See https://docs.silabs.com/gecko-os/4/standard/latest/sdk/examples/network/websocket-server
*/
#include "gos.h"
#include "example_app_util.h"
#define APPLICATION_START_LINE "\r\nWebsocket Server example starting ..."
/*************************************************************************************************/
void gos_app_init(void)
{
gos_result_t result;
GOS_LOG(APPLICATION_START_LINE);
if (gos_load_app_settings("settings.ini") != GOS_SUCCESS)
{
GOS_LOG("Failed to load settings");
return;
}
gos_websocket_register_server_event_handlers(websocket_connect_handler, websocket_disconnect_handler, websocket_receive_handler);
if (GOS_FAILED(result, example_app_util_network_up(GOS_INTERFACE_ANY, true, network_event_handler)))
{
}
}
/*************************************************************************************************/
static void network_event_handler(bool is_up)
{
if (is_up == true)
{
GOS_LOG("Network up");
GOS_LOG("HTTP Server running");
GOS_LOG("Using a web browser, go to: http://%s", example_app_util_get_network_interface_ip_address_str());
}
else
{
GOS_LOG("Network down");
}
}
/*************************************************************************************************/
static void websocket_connect_handler(gos_handle_t handle)
{
char buffer[32];
uint16_t local_port, remote_port;
if (gos_websocket_get_client_info(handle, buffer, sizeof(buffer), &local_port, &remote_port) == GOS_SUCCESS)
{
GOS_LOG("Websocket connected: %s:%u", buffer, remote_port);
}
}
/*************************************************************************************************/
static void websocket_disconnect_handler(gos_handle_t handle)
{
GOS_LOG("Websocket disconnected: %u", handle);
}
/*************************************************************************************************/
static void websocket_receive_handler(gos_handle_t handle)
{
gos_result_t result;
gos_buffer_t buffer = { .size = UINT32_MAX };
if (GOS_FAILED(result, gos_websocket_read_with_buffer(handle, &buffer)))
{
GOS_LOG("Failed to read websocket, err:%d", result);
}
else
{
gos_write_log((char*)buffer.data, buffer.size);
if (GOS_FAILED(result, gos_websocket_write(handle, buffer.data, buffer.size, false)))
{
GOS_LOG("Failed to write to websocket, err:%d", result);
}
}
}