使用 Python 3 通过蓝牙发送消息

Send message over bluetooth with Python 3

我目前正在尝试从 Python 3 向 Arduino(使用 HC-06)发送消息。我已成功建立连接,但我似乎无法找到发送消息的正确方式。

这是我用来设置连接的代码(我使用 PyBluez 进行蓝牙):

import sys
import bluetooth

bd_addr = '[MAC-address for HC-06]'
port = 1
sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
sock.connect((bd_addr,port))

发送我正在尝试:

sock.send("2")

抛出错误:"TypeError: Expecting byte-buffer, got str"。

也尝试过:

sock.send(str('2'))

它还会抛出一个错误:"TypeError: Expecting byte-buffer, got str"。

我尝试了很多其他的,比如 "sock.send(2)"、"sock.send(b'2')"、bytearray、"sock.send(bytes(["2"]))"。基本上,无论我尝试发送什么数据类型,都需要另一种数据类型。

我已经设法通过我的 Android phone 上的蓝牙终端发送我所有的命令(目前只有 1 和 2),所以在 Arduino 网站上没有问题。

有很多 guide 有很多我无法复制的例子。谁能告诉我如何发送基本命令?我离答案还很近吗?

编辑: 我现在已经尝试 "sock.send("2".encode())" 并且它还会引发错误:"TypeError: data must be string, was class 'bytes'"

使用另一个 ide 为我提供了有关错误的更具体信息:

sock.send("2"): 警告(来自警告模块): 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/PyBluez-0.22-py3.6.egg/lightblue/_bluetoothsockets.py”,第 737 行 Foundation.NSData.alloc().initWithBytes_length_(数据, len(数据)), UninitializedDeallocWarning:泄漏类型为 _NSPlaceholderData 的未初始化对象 追溯(最近一次通话): 文件“”,第 1 行,位于 sock.send("2") 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/PyBluez-0.22-py3.6.egg/bluetooth/osx.py”,第 122 行,发送 return self._sock.send(数据) 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/PyBluez-0.22-py3.6.egg/lightblue/_bluetoothsockets.py”,第 524 行,发送 结果 = self.__conn.write(writebuf[:sendbytecount]) 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/PyBluez-0.22-py3.6.egg/lightblue/_bluetoothsockets.py”,第 737 行,写入 Foundation.NSData.alloc().initWithBytes_length_(数据, len(数据)), 类型错误:需要字节缓冲区,得到 str

sock.send("2".encode()): 追溯(最近一次通话): 文件“”,第 1 行,位于 sock.send("2".编码()) 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/PyBluez-0.22-py3.6.egg/bluetooth/osx.py”,第 122 行,发送 return self._sock.send(数据) 文件“/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/PyBluez-0.22-py3.6.egg/lightblue/_bluetoothsockets.py”,第 487 行,发送 引发类型错误("data must be string, was %s" % 类型(数据)) 类型错误:数据必须是字符串,是 class 'bytes'

我开始怀疑图书馆了。我完全有可能在安装 PyBluez 时做错了什么。我要看看它是否适用于我的 Raspberry Pi 3.

解决方案

当您通过套接字发送数据时,您必须对其进行编码,否则它会抛出字节缓冲区错误。当您通过套接字发送数据时,只需使用。

sock.send("2".encode())