MQTT- 基于 mosquitto 开源 SDK 实现发布订阅 | 学习笔记

简介: 快速学习 MQTT- 基于 mosquitto 开源 SDK 实现发布订阅

开发者学堂课程【嵌入式之 RFID 开发与应用2020版:MQTT- 基于 mosquitto 开源 SDK 实现发布订阅 】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/665/detail/11183


MQTT- 基于 mosquitto 开源 SDK 实现发布订阅

内容介绍:

一、库的初始化是怎样的

二、创建一个客户端

三、设置回调

四、服务器的连接

五、客户端的发布测试

六、MQTT 的主要特点

 

一、库的初始化是怎样的

接下来需要要去看源码,这个环境可以后,源码在文件夹中,其实主要就是 publisher.c 和 subscriber.c 两个文件,这个程序是运行不起来的,因为还要去修改服务器等东西都不一样,首先看一下结合上节课讲的接口。第一步,对于库的一些初始化,先看发布,初始化结束之后,接下来就要创建 mosquitto_lib_init 初始化对应的 mosquitto_lib_cleanup 这是一个配对。

 

二、创建一个客户端

第二个就是创建一个客户端 ,那么这个名字 pubdemo 其实就是终端的唯一标识,自己随便起一个就可以,相当于给自己起个名字。 const char *id(用户自定义标识id)Bool clean _session (后面表示信息的一个保留断开后是否保留订阅信息 ture/false)。最后一个是 void*userdata (回调参数),这个参数后面会有很多回调 callback。callback 里面有一个参数 void *obj, 所有的这些参数其实就是在data去指定的参数,这里虽然没有打印但可以把它打印出来,在回调里面加上“%s     (char*)obj”

这样就把它打印出来了,LINE 是行号,表示打印的第几行。这时发现打印的 obj 的内容是一样的,能打印的都可以打印。 在刚开始学习的时候多加一些调试信息,可以看到它的流程,mosquitto_new 是第二个创建的客户端。 创建客户端返回值是 mosquitto, 而且接下来的所有操作都是基于 m_hMqtt。最后还有一个配对的就是 destroy 和 new ,它们两个是一对。

 

三、设置回调

接下来就是设置回调,这些函数数都是设置函数,需要先把设置设好,现在还没有涉及到联网的问题,那么到时候联网能否成功,联网的这个过程当中所产生的信息就通过这个回调反馈。所以说第一个确认连接的回调就是句柄mosquitto_connect_callback_set(m_hMqtt,my_connect_callback),然后当连接完成了之后会通过函数来反馈,通过rc的值反馈连接是成功的还是失败的,原因是什么,包括参数 。那么需要设置哪些参数,就是断开确认,当网络断开了或者是主动断开了,那么会反馈断开的返回值 ,断开的情况有哪些,也可以通过这个函数来得知 void my_disconnect _callback(struct mosquitto*mosq,void*obj,int result,。 第三个就是接收消息mosquitto_message_callback_set(m_hMqtt,mymessage_callback),确认现在这个是什么接口 ,现在是发布 publisher mosquitto_subscribe_callback_set(m_hMqtt,my_subscribe_callback), 其实发布并不是必须的,就是说如果只是发布是没有必要去设置的。 因为没有订阅过,收不到消息所以是可以不做的。 订阅的都被处理掉了,跟下面这个 mosquitto_subscribe 是匹配的,只有设置了接收订阅的回调,订阅消息之后回调才会被执行。 Mosquitto_subscribe 就是设置订阅回调与 mosquitto_subscribe 是对应的,像上面出现的回调可以注释掉,因为下面已经有相对应的。 再接下来就是连接服务器 mosquitto connect, 那么连接完了之后发布,那么用 mosquitto publish 这个函数 (m_hMqtt,NULL,topicl,strlen(content)+1,connect,1,ture) 去发布一个主题,主题内容是温度,主题的内容设置为 28.8 度,长度 content 加一把 -0 也算进去,而且要把这个值存到服务器,就是万一没有被订阅方拿走这个数据,那这个数据就一直放在服务器, NULL 是它的消息 ID,我们传空跟它自动分配一个消息 ID 。最后通过 mosquitto_look_start 去启动,look start 就是去启动mosquitto 的网络循环,循环监听网络世界。mosquitto_look_start 这个函数调完之后马上就进到 mosquitto_look_stop 这个函数,这个是不阻塞的,阻塞的是里面创建的线程,创建的线程去调用 mosquitto-loop 的时候会去专门处理这些事情。 所以最后在 mosquitto_look_stop 里面就去等待网络断开。最后就结束了。

 

四、服务器的连接

关键的就是去连服务器 那这个服务器肯定不是 10.0.31.240, 现在的服务器是 13,要把它改成现在这个服务器的情况 192.168.1.13 这个端口刚才也试过,就是 1883 好像被系统默认的已经占用了 1893 就可以了,后面这个是一个心跳包的时间间隔是饱和时间两秒钟 ,显然太短了,时间越短的话 ,其实会增加流量,这个时间可以稍微改的长一些就是不要太短。

image.png

 

五、客户端的发布测试

客户端的发布可以进行测试 ,首先把服务器启动起来,1893 就是服务器,服务器跑起来之后,需要先进行编译通过。

image.png

这属于发布,需要在另一个窗口订阅, 订阅需要全部用自己移植的去做,刚才用到的服务器也是自己移植的, 但是可以交叉着来 ,服务器用自己移植的, 然后进到 PC 端的安装目录下 local bin,

image.png

之前写的程序是实现发布功能,在这里实现订阅功能,首先可以把IP的端口复制,在窗口输入 mosquitto_sub-t -h 192.168.1.13 -p 1893,sub 就是订阅 ,-t是主题,主题要与发布的主题相对应,发布的是 temperature,所以要在主题后面跟上 temperature 即-t temperature。这时就已经订阅上了,订阅上之后要去开发板发布,在开发板执行发布,在服务器完成订阅。可以在开发板看到连接服务器成功,12:date 即 12 行打印,并且服务器都能收到了 28 .8 度 ,这是一一对应都可以对应上。

image.png

发布没有问题,订阅也没有问题,接下来看客户端的订阅,客户端的订阅与发布的代码几乎是一样的,就不去重复了 ,比如说这个初始化创建客户端设置回调然后连接服务器,连接服务器把连接的代码给搬过来因为连的同一个服务器,主题这里发布了两个主题 ,其实没有必要,发布一个就可以了。订阅温度,然后下面是一样的,只是订阅完成之后,最后会把收到的消息会在 my_subscribe_callback 这个地方去把订阅的消息回调。订阅回调是执行 mosquitto_subscribe 回调,而消息回调是已经收到了消息,把他的时间主题内容打印出来。改完之后同理编译一下,编译过之后,开发板这边在运行的就应该是订阅 subscriber。运行的就应该是订阅了28.8 度这个其实是刚才自己发布的, 这就是因为设置了保留发布的消息,只要服务器没有关闭,任何人都可以去订阅消息。消息会一直存在服务器上,另外在另一个窗口实现一个发布 ,也就是单独再发布一个消息 ,发布的消息用 -m 来表示,假设是33 .3 度 就收到了 33.3 度。所以说开发版就是终端 既可以实现消息的发布,也可以实现消息的订阅 。如果说有条件比如说订阅百度的 ,有百度的账号 ,那么此时此刻就可以去连接到百度的服务器,一个是订阅百度的,因为百度本身就搭建了一个环境。

image.png

它建了一个 MQTT 的 broker 可以直接去连。自己搭服务器也是没有问题的, 阿里、腾讯这些都有 ,他们都有搭制这种服务器。有关 MQTT 的应用编程就是这些,如果想要更加详细了解其他的一些接口 那么建议到官网http://mosquitto.org/api/files/mosquitto-h.html 去查看。进入到官网之后,mosquitto.h 里有很多的接口 ,比如说联网用的 mosquitto connect 点进去有很多接口,进去之后,首先就会有函数的介绍‘’返回值、参数、 完了之后就是它的这些参数, 每一个参数的后面大概是什么作用以及它的这个返回值的类型, 根据返回值就可以确定它到底是什么原因,所以说每一个都有,整个的这个 mosquito 的开发是非常的便捷,整个的 MQTT 基本上就结束了。

 

六、MQTT 的主要特点

最后简单总结,MQTT 与 tcp 还是不一样的,它是建立在 tcp 之上的。MQTT 最主要的特点就是低带宽、高延迟,软硬件资源有限。 而且即使是这么恶劣的环境 ,还对数据可靠性要求高,而且通过讲的 MQT 的 Tls 可以实现安全加密通信,是可以在实际应用的产品,如果说一个产品再好再可靠 不安全也是不可取的。而且 mosquitto 的作者是由 MQTT 协议创始人之一的 Andy Stanford-Clark 参与开发。基本上 MQTT 就讲这些。

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
4月前
|
监控 物联网 开发工具
MQTT常见问题之MQTT云端sdk消费者 出现重复消费如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
4月前
|
消息中间件 物联网 网络安全
MQTT常见问题之调用.net sdk 报“不知道这样的主机”如何解决
MQTT(Message Queuing Telemetry Transport)是一个轻量级的、基于发布/订阅模式的消息协议,广泛用于物联网(IoT)中设备间的通信。以下是MQTT使用过程中可能遇到的一些常见问题及其答案的汇总:
|
4月前
|
消息中间件
RabbitMQ消息模型之发布订阅Publish-Subscribe
RabbitMQ消息模型之发布订阅Publish-Subscribe
67 0
RabbitMQ消息模型之发布订阅Publish-Subscribe
|
4月前
|
消息中间件 API 开发工具
如何实现一个简单易用的 RocketMQ SDK
2018 年,做为架构负责人,接到一个架构需求:实现一个简单易用的 RocketMQ SDK 。 因为各个团队 RocketMQ 原生客户端配置起来千奇百怪,有的配置存在风险,各团队负责人都需要一个简洁易用的 RocketMQ SDK 。 我立马调研相关开源的方案,当时 RocketMQ-Spring 项目并没有开源,而阿里云的 ONS SDK 是开源的,我只能讲目标转向 阿里云 ONS 。 通过学习 ONS 的设计方式,我对于 RocketMQ 的客户端原理有了进一步了解,同时参考 ONS 的设计,也实现了公司内部使用的 RocketMQ SDK 。
如何实现一个简单易用的 RocketMQ SDK
|
16天前
|
存储 Ubuntu 安全
在Ubuntu 16.04上安装和保护Mosquitto MQTT消息代理的方法
在Ubuntu 16.04上安装和保护Mosquitto MQTT消息代理的方法
31 1
|
2月前
|
消息中间件 新零售 弹性计算
云消息队列 RabbitMQ 版入门训练营,解锁对比开源优势与零基础实战
欢迎加入「云消息队列 RabbitMQ 版入门训练营」。
145 11
|
3月前
|
消息中间件 负载均衡 网络性能优化
消息队列 MQ产品使用合集之 终端sdk和云端sdk的区别是什么
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
3月前
|
消息中间件 RocketMQ
消息队列 MQ产品使用合集之在开源延时消息插件方案中和原生延时消息方案中,同时设置参数是否会出现错乱
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
3月前
|
消息中间件 存储 Java
RabbitMQ 是一个开源的消息代理软件
RabbitMQ 是一个开源的消息代理软件
27 2
|
3月前
|
消息中间件
RabbitMQ是一个功能强大的开源消息代理软件,用于处理消息队列
RabbitMQ是一个功能强大的开源消息代理软件,用于处理消息队列
29 0

热门文章

最新文章

下一篇
云函数