BLE gatttool交互式Shell脚本

时间:2018-06-28 15:45:03

标签: bash shell ubuntu bluetooth gatt

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

Here is a view on the console

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

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命令在那里不起作用。对于解决此问题的任何线索,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

如果gattool向stdout写入提示(并且未给非TTY文件描述符取消提示),请考虑以下内容:

#!/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

...另存为yourscript,并使用socat进行调用:

socat 'SYSTEM:sudo gatttool -t random -b FF:3C:8F:22:C9:C8 -I 2>&1' 'EXEC:./yourscript'

(假设sudo配置为在没有TTY的情况下工作;否则,您可以将其移动为sudo socat)。

答案 1 :(得分:0)

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

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]