使用Python 3.3的蓝牙服务器

时间:2013-04-05 08:09:55

标签: python python-3.x bluetooth

Python 3.3带有对蓝牙套接字的原生支持。不幸的是,它还没有得到很好的记录(在documentation中只有一个提及它。)

在Google上搜索a blog post有关实现客户端的信息,但我找不到有关创建服务器的任何信息。

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

所以,像

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)

有什么想法吗?

1 个答案:

答案 0 :(得分:11)

坏消息: Python似乎不支持你想要开箱即用的东西。 (至少不在socketmodule.c)。

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

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

pybluez确实为socket对象定义了一些附加功能,以实现所有这些蓝牙功能。它不会太低级别,而是取决于BlueZ。据我所知,它基本上需要python对象并创建BlueZ所期望的数据结构,并且只是调用它。 如果您不想/不能使用pybluez,则必须以某种方式实现此缺失功能。我想你可以用c-types做到这一点。宣传服务的相关部分位于btmodule.c,第2562-2642行。

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

如果您决定使用pybluez,请摘自their source

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 ], 
                  )

随着Google代码的关闭,代码也可以在github here上找到。