basic/tcp_client/tcp_client.c

See examples/basic/tcp-client

/*
* ZentriOS SDK LICENSE AGREEMENT | Zentri.com, 2015.
*
* Use of source code and/or libraries contained in the ZentriOS SDK is
* subject to the Zentri Operating System SDK license agreement and
* applicable open source license agreements.
*
*/
/* Documentation for this app is available online.
* See https://docs.zentri.com/wifi/sdk/latest/examples/basic/tcp-client
*/
#include "zos.h"
#define TCP_HOST "test.zentri.com"
#define TCP_PORT 50007
#define ATTEMPT_CONNECT_PERIOD 1000 // ms
#define TRANSMIT_PERIOD 200 // ms
/*************************************************************************************************/
void zn_app_init(void)
{
zos_result_t result;
if(zn_load_app_settings("settings.ini") != ZOS_SUCCESS)
{
ZOS_LOG("Failed to load settings");
return;
}
zn_gpio_deinit(PLATFORM_STD_ADC);
zn_adc_init(PLATFORM_STD_ADC);
zn_network_register_event_handler(ZOS_WLAN, wlan_network_event_handler);
zn_event_issue(tcp_attempt_connect_handler, NULL, 0);
{
ZOS_LOG("Network is down - Restarting Network...\r\n");
{
ZOS_LOG("Failed to restart network: %d\r\n\r\n", result);
ZOS_LOG("----------------------------------------------------------------------");
ZOS_LOG("This basic app expects valid network credentials have been configured.");
ZOS_LOG("Join a network and save credentials to non-volatile memory using the ");
ZOS_LOG("ZentriOS commands shown below ");
ZOS_LOG(" ");
ZOS_LOG("> network_up -s ");
ZOS_LOG("----------------------------------------------------------------------");
ZOS_LOG("\r\n ");
}
}
}
/*************************************************************************************************/
void zn_app_deinit(void)
{
}
/*************************************************************************************************/
zos_bool_t zn_app_idle(void)
{
// Return TRUE so the event loop keeps idling
// It will wake up when the network is brought up
return ZOS_TRUE;
}
/*************************************************************************************************/
static void wlan_network_event_handler(uint32_t is_up)
{
if(!is_up)
{
ZOS_LOG("Network down");
}
else
{
ZOS_LOG("Network up");
zn_event_issue(tcp_attempt_connect_handler, NULL, 0);
}
}
/*************************************************************************************************/
static void tcp_attempt_connect_handler(void *arg)
{
zos_result_t result;
uint32_t socket_handle;
{
wlan_network_event_handler(ZOS_FALSE);
return;
}
ZOS_LOG("Attempting to connect to %s:%u", TCP_HOST, TCP_PORT);
if(ZOS_FAILED(result, zn_tcp_connect(ZOS_WLAN, TCP_HOST, TCP_PORT, &socket_handle)))
{
ZOS_LOG("Failed to connect. Trying again in %d seconds", ATTEMPT_CONNECT_PERIOD/1000);
zn_event_register_timed(tcp_attempt_connect_handler, NULL, ATTEMPT_CONNECT_PERIOD, 0);
return;
}
ZOS_LOG("Connected. Socket handle: %d", socket_handle);
zn_tcp_register_client_event_handlers(socket_handle, tcp_disconnect_handler, tcp_receive_handler);
zn_event_register_periodic(tcp_transmit_handler, (void*)socket_handle, TRANSMIT_PERIOD, EVENT_FLAGS1(RUN_NOW));
}
/*************************************************************************************************/
static void tcp_disconnect_handler(uint32_t handle)
{
ZOS_LOG("Server disconnected, attempting to read any remaining data");
zn_event_unregister(tcp_transmit_handler, NULL);
tcp_receive_handler(handle);
ZOS_LOG("Closing tcp handle: %d", handle);
ZOS_LOG("Restarting connection timer");
zn_event_issue(tcp_attempt_connect_handler, NULL, 0);
}
/*************************************************************************************************/
static void tcp_receive_handler(uint32_t handle)
{
zos_result_t result;
uint32_t bytes_read;
uint8_t buffer[128];
uint32_t bytes_available;
if(ZOS_FAILED(result, zn_tcp_poll(handle, &bytes_available)))
{
ZOS_LOG("Failed to poll TCP socket: %d", result);
return;
}
while(bytes_available > 0)
{
if(ZOS_FAILED(result, zn_tcp_read(handle, buffer, MIN(bytes_available, sizeof(buffer)-1), &bytes_read)))
{
ZOS_LOG("Failed to read data: %d", result);
return;
}
else if(bytes_read == 0)
{
break;
}
else
{
buffer[bytes_read] = 0;
ZOS_LOG("Rx data: %s", buffer);
bytes_available -= bytes_read;
}
}
}
/*************************************************************************************************/
static void tcp_transmit_handler(void *arg)
{
uint32_t handle = (uint32_t)arg;
zos_result_t result;
char buffer[128];
uint32_t gpio_values;
uint16_t adc_value;
gpio_values = zn_gpio_mask_get(0xFFFF);
zn_adc_sample(PLATFORM_STD_ADC, &adc_value, ADC_SAMPLE_VOLTAGE);
const int len = sprintf(buffer, "gpios:%04X, adc: %umV", (unsigned int)gpio_values, (unsigned short)adc_value);
if(ZOS_FAILED(result, zn_tcp_write(handle, buffer, len, ZOS_FALSE)))
{
ZOS_LOG("Failed to transmit data: %d", result);
}
}