Cer*_*rin 5 python linux android bluetooth
您如何通过蓝牙和 Python 处理和接收串行数据?
我正在尝试制作一个简单的 Python 服务器,通过蓝牙访问数据,如here所述。
我的server.py文件在发送文本“temp”时发送一个随机数,是:
#!/usr/bin/env python
import os
import glob
import time
import random
from bluetooth import *
def read_temp():
return random.random()
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, "TestServer",
service_id = uuid,
service_classes = [ uuid, SERIAL_PORT_CLASS ],
profiles = [ SERIAL_PORT_PROFILE ],
# protocols = [ OBEX_UUID ]
)
while True:
print "Waiting for connection on RFCOMM channel %d" % port
client_sock, client_info = server_sock.accept()
print "Accepted connection from ", client_info
try:
data = client_sock.recv(1024)
if len(data) == 0: break
print "received [%s]" % data
if data == 'temp':
data = str(read_temp())+'!'
client_sock.send(data)
else:
data = 'WTF!'
client_sock.send(data)
print "sending [%s]" % data
except IOError:
pass
except KeyboardInterrupt:
print "disconnected"
client_sock.close()
server_sock.close()
print "all done"
break
Run Code Online (Sandbox Code Playgroud)
当我第一次运行这个时,我收到错误:
bluetooth.btcommon.BluetoothError: (2, 'No such file or directory')
Run Code Online (Sandbox Code Playgroud)
其中一派表明可以通过启用兼容模式和通过编辑文件加载串行轮廓被固定/lib/systemd/system/bluetooth.service和变化的线路:
ExecStart=/usr/lib/bluetooth/bluetoothd
Run Code Online (Sandbox Code Playgroud)
到:
ExecStart=/usr/lib/bluetooth/bluetoothd -C
Run Code Online (Sandbox Code Playgroud)
然后运行sudo sdptool add SP。
现在python server.py似乎运行没有错误,我可以将运行它的机器与我的 Android 手机配对。但是,它似乎无法接收任何数据。
我试过使用蓝牙终端仿真应用程序,如 BlueTerm、BT Simple Terminal 和 Arduino BT,但是当我连接到服务器时输入文本并按 Enter,没有响应server.py。它最初会报告“已接受的连接...”并收到空字符串,但之后什么也没有收到。
由于没有报告明确的错误,我不确定如何诊断问题。我如何确定问题是否出在我的 Python 代码中?还是服务器上的蓝牙配置?还是我的安卓手机?
正确的代码是:
#!/usr/bin/env python
"""
A simple test server that returns a random number when sent the text "temp" via Bluetooth serial.
"""
import os
import glob
import time
import random
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, "TestServer",
service_id = uuid,
service_classes = [ uuid, SERIAL_PORT_CLASS ],
profiles = [ SERIAL_PORT_PROFILE ],
# protocols = [ OBEX_UUID ]
)
print "Waiting for connection on RFCOMM channel %d" % port
client_sock, client_info = server_sock.accept()
print "Accepted connection from ", client_info
while True:
try:
req = client_sock.recv(1024)
if len(req) == 0:
break
print "received [%s]" % req
data = None
if req in ('temp', '*temp'):
data = str(random.random())+'!'
else:
pass
if data:
print "sending [%s]" % data
client_sock.send(data)
except IOError:
pass
except KeyboardInterrupt:
print "disconnected"
client_sock.close()
server_sock.close()
print "all done"
break
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17658 次 |
| 最近记录: |