python - 在 ZeroMQ/Tornado ioloop 或 Twisted 中使用 BluetoothSocket?

标签 python bluetooth twisted tornado zeromq

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

基本的交互是:发送init命令->接收确认;发送启动命令->接收连续数据;发送停止命令 -> ...

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

我不太热衷于将它变成一个多线程应用程序,因为我认为它有点矫枉过正。我在 C#/.NET 中对线程和线程池进行了很多工作,但我有一种预感,这里真的没有必要。相反,我觉得会很乱。

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

由于我是 Python 的新手,所以我不确定如何实现它。我有几个想法:BluetoothSocket 可以连接到 ZeroMQ/Tornado IOLoop 吗?

我想我几乎可以使用 Twisted 完成任何事情,但我并不真的需要 Twisted 提供的一切。如果我需要引入 Twisted,我会去做。我实际上找到了 Twisted implementation蓝牙套接字。但同样,我需要 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 的大小和资源利用率;您是否会在您的应用程序中为使用它支付不合理的成本,无论是在 API 复杂性、内存、磁盘上的包大小、部署麻烦还是与您可能想要使用的其他库的冲突方面。

你不会的。

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

我希望这能消除您对 Twisted 是“矫枉过正”的任何误解。

关于python - 在 ZeroMQ/Tornado ioloop 或 Twisted 中使用 BluetoothSocket?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13642554/

相关文章:

python - 字节从 py2 到 py3 的行为变化

android - 我可以在启用配对设备的任何蓝牙时通知吗?

flash - multipart/x-mixed-replace ActionScript3 和 Google Chrome(以及其他)

python - 如何在 Python WSGI 服务器中实现多线程

python - 在哪些系统/文件系统上 os.open() 是原子的?

android - 从 Android 应用程序以编程方式连接到蓝牙耳机

Froyo HTC Desire 上的 Android 蓝牙扫描

python - 扭曲 react 器的拆卸方法?

python - 使同步 Flask 异步 - Flask 实例

python - Tweepy Python,检索主题标签的最新 5 个实例