一、物联网系统架构设计

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. 物联网开发技能进阶路线

  1. 初级阶段
  • 掌握传感器数据采集与滤波
  • 实现基础无线通信(LoRa/BLE)
  • 构建简单MQTT客户端
  1. 中级阶段
  • 开发低功耗设备固件
  • 实现安全启动与加密通信
  • 设计OTA更新机制
  1. 高级阶段
  • 优化多协议共存策略
  • 开发边缘AI推理功能
  • 构建设备管理平台
  1. 专家方向
  • 参与物联网标准制定
  • 开发自定义通信协议栈
  • 研究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设备管理