mirror of
https://libwebsockets.org/repo/libwebsockets
synced 2025-03-14 17:02:46 +00:00
119 lines
2.7 KiB
C
119 lines
2.7 KiB
C
/*
|
|
* pico-sspc-binance
|
|
*
|
|
* Written in 2010-2021 by Andy Green <andy@warmcat.com>
|
|
*
|
|
* This file is made available under the Creative Commons CC0 1.0
|
|
* Universal Public Domain Dedication.
|
|
*
|
|
*
|
|
* This example builds for an rpi pico, and demonstrates using Secure Streams
|
|
* over a UART transport, via lws_transport_mux, to an SS proxy.
|
|
*
|
|
* It allows the pico to perform cloud operations despite it has no network
|
|
* capability or IP stack or tls.
|
|
*
|
|
* In one stream it connects over wss to binance server.
|
|
*
|
|
* In a second stream, it GETs https://libwebsockets.org/index.html every 5s.
|
|
*/
|
|
|
|
#include "private.h"
|
|
|
|
lws_dll2_owner_t scheduler;
|
|
lws_transport_mux_t *tm;
|
|
|
|
/*
|
|
* In LWS_ONLY_SSPC build mode, lws just has a very simplified "lws_context"
|
|
* that does not reed creating / destroying.
|
|
*/
|
|
|
|
static struct lws_context_standalone cx = {
|
|
.txp_cpath.ops_onw = &lws_transport_mux_client_ops,
|
|
};
|
|
|
|
/*
|
|
* Describes how the lws_transport path goes through the transport_mux
|
|
*/
|
|
|
|
lws_transport_info_t info_serial = {
|
|
.ping_interval_us = LWS_US_PER_SEC * 10,
|
|
.pong_grace_us = LWS_US_PER_SEC * 2,
|
|
.flags = 0,
|
|
}, info_mux = {
|
|
.ping_interval_us = LWS_US_PER_SEC * 10,
|
|
.pong_grace_us = LWS_US_PER_SEC * 2,
|
|
.txp_cpath = {
|
|
.ops_onw = &lws_sss_ops_client_serial,
|
|
/**< onward transport for mux is serial */
|
|
.ops_in = &lws_transport_mux_client_ops,
|
|
},
|
|
.onward_txp_info = &info_serial,
|
|
.flags = 0,
|
|
};
|
|
|
|
int
|
|
main(void)
|
|
{
|
|
/*
|
|
* Set up pico for ttyACM USB cnsole and UART0 at 2Mbps
|
|
*/
|
|
|
|
stdio_init_all();
|
|
lwsl_user("\npico-sspc-binance demo\n");
|
|
|
|
pico_example_open_serial_port(uart0);
|
|
|
|
/* create the mux object itself... only one of these */
|
|
|
|
tm = lws_transport_mux_create(&cx, &info_mux, NULL);
|
|
if (!tm) {
|
|
lwsl_err("%s: unable to create client mux\n", __func__);
|
|
return 1;
|
|
}
|
|
tm->info.txp_cpath.priv_in = tm;
|
|
cx.txp_cpath.mux = tm;
|
|
|
|
/*
|
|
* Now that's done, create the SS and it will try to connect over the
|
|
* mux -> transport -> proxy -> binance wss
|
|
*/
|
|
|
|
if (lws_ss_create(&cx, 0, &ssi_binance_t, NULL, NULL, NULL, NULL)) {
|
|
printf("failed to create binance secure stream\n");
|
|
return 1;
|
|
}
|
|
|
|
if (lws_ss_create(&cx, 0, &ssi_get_t, NULL, NULL, NULL, NULL)) {
|
|
printf("failed to create get secure stream\n");
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
* this represents our application event loop.
|
|
* Your event loop is hopefully better than this
|
|
* one, but either way this shows how to handle
|
|
* everything needed for LWS_ONLY_SSPC
|
|
*/
|
|
|
|
while (true) {
|
|
|
|
serial_handle_events(tm);
|
|
|
|
/* check the scheduler */
|
|
|
|
while (scheduler.head) {
|
|
lws_sorted_usec_list_t *sul = lws_container_of(
|
|
scheduler.head, lws_sorted_usec_list_t, list);
|
|
|
|
if (sul->us > lws_now_usecs())
|
|
break;
|
|
lws_dll2_remove(&sul->list);
|
|
|
|
sul->cb(sul);
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|