这是我项目的架构:
1)Android应用程序->;2)RPi上的Apache服务器->;3)控制->;我的设备的Python脚本->;4)我的设备
1)Android应用程序-2个简单的开关,每个开关通过RPi向Apache发送不同的请求:
public class MainActivity extends Activity{
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Switch switch_auto = findViewById(R.id.switch_auto);
Switch switch_manual = findViewById(R.id.switch_manual);
switch_auto.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
new Background_get().execute("led1=1");
} else {
new Background_get().execute("led1=0");
}
}
});
switch_manual.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
Log.d(TAG, "onCheckedChanged: SET TO TRUE");
new Background_get().execute("led2=1");
Log.d(TAG, "onCheckedChanged: EXIT");
} else {
Log.d(TAG, "onCheckedChanged: SET TO FALSE");
new Background_get().execute("led2=0");
Log.d(TAG, "onCheckedChanged: EXIT");
}
}
});
}
private class Background_get extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
try {
URL url = new URL("http://192.168.0.248/?" + params[0]);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuilder result = new StringBuilder();
String inputLine;
while ((inputLine = in.readLine()) != null)
result.append(inputLine).append("\n");
in.close();
connection.disconnect();
return result.toString();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
}
2)RPi上的Apache服务器-非常简单的PHP代码:
time.sleep(10)
)while True: time.sleep(1)
)我的问题:我可以通过web浏览器用这些脚本正确地控制我的设备,例如:
出于测试目的,这是Apache2的访问.log对于led1(=1使其工作10秒,=0只打印一行):
192.168.0.10 - - [01/Mar/2018:10:42:01 +0100] "GET /?led1=1 HTTP/1.1" 200 411 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36"
(开始工作)
192.168.0.10 - - [01/Mar/2018:10:42:05 +0100] "GET /?led1=0 HTTP/1.1" 200 233 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36"
(在4秒后获得led1=0没有问题,并且led1=1的脚本仍能再工作几秒钟)
不幸的是,我的Android应用程序无法做到这一点。以下是相同的Apache日志:
192.168.0.66 - - [01/Mar/2018:10:36:53 +0100] "GET /?led1=1 HTTP/1.1" 200 411 "-" "Dalvik/2.1.0 (Linux; U; Android 8.1.0; Nexus 5X Build/OPM3.171019.014)"
(我在5秒后“关机”,但是。。。)
192.168.0.66 - - [01/Mar/2018:10:37:07 +0100] "GET /?led1=0 HTTP/1.1" 200 232 "-" "Dalvik/2.1.0 (Linux; U; Android 8.1.0; Nexus 5X Build/OPM3.171019.014)"
(没有!注意14秒的差异(它启动大约3秒,然后工作10秒)。在led1=1的脚本完成它的工作后,它接收GET。你知道吗
当脚本工作10秒(led1)时,这是一个问题,但当脚本在无限while循环(led2)中工作时,这是一个大问题-在第一个脚本停止之前,我无法中断它(但它是while True循环,所以…)
我想用Python在第二个脚本中的subprocess.check_call()
来杀死第一个脚本,但似乎没有什么帮助。你知道吗
有什么办法解决这个问题吗?你知道吗
最后,我终于做到了。杀死无限while循环的想法是正确的,但首先我考虑在Python脚本上这样做是错误的。你知道吗
我注意到那些GET响应在local.php站点加载时没有出现在日志中(由于while循环),所以需要中止当前GET。这可以通过Apache的httpcomponents来实现。你知道吗
因此,经过一些修改后,我的代码如下所示:
值得注意的事情:
相关问题 更多 >
编程相关推荐