我正在尝试使用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上执行的下述代码结果。
更新
最后,当我从另一台计算机运行客户端时,它工作正常。它在本地不起作用,但为什么我无法从任何设备发现此服务?我应该做些什么特别的事情让它像普通的蓝牙服务一样?
答案 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)
通过将 address
的 bluetooth.find_service
参数更改为 localhost
,我能够解决此问题。这是一种特殊情况,允许您搜索本地 SDP,https://people.csail.mit.edu/albert/bluez-intro/x290.html。