一、物联网系统架构设计
1. 典型物联网分层架构
层级 | 组件示例 | C语言适用场景 |
感知层 | 传感器/执行器 | 嵌入式驱动开发 |
网络层 | LoRa/WiFi/BLE模块 | 协议栈移植与优化 |
边缘计算层 | 网关设备 | 数据预处理与协议转换 |
平台层 | 云平台对接 | REST客户端/MQTT实现 |
应用层 | 业务逻辑 | 算法实现与系统集成 |
2. 硬件选型参考
常见IoT开发板对比:
- ESP32:集成WiFi/BLE,适合快速原型开发
- STM32U5:超低功耗,适合电池供电场景
- Raspberry Pi Pico:低成本,丰富外设接口
- Nordic nRF52:专为BLE设计,低功耗优化
二、传感器数据采集
1. 多传感器融合框架
typedef struct {float temperature;float humidity;uint16_t light;motion_state_t motion;timestamp_t timestamp;
} sensor_data_t;void sensor_poll_thread(void *arg) {sensor_data_t *data = (sensor_data_t *)arg;while (1) {data->timestamp = get_current_timestamp();data->temperature = read_i2c_sensor(TEMP_SENSOR_ADDR);data->humidity = read_spi_sensor(HUMIDITY_CS_PIN);data->light = read_adc(LIGHT_SENSOR_CH);data->motion = check_motion_sensor();notify_data_ready();sleep(POLL_INTERVAL);}
}
2. 低功耗采集策略
void low_power_polling(void) {while (1) {// 唤醒外设power_on_sensors();delay_ms(10); // 稳定时间// 快速采集take_sensor_readings();// 关闭外设power_off_sensors();// 进入深度睡眠enter_stop_mode(RTC_WAKEUP, SENSOR_INTERVAL);}
}void enter_stop_mode(uint32_t wakeup_source, uint32_t ms) {HAL_SuspendTick();HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);SystemClock_Config(); // 唤醒后重新配置时钟HAL_ResumeTick();
}
三、无线通信协议实现
1. LoRaWAN节点实现
// LoRaMAC回调函数
static void lora_event_cb(lorawan_event_t event) {switch (event) {case LORAWAN_EVENT_JOIN_SUCCESS:printf("Joined network successfully\n");start_application();break;case LORAWAN_EVENT_TX_COMPLETE:printf("Message sent\n");break;case LORAWAN_EVENT_RX_DATA:printf("Received %d bytes\n", lora_rx_size);process_downlink(lora_rx_buffer, lora_rx_size);break;}
}void send_lora_message(uint8_t *data, size_t len) {if (lorawan_send(data, len, MSG_UNCONFIRMED)) {printf("Send request failed\n");}
}void lorawan_init(void) {lorawan_params_t params = {.dev_eui = "0011223344556677",.app_eui = "0000000000000000",.app_key = "00112233445566778899AABBCCDDEEFF",.event_cb = lora_event_cb,.adr_enabled = true,.tx_power = 14,.data_rate = DR_3};lorawan_init(¶ms);lorawan_join();
}
2. BLE Beacon广播
#include "ble_advdata.h"void ble_beacon_init(void) {ble_gap_adv_params_t adv_params = {.properties.type = BLE_GAP_ADV_TYPE_NONCONNECTABLE_NONSCANNABLE_UNDIRECTED,.interval = MSEC_TO_UNITS(1000, UNIT_0_625_MS),.duration = 0, // 持续广播};ble_advdata_manuf_data_t manuf_data = {.company_identifier = 0xFFFF, // 测试厂商ID.data.p_data = (uint8_t[]){0x01,0x02,0x03,0x04},.data.size = 4};ble_advdata_t adv_data = {.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE,.p_manuf_specific_data = &manuf_data,};sd_ble_gap_adv_set_configure(NULL, &adv_data, &adv_params);sd_ble_gap_adv_start(m_adapter, BLE_GAP_ADV_START_DEFAULT);
}
四、边缘计算处理
1. 传感器数据预处理
#define WINDOW_SIZE 5typedef struct {float buffer[WINDOW_SIZE];uint8_t index;float sum;
} moving_average_t;float update_moving_average(moving_average_t *ma, float new_value) {ma->sum -= ma->buffer[ma->index];ma->sum += new_value;ma->buffer[ma->index] = new_value;ma->index = (ma->index + 1) % WINDOW_SIZE;return ma->sum / WINDOW_SIZE;
}void process_sensor_data(sensor_data_t *raw, processed_data_t *out) {static moving_average_t temp_ma = {0};static moving_average_t humi_ma = {0};out->timestamp = raw->timestamp;out->temperature = update_moving_average(&temp_ma, raw->temperature);out->humidity = update_moving_average(&humi_ma, raw->humidity);out->light_level = classify_light(raw->light);out->motion_detected = (raw->motion > THRESHOLD);if (out->temperature > ALERT_THRESHOLD) {trigger_alert(TEMP_ALERT);}
}
2. 本地决策引擎
typedef enum {STATE_NORMAL,STATE_WARNING,STATE_ALERT,STATE_CRITICAL
} system_state_t;system_state_t evaluate_system_state(processed_data_t *data) {static system_state_t current_state = STATE_NORMAL;// 状态转换逻辑switch (current_state) {case STATE_NORMAL:if (data->temperature > WARNING_THRESHOLD) {current_state = STATE_WARNING;}break;case STATE_WARNING:if (data->temperature > ALERT_THRESHOLD) {current_state = STATE_ALERT;} else if (data->temperature < WARNING_THRESHOLD - HYSTERESIS) {current_state = STATE_NORMAL;}break;// 其他状态处理...}return current_state;
}
五、云平台对接
1. MQTT客户端实现
#include "MQTTClient.h"void mqtt_message_handler(MessageData *data) {printf("Topic: %.*s\n", data->topicName->lenstring.len, data->topicName->lenstring.data);printf("Message: %.*s\n", data->message->payloadlen,(char *)data->message->payload);
}int mqtt_connect(void) {Network network;MQTTClient client;NetworkInit(&network);MQTTClientInit(&client, &network, 3000, mqtt_send_buf, sizeof(mqtt_send_buf),mqtt_recv_buf, sizeof(mqtt_recv_buf));int rc = NetworkConnect(&network, MQTT_BROKER, MQTT_PORT);if (rc != 0) return rc;MQTTPacket_connectData connectData = MQTTPacket_connectData_initializer;connectData.MQTTVersion = 3;connectData.clientID.cstring = DEVICE_ID;connectData.username.cstring = MQTT_USER;connectData.password.cstring = MQTT_PASS;connectData.keepAliveInterval = 60;if ((rc = MQTTConnect(&client, &connectData)) != SUCCESS)return rc;// 订阅主题if ((rc = MQTTSubscribe(&client, "device/command", QOS1, mqtt_message_handler)) != SUCCESS)return rc;return 0;
}void mqtt_publish(const char *topic, const char *payload) {MQTTMessage message;message.qos = QOS1;message.retained = 0;message.payload = (void *)payload;message.payloadlen = strlen(payload);MQTTPublish(&client, topic, &message);
}
2. 数据格式设计
JSON序列化示例:
#include "cJSON.h"char *build_telemetry_json(sensor_data_t *data) {cJSON *root = cJSON_CreateObject();cJSON_AddNumberToObject(root, "temp", data->temperature);cJSON_AddNumberToObject(root, "humi", data->humidity);cJSON_AddNumberToObject(root, "light", data->light);cJSON_AddStringToObject(root, "timestamp", format_timestamp(data->timestamp));char *json_str = cJSON_PrintUnformatted(root);cJSON_Delete(root);return json_str;
}// 使用示例
char *json = build_telemetry_json(&sensor_data);
mqtt_publish("device/telemetry", json);
free(json);
六、安全机制实现
1. 安全启动流程
bool verify_firmware(void) {// 加载公钥ecc_key pub_key;load_public_key(&pub_key, PUBLIC_KEY_DER, sizeof(PUBLIC_KEY_DER));// 读取固件签名uint8_t signature[64];read_flash(SIGNATURE_OFFSET, signature, sizeof(signature));// 计算固件哈希uint8_t hash[32];sha256_hash(FIRMWARE_START, FIRMWARE_SIZE, hash);// 验证ECDSA签名return ecdsa_verify(hash, sizeof(hash), signature, &pub_key) == 0;
}void boot_loader(void) {if (!verify_firmware()) {trigger_secure_boot_failure();while(1);}jump_to_application();
}
2. 安全通信加密
#include "mbedtls/aes.h"void encrypt_payload(uint8_t *input, size_t len, uint8_t *output) {mbedtls_aes_context aes;uint8_t iv[16] = {0}; // 实际项目应使用随机IVmbedtls_aes_setkey_enc(&aes, ENCRYPTION_KEY, 256);mbedtls_aes_crypt_cbc(&aes, MBEDTLS_AES_ENCRYPT, len, iv, input, output);mbedtls_aes_free(&aes);
}void decrypt_payload(uint8_t *input, size_t len, uint8_t *output) {mbedtls_aes_context aes;uint8_t iv[16] = {0}; // 需与加密时IV相同mbedtls_aes_setkey_dec(&aes, ENCRYPTION_KEY, 256);mbedtls_aes_crypt_cbc(&aes, MBEDTLS_AES_DECRYPT, len, iv, input, output);mbedtls_aes_free(&aes);
}
七、低功耗优化
1. 电源状态管理
typedef enum {POWER_MODE_ACTIVE,POWER_MODE_LOW_POWER,POWER_MODE_SLEEP,POWER_MODE_DEEP_SLEEP
} power_mode_t;void set_power_mode(power_mode_t mode) {switch (mode) {case POWER_MODE_ACTIVE:// 启用所有外设enable_peripherals(true);set_cpu_clock(CLOCK_MAX);break;case POWER_MODE_LOW_POWER:// 关闭非必要外设disable_non_critical_peripherals();set_cpu_clock(CLOCK_LOW);break;case POWER_MODE_DEEP_SLEEP:// 配置唤醒源configure_wakeup_sources();// 进入待机模式HAL_PWR_EnterSTANDBYMode();break;}
}
2. 事件驱动调度
typedef struct {event_type_t type;uint32_t timeout;event_handler_t handler;
} event_t;void event_loop(void) {while (1) {event_t next_event = get_next_event();switch (next_event.type) {case EVENT_SENSOR_READ:read_sensors();break;case EVENT_NETWORK_TX:transmit_data();break;case EVENT_TIMEOUT:handle_timeout();break;}// 计算剩余电量并调整策略adjust_power_strategy(get_battery_level());// 进入低功耗模式等待下次事件enter_low_power_mode(next_event.timeout);}
}
八、OTA固件更新
1. 差分更新实现
#define FLASH_PAGE_SIZE 2048int apply_delta_update(uint8_t *delta, size_t delta_len) {// 初始化bsdiffstruct bsdiff_stream stream = {.read = flash_read_callback,.write = flash_write_callback,.seek = flash_seek_callback};// 在新区域应用补丁if (bspatch(&stream) != 0) {rollback_update();return -1;}// 验证新固件if (!verify_new_firmware()) {rollback_update();return -1;}// 切换启动分区switch_boot_partition();return 0;
}void flash_write_callback(struct bsdiff_stream *stream, const void *buffer, int size) {static uint32_t offset = NEW_FW_BASE;flash_program(offset, buffer, size);offset += size;
}
2. 安全更新流程
void ota_update_handler(uint8_t *data, size_t len) {ota_header_t *header = (ota_header_t *)data;// 验证固件签名if (!verify_signature(header->signature, data + sizeof(ota_header_t), header->fw_size)) {send_ota_response(OTA_STATUS_SIGNATURE_FAIL);return;}// 检查版本if (header->version <= get_current_version()) {send_ota_response(OTA_STATUS_OLD_VERSION);return;}// 写入更新区if (write_to_update_partition(data + sizeof(ota_header_t), header->fw_size) != 0) {send_ota_response(OTA_STATUS_WRITE_FAIL);return;}// 设置更新标志set_boot_flag(BOOT_TO_UPDATE);send_ota_response(OTA_STATUS_SUCCESS);// 重启设备NVIC_SystemReset();
}
九、物联网协议栈移植
1. CoAP协议实现
#include "coap.h"void coap_server_init(void) {coap_context_t *ctx = coap_new_context(NULL);coap_address_t addr = {.addr = { .sin = { .sin_family = AF_INET,.sin_port = htons(COAP_PORT),.sin_addr.s_addr = INADDR_ANY } },.size = sizeof(struct sockaddr_in)};coap_resource_t *temp_res = coap_resource_init("temperature", 0);coap_register_handler(temp_res, COAP_REQUEST_GET, temp_get_handler);coap_add_resource(ctx, temp_res);coap_endpoint_t *ep = coap_new_endpoint(ctx, &addr, COAP_PROTO_UDP);coap_start_io_thread(ctx);
}void temp_get_handler(coap_context_t *ctx, coap_resource_t *resource, coap_session_t *session, coap_pdu_t *request) {coap_pdu_t *response = coap_pdu_init(COAP_MESSAGE_ACK, COAP_RESPONSE_CODE_CONTENT,coap_new_message_id(session),coap_pdu_get_max_size(request));float temp = read_temperature();char buf[16];int len = snprintf(buf, sizeof(buf), "%.1f", temp);coap_add_option(response, COAP_OPTION_CONTENT_FORMAT, coap_encode_var_safe(buf, sizeof(buf), COAP_MEDIATYPE_TEXT_PLAIN), buf);coap_add_data(response, len, (uint8_t *)buf);coap_send(session, response);
}
十、实战项目:智能环境监测节点
1. 系统架构设计
[传感器层]├─ BME280 (温湿度气压)├─ BH1750 (光照)└─ PIR (人体感应)[主控层]└─ STM32WL (LoRa+MCU)[通信层]├─ LoRaWAN (上行)└─ BLE (本地配置)[云平台]└─ TTS (The Things Stack)
2. 主程序流程
int main(void) {hardware_init();sensors_init();lora_init();ble_init();// 主循环while (1) {system_state_t state = update_system_state();switch (state) {case STATE_NORMAL:if (should_sample()) {sensor_data_t data = read_all_sensors();processed_data_t processed = process_data(&data);send_lora_telemetry(&processed);}break;case STATE_LOW_BATTERY:adjust_sampling_rate(LOW_POWER_RATE);enable_energy_saving();break;case STATE_OTA:handle_ota_update();break;}idle_until_next_event();}
}
总结与演进方向
1. 物联网开发技能进阶路线
- 初级阶段:
- 掌握传感器数据采集与滤波
- 实现基础无线通信(LoRa/BLE)
- 构建简单MQTT客户端
- 中级阶段:
- 开发低功耗设备固件
- 实现安全启动与加密通信
- 设计OTA更新机制
- 高级阶段:
- 优化多协议共存策略
- 开发边缘AI推理功能
- 构建设备管理平台
- 专家方向:
- 参与物联网标准制定
- 开发自定义通信协议栈
- 研究LPWAN前沿技术
2. 推荐学习资源
- 硬件平台:
- STM32WL LoRa开发套件
- ESP32-C3物联网模组
- Nordic nRF9160 DK
- 开源项目:
- The Things Network LoRaWAN栈
- Zephyr RTOS物联网支持
- Eclipse Paho MQTT客户端
- 标准协议:
- LoRaWAN 1.0.3规范
- MQTT 5.0协议
- OMA LwM2M设备管理