【问题标题】:Communicating via Bluetooth serial with Python通过蓝牙串口与 Python 进行通信
【发布时间】:2016-04-18 14:14:54
【问题描述】:

您如何通过蓝牙和 Python 处理和接收串行数据?

我正在尝试制作一个简单的 Python 服务器,通过蓝牙以 explained 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

当我第一次运行它时,我得到了错误:

bluetooth.btcommon.BluetoothError: (2, 'No such file or directory')

可以通过启用兼容模式并通过编辑文件/lib/systemd/system/bluetooth.service 并更改行来加载串行配置文件来修复Googled showed

ExecStart=/usr/lib/bluetooth/bluetoothd

到:

ExecStart=/usr/lib/bluetooth/bluetoothd -C

然后运行sudo sdptool add SP

现在python server.py 似乎可以正常运行,我可以将运行它的机器与我的 Android 手机配对。但是,它似乎无法接收任何数据。

我尝试过使用蓝牙终端仿真应用程序,如 BlueTerm、BT Simple Terminal 和 Arduino BT,但是当我连接到服务器输入文本并按 Enter 时,server.py 没有响应。它最初会报告“已接受的连接...”并已接收到空字符串,但之后它什么也没有收到。

由于没有报告明确的错误,我不确定如何诊断问题。我如何确定问题是否出在我的 Python 代码中?还是服务器上的蓝牙配置?还是我的安卓手机?

【问题讨论】:

  • 凹凸。你找到解决问题的方法了吗?
  • @Chris,是的,发布在下面。

标签: android python linux bluetooth


【解决方案1】:

正确的代码是:

#!/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

【讨论】:

    【解决方案2】:

    您还可以查看 bleak,请参阅https://pypi.org/project/bleak/ Bleak 是 GATT 客户端软件,能够连接到充当 GATT 服务器的 BLE 设备。它旨在提供一个异步的、跨平台的 Python API 来连接和通信,例如传感器

    【讨论】:

      猜你喜欢
      • 2014-12-22
      • 2016-07-29
      • 2016-01-28
      • 1970-01-01
      • 2020-12-27
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      相关资源
      最近更新 更多