內容詳細講解STM32如何向onenet發送數據
0.png (6.6 KB, 下載次數: 32)
下載附件
2019-4-26 23:39 上傳
單片機源程序如下:
- /**********************************************************
-
- 接線說明:
- STM32 SIM868
- GND <-----> GND
- PA2/TX2------> RXD
- PA3/RX2<------ TXD
- RX1/PA10<------ GPS-T
- //用于調試可不接
- 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; //定時器計數器
- char OneNetServer[] = "api.heclouds.com"; //不需要修改
- char device_id[] = "10252516"; //修改為自己的設備ID
- char API_KEY[] = "MI0I=4cUrvBA=brbvheeAMgNqTk="; //修改為自己的API_KEY
- //char device_id[] = "10129834"; //修改為自己的設備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(); //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
- 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);//關閉承載,再重新打開
- 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); //解析錯誤
- }
- }
- else
- {
- subString++;
- if ((subStringNext = strstr(subString, ",")) != NULL)
- {
- switch(i)
- {
- case 1:memcpy(Save_Data.longitude, subString, subStringNext - subString);break; //獲取經度信息
- case 2:memcpy(Save_Data.latitude, subString, subStringNext - subString);break; //獲取緯度信息
- case 3:memcpy(Save_Data.UTCTime, subString, subStringNext - subString);break; //獲取UTC時間
- default:break;
- }
-
- subString = subStringNext;
- }
- else
- {
- Save_Data.isUsefull = false;
- errorLog(2); //解析錯誤
- }
- 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); //發送數據到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) //經度
- {
- 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單片機沒有double,double和float,精度不夠,這里只能分開整數和小數換算。
- 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++) //小數點幾位,整數部分就放大10的幾次方
- {
- lon_Onenet *= 10;
- }
- dd_int = tempInt / 100; //取出dd
- mm_int = lon_Onenet + tempPoint; //取出MM部分
- mm_int = mm_int*10/6; //本來是除以60,這里*10/6為了多2位小數點有有效數字
- 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單片機沒有double,double和float,精度不夠,這里只能分開整數和小數換算。
- 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++) //小數點幾位,整數部分就放大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; //本來是除以60,這里*10/6為了多2位小數點有有效數字
- // 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); //轉換成字符串輸出
- // dtostrf(latitudeToOnenetFormat(lat_temp), 2, 6, lat_str_end); //轉換成字符串輸出
- // lon_temp = "11224.4992";
- // lat_temp = "3438.1633";
- //sprintf(lon_str_end,"%s", longitudeToOnenetFormat(lon_temp));
- //sprintf(lat_str_end,"%s", latitudeToOnenetFormat(lat_temp));
- //連接服務器
- 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);
- //發送數據
- if (sendCommand("AT+CIPSEND\r\n", ">", 3000, 1) == Success);
- else errorLog(8);
- memset(send_buf, 0, 400); //清空
- /*準備JSON串*/
- //ARDUINO平臺不支持sprintf的double的打印,只能轉換到字符串然后打印
- // 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);
- /*準備HTTP報頭*/
- 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)); //計算JSON串長度
- 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);
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
OneNet平臺應用資料.7z
(798.71 KB, 下載次數: 58)
2019-4-26 23:39 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|