rfspace: Send periodic keep-alive packets.

This patch enables sending keep-alive packets at 1 minute interval to
RFSpace networked radios. Without this the TCP connection to the radio
is closed after about 5 minutes (by the OS?).
soapy_support
Alexandru Csete 6 years ago committed by Dimitri Stolnikov
parent 0dc8154f08
commit 6ea6c19028
  1. 34
      lib/rfspace/rfspace_source_c.cc
  2. 3
      lib/rfspace/rfspace_source_c.h

@ -475,6 +475,16 @@ rfspace_source_c::rfspace_source_c (const std::string &args)
set_sample_rate( 240000 );
set_bandwidth( 0 );
}
/* start TCP keepalive thread */
if ( RFSPACE_NETSDR == _radio ||
RFSPACE_SDR_IP == _radio ||
RFSPACE_CLOUDIQ == _radio )
{
_run_tcp_keepalive_task = true;
_thread = gr::thread::thread( boost::bind(&rfspace_source_c::tcp_keepalive_task, this) );
}
#if 0
std::cerr << "sample_rates: " << get_sample_rates().to_pp_string() << std::endl;
std::cerr << "sample rate: " << (uint32_t)get_sample_rate() << std::endl;
@ -505,6 +515,12 @@ rfspace_source_c::~rfspace_source_c ()
_thread.join();
}
else
{
_run_tcp_keepalive_task = false;
_thread.interrupt();
_thread.join();
}
close(_usb);
@ -580,6 +596,8 @@ bool rfspace_source_c::transaction( const unsigned char *cmd, size_t size,
}
else
{
boost::mutex::scoped_lock lock(_tcp_lock);
#ifdef USE_ASIO
_t.write_some( boost::asio::buffer(cmd, size) );
@ -730,6 +748,22 @@ void rfspace_source_c::usb_read_task()
}
}
/* send periodic status requests to keep TCP connection alive */
void rfspace_source_c::tcp_keepalive_task()
{
std::vector< unsigned char > response;
unsigned char status_pkt[] = { 0x04, 0x20, 0x05, 0x00 };
if ( -1 == _tcp )
return;
while ( _run_tcp_keepalive_task )
{
boost::this_thread::sleep_for(boost::chrono::seconds(60));
transaction( status_pkt, sizeof(status_pkt), response );
}
}
bool rfspace_source_c::start()
{
_sequence = 0;

@ -129,6 +129,7 @@ private: /* functions */
std::vector< unsigned char > &response );
void usb_read_task();
void tcp_keepalive_task();
private: /* members */
enum radio_type
@ -162,6 +163,8 @@ private: /* members */
gr::thread::thread _thread;
bool _run_usb_read_task;
bool _run_tcp_keepalive_task;
boost::mutex _tcp_lock;
boost::circular_buffer<gr_complex> *_fifo;
boost::mutex _fifo_lock;

Loading…
Cancel
Save