使用 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())
我目前正在尝试从 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())