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.
Я пытаюсь записать оба вывода команды в файл, чтобы я мог обработать их позже.
Я озадачен, почему первая программа не сработает, а вторая сработает.
Первая программа имеет команду "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()
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"
Потратив на это несколько часов, я нашел это решение. Проблема с 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-х секундного поиска.
Используя только терминал, сработала следующая команда:
hcitool lescan > scan.txt & sleep 2 && pkill --signal SIGINT hcito
Я просто оставлю это здесь, может быть, это кому-то поможет.