Разобрать несколько строк в tcl / expect - PullRequest
0 голосов
/ 09 июля 2020

Я выполняю сценарий ожидания, который выполняет bluetoothctl для чтения некоторых устройств, находящихся поблизости.

Для этого я написал следующий сценарий:

#!/usr/bin/expect
send_user "\nStarting scanning\n\r"
spawn bluetoothctl
expect -re "#"
expect "Agent registered"
send_user "\nConfiguring scan filter\n\r"
send "menu scan\r"
expect -re "#"
send "uuids 0x1802\r"
expect -re "#"
send "back\r"
expect -re "#"
send_user "\nScanning devices\n\r"
send "scan on\r"
sleep 10
send "devices\r"
expect -re {Device ([0-9A-F:]+)*} {
    expect -re "#"
    set devices $expect_out(1,string)
}
puts "Devices = $devices"
foreach device $devices {
    send "info $device\r"
    expect -re {UUID: Vendor specific           ([0-9A-F-]+)*} {
        expect -re "#"
        set uuid $expect_out(1,string)
    }
    puts "UUID obtained: $uuid"
}

Когда я выполнить его, у меня есть 2 ошибки :

ERROR 1 - Несколько возвращенных строк. Если команда send "devices \ r" возвращает 2 или более строк, я могу прочитать только первую возвращенную, но мне нужно сохранить все:

[bluetooth]# devices
Device 4F:BF:9A:F6:77:32 4F-BF-9A-F6-77-32
Device 04:D1:3A:D7:71:5E Redmi
[bluetooth]# Devices = 4F:BF:9A:F6:77:32

ERROR 2 - В foreach (для каждого полученного устройства) мне нужно проанализировать вывод команды de info, чтобы получить UUID строки «UUID: Vendor specifici c»:

[bluetooth]# info 4F:BF:9A:F6:77:32
Device 4F:BF:9A:F6:77:32 (random)
    Alias: 4F-BF-9A-F6-77-32
    Paired: no
    Trusted: no
    Blocked: no
    Connected: no
    LegacyPairing: no
    UUID: Immediate Alert           (00001802-0000-1000-8000-00805f9b34fb)
    UUID: Vendor specific           (0a4dadab-66d6-42b7-8d01-bc43b618b6aa)

Мне нужно получить только следующая строка «0a4dadab-66d6-42b7-8d01-bc43b618b6aa», но я не могу найти решение ...

Я должен сохранить весь UUID (для всех устройств, полученных при сканировании) в массив, чтобы вернуть их в родительский скрипт.

Кто-нибудь может мне помочь с этой проблемой?

Спасибо!

1 Ответ

0 голосов
/ 10 июля 2020

Я не верю, что bluetoothctl предназначалось для использования таким образом. Разработчики BlueZ всегда меняют bluetoothctl, что приведет к поломке вашего скрипта, если он заработает.

Лучший способ сделать это - использовать API D-Bus, предоставляемый BlueZ

https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/adapter-api.txt

https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/device-api.txt

Для этого вам необходимо знать:

  1. Сервис BlueZ - это 'org .bluez '
  2. Устройство адаптера имеет путь к объекту D-Bus' / org / bluez / hci0 'обычно
  3. Интерфейс DBus для адаптера -' org.bluez.Adapter1 '
...