1. 前言
科技进步不断推动新产品的出现,越来越多的电子产品开始着力解决社会焦点问题,随着城市发展以及人口流动性的增加,儿童户外被拐,老人外出走丢,交通工具被盗和大型物件丢失等问题变样严重起来,因此,为了更好地利用现代科学技术解决社会关注的问题。本文就设计出一款基于STM32的智能云端定位器。 主控芯片采用STM32F103C8T6,联网模块采用SIM800C,云平台采用中国移动的OneNet平台。
STM32采集GPS定位数据之后,通过SIM800C将数据上传到OneNet平台进行实时显示。
接下来就一步一步完成,智能云端定位器的设计。
2. 创建产品
官网地址: https://open.iot.10086.cn/
3. 创建设备
点击创建好的产品名称,进入设备创建页面。
添加设备。
添加成功会,点击详情,查看详细信息。
添加APIkey
设备添加成功。
这个页面的设备ID和APIKEY需要保存下来,接下来SIM800C上传数据到onenet平台,就需要使用这个参数。
设备ID : 920668935
APIKey : XMwqaSZATs=ZlXq4Tk4NA44WTl4=
4. 创建数据流模板
添加成功。
5. STM32设备端代码
如果需要项目工程源码,可以去这里下载:https://download.csdn.net/download/xiaolong1126626497/85896011
(1)硬件接线
SIM800C接线说明:
GND----GND
VCC----3.3V
STM32_PA2----SIM800C_RXD
STM32_PA3----SIM800C_TXD
(2)实现的核心代码
/*
函数功能: 采用HTTP协议方式向OneNet服务器上报数据
函数参数:
char *data_point:数据点的名称
u32 data :上传的数据
*/
char OneNet_HTTP_CMD[1024];
char OneNet_HTTP_BUFF[300];
#define ONENET_DEVICE_ID "920668935"
#define ONENET_API_KEY "XMwqaSZATs=ZlXq4Tk4NA44WTl4="
void OneNet_HTTP_DataUpdate(char *data_point,u32 data)
{
//拼接数据
snprintf(OneNet_HTTP_BUFF,sizeof(OneNet_HTTP_BUFF),
"{"datastreams":[{"id":"%s","datapoints":[{"value":%d}]}]}",data_point,data);
//拼接数据
snprintf(OneNet_HTTP_CMD,sizeof(OneNet_HTTP_CMD),
"POST /devices/%s/datapoints HTTP/1.1rn"
"api-key:%srn"
"Host:api.heclouds.comrn"
"Connection:closern"
"Content-Length:%drn"
"rn"
"%s",
ONENET_DEVICE_ID,ONENET_API_KEY,strlen(OneNet_HTTP_BUFF),OneNet_HTTP_BUFF
);
printf("OneNet_HTTP_CMD=%srn",OneNet_HTTP_CMD);
printf("连接服务器的状态:%drn",SIM800C_Connect_TCP_Server("183.230.40.33","80"));
DelayMs(500);
printf("数据发送的状态:%drn",SIIM800C_TCP_SendData((u8*)OneNet_HTTP_CMD,strlen(OneNet_HTTP_CMD)));
}
/*
函数功能: 采用HTTP协议方式向OneNet服务器上报GPS经纬度信息
函数参数:
char *data_point:数据点的名称
double Longitude,double latitude:上传的经纬度数据
*/
void OneNet_HTTP_GPS_DataUpdate(char *data_point,double Longitude,double latitude)
{
//拼接数据
snprintf(OneNet_HTTP_BUFF,sizeof(OneNet_HTTP_BUFF),
"{"datastreams":[{"id":"%s","datapoints":[{"value":{"lon":%lf,"lat":%lf}}]}]}",
data_point,Longitude,latitude);
//拼接数据
snprintf(OneNet_HTTP_CMD,sizeof(OneNet_HTTP_CMD),
"POST /devices/%s/datapoints HTTP/1.1rn"
"api-key:%srn"
"Host:api.heclouds.comrn"
"Connection:closern"
"Content-Length:%drn"
"rn"
"%s",
ONENET_DEVICE_ID,ONENET_API_KEY,strlen(OneNet_HTTP_BUFF),OneNet_HTTP_BUFF
);
printf("GPS_OneNet_HTTP_CMD=%srn",OneNet_HTTP_CMD);
printf("连接服务器的状态:%drn",SIM800C_Connect_TCP_Server("183.230.40.33","80"));
DelayMs(500);
printf("数据发送的状态:%drn",SIIM800C_TCP_SendData((u8*)OneNet_HTTP_CMD,strlen(OneNet_HTTP_CMD)));
}
(3)上传数据格式总结
POST /devices/920668935/datapoints HTTP/1.1
api-key:XMwqaSZATs=ZlXq4Tk4NA44WTl4=
Host:api.heclouds.com
Connection:close
Content-Length:83
{"datastreams":[{"id":"GPS","datapoints":[{"value":{"lon":120.21,"lat":30.19}}]}]}
(4)OneNet显示效果
上传之后显示的效果。
可以通过地图可视化显示。
(5)main.c实现代码
#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
#include #include "timer.h" #include "sim800c.h" #include "gps.h" /* SIM800C接线说明: GND----GND VCC----3.3V STM32_PA2----SIM800C_RXD STM32_PA3----SIM800C_TXD */ char sim800c_buff[20]; char tmp_buffer[100]; double Longitude=103.718463; //经度 double latitude=36.107013; //纬度 int main(void) { u32 OneNet_Sendtime=0; u8 state; USART_X_Init(USART1,72,115200); //串口初始化 printf("串口初始化完成!rn"); //SIM800C的串口接口 TIM2_Init(72,20000);//辅助串口3接收,超时时间为20ms USART_X_Init(USART2,36,9600); //可能的波特率(测试): 57600 、9600、115200 //延时等待 printf("延时等待rn"); DelayMs(1000); DelayMs(1000); DelayMs(1000); DelayMs(1000); printf("开始初始化SIM800C rn"); while(1) { state=SIM800C_InitCheck(); if(state==0)break; DelayMs(1000); printf("SIM800C初始化状态:%drn",state); } while(1) { state=SIM800C_SetNoteTextMode(); if(state==0)break; DelayMs(1000); printf("设置文本模式状态:%drn",state); } //同步网络时间 //SIM800C_NtpUpdate(); //初始化GPRS联网功能 SIM800C_GPRS_Init(); while(1) { delay_ms(1); OneNet_Sendtime++; //向云端发送一次数据(每次选择发送一种数据) if(OneNet_Sendtime>=500) //单位ms { OneNet_Sendtime=0; //向OneNet上传经纬度数据 OneNet_HTTP_GPS_DataUpdate("GPS",Longitude,latitude); //向指定手机发送短信,发送经纬度信息 sprintf(sim800c_buff,"GPS:%f,%f",Longitude,latitude); if(SIM800C_SendNote((u8*)"13800138000",(u8*)sim800c_buff,strlen((char*)sim800c_buff))==0) { printf("短信发送成功rn"); } else { printf("短信发送失败rn"); } } //实时接收SIM00C返回的数据 if(USART2_RX_FLAG) { USART2_RX_BUFF[USART2_RX_CNT]='