【问题标题】:Gattlib read_by_handle function: Where is read data stored?Gattlib read_by_handle 函数:读取的数据存储在哪里?
【发布时间】:2017-08-09 08:21:51
【问题描述】:

这是我的第一个问题,我是工程师,不是程序员,所以请多多包涵:

我正在尝试将数据从 BLE 设备提取到我的树莓派 3。BLE 设备是一个 HC 05 模块,通过一个简单的 Arduino 脚本每 1 秒发送一次串行数据“9999”。

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“9999”的十六进制等效项。

但是,该信息从 pygattlib 库中包含的 C 文件打印到控制台。

在我的代码中,我可以访问的唯一输出是:

['\x00\x00']

这显然不是我要找的数据。

所以我的问题是:如何将所需的数据获取到脚本中的变量?我只是想避免使用 subprocess.Popen 来获取控制台数据,而这对我来说似乎完全没有必要。

【问题讨论】:

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


    【解决方案1】:

    我自己没有这个设备,我只是在试验相同的 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] 之类的东西,但是我认为它对于一个设备来说是不同的自行发送通知。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      • 2012-04-11
      • 2011-12-14
      • 2020-01-07
      • 2011-12-09
      • 2019-05-24
      • 2016-07-18
      相关资源
      最近更新 更多