• SIM800C连接OneNet平台HTTP协议上传GPS数据


    1. 前言

    科技进步不断推动新产品的出现,越来越多的电子产品开始着力解决社会焦点问题,随着城市发展以及人口流动性的增加,儿童户外被拐,老人外出走丢,交通工具被盗和大型物件丢失等问题变样严重起来,因此,为了更好地利用现代科学技术解决社会关注的问题。本文就设计出一款基于STM32的智能云端定位器。 主控芯片采用STM32F103C8T6,联网模块采用SIM800C,云平台采用中国移动的OneNet平台。
    STM32采集GPS定位数据之后,通过SIM800C将数据上传到OneNet平台进行实时显示。
    在这里插入图片描述

    image-20220408150916504

    image-20220408150715452

    接下来就一步一步完成,智能云端定位器的设计。

    2. 创建产品

    官网地址: https://open.iot.10086.cn/

    image-20220408143221729

    image-20220408143241526

    image-20220408143327664

    image-20220408143350583

    3. 创建设备

    点击创建好的产品名称,进入设备创建页面。

    image-20220408143506700

    添加设备。

    image-20220408143526173

    image-20220408143643023

    添加成功会,点击详情,查看详细信息。

    image-20220408143702421

    添加APIkey

    image-20220408143751585

    image-20220408143821165

    设备添加成功。

    image-20220408143845361

    这个页面的设备ID和APIKEY需要保存下来,接下来SIM800C上传数据到onenet平台,就需要使用这个参数。

    设备ID  :  920668935
    APIKey :  XMwqaSZATs=ZlXq4Tk4NA44WTl4=
    
    • 1
    • 2

    4. 创建数据流模板

    image-20220408144101594

    image-20220408144132950

    添加成功。

    image-20220408144155641

    5. STM32设备端代码

    如果需要项目工程源码,可以去这里下载:https://download.csdn.net/download/xiaolong1126626497/85896011

    (1)硬件接线

    SIM800C接线说明:
    GND----GND
    VCC----3.3V
    STM32_PA2----SIM800C_RXD
    STM32_PA3----SIM800C_TXD
    
    • 1
    • 2
    • 3
    • 4
    • 5

    (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" \
    			"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("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)));
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    (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}}]}]}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    (4)OneNet显示效果

    上传之后显示的效果。

    image-20220408145733451
    可以通过地图可视化显示。
    image-20220408145827272

    (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));
             }
    	 }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
  • 相关阅读:
    现代企业架构框架-技术架构
    【Java高级】一篇文章带你搞懂线程
    编程题01——十进制转二进制
    八、kotlin的高阶函数
    领域驱动设计:基于DDD的微服务设计实例
    Django 实战开发(一)项目搭建
    iphone苹果手机如何连接电脑进行投屏?
    一种基于光强传输方程的散射成像相位恢复仿真研究
    搜索与推荐基础知识和es中间件
    世界杯观后感
  • 原文地址:https://blog.csdn.net/xiaolong1126626497/article/details/125967920