STM32移植 MQTT_mqtt recv函数,2024年最新干货面试教程

44 阅读1分钟
	 //打开网络连接
	mysock = transport\_open(host, port);
	if(mysock < 0)
		return mysock;
	printf("Sending to hostname %s port %d\n", host, port);
//现在将连接字符串格式化一下,现在还没有发送
	len = MQTTSerialize\_connect(buf, buflen, &data);
	printf("%s",buf);
	//现在是数据的发送
	rc = transport\_sendPacketBuffer(mysock, buf, len);
	/\* 等待connack \*///发送后接收服务器返回的数据,这里使用了一个函数的指针,要定义这个指针
	if (MQTTPacket\_read(buf, buflen, transport_getdata) == CONNACK)//CONNACK – 确认连接请求
	{
		unsigned char sessionPresent, connack_rc
		if (MQTTDeserialize\_connack(&sessionPresent, &connack_rc, buf, buflen) != 1 || connack_rc != 0)
		{
			printf("Unable to connect, return code %d\n", connack_rc);
			goto exit;
		}
	}
	else
		goto exit;
	/\* 订阅 \*/
	topicString.cstring = "substopic";
	len = MQTTSerialize\_subscribe(buf, buflen, 0, msgid, 1, &topicString, &req_qos);
	rc = transport\_sendPacketBuffer(mysock, buf, len);
	//等待服务器答复
	//SUBACK 订阅确认 报文包含一个返回码清单, 它们指定了 SUBSCRIBE 请求的每个订阅被授予的最大 QoS 等级。
	if (MQTTPacket\_read(buf, buflen, transport_getdata) == SUBACK) 	/\* 等待 suback \*/
	{
		unsigned short submsgid;
		int subcount;
		int granted_qos;
		rc = MQTTDeserialize\_suback(&submsgid, 1, &subcount, &granted_qos, buf, buflen);
		if (granted_qos != 0)
		{
			printf("granted qos != 0, %d\n", granted_qos);
			goto exit;
		}
	}
	else
		goto exit;
	/\* 循环获取消息 on subscribed topic \*/
// topicString.cstring = "pubtopic";
// while (1)
	{
		/\* transport\_getdata() has a built-in 1 second timeout,
 your mileage will vary \*/
		if (MQTTPacket\_read(buf, buflen, transport_getdata) == PUBLISH)//qos 响应报文,当qos>0时才有响应
		{
			unsigned char dup;
			int qos;
			unsigned char retained;
			unsigned short msgid;
			int payloadlen_in;
			unsigned char\* payload_in;
			int rc;
			MQTTString receivedTopic;
			rc = MQTTDeserialize\_publish(&dup, &qos, &retained, &msgid, &receivedTopic,
					&payload_in, &payloadlen_in, buf, buflen);
			printf("message arrived %.\*s\n", payloadlen_in, payload_in); //消息到达
		}
		printf("publishing reading\n");//读取发布
     //下面两行是用来发布消息。这里发布,上面订阅,就形成了一个循环。
		len = MQTTSerialize\_publish(buf, buflen, 0, 0, 0, 0, topicString, (unsigned char\*)payload, payloadlen);
		rc = transport\_sendPacketBuffer(mysock, buf, len);
		delay\_ms(1000);
	}
	while(1)
	{
		len = MQTTSerialize\_pingreq(buf, buflen);//发送心跳
		rc = transport\_sendPacketBuffer(mysock, buf, len);//发送
		delay\_s(55);
		printf("心跳");
	}
exit:
	transport\_close(mysock); 

MQTT实质上只是一个协议,搞清楚什么是订阅什么是发布,如何保持连接。

鉴于网友要求现在提供工程文件:
链接:pan.baidu.com/s/1OiG0CdIu…
提取码:d5ni

img img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取