標(biāo)題:
stm32發(fā)送到onenet的方法(程序+資料)
[打印本頁(yè)]
作者:
qiqi2050352
時(shí)間:
2019-4-26 17:37
標(biāo)題:
stm32發(fā)送到onenet的方法(程序+資料)
內(nèi)容詳細(xì)講解STM32如何向onenet發(fā)送數(shù)據(jù)
0.png
(6.6 KB, 下載次數(shù): 32)
下載附件
2019-4-26 23:39 上傳
單片機(jī)源程序如下:
/**********************************************************
接線說(shuō)明:
STM32 SIM868
GND <-----> GND
PA2/TX2------> RXD
PA3/RX2<------ TXD
RX1/PA10<------ GPS-T
//用于調(diào)試可不接
STM32 USB-TTL模塊
GND ------> GND
TX1/PA9------> RXD
***********************************************************/
#include "stm32f10x.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "usart2.h"
//常量
#define Success 1U
#define Failure 0U
//定義變量
unsigned long Time_Cont = 0; //定時(shí)器計(jì)數(shù)器
char OneNetServer[] = "api.heclouds.com"; //不需要修改
char device_id[] = "10252516"; //修改為自己的設(shè)備ID
char API_KEY[] = "MI0I=4cUrvBA=brbvheeAMgNqTk="; //修改為自己的API_KEY
//char device_id[] = "10129834"; //修改為自己的設(shè)備ID
//char API_KEY[] = "pkIGh8Qgk8QmVrlbNzMxRR4pKvk="; //修改為自己的API_KEY
char sensor_gps[] = "location"; //不需要修改
unsigned int count = 0;
void errorLog(int num);
void phone(char *number);
unsigned int sendCommand(char *Command, char *Response, unsigned long Timeout, unsigned char Retry);
void sendMessage(char *number,char *msg);
void Sys_Soft_Reset(void);
void parseGpsBuffer(void);
void printGpsBuffer(void);
void postGpsDataToOneNet(char* API_VALUE_temp, char* device_id_temp, char* sensor_id_temp, char* lon_temp, char* lat_temp);
char* longitudeToOnenetFormat(char *lon_str_temp);
char* latitudeToOnenetFormat(char *lat_str_temp);
int Digcount(long num);
int main(void)
{
delay_init();
NVIC_Configuration(); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
uart_init(115200); //串口初始化為115200
USART2_Init(9600); //串口2波特率9600
u2_printf("AT\r\n");
Init_LEDpin();
printf("Welcome to use!\r\n");
printf("ILoveMcu.taobao.com!\r\n");
if (sendCommand("AT\r\n", "OK\r\n", 3000, 10) == Success);
else errorLog(1);
delay_ms(100);
if (sendCommand("AT+CGCLASS=\"B\"\r\n", "OK\r\n", 3000, 2) == Success);
else errorLog(3);
delay_ms(100);
if (sendCommand("AT+CGDCONT=1,\"IP\",\"CMNET\"\r\n", "OK", 3000, 2) == Success);
else errorLog(4);
delay_ms(100);
if (sendCommand("AT+CGATT=1\r\n", "OK\r\n", 3000, 2) == Success);
else errorLog(5);
delay_ms(100);
if (sendCommand("AT+SAPBR=0,1\r\n", "AT+SAPBR", 3000, 5) == Success);//關(guān)閉承載,再重新打開(kāi)
else errorLog(22);
delay_ms(100);
if (sendCommand("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r\n", "OK\r\n", 3000, 2) == Success);
else errorLog(20);
delay_ms(100);
if (sendCommand("AT+SAPBR=3,1,\"APN\",\"CMNET\"\r\n", "OK\r\n", 3000, 2) == Success);
else errorLog(21);
delay_ms(100);
if (sendCommand("AT+SAPBR=1,1\r\n", "OK\r\n", 3000, 5) == Success);
else errorLog(22);
delay_ms(100);
if (sendCommand("AT+SAPBR=2,1\r\n", "OK\r\n", 3000, 3) == Success);
else errorLog(23);
delay_ms(100);
if (sendCommand("AT+CLBSCFG=0,3\r\n", "OK\r\n", 3000, 2) == Success);
else errorLog(24);
delay_ms(100);
clrStruct();
while(1)
{
parseGpsBuffer();
printGpsBuffer();
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
}
}
void parseGpsBuffer()
{
char *subString;
char *subStringNext;
char i = 0;
if (sendCommand("AT+CLBS=1,1\r\n", "OK", 15000, 1) == Success)
{
printf("**************\r\n");
printf(USART2_RX_BUF);
//+CLBS: 0,113.516557,22.269830,550
if ((subString = strstr((char *)USART2_RX_BUF, "+CLBS: 0")) != NULL)
{
for (i = 0 ; i <= 2 ; i++)
{
if (i == 0)
{
if ((subString = strstr((char *)subString, ",")) == NULL)
{
Save_Data.isUsefull = false;
errorLog(1); //解析錯(cuò)誤
}
}
else
{
subString++;
if ((subStringNext = strstr(subString, ",")) != NULL)
{
switch(i)
{
case 1:memcpy(Save_Data.longitude, subString, subStringNext - subString);break; //獲取經(jīng)度信息
case 2:memcpy(Save_Data.latitude, subString, subStringNext - subString);break; //獲取緯度信息
case 3:memcpy(Save_Data.UTCTime, subString, subStringNext - subString);break; //獲取UTC時(shí)間
default:break;
}
subString = subStringNext;
}
else
{
Save_Data.isUsefull = false;
errorLog(2); //解析錯(cuò)誤
}
Save_Data.isUsefull = true;
}
}
}else
{
Save_Data.isUsefull = false;
errorLog(25);
}
USART2_CLR_Buf();
}
else
{
Save_Data.isUsefull = false;
errorLog(25);
}
}
void printGpsBuffer()
{
if(Save_Data.isUsefull)
{
Save_Data.isUsefull = false;
printf("Save_Data.latitude = ");
printf(Save_Data.latitude);
printf("\r\n");
printf("Save_Data.longitude = ");
printf(Save_Data.longitude);
printf("\r\n");
postGpsDataToOneNet(API_KEY, device_id, sensor_gps, Save_Data.longitude, Save_Data.latitude); //發(fā)送數(shù)據(jù)到Onenet
LED1 = 0;
delay_ms(100);
LED1 = 1;
}
else
{
printf("GPS DATA is not usefull!\r\n");
}
}
int Digcount(long num)
{
int i=0;
while(num>0)
{
i++;
num=num/10;
}
return i;
}
char* longitudeToOnenetFormat(char *lon_str_temp) //經(jīng)度
{
unsigned long lon_Onenet = 0;
unsigned int dd_int = 0;
unsigned long mm_int = 0;
float lon_Onenet_double = 0;
int i = 0;
unsigned long tempInt = 0;
unsigned long tempPoint = 0;
char result[20];
char point_result[15];
int pointLength = 0;
//51單片機(jī)沒(méi)有double,double和float,精度不夠,這里只能分開(kāi)整數(shù)和小數(shù)換算。
sscanf(lon_str_temp, "%ld.%ld", &tempInt,&tempPoint);
lon_Onenet = tempInt%100;
pointLength = strlen(lon_str_temp) - 1 - Digcount(tempInt);
for( i = 0 ; i < pointLength ; i++) //小數(shù)點(diǎn)幾位,整數(shù)部分就放大10的幾次方
{
lon_Onenet *= 10;
}
dd_int = tempInt / 100; //取出dd
mm_int = lon_Onenet + tempPoint; //取出MM部分
mm_int = mm_int*10/6; //本來(lái)是除以60,這里*10/6為了多2位小數(shù)點(diǎn)有有效數(shù)字
sprintf(result,"%d.",dd_int);
for( i = 0 ; i < pointLength + 2 - Digcount(mm_int) ; i++)
{
strcat(result, "0");
}
sprintf(point_result,"%ld",mm_int);
strcat(result, point_result);
// SendString("\r\n==========ONENET FORMART==========\r\n");
// SendString(result);
return result;
}
char* latitudeToOnenetFormat(char *lat_str_temp) //緯度
{
unsigned long lat_Onenet = 0;
int dd_int = 0;
unsigned long mm_int = 0;
int i = 0;
unsigned long tempInt = 0;
unsigned long tempPoint = 0;
char result[20];
char point_result[15];
int pointLength = 0;
// char xdata debugTest[30];
//51單片機(jī)沒(méi)有double,double和float,精度不夠,這里只能分開(kāi)整數(shù)和小數(shù)換算。
sscanf(lat_str_temp, "%ld.%ld", &tempInt,&tempPoint);
lat_Onenet = tempInt%100;
// SendString("\r\n==========ONENET FORMART strlen(lat_str_temp)==========\r\n");
// sprintf(debugTest,"%d",strlen(lat_str_temp));
// SendString(debugTest);
pointLength = strlen(lat_str_temp) - 1 - Digcount(tempInt);
// SendString("\r\n==========ONENET FORMART pointLength==========\r\n");
// sprintf(debugTest,"%d",pointLength);
// SendString(debugTest);
for( i = 0 ; i < pointLength ; i++) //小數(shù)點(diǎn)幾位,整數(shù)部分就放大10的幾次方
{
lat_Onenet *= 10;
}
// SendString("\r\n==========ONENET FORMART tempPoint==========\r\n");
// sprintf(debugTest,"%ld",tempPoint);
// SendString(debugTest);
//
// SendString("\r\n==========ONENET FORMART tempInt==========\r\n");
// sprintf(debugTest,"%ld",tempInt);
// SendString(debugTest);
//
// SendString("\r\n==========ONENET FORMART lat_Onenet==========\r\n");
// sprintf(debugTest,"%ld",lat_Onenet);
// SendString(debugTest);
dd_int = tempInt / 100; //取出dd
mm_int = lat_Onenet + tempPoint; //取出MM部分
mm_int = mm_int*10/6; //本來(lái)是除以60,這里*10/6為了多2位小數(shù)點(diǎn)有有效數(shù)字
// SendString("\r\n==========ONENET FORMART mm_int==========\r\n");
// sprintf(debugTest,"%ld",mm_int);
// SendString(debugTest);
sprintf(result,"%d.",dd_int);
for( i = 0 ; i < pointLength + 2 - Digcount(mm_int) ; i++)
{
strcat(result, "0");
}
sprintf(point_result,"%ld",mm_int);
strcat(result, point_result);
// SendString("\r\n==========ONENET FORMART==========\r\n");
// SendString(result);
return result;
}
void postGpsDataToOneNet(char* API_VALUE_temp, char* device_id_temp, char* sensor_id_temp, char* lon_temp, char* lat_temp)
{
char send_buf[400] = {0};
char text[200] = {0};
char tmp[25] = {0};
char sendCom[2] = {0x1A};
// dtostrf(longitudeToOnenetFormat(lon_temp), 3, 6, lon_str_end); //轉(zhuǎn)換成字符串輸出
// dtostrf(latitudeToOnenetFormat(lat_temp), 2, 6, lat_str_end); //轉(zhuǎn)換成字符串輸出
// lon_temp = "11224.4992";
// lat_temp = "3438.1633";
//sprintf(lon_str_end,"%s", longitudeToOnenetFormat(lon_temp));
//sprintf(lat_str_end,"%s", latitudeToOnenetFormat(lat_temp));
//連接服務(wù)器
memset(send_buf, 0, 400); //清空
strcpy(send_buf, "AT+CIPSTART=\"TCP\",\"");
strcat(send_buf, OneNetServer);
strcat(send_buf, "\",80\r\n");
if (sendCommand(send_buf, "CONNECT", 10000, 3) == Success);
else errorLog(7);
//發(fā)送數(shù)據(jù)
if (sendCommand("AT+CIPSEND\r\n", ">", 3000, 1) == Success);
else errorLog(8);
memset(send_buf, 0, 400); //清空
/*準(zhǔn)備JSON串*/
//ARDUINO平臺(tái)不支持sprintf的double的打印,只能轉(zhuǎn)換到字符串然后打印
// sprintf(text, "{\"datastreams\":[{\"id\":\"%s\",\"datapoints\":[{\"value\":{\"lon\":%s,\"lat\":%s}}]}]}"
// , sensor_id_temp, lon_str_end, lat_str_end);
sprintf(text, "{\"datastreams\":[{\"id\":\"%s\",\"datapoints\":[{\"value\":{\"lon\":%s,\"lat\":%s}}]}]}"
, sensor_id_temp, lon_temp, lat_temp);
/*準(zhǔn)備HTTP報(bào)頭*/
send_buf[0] = 0;
strcat(send_buf, "POST /devices/");
strcat(send_buf, device_id_temp);
strcat(send_buf, "/datapoints HTTP/1.1\r\n"); //注意后面必須加上\r\n
strcat(send_buf, "api-key:");
strcat(send_buf, API_VALUE_temp);
strcat(send_buf, "\r\n");
strcat(send_buf, "Host:");
strcat(send_buf, OneNetServer);
strcat(send_buf, "\r\n");
sprintf(tmp, "Content-Length:%d\r\n\r\n", strlen(text)); //計(jì)算JSON串長(zhǎng)度
strcat(send_buf, tmp);
strcat(send_buf, text);
if (sendCommand(send_buf, send_buf, 3000, 1) == Success);
else errorLog(9);
if (sendCommand(sendCom, "\"succ\"}", 6000, 1) == Success);
else errorLog(10);
delay_ms(100);
if (sendCommand("AT+CIPCLOSE\r\n", "CLOSE OK", 3000, 1) == Success);
else errorLog(11);
delay_ms(100);
if (sendCommand("AT+CIPSHUT\r\n", "SHUT OK", 3000, 1) == Success);
else errorLog(11);
delay_ms(100);
}
void sendMessage(char *number,char *msg)
{
char send_buf[20] = {0};
memset(send_buf, 0, 20); //清空
strcpy(send_buf, "AT+CMGS=\"");
strcat(send_buf, number);
strcat(send_buf, "\"\r\n");
if (sendCommand(send_buf, ">", 3000, 10) == Success);
else errorLog(6);
if (sendCommand(msg, msg, 3000, 1) == Success);
else errorLog(7);
delay_ms(100);
memset(send_buf, 0, 100); //清空
send_buf[0] = 0x1a;
if (sendCommand(send_buf, "OK\r\n", 10000, 5) == Success);
else errorLog(8);
delay_ms(100);
}
void errorLog(int num)
{
printf("ERROR%d\r\n",num);
while (1)
{
if (sendCommand("AT\r\n", "OK", 100, 10) == Success)
{
Sys_Soft_Reset();
}
delay_ms(200);
……………………
…………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
OneNet平臺(tái)應(yīng)用資料.7z
(798.71 KB, 下載次數(shù): 58)
2019-4-26 23:39 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
huiweimin
時(shí)間:
2019-6-20 22:35
為啥那兩個(gè)工程的資料包在keil5里打不開(kāi)呢?
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1