14

Python 3.3 自带对蓝牙套接字的原生支持。不幸的是,它的文档还不是很好(文档中只提到了一次)。

谷歌搜索有一篇关于实现客户端的博客文章,但我找不到任何关于创建服务器的信息。

更具体地说,如何设置用户友好的名称并宣传服务。

所以,像

import socket

serverSocket = socket.socket(socket.AF_BLUETOOTH,
                             socket.SOCK_STREAM,
                             socket.BTPROTO_RFCOMM)
serverSocket.setTimeout(1)
serverSocket.bind(("", 1))
serverSocket.listen(1)

something.advertise_service(something something)

有任何想法吗?

4

1 回答 1

14

坏消息:Python 似乎不支持您想开箱即用的功能。(至少不在socketmodule.c中)。

我见过的大多数 python/蓝牙用户都在使用pybluez,尽管它自 2009 年以来就没有更新过。

好消息:我浏览了他们的源代码(用于 Linux 连接),找到了广告服务的相关信息。大多数代码本质上是从 python 2.2 版本的socketmodule.c.

pybluez确实为对象定义了一些额外的功能socket来实现所有这些蓝牙好东西。它不会变得太低级,而是取决于BlueZ它。据我所知,它基本上采用 python 对象并创建预期的数据结构BlueZ并调用它。如果您不想/不能使用pybluez,您将不得不以某种方式实现这个缺失的功能。我认为您可以使用 c-types 来做到这一点。广告服务的相关部分在 btmodule.c中,第 2562-2642 行。

的源代码中有一个 python-3 分支pybluez,虽然我不知道它是否有效。

如果您决定使用pybluez,取自其来源的示例

server_sock=BluetoothSocket( RFCOMM )
server_sock.bind(("",PORT_ANY))
server_sock.listen(1)

port = server_sock.getsockname()[1]

uuid = "94f39d29-7d6d-437d-973b-fba39e49d4ee"

advertise_service(server_sock, "SampleServer",
                  service_id = uuid,
                  service_classes = [ uuid, SERIAL_PORT_CLASS ],
                  profiles = [ SERIAL_PORT_PROFILE ], 
                  )

由于谷歌代码即将关闭,代码也可以在 github 上找到

于 2013-04-29T23:08:52.980 回答