【发布时间】:2012-11-30 09:43:36
【问题描述】:
我正在使用 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 是“矫枉过正”?什么是软件中的“矫枉过正”?你不会把你的问题磨成尘土,以至于随风飘散,让你失业。您不会通过将 Twisted 或线程应用于“简单”问题来用完世界上所有的 Twisted 或线程。为什么你认为这是一个简单的问题呢?是什么使它比任何其他并发 I/O 问题更容易? :) 特别是因为听起来您认为您已经知道如何使用 Twisted 解决这个问题,为什么要花时间尝试找到一个 没有它的解决方案?
-
公平点!我不知道如何在 Twisted 中做到这一点,但正如我在问题中指出的那样,我找到了一个实现。我正在尝试在这里学习Python,但我不知道这是一种优雅的方式。当然,我可以启动线程。我什至可以在自己设计的循环中处理接收,不时轮询 ZeroMQ 以获取命令。我不想自动使用一个庞大的库,后来发现它可以用几行代码和一个 ioloop 来完成。此外,无论如何我可能会使用 ZeroMQ 和/或 Tornado。那里可以处理吗?那么好多了。
-
谢谢。这有点清楚了。 :)
标签: python bluetooth twisted tornado zeromq