Ubuntu C++进行物联网开发的完整流程
一、开发环境准备
在Ubuntu系统上进行C++物联网开发,需先配置基础工具链与依赖库,确保具备编译、调试及网络通信能力。
- 安装基础开发工具:通过以下命令安装GCC编译器、CMake构建工具、Git版本控制及文本编辑器(如vim):
sudo apt-get update sudo apt-get install build-essential cmake git vim - 安装网络与数据库依赖:物联网设备需通过网络传输数据,同时可能需要本地存储,安装Mosquitto(MQTT代理)、SQLite(轻量级数据库)及libcurl(HTTP通信):
sudo apt-get install mosquitto mosquitto-clients libcurl4-openssl-dev libsqlite3-dev - 配置交叉编译工具链(可选):若目标设备为ARM架构(如树莓派、工业网关),需安装对应交叉编译工具链(以ARM 32位为例):
安装后可通过sudo apt-get install gcc-arm-linux-gnueabi g++-arm-linux-gnueabiarm-linux-gnueabi-gcc --version验证工具链是否可用。
二、选择物联网通信协议与C++库
物联网设备的核心是设备间通信,C++生态中有成熟的协议库支持,其中MQTT(轻量级发布/订阅协议)是最常用的选择。
- 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负责数据本地存储。
四、核心功能实现
1. 传感器数据采集
通过继承抽象接口实现具体传感器(如温度、湿度),模拟或调用硬件接口读取数据:
// include/sensor.h
class ISensor {
public:
virtual ~ISensor() = default;
virtual float read() = 0; // 纯虚函数,子类必须实现
};
// src/sensor.cpp
#include "sensor.h"
#include
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);
}
};
2. MQTT通信实现
使用Paho MQTT C++库实现设备与云端的双向通信(发布传感器数据、订阅控制指令):
// include/mqtt_client.h
#include
#include
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();
}
3. 本地数据存储
使用SQLite数据库存储传感器历史数据,便于后续分析与可视化:
// include/database.h
#include
#include
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
#include
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构建项目,生成可执行文件并运行:
- 编写CMakeLists.txt:
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
七、扩展与优化方向
- 边缘计算:在设备端增加数据处理逻辑(如数据过滤、异常检测),减少云端压力;
- 安全性增强:使用TLS/SSL加密MQTT通信,实现设备身份认证(如X.509证书);
- GUI集成:使用Qt或LittlevGL开发本地监控界面,实时显示传感器数据;
- 多设备支持:扩展MQTT订阅功能,实现设备间的联动控制(如温度过高时关闭继电器)。
以上就是关于“Ubuntu C++如何进行物联网开发”的相关介绍,筋斗云是国内较早的云主机应用的服务商,拥有10余年行业经验,提供丰富的云服务器、租用服务器等相关产品服务。云服务器资源弹性伸缩,主机vCPU、内存性能强悍、超高I/O速度、故障秒级恢复;电子化备案,提交快速,专业团队7×24小时服务支持!
简单好用、高性价比云服务器租用链接:https://www.jindouyun.cn/product/cvm