代码:linux C环境的服务器将SQLite智能家居状态表中的温度、湿度数据制成直线图传送Qt C++环境下的客户端客户端接收后显示在GUI上。
以下是一个示例代码,展示了如何在Linux C环境的服务器中将SQLite智能家居状态表中的温度、湿度数据制成直线图,并传送到Qt C++环境下的客户端,客户端接收后显示在GUI上。
服务器端(Linux C环境):
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <string.h>
#define DB_PATH "/path/to/database.db"
#define PORT 5000
typedef struct {
double temperature;
double humidity;
} SensorData;
void send_data(int client_socket, SensorData data) {
char buffer[256];
sprintf(buffer, "%f,%f", data.temperature, data.humidity);
send(client_socket, buffer, strlen(buffer), 0);
}
static int callback(void *data, int argc, char **argv, char **az_col_name){
SensorData *sensor_data = (SensorData *)data;
sensor_data->temperature = atof(argv[0]);
sensor_data->humidity = atof(argv[1]);
return 0;
}
int main() {
sqlite3 *db;
char *zErrMsg = 0;
int rc;
char *sql;
SensorData sensor_data;
// Open database
rc = sqlite3_open(DB_PATH, &db);
if (rc) {
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
return rc;
}
// Create server socket
int server_socket, client_socket;
struct sockaddr_in server_address, client_address;
int address_length = sizeof(server_address);
server_socket = socket(AF_INET, SOCK_STREAM, 0);
if (server_socket == -1) {
perror("Socket creation failed");
return -1;
}
server_address.sin_family = AF_INET;
server_address.sin_port = htons(PORT);
server_address.sin_addr.s_addr = INADDR_ANY;
// Bind the socket to the specified IP and port
if (bind(server_socket, (struct sockaddr *)&server_address, sizeof(server_address)) < 0) {
perror("Bind failed");
return -1;
}
// Listen for incoming connections
if (listen(server_socket, 1) < 0) {
perror("Listen failed");
return -1;
}
printf("Server listening on port %d...\n", PORT);
// Accept the connection from the client
client_socket = accept(server_socket, (struct sockaddr *)&client_address, (socklen_t *)&address_length);
if (client_socket < 0) {
perror("Accept failed");
return -1;
}
// Query the database for sensor data and send it to the client
while (1) {
sql = "SELECT temperature, humidity FROM sensor_data ORDER BY timestamp DESC LIMIT 1";
rc = sqlite3_exec(db, sql, callback, (void *)&sensor_data, &zErrMsg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
}
send_data(client_socket, sensor_data);
sleep(1); // Delay for 1 second before sending the next data
}
// Close the socket and database connection
close(client_socket);
close(server_socket);
sqlite3_close(db);
return 0;
}
客户端(Qt C++环境):
#include <QtWidgets>
#include <QtNetwork>
class Client : public QWidget {
Q_OBJECT
public:
Client(QWidget *parent = nullptr) : QWidget(parent) {
setWindowTitle("Smart Home Data");
lineEditTemperature = new QLineEdit(this);
lineEditHumidity = new QLineEdit(this);
QPushButton *buttonConnect = new QPushButton("Connect", this);
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(new QLabel("Temperature:", this));
layout->addWidget(lineEditTemperature);
layout->addWidget(new QLabel("Humidity:", this));
layout->addWidget(lineEditHumidity);
layout->addWidget(buttonConnect);
setLayout(layout);
connect(buttonConnect, &QPushButton::clicked, this, &Client::connectToServer);
}
private slots:
void connectToServer() {
socket = new QTcpSocket(this);
connect(socket, &QTcpSocket::connected, this, &Client::onConnected);
connect(socket, &QTcpSocket::disconnected, this, &Client::onDisconnected);
connect(socket, &QTcpSocket::readyRead, this, &Client::onReadyRead);
socket->connectToHost("localhost", 5000);
}
void onConnected() {
qDebug() << "Connected to server";
}
void onDisconnected() {
qDebug() << "Disconnected from server";
}
void onReadyRead() {
QByteArray data = socket->readAll();
QString strData = QString::fromUtf8(data);
QStringList sensorData = strData.split(",");
if (sensorData.length() == 2) {
lineEditTemperature->setText(sensorData[0]);
lineEditHumidity->setText(sensorData[1]);
}
}
private:
QLineEdit *lineEditTemperature;
QLineEdit *lineEditHumidity;
QTcpSocket *socket;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
Client client;
client.show();
return app.exec();
}
#include "main.moc"
请确保正确设置数据库路径(#define DB_PATH "/path/to/database.db")和服务器的端口号(#define PORT 5000)。
此示例代码中,服务器端使用sqlite3库查询数据库中最新的温度和湿度数据,然后将其发送给客户端。客户端使用Qt网络库连接到服务器,并接收服务器发送的数据,然后在GUI上显示温度和湿度数据。
请注意,此示例代码仅提供参考,实际应用中可能需要根据具体需求进行修改和优化
原文地址: http://www.cveoy.top/t/topic/ivqo 著作权归作者所有。请勿转载和采集!