[英]Using a BluetoothSocket in ZeroMQ/Tornado ioloop, or maybe in Twisted?
我正在使用PyBluez通过蓝牙连接到设备。 它工作得很好。 设备正在使用SPP,我使用BluetoothSocket(RFCOMM)进行连接。
基本交互是:发送init命令 - >接收确认; 发送启动命令 - >接收连续数据; 发送停止命令 - > ...
我需要能够从另一个应用程序控制应用程序:启动,停止......我在想ZeroMQ或者可能是Tornado和HTTP / REST ifc。
我不是非常热衷于使这个多线程应用程序,因为我认为它有点过度杀死。 我已经在C#/ .NET中使用了很多线程和池,但是我预感到这里并不是必需的。 相反,我认为这将是非常混乱的。
但是,我需要能够通过ZeroMQ / REST / ...处理命令(例如“开始”,“停止”),同时继续接收数据并发送偶尔的数据包。
由于我是Python的新手,我不知道如何实现它。 我有一些想法:BluetoothSocket可以连接到ZeroMQ / Tornado IOLoop吗?
我假设我几乎可以使用Twisted完成任何事情,但我并不真正需要Twisted提供的所有功能。 如果我需要拉入Twisted,我会这样做。 我实际上找到了一个Twisted的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复杂性,内存,磁盘上的包大小,部署麻烦,还是与您可能想要使用的其他库冲突,您是否会在应用程序中支付不合理的成本。
你不会。
我希望这可以解决你对Twisted“矫枉过正”的任何误解。
这是一个没有直接体验的观点,但是我做了一些观察,你需要考虑的是阻塞与非阻塞IO。
从快速阅读开始,PyBluez模块(库)不支持异步IO,这意味着您最终需要深入挖掘库,以便在Tornado或Twisted中正确处理读写位。
如果这是我的项目,我可能会做的是将PyBluez库放入它自己的Thread中,然后有一些队列与之交互回龙卷风(我是龙卷风扇)。 现在只是如何将BlueTooth事件传递给主IOLoop的问题。 你真的有两个选择,将套接字连接到你自己,因为IOLoop通常在一个选择中被阻止。 或者设置一个定时器每100ms回调一次,以检查蓝牙队列上是否有任何应该处理的活动。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.