socket client and server in one application?

chris at freeranger.com chris at freeranger.com
Fri May 16 00:59:09 EDT 2014


Thank you all.

The 2 threaded in/out sockets are working great.  I'm receiving input on the xbee/serial port  in the dispatch thread.  For each receipt I send the xbee data through a socket connected to node-red.  Node-red is collecting the data, parsing it and sending it along to other end points; mainly to carbon/graphite for charting.

Then I've got some injection nodes in node-red that can send signals back to the python script.  The python script has a socket server in the main loop that waits for a specialized command which, when received, sends a command back out the serial/xbee port to instruct a device to turn on/off.

Generally it works great but I'm tuning it to optimize the amount of data I'm managing.  The xbees are set to send 4 data points every .5 seconds.  I only have 5 xbee radios in my setup but I think that means the little raspi is collecting up to 40 data points every second.

On the node-red, it breaks each data set into 4 discreet entries and sends those to the carbon/graphite charting app.

I'm thinking of including some signal averaging into the python receiver to smooth out the various signals I'm tracking.

Again, thank you all for your help,
Chris.



On Monday, May 5, 2014 4:05:22 PM UTC-7, Chris Angelico wrote:
> On Tue, May 6, 2014 at 8:37 AM,  <chris at freeranger.com> wrote:
> 
> > I'm using a dispatch method to receive and occasionally send data through a serial port on a Raspberry Pi.  I think the dispatch method is essentially a threaded approach, right?
> 
> >
> 
> > Now to receive serial data and send via socket, then occasionally receive some socket based input and send out on the same serial port.  It's combining the client and server socket code into a single app (so I can have a single connection to the serial port) that has me confused.  I don't see any discussion of that anywhere.
> 
> >
> 
> 
> 
> Threads would be easy. As I understand it, you have two bidirectional
> 
> connections, and you're simply linking them? Sounds like a very simple
> 
> proxy/tunnel. You don't need to multiplex, so all you need is two
> 
> threads: one reading from the socket and writing to the serial port,
> 
> and one reading from the serial port and writing to the socket. The
> 
> code would look something like this:
> 
> 
> 
> serial_port = open(...)
> 
> tcp_socket = socket.create_connection(...)
> 
> # initialize them both, do whatever setup is needed
> 
> 
> 
> def socket_to_serial():
> 
>     while True:
> 
>         data = tcp_socket.recv(4096)
> 
>         serial_port.write(data)
> 
> 
> 
> Thread.Thread(target=socket_to_serial).start()
> 
> 
> 
> while True:
> 
>     data = serial_port.read(4096)
> 
>     tcp_socket.send(data)
> 
> 
> 
> 
> 
> Two simple loops, running concurrently. Pretty straight-forward as
> 
> threads. Both of them will fall idle in their read/recv calls, so
> 
> threading works very nicely here.
> 
> 
> 
> ChrisA




More information about the Python-list mailing list