Gattlib read_by_handle函数:读取数据存储在哪里?

时间:2017-03-17 16:59:54

标签: python bluetooth serial-port raspberry-pi3 bluez

这是我的第一个问题,而且我是工程师,不是程序员,所以请耐心等待:

我正在尝试将数据从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来获取控制台数据,这似乎对我来说应该是完全没必要的。

1 个答案:

答案 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]之类的内容,但我认为对于正在其上发送通知的设备而言,它是不同的。