问题 使用Python 3.3的蓝牙服务器


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)

有任何想法吗?


10607
2018-04-05 08:09


起源

看起来他们基本上集成了pybluez。看看这些例子: code.google.com/p/pybluez/source/browse/trunk/examples/simple/... - TJD
套接字模块和服务器套接字中不存在'advertise_service',并且在python的源代码中搜索'advert'只找到三个不相关的注释。 - A. Borgna
我遇到了同样的问题。我可以制作一个简单的服务器,但不能执行广告服务等任务。如果您有兴趣,可以在此处查看客户端 - 服务器应用程序的代码: kevindoran1.blogspot.co.nz/2013/04/... - Kevin
@TJD,PyBluez是从PyAffix复制的,后者又从python2.2复制过来。 - Felipe


答案:


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

我见过的大多数python / bluetooth用户都使用过 pybluez 虽然自2009年以来尚未更新。

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

pybluez 确实为a定义了一些额外的功能 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上找到 这里


11
2018-04-29 23:08



谢谢,我想我最终会使用pc作为奴隶,因为我需要使用py3。 - A. Borgna