android - 如何让我的 android 应用程序与树莓派 3 上的 Flask 服务器交互?
问题描述
我正在尝试遵循 MattRichardson 关于“使用 Flask 服务 Raspberry Pi”的教程(http://mattrichardson.com/Raspberry-Pi-Flask/)。这是我从本网站提到的教程中获得的代码:
import RPi.GPIO as GPIO
from flask import Flask, render_template, request
app = Flask(__name__)
GPIO.setmode(GPIO.BCM)
# Create a dictionary called pins to store the pin number, name, and pin state:
pins = {
24 : {'name' : 'coffee maker', 'state' : GPIO.LOW},
25 : {'name' : 'lamp', 'state' : GPIO.LOW}
}
# Set each pin as an output and make it low:
for pin in pins:
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, GPIO.LOW)
@app.route("/")
def main():
# For each pin, read the pin state and store it in the pins dictionary:
for pin in pins:
pins[pin]['state'] = GPIO.input(pin)
# Put the pin dictionary into the template data dictionary:
templateData = {
'pins' : pins
}
# Pass the template data into the template main.html and return it to the user
return render_template('main.html', **templateData)
# The function below is executed when someone requests a URL with the pin number and action in it:
@app.route("/<changePin>/<action>")
def action(changePin, action):
# Convert the pin from the URL into an integer:
changePin = int(changePin)
# Get the device name for the pin being changed:
deviceName = pins[changePin]['name']
# If the action part of the URL is "on," execute the code indented below:
if action == "on":
# Set the pin high:
GPIO.output(changePin, GPIO.HIGH)
# Save the status message to be passed into the template:
message = "Turned " + deviceName + " on."
if action == "off":
GPIO.output(changePin, GPIO.LOW)
message = "Turned " + deviceName + " off."
if action == "toggle":
# Read the pin and set it to whatever it isn't (that is, toggle it):
GPIO.output(changePin, not GPIO.input(changePin))
message = "Toggled " + deviceName + "."
# For each pin, read the pin state and store it in the pins dictionary:
for pin in pins:
pins[pin]['state'] = GPIO.input(pin)
# Along with the pin dictionary, put the message into the template data dictionary:
templateData = {
'message' : message,
'pins' : pins
}
return render_template('main.html', **templateData)
if __name__ == "__main__":
app.run(host='0.0.0.0', port=80, debug=True)
对于 main.htm 文件:
<!DOCTYPE html>
<head>
<title>Current Status</title>
</head>
<body>
<h1>Device Listing and Status</h1>
{% for pin in pins %}
<p>The {{ pins[pin].name }}
{% if pins[pin].state == true %}
is currently on (<a href="/{{pin}}/off">turn off</a>)
{% else %}
is currently off (<a href="/{{pin}}/on">turn on</a>)
{% endif %}
</p>
{% endfor %}
{% if message %}
<h2>{{ message }}</h2>
{% endif %}
</body>
</html>
上面代码的作用是,它允许用户访问 pi 的 Web 服务器并控制 GPIO 引脚,即打开或关闭它们。
目前,我有一个树莓派提供上述 html 文件供我的网络浏览器访问。然而,我想使用一个简单的安卓应用程序来实现同样的事情,即一个简单的切换按钮,它以某种方式打开或关闭引脚。
这是我的安卓应用程序代码。所有这个应用程序在屏幕中央都有一个简单的按钮,只是为了让我控制引脚。
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Switch
android:id="@+id/switch1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="8dp"
android:text="Switch"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
和java代码:
package com.example.testapp;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
谁能帮帮我?
解决方案
推荐阅读
- android - 在改变方向之前,带有 RecyclerView 的片段不会第二次显示
- javascript - 是否可以返回 json_encode() 但作为数组而不是对象,所以我可以轻松使用 `.filter()` 或 `.forEach()` 方法
- swift - 由于 403,GetStream 添加活动失败
- javascript - 在运行子事件之前删除事件
- php - 在带有 fpm 上游的 nginx 上显示 500 和错误而不是 502
- json - 如何将 Azure cosmos Db 中的非结构化 json 文件转换为结构化表?
- sql - 如何在具有“超出资源”问题的大型 BigQuery 表中连接和分组行
- python - numpy中的超对角非方阵?
- android - 如何在 Locale 上添加测试条件
- laravel - 执行查询后如何区分空集合和没有数据的集合