MQTT vs. XMPP,哪一个才是IoT通讯协议的正解

MQTT vs. XMPP,哪一个才是IoT通讯协议的正解

这是个有趣的话题!

先来聊几个小故事。

关于我和MQTT

我在人生第一个IoT项目里,第一次接触到MQTT协议。

我很快就理解了这个协议。因为,它和企业开发用的MQ产品实在是太像了。

在我职业生涯早期,是的,20年前,当时做一个银行的项目,就用过MQ这东西,那个项目使用了IBM MQ。

随着工作经验的增加,在另外一些项目中,也会接触使用到MQ产品。

后来,我在做国产中间件的公司里开发中间件,当时我们有个团队,专门在做MQ产品。

所以,当我第一次读MQTT资料的时候,我心里立马浮现出了这样的看法:这不就是一个轻量级的、给IoT应用使用的MQ吗。

关于我和XMPP

我和XMPP之间的故事要复杂很多。

那是中国电信的一个项目,电信想在手机里集成融合通信软件。运营商的思路也很直白,微信你不是牛逼吗,你用互联网短信来代替我的电信网短信、用互联网音视频来取代我的电信通话网络,夺取我的生意,抢夺我的通道。我们运营商必须反击,我们必须要有应对的解决方案!

当时中国电信想到的解决方案之一,就是手机内置融合通信软件。

简单点说,运营商每年要送出很多的手机,办套餐送手机,这是运营商常用的营销套路。运营商的思路,如果这个送的手机,用户拿到手里的时候,它就已经自带了微信所有的功能了,那为啥还要另外再安装一个微信呢?

在手机里预置电信运营商开发的一个软件,这个软件具有微信所有的功能,功能被直接紧密集成在手机电话簿里,用来和联系人来发信息、聊天、语音和视频了,走互联网通道。

这个电信运营商想内置在手机里替代微信的软件,被叫做融合通讯软件。

因为要做中国电信的这个项目,我第一次接触到了XMPP协议。

后面的故事不出所料,融合通讯软件并未能掀起风浪,微信依然被安装在每一台手机上。

是的,我和XMPP的情缘,从那时候开始了。

在这个电信的项目中,我使用了Openfire XMPP Server,这应该是Java界最出名的一个开源XMPP服务器了。

Openfire作为一个标准的XMPP Server,其实它还挺可以的。在开发项目过程中,我当然会读它的代码,我会时不时发出感慨:老外写代码还真是挺认真的!

老外写东西,真的是认真!但是Openfire开源XMPP服务器,它并不能让我满意。

融合通信软件,当然会有不少需要定制的功能。但是,看看下面这段摘自Openfire的源码,就应该会明白,为啥我并不是那么的满意。

以下代码,来自Openfire项目src/main/java/org/jivesoftware/openfire/XMPPServer.java文件。


... ...

    private void loadModules() {

        // Load boot modules

        loadModule(RoutingTableImpl.class.getName());

        loadModule(AuditManagerImpl.class.getName());

        loadModule(RosterManager.class.getName());

        loadModule(PrivateStorage.class.getName());

        // Load core modules

        loadModule(PresenceManagerImpl.class.getName());

        loadModule(SessionManager.class.getName());

        loadModule(PacketRouterImpl.class.getName());

        loadModule(IQRouter.class.getName());

        loadModule(MessageRouter.class.getName());

        loadModule(PresenceRouter.class.getName());

        loadModule(MulticastRouter.class.getName());

        loadModule(PacketTransporterImpl.class.getName());

        loadModule(PacketDelivererImpl.class.getName());

        loadModule(TransportHandler.class.getName());

        loadModule(OfflineMessageStrategy.class.getName());

        loadModule(OfflineMessageStore.class.getName());

        loadModule(VCardManager.class.getName());

        // Load standard modules

        loadModule(IQBindHandler.class.getName());

        loadModule(IQSessionEstablishmentHandler.class.getName());

        loadModule(IQPingHandler.class.getName());

        loadModule(IQBlockingHandler.class.getName());

        loadModule(IQPrivateHandler.class.getName());

        loadModule(IQRegisterHandler.class.getName());

        loadModule(IQRosterHandler.class.getName());

        loadModule(IQEntityTimeHandler.class.getName());

        loadModule(IQvCardHandler.class.getName());

        loadModule(IQVersionHandler.class.getName());

        loadModule(IQLastActivityHandler.class.getName());

        loadModule(PresenceSubscribeHandler.class.getName());

        loadModule(PresenceUpdateHandler.class.getName());

        loadModule(IQOfflineMessagesHandler.class.getName());

        loadModule(IQPEPHandler.class.getName());

        loadModule(IQPEPOwnerHandler.class.getName());

        loadModule(MulticastDNSService.class.getName());

        loadModule(IQSharedGroupHandler.class.getName());

        loadModule(AdHocCommandHandler.class.getName());

        loadModule(IQPrivacyHandler.class.getName());

        loadModule(DefaultFileTransferManager.class.getName());

        loadModule(FileTransferProxy.class.getName());

        loadModule(MediaProxyService.class.getName());

        loadModule(PubSubModule.class.getName());

        loadModule(IQDiscoInfoHandler.class.getName());

        loadModule(IQDiscoItemsHandler.class.getName());

        loadModule(UpdateManager.class.getName());

        loadModule(InternalComponentManager.class.getName());

        loadModule(MultiUserChatManager.class.getName());

        loadModule(IQMessageCarbonsHandler.class.getName());

        loadModule(ArchiveManager.class.getName());

        loadModule(CertificateSt
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值