OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 30093|回复: 39

SIM800C+MQTT+STM32F103+安卓APP测试源程序

  [复制链接]

37

主题

477

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2285
金钱
2285
注册时间
2017-8-24
在线时间
375 小时
发表于 2018-6-20 11:49:34 | 显示全部楼层 |阅读模式
根据论坛里面大神的开源ESP8266模块连接MQTT服务器改写的GPRS连接MQTT服务器,自己写的安卓APP测试程序(不太完善)
GPRS模块使用SIM800C

程序首先初始化变量,硬件初始化,检测SIM800C和NRF(4个节点),大循环里面根据GPRS的连接状态控制
如果还未连接网络,就先连接网络,连接网络之后如果还未连接服务器就连接服务器,连接服务器之后就会间隔1秒左右发送一次数据,几个主题发送不同的数据
同时通过4个NRF接收3路温湿度和1路霍尔传感器数据

u8 temp_data[] = "##################------000000000000";                                //36字节 MQTT消息内容缓存
最后是RTC时间,前面是发送的数据全部转换成字符进行发送,具体的协议可以自己定义

例如NRF第18个字节代表NRF终端编号
以下是温度拆解过程
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) : \
-((tmp_buf[20] - '0') * 10 + (tmp_buf[21] - '0') * 1 + (tmp_buf[23] - '0') * 0.1 + (tmp_buf[24] - '0') * 0.01);

先判断编号之后的符号,再合成具有两位小数的温度数据

#include "./sys/sys.h"
#include "./delay/delay.h"
#include "./usart/usart.h"
#include "./LED/led.h"                           
#include "./LCD/lcd.h"  
#include "./KEY/key.h"  
#include "./RTC/rtc.h"
//#include "./RTC/bsp_rtc.h"
#include "./BEEP/beep.h"
#include "usmart.h"
#include "malloc.h"
#include "./SDIO/sdio_sdcard.h"  
#include "./W25QXX/w25qxx.h"   
#include "./src/ff.h"  
#include "./exfuns/exfuns.h"   
#include "text.h"       
#include "piclib.h"
#include "./TOUCH/touch.h"        
#include "./USART2/usart2.h"
#include "./USART3/usart3.h"
#include "./MPU6050/mpu6050.h"
#include "sim800c.h"
#include "./gps.h"
#include "./OV7670/ov7670.h"
#include "./NRF24L01/24l01.h"
#include "./TIMER/timer.h"                         
//#include "./OV7670/sccb.h"       
#include "./OV2640/ov2640.h"
#include "MQTTPacket.h"
#include "StackTrace.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h"

#include "./T9INPUT/t9input.h"
#include "stdarg.h"
#include <string.h>
#include <stdio.h>  
#include <stdlib.h>

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

nmea_msg gpsx;                                                                                                                                                                                                        //GPS信息

const u8 *port = (u8 *)"1883";                                                                                                                                        //端口固定为1883
const u8 *ipaddr = (u8 *)"118.190.146.251";
typedef struct
{
        float temp[3];
        float humi[3];
        float gps[3];
        uint8_t door[4];
        short mpu[6];
}menu_message,*menu_message_;

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

uint8_t tmp_buf[33];                                                                                                                                                                                //NRF缓存

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

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

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

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

int main(void)
{
        int sys_run_times=0;
        unsigned char valtest=0;
        u8 key,fontok=0;           

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

        delay_init();                                                                                                                                                //延时函数初始化          
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
        uart_init(115200);                                                                                                                        //串口初始化为115200
        usmart_dev.init(72);                                                                                                                //初始化USMART               
       
  GENERAL_TIMx_Configuration();                                                                                //通用定时器初始化:1ms中断一次
        LED_Init();                                                                                                                                                        //初始化与LED连接的硬件接口
        KEY_Init();                                                                                                                                                        //初始化按键
        LCD_Init();                                                                                                                                                        //初始化LCD  
        BEEP_Init();                                                                                                                                                //蜂鸣器初始化
        W25QXX_Init();                                                                                                                                        //初始化W25Q128
        tp_dev.init();                                                                                                                                        //初始化触摸屏
        usart3_init(115200);                                                                                                                //初始化串口3
        my_mem_init(SRAMIN);                                                                                                                //初始化内部内存池
        exfuns_init();                                                                                                                                        //为fatfs相关变量申请内存  
        f_mount(fs[0],"0:",1);                                 //挂载SD卡
        f_mount(fs[1],"1:",1);                                 //挂载FLASH.
        key=KEY_Scan(0);  
        if(key==KEY0_PRES&&((tp_dev.touchtype&0X80)==0))//强制校准
        {
                LCD_Clear(WHITE);                                                                                                                        //清屏0
                TP_Adjust();                                                                                                                                        //屏幕校准
                TP_Save_Adjdata();          
                LCD_Clear(WHITE);                                                                                                                        //清屏
        }
        fontok=font_init();                                                                                                                        //检查字库是否OK
        if(fontok||key==KEY1_PRES)                            //需要更新字库                                 
        {
                LCD_Clear(WHITE);                                                                                                                        //清屏
                POINT_COLOR=RED;                                                                                                                        //设置字体为红色                                
                LCD_ShowString(60,50,200,16,16,(u8 *)"ALIENTEK STM32");
                while(SD_Init())                                                                                                                        //检测SD卡
                {
                        LCD_ShowString(60,70,200,16,16,(u8 *)"SD Card Failed!");
                        delay_ms(200);
                        LCD_Fill(60,70,200+60,70+16,WHITE);
                        delay_ms(200);                    
                }
                LCD_ShowString(60,70,200,16,16,(u8 *)"SD Card OK");
                LCD_ShowString(60,90,200,16,16,(u8 *)"Font Updating...");
                key=update_font(20,110,16,(u8 *)"0:");                                //从SD卡更新
                while(key)                                                                                                                                                //更新失败               
                {                                           
                        LCD_ShowString(60,110,200,16,16,(u8 *)"Font Update Failed!");
                        delay_ms(200);
                        LCD_Fill(20,110,200+20,110+16,WHITE);
                        delay_ms(200);                       
                }                   
                LCD_ShowString(60,110,200,16,16,(u8 *)"Font Update Success!");
                delay_ms(1500);       
                LCD_Clear(WHITE);                                                                                                                        //清屏               
        }
       
        //RTC_CheckAndConfig(&systmtime);
        RTC_Init();                                                                                                                                                        //RTC初始化
        delay_ms(1000);
        RTC_Get();
        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);
       
        init_gps();
       
        NRF24L01_Init();
        while(NRF24L01_Check()){;}
        NRF24L01_RX_Mode();
       
        LCD_Clear(BLACK);
        key = 0;
       
        piclib_init();                                                                                                                                        //初始化画图
       
        //I2C初始化
        i2c_CfgGpio();
  //MPU6050初始化
        MPU6050_Init();

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

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

        p1=mymalloc(SRAMIN,100);                                                                                                //申请100字节内存
       
        while(1)
        {
                if(NRF24L01_RxPacket(tmp_buf)==0)
    {
      printf("NRF24L01:%s\r\n",(char *)tmp_buf);
                        switch(tmp_buf[17])
                        {
                                case '0'://终端1
                                        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) : \
                                                                                                                                                                                                        -((tmp_buf[20] - '0') * 10 + (tmp_buf[21] - '0') * 1 + (tmp_buf[23] - '0') * 0.1 + (tmp_buf[24] - '0') * 0.01);
                                        if(tmp_buf[27] != '#')
                                        menu_mess.humi[0] = (tmp_buf[27] - '0') * 10 + (tmp_buf[28] - '0') * 1;
                                        break;
                                case '1'://终端2
                                        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) : \
                                                                                                                                                                                                        -((tmp_buf[20] - '0') * 10 + (tmp_buf[21] - '0') * 1 + (tmp_buf[23] - '0') * 0.1 + (tmp_buf[24] - '0') * 0.01);
                                        if(tmp_buf[27] != '#')
                                        menu_mess.humi[1] = (tmp_buf[27] - '0') * 10 + (tmp_buf[28] - '0') * 1;
                                        break;
                                case '2'://终端3
                                        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) : \
                                                                                                                                                                                                        -((tmp_buf[20] - '0') * 10 + (tmp_buf[21] - '0') * 1 + (tmp_buf[23] - '0') * 0.1 + (tmp_buf[24] - '0') * 0.01);
                                        if(tmp_buf[27] != '#')
                                        menu_mess.humi[2] = (tmp_buf[27] - '0') * 10 + (tmp_buf[28] - '0') * 1;
                                        break;
                                case '3'://终端4
                                        menu_mess.door[0] = tmp_buf[19] == 0x17 ? 0x11 : 0x10;
                                        break;
                                default :
                                        break;
                        }
    }
       
                sys_run_times++;
                if(gprs_tcp_flag == 17)
                {
                        //构建MQTT连接
                        switch(mqtt_data_flag)
                        {
                                case 0:
                                        sim800c_send_cmd("AT+CIPSTATUS","OK",500);        //查询连接状态
                                        if(strstr((const char*)USART3_RX_BUF,"CONNECT OK"))
                                        {
                                                len=mqtt_connect_message(mqtt_msg,"STM32","admin","public");//id=123456,用户名和密码为空
                                                gprs_send_data((u8 *)mqtt_msg,len);
                                                delay_ms(600);
                                                len=mqtt_subscribe_message(mqtt_msg,"home/temp",1,1);                        //订阅test主题
                                                gprs_send_data((u8 *)mqtt_msg,len);
                                                printf("MQTT Connect and subscribe OK\r\n");
                                        }
                                        mqtt_data_flag = 1;
                                        break;
                                case 1:
                                        if(17 == send_data_flag)
                                        {
                                                MQTTString topicString = MQTTString_initializer;
                                               
                                                RTC_Get();
                                                send_model_temp_humi(&menu_mess,(u8 *)temp_data,message_type);
                                               
                                                temp_data[24] = calendar.w_year%100/10+'0';
                                                temp_data[25] = calendar.w_year%10+'0';
                                               
                                                temp_data[26] = calendar.w_month%100/10+'0';
                                                temp_data[27] = calendar.w_month%10+'0';
                                               
                                                temp_data[28] = calendar.w_date%100/10+'0';
                                                temp_data[29] = calendar.w_date%10+'0';
                                               
                                                temp_data[30] = calendar.hour%100/10+'0';
                                                temp_data[31] = calendar.hour%10+'0';
                                       
                                                temp_data[32] = calendar.min%100/10+'0';
                                                temp_data[33] = calendar.min%10+'0';
                                               
                                                temp_data[34] = calendar.sec%100/10+'0';
                                                temp_data[35] = calendar.sec%10+'0';
                                               
                                                printf("数据发送中...\r\n");                                                //提示数据发送中
                                                if(0 == message_type)
                                                {
                                                        topicString.cstring = "L180309001/YY0118050001/Temp";                                                                                                //发送的主题
                                                }
                                                else if(1 == message_type)
                                                {
                                                        topicString.cstring = "L180309001/YY0118050001/EGps";
                                                }
                                                else if(2 == message_type)
                                                {
                                                        topicString.cstring = "L180309001/YY0118050001/Gyro";
                                                }
                                                else if(3 == message_type)
                                                {
                                                        topicString.cstring = "L180309001/YY0118050001/Door";
                                                }
                                                else if(4 == message_type)
                                                {
                                                        topicString.cstring = "L180309001/YY0118050001/Point";
                                                }
                                                message_type++;
                                                if(message_type>=5)
                                                        message_type = 0;
                                                len = MQTTSerialize_publish(mqtt_msg, 200, 0, 0, 0, 0, topicString, (u8 *)temp_data, strlen((const char *)temp_data)); /* 2 */
                                                gprs_send_data((u8 *)mqtt_msg,len);
                                                printf("MQTT Send data OK\r\n");
                                                send_data_flag = 0;GPIOB -> ODR ^= GPIO_Pin_5;
                                        }
                                        break;
                        }
                        if(USART3_RX_STA&0X8000)                                                                                                                                                                        //接收到一次数据了
                        {
                                USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;                                                                                                        //添加结束符
                                printf("%s",USART3_RX_BUF);                                                                                                                                                        //发送到串口  
                                if(hbeaterrcnt)                                                                                                                                                                                                        //需要检测心跳应答
                                {
                                        if(strstr((const char*)USART3_RX_BUF,"SEND OK"))hbeaterrcnt=0;//心跳正常
                                }
                                p2=(u8*)strstr((const char*)USART3_RX_BUF,"+IPD");
                                if(p2)                                                                                                                                                                                                                                        //接收到TCP/UDP数据
                                {
                                        p3=(u8*)strstr((const char*)p2,",");
                                        p2=(u8*)strstr((const char*)p2,":");
                                        p2[0]=0;                                                                                                                                                                                                                        //加入结束符
                                        sprintf((char*)p1,"收到%s字节",p3+1);                                                                                                        //接收到的字节数
                                        printf("%s\r\n",(char*)p1);
                                }
                                USART3_RX_STA=0;
                        }
                       
                }
                else
                {
                        Start_Gprs_TCP();                                                                                                                                                                                                        //创建TCP连接
                }
                if(17 == (sys_run_times%100))
                {
                        menu_mess.gps[0] = (float)(gpsx.longitude/100000);
                        menu_mess.gps[1] = (float)(gpsx.latitude/100000);
                        menu_mess.gps[2] = (float)(gpsx.speed/1000);

                        send_data_flag = 17;
                        printf("Send flag OK\r\n");
                        hbeaterrcnt++;
                        printf("hbeaterrcnt:%d\r\n",hbeaterrcnt);                                                                                                        //方便调试代码
                }
                else if(27 == (sys_run_times%5000))
                {
                        len = mqtt_ping_message(mqtt_msg);                                                                                                                                /* 2 */
                        gprs_send_data((u8 *)mqtt_msg,len);
                        printf("heart Send OK\r\n");
                }
                switch(KEY_Scan(0))
                {
                        case KEY0_PRES:
                                f_close(&mfile);
                                while(1)
                                {
                                        printf("System Stop\r\n");
                                        delay_ms(1000);
                                }
                                break;
                        default:
                                break;
                }
               
                delay_ms(6);
//                printf("Sys_Time:%d \r\n",sys_run_times);
        }
       
        while(1)
        {
                printf("Error\r\n");
                delay_ms(500);
        }
          
}

void Start_Gprs_TCP(void)
{
        //
        u8 *p1,p2[100];
        u8 res=0;
        p1=mymalloc(SRAMIN,100);                                                                                                                                                                        //申请50个字节的内存
        sim800c_send_cmd((u8 *)"ATE0",(u8 *)"OK",200);                                                                                //不回显
        USART3_RX_STA=0;
        sim800c_send_cmd("AT+SAPBR=3,1,\"Contype\",\"GPRS\"","OK",200);                //配置承载场景1
        sim800c_send_cmd("AT+SAPBR=3,1,\"APN\",\"CMNET\"","OK",200);
        sim800c_send_cmd("AT+SAPBR=1,1",0,200);                                                                                                                //激活一个GPRS上下文
        delay_ms(5);
        sim800c_send_cmd("AT+CNTPCID=1","OK",200);                                                                                                //设置CNTP使用的CID
        sim800c_send_cmd("AT+CNTP=\"202.120.2.101\",32","OK",200);                                //设置NTP服务器和本地时区(32时区 时间最准确)
        sim800c_send_cmd("AT+CNTP","+CNTP: 1",600);                                                                                                //同步网络时间
       
        USART3_RX_STA=0;
        if(sim800c_send_cmd("AT+CPIN?","OK",200))res|=1<<0;                                                                //查询SIM卡是否在位
        USART3_RX_STA=0;
         
        if(0 == res)
        {
                sim800c_send_cmd("AT+CIPCLOSE=1","CLOSE OK",100);                                                                //关闭连接
                sim800c_send_cmd("AT+CIPSHUT","SHUT OK",100);                                                                                //关闭移动场景
                if(sim800c_send_cmd("AT+CGCLASS=\"B\"","OK",1000))                                                        printf("SIM800C Init1 FAIL\r\n");        //设置GPRS移动台类别为B,支持包交换和数据交换
                if(sim800c_send_cmd("AT+CGDCONT=1,\"IP\",\"CMNET\"","OK",1000))        printf("SIM800C Init2 FAIL\r\n");        //设置PDP上下文,互联网接协议,接入点等信息
                if(sim800c_send_cmd("AT+CGATT=1","OK",500))                                                                                        printf("SIM800C Init3 FAIL\r\n");        //附着GPRS业务
                if(sim800c_send_cmd("AT+CIPCSGP=1,\"CMNET\"","OK",500))                                        printf("SIM800C Init4 FAIL\r\n");        //设置为GPRS连接模式
                if(sim800c_send_cmd("AT+CIPHEAD=1","OK",500))                                                                                printf("SIM800C Init5 FAIL\r\n");        //设置接收数据显示IP头(方便判断数据来源)
                printf("SIM800C Start OK\r\n");
               
                USART3_RX_STA=0;
                sprintf((char*)p2,"AT+CIPSTART=\"%s\",\"%s\",\"%s\"","TCP",ipaddr,port);
               
                if(0==sim800c_send_cmd(p2,"OK",500))                                                                                                                //发起连接
                {
                        delay_ms(1500);delay_ms(1000);
                        sim800c_send_cmd("AT+CIPSTATUS","OK",500);                                                                                //查询连接状态
                        USART3_RX_STA = 0;
                        if(strstr((const char*)USART3_RX_BUF,"CONNECT OK"))
                        {
                                gprs_tcp_flag = 17;
                                printf("SIM800C TCP Connect OK\r\n");
                        }
                        else
                        {
                                gprs_tcp_flag = 0;
                                printf("SIM800C TCP Connect Fail\r\n");
                        }
                }
        }
        myfree(SRAMIN,p2);
}
void Stop_Gprs_Connect(void)
{
        sim800c_send_cmd("AT+CIPCLOSE=1","CLOSE OK",100);                                                                        //关闭连接
        sim800c_send_cmd("AT+CIPSHUT","SHUT OK",100);                                                                                        //关闭移动场景
}

void send_model_temp_humi(menu_message * mes,u8 * space,u8 type)
{
        long val;
        u8 t;
        //if(strlen(space)<36)return;
        switch(type)
        {
                case 0:                                                                                                                                                                //温湿度+RTC
                        for(t = 0;t < 3;t ++)
                        {
                                val = (int)(mes->temp[t] * 100);
                                if(val<0)
                                {
                                        space[t * 6] = '-';
                                }
                                else
                                {
                                        space[t * 6] = '+';
                                }
                                val = val >= 0 ? val : -val;
                                space[t * 6 + 1] = val % 10000 /1000 + '0';
                                space[t * 6 + 2] = val % 1000 /100 + '0';
                                space[t * 6 + 3] = '.';
                                space[t * 6 + 4] = val % 100 /10 + '0';
                                space[t * 6 + 5] = val % 10 /1 + '0';
                               
                                val = (int)(mes->humi[t]);
                                space[18 + t * 2] = val % 100 / 10 + '0';
                                space[18 + t * 2 + 1] = val % 10 / 1 + '0';
                        }
                        printf("Temp_Data:%s\r\n",(u8 *)space);
                        break;
                case 1:                                                                                                                                                                //GPS+RTC
                        for(t = 0;t < 2;t ++)
                        {
                                val = (long)(mes->gps[t] * 100000);
                                if(val<0)
                                {
                                        space[t * 10] = '-';
                                }
                                else
                                {
                                        space[t * 10] = '+';
                                }
                                val = val >= 0 ? val : -val;
                                space[t * 10 + 1] = val % 100000000 /10000000 + '0';
                                space[t * 10 + 2] = val % 10000000 /1000000 + '0';
                                space[t * 10 + 3] = val % 1000000 /100000 + '0';
                                space[t * 10 + 5] = val % 100000 /10000 + '0';
                                space[t * 10 + 6] = val % 10000 /1000 + '0';
                                space[t * 10 + 7] = val % 1000 /100 + '0';
                                space[t * 10 + 8] = val % 100 /10 + '0';
                                space[t * 10 + 9] = val % 10 /1 + '0';
                                space[t * 10 + 4] = '.';
                        }
                        val = (int)(mes->gps[2] * 10);
                        space[20] = val % 10000 / 1000 + '0';
                        space[21] = val % 1000 / 100 + '0';
                        space[22] = val % 100 / 10 + '0';
                        space[23] = val % 10 / 1 + '0';
                        printf("Gps_Data:%s\r\n",(u8 *)space);
                        break;
                case 2:                                                                                                                                                                //陀螺仪+RTC
                        MPU6050ReadAcc((short *)(mes->mpu));
                        for(t = 0;t < 3;t ++)
                        {
                                space[t * 2] = ((mes -> mpu[t]) >> 8) & 0xFF;
                                space[t * 2 + 1] = (mes -> mpu[t]) & 0xFF;
                        }
                        MPU6050ReadGyro((short *)(mes->mpu));
                        for(t = 0;t < 3;t ++)
                        {
                                space[6 + t * 2] = ((mes -> mpu[t]) >> 8) & 0xFF;
                                space[6 + t * 2 + 1] = (mes -> mpu[t]) & 0xFF;
                        }
                       
                        for(t = 12;t < 24;t ++)
                        {
                                space[t] = '#';
                        }
                        printf("Gyro_Data:%s\r\n",(u8 *)space);
                        break;
                case 3:                                                                                                                                                                //开关门+RTC
                        space[0] = mes->door[0] + '0';
                        for(t = 1;t < 24;t ++)
                        {
                                space[t] = '#';
                        }
                        printf("Door_Data:%s\r\n",(u8 *)space);
                        break;
                case 4:                                                                                                                                                                //点熄火+RTC
                        space[0] = mes->door[1] + '0';
                        for(t = 1;t < 24;t ++)
                        {
                                space[t] = '#';
                        }
                        printf("Point_Data:%s\r\n",(u8 *)space);
                        break;
                default :
                        break;
        }
       
}


//在str1字符串中找出str2字符串(不包括str2的串结束符,忽略str中的\0)
//返回该位置的指针,如找不到,返回空指针
u8 *my_strstr(const u8 *s1,u16 n1,const u8 *s2,u16 n2)  
{  
        int n,x=0,y=0;  
        if (*s2)          
        {
                while(1)                 
                {
                        if(*s1==*s2)//找到s2第一次出现,两种情况考虑
                        {
                                for (n=0;n<n2;n++)  
                                {
                                        if (*(s1+n)==*(s2+n))
                                        {
                                                y++;
                                                if (y>=n2)
                                                //if (!*(s2+n+1))        //s2下一个字符是否为'\0'  
                                                {  
                                                        return (u8 *)s1;  
                                                }
                                                if (x+n>=n1-1)        //防止数组越界
                                                {  
                                                        return NULL;  
                                                }
                                                if (*(s1+n+1)!=*(s2+n+1))//查找的下一个字符不相等,一个字符相等
                                                {
                                                        break;
                                                }
                                        }
                                        else
                                        {  
                                                break;
                                        }
                                }  
                        }
                        s1++;
                        x++;
                        if(x>=n1)
                        {
                                break;
                        }
                }  
                return NULL;  
        }  
        else  
        {  
                return (u8*)s1;  
        }  
}


void gprs_send_data(u8 *data,u8 lenth)
{
        if(sim800c_send_cmd("AT+CIPSEND",">",500)==0)                //发送数据
        {
                //u3_printf("%s",(u8 *)data);
                my_u3_send((char *)mqtt_msg,lenth);
                delay_ms(10);
                if(sim800c_send_cmd((u8*)0X1A,"SEND OK",5000)==0)
                        printf("GPRS数据发送成功!\r\n");//最长等待10s
        }
        else
                sim800c_send_cmd((u8*)0X1B,0,0);        //ESC,取消发送
}


安卓APP程序使用AndroidStdio2.3.2开发

可以设置发布主题和内容

欢迎大家修正
捕获.PNG
捕获1.PNG
捕获2.PNG

GPRS MQTT STM32.zip

2.33 MB, 下载次数: 2696

STM32程序

MQTT_Android_Test.zip

37.06 KB, 下载次数: 576

安卓源程序

天然懒,天然呆
能吃会睡,未来可期
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

176

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1105
金钱
1105
注册时间
2015-10-27
在线时间
206 小时
发表于 2018-6-26 11:14:35 | 显示全部楼层
回复 支持 反对

使用道具 举报

70

主题

6697

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12687
金钱
12687
注册时间
2012-11-26
在线时间
3710 小时
发表于 2018-6-26 13:31:17 | 显示全部楼层
好帖,感谢分享,点赞
学无止境
回复 支持 反对

使用道具 举报

12

主题

53

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2015-11-17
在线时间
51 小时
发表于 2018-8-13 16:55:05 | 显示全部楼层
感谢分享!!!!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2018-9-4
在线时间
7 小时
发表于 2018-9-25 10:36:35 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

160

主题

966

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2095
金钱
2095
注册时间
2014-3-7
在线时间
490 小时
发表于 2018-9-25 14:05:50 | 显示全部楼层
本帖最后由 ssssssssssss 于 2018-9-25 14:07 编辑

牛Xxxxxxxx  有图片吗
回复 支持 反对

使用道具 举报

109

主题

5562

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10541
金钱
10541
注册时间
2017-2-18
在线时间
1908 小时
发表于 2018-9-25 19:40:23 | 显示全部楼层
多谢分享
回复 支持 反对

使用道具 举报

6

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
273
金钱
273
注册时间
2011-2-12
在线时间
36 小时
发表于 2018-11-17 14:34:39 | 显示全部楼层
多谢兄弟分享
回复 支持 反对

使用道具 举报

1

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2018-5-24
在线时间
9 小时
发表于 2018-11-20 16:04:47 | 显示全部楼层

多谢兄弟分享,这是高手,上位机、下位机通吃!
回复 支持 反对

使用道具 举报

22

主题

64

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
354
金钱
354
注册时间
2014-7-26
在线时间
66 小时
发表于 2018-12-31 22:01:25 | 显示全部楼层
感觉代码太庞大,不方便学习,有很多其他的分支干扰。努力学习!!感谢分享!
回复 支持 反对

使用道具 举报

109

主题

5562

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10541
金钱
10541
注册时间
2017-2-18
在线时间
1908 小时
发表于 2018-12-31 23:10:34 | 显示全部楼层
多谢分享~
回复 支持 反对

使用道具 举报

15

主题

46

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2017-10-22
在线时间
22 小时
发表于 2019-1-10 19:06:03 | 显示全部楼层
想问下 u8是什么? unsigned int?
回复 支持 反对

使用道具 举报

37

主题

477

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2285
金钱
2285
注册时间
2017-8-24
在线时间
375 小时
 楼主| 发表于 2019-1-18 10:01:58 | 显示全部楼层
彭木白 发表于 2019-1-10 19:06
想问下 u8是什么? unsigned int?

unsigned char 也是标准库里面重定义的数据类型
天然懒,天然呆
能吃会睡,未来可期
回复 支持 反对

使用道具 举报

37

主题

477

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2285
金钱
2285
注册时间
2017-8-24
在线时间
375 小时
 楼主| 发表于 2019-1-18 10:02:33 | 显示全部楼层
profacetom 发表于 2018-12-31 22:01
感觉代码太庞大,不方便学习,有很多其他的分支干扰。努力学习!!感谢分享!

后面再简化下方便学习
天然懒,天然呆
能吃会睡,未来可期
回复 支持 反对

使用道具 举报

6

主题

115

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
251
金钱
251
注册时间
2018-7-7
在线时间
13 小时
发表于 2019-2-22 16:21:46 | 显示全部楼层
WIS800C TCP Client 非透传模式连接远程服务器使用方法 正点原子论坛
http://www.openedv.com/forum.php ... d=288223&extra=
回复 支持 反对

使用道具 举报

1

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2018-8-16
在线时间
68 小时
发表于 2019-2-28 16:54:58 | 显示全部楼层
怎么实现MQTT的心跳的?
回复 支持 反对

使用道具 举报

37

主题

477

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2285
金钱
2285
注册时间
2017-8-24
在线时间
375 小时
 楼主| 发表于 2019-3-4 09:38:38 | 显示全部楼层
swa00000 发表于 2019-2-28 16:54
怎么实现MQTT的心跳的?

定时计数,发送心跳数据,20S一次
天然懒,天然呆
能吃会睡,未来可期
回复 支持 反对

使用道具 举报

1

主题

48

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
231
金钱
231
注册时间
2018-8-16
在线时间
68 小时
发表于 2019-3-13 17:08:45 | 显示全部楼层
xcc521 发表于 2019-3-4 09:38
定时计数,发送心跳数据,20S一次

是数据心跳还是 MQTT 内部的 3个字节心跳
回复 支持 反对

使用道具 举报

37

主题

477

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2285
金钱
2285
注册时间
2017-8-24
在线时间
375 小时
 楼主| 发表于 2019-3-15 09:01:20 | 显示全部楼层
swa00000 发表于 2019-3-13 17:08
是数据心跳还是 MQTT 内部的 3个字节心跳

就是心跳帧,两个字节,具体多少我忘记了
天然懒,天然呆
能吃会睡,未来可期
回复 支持 反对

使用道具 举报

6

主题

65

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
273
金钱
273
注册时间
2011-2-12
在线时间
36 小时
发表于 2019-6-2 11:42:33 | 显示全部楼层
谢谢楼主的分享,正在找这些资料,下载学习一下,
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2019-9-2
在线时间
1 小时
发表于 2019-9-2 16:53:52 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2019-9-3
在线时间
38 小时
发表于 2019-9-3 20:04:55 | 显示全部楼层
感谢分享
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2019-9-5
在线时间
1 小时
发表于 2019-9-12 16:17:28 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

10

主题

293

帖子

0

精华

高级会员

Rank: 4

积分
623
金钱
623
注册时间
2019-6-3
在线时间
107 小时
发表于 2019-9-12 16:53:49 | 显示全部楼层
彭木白 发表于 2019-1-10 19:06
想问下 u8是什么? unsigned int?

8位的unsigned char
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
100
金钱
100
注册时间
2018-12-26
在线时间
29 小时
发表于 2019-11-15 08:55:54 | 显示全部楼层
学习学习
回复 支持 反对

使用道具 举报

1

主题

9

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2019-11-27
在线时间
3 小时
发表于 2019-11-27 16:13:53 | 显示全部楼层
nark.............一个
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
76
金钱
76
注册时间
2019-3-8
在线时间
28 小时
发表于 2019-12-4 16:23:56 | 显示全部楼层
楼主你的mqtt协议是你自己写的吗,下面的库好像没用上
回复 支持 反对

使用道具 举报

37

主题

477

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2285
金钱
2285
注册时间
2017-8-24
在线时间
375 小时
 楼主| 发表于 2019-12-4 17:18:15 | 显示全部楼层
D6T 发表于 2019-12-4 16:23
楼主你的mqtt协议是你自己写的吗,下面的库好像没用上

把主要的几个协议格式简化成自己的函数,比较方便
天然懒,天然呆
能吃会睡,未来可期
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2017-10-31
在线时间
27 小时
发表于 2020-1-10 09:37:45 | 显示全部楼层
学习学习
回复 支持 反对

使用道具 举报

17

主题

61

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2014-6-4
在线时间
19 小时
发表于 2020-2-16 12:05:01 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2019-8-27
在线时间
10 小时
发表于 2020-3-4 17:30:14 | 显示全部楼层
mark 谢谢分享。
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2019-11-16
在线时间
14 小时
发表于 2020-4-23 10:56:29 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2019-9-18
在线时间
12 小时
发表于 2020-5-9 21:40:48 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

0

主题

44

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1719
金钱
1719
注册时间
2019-12-4
在线时间
232 小时
发表于 2020-5-12 15:07:46 | 显示全部楼层
哈哈哈哈哈哈哈哈哈
回复 支持 反对

使用道具 举报

332

主题

495

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1547
金钱
1547
注册时间
2014-7-11
在线时间
256 小时
发表于 2020-8-6 18:11:49 | 显示全部楼层
请问这个工程用的是什么云服务器?
回复 支持 反对

使用道具 举报

0

主题

5

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2019-8-30
在线时间
8 小时
发表于 2020-8-18 16:00:19 | 显示全部楼层
你这个云平台服务器IP不能用域名吗
回复 支持 反对

使用道具 举报

37

主题

477

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
2285
金钱
2285
注册时间
2017-8-24
在线时间
375 小时
 楼主| 发表于 2020-8-18 18:08:11 | 显示全部楼层
仙桃三伏潭 发表于 2020-8-18 16:00
你这个云平台服务器IP不能用域名吗

都可以,DNS能解析到就行
天然懒,天然呆
能吃会睡,未来可期
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2015-11-16
在线时间
4 小时
发表于 2020-9-3 16:55:21 | 显示全部楼层
谢谢分享,已下载
回复 支持 反对

使用道具 举报

10

主题

205

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1322
金钱
1322
注册时间
2015-3-3
在线时间
127 小时
发表于 2021-3-16 17:13:28 | 显示全部楼层
mark一下,好东西,值得关注
海纳百川者,荣耀伴一生!
回复 支持 反对

使用道具 举报

71

主题

152

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
247
金钱
247
注册时间
2014-1-1
在线时间
222 小时
发表于 2021-8-1 14:52:14 来自手机 | 显示全部楼层
lz用的那个域名
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 23:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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