python – 在ZeroMQ / Tornado ioloop中使用BluetoothSocket,或者在Twisted中使用?

我正在使用PyBluez通过蓝牙连接到设备.它工作得很好.设备正在使用SPP,我使用BluetoothSocket(RFCOMM)进行连接.

基本交互是:发送init命令 – >收到确认;发送开始命令 – >接收连续数据;发送停止命令 – > …

我需要能够从另一个应用程序控制应用程序:启动,停止……我在想ZeroMQ或者可能是Tornado和HTTP / REST ifc.

我不是非常热衷于使这个多线程应用程序,因为我认为它有点过度杀死.我已经在C#/ .NET中使用了很多线程和池,但是我预感到这里并不是必需的.相反,我认为这将是非常混乱的.

但是,我需要能够通过ZeroMQ / REST / …处理命令(例如“开始”,“停止”),同时继续接收数据并发送偶尔的数据包.

由于我是Python的新手,我不知道如何实现它.我有一些想法:BluetoothSocket可以连接到ZeroMQ / Tornado IOLoop吗?

我假设我几乎可以使用Twisted完成任何事情,但我并不真正需要Twisted提供的所有功能.如果我需要拉入Twisted,我会这样做.我实际上发现了一个Twisted implementation的BluetoothSocket.但同样,我需要Twisted吗?

我尝试过使用Tornado IOLoop.没有异常被抛出,但另一方面没有收到或发送数据:

def eventhandler(s, events, error = None):
    if events & ioloop.IOLoop.READ:
        print 'Socket read: %r' % s.recv(1024)
    elif events & ioloop.IOLoop.ERROR:
        print 'Socket error!'

events = ioloop.IOLoop.READ | ioloop.IOLoop.ERROR
self._loop.add_handler(self._socket.fileno(), eventhandler, events)

我现在真的不知道自己在做什么.我最终会找到一种方法,但需要暗示要走哪条路.

广泛的Google-fu没有提供太多有用的信息,所以我现在在这里问.

编辑:我目前正在看“gevent”.似乎比扭曲更简单.

解决方法:

你应该只使用Twisted.你真正的问题似乎是关于Twisted的规模和资源利用率;无论是在API复杂性,内存,磁盘上的包大小,部署麻烦,还是与您可能想要使用的其他库冲突,您是否会在应用程序中支付不合理的成本.

你不会.

> API复杂性:Twisted的API非常简单.与某些FUD相反,您无需学习数以千计的API来有效地使用它:Twisted的核心具有非常精简的API,它具有多个离散层,并且每个层之间有许多明确记录的正式接口.如果你知道你想知道什么(看起来像你这么做),只需一点指导就可以轻松拿起它.此外,作为一个成熟的项目,社区中有很多人可以帮助您的用户加快速度.
>内存使用:Twisted一直非常小心地管理其运行时依赖项,并且只导入它需要的内容.加载反应堆将不会加载IMAP实现,因此只需导入您需要的内容,不要担心它.
>包大小:Twisted is two megabytes.此外,如果你使用任何流行的UNIX-y操作系统(Linux,OS X,FreeBSD),你可能已经有了Twisted的操作系统包.在许多发行版上,它甚至已经安装好了.
>部署麻烦:如果您要担心任何问题,可以考虑这个问题,但与部署相关的问题实际上非常小. “pip install Twisted”工作正常(现在,as long as you have a C compiler). Twisted works with py2exe,py2app和Debian包装to the extent that anything in Python does.真的,任何人都有任何问题是插件系统,对于许多应用程序,你可以忽略它.
>图书馆冲突:你会完全没事. Twisted不遗余力地兼容任何其他事件循环库所提出的每个hare-brained想法,无论是GUI还是事件循环.你想使用ZMQ吗? Go for it.龙卷风? Sure, whatever;整合是双向的.想要使用Twisted中的阻塞库,但是你在主线程上并且你不想阻止? deferToThread让你满意.想要使用阻塞库中的Twisted函数,你需要阻止吗?好的,只需制作一个blocking call from a thread.

我希望这可以解决你对Twisted“矫枉过正”的任何误解.

上一篇:如何在Android中获取远程设备自定义蓝牙名称?


下一篇:高级测试工程师面试必问面试基础整理——python基础(一)(首发公众号:子安之路)