将数据从树莓派发送到服务器

时间:2021-03-07 14:50:29

标签: python mysql raspberry-pi3

我一直在研究这个项目,其中一部分包括从 Raspberry 向我的服务器发送一些数据。显示温度和湿度值。但我未能将它们发送到我的数据库。之前我用urllib2库做一个HTTP请求如下:

urllib2.urlopen("localhost/Project/add_data.phptemp="+temperature+"&hum="+humidity).read()

我曾经犯过错误。所以我试着用“请求”来代替。但是还是不行。

我试图将温度和湿度值从我的树莓派发送到我的数据库 sql 的服务器代码:

<?php 
    // Connect to MySQL
    include("connect.php");

    // Prepare the SQL statement
      //date_default_timezone_set('Europe/Athens');
     //$dateS = date('m/d/Y h:i:s', time());
    //echo $dateS;
    $temperature = htmlspecialchars($_GET["temperature"]);
    $humidity = htmlspecialchars($_GET["humidity"]);
    $SQL = "INSERT INTO measurementdb.data (temperature,humidity) VALUES (".$temperature."','".$humidity."')";     
    // Execute SQL statement
    mysql_query($SQL);
?>

python 代码:

import requests
import Adafruit_DHT 

DHT_SENSOR = Adafruit_DHT.DHT22
DHT_PIN = 4 
while True:
    humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN)
    if humidity is not None and temperature is not None:
        print("Temp={0:0.1f}*C  Humidity={1:0.1f}%".format(temperature, humidity))
    else:
        print("Failed to retrieve data from humidity sensor")

data = {"temperature": temperature, "humidity": humidity}
resp = requests.post('http://localhost/test.php', params=data)

如果有人能帮助我,我将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

您可能想澄清您的问题:

我假设上面的代码应该是服务器代码。

并在下面编写在树莓上运行的代码。

就像一个小的安全边注:

我不是 php 专家,但对我来说,服务器代码给人的印象是,它可能会受到 sql 注入的攻击。因此,如果我是对的,那么询问有关如何使您的服务器代码更健壮的 php 问题可能是个好主意。

SQL 注入意味着,黑客可以在您的服务器上执行任意 SQL 请求。即使是那些修改或删除数据的。

这里有一些信息:https://en.wikipedia.org/wiki/SQL_injection

潜在问题:params -> data

通常,您发布的数据应该在发布参数中,因此您应该使用 data=postparams 而不是 params=getparams

resp = requests.post('http://localhost/test.php', data=data)

而不是

resp = requests.post('http://localhost/test.php', params=data)

但是您展示的 PHP 代码确实使用了 $_GET 而不是 $_POST 这是故意的吗?

如果是,则继续使用 params=getparams 否则将您的 PHP 代码更改为 $_POST 并使用 data=postparams

潜在问题:数字与字符串 另一个问题是,温度和湿度可能是数字而不是字符串。

因此您可以尝试以下操作:

urllib2.urlopen("localhost/Project/add_data.php?temp="+str(emperature)+"&hum="+str(humidity)).read()

或请求:

data = {"temperature": str(temperature), "humidity": str(humidity)}

添加更多跟踪并发布精确输出 您还可以在 http 请求之前添加以下打印语句。并发布其输出: print(repr(temperature), repr(humidity))

而且我还建议将 http post 行替换为:

resp = requests.post('http://localhost/test.php', params=data)
print(resp)
print(resp.content)

将您的 PHP 脚本也更改为以下内容:

<?php 
    // Connect to MySQL
    include("connect.php");

    // Prepare the SQL statement
      //date_default_timezone_set('Europe/Athens');
    $dateS = date('m/d/Y h:i:s', time());
    echo "{$dateS}\n";
    $temperature = htmlspecialchars($_GET["temperature"]);
    echo "{$temperature}\n";
    $humidity = htmlspecialchars($_GET["humidity"]);
    echo "{$humidity}\n";
    $SQL = "INSERT INTO measurementdb.data (temperature,humidity) VALUES (".$temperature."','".$humidity."')";     
    // Execute SQL statement
    echo "{$SQL}\n";
    $rslt = mysql_query($SQL);
    echo "{$rslt}\n";
?>

请发布您的python脚本的打印结果和任何潜在的错误信息