我使用gatttool与BLE设备建立了连接。首先,我使用sudo gatttool -t random -b FF:3C:8F:22:C9:C8 -I
和connect
连接到设备。之后,我用char-read-uuid 2d30c082-f39f-4ce6-923f-3484ea480596
读取特定特征的值。
我要做的是使整个过程自动化,并将后一个命令(查询值)放入循环中,理想情况下将每个值(附加)保存到文本文件中。我尝试过类似的
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命令在那里不起作用。对于解决此问题的任何线索,我将不胜感激。
答案 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]