python-wifi-leds icon indicating copy to clipboard operation
python-wifi-leds copied to clipboard

Using TCP as optionnal feature

Open Seraf opened this issue 11 years ago • 7 comments

Hello,

My controller (firmware 3.00.08) seems to offers the possibility to use TCP instead of UDP. I tested your library yesterday and had sometimes packet transmitted but not received by the controller. Should be great to use TCP to avoid this kind of things, even if you transmit few times the udp packet to avoid this behavior.

What do you think about this ? Anyway, I wanted to thanks you a lot, you saved me a LOT of time by sharing this library. I will use it in my project ! Thanks !

Seraf avatar Aug 24 '13 06:08 Seraf

Awesome feedback and glad you're enjoying the project!

Sure thing. I've added some code and hopefully this should work for your device: eb3f879cb215aceca79eec7bf553702714c0f950 5a5017e5f18c18da80e32e82a8d9ad2ff0093464

So, instead of using:

led_connection = wifileds.limitlessled.connect(address, port)

please use:

led_connection = wifileds.limitlessled.connect(address, port, 'tcp')

Let me know what the result is!

I'm also not sure if the tcp sends will send all responses 3 times or a single time (due to a loop to mimic keypresses). Let me know if you try sending a single brightness_down() command and you see the brightness decrease 3 times. Thanks!

joaquincasares avatar Aug 27 '13 01:08 joaquincasares

Hello,

Thanks for your answer. I'm sorry I didn't had the time to test it, but anyway, thanks for your reactivity. I will try to give a test during next week and keep you informed.

Thanks !

Seraf avatar Sep 01 '13 12:09 Seraf

Hello, I have not been able to connect on the controller in TCP mode. It says : "Connection refused".

I had to fix the init.py :

def connect(address='192.168.1.100', port=50000, protocol='udp'):
    return bridge.Bridge(address=address, port=port, protocol=protocol)

Without setting which parameter you pass, the short_pause_duration had the value of the "tcp" protocol.

I haven't done a pull request as I can't connect to the controller... If you find a solution it should be nice :)

Thanks for the quick change of your code :)

Seraf avatar Sep 10 '13 19:09 Seraf

Heh, thanks for catching that. It's been fixed with 8690a9e58a97e0af5cd69e3484c807ab64aaf661.

Could you send me the complete stacktrace? Just to make sure the issue is not on my end?

Can you try creating a sample script to connect to your bridge via TCP? If it connects, can you send that my way as well? Perhaps I need to connect in another way.

Thanks!

joaquincasares avatar Sep 10 '13 21:09 joaquincasares

Here's the traceback :

Traceback (most recent call last):
      File "/usr/local/lib/python2.7/dist-packages/twisted/python/log.py", line 88, in callWithLogger
        return callWithContext({"system": lp}, func, *args, **kw)
      File "/usr/local/lib/python2.7/dist-packages/twisted/python/log.py", line 73, in callWithContext
        return context.call({ILogContext: newCtx}, func, *args, **kw)
      File "/usr/local/lib/python2.7/dist-packages/twisted/python/context.py", line 118, in callWithContext
        return self.currentContext().callWithContext(ctx, func, *args, **kw)
      File "/usr/local/lib/python2.7/dist-packages/twisted/python/context.py", line 81, in callWithContext
        return func(*args,**kw)
    --- <exception caught here> ---
      File "/usr/local/lib/python2.7/dist-packages/twisted/internet/posixbase.py", line 614, in _doReadOrWrite
        why = selectable.doRead()
      File "/usr/local/lib/python2.7/dist-packages/twisted/internet/tcp.py", line 215, in doRead
        return self._dataReceived(data)
      File "/usr/local/lib/python2.7/dist-packages/twisted/internet/tcp.py", line 221, in _dataReceived
        rval = self.protocol.dataReceived(data)
      File "/home/julien/Sandbox/LISA/LISA-Engine/libs/Server.py", line 77, in dataReceived
        libs.RulesEngine(configuration).Rules(jsonData=jsonData, lisaprotocol=self)
      File "/home/julien/Sandbox/LISA/LISA-Engine/libs/RulesEngine.py", line 50, in Rules
        plugininstance = namedAny('.'.join((str(oPlugin["name"]),'modules',str(oPlugin["name"]).lower(),str(oPlugin["name"]))))()
      File "/home/julien/Sandbox/LISA/LISA-Engine/Plugins/Wifiledlamps/modules/wifiledlamps.py", line 21, in __init__
        protocol='tcp')
      File "/usr/local/lib/python2.7/dist-packages/wifileds/limitlessled/__init__.py", line 5, in connect
        return bridge.Bridge(address=address, port=port, protocol=protocol)
      File "/usr/local/lib/python2.7/dist-packages/wifileds/limitlessled/bridge.py", line 65, in __init__
        self.create_connection()
      File "/usr/local/lib/python2.7/dist-packages/wifileds/limitlessled/bridge.py", line 50, in create_connection
        self.sock.connect((self.address, self.port))
      File "/usr/lib/python2.7/socket.py", line 224, in meth
        return getattr(self._sock,name)(*args)
    socket.error: [Errno 111] Connection refused

2013-09-10 21:30:48+0200 [Lisa,3,127.0.0.1] Lost connection.  Reason: [Failure instance: Traceback (failure with no frames): <class 'socket.error'>: [Errno 111] Connection refused

Seraf avatar Sep 11 '13 05:09 Seraf

I'm thinking TCP may have a different port than the UDP port?

Here's the code that I based my assumptions off of: https://wiki.python.org/moin/TcpCommunication

If you wouldn't mind trying to figure out the TCP port or perhaps playing with socket a bit more to get a connection established, that would be great: http://docs.python.org/2/library/socket.html

Once we have the connection portion then the rest of the code should be reusable, save for a fix or two that I'm foreseeing for better performance.

Thanks again!

joaquincasares avatar Sep 12 '13 19:09 joaquincasares

It's strange because a nmap reveal the 50000 port listen in tcp mode. So it seems OK on the controller side. I will try to dig deeper with the python code.

Seraf avatar Sep 14 '13 16:09 Seraf