久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3993|回復: 1
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
內容詳細講解STM32如何向onenet發送數據


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

  9. //用于調試可不接
  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;       //定時器計數器


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


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

  27. //char device_id[] = "10129834";    //修改為自己的設備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();          //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
  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);//關閉承載,再重新打開
  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);        //解析錯誤
  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;        //獲取經度信息
  136.                             case 2:memcpy(Save_Data.latitude, subString, subStringNext - subString);break;        //獲取緯度信息
  137.                             case 3:memcpy(Save_Data.UTCTime, subString, subStringNext - subString);break;        //獲取UTC時間
  138.                             default:break;
  139.                         }
  140.                         
  141.                         subString = subStringNext;
  142.                     }
  143.                     else
  144.                     {
  145.                         Save_Data.isUsefull = false;
  146.                         errorLog(2);        //解析錯誤
  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);                //發送數據到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)                 //經度
  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單片機沒有double,double和float,精度不夠,這里只能分開整數和小數換算。
  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++)        //小數點幾位,整數部分就放大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位小數點有有效數字


  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單片機沒有double,double和float,精度不夠,這里只能分開整數和小數換算。
  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++)        //小數點幾位,整數部分就放大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位小數點有有效數字

  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); //轉換成字符串輸出
  295. //        dtostrf(latitudeToOnenetFormat(lat_temp), 2, 6, lat_str_end); //轉換成字符串輸出

  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.         //連接服務器
  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.         //發送數據
  308.         if (sendCommand("AT+CIPSEND\r\n", ">", 3000, 1) == Success);
  309.         else errorLog(8);

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

  311.         /*準備JSON串*/
  312.         //ARDUINO平臺不支持sprintf的double的打印,只能轉換到字符串然后打印
  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.         /*準備HTTP報頭*/
  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)); //計算JSON串長度
  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. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
OneNet平臺應用資料.7z (798.71 KB, 下載次數: 58)


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:193811 發表于 2019-6-20 22:35 | 只看該作者
為啥那兩個工程的資料包在keil5里打不開呢?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 青青草综合 | 久综合 | 99久久免费精品国产免费高清 | 亚洲精品久久久久久首妖 | 一级毛片视频免费观看 | a级黄色毛片免费播放视频 国产精品视频在线观看 | 国产精品久久久久久久久久免费看 | 国产精品三级 | 亚洲精品视频免费观看 | 久久国产精品久久久久久 | 亚洲精品久久久久久久久久久久久 | 最新中文字幕第一页视频 | 日韩精品在线播放 | 一级日韩| 欧美在线视频一区二区 | 日韩精品在线播放 | 人人鲁人人莫人人爱精品 | 日本激情视频网 | 国产高清免费 | 精品久久国产 | 九九九视频在线观看 | www视频在线观看 | 黄色电影在线免费观看 | 亚洲国产成人精品女人久久久 | 欧美激情在线播放 | 国产xxxx在线| 国产在线精品免费 | 久久99精品国产自在现线小黄鸭 | 成年人黄色免费视频 | 亚洲精品国产电影 | 国产在线精品一区二区 | 欧美黄色一区 | 在线日韩福利 | 伊大人久久 | 国产精品久久久久久久久免费樱桃 | 中文字幕在线网 | 91欧美精品成人综合在线观看 | 亚洲一区二区三区在线 | 成人a视频 | 欧美成人一区二区三区 | 国产精品视频一二三区 |