Bootstrap

基于STM32设计的物流追踪系统(GPS+BC20+华为云IOT)

鱼弦:公众号【红尘灯塔】,CSDN博客专家、内容合伙人、新星导师、全栈领域优质创作者 、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构 https://github.com/Peakchen)

基于STM32设计的物流追踪系统(GPS+BC20+华为云IOT)

概述

基于STM32设计的物流追踪系统(GPS+BC20+华为云IOT)是一种利用STM32单片机、GPS模块、NB-IoT通信模块(BC20)和华为云物联网平台(华为云IOT)实现的物流包裹实时追踪管理系统。该系统可以实时采集物流包裹的位置信息,并将其上传至华为云IOT平台,实现对物流包裹的实时监控和管理。

原理详解

该系统主要由以下几部分组成:

  • STM32单片机控制模块: 负责控制系统的整体运行,采集GPS数据、BC20通信数据,并与华为云IOT平台进行通信。
  • GPS模块: 负责接收来自卫星的定位信号,并计算出物流包裹的经纬度坐标。
  • NB-IoT通信模块(BC20): 负责将GPS数据打包成NB-IoT协议数据,并发送至华为云IOT平台。
  • 华为云物联网平台(华为云IOT): 负责接收来自BC20模块的NB-IoT数据,并将其解析为物流包裹的位置信息,存储在云端数据库中。同时,华为云IOT平台还提供数据分析和可视化功能,方便用户查看物流包裹的实时位置和轨迹。

系统工作流程如下:

  1. 物流包裹上安装了搭载STM32单片机、GPS模块和BC20模块的追踪设备。
  2. GPS模块接收来自卫星的定位信号,并计算出物流包裹的经纬度坐标。
  3. STM32单片机将GPS数据打包成NB-IoT协议数据,并通过BC20模块发送至华为云IOT平台。
  4. 华为云IOT平台接收并解析NB-IoT数据,获取物流包裹的位置信息。
  5. 华为云IOT平台将物流包裹的位置信息存储在云端数据库中。
  6. 用户可以通过华为云IOT平台提供的Web界面或移动应用查看物流包裹的实时位置和轨迹。

应用场景解释

基于STM32设计的物流追踪系统(GPS+BC20+华为云IOT)可以应用于以下场景:

  • 快递物流: 可以用于追踪快递包裹的实时位置,提高快递配送效率,提升用户体验。
  • 冷链物流: 可以用于监控冷链食品、药品等货物的运输过程中的温度和湿度,确保货物安全。
  • 资产管理: 可以用于追踪车辆、设备等高价值资产的位置,防止资产丢失或被盗。

算法实现

该系统主要涉及以下算法:

  • GPS定位算法: 根据GPS模块接收到的卫星信号,计算出物流包裹的经纬度坐标。
  • NB-IoT数据打包算法: 将GPS数据打包成符合NB-IoT协议格式的数据包。
  • NB-IoT数据解析算法: 将华为云IOT平台接收到的NB-IoT数据解析为物流包裹的位置信息。

代码完整详细实现

1. STM32 Microcontroller Control Module (main.c)

#include "stm32f10x_hal.h"
#include "usart.h"
#include "gps.h"
#include "nbiot.h"
#include "cloud_iot.h"

// Global variables to store GPS data and NB-IoT data
float latitude;
float longitude;
uint8_t nbiotData[256];

// Function to initialize GPS, NB-IoT, and Huawei Cloud IoT
void initDevices(void) {
  // Initialize GPS module
  initGPS();

  // Initialize NB-IoT module
  initNBIoT();

  // Initialize Huawei Cloud IoT platform
  initCloudIoT();
}

// Function to read GPS data
void readGPSData(void) {
  // Read GPS data from the module
  readGPSPosition(&latitude, &longitude);
}

// Function to prepare NB-IoT data for transmission
void prepareNBIoTData(void) {
  // Pack GPS data and other relevant information into NB-IoT data packet
  packNBIoTData(nbiotData, latitude, longitude);
}

// Function to send NB-IoT data to the cloud platform
void sendNBIoTDataToCloud(void) {
  // Send NB-IoT data packet to Huawei Cloud IoT platform
  sendNBIoTData(nbiotData);
}

int main(void) {
  // Initialize HAL Library
  HAL_Init();

  // Initialize system peripherals
  initDevices();

  while (1) {
    // Read GPS data
    readGPSData();

    // Prepare NB-IoT data for transmission
    prepareNBIoTData();

    // Send NB-IoT data to the cloud platform
    sendNBIoTDataToCloud();

    // Delay for a period of time before next update
    HAL_Delay(10000); // Send GPS data every 10 seconds
  }
}

2. GPS Module (gps.h)

#include "stm32f10x.h"

// Function to initialize GPS module
void initGPS(void);

// Function to read GPS position data
void readGPSPosition(float *latitude, float *longitude);

3. GPS Module (gps.c)

#include "stm32f10x.h"
#include "gps.h"

#include <stdio.h>
#include <string.h>

// Define GPS communication parameters
#define GPS_UART_PORT USART2
#define GPS_UART_BAUDRATE 9600

// Function to initialize GPS module
void initGPS(void) {
  // Configure USART2 for communication with GPS module
  UART_InitTypeDef UART_InitStructure;

  UART_InitStructure.BaudRate = GPS_UART_BAUDRATE;
  UART_InitStructure.WordLength = UART_WORDLENGTH_8BIT;
  UART_InitStructure.StopBits = UART_STOPBITS_1;
  UART_InitStructure.Parity = UART_PARITY_NONE;
  UART_InitStructure.Mode = UART_MODE_TXRX;
  UART_InitStructure.HwFlowCtl = UART_HWFLOWCTL_NONE;

  HAL_UART_Init(GPS_UART_PORT, &UART_InitStructure);
}

// Function to read GPS position data
void readGPSPosition(float *latitude, float *longitude) {
  // Read GPS data from the serial port
  char gpsData[128];
  HAL_UART_Receive(GPS_UART_PORT, (uint8_t *)gpsData, sizeof(gpsData), HAL_MAX_DELAY);

  // Parse GPS data to extract latitude and longitude
  char *latStr, *lonStr;
  latStr = strstr(gpsData, "$GPGGA");
  if (latStr != NULL) {
    latStr += 9; // Skip to latitude data field
    *latitude = atof(latStr);

    lonStr = strstr(latStr, ",");
    if (lonStr != NULL) {
      lonStr++; // Skip to longitude data field
      *longitude = atof(lonStr);
    }
  }
}

4. NB-IoT Module (nbiot.h)

#include "stm32f10x.h"
#include "nbiot.h"

#include <stdio.h>
#include <string.h>

// Define NB-IoT communication parameters
#define NBIOT_UART_PORT USART3
#define NBIOT_UART_BAUDRATE 115200

// Replace with your actual NB-IoT module configuration
#define NBIOT_MODULE_IMEI "your_module_imei"
#define NBIOT_MODULE_ICCID "your_module_iccid"
#define NBIOT_MODULE_APN "your_apn"
#define NBIOT_MODULE_USERNAME "your_username"
#define NBIOT_MODULE_PASSWORD "your_password"

// Function to initialize NB-IoT module
void initNBIoT(void) {
  // Configure USART3 for communication with NB-IoT module
  UART_InitTypeDef UART_InitStructure;

  UART_InitStructure.BaudRate = NBIOT_UART_BAUDRATE;
  UART_InitStructure.WordLength = UART_WORDLENGTH_8BIT;
  UART_InitStructure.StopBits = UART_STOPBITS_1;
  UART_InitStructure.Parity = UART_PARITY_NONE;
  UART_InitStructure.Mode = UART_MODE_TXRX;
  UART_InitStructure.HwFlowCtl = UART_HWFLOWCTL_NONE;

  HAL_UART_Init(NBIOT_UART_PORT, &UART_InitStructure);

  // Set NB-IoT module to command mode
  sendNBIoTCommand("AT+CREG?");
  waitForNBIoTResponse();

  // Set NB-IoT module to network registration mode
  sendNBIoTCommand("AT+CGREG?");
  waitForNBIoTResponse();

  // Set NB-IoT module to attach to the network
  sendNBIoTCommand("AT+CGATT=1");
  waitForNBIoTResponse();

  // Check if NB-IoT module is attached to the network
  sendNBIoTCommand("AT+CGATT?");
  waitForNBIoTResponse();

  // Set NB-IoT module to IP address acquisition mode
  sendNBIoTCommand("AT+CIMI?");
  waitForNBIoTResponse();

  // Establish UDP connection with Huawei Cloud IoT platform
  sendNBIoTCommand("AT+CIPUDPC=1,\"0.0.0.0\",0,\"10.10.10.10\",8883");
  waitForNBIoTResponse();
}

// Function to send NB-IoT command
void sendNBIoTCommand(char *command) {
  // Send command to NB-IoT module
  HAL_UART_Transmit(NBIOT_UART_PORT, (uint8_t *)command, strlen(command), HAL_MAX_DELAY);

  // Add carriage return and line feed
  HAL_UART_Transmit(NBIOT_UART_PORT, (uint8_t *)"\r\n", 2, HAL_MAX_DELAY);
}

// Function to wait for NB-IoT response
void waitForNBIoTResponse(void) {
  // Receive response from NB-IoT module
  char response[256];
  HAL_UART_Receive(NBIOT_UART_PORT, (uint8_t *)response, sizeof(response), HAL_MAX_DELAY);

  // Print response
  printf("NB-IoT Response: %s\n", response);
}

// Function to pack NB-IoT data into a packet
void packNBIoTData(uint8_t *data, float latitude, float longitude) {
  // Convert latitude and longitude to JSON format
  char jsonData[64];
  sprintf(jsonData, "{\"latitude\": %.6f, \"longitude\": %.6f}", latitude, longitude);

  // Copy JSON data to NB-IoT data packet
  memcpy(data, jsonData, strlen(jsonData));
}

// Function to send NB-IoT data packet to Huawei Cloud IoT platform
void sendNBIoTData(uint8_t *data) {
  // Send NB-IoT data packet to Huawei Cloud IoT platform
  HAL_UART_Transmit(NBIOT_UART_PORT, data, strlen((char

5. Huawei Cloud IoT Module (cloud_iot.h)

#include "stm32f10x.h"

// Function to initialize Huawei Cloud IoT platform
void initCloudIoT(void);

// Function to set cloud upload payload
void setCloudIoTUploadPayload(char *jsonData);

// Function to upload data to Huawei Cloud IoT platform
void uploadCloudIoTData(void);

6. Huawei Cloud IoT Module (cloud_iot.c)

#include "stm32f10x.h"
#include "cloud_iot.h"

#include <stdio.h>
#include <string.h>
#include <lwip/sockets.h>
#include <lwip/netdb.h>

// Replace with your actual Huawei Cloud IoT platform configuration
#define CLOUD_IOT_PRODUCT_ID "your_product_id"
#define CLOUD_IOT_DEVICE_ID "your_device_id"
#define CLOUD_IOT_AUTH_KEY "your_auth_key"

#define CLOUD_IOT_SERVER_ADDRESS "iot.cloud.huawei.com"
#define CLOUD_IOT_SERVER_PORT 8883

#define MQTT_CLIENT_ID "logistics_tracking_device"

static struct mqtt_client client;

// Function to initialize Huawei Cloud IoT platform
void initCloudIoT(void) {
  // Initialize MQTT client
  mqtt_client_init(&client, 256, 1024);

  // Connect to Huawei Cloud IoT platform
  connectToCloudIoT();
}

// Function to connect to Huawei Cloud IoT platform
void connectToCloudIoT(void) {
  // Create MQTT connection parameters
  struct mqtt_connection_param conn_param = {
    .client_id = MQTT_CLIENT_ID,
    .username = NULL,
    .password = CLOUD_IOT_AUTH_KEY,
    .will_message = NULL,
    .will_qos = 0,
    .will_flag = 0,
    .clean_session = 1,
    .keep_alive = 60,
    .max_packet_size = 1024,
    .tcp_protocol = MQTT_TCP_PROTOCOL_V4
  };

  // Connect to MQTT broker
  if (mqtt_client_connect(&client, CLOUD_IOT_SERVER_ADDRESS, CLOUD_IOT_SERVER_PORT, &conn_param) != 0) {
    printf("Failed to connect to Huawei Cloud IoT platform\n");
    return;
  }

  printf("Connected to Huawei Cloud IoT platform\n");
}

// Function to set cloud upload payload
void setCloudIoTUploadPayload(char *jsonData) {
  // Create MQTT publish message
  struct mqtt_message msg = {
    .topic = "logistics/tracking",
    .payload = jsonData,
    .payload_len = strlen(jsonData),
    .qos = 1,
    .retain = 0
  };

  // Publish message to Huawei Cloud IoT platform
  if (mqtt_client_publish(&client, &msg) != 0) {
    printf("Failed to publish data to Huawei Cloud IoT platform\n");
  } else {
    printf("Data published successfully to Huawei Cloud IoT platform\n");
  }
}

// Function to upload data to Huawei Cloud IoT platform
void uploadCloudIoTData(void) {
  // Set cloud upload payload with NB-IoT data
  setCloudIoTUploadPayload((char *)nbiotData);
}

参考以下开源项目:

  • 基于STM32的GPS定位系统: [移除了无效网址]
  • 基于NB-IoT的物联网通信: [移除了无效网址]
  • 华为云物联网平台开发: [移除了无效网址]

部署测试搭建实现

该系统的部署主要包括以下步骤:

  1. 硬件准备: 准备STM32开发板、GPS模块、BC20模块、华为云IOT开发套件等硬件设备。
  2. 软件开发: 在STM32开发板上开发数据采集、数据处理、数据通信等软件程序。
  3. 华为云IOT平台注册: 注册华为云IOT账号,并创建物联网应用。
  4. 设备注册和绑定: 将STM32开发板注册到华为云IOT平台,并绑定到物联网应用。
  5. 数据上传和处理: 在华为云IOT平台上配置数据上传和处理规则,将设备上传的数据进行分析和处理。
  6. 测试验证: 测试系统的功能和性能,确保系统能够正常工作。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;