Hcitool lescan не будет печатать в файл в режиме реального времени

ОБНОВЛЕНИЕ: я решил свое решение с помощью os.system:

sensortag=0
while sensortag != "B4:99:4C:64:33:E0":
    #call the command and write to scan.txt file and then fill the process.
    #loop to find if the MAC address given is available
    os.system("hcitool lescan> scan.txt & pkill --signal SIGINT hcitool")
    scan = open("scan.txt","r")
    readscan = scan.read()
    if "B4:99:4C:64:33:E0" in readscan:
        print "SensorTag found."
        sensortag = "B4:99:4C:64:33:E0"

У меня есть две программы, по сути одинаковые, но с двумя разными командами, на Raspberry PI с Raspbian.

То, что я пытаюсь сделать, это записать оба вывода команды в файл, чтобы я мог их обработать позже.

Я озадачен тем, почему первая программа не будет работать, а вторая будет.

В программе First есть команда "sudo timeout 5 hcitool lescan", которая не работает.

import os
import subprocess

#r+ because the file is already there, w without the file
myfile = open("scan.txt", "r+")

#Reset Bluetooth interface, hci0
os.system("sudo hciconfig hci0 down")
os.system("sudo hciconfig hci0 up")

#Scan for bluetooth devices
dev = subprocess.Popen(["sudo timeout 5 hcitool lescan"], stdout=subprocess.PIPE, shell=True)
(device, err) = dev.communicate()

#Print bluetooth devices
print device

#Write the hcitool lescan output to a file
myfile.write(device)

#Close the file
myfile.close()

Вот моя вторая программа, которая работает и печатает "sudo hciconfig":

import os
import subprocess

#r+ because the file is already there, w without the file
myfile = open("test.txt", "r+")

#Reset Bluetooth interface, hci0
os.system("sudo hciconfig hci0 down")
os.system("sudo hciconfig hci0 up")

#Make sure device is up
interface = subprocess.Popen(["sudo hciconfig"], stdout=subprocess.PIPE, shell=True)
(int, err) = interface.communicate()

#Print hciconfig to make sure it's up
print int

#Write the hciconfig output to a file
myfile.write(int)

#Close the file
myfile.close()

person Jonathan Davies    schedule 11.11.2014    source источник


Ответы (3)


Я решил свое решение с помощью os.system и сразу же убил сканирование:

sensortag=0
while sensortag != "B4:99:4C:64:33:E0":
    #call the command and write to scan.txt file and then fill the process.
    #loop to find if the MAC address given is available
    os.system("hcitool lescan> scan.txt & pkill --signal SIGINT hcitool")
    scan = open("scan.txt","r")
    readscan = scan.read()
    if "B4:99:4C:64:33:E0" in readscan:
        print "SensorTag found."
        sensortag = "B4:99:4C:64:33:E0"
person Jonathan Davies    schedule 20.11.2014

Потратив несколько часов на это, я придумал это решение. Проблема с hcitool lescan заключается в том, что он не возвращает значение, пока не получит SIGINT, поэтому мы отправляем его с помощью Python:

    bashCommand = "hcitool lescan"
    process = subprocess.Popen(bashCommand.split(), stdout=subprocess.PIPE)
    time.sleep(3)
    os.kill(process.pid, signal.SIGINT)
    output = process.communicate()[0]

Это для меня вернуло строку, содержащую все найденные MAC-адреса, после 3-секундного поиска.

person motomod    schedule 09.01.2016

Используя только терминал, сработала следующая команда:

hcitool lescan > scan.txt & sleep 2 && pkill --signal SIGINT hcito

Просто оставлю это здесь, может кому поможет.

person bigz94    schedule 03.06.2016