socket client and server in one application?

Discussion in 'Python' started by chris, May 5, 2014.

  1. chris

    chris Guest

    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.
     
    chris, May 5, 2014
    #1
    1. Advertisements

  2. :
    Yes, although I'd stay away from threads if I could.
    Take a look at asyncio. It might have everything you could wish for.


    Marko
     
    Marko Rauhamaa, May 5, 2014
    #2
    1. Advertisements

  3. 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.
     
    CHIN Dihedral, May 5, 2014
    #3
  4. You could use either threads or select/poll. They would all work
    fine.
     
    Grant Edwards, May 5, 2014
    #4
  5. chris

    chris Guest

    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.
     
    chris, May 5, 2014
    #5
  6. 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
     
    Chris Angelico, May 6, 2014
    #6
  7. chris

    chris Guest

    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.
     
    chris, May 16, 2014
    #7
    1. Advertisements

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 (here). After that, you can post your question and our members will help you out.
Similar Threads
There are no similar threads yet.
Loading...