找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4023|回復(fù): 1
收起左側(cè)

stm32發(fā)送到onenet的方法(程序+資料)

[復(fù)制鏈接]
ID:522430 發(fā)表于 2019-4-26 17:37 | 顯示全部樓層 |閱讀模式
內(nèi)容詳細(xì)講解STM32如何向onenet發(fā)送數(shù)據(jù)
0.png

單片機(jī)源程序如下:
  1. /**********************************************************
  2.                                                                                                
  3. 接線說明:
  4. STM32                 SIM868
  5. GND                <----->        GND
  6. PA2/TX2------>        RXD
  7. PA3/RX2<------        TXD
  8. RX1/PA10<------ GPS-T

  9. //用于調(diào)試可不接
  10. STM32                USB-TTL模塊
  11. GND                ------>        GND
  12. TX1/PA9------>        RXD

  13. ***********************************************************/

  14. #include "stm32f10x.h"
  15. #include "delay.h"
  16. #include "usart.h"
  17. #include "led.h"
  18. #include "usart2.h"


  19. //常量
  20. #define Success 1U
  21. #define Failure 0U

  22. //定義變量
  23. unsigned long  Time_Cont = 0;       //定時(shí)器計(jì)數(shù)器


  24. char OneNetServer[] = "api.heclouds.com";       //不需要修改


  25. char device_id[] = "10252516";    //修改為自己的設(shè)備ID
  26. char API_KEY[] = "MI0I=4cUrvBA=brbvheeAMgNqTk=";    //修改為自己的API_KEY

  27. //char device_id[] = "10129834";    //修改為自己的設(shè)備ID
  28. //char API_KEY[] = "pkIGh8Qgk8QmVrlbNzMxRR4pKvk=";    //修改為自己的API_KEY
  29. char sensor_gps[] = "location";                                //不需要修改

  30. unsigned int count = 0;

  31. void errorLog(int num);
  32. void phone(char *number);
  33. unsigned int sendCommand(char *Command, char *Response, unsigned long Timeout, unsigned char Retry);
  34. void sendMessage(char *number,char *msg);
  35. void Sys_Soft_Reset(void);
  36. void parseGpsBuffer(void);
  37. void printGpsBuffer(void);
  38. void postGpsDataToOneNet(char* API_VALUE_temp, char* device_id_temp, char* sensor_id_temp, char* lon_temp, char* lat_temp);
  39. char* longitudeToOnenetFormat(char *lon_str_temp);
  40. char* latitudeToOnenetFormat(char *lat_str_temp);
  41. int Digcount(long num);

  42. int main(void)
  43. {       
  44.         delay_init();
  45.        
  46.         NVIC_Configuration();          //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
  47.         uart_init(115200);         //串口初始化為115200
  48.         USART2_Init(9600);        //串口2波特率9600
  49.         u2_printf("AT\r\n");
  50.         Init_LEDpin();
  51.        
  52.        
  53.        
  54.         printf("Welcome to use!\r\n");
  55.         printf("ILoveMcu.taobao.com!\r\n");
  56.        
  57.         if (sendCommand("AT\r\n", "OK\r\n", 3000, 10) == Success);
  58.         else errorLog(1);
  59.         delay_ms(100);

  60.         if (sendCommand("AT+CGCLASS=\"B\"\r\n", "OK\r\n", 3000, 2) == Success);
  61.         else errorLog(3);
  62.         delay_ms(100);

  63.         if (sendCommand("AT+CGDCONT=1,\"IP\",\"CMNET\"\r\n", "OK", 3000, 2) == Success);
  64.         else errorLog(4);
  65.         delay_ms(100);

  66.         if (sendCommand("AT+CGATT=1\r\n", "OK\r\n", 3000, 2) == Success);
  67.         else errorLog(5);
  68.         delay_ms(100);
  69.    
  70.     if (sendCommand("AT+SAPBR=0,1\r\n", "AT+SAPBR", 3000, 5) == Success);//關(guān)閉承載,再重新打開
  71.         else errorLog(22);
  72.         delay_ms(100);
  73.    
  74.     if (sendCommand("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r\n", "OK\r\n", 3000, 2) == Success);
  75.         else errorLog(20);
  76.         delay_ms(100);
  77.    
  78.     if (sendCommand("AT+SAPBR=3,1,\"APN\",\"CMNET\"\r\n", "OK\r\n", 3000, 2) == Success);
  79.         else errorLog(21);
  80.         delay_ms(100);
  81.    
  82.     if (sendCommand("AT+SAPBR=1,1\r\n", "OK\r\n", 3000, 5) == Success);
  83.         else errorLog(22);
  84.         delay_ms(100);
  85.    
  86.     if (sendCommand("AT+SAPBR=2,1\r\n", "OK\r\n", 3000, 3) == Success);
  87.         else errorLog(23);
  88.         delay_ms(100);
  89.    
  90.     if (sendCommand("AT+CLBSCFG=0,3\r\n", "OK\r\n", 3000, 2) == Success);
  91.         else errorLog(24);
  92.         delay_ms(100);


  93.         clrStruct();
  94.         while(1)
  95.         {
  96.                 parseGpsBuffer();
  97.                 printGpsBuffer();
  98.         delay_ms(1000);
  99.         delay_ms(1000);
  100.         delay_ms(1000);
  101.         delay_ms(1000);
  102.         delay_ms(1000);
  103.         }
  104. }

  105. void parseGpsBuffer()
  106. {
  107.         char *subString;
  108.         char *subStringNext;
  109.         char i = 0;
  110.    
  111.     if (sendCommand("AT+CLBS=1,1\r\n", "OK", 15000, 1) == Success)
  112.     {
  113.         printf("**************\r\n");
  114.                 printf(USART2_RX_BUF);
  115.         //+CLBS: 0,113.516557,22.269830,550
  116.         if ((subString = strstr((char *)USART2_RX_BUF, "+CLBS: 0")) != NULL)
  117.         {
  118.             for (i = 0 ; i <= 2 ; i++)
  119.             {
  120.                 if (i == 0)
  121.                 {
  122.                     if ((subString = strstr((char *)subString, ",")) == NULL)
  123.                     {   
  124.                         Save_Data.isUsefull = false;
  125.                         errorLog(1);        //解析錯(cuò)誤
  126.                     }
  127.                 }
  128.                 else
  129.                 {
  130.                     subString++;
  131.                     if ((subStringNext = strstr(subString, ",")) != NULL)
  132.                     {
  133.                         switch(i)
  134.                         {
  135.                             case 1:memcpy(Save_Data.longitude, subString, subStringNext - subString);break;        //獲取經(jīng)度信息
  136.                             case 2:memcpy(Save_Data.latitude, subString, subStringNext - subString);break;        //獲取緯度信息
  137.                             case 3:memcpy(Save_Data.UTCTime, subString, subStringNext - subString);break;        //獲取UTC時(shí)間
  138.                             default:break;
  139.                         }
  140.                         
  141.                         subString = subStringNext;
  142.                     }
  143.                     else
  144.                     {
  145.                         Save_Data.isUsefull = false;
  146.                         errorLog(2);        //解析錯(cuò)誤
  147.                     }
  148.                     Save_Data.isUsefull = true;
  149.                 }


  150.             }
  151.         }else
  152.         {
  153.             Save_Data.isUsefull = false;
  154.             errorLog(25);
  155.         }
  156.         USART2_CLR_Buf();
  157.     }
  158.         else
  159.     {
  160.         Save_Data.isUsefull = false;
  161.         errorLog(25);
  162.     }
  163. }

  164. void printGpsBuffer()
  165. {
  166.                 if(Save_Data.isUsefull)
  167.                 {
  168.                         Save_Data.isUsefull = false;
  169.                         printf("Save_Data.latitude = ");
  170.                         printf(Save_Data.latitude);
  171.                         printf("\r\n");

  172.                         printf("Save_Data.longitude = ");
  173.                         printf(Save_Data.longitude);
  174.                         printf("\r\n");
  175.                        
  176.                         postGpsDataToOneNet(API_KEY, device_id, sensor_gps, Save_Data.longitude, Save_Data.latitude);                //發(fā)送數(shù)據(jù)到Onenet
  177.                        
  178.                         LED1 = 0;
  179.                         delay_ms(100);
  180.                         LED1 = 1;
  181.                 }
  182.                 else
  183.                 {
  184.                         printf("GPS DATA is not usefull!\r\n");
  185.                 }
  186. }

  187. int Digcount(long num)
  188. {
  189.         int i=0;       
  190.         while(num>0)
  191.         {
  192.                 i++;
  193.                 num=num/10;
  194.         }
  195.   return i;
  196. }

  197. char* longitudeToOnenetFormat(char *lon_str_temp)                 //經(jīng)度
  198. {
  199.         unsigned long lon_Onenet = 0;
  200.         unsigned int dd_int = 0;
  201.         unsigned long mm_int = 0;
  202.         float lon_Onenet_double = 0;
  203.         int i = 0;

  204.         unsigned long tempInt = 0;
  205.         unsigned long tempPoint = 0;
  206.         char result[20];
  207.         char point_result[15];
  208.         int pointLength = 0;

  209.         //51單片機(jī)沒有double,double和float,精度不夠,這里只能分開整數(shù)和小數(shù)換算。
  210.         sscanf(lon_str_temp, "%ld.%ld", &tempInt,&tempPoint);
  211.         lon_Onenet = tempInt%100;
  212.         pointLength = strlen(lon_str_temp) - 1 - Digcount(tempInt);               
  213.         for( i = 0 ; i < pointLength ; i++)        //小數(shù)點(diǎn)幾位,整數(shù)部分就放大10的幾次方
  214.         {
  215.                 lon_Onenet *= 10;        
  216.         }

  217.         dd_int = tempInt / 100; //取出dd

  218.         mm_int = lon_Onenet + tempPoint; //取出MM部分

  219.         mm_int = mm_int*10/6;                         //本來是除以60,這里*10/6為了多2位小數(shù)點(diǎn)有有效數(shù)字


  220.            sprintf(result,"%d.",dd_int);
  221.         for( i = 0 ; i < pointLength + 2 - Digcount(mm_int) ; i++)
  222.         {
  223.                 strcat(result, "0");       
  224.         }
  225.         sprintf(point_result,"%ld",mm_int);
  226.         strcat(result, point_result);

  227. //        SendString("\r\n==========ONENET FORMART==========\r\n");
  228. //        SendString(result);
  229.         return result;
  230. }



  231. char* latitudeToOnenetFormat(char *lat_str_temp)                 //緯度
  232. {
  233.         unsigned long lat_Onenet = 0;
  234.         int dd_int = 0;
  235.         unsigned long mm_int = 0;

  236.         int i = 0;

  237.         unsigned long tempInt = 0;
  238.         unsigned long tempPoint = 0;
  239.         char result[20];
  240.         char  point_result[15];
  241.         int pointLength = 0;
  242. //        char xdata debugTest[30];
  243.        
  244.         //51單片機(jī)沒有double,double和float,精度不夠,這里只能分開整數(shù)和小數(shù)換算。
  245.         sscanf(lat_str_temp, "%ld.%ld", &tempInt,&tempPoint);
  246.         lat_Onenet = tempInt%100;
  247.        
  248. //        SendString("\r\n==========ONENET FORMART strlen(lat_str_temp)==========\r\n");
  249. //        sprintf(debugTest,"%d",strlen(lat_str_temp));
  250. //        SendString(debugTest);

  251.         pointLength = strlen(lat_str_temp) - 1 - Digcount(tempInt);       

  252. //        SendString("\r\n==========ONENET FORMART pointLength==========\r\n");
  253. //        sprintf(debugTest,"%d",pointLength);
  254. //        SendString(debugTest);
  255.         for( i = 0 ; i < pointLength ; i++)        //小數(shù)點(diǎn)幾位,整數(shù)部分就放大10的幾次方
  256.         {
  257.                 lat_Onenet *= 10;        
  258.         }

  259. //        SendString("\r\n==========ONENET FORMART tempPoint==========\r\n");
  260. //        sprintf(debugTest,"%ld",tempPoint);
  261. //        SendString(debugTest);
  262. //
  263. //        SendString("\r\n==========ONENET FORMART tempInt==========\r\n");
  264. //        sprintf(debugTest,"%ld",tempInt);
  265. //        SendString(debugTest);
  266. //
  267. //        SendString("\r\n==========ONENET FORMART lat_Onenet==========\r\n");
  268. //        sprintf(debugTest,"%ld",lat_Onenet);
  269. //        SendString(debugTest);

  270.         dd_int = tempInt / 100; //取出dd

  271.         mm_int = lat_Onenet + tempPoint; //取出MM部分

  272.         mm_int = mm_int*10/6;                         //本來是除以60,這里*10/6為了多2位小數(shù)點(diǎn)有有效數(shù)字

  273. //        SendString("\r\n==========ONENET FORMART mm_int==========\r\n");
  274. //        sprintf(debugTest,"%ld",mm_int);
  275. //        SendString(debugTest);

  276.        
  277.         sprintf(result,"%d.",dd_int);
  278.         for( i = 0 ; i < pointLength + 2 - Digcount(mm_int) ; i++)
  279.         {
  280.                 strcat(result, "0");       
  281.         }
  282.         sprintf(point_result,"%ld",mm_int);
  283.         strcat(result, point_result);

  284. //        SendString("\r\n==========ONENET FORMART==========\r\n");
  285. //        SendString(result);
  286.         return result;
  287. }

  288. void postGpsDataToOneNet(char* API_VALUE_temp, char* device_id_temp, char* sensor_id_temp, char* lon_temp, char* lat_temp)
  289. {
  290.         char send_buf[400] = {0};
  291.         char text[200] = {0};
  292.         char tmp[25] = {0};

  293.         char sendCom[2] = {0x1A};

  294. //        dtostrf(longitudeToOnenetFormat(lon_temp), 3, 6, lon_str_end); //轉(zhuǎn)換成字符串輸出
  295. //        dtostrf(latitudeToOnenetFormat(lat_temp), 2, 6, lat_str_end); //轉(zhuǎn)換成字符串輸出

  296. //        lon_temp = "11224.4992";
  297. //        lat_temp = "3438.1633";

  298.         //sprintf(lon_str_end,"%s", longitudeToOnenetFormat(lon_temp));
  299.         //sprintf(lat_str_end,"%s", latitudeToOnenetFormat(lat_temp));

  300.         //連接服務(wù)器
  301.         memset(send_buf, 0, 400);    //清空
  302.         strcpy(send_buf, "AT+CIPSTART=\"TCP\",\"");
  303.         strcat(send_buf, OneNetServer);
  304.         strcat(send_buf, "\",80\r\n");
  305.         if (sendCommand(send_buf, "CONNECT", 10000, 3) == Success);
  306.         else errorLog(7);

  307.         //發(fā)送數(shù)據(jù)
  308.         if (sendCommand("AT+CIPSEND\r\n", ">", 3000, 1) == Success);
  309.         else errorLog(8);

  310.         memset(send_buf, 0, 400);    //清空

  311.         /*準(zhǔn)備JSON串*/
  312.         //ARDUINO平臺(tái)不支持sprintf的double的打印,只能轉(zhuǎn)換到字符串然后打印
  313. //        sprintf(text, "{\"datastreams\":[{\"id\":\"%s\",\"datapoints\":[{\"value\":{\"lon\":%s,\"lat\":%s}}]}]}"
  314. //                , sensor_id_temp, lon_str_end, lat_str_end);
  315.     sprintf(text, "{\"datastreams\":[{\"id\":\"%s\",\"datapoints\":[{\"value\":{\"lon\":%s,\"lat\":%s}}]}]}"
  316.                 , sensor_id_temp, lon_temp, lat_temp);

  317.         /*準(zhǔn)備HTTP報(bào)頭*/
  318.         send_buf[0] = 0;
  319.         strcat(send_buf, "POST /devices/");
  320.         strcat(send_buf, device_id_temp);
  321.         strcat(send_buf, "/datapoints HTTP/1.1\r\n"); //注意后面必須加上\r\n
  322.         strcat(send_buf, "api-key:");
  323.         strcat(send_buf, API_VALUE_temp);
  324.         strcat(send_buf, "\r\n");
  325.         strcat(send_buf, "Host:");
  326.         strcat(send_buf, OneNetServer);
  327.         strcat(send_buf, "\r\n");
  328.         sprintf(tmp, "Content-Length:%d\r\n\r\n", strlen(text)); //計(jì)算JSON串長(zhǎng)度
  329.         strcat(send_buf, tmp);
  330.         strcat(send_buf, text);

  331.         if (sendCommand(send_buf, send_buf, 3000, 1) == Success);
  332.         else errorLog(9);

  333.        
  334.         if (sendCommand(sendCom, "\"succ\"}", 6000, 1) == Success);
  335.         else errorLog(10);

  336.         delay_ms(100);
  337.         if (sendCommand("AT+CIPCLOSE\r\n", "CLOSE OK", 3000, 1) == Success);
  338.         else errorLog(11);
  339.         delay_ms(100);

  340.         if (sendCommand("AT+CIPSHUT\r\n", "SHUT OK", 3000, 1) == Success);
  341.         else errorLog(11);
  342.         delay_ms(100);

  343. }


  344. void sendMessage(char *number,char *msg)
  345. {
  346.         char send_buf[20] = {0};
  347.         memset(send_buf, 0, 20);    //清空
  348.         strcpy(send_buf, "AT+CMGS=\"");
  349.         strcat(send_buf, number);
  350.         strcat(send_buf, "\"\r\n");
  351.         if (sendCommand(send_buf, ">", 3000, 10) == Success);
  352.         else errorLog(6);


  353.         if (sendCommand(msg, msg, 3000, 1) == Success);
  354.         else errorLog(7);
  355.         delay_ms(100);

  356.         memset(send_buf, 0, 100);    //清空
  357.         send_buf[0] = 0x1a;
  358.         if (sendCommand(send_buf, "OK\r\n", 10000, 5) == Success);
  359.         else errorLog(8);
  360.         delay_ms(100);
  361. }

  362. void errorLog(int num)
  363. {
  364.         printf("ERROR%d\r\n",num);
  365.         while (1)
  366.         {
  367.                 if (sendCommand("AT\r\n", "OK", 100, 10) == Success)
  368.                 {
  369.                         Sys_Soft_Reset();
  370.                 }
  371.                 delay_ms(200);
  372. ……………………

  373. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
OneNet平臺(tái)應(yīng)用資料.7z (798.71 KB, 下載次數(shù): 58)


評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:193811 發(fā)表于 2019-6-20 22:35 | 顯示全部樓層
為啥那兩個(gè)工程的資料包在keil5里打不開呢?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表