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

模块初始化

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
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连接

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#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后加点延时再订阅消息就不会报错了

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//主题订阅 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主题发布

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
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测试内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部