【问题标题】:Sending data from Raspberry to Server从树莓派发送数据到服务器
【发布时间】:2021-03-07 14:50:29
【问题描述】:

我一直在从事这个项目,其中一个部分包括将一些数据从 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)

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

【问题讨论】:

  • 警告: mysql_* 扩展自 PHP 5.5.0 起已弃用,自 PHP 7.0.0 起已被删除。相反,应该使用mysqliPDO_MySQL 扩展名。在选择 MySQL API 时,另请参阅 MySQL API Overview 以获得更多帮助。

标签: python mysql raspberry-pi3


【解决方案1】:

您可能想澄清您的问题:

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

下面是运行在树莓上的代码。

作为一个小小的安全说明:

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

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

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

潜在问题:参数 -> 数据

通常,您发布的数据应该在帖子参数中,因此您应该使用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)+"&amp;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 脚本的打印结果和任何潜在的错误消息

【讨论】:

  • 确实,这是我试图将温度和湿度值从我的树莓派发送到我的数据库 sql 的服务器代码。我忘了删除两个未使用的变量 posl、posL。但是,即使我删除了它们。它仍然无法正常工作。显示温度和湿度值。但我未能将它们发送到我的数据库。在我使用 urllib2 库执行如下 HTTP 请求之前:urllib2.urlopen("localhost/Project/add_data.php?temp="+temperature+"&amp;hum="+humidity).read() 并且我曾经得到错误。所以我尝试使用 request 来代替。
  • 我增强了我的答案,因为python代码中也有一个错误,我之前没有提到
  • 事实上我是正确的。对于您的代码,您应该使用 params 而不是 data,尽管使用 get params 发布数据相当不寻常
  • urllib2.urlopen("localhost/Project/add_data.php?temp="+temperature+"&hum="+humanity).read() 可能不起作用,因为温度和湿度可能不是字符串, 但整数或浮点数。你可以试试: urllib2.urlopen("localhost/Project/add_data.php?temp="+str(emperature)+"&hum="+str(humanity)).read()
  • 我建议你编辑你的问题,我编辑我的答案。对于这个问题的未来查看者来说,您发布错误的 PHP 代码这一事实并不真正令人感兴趣。因此,您可以更正 PHP 代码,并且我会从我的答案中删除提及错误的服务器代码。如果您不知道如何编辑问题,我可以为您完成
猜你喜欢
  • 2015-01-10
  • 1970-01-01
  • 2021-02-06
  • 1970-01-01
  • 2016-12-07
  • 2017-09-01
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多