一. 更改方式
之前项目是直接连接MySQL,现在先与服务器上脚本交互,再实现与数据库的交互。脚本使用PHP语言编写。
.php是PHP文件的扩展名,PHP是一种广泛使用的服务器端脚本语言,主要用于创建动态网页和Web应用程序。
下面这段PHP代码定义了一个用于操作MySQL数据库的类Mysqlmethod
属性:
protected $mysql_server_name
:数据库服务器的主机名,这里设置为localhost
。protected $mysql_username
:用于连接数据库的用户名,这里是plantuser
。protected $mysql_password
:用于连接数据库的密码,这里是plantpsw
。protected $mysql_database
:要连接的数据库名称,这里是plantfactory
。protected $mysql_conn
:用于保存数据库连接的变量。
这个Mysqlmethod封装了连接MySQL数据库和执行SQL查询的基本操作,构造函数负责初始化数据库连接,析构函数确保在对象销毁时关闭数据库连接,防止连接泄露,dosqlad方法用于执行SQL查询,并返回查询结果或false
<?php
/**
* mysql method
* mysql-action-sdk
*/
class Mysqlmethod
{
protected $mysql_server_name='localhost';
protected $mysql_username='plantuser';
protected $mysql_password='plantpsw';
protected $mysql_database='plantfactory';
protected $mysql_conn;
public function __construct()
{
$this->mysql_conn=mysqli_connect($this->mysql_server_name,$this->mysql_username,$this->mysql_password,$this->mysql_database);
}
public function __destruct()
{
if($this->mysql_conn)
{
mysqli_close($this->mysql_conn);
}
}
public function dosqlad($sql)
{
if($this->mysql_conn)
{
$result = mysqli_query($this->mysql_conn,$sql);
return $result;
}
return false;
}
}
?>
二. python使用PHP提供的接口
import requests
DEVICEID = "14521d4b0142623100005c0000000000"
'''get box cmd api, if success, response is 200'''
#response=requests.get('http://www.deepplanting.com/box/api/get/getboxcmd/'+DEVICEID)
#print(response,response.text)
'''get box status api, if success, response is 200'''
#response=requests.get('http://www.deepplanting.com/box/api/get/getboxstatus/'+DEVICEID)
#print(response,response.text)
'''send sendboxcmd api, if success, response is 201'''
#params={'timestamp':122,'mode':0,'watering':0,'lighting':0,'ventilating':1,'heating':0,'warming':0,'cooling':1}
#response=requests.post('http://www.deepplanting.com/box/api/post/sendboxcmd/'+DEVICEID,json=params)
#print(response,response.text)
'''send sendboxstatus api, if success, response is 201'''
params={'timestamp':122,'temper':35.5,'humidity':21.1,'co2':0,'lux':1,'panpos':0,'waterpos':0}
response=requests.post('http://www.deepplanting.com/box/api/post/sendboxstatus/'+DEVICEID,json=params)
print(response,response.text)
三. QT使用PHP提供的接口
可以通过 **QNetworkAccessManager
**类来发起 HTTP 请求。
3.1 发送GET请求
- 创建一个
QUrl
对象,指定请求的 URL。 - 创建一个
QNetworkRequest
对象,并设置请求的 URL。 - 使用
QNetworkAccessManager
的get
方法发送 GET 请求。 connect
语句将QNetworkReply
对象的finished
信号连接到onGetFinished
槽函数,这样当 GET 请求完成时会调用onGetFinished
方法处理响应。
3.2 发送POST请求
- 创建一个
QUrl
对象,指定 POST 请求的 URL。 - 创建一个
QNetworkRequest
对象,并设置请求的 URL。 - 使用
setHeader
方法设置请求头Content-Type
为application/json
,表示请求数据是 JSON 格式。
3.3 构建JSON数据
- 使用
QJsonObject
创建 JSON 数据对象,并设置相应的键值对。 - 创建一个
QJsonObject
对象airCondition
,设置其属性,并将其添加到主jsonObject
中。 - 使用
QJsonDocument
将QJsonObject
转换为 JSON 文档。 - 使用
toJson
方法将 JSON 文档转换为字节数组postData
,准备发送 POST 请求的数据。
3.4 发送Post请求
- 使用
QNetworkAccessManager
的post
方法发送 POST 请求,并传递 JSON 数据。 - 将
QNetworkReply
对象的finished
信号连接到onPostFinished
槽函数,这样当 POST 请求完成时会调用onPostFinished
方法处理响应。
在GET请求中,URL通常包含了请求的资源地址 ,而实际要传递给服务器的参数则通过URL中的查询字符串部分传递。
class MyNetworkManager : public QObjec
{
public:
MyNetworkManager(QObject *parent = nullptr) : QObject(parent)
{
manager = new QNetworkAccessManager(this);
// 示例:发送 GET 请求
QUrl url("http://plant.alienhand.cn/open/v2/getstate/00000000dd22ffee");
QNetworkRequest request(url);
QNetworkReply *reply = manager->get(request);
connect(reply, &QNetworkReply::finished, this, &MyNetworkManager::onGetFinished);
// 示例:发送 POST 请求
QUrl postUrl("http://plant.alienhand.cn/open/v2/sendcmd/00000000dd22ffee");
QNetworkRequest postRequest(postUrl);
postRequest.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
QJsonObject jsonObject;
jsonObject["led"] = 0;
jsonObject["watering"] = 0;
jsonObject["wind"] = 0;
jsonObject["curtainS"] = true;
jsonObject["curtainN"] = true;
jsonObject["co2"] = false;
jsonObject["pi"] = false;
jsonObject["fert"] = false;
jsonObject["phvalve"] = false;
QJsonObject airCondition;
airCondition["mode"] = 0;
airCondition["temperature"] = 25;
airCondition["isOn"] = true;
jsonObject["aircondition"] = airCondition;
QJsonDocument jsonDoc(jsonObject);
QByteArray postData = jsonDoc.toJson();
QNetworkReply *postReply = manager->post(postRequest, postData);
connect(postReply, &QNetworkReply::finished, this, &MyNetworkManager::onPostFinished);
}
private slots:
void onGetFinished()
{
QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());
if (reply)
{
qDebug() << "GET response:" << reply->readAll();
reply->deleteLater();
}
}
void onPostFinished()
{
QNetworkReply *reply = qobject_cast<QNetworkReply *>(sender());
if (reply)
{
qDebug() << "POST response:" << reply->readAll();
reply->deleteLater();
}
}
private:
QNetworkAccessManager *manager;
};
四. 注意
要通过 HTTP 访问 PHP 文件,你需要将 PHP 文件放置在 Web 服务器能够访问的目录中,并确保 Web 服务器的配置正确。
.htaccess
文件包含了 URL 重写规则
[root@iZuf62h8v3r43nr8q9yb5tZ /]# vim ./var/www/deepplanting/web/.htaccess
# 开启 rewrite 功能
#Options +FollowSymlinks
RewriteEngine on
# 重写规则
RewriteRule ^box/api/get/([A-Za-z0-9]+)/([A-Za-z0-9]+) box/api/v1/get.php?method=$1&sign=$2 [nc,qsa]
RewriteRule ^box/api/post/([A-Za-z0-9]+)/([A-Za-z0-9]+) box/api/v1/post.php?method=$1&sign=$2 [nc,qsa]
~
也可以用nginx1.conf文件
location /box/api/get/ {
rewrite ^/box/api/get/([A-Za-z0-9]+)/([A-Za-z0-9]+)$ /box/api/v1/get.php?method=$1&sign=$2 last;
}
location /box/api/post/ {
rewrite ^/box/api/post/([A-Za-z0-9]+)/([A-Za-z0-9]+)$ /box/api/v1/post.php?method=$1&sign=$2 last;
}