这是我的第一个问题,而且我是工程师,不是程序员,所以请耐心等待:
我正在尝试将数据从BLE设备提取到我的树莓派3.BLE设备是HC 05模块,用于发送串行数据" 9999"每1秒通过一个简单的Arduino脚本。
BlueZ 5.44似乎配置正确,因为我可以毫无问题地连接和断开连接。
相关图书馆的文档位于:https://bitbucket.org/OscarAcena/pygattlib/overview
这是我的测试脚本:
from __future__ import print_function
import sys
from gattlib import GATTRequester, GATTResponse
import time
class Reader(object):
def __init__(self, address):
store=''
self.requester = GATTRequester(address, False)
self.connect()
self.request_data()
def connect(self):
print("Connecting...", end=' ')
self.requester.connect()
print("OK!")
def request_data(self):
time.sleep(2)
data = self.requester.read_by_handle(0x5)
print (data)
if __name__ == '__main__':
if len(sys.argv) < 2:
print("Usage: {} <addr>".format(sys.argv[0]))
sys.exit(1)
Reader(sys.argv[1])
print("Done.")
控制台输出:
Connecting... OK!
on notification, handle: 0x12 -> 00:39:39:39:39:
on notification, handle: 0x12 -> 00:39:39:39:39:
['\x00\x00']
Done.
以下列出的信息:
on notification, handle: 0x12 ->
我正在寻找的数据。 ASCII等效的ASCII&#34; 9999&#34;。
但是,该信息将从pygattlib库中包含的C文件打印到控制台。
在我的代码中,我唯一可以访问的输出是:
['\x00\x00']
这显然不是我要找的数据。
所以我的问题是:如何获取脚本内变量所需的数据?我只是想避免使用subprocess.Popen来获取控制台数据,这似乎对我来说应该是完全没必要的。
答案 0 :(得分:0)
我自己没有这个设备,我只是尝试使用相同的API,但我认为你想为地址0x12注册一个通知处理程序(从你的控制台输出中取出)而不是阅读地址0x05。
根据链接中的示例,它应该类似于
from gattlib import GATTRequester, GATTResponse
class NotifyYourName(GATTResponse):
def on_response(self, name):
print("your name is: {}".format(name))
response = NotifyYourName()
req = GATTRequester("00:11:22:33:44:55") # use your address here
req.read_by_handle_async(0x12, response)
while True:
# here, do other interesting things
sleep(1)
数据通常以read_by_handle
方法列表的形式返回(当您正在阅读注册表时),因此您通常会使用data = read_by_handle(0x05)[0]
之类的内容,但我认为对于正在其上发送通知的设备而言,它是不同的。