在Ubuntu系统上进行C++物联网开发,需先配置基础工具链与依赖库,确保具备编译、调试及网络通信能力。
sudo apt-get update
sudo apt-get install build-essential cmake git vim
sudo apt-get install mosquitto mosquitto-clients libcurl4-openssl-dev libsqlite3-dev
sudo apt-get install gcc-arm-linux-gnueabi g++-arm-linux-gnueabi
安装后可通过arm-linux-gnueabi-gcc --version验证工具链是否可用。物联网设备的核心是设备间通信,C++生态中有成熟的协议库支持,其中MQTT(轻量级发布/订阅协议)是最常用的选择。
Paho MQTT C++库,它提供了线程安全、支持异步操作的API,适合嵌入式场景。通过以下命令安装:sudo apt-get install libpaho-mqttpp3-dev libpaho-mqtt3a-dev
libmodbus(Modbus RTU/TCP);若需HTTP通信,可使用libcurl。合理的C++项目结构能提升代码可维护性,典型的物联网项目结构如下:
iot_project/
├── CMakeLists.txt # CMake构建配置文件
├── include/ # 头文件目录
│ ├── sensor.h # 传感器抽象接口
│ ├── mqtt_client.h # MQTT客户端封装
│ └── database.h # 数据库操作接口
├── src/ # 源代码目录
│ ├── sensor.cpp # 温度/湿度传感器实现
│ ├── mqtt_client.cpp # MQTT客户端实现
│ └── database.cpp # SQLite数据库操作
└── main.cpp # 主程序入口
其中,sensor.h定义传感器抽象接口(如read()方法),mqtt_client.h封装MQTT连接与消息发布逻辑,database.h负责数据本地存储。
通过继承抽象接口实现具体传感器(如温度、湿度),模拟或调用硬件接口读取数据:
// include/sensor.h
class ISensor {
public:
virtual ~ISensor() = default;
virtual float read() = 0; // 纯虚函数,子类必须实现
};
// src/sensor.cpp
#include "sensor.h"
#include <random>
class TemperatureSensor : public ISensor {
public:
float read() override {
// 模拟读取20.0~30.0℃之间的温度
static std::random_device rd;
static std::mt19937 gen(rd());
static std::uniform_real_distribution<> dis(20.0, 30.0);
return dis(gen);
}
};
使用Paho MQTT C++库实现设备与云端的双向通信(发布传感器数据、订阅控制指令):
// include/mqtt_client.h
#include <mqtt/async_client.h>
#include <string>
class MQTTClient {
public:
MQTTClient(const std::string& broker_url, const std::string& client_id);
void connect();
void publish(const std::string& topic, const std::string& payload);
void subscribe(const std::string& topic);
private:
std::string broker_url_;
std::string client_id_;
mqtt::async_client client_;
void on_connect(const mqtt::token& tok) { /* 连接回调 */ }
void on_publish(const mqtt::token& tok) { /* 发布回调 */ }
};
// src/mqtt_client.cpp
#include "mqtt_client.h"
MQTTClient::MQTTClient(const std::string& broker_url, const std::string& client_id)
: broker_url_(broker_url), client_id_(client_id), client_(broker_url) {}
void MQTTClient::connect() {
mqtt::connect_options connOpts;
connOpts.set_keep_alive_interval(20);
connOpts.set_clean_session(true);
client_.connect(connOpts)->wait_for_completion();
}
void MQTTClient::publish(const std::string& topic, const std::string& payload) {
mqtt::message_ptr pubmsg = mqtt::make_message(topic, payload);
client_.publish(pubmsg)->wait_for_completion();
}
使用SQLite数据库存储传感器历史数据,便于后续分析与可视化:
// include/database.h
#include <sqlite3.h>
#include <string>
class Database {
public:
Database(const std::string& db_path);
~Database();
bool insert_sensor_data(const std::string& sensor_name, float value);
private:
sqlite3* db_;
void execute_sql(const std::string& sql);
};
// src/database.cpp
#include "database.h"
Database::Database(const std::string& db_path) {
if (sqlite3_open(db_path.c_str(), &db_) != SQLITE_OK) {
throw std::runtime_error("Failed to open database");
}
execute_sql("CREATE TABLE IF NOT EXISTS sensor_data (id INTEGER PRIMARY KEY AUTOINCREMENT, "
"sensor_name TEXT, value REAL, timestamp DATETIME DEFAULT CURRENT_TIMESTAMP)");
}
bool Database::insert_sensor_data(const std::string& sensor_name, float value) {
std::string sql = "INSERT INTO sensor_data (sensor_name, value) VALUES ('" + sensor_name + "', " + std::to_string(value) + ")";
execute_sql(sql);
return true;
}
将传感器采集、MQTT通信、数据库存储整合到主程序,实现“采集-存储-上传”的完整流程:
// main.cpp
#include "sensor.h"
#include "mqtt_client.h"
#include "database.h"
#include <chrono>
#include <thread>
int main() {
// 初始化组件
TemperatureSensor temp_sensor;
MQTTClient mqtt_client("tcp://broker.hivemq.com:1883", "ubuntu_cpp_iot_device");
Database db("./sensor_data.db");
mqtt_client.connect();
while (true) {
// 采集传感器数据
float temperature = temp_sensor.read();
// 存储到本地数据库
db.insert_sensor_data("temperature", temperature);
// 发布到MQTT主题
mqtt_client.publish("iot/temperature", std::to_string(temperature));
// 每5秒采集一次
std::this_thread::sleep_for(std::chrono::seconds(5));
}
return 0;
}
使用CMake构建项目,生成可执行文件并运行:
cmake_minimum_required(VERSION 3.5)
project(iot_project)
set(CMAKE_CXX_STANDARD 17)
# 查找依赖库
find_package(PahoMqttCpp REQUIRED)
find_package(SQLite3 REQUIRED)
# 添加可执行文件
add_executable(iot_device
src/main.cpp
src/sensor.cpp
src/mqtt_client.cpp
src/database.cpp
)
# 链接库
target_link_libraries(iot_device
PahoMqttCpp::paho-mqttpp3
PahoMqttCpp::paho-mqtt3a
SQLite3::SQLite3
)
mkdir build && cd build
cmake ..
make
./iot_device