鱼弦:公众号【红尘灯塔】,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平台还提供数据分析和可视化功能,方便用户查看物流包裹的实时位置和轨迹。
系统工作流程如下:
- 物流包裹上安装了搭载STM32单片机、GPS模块和BC20模块的追踪设备。
- GPS模块接收来自卫星的定位信号,并计算出物流包裹的经纬度坐标。
- STM32单片机将GPS数据打包成NB-IoT协议数据,并通过BC20模块发送至华为云IOT平台。
- 华为云IOT平台接收并解析NB-IoT数据,获取物流包裹的位置信息。
- 华为云IOT平台将物流包裹的位置信息存储在云端数据库中。
- 用户可以通过华为云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的物联网通信: [移除了无效网址]
- 华为云物联网平台开发: [移除了无效网址]
部署测试搭建实现
该系统的部署主要包括以下步骤:
- 硬件准备: 准备STM32开发板、GPS模块、BC20模块、华为云IOT开发套件等硬件设备。
- 软件开发: 在STM32开发板上开发数据采集、数据处理、数据通信等软件程序。
- 华为云IOT平台注册: 注册华为云IOT账号,并创建物联网应用。
- 设备注册和绑定: 将STM32开发板注册到华为云IOT平台,并绑定到物联网应用。
- 数据上传和处理: 在华为云IOT平台上配置数据上传和处理规则,将设备上传的数据进行分析和处理。
- 测试验证: 测试系统的功能和性能,确保系统能够正常工作。