我是靠谱客的博主 开心电源,最近开发中收集的这篇文章主要介绍M5311-MQTT使用记录模块初始化MQTT连接百度云MQTT测试,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

模块初始化

初始化的时候不管三七二十,直接硬复位

bool GPRS_Init()//(const char APN[])
{

    /GPRS PWR & RST
    GPIO_SetBits(GPIOB,GPIO_Pin_1);//唤醒
    GPIO_SetBits(GPIOB,GPIO_Pin_13);//复位
    //vTaskDelay(3000);

    printf("开关机处理rn");
    UARTClearRxBuffer();

    GPIO_ResetBits(GPIOB,GPIO_Pin_13);//复位
    vTaskDelay(3000);
    GPIO_SetBits(GPIOB,GPIO_Pin_13);

    //等待*ATREADY:1
    pr_dbg("等待*ATREADY:1rn");
    if(!GPRS_WaitForTargetRsp("*ATREADY: 1",GPRS_INIT_TIME_OUT))
    {
        return false;
    }
    //等待+CFUN:1
    pr_dbg("等待+CFUN:1rn");
    if(!GPRS_WaitForTargetRsp("+CFUN: 1",GPRS_INIT_TIME_OUT))
    {
        return false;
    }
    //等待CPIN: READY
    pr_dbg("等待CPIN: READYrn");
    if(!GPRS_WaitForTargetRsp("+CPIN: READY",GPRS_INIT_TIME_OUT))
    {
        return false;
    }
    //设置state状态
    pr_dbg("设置state的状态rn");
    if(!GPRS_ATCmd_A("AT+CMSYSCTRL=0,2",1000))
    {
        // return false;
    }
    //等待+IP:x.x.x.x
    pr_dbg("等待+IP:x.x.x.xrn");
    if(!GPRS_WaitEventWithStrParam("+IP:",local_IP,local_IP_size,GPRS_INIT_IP_TIME_OUT))
    {
        pr_err("等待IP超时rn");
        return false;
    }
    pr_dbg("IP:%srn",local_IP);
    //清除驻网记录
    pr_dbg("清除驻网记录rn");

    int param;
    if(!GPRS_ATCmd_D("AT+CLPLMN",&param,1,GPRS_INIT_TIME_OUT))
    {
        return false;
    }

    //关闭模块自动深度休眠
    pr_dbg("关闭自动休眠rn");
    if(!GPRS_ATCmd_A("AT+SM=LOCK_FOREVER",GPRS_INIT_TIME_OUT))
    {
        return false;
    }
    //关闭模块eDRX功能
    pr_dbg("关闭模块eDRX功能rn");
    if(!GPRS_ATCmd_A("AT+CEDRXS=0,5",GPRS_INIT_TIME_OUT))
    {
        return false;
    }

    //读取CIMI(IMSI)
    pr_dbg("读取CIMIrn");
    if(!GPRS_ATCmd_B("AT+CIMI",CIMI,32,GPRS_INIT_TIME_OUT))
    {
        return false;
    }
    pr_dbg("CIMI:%srn",CIMI);
    //确认基站注册状态
    pr_dbg("确认基站注册状态rn");
    {
        int param[2];
        if(!GPRS_ATCmd_D("AT+CEREG?",param,2,GPRS_INIT_TIME_OUT))
        {
            return false;
        }
        pr_dbg("+CEREG:%d,%drn",param[0],param[1]);
        if(param[1]!=1&&param[1]!=5)
        {
            return false;
        }
    }
    //确认PDP 激活状态
    pr_dbg("确认PDP 激活状态rn");
    {
        int param;
        if(!GPRS_ATCmd_D("AT+CGATT?",&param,1,GPRS_INIT_TIME_OUT))
        {
            return false;
        }
        pr_dbg("+CGATT:%drn",param);
        if(param!=1)
        {
            return false;
        }
    }

    //确认PSM 参数是否设置成功
    {
        //..
    }
    //读取IMEI(IMEI)IMEI
    if(!GPRS_ATCmd_B("AT+GSN",IMEI,32,GPRS_INIT_TIME_OUT))
    {
        return false;
    }
    pr_dbg("IMEI:%srn",IMEI);
    //读取CCID(CCID)
    pr_dbg("读取CCIDrn");
    if(!GPRS_ATCmd_C("AT+ICCID",CCID,32,GPRS_INIT_TIME_OUT))
    {
        return false;
    }
    pr_dbg("CCID:%srn",CCID);
    //检查信号质量
    pr_dbg("检查信号质量rn");
    {
        int param[2];
        if(!GPRS_ATCmd_D("AT+CSQ",param,2,GPRS_INIT_TIME_OUT))
        {
            return false;
        }
        pr_dbg("rssi:%d,ber:%drn",param[0],param[1]);
    }
    return true;
}

MQTT连接

#define string const char *
typedef struct
{
    string host;
    int port;
    string id;
    int keepAlive;
    string user;
    string passwd;
    bool clean;
    bool encrypt;
} MQTT_Config_t;


bool mqtt_sub(string topic);

bool MQTT_Connect(MQTT_Config_t *config)//(const char ip[],int port,const char *id,const char *user,const char *pass)
{
    char str[255]= {0}; //=<host>,<port>,<id>,<keepAlive>,<user>,<passwd>,<clean>[,<encrypt>]
    static const char mqttcfg[]="AT+MQTTCFG="%s",%d,"%s",%d,"%s","%s",%d,%d";//  <host>,<port>,<id>,<keepAlive>,<user>,<passwd>,<clean>[,<encrypt>]

    sprintf(str,mqttcfg,
            config->host,
            config-> port,
            config-> id,
            config-> keepAlive,
            config-> user,
            config-> passwd,
            config-> clean,
            config-> encrypt
           );

    pr_dbg("开始MQTT配置rn");
    if(!GPRS_ATCmd_A(str,GPRS_INIT_TIME_OUT))
    {
        return false;
    }


    pr_dbg("MQTT连接rn");
    if(!GPRS_ATCmd_A("AT+MQTTOPEN=1,1,0",GPRS_INIT_TIME_OUT))
    {
        return false;
    }

    //+MQTTOPEN: OK
    pr_dbg("等待MQTT连接成功rn");
    if(!GPRS_WaitForTargetRsp("+MQTTOPEN: OK",GPRS_INIT_TIME_OUT))
    {
        return false;
    }

    pr_dbg("订阅主题:rn");

    mqtt_sub("/topic1");
    mqtt_sub("/topic2");
    mqtt_sub("/topic3");

    return true;

}

bool mqtt_connect()
{

    MQTT_Config_t config= {
        . host="***********",
        . port=1883,
        . id="test",
        . keepAlive=60,
        . user="root",
        . passwd="asdmmmm",
        . clean = 1,
        . encrypt=0
    };
    bool result= MQTT_Connect(&config);

    if(result)
    {
        pr_dbg("MQTT测试成功rn");
    }
    else
    {
        pr_err("测试shibairn");
    }
    return result;
}

MQTT订阅

 文档里面说的是参数index可以不输入,但是不给会报错,默认写0就好

后续测试也不是这样,还是会出现报错,在登录MQTT后加点延时再订阅消息就不会报错了


//主题订阅
bool mqtt_sub(string topic)
{
    char str[255]= {0};
    pr_dbg("订阅主题:rn");
    sprintf(str,"AT+MQTTSUB="%s",2,0",topic);
    if(!GPRS_ATCmd_A(str,GPRS_INIT_TIME_OUT))
    {
        return false;
    }
    pr_dbg("等待MQTT订阅结果rn");
    if(!GPRS_WaitForTargetRsp("+MQTTSUBACK:",GPRS_INIT_TIME_OUT))
    {
        return false;
    }
    return true;
}

MQTT主题发布

bool mqtt_pub(string topic,string msg)
{

    static const char *mqtt_pub_fmt ="AT+MQTTPUB="%s","%d",%d,%d,%d,"%s"";//
    char str[255]= {0};
    // char *topic="/hzx/ctl";//topic 订阅的主题
    int qos=2;//qos 订阅的消息的 QoS 等级,支持 0-2
    int retain=0;//retain 服务器是否储存该消息,并向新订阅者发送最新订阅消息,0-1
    int dup=0;//dup 重发标志,0-1
    int msg_len=0;//msg_len 输入消息类型,0-字符串输入,1-16 进制串输入,缺省时为 message 解析为字符串输入
    //char *message="mqtt_send_test msg";//message 消息内容

    int len = sprintf(str,mqtt_pub_fmt,topic,qos,retain,dup,msg_len,msg);

    if(!GPRS_ATCmd_A(str,GPRS_INIT_TIME_OUT))
    {
        return false;
    }

    pr_dbg("等待发送应答rn");
    if(!GPRS_WaitForTargetRsp("+MQTTPUBCOMP",GPRS_INIT_TIME_OUT))
    {
        pr_dbg("MQTT发送失败rn");
        return false;
    }

    pr_dbg("MQTT发送成功rn");

    return true;

}

bool mqtt_send_test()
{
    mqtt_pub("/topic/ack","hello world");
}

百度云MQTT测试

上面的测试是在自检MQTT服务器上的测试,但是在百度云上有所区别,我发现百度云MQTT的Qos级别不支持Qos2。在客户端上测试发布Qos2的消息就会卡死,也不能订阅Qos2的消息。

添加主题

如图不支持$开头的主题,被用来做系统主题了,这里也提醒到我可以用通配符+来注册一类的主题。例如:nbdev/+/request

问题记录

  • 模块电压及功率不够的时候会造成模块联网失败。
  • 我是用的模块下载串口电路花里花哨,有多个电需要提供。其实就是为了电平兼容,设计上多余了啊,给我造成了很多困扰。

 

 

最后

以上就是开心电源为你收集整理的M5311-MQTT使用记录模块初始化MQTT连接百度云MQTT测试的全部内容,希望文章能够帮你解决M5311-MQTT使用记录模块初始化MQTT连接百度云MQTT测试所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部