SIM800C连接OneNet平台HTTP协议上传GPS数据
时间:2023-10-22 00:37:01
1. 前言
随着科技进步的不断推动新产品的出现,越来越多的电子产品开始努力解决社会焦点问题。随着城市的发展和人口流动性的增加,儿童户外被绑架,老年人外出迷路,交通被盗,大型物品丢失。因此,为了更好地利用现代科技解决社会关注的问题。本文设计了一个基于本文的基础STM智能云定位器32。 采用主控芯片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.1\r\n" \ "api-key:%s\r\n" \ "Host:api.heclouds.com\r\n" \ \ "Content-Length:%d\r\n" \ "\r\n" \ "%s", ONENET_DEVICE_ID,ONENET_API_KEY,strlen(OneNet_HTTP_BUFF),OneNet_HTTP_BUFF ); printf("OneNet_HTTP_CMD=%s\r\n",OneNet_HTTP_CMD); printf("连接服务器的状态:%d\r\n",SIM800C_Connect_TCP_Server("183.230.40.33","80")); DelayMs(500); printf("数据发送的状态:%d\r\n",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.1\r\n" \ "api-key:%s\r\n" \ "Host:api.heclouds.com\r\n" \ "Connection:close\r\n" \ "Content-Length:%d\r\n" \ "\r\n" \ "%s", ONENET_DEVICE_ID,ONENET_API_KEY,strlen(OneNet_HTTP_BUFF),OneNet_HTTP_BUFF ); printf("GPS_OneNet_HTTP_CMD=%s\r\n",OneNet_HTTP_CMD); printf("连接服务器的状态:%d\r\n",SIM800C_Connect_TCP_Server("183.230.40.33","80")); DelayMs(500); printf("数据发送的状态:%d\r\n",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("串口初始化完成!\r\n");
//SIM800C的串口接口
TIM2_Init(72,20000);//辅助串口3接收,超时时间为20ms
USART_X_Init(USART2,36,9600); //可能的波特率(测试): 57600 、9600、115200
//延时等待
printf("延时等待\r\n");
DelayMs(1000);
DelayMs(1000);
DelayMs(1000);
DelayMs(1000);
printf("开始初始化SIM800C \r\n");
while(1)
{
state=SIM800C_InitCheck();
if(state==0)break;
DelayMs(1000);
printf("SIM800C初始化状态:%d\r\n",state);
}
while(1)
{
state=SIM800C_SetNoteTextMode();
if(state==0)break;
DelayMs(1000);
printf("设置文本模式状态:%d\r\n",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("短信发送成功\r\n");
}
else
{
printf("短信发送失败\r\n");
}
}
//实时接收SIM00C返回的数据
if(USART2_RX_FLAG)
{
USART2_RX_BUFF[USART2_RX_CNT]='\0';
USART2_RX_CNT=0;
USART2_RX_FLAG=0;
printf("USART2_RX_BUFF=%s\r\n",USART2_RX_BUFF);
memset(USART2_RX_BUFF,0,sizeof(USART2_RX_BUFF));
}
}
}