找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 733|回复: 4
收起左侧

基于STM32单片机SIM800C的MQTT实现源码

[复制链接]
ID:389262 发表于 2023-11-16 11:02 | 显示全部楼层 |阅读模式
  1. #include "./sys/sys.h"
  2. #include "./delay/delay.h"
  3. #include "./usart/usart.h"
  4. #include "./LED/led.h"                           
  5. #include "./LCD/lcd.h"  
  6. #include "./KEY/key.h"  
  7. #include "./RTC/rtc.h"
  8. //#include "./RTC/bsp_rtc.h"
  9. #include "./BEEP/beep.h"
  10. #include "usmart.h"
  11. #include "malloc.h"
  12. #include "./SDIO/sdio_sdcard.h"  
  13. #include "./W25QXX/w25qxx.h"   
  14. #include "./src/ff.h"  
  15. #include "./exfuns/exfuns.h"   
  16. #include "text.h"       
  17. #include "piclib.h"
  18. #include "./TOUCH/touch.h"        
  19. #include "./USART2/usart2.h"
  20. #include "./USART3/usart3.h"
  21. #include "./MPU6050/mpu6050.h"
  22. #include "sim800c.h"
  23. #include "./gps.h"
  24. #include "./OV7670/ov7670.h"
  25. #include "./NRF24L01/24l01.h"
  26. #include "./TIMER/timer.h"                         
  27. //#include "./OV7670/sccb.h"       
  28. #include "./OV2640/ov2640.h"
  29. #include "MQTTPacket.h"
  30. #include "StackTrace.h"
  31. #include "inv_mpu.h"
  32. #include "inv_mpu_dmp_motion_driver.h"

  33. #include "./T9INPUT/t9input.h"
  34. #include "stdarg.h"
  35. #include <string.h>
  36. #include <stdio.h>  
  37. #include <stdlib.h>

  38. /* 私有变量 ------------------------------------------------------------------*/
  39. FATFS mfs;                                                                                                        /* FatFs文件系统对象 */
  40. FIL mfile;                                                                                                        /* 文件对象 */
  41. FRESULT mf_res;                    /* 文件操作结果 */
  42. char mfpath[] = "0:TEXT";                  /* 保存当前扫描路径 */
  43. BYTE WriteBuffer[100] = "欢迎使用智能终端\r\n";
  44. UINT file_num;

  45. nmea_msg gpsx;                                                                                                                                                                                                        //GPS信息

  46. const u8 *port = (u8 *)"1883";                                                                                                                                        //端口固定为1883
  47. const u8 *ipaddr = (u8 *)"118.190.146.251";
  48. typedef struct
  49. {
  50.         float temp[3];
  51.         float humi[3];
  52.         float gps[3];
  53.         uint8_t door[4];
  54.         short mpu[6];
  55. }menu_message,*menu_message_;

  56. uint16_t screen_w = 800;                                                                                                                                                                //屏幕宽度
  57. uint16_t screen_h = 480;                                                                                                                                                                //屏幕高度
  58. uint8_t line_w = 3;                                                                                                                                                                                        //分界线宽
  59. uint8_t menu_num = 4;                                                                                                                                                                                //菜单组数
  60. uint8_t cur_menu_item,old_menu_item;                                                                                                                //当前菜单

  61. uint8_t tmp_buf[33];                                                                                                                                                                                //NRF缓存

  62. u8 mqtt_msg[200]={0};                                                                                                                                                                                //MQTT消息包缓存
  63. u16 len;                                                                                                                                                                                                                                //消息包有效长度
  64. u8 gprs_tcp_flag;                                                                                                                                                                                                //TCP连接标志
  65. u8 mqtt_data_flag;                                                                                                                                                                                        //MQTT消息类型标志
  66. u8 send_data_flag;                                                                                                                                                                                        //发布消息标志

  67. u8 temp_data[] = "##################------000000000000";                                //36字节 MQTT消息内容缓存
  68. u8 message_type;                                                                                                                                                                                //消息类型,区别TOPIC主题
  69. u8 about_text_size = 24;                                                                                                                                                                //关于字体大小
  70. u8* const Info_Show[13]=
  71.         {
  72.                 "温度1","温度2","温度3",
  73.                 "湿度1","湿度2","湿度3",
  74.                 "GPS经度","GPS纬度",
  75.                 "车门信息","陀螺仪状态",
  76.                 "服务器IP","蓝牙地址","阈值设置"
  77.         };

  78. menu_message menu_mess;
  79. //_t9_obj * t9in;                                                                                                                                                                                                //输入法
  80. //私有函数声明
  81. void sim800c_init(void);                                                                                                                                                                //SIM800C初始化

  82. void gprs_send_data(u8 * data,u8 lenth);                                                                                                        //GPRS发送数据
  83. u8 *my_strstr(const u8 *s1,u16 n1,const u8 *s2,u16 n2);                                                //字符串查找
  84. void Start_Gprs_TCP(void);                                                                                                                                                                //GPRS建立TCP连接
  85. void Stop_Gprs_Connect(void);                                                                                                                                                        //关闭GPRS连接
  86. void Gps_Msg_Show(void);                                                                                                                                                                        //显示GPS定位信息
  87. void send_model_temp_humi(menu_message * mes,u8 * space,u8 type);        //MQTT发送内容包装

  88. int main(void)
  89. {
  90.         int sys_run_times=0;
  91.         unsigned char valtest=0;
  92.         u8 key,fontok=0;           

  93.         u8 *p1,*p2,*p3;
  94.         u8 hbeaterrcnt=0;                                                                                                                                //心跳错误计数器,连续5次心跳信号无应答,则重新连接
  95.        
  96. //        t9in = 0;
  97.         gprs_tcp_flag = 0;
  98.         mqtt_data_flag = 0;
  99.         send_data_flag = 0;
  100.         message_type = 0;

  101.         delay_init();                                                                                                                                                //延时函数初始化          
  102.   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
  103.         uart_init(115200);                                                                                                                        //串口初始化为115200
  104.         usmart_dev.init(72);                                                                                                                //初始化USMART               
  105.        
  106.   GENERAL_TIMx_Configuration();                                                                                //通用定时器初始化:1ms中断一次
  107.         LED_Init();                                                                                                                                                        //初始化与LED连接的硬件接口
  108.         KEY_Init();                                                                                                                                                        //初始化按键
  109.         LCD_Init();                                                                                                                                                        //初始化LCD  
  110.         BEEP_Init();                                                                                                                                                //蜂鸣器初始化
  111.         W25QXX_Init();                                                                                                                                        //初始化W25Q128
  112.         tp_dev.init();                                                                                                                                        //初始化触摸屏
  113.         usart3_init(115200);                                                                                                                //初始化串口3
  114.         my_mem_init(SRAMIN);                                                                                                                //初始化内部内存池
  115.         exfuns_init();                                                                                                                                        //为fatfs相关变量申请内存  
  116.         f_mount(fs[0],"0:",1);                                 //挂载SD卡
  117.         f_mount(fs[1],"1:",1);                                 //挂载FLASH.
  118.         key=KEY_Scan(0);  
  119.         if(key==KEY0_PRES&&((tp_dev.touchtype&0X80)==0))//强制校准
  120.         {
  121.                 LCD_Clear(WHITE);                                                                                                                        //清屏0
  122.                 TP_Adjust();                                                                                                                                        //屏幕校准
  123.                 TP_Save_Adjdata();          
  124.                 LCD_Clear(WHITE);                                                                                                                        //清屏
  125.         }
  126.         fontok=font_init();                                                                                                                        //检查字库是否OK
  127.         if(fontok||key==KEY1_PRES)                            //需要更新字库                                 
  128.         {
  129.                 LCD_Clear(WHITE);                                                                                                                        //清屏
  130.                 POINT_COLOR=RED;                                                                                                                        //设置字体为红色                                
  131.                 LCD_ShowString(60,50,200,16,16,(u8 *)"ALIENTEK STM32");
  132.                 while(SD_Init())                                                                                                                        //检测SD卡
  133.                 {
  134.                         LCD_ShowString(60,70,200,16,16,(u8 *)"SD Card Failed!");
  135.                         delay_ms(200);
  136.                         LCD_Fill(60,70,200+60,70+16,WHITE);
  137.                         delay_ms(200);                    
  138.                 }
  139.                 LCD_ShowString(60,70,200,16,16,(u8 *)"SD Card OK");
  140.                 LCD_ShowString(60,90,200,16,16,(u8 *)"Font Updating...");
  141.                 key=update_font(20,110,16,(u8 *)"0:");                                //从SD卡更新
  142.                 while(key)                                                                                                                                                //更新失败               
  143.                 {                                           
  144.                         LCD_ShowString(60,110,200,16,16,(u8 *)"Font Update Failed!");
  145.                         delay_ms(200);
  146.                         LCD_Fill(20,110,200+20,110+16,WHITE);
  147.                         delay_ms(200);                       
  148.                 }                   
  149.                 LCD_ShowString(60,110,200,16,16,(u8 *)"Font Update Success!");
  150.                 delay_ms(1500);       
  151.                 LCD_Clear(WHITE);                                                                                                                        //清屏               
  152.         }
  153.        
  154.         //RTC_CheckAndConfig(&systmtime);
  155.         RTC_Init();                                                                                                                                                        //RTC初始化
  156.         delay_ms(1000);
  157.         RTC_Get();
  158.         printf("time:%02d-%02d-%02d.%02d:%02d:%02d\r\n",calendar.w_year%100,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);
  159.        
  160.         init_gps();
  161.        
  162.         NRF24L01_Init();
  163.         while(NRF24L01_Check()){;}
  164.         NRF24L01_RX_Mode();
  165.        
  166.         LCD_Clear(BLACK);
  167.         key = 0;
  168.        
  169.         piclib_init();                                                                                                                                        //初始化画图
  170.        
  171.         //I2C初始化
  172.         i2c_CfgGpio();
  173.   //MPU6050初始化
  174.         MPU6050_Init();

  175.         //检测MPU6050
  176. //        while(!MPU6050ReadID()){;}

  177.         while(sim800c_send_cmd((u8 *)"AT",(u8 *)"OK",100))//检测是否应答AT指令
  178.         {
  179.                 Show_Str(40,55,200,16,(u8 *)"未检测到模块!!!",16,0);
  180.                 delay_ms(800);
  181.                 Show_Str(40,55,200,16,(u8 *)"尝试连接模块...",16,0);
  182.                 delay_ms(400);  
  183.         }
  184.         printf("SIM800C Check OK\r\n");

  185.         p1=mymalloc(SRAMIN,100);                                                                                                //申请100字节内存
  186.        
  187.         while(1)
  188.         {
  189.                 if(NRF24L01_RxPacket(tmp_buf)==0)
  190.     {
  191.       printf("NRF24L01:%s\r\n",(char *)tmp_buf);
  192.                         switch(tmp_buf[17])
  193.                         {
  194.                                 case '0'://终端1
  195.                                         menu_mess.temp[0] = tmp_buf[19] == '+' ? ((tmp_buf[20] - '0') * 10 + (tmp_buf[21] - '0') * 1 + (tmp_buf[23] - '0') * 0.1 + (tmp_buf[24] - '0') * 0.01) : \
  196.                                                                                                                                                                                                         -((tmp_buf[20] - '0') * 10 + (tmp_buf[21] - '0') * 1 + (tmp_buf[23] - '0') * 0.1 + (tmp_buf[24] - '0') * 0.01);
  197.                                         if(tmp_buf[27] != '#')
  198.                                         menu_mess.humi[0] = (tmp_buf[27] - '0') * 10 + (tmp_buf[28] - '0') * 1;
  199.                                         break;
  200.                                 case '1'://终端2
  201.                                         menu_mess.temp[1] = tmp_buf[19] == '+' ? ((tmp_buf[20] - '0') * 10 + (tmp_buf[21] - '0') * 1 + (tmp_buf[23] - '0') * 0.1 + (tmp_buf[24] - '0') * 0.01) : \
  202.                                                                                                                                                                                                         -((tmp_buf[20] - '0') * 10 + (tmp_buf[21] - '0') * 1 + (tmp_buf[23] - '0') * 0.1 + (tmp_buf[24] - '0') * 0.01);
  203.                                         if(tmp_buf[27] != '#')
  204.                                         menu_mess.humi[1] = (tmp_buf[27] - '0') * 10 + (tmp_buf[28] - '0') * 1;
  205.                                         break;
  206.                                 case '2'://终端3
  207.                                         menu_mess.temp[2] = tmp_buf[19] == '+' ? ((tmp_buf[20] - '0') * 10 + (tmp_buf[21] - '0') * 1 + (tmp_buf[23] - '0') * 0.1 + (tmp_buf[24] - '0') * 0.01) : \
  208.                                                                                                                                                                                                         -((tmp_buf[20] - '0') * 10 + (tmp_buf[21] - '0') * 1 + (tmp_buf[23] - '0') * 0.1 + (tmp_buf[24] - '0') * 0.01);
  209.                                         if(tmp_buf[27] != '#')
  210.                                         menu_mess.humi[2] = (tmp_buf[27] - '0') * 10 + (tmp_buf[28] - '0') * 1;
  211.                                         break;
  212.                                 case '3'://终端4
  213.                                         menu_mess.door[0] = tmp_buf[19] == 0x17 ? 0x11 : 0x10;
  214.                                         break;
  215.                                 default :
  216.                                         break;
  217.                         }
  218.     }
  219.        
  220.                 sys_run_times++;
  221.                 if(gprs_tcp_flag == 17)
  222.                 {
  223.                         //构建MQTT连接
  224.                         switch(mqtt_data_flag)
  225.                         {
  226.                                 case 0:
  227.                                         sim800c_send_cmd("AT+CIPSTATUS","OK",500);        //查询连接状态
  228.                                         if(strstr((const char*)USART3_RX_BUF,"CONNECT OK"))
  229.                                         {
  230.                                                 len=mqtt_connect_message(mqtt_msg,"STM32","admin","public");//id=123456,用户名和密码为空
  231.                                                 gprs_send_data((u8 *)mqtt_msg,len);
  232.                                                 delay_ms(600);
  233.                                                 len=mqtt_subscribe_message(mqtt_msg,"home/temp",1,1);                        //订阅test主题
  234.                                                 gprs_send_data((u8 *)mqtt_msg,len);
  235.                                                 printf("MQTT Connect and subscribe OK\r\n");
  236.                                         }
  237.                                         mqtt_data_flag = 1;
  238.                                         break;
  239.                                 case 1:
  240.                                         if(17 == send_data_flag)
  241.                                         {
  242.                                                 MQTTString topicString = MQTTString_initializer;
  243.                                                
  244.                                                 RTC_Get();
  245.                                                 send_model_temp_humi(&menu_mess,(u8 *)temp_data,message_type);
  246.                                                
  247.                                                 temp_data[24] = calendar.w_year%100/10+'0';
  248.                                                 temp_data[25] = calendar.w_year%10+'0';
  249.                                                
  250.                                                 temp_data[26] = calendar.w_month%100/10+'0';
  251.                                                 temp_data[27] = calendar.w_month%10+'0';
  252.                                                
  253.                                                 temp_data[28] = calendar.w_date%100/10+'0';
  254.                                                 temp_data[29] = calendar.w_date%10+'0';
  255.                                                
  256.                                                 temp_data[30] = calendar.hour%100/10+'0';
  257.                                                 temp_data[31] = calendar.hour%10+'0';
  258.                                        
  259.                                                 temp_data[32] = calendar.min%100/10+'0';
  260.                                                 temp_data[33] = calendar.min%10+'0';
  261.                                                
  262.                                                 temp_data[34] = calendar.sec%100/10+'0';
  263.                                                 temp_data[35] = calendar.sec%10+'0';
  264.                                                
  265.                                                 printf("数据发送中...\r\n");                                                //提示数据发送中
  266.                                                 if(0 == message_type)
  267.                                                 {
  268.                                                         topicString.cstring = "L180309001/YY0118050001/Temp";                                                                                                //发送的主题
  269.                                                 }
  270.                                                 else if(1 == message_type)
  271.                                                 {
  272.                                                         topicString.cstring = "L180309001/YY0118050001/EGps";
  273.                                                 }
  274.                                                 else if(2 == message_type)
  275.                                                 {
  276.                                                         topicString.cstring = "L180309001/YY0118050001/Gyro";
  277.                                                 }
  278.                                                 else if(3 == message_type)
  279.                                                 {
  280.                                                         topicString.cstring = "L180309001/YY0118050001/Door";
  281.                                                 }
  282.                                                 else if(4 == message_type)
  283.                                                 {
  284.                                                         topicString.cstring = "L180309001/YY0118050001/Point";
  285.                                                 }
  286.                                                 message_type++;
  287.                                                 if(message_type>=5)
  288.                                                         message_type = 0;
  289.                                                 len = MQTTSerialize_publish(mqtt_msg, 200, 0, 0, 0, 0, topicString, (u8 *)temp_data, strlen((const char *)temp_data)); /* 2 */
  290.                                                 gprs_send_data((u8 *)mqtt_msg,len);
  291.                                                 printf("MQTT Send data OK\r\n");
  292.                                                 send_data_flag = 0;GPIOB -> ODR ^= GPIO_Pin_5;
  293.                                         }
  294.                                         break;
  295.                         }
  296.                         if(USART3_RX_STA&0X8000)                                                                                                                                                                        //接收到一次数据了
  297.                         {
  298.                                 USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;                                                                                                        //添加结束符
  299.                                 printf("%s",USART3_RX_BUF);                                                                                                                                                        //发送到串口  
  300.                                 if(hbeaterrcnt)                                                                                                                                                                                                        //需要检测心跳应答
  301.                                 {
  302.                                         if(strstr((const char*)USART3_RX_BUF,"SEND OK"))hbeaterrcnt=0;//心跳正常
  303.                                 }
  304.                                 p2=(u8*)strstr((const char*)USART3_RX_BUF,"+IPD");
  305.                                 if(p2)                                                                                                                                                                                                                                        //接收到TCP/UDP数据
  306.                                 {
  307.                                         p3=(u8*)strstr((const char*)p2,",");
  308.                                         p2=(u8*)strstr((const char*)p2,":");
  309.                                         p2[0]=0;                                                                                                                                                                                                                        //加入结束符
  310.                                         sprintf((char*)p1,"收到%s字节",p3+1);                                                                                                        //接收到的字节数
  311.                                         printf("%s\r\n",(char*)p1);
  312.                                 }
  313.                                 USART3_RX_STA=0;
  314.                         }
  315.                        
  316.                 }
  317.                 else
  318.                 {
  319.                         Start_Gprs_TCP();                                                                                                                                                                                                        //创建TCP连接
  320.                 }
  321.                 if(17 == (sys_run_times%100))
  322.                 {
  323.                         menu_mess.gps[0] = (float)(gpsx.longitude/100000);
  324.                         menu_mess.gps[1] = (float)(gpsx.latitude/100000);
  325.                         menu_mess.gps[2] = (float)(gpsx.speed/1000);

  326.                         send_data_flag = 17;
  327.                         printf("Send flag OK\r\n");
  328.                         hbeaterrcnt++;
  329.                         printf("hbeaterrcnt:%d\r\n",hbeaterrcnt);                                                                                                        //方便调试代码
  330.                 }
  331.                 else if(27 == (sys_run_times%5000))
  332.                 {
  333.                         len = mqtt_ping_message(mqtt_msg);                                                                                                                                /* 2 */
  334.                         gprs_send_data((u8 *)mqtt_msg,len);
  335.                         printf("heart Send OK\r\n");
  336.                 }
  337.                 switch(KEY_Scan(0))
  338.                 {
  339.                         case KEY0_PRES:
  340.                                 f_close(&mfile);
  341.                                 while(1)
  342.                                 {
  343.                                         printf("System Stop\r\n");
  344.                                         delay_ms(1000);
  345.                                 }
  346.                                 break;
  347.                         default:
  348.                                 break;
  349.                 }
  350.                
  351.                 delay_ms(6);
  352. //                printf("Sys_Time:%d \r\n",sys_run_times);
  353.         }
  354.        
  355.         while(1)
  356.         {
  357.                 printf("Error\r\n");
  358.                 delay_ms(500);
  359.         }
  360.           
  361. }

  362. void Start_Gprs_TCP(void)
  363. {
  364.         //
  365.         u8 *p1,p2[100];
  366.         u8 res=0;
  367.         p1=mymalloc(SRAMIN,100);                                                                                                                                                                        //申请50个字节的内存
  368.         sim800c_send_cmd((u8 *)"ATE0",(u8 *)"OK",200);                                                                                //不回显
  369.         USART3_RX_STA=0;
  370.         sim800c_send_cmd("AT+SAPBR=3,1,\"Contype\",\"GPRS\"","OK",200);                //配置承载场景1
  371.         sim800c_send_cmd("AT+SAPBR=3,1,\"APN\",\"CMNET\"","OK",200);
  372.         sim800c_send_cmd("AT+SAPBR=1,1",0,200);                                                                                                                //激活一个GPRS上下文
  373.         delay_ms(5);
  374.         sim800c_send_cmd("AT+CNTPCID=1","OK",200);                                                                                                //设置CNTP使用的CID
  375.         sim800c_send_cmd("AT+CNTP=\"202.120.2.101\",32","OK",200);                                //设置NTP服务器和本地时区(32时区 时间最准确)
  376.         sim800c_send_cmd("AT+CNTP","+CNTP: 1",600);                                                                                                //同步网络时间
  377.        
  378.         USART3_RX_STA=0;
  379.         if(sim800c_send_cmd("AT+CPIN?","OK",200))res|=1<<0;                                                                //查询SIM卡是否在位
  380.         USART3_RX_STA=0;
  381.          
  382.         if(0 == res)
  383.         {
  384.                 sim800c_send_cmd("AT+CIPCLOSE=1","CLOSE OK",100);                                                                //关闭连接
  385.                 sim800c_send_cmd("AT+CIPSHUT","SHUT OK",100);                                                                                //关闭移动场景
  386.                 if(sim800c_send_cmd("AT+CGCLASS=\"B\"","OK",1000))                                                        printf("SIM800C Init1 FAIL\r\n");        //设置GPRS移动台类别为B,支持包交换和数据交换
  387.                 if(sim800c_send_cmd("AT+CGDCONT=1,\"IP\",\"CMNET\"","OK",1000))        printf("SIM800C Init2 FAIL\r\n");        //设置PDP上下文,互联网接协议,接入点等信息
  388.                 if(sim800c_send_cmd("AT+CGATT=1","OK",500))                                                                                        printf("SIM800C Init3 FAIL\r\n");        //附着GPRS业务
  389.                 if(sim800c_send_cmd("AT+CIPCSGP=1,\"CMNET\"","OK",500))                                        printf("SIM800C Init4 FAIL\r\n");        //设置为GPRS连接模式
  390.                 if(sim800c_send_cmd("AT+CIPHEAD=1","OK",500))                                                                                printf("SIM800C Init5 FAIL\r\n");        //设置接收数据显示IP头(方便判断数据来源)
  391.                 printf("SIM800C Start OK\r\n");
  392.                
  393.                 USART3_RX_STA=0;
  394.                 sprintf((char*)p2,"AT+CIPSTART=\"%s\",\"%s\",\"%s\"","TCP",ipaddr,port);
  395.                
  396.                 if(0==sim800c_send_cmd(p2,"OK",500))                                                                                                                //发起连接
  397.                 {
  398.                         delay_ms(1500);delay_ms(1000);
  399.                         sim800c_send_cmd("AT+CIPSTATUS","OK",500);                                                                                //查询连接状态
  400.                         USART3_RX_STA = 0;
  401.                         if(strstr((const char*)USART3_RX_BUF,"CONNECT OK"))
  402.                         {
  403.                                 gprs_tcp_flag = 17;
  404.                                 printf("SIM800C TCP Connect OK\r\n");
  405.                         }
  406.                         else
  407.                         {
  408.                                 gprs_tcp_flag = 0;
  409.                                 printf("SIM800C TCP Connect Fail\r\n");
  410.                         }
  411.                 }
  412.         }
  413.         myfree(SRAMIN,p2);
  414. }
  415. void Stop_Gprs_Connect(void)
  416. {
  417.         sim800c_send_cmd("AT+CIPCLOSE=1","CLOSE OK",100);                                                                        //关闭连接
  418.         sim800c_send_cmd("AT+CIPSHUT","SHUT OK",100);                                                                                        //关闭移动场景
  419. }

  420. void send_model_temp_humi(menu_message * mes,u8 * space,u8 type)
  421. {
  422.         long val;
  423.         u8 t;
  424.         //if(strlen(space)<36)return;
  425.         switch(type)
  426.         {
  427.                 case 0:                                                                                                                                                                //温湿度+RTC
  428.                         for(t = 0;t < 3;t ++)
  429.                         {
  430.                                 val = (int)(mes->temp[t] * 100);
  431.                                 if(val<0)
  432.                                 {
  433.                                         space[t * 6] = '-';
  434.                                 }
  435.                                 else
  436.                                 {
  437.                                         space[t * 6] = '+';
  438.                                 }
  439.                                 val = val >= 0 ? val : -val;
  440.                                 space[t * 6 + 1] = val % 10000 /1000 + '0';
  441.                                 space[t * 6 + 2] = val % 1000 /100 + '0';
  442.                                 space[t * 6 + 3] = '.';
  443.                                 space[t * 6 + 4] = val % 100 /10 + '0';
  444.                                 space[t * 6 + 5] = val % 10 /1 + '0';
  445.                                
  446.                                 val = (int)(mes->humi[t]);
  447.                                 space[18 + t * 2] = val % 100 / 10 + '0';
  448.                                 space[18 + t * 2 + 1] = val % 10 / 1 + '0';
  449.                         }
  450.                         printf("Temp_Data:%s\r\n",(u8 *)space);
  451.                         break;
  452.                 case 1:                                                                                                                                                                //GPS+RTC
  453.                         for(t = 0;t < 2;t ++)
  454.                         {
  455.                                 val = (long)(mes->gps[t] * 100000);
  456.                                 if(val<0)
  457.                                 {
  458.                                         space[t * 10] = '-';
  459.                                 }
  460.                                 else
  461.                                 {
  462.                                         space[t * 10] = '+';
  463.                                 }
  464.                                 val = val >= 0 ? val : -val;
  465.                                 space[t * 10 + 1] = val % 100000000 /10000000 + '0';
  466.                                 space[t * 10 + 2] = val % 10000000 /1000000 + '0';
  467.                                 space[t * 10 + 3] = val % 1000000 /100000 + '0';
  468.                                 space[t * 10 + 5] = val % 100000 /10000 + '0';
  469.                                 space[t * 10 + 6] = val % 10000 /1000 + '0';
  470.                                 space[t * 10 + 7] = val % 1000 /100 + '0';
  471.                                 space[t * 10 + 8] = val % 100 /10 + '0';
  472.                                 space[t * 10 + 9] = val % 10 /1 + '0';
  473.                                 space[t * 10 + 4] = '.';
  474.                         }
  475.                         val = (int)(mes->gps[2] * 10);
  476.                         space[20] = val % 10000 / 1000 + '0';
  477.                         space[21] = val % 1000 / 100 + '0';
  478.                         space[22] = val % 100 / 10 + '0';
  479.                         space[23] = val % 10 / 1 + '0';
  480.                         printf("Gps_Data:%s\r\n",(u8 *)space);
  481.                         break;
  482.                 case 2:                                                                                                                                                                //陀螺仪+RTC
  483.                         MPU6050ReadAcc((short *)(mes->mpu));
  484.                         for(t = 0;t < 3;t ++)
  485.                         {
  486.                                 space[t * 2] = ((mes -> mpu[t]) >> 8) & 0xFF;
  487.                                 space[t * 2 + 1] = (mes -> mpu[t]) & 0xFF;
  488.                         }
  489.                         MPU6050ReadGyro((short *)(mes->mpu));
  490.                         for(t = 0;t < 3;t ++)
  491.                         {
  492.                                 space[6 + t * 2] = ((mes -> mpu[t]) >> 8) & 0xFF;
  493.                                 space[6 + t * 2 + 1] = (mes -> mpu[t]) & 0xFF;
  494.                         }
  495.                        
  496.                         for(t = 12;t < 24;t ++)
  497.                         {
  498.                                 space[t] = '#';
  499.                         }
  500.                         printf("Gyro_Data:%s\r\n",(u8 *)space);
  501.                         break;
  502.                 case 3:                                                                                                                                                                //开关门+RTC
  503.                         space[0] = mes->door[0] + '0';
  504.                         for(t = 1;t < 24;t ++)
  505.                         {
  506.                                 space[t] = '#';
  507.                         }
  508.                         printf("Door_Data:%s\r\n",(u8 *)space);
  509.                         break;
  510.                 case 4:                                                                                                                                                                //点熄火+RTC
  511.                         space[0] = mes->door[1] + '0';
  512.                         for(t = 1;t < 24;t ++)
  513.                         {
  514.                                 space[t] = '#';
  515.                         }
  516.                         printf("Point_Data:%s\r\n",(u8 *)space);
  517.                         break;
  518.                 default :
  519.                         break;
  520.         }
  521.        
  522. }


  523. //在str1字符串中找出str2字符串(不包括str2的串结束符,忽略str中的\0)
  524. //返回该位置的指针,如找不到,返回空指针
  525. u8 *my_strstr(const u8 *s1,u16 n1,const u8 *s2,u16 n2)  
  526. {  
  527.         int n,x=0,y=0;  
  528.         if (*s2)          
  529.         {
  530.                 while(1)                 
  531.                 {
  532.                         if(*s1==*s2)//找到s2第一次出现,两种情况考虑
  533.                         {
  534.                                 for (n=0;n<n2;n++)  
  535.                                 {
  536.                                         if (*(s1+n)==*(s2+n))
  537.                                         {
  538.                                                 y++;
  539.                                                 if (y>=n2)
  540.                                                 //if (!*(s2+n+1))        //s2下一个字符是否为'\0'  
  541.                                                 {  
  542.                                                         return (u8 *)s1;  
  543.                                                 }
  544.                                                 if (x+n>=n1-1)        //防止数组越界
  545.                                                 {  
  546.                                                         return NULL;  
  547.                                                 }
  548.                                                 if (*(s1+n+1)!=*(s2+n+1))//查找的下一个字符不相等,一个字符相等
  549.                                                 {
  550.                                                         break;
  551.                                                 }
  552.                                         }
  553.                                         else
  554.                                         {  
  555.                                                 break;
  556.                                         }
  557.                                 }  
  558.                         }
  559.                         s1++;
  560.                         x++;
  561.                         if(x>=n1)
  562.                         {
  563.                                 break;
  564.                         }
  565.                 }  
  566.                 return NULL;  
  567.         }  
  568.         else  
  569.         {  
  570.                 return (u8*)s1;  
  571.         }  
  572. }


  573. void gprs_send_data(u8 *data,u8 lenth)
  574. {
  575.         if(sim800c_send_cmd("AT+CIPSEND",">",500)==0)                //发送数据
  576.         {
  577.                 //u3_printf("%s",(u8 *)data);
  578.                 my_u3_send((char *)mqtt_msg,lenth);
  579.                 delay_ms(10);
  580.                 if(sim800c_send_cmd((u8*)0X1A,"SEND OK",5000)==0)
  581.                         printf("GPRS数据发送成功!\r\n");//最长等待10s
  582.         }
  583.         else
  584.                 sim800c_send_cmd((u8*)0X1B,0,0);        //ESC,取消发送
  585. }
复制代码

原理图: 无
仿真: 无
代码: GPRS MQTT STM32.7z (1.56 MB, 下载次数: 28)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1057978 发表于 2023-11-17 08:03 | 显示全部楼层
厉害领了,stm32也能搞mqtt了啊,是以太网通讯解析字符吗?
回复

使用道具 举报

ID:59738 发表于 2023-11-21 10:59 | 显示全部楼层
现在很多Dtu固件的 4G卡 比较方便
回复

使用道具 举报

ID:1057978 发表于 2023-12-12 15:51 | 显示全部楼层
STM32怎么进行TCP通讯呢老哥
回复

使用道具 举报

ID:499508 发表于 2024-1-18 21:03 | 显示全部楼层
这是AT指令GSM模块里的MQTT,不能做MQTT透传
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表