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

我正在尝试使用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服务).
另外,我无法使用sdptool browse命令找到我的服务.

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

更新

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

更新

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

解决方法:

首先,您的代码不是服务,而是使用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’处写的内容

上一篇:android – 如何序列化对象然后通过蓝牙发送它


下一篇:android – 有没有办法通过蓝牙可靠地进行通信?