libwebsockets/minimal-examples/embedded/pico/pico-sspc-binance/main.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;
}