MENU

mqtt

About这个网站[置顶]

如果想做一件事情,现在就是个不错的时间

为什么要搭这个网站

从本科开始就想做一个网站,但是一直都不知道做什么主题的,于是便一直拖啊拖。中间也确实搭建了数个博客性质的网站,但是往往自己在搭建好之后就在意淫网站该怎么优化啊,怎么做才能抵抗高并发啊...结果每次都因为想太多到最后还是一事无成,在这些浮夸而不切实际的思考中浪费了许许多多的时间,而那些网站却一个个的关闭,因为自己也不知道自己要做什么。

Read More

MQTT Broker Mosquitto(二)数据结构

本文主要介绍一下Mosquitto中用到的比较重要的数据结构,为之后的流程处理讲解奠定基础。为了清晰,结构体展示时只保留重要成员。

一、mosquitto_db

struct mosquitto_db{

    /*主题树的根结点*/
    struct _mosquitto_subhier subs;

    /*id:context映射的Hash表首节点,通过该成员去遍历Hash表*/
    struct mosquitto *contexts_by_id;

    /*sock:context映射的Hash表首节点,通过该成员去遍历Hash表*/
    struct mosquitto *contexts_by_sock;

    /*存储消息的链表*/
    struct mosquitto_msg_store *msg_store;
    
    /*服务器的配置*/
    struct mqtt3_config *config;    
    
    /*由于断开连接等需要释放的context存放的链表*/
    struct mosquitto *ll_for_free;
};

mosquitto_db可谓是mosquitto最核心的结构体,没有之一。它维护着服务器配置主题树客户端句柄接收的消息列表。其中为了查找方便,建立了通过客户端id来查找客户端句柄的Hash表和通过客户端socket连接描述符查找客户端句柄的Hash表;将连接断开的客户端句柄先存放在ll_for_free链表中,待到合适时统一释放。

Read More

MQTT Broker Mosquitto(一)简介

写这个系列文章其实出发点有很多。一方面是很早之前看到了一个开源物联网云平台项目,叫做iotgo,有兴趣的同学可以去搜索后了解一下。iotgo使用的是node.js语言编写,是一个物理网设备管理的平台。我抽出了十一假期研究了一下它的源码:它使用angular做前端,前端通过websocket实时从后台获取设备信息,所有的设备通过socket与平台通讯。但是这个框架我还是觉得很别扭,可能在我看来一个网站只是一个用户接口而已,不应与设备直接打交道,于是我想起来了MQTT(只是一个协议),当时实验室有同学在用这个做项目。设备可以通过MQTT协议与服务器进行通信,然后网站只需要与代理服务器进行交互信息。目前开源的MQTT服务器众多,但性能参差不齐,比较常用的是Mosquitto,EMQTT等等。Mosquitto被广泛地应用在各种研究和实际项目,但在阅读其源码的过程中,发现它还有很多性能可以提升的地方。所以提升MQTT服务器性能成了我的毕业设计,我想将自己理解和修改Mosquitto过程记录下来分享出来,这些是我写这系列文件的初衷之一。

Mosquitto是什么

Eclipse Mosquitto™ is an open source (EPL/EDL licensed) message broker that implements the MQTT protocol versions 3.1 and 3.1.1. MQTT provides a lightweight method of carrying out messaging using a publish/subscribe model. This makes it suitable for "Internet of Things" messaging such as with low power sensors or mobile devices such as phones, embedded computers or microcontrollers like the Arduino.

Read More

MQTT协议(九)——固定报文头

MQTT协议的固定报文头由两个部分组成,第一部分是报文的控制类型与标识,占据1个字节;第二部分是报文的剩余长度,占据1~4个字节。

一、控制报文类型与标识

控制标识共占一个字节,位于MQTT报文的第1个字节。其中高4位是控制报文类型,低4位是控制标识,如下。
QQ截图20180202114738.png

Read More

MQTT协议(八)——心跳检测

心跳检测是客户端发送给服务端的。协议中关于心跳检测的作用是这样叙述的
1.在没有任何其它控制报文从客户端发给服务的时,告知服务端客户端还活着。
2.请求服务端发送 响应确认它还活着。
3.使用网络以确认网络连接没有断开。

一、场景示意图

QQ截图20180202114738.png

Read More

MQTT协议(六)——QoS1发布

与QoS0类似,可以是客户端向服务端发布,也可以是服务端向客户端发布消息。但是在QoS1的服务质量中,接收者需要对发布者的消息进行回应。

一、场景示意图

QQ截图20180202114738.png

Read More

MQTT协议(五)——QoS0发布

发布可以使客户端发送给服务端,也可以是服务端发送给客户端。当一个客户端A想发布一条消息时,它应该先把这条消息发布给服务端,然后由服务端作为代理将该条消息发布给所有订阅消息主题的客户端们。

一、场景示意图

QQ截图20180202114738.png

Read More

MQTT协议(三)——订阅

当客户端和服务端连接成功后,客户端需要向服务端订阅自己感兴趣的主题消息这样才能够收到消息。涉及到的报文有SUBSCRIBE,SUBSCRIBE ACK。

一、场景示意图

QQ截图20180202114738.png

Read More

windows环境下MQTT Apollo搭建

Apollo是一款由Apache研发的一款MQTT broker。借用官方的介绍:ActiveMQ Apollo is a faster, more reliable, easier to maintain messaging broker built from the foundations of the original ActiveMQ. It accomplishes this using a radically different threading and message dispatching architecture. Like ActiveMQ, Apollo is a multi-protocol broker and supports STOMP, AMQP, MQTT, Openwire, SSL, and WebSockets.

准备工作

  1. 安装JAVA运行环境

这里不多说,网上有很多安装了配置JAVA运行环境的教程,有一点需要注意的是,要下载JDK,因为单独的JRE包里是没有bin/server/jvm.dll。

Read More

MQTT初探

MQTT从本科开始就已经早有耳闻,一直没有去研究它,最近想自己搭一套开源的物联网云平台,于是仔细研究起来。

MQTT是一个订阅/发布机制的轻量级的协议,最初是由IBM设计的,现在已经逐渐成为物联网主流的通信协议。就我接触的,阿里云用MQTT设计了消息队列,百度云则用来做了天工物联系统。

Read More