一种基于mqtt和websocket的数据通讯方法
技术领域
1.本发明涉及一种数据传输方法,特别涉及一种基于mqtt和websocket的数据通讯方法。
背景技术:2.随着互联网技术的快速发展,智能终端设备的普及,以及业务需求的多样化,终端设备之间的数据通信的重要性日益凸显,尤其是现在“智能终端设备-服务端-客户端”这类业务场景的应用越来越多,如何保证实际应用中数据获取的实时性、数据传输的可靠性,是其数据通信过程中需要考虑的关键。
3.mqtt是一种基于发布/订阅模式的“轻量级”通讯协议,该协议构建于tcp/ip协议上。mqtt最大优点在于,可以以极少的代码和有限的带宽,为连接的远程设备提供实时可靠的消息服务,是实现物联网架构的理想选择。
4.mqtt协议是基于主题(topic)来进行订阅和发布消息的,该协议设定了如下报文格式,包括header头部和payload消息载体,其topic信息记载在其头部。图1是一次典型的mqtt消息通信流程。发布方和订阅方通过这种方式来进行解耦,它们没有直接地连接,它们中间通过了一个中间方,在mqtt里面,我们称之为消息代理服务器,即图1中的broker,其用来进行消息的存储和转发。
5.mqtt协议应用在“智能终端设备-服务端-客户端”的业务场景时,智能终端设备为图1中的发布方,服务端作为了订阅方,客户端通过网络与服务端相连获取信息。http(超文本传输协议)协议定义了web客户端如何与web服务端对话,以及服务端如何把数据传回客户端,它是web客户端与服务器常用的一种通信方式,其包括两种通讯机制:短连接和长轮询。
6.短连接(传统轮询):客户端和服务器每进行一次http操作,就建立一次连接,任务结束就中断连接。
7.长轮询:客户端像传统轮询一样从服务器请求数据。然而,如果服务器没有可以立即返回给客户端的数据,则不会立刻返回一个空结果,而是保持这个请求一段时间,等待数据到来。如图2所示。
8.由上可见,服务端与客户端采用http协议通讯时,无论采用哪种机制,都是在不断地建立http连接,然后等待服务端处理,服务端不能主动联系客户端,只能由客户端发起连接,这种被动的方式势必影响消息传送的及时性。而且,短连接需要服务器有很快的处理速度,长轮询则要求服务器需要有很高的并发处理能力。
9.另外,由于智能终端设备采集的数据类型通常非常多,导致mqtt需要设置的topic可能很多,而topic过多会使得mqtt代理服务器即图1中的broker需要开辟更多的空间对消息队列(broker根据mqtt消息的topic创建队列存储消息,一个topic对应一个队列)进行存储,同时也带来broker定位消息队列耗费时间成本高的问题。
技术实现要素:10.本发明的主要目的在于,为“智能终端设备-服务端-客户端”这种业务场景提供一种可靠、及时的数据通讯方法,该数据通讯方法还能减少mqtt消息代理服务器中topic的数量,从而减少对mqtt消息代理服务器磁盘空间的占用,同时还有利于提高mqtt消息代理服务器磁盘搜索速度,从而提高其中消息消费的速率。
11.本发明的目的通过以下技术方案实现:一种基于mqtt和websocket的数据通讯方法,应用于“智能终端设备-服务端-客户端”这种业务场景下,涉及的对象包括智能终端设备、mqtt消息代理服务器、后台服务器和客户端,所述数据通讯方法包括如下步骤:
12.s1、所述智能终端设备发布带topic信息的mqtt消息;所述mqtt消息遵循如下数据传输协议,包括sof、length、data、crc16和eof;其中sof和eof分别作为帧头和帧尾,length用于设定data的长度,crc16用于验证数据帧的完整性;data部分又包括msg、time、index、value,其中,msg字段用于标明数据类型,time字段用于标明发布时间,index字段用于标明设备编号,value字段用于标明数据数值;
13.s2、所述mqtt消息代理服务器接收这些mqtt消息,并根据其topic的不同,分别创建消息队列进行存储;
14.s3、所述后台服务器根据自身需求向所述mqtt消息代理服务器订阅相应的topic;
15.s4、所述后台服务器接收到相应的mqtt消息后,根据所述客户端对数据类型的订阅情况,将相应topic下的相应数据类型对应的信息发送到与其通过websocket协议建立了长连接的所述客户端。
16.websocket协议是基于tcp的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信,允许服务器主动发送信息给客户端,所以其相比于http协议,能更好的节省服务器资源和带宽并达到实时通讯的目的。
17.本发明智能终端设备与服务端之间通过mqtt建立连接,充分利用了mqtt轻量级协议在通信中支持数百万个智能终端设备同时连接,并可为连接的远程设备提供实时可靠的消息服务的特点,同时引入websocket协议支持服务端主动向客户端传输数据,能更好的节省服务器资源和带宽并达到实时通讯的目的。
18.另外,本发明客户端订阅的为数据类型,而非传统的topic,在本发明中,topic为客户端订阅数据类型的上层概念,即本发明中的topic表征的是一个大的分类,本发明中的topic/数据类型整体对应传统mqtt消息中的topic。这里的“/”用于层级分割。显然,本发明能显著减少mqtt的topic数量,从而减少对mqtt消息代理服务器磁盘空间的占用,topic数量的减少,有利于提高mqtt消息代理服务器磁盘搜索速度,从而提高其中消息消费的速率。
19.根据本发明mqtt消息中的topic仅用于表征一个大的分类,其包含的数据类型具有较大不确定性的特点,本发明作出如下改进:
20.所述data部分还包括其他自定义字段,自定义字段用于支持用户根据所用场景进行扩展。
21.为进一步解决高并发场景下数据传输的稳定性问题,本发明在上述方案的基础上,提出一种基于mqtt、kafka和websocket的数据通讯方法,具体措施如下,所述服务端为由两台以上的所述后台服务器构成的kafka代理集群,并且步骤s4改进为:所述后台服务器利用kafka的分区机制接收相应的mqtt消息,根据接收到的mqtt消息的topic将其存入根据
该topic创建的kafka消息队列中,每个kafka消息队列中的消息由对应于该topic的service处理,根据所述客户端订阅的数据类型所属的topic,由相应的service从对应的kafka消息队列中获取消息,将其放入一个同步阻塞队列中,使用线程池按顺序提取该队列中的mqtt消息,然后进行合法性检查,判定该mqtt消息是否完整,接着解析该mqtt消息,提取出其中的数据,再根据数据中的msg字段区分不同数据类型,并调用相应的handler函数依据所述数据类型进行数据分割处理,然后将处理好的数据封装成json格式的消息,通过websocket协议将消息推送到与所述后台服务器建立了长连接的所述客户端。
22.kafka是一个支持分区存储、多副本的分布式消息系统,通常以集群的方式运行,其最大的特性就是可以利用kafka代理集群实现负载均衡,从而可以实时的处理大量数据,以便从容应对高并发场景。与mqtt一样,kafka也采用发布/订阅的消息处理模式,其中同样存在topic的概念,并根据topic创建消息队列,所以刚好可以直接利用mqtt消息中的topic信息从而与mqtt实现对接。
23.作为本发明的优选实施方式:
24.所述智能终端设备接入第三方库org.eclipse.paho.client.mqttv3,调用mqttclient类的connect方法与mqtt消息代理服务器建立连接,并通过mqttcallbackextended的connectionlost回调接口,监听所述智能终端设备和所述mqtt消息代理服务器的连接状态,监听到连接断开,即进行重连。
25.所述客户端接入第三方库io.crossbar.autobahn,通过第三方库中的websocketconnnection的connect方法与所述后台服务器连接,并通过websocketconnectionhandler类中的onclose方法,监听它们的连接状态,当监听到它们的连接断开时,则调用所述onclose方法,进行重新连接。
26.有益效果:
27.1)首先,本发明提出了一种基于mqtt和websocket的数据通讯方法,智能终端设备与服务端之间通过mqtt建立连接,充分利用了mqtt轻量级协议在通信中支持数百万个智能终端设备同时连接,并可为连接的远程设备提供实时可靠的消息服务的特点,同时引入websocket协议支持服务端主动向客户端传输数据,能更好的节省服务器资源和带宽并达到实时通讯的目的;另外,本发明客户端订阅的为数据类型,而非传统的topic,本发明中的topic/数据类型整体对应传统mqtt消息中的topic,所以本发明能显著减少mqtt的topic数量,从而减少对mqtt消息代理服务器磁盘空间的占用,topic数量的减少,有利于提高mqtt消息代理服务器磁盘搜索速度,从而提高其中消息消费的速率。
28.2)其次,本发明还提供了一种基于mqtt、kafka和websocket的数据通讯方法,在基于mqtt和websocket的数据通讯方法的基础上,引入kafka实现负载均衡,解决高并发场景下数据传输的稳定性问题。
附图说明
29.图1是一次典型的mqtt消息通信流程;
30.图2为http长轮询的过程示意图;
31.图3是本发明实施例一的基于mqtt和websocket的数据通讯方法的通讯网络拓扑图;
32.图4是实施例一所提出的数据传输协议的格式;
33.图5是图2中data部分的结构;
34.图6是本发明实施例二的基于mqtt和websocket的数据通讯方法的通讯网络拓扑图。
具体实施方式
35.下面结合实施例及附图对本发明作进一步详细描述,但本发明的实施方式不限于此。
36.实施例一
37.一种基于mqtt和websocket的数据通讯方法,包括如下步骤:
38.s1、所述智能终端设备发布带topic信息的mqtt消息。
39.所述mqtt消息遵循如下数据传输协议(对mqtt消息payload部分的一种自定义),如图4、5所示,包括sof、length、data、crc16和eof;其中sof和eof分别作为帧头和帧尾,length用于设定data的长度,crc16用于验证数据帧的完整性;data部分又包括msg、time、index、value和其他自定义字段,其中,msg字段用于标明数据类型,time字段用于标明发布时间,index字段用于标明设备编号,value字段用于标明数据数值,自定义字段用于支持用户根据所用场景进行扩展。
40.s2、所述mqtt消息代理服务器接收这些mqtt消息,并根据其topic的不同,分别创建消息队列进行存储。
41.s3、所述后台服务器根据自身需求向所述mqtt消息代理服务器订阅相应的topic。
42.s4、所述后台服务器接收到相应的mqtt消息后,根据所述客户端对数据类型的订阅情况,将相应topic下的相应数据类型对应的信息发送到与其通过websocket协议建立了长连接的所述客户端。
43.本发明智能终端设备与服务端之间通过mqtt建立连接,充分利用了mqtt轻量级协议在通信中支持数百万个智能终端设备同时连接,并可为连接的远程设备提供实时可靠的消息服务的特点,同时引入websocket协议支持服务端主动向客户端传输数据,能更好的节省服务器资源和带宽并达到实时通讯的目的。
44.另外,本发明客户端订阅的为数据类型,而非传统的topic,在本发明中,topic为客户端订阅数据类型的上层概念,即本发明中的topic表征的是一个大的分类。如有两个实验罐,该实验罐为酿造酱油的大罐子,在酿造的过程中需要对罐子内采集一些数据进行实时观察,主要有温度数据、湿度数据、酸碱度数据。此时,可为两个实验罐分别设置topic,如一个为topic_a,另一个为topic_b,相应的,msg字段为temperature_msg、humidity_msg、ph_msg,体现该topic包括的数据类型。所以,本发明中的topic/数据类型整体对应传统mqtt消息中的topic。这里的“/”用于层级分割。显然,本发明能显著减少mqtt的topic数量,从而减少对mqtt消息代理服务器磁盘空间的占用,topic数量的减少,有利于提高mqtt消息代理服务器磁盘搜索速度,从而提高其中消息消费的速率。
45.作为智能终端设备与服务端建立mqtt连接的优选方式:
46.所述智能终端设备接入第三方库org.eclipse.paho.client.mqttv3,调用mqttclient类的connect方法与mqtt消息代理服务器建立连接。同时实现了重连机制,其通
过mqttcallbackextended的connectionlost回调接口,监听智能终端设备和mqtt消息代理服务器的连接状态,一旦监听到连接断开,即进行重连;
47.所述后台服务器接入第三方库org.eclipse.paho.client.mqttv3,从而与mqtt消息代理服务器建立连接,同时订阅相应的topic,如订阅topic_a、topic_b。具体,开发者将客户端需要订阅的数据类型对应的topic写入配置文件中,服务端通过读取配置文件得到所需订阅的topic信息。
48.作为优选,本发明中的客户端接入第三方库io.crossbar.autobahn,通过第三方库中websocketconnnection类的connect方法与服务端建立连接。同时实现了断开重连机制,防止连接突然释放而无法自动连接的问题出现。通过实现websocketconnectionhandler类中的onclose方法,一旦连接断开,该方法就会被调用,因此可实现重新连接。建立连接后,客户端向服务端发送一个消息表明其订阅的数据类型。
49.服务端使用map存储数据类型(格式为topic_数据类型,topic为该数据类型所属topic)和订阅该数据类型的客户端的连接,记为map《topic_数据类型,list《websocketconnection》》,以此作为下发数据的依据。其中一个数据类型可以对应多个客户端连接。
50.实施例二
51.为进一步解决高并发场景下数据传输的稳定性问题,实施例二中的服务端采用了kafka代理集群,其通常由两台以上的后台服务器构成,在此基础上,实施例二进一步提出了一种基于mqtt、kafka和websocket的数据通讯方法,与实施例一的主要差别体现在其对步骤s4进行了如下改进:
52.所述后台服务器利用kafka的分区机制接收相应的mqtt消息,并以顺序写的方式写入磁盘中,由于kafka也是基于发布/订阅模式的,其可直接根据接收到的mqtt消息的topic创建的kafka消息队列并该mqtt消息存入其中,每个kafka消息队列中的消息由对应于该topic的service处理,根据所述客户端订阅的数据类型所属的topic,由相应的service从对应的kafka消息队列中获取消息,将其放入一个同步阻塞队列中,使用线程池按顺序提取该队列中的mqtt消息,然后进行合法性检查,判定该mqtt消息是否完整,接着解析该mqtt消息,提取出其中的数据,再根据数据中的msg字段区分不同数据类型,并调用相应的handler函数依据所述数据类型进行数据分割处理,然后将处理好的数据封装成json格式的消息,通过websocket协议将消息推送到与所述后台服务器建立了长连接的所述客户端。客户端接收到数据后,根据数据协议对数据进行解析,然后展示出来。
53.kafka是一个支持分区存储、多副本的分布式消息系统,通常以集群的方式运行,其最大的特性就是可以利用kafka代理集群实现负载均衡,从而可以实时的处理大量数据。实施例二在实施例一的基础上,引入kafka实现负载均衡,解决高并发场景下数据传输的稳定性问题。
54.总体而言,本发明实施例一可解决“智能终端设备-服务端-客户端”业务场景下数据通讯的及时性、可靠性问题,本发明实施例二可进一步解决高并发场景下数据的传输稳定性问题。同时,本发明实施例一、二还能显著减少mqtt的topic的数量,从而减少对mqtt消息代理服务器磁盘空间的占用,topic数量的减少,有利于提高mqtt消息代理服务器磁盘搜索速度,从而提高其中消息消费的速率。