首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可访问gatttool交互式shell脚本

可访问gatttool交互式shell脚本
EN

Stack Overflow用户
提问于 2018-06-28 15:45:03
回答 2查看 3.8K关注 0票数 0

我用gatttool建立了与BLE设备的连接。首先,我用sudo gatttool -t random -b FF:3C:8F:22:C9:C8 -Iconnect连接到设备上。在此之后,我用char-read-uuid 2d30c082-f39f-4ce6-923f-3484ea480596读取了特定特性的值。

我想要做的是自动化整个过程,并将后一个命令(查询值)放在循环中,理想情况下将每个值(附加)保存到一个文本文件中。我试过

代码语言:javascript
复制
sudo gatttool -t random -b FF:3C:8F:22:C9:C8 -I <<EOF
connect
while[ 1 ]; do
char-read-uuid 2d30c082-f39f-4ce6-923f-3484ea480596 > output.txt
done
exit 1
EOF

但是这没有帮助,因为我甚至无法连接到设备(理想情况下,在第一个命令和第二个命令之间应该有一些延迟)。此外,在连接之后,将启用交互模式,而shell命令在那里不起作用。我很想知道如何解决这个问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-28 16:03:50

如果gattool将提示写到stdout (并且没有在非TTY文件描述符的情况下阻止它们),请考虑如下:

代码语言:javascript
复制
#!/usr/bin/env bash
case $BASH_VERSION in ''|[123].*|4.0.*) echo "ERROR: bash 4.1 or newer required" >&2; exit 1;; esac

exec {output_fd}>output.txt

prompt_re='[>] '
capture_re='^handle:.*value:.*$'

wait_for_prompt() {
  IFS= read -r line || return
  while ! [[ $line =~ $prompt_re ]]; do
    [[ $line =~ $capture_re ]] && printf '%s\n' "$line" >&$output_fd
    IFS= read -r line || return
  done
}

wait_for_prompt
echo connect
while wait_for_prompt; do
  echo "char-read-uuid 2d30c082-f39f-4ce6-923f-3484ea480596"
done

...saved作为yourscript,并将socat调用为:

代码语言:javascript
复制
socat 'SYSTEM:sudo gatttool -t random -b FF:3C:8F:22:C9:C8 -I 2>&1' 'EXEC:./yourscript'

(假设sudo配置为不使用TTY;否则,您可能将其移动为sudo socat)。

票数 0
EN

Stack Overflow用户

发布于 2018-06-28 23:00:21

实际上,pexpect在这里工作得很好。你可以在下面找到我的解决方案。代码读取特定UUID的值,其中包含IMU读数(浮点数)。

代码语言:javascript
复制
import pexpect
import struct
import time
import sys

IMU_MAC_ADDRESS = "FF:3C:8F:22:C9:C8"
UUID_DATA = "2d30c082-f39f-4ce6-923f-3484ea480596"

if __name__ == '__main__':
    gatt = pexpect.spawn("gatttool -t random -b " + IMU_MAC_ADDRESS + " -I")
    gatt.sendline("connect")
    gatt.expect("Connection successful")

    while(True):
        gatt.sendline("char-read-uuid " + UUID_DATA)
        gatt.expect("handle: 0x0011      value: ")
        gatt.expect(" \r\n")
        data = (gatt.before).decode('UTF-8').replace(" ", "").decode('hex')
        print(struct.unpack('f', data)[0]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51086932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档