如果符合您的需求,您也可以反过来做。我让我的Python脚本从RFSniffer中调用,将信号作为参数传递进去。
我的Python脚本类似于以下内容:
import sys, getopt
import uuid
fileEnding = "txt"
fileFolder = "./sniffed"
def main(argv):
opts, args = getopt.getopt(argv,"s:")
for opt, arg in opts:
if opt == '-s':
filename = fileFolder + "/" + str(uuid.uuid4()) + "." + fileEnding
with open(filename, 'w') as outfile:
outfile.write(arg)
if __name__ == "__main__":
main(sys.argv[1:])
现在,您需要编辑RFSniffer.cpp,在每个接收到的信号后调用您的python脚本。以下代码片段将所有在短时间内接收到的信号代码连接在一起,因为有时一个遥控器上的按键会产生多个信号代码。因此,您的python脚本不是按信号而是按按钮按下来调用的。
我不是CPP开发人员,因此请原谅我的笨拙方法(但嘿,它能完成工作;))
#include <iostream>
#include <string>
#include <sstream>
#include <unistd.h>
while(1) {
int count = 0;
std::string signals;
signals = "";
while (count < 10000) {
if (mySwitch.available()) {
int value = mySwitch.getReceivedValue();
if (value == 0) {
printf("Unknown encoding\n");
} else {
std::string signal;
std::stringstream signalStream;
signalStream << value;
signal = signalStream.str();
if (signals.length() > 0) {
signals.append(",");
}
else {
count = 0;
}
signals.append(signal);
printf("Received %s\n", signal.c_str() );
}
mySwitch.resetAvailable();
}
usleep(50);
count += 1;
}
if (signals.length() > 0) {
std::string command;
command.append("python3 /home/pi/your_script.py -s ");
command.append(signals);
printf("Call %s\n", command.c_str());
system(command.c_str());
}
}
它的作用是循环10k次,查找新的“ReceivedValue”,并等待50微秒。如果需要,您可以调整这些参数。这意味着一个时间框架至少需要半秒钟,并且应该覆盖遥控器上单个按钮按下所属的所有信号。这些一对多的信号代码作为逗号分隔的值传递给您的Python脚本(参数-s code1,code2,code3)。在脚本内部进行任何操作。祝玩得开心。