无法发现使用PyBluez创建的服务

时间:2014-01-04 13:05:50

标签: python bluetooth visibility

我正在尝试使用PyBluez在Python上创建一个简单的蓝牙服务,看起来它的工作原理,但我找不到我的手机和PyBluez本身的服务。当我使用PyBluez进行搜索时,我能够发现我的手机蓝牙,而不是使用PyBluez创建的服务器。下面的代码出了什么问题?

import bluetooth

server_sock=bluetooth.BluetoothSocket( bluetooth.RFCOMM )

port = 0 # automatically choose port
server_sock.bind(("",port))
server_sock.listen(1)

uuid = "1e0ca4ea-299d-4335-93eb-27fcfe7fa848"
bluetooth.advertise_service( server_sock, "FooBar Service", uuid )

client_sock,address = server_sock.accept()
print "Accepted connection from ",address

data = client_sock.recv(1024)
print "received [%s]" % data

client_sock.close()
server_sock.close()

我正在使用hciconfig hci0 piscan启用服务可见性,因此我的手机能够找到一个名为我的PC的蓝牙设备,但不能找到我创建的服务(我的意思是FooBar Service)。 此外,我无法使用sdptool browse命令找到我的服务。

我误解了什么吗?如何连接到我创建的服务?

更新

以下是在带有D-Link蓝牙适配器的Windows 7 PC上执行的下述代码结果。

enter image description here

更新

最后,当我从另一台计算机运行客户端时,它工作正常。它在本地不起作用,但为什么我无法从任何设备发现此服务?我应该做些什么特别的事情让它像普通的蓝牙服务一样?

2 个答案:

答案 0 :(得分:5)

首先,您的代码不是服务,它是使用RFCOMM套接字的服务器

这与使用python套接字编程非常相似(你可以阅读更多here

我将使用PyBluez documentation中的一个简单示例:

服务器部分:

from bluetooth import *

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

print("Waiting for connection on RFCOMM channel %d" % port)

client_sock, client_info = server_sock.accept()

print("Accepted connection from ", client_info)

#this part will try to get something form the client
# you are missing this part - please see it's an endlees loop!!
try:
    while True:
        data = client_sock.recv(1024)
        if len(data) == 0: break
        print("received [%s]" % data)

# raise an exception if there was any error
except IOError:
    pass

print("disconnected")

client_sock.close()
server_sock.close()

客户端部分(文档的复制粘贴):

from bluetooth import *
import sys

if sys.version < '3':
    input = raw_input

addr = None

if len(sys.argv) < 2:
    print("no device specified.  Searching all nearby bluetooth devices for")
    print("the SampleServer service")
else:
    addr = sys.argv[1]
    print("Searching for SampleServer on %s" % addr)

# search for the SampleServer service
uuid = "94f39d29-7d6d-437d-973b-fba39e49d4ee"
service_matches = find_service( uuid = uuid, address = addr )

if len(service_matches) == 0:
    print("couldn't find the SampleServer service =(")
    sys.exit(0)

first_match = service_matches[0]
port = first_match["port"]
name = first_match["name"]
host = first_match["host"]

print("connecting to \"%s\" on %s" % (name, host))

# Create the client socket
sock=BluetoothSocket( RFCOMM )
sock.connect((host, port))

print("connected.  type stuff")
while True:
    data = input()
    if len(data) == 0: break
    sock.send(data)

sock.close()

您的问题:

我看不到任何客户端代码,您需要创建客户端并连接服务器。

您需要像上面一样更改它,运行服务器,然后运行客户端。

然后,您将在服务器上看到客户端连接。

另一个有用的链接here它真的帮助了我。

修改

由于我目前的桌面没有BT,所以有点棘手。

底部有一个很好的BlueZ服务器客户端here示例。

正在使用MAC地址:

服务器代码:更改hostMACAddress参数 - 这是您的适配器mac地址

客户端代码:serverMACAddress更改为您在'hostMACAddress'上写的内容

答案 1 :(得分:0)

通过将 addressbluetooth.find_service 参数更改为 localhost,我能够解决此问题。这是一种特殊情况,允许您搜索本地 SDP,https://people.csail.mit.edu/albert/bluez-intro/x290.html