socket client and server in one application?

C

chris

I have a python script that uses a serial port to read data from an xbee radio and it delivers the data to a socket server.

Now I need to retrieve the data from a socket client so I can send data out on the common serial port.

I think I need a combination of threads, queues, socket client and sever.

Anyone have ideas about how I might frame this out?

Thanks in advance,
Chris.
 
M

Marko Rauhamaa

(e-mail address removed):
I think I need a combination of threads, queues, socket client and
se[r]ver.

Yes, although I'd stay away from threads if I could.
Anyone have ideas about how I might frame this out?

Take a look at asyncio. It might have everything you could wish for.


Marko
 
C

CHIN Dihedral

I have a python script that uses a serial port to read data from an xbee radio and it delivers the data to a socket server.



Now I need to retrieve the data from a socket client so I can send data out on the common serial port.



I think I need a combination of threads, queues, socket client and sever.



Anyone have ideas about how I might frame this out?



Thanks in advance,

Chris.
I did this kind of projects in 1999-2002 for taxie call out services in object pascal from Borland in paid jobs.

In python, check the urlib.
 
G

Grant Edwards

I have a python script that uses a serial port to read data from an
xbee radio and it delivers the data to a socket server. Now I need to
retrieve the data from a socket client so I can send data out on the
common serial port.

I think I need a combination of threads, queues, socket client and
sever.

You could use either threads or select/poll. They would all work
fine.
 
C

chris

Thanks to Marko, Chin, Grant.

There's a lot to study, asincio, urllib, threads, select/poll.

I'm using a dispatch method to receive and occasionally send data through aserial port on a Raspberry Pi. I think the dispatch method is essentiallya 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.

Thanks so much,
Chris.
 
C

Chris Angelico

I'm using a dispatch method to receive and occasionally send data througha 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 receivesome 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
 
C

chris

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 thedata, 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 raspiis 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 tosmooth out the various signals I'm tracking.

Again, thank you all for your help,
Chris.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,962
Messages
2,570,134
Members
46,690
Latest member
MacGyver

Latest Threads

Top