代码:Qt C++客户端采集的智能家居状态信息存储SQlite智能家居状态表Linux C服务器查看智能家居状态表最新的温度、湿度数据制定建议并通过TCPIP协议发送建议给客户端建议例如温度低于24摄氏度、湿度小于40大于70时服务器将发送空调温度过低建议提高温度至26℃;加湿器湿度过高或过低建议调整加湿器湿度给客户端客户端显示在GUI
以下是一个实现上述功能的示例代码:
客户端(Qt C++):
#include <QtWidgets>
#include <QTcpSocket>
class ClientWidget : public QWidget
{
Q_OBJECT
public:
ClientWidget(QWidget *parent = nullptr)
: QWidget(parent)
{
temperatureLabel = new QLabel("Temperature: ", this);
humidityLabel = new QLabel("Humidity: ", this);
suggestionLabel = new QLabel("Suggestion: ", this);
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(temperatureLabel);
layout->addWidget(humidityLabel);
layout->addWidget(suggestionLabel);
tcpSocket = new QTcpSocket(this);
connect(tcpSocket, &QTcpSocket::readyRead, this, &ClientWidget::readData);
tcpSocket->connectToHost("127.0.0.1", 12345);
}
private slots:
void readData()
{
QByteArray data = tcpSocket->readAll();
QString suggestion = QString::fromUtf8(data);
suggestionLabel->setText("Suggestion: " + suggestion);
}
private:
QLabel *temperatureLabel;
QLabel *humidityLabel;
QLabel *suggestionLabel;
QTcpSocket *tcpSocket;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
ClientWidget clientWidget;
clientWidget.show();
return a.exec();
}
服务器(Linux C):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define DATABASE_NAME "smart_home.db"
#define TCP_PORT 12345
int callback(void *data, int argc, char **argv, char **azColName)
{
int *temperature = (int *)data;
*temperature = atoi(argv[0]);
return 0;
}
void sendSuggestion(int clientSocket, int temperature, int humidity)
{
char suggestion[256];
memset(suggestion, 0, sizeof(suggestion));
if (temperature < 24)
{
snprintf(suggestion, sizeof(suggestion), "Air conditioner temperature is too low, suggest increasing temperature to 26°C");
}
else if (humidity < 40 || humidity > 70)
{
snprintf(suggestion, sizeof(suggestion), "Humidifier humidity is too low or too high, suggest adjusting humidifier humidity");
}
else
{
snprintf(suggestion, sizeof(suggestion), "No suggestion");
}
send(clientSocket, suggestion, strlen(suggestion), 0);
}
int main()
{
int serverSocket, clientSocket;
struct sockaddr_in serverAddr, clientAddr;
socklen_t addrLen = sizeof(struct sockaddr_in);
serverSocket = socket(AF_INET, SOCK_STREAM, 0);
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(TCP_PORT);
serverAddr.sin_addr.s_addr = INADDR_ANY;
bind(serverSocket, (struct sockaddr *)&serverAddr, sizeof(struct sockaddr));
listen(serverSocket, 5);
sqlite3 *db;
char *errMsg = 0;
if (sqlite3_open(DATABASE_NAME, &db) != SQLITE_OK)
{
printf("Cannot open database: %s\n", sqlite3_errmsg(db));
return 1;
}
while (1)
{
clientSocket = accept(serverSocket, (struct sockaddr *)&clientAddr, &addrLen);
printf("New client connected: %s\n", inet_ntoa(clientAddr.sin_addr));
int temperature = 0;
int rc = sqlite3_exec(db, "SELECT temperature FROM smart_home_status ORDER BY timestamp DESC LIMIT 1;", callback, &temperature, &errMsg);
if (rc != SQLITE_OK)
{
printf("SQL error: %s\n", errMsg);
sqlite3_free(errMsg);
}
int humidity = 0;
rc = sqlite3_exec(db, "SELECT humidity FROM smart_home_status ORDER BY timestamp DESC LIMIT 1;", callback, &humidity, &errMsg);
if (rc != SQLITE_OK)
{
printf("SQL error: %s\n", errMsg);
sqlite3_free(errMsg);
}
sendSuggestion(clientSocket, temperature, humidity);
close(clientSocket);
}
sqlite3_close(db);
return 0;
}
请注意,以上代码仅为示例,可能需要根据实际需求进行修改和完善。另外,服务器需要预先创建一个名为"smart_home.db"的SQLite数据库,并在其中创建一个名为"smart_home_status"的表,用于存储智能家居状态信息
原文地址: http://www.cveoy.top/t/topic/ivrB 著作权归作者所有。请勿转载和采集!