Мне удалось создать решение для котельной, которое вы можете адаптировать под свои нужды.
Вот основная идея
1) Считайте последнюю строку файла журнала, используя os.popen
внепрерывный цикл, который повторяется каждую секунду
2) значение RSSI очень мало, и разница между этими значениями также мала.Мы умножаем это на константу 100
здесь, чтобы создать заметную разницу.Вы можете попробовать разные значения.
3) Используя pydub, мы создаем синусоиды и воспроизводим их
Код
from pydub.generators import Sine
from pydub import AudioSegment
from pydub.playback import play
import os
import time
sr = 44100 # sample rate
bd = 16 # bit depth
l = 50.0 # duration in millisec
last_line = "" #to avoid same line played again
log_file = "probemon.log"
while True:
line = os.popen('tail -n 1 {}'.format(log_file)).read()
if last_line == line:
pass
else:
key, val = line.split()
f = abs(int(val)) * 100
#create sine wave of given freq
sine_wave = Sine(f, sample_rate=sr, bit_depth=bd)
#Convert waveform to audio_segment for playback and export
sine_segment = sine_wave.to_audio_segment(duration=l)
print "mac:{} , rssi:{}".format(key,val)
#Play audio segment
play(sine_segment)
last_line = line
time.sleep(1) #sleep 1 sec, synch this with log file fill
Я тестировал, заполняяprobemon.log
файл построчно с другого терминала с задержкой в 1 секунду.Цикл будет ждать, если нет новых данных.
EDIT1
Звуковой «тон» имеет «частоту», при изменении частоты тональный сигнал меняется.Исходя из нашего обсуждения, поскольку нам нужно, чтобы тональность изменялась в режиме реального времени, мы не можем использовать pydub
, что в основном хорошо для автономной манипуляции.
pyaudio
имеет неблокирующий метод с использованием обратного вызова, который позволяет манипулировать потоковыми данными во время их воспроизведения в режиме реального времени.
Это решение непрерывно воспроизводит звук на основе последней строки журнала до тех пор, пока данные журнала не изменятся.
В этом решении также устранен звук «треск / треск», возникающий при объединении двух тонов.
Вдохновениес здесь .
import pyaudio
import numpy as np
from time import time,sleep
import os
CHANNELS = 2
RATE = 44100
TT = time()
freq = 100
newfreq = 100
phase = 0
log_file = "probemon.log"
def callback(in_data, frame_count, time_info, status):
global TT,phase,freq,newfreq
if newfreq != freq:
phase = 2*np.pi*TT*(freq-newfreq)+phase
freq=newfreq
left = (np.sin(phase+2*np.pi*freq*(TT+np.arange(frame_count)/float(RATE))))
data = np.zeros((left.shape[0]*2,),np.float32)
data[0::2] = left #left data
data[1::2] = left #right data
TT+=frame_count/float(RATE)
return (data, pyaudio.paContinue)
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paFloat32,
channels=CHANNELS,
rate=RATE,
output=True,
stream_callback=callback)
stream.start_stream()
tmphold = ""
try:
while True:
line = os.popen('tail -n 1 {}'.format(log_file)).read()
try:
key, val = line.split()
except:
key, val = "default", 0.0
f = abs(int(val))
newfreq = f * 10 #update freq per log
if newfreq != tmphold:
tmphold = newfreq
print "mac:{} , rssi:{} , freq:{}
finally:
stream.stop_stream()
stream.close()
p.terminate()
Результат
mac:default , rssi:0.0 , freq:0 Hz
mac:d8:8f:76:1a:cb:65 , rssi:-43 , freq:430 Hz
mac:04:4f:4c:77:72:8f , rssi:-51 , freq:510 Hz
mac:20:39:56:af:51:49 , rssi:-39 , freq:390 Hz
mac:20:39:56:af:51:49 , rssi:-45 , freq:450 Hz
mac:5e:e2:1d:a3:d2:da , rssi:-47 , freq:470 Hz
mac:5e:e2:1d:a3:d2:da , rssi:-49 , freq:490 Hz
mac:12:84:16:9c:75:ee , rssi:-43 , freq:430 Hz
mac:da:a1:19:71:4d:0c , rssi:-55 , freq:550 Hz
mac:d8:8f:76:1a:cb:65 , rssi:-49 , freq:490 Hz