ubuntu下使用mosquitto与分析

mosquitto是一款实现了消息推送协议MQTT v3.1 的开源消息代理软件,提供轻量级的,支持可发布/可订阅的的消息推送模式,使设备对设备之间的短消息通信变得简单。 Mosquitto采用出版/订阅的模式实现MQTT协议,这种设计模式将通信终端之间的关系统一到服务程序中进行管理,可极大减轻客户端的开发和维护工作。

一.mosquitto安装 

# 下载源代码包
wget http://mosquitto.org/files/source/mosquitto-1.3.4.tar.gz
# 解压
tar zxfv mosquitto-1.3.4.tar.gz
# 进入目录
cd mosquitto-1.3.4
# 编译
make
# 安装
sudo make install


----------


//1.1 安装可能遇见的错误1】编译找不到openssl/ssl.h
   //安装openssl
sudo apt-get install libssl-dev

【2】编译过程找不到ares.h
    //修改config.mk文件
   修改config.mk中的WITH_SRV:=yes,改为WITH_SRV:=no

        如果编辑config.mk文件失败,赋予权限
        输入命令:chmod 777 -Rf *

【3】使用过程中找不到libmosquitto.so.1
    //修改libmosquitto.so位置, 创建链接
    sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
    // 更新动态链接库
    sudo ldconfig

【4】make: g++:命令未找到  
   // 安装g++编译器
sudo apt-get install g++


----------
    //1.2 配置文件

# =================================================================

# 客户端心跳的间隔时间
#retry_interval 20

# 系统状态的刷新时间
#sys_interval 10

# 系统资源的回收时间,0表示尽快处理
#store_clean_interval 10

# 服务进程的PID
#pid_file /var/run/mosquitto.pid

# 服务进程的系统用户
#user mosquitto

# 客户端心跳消息的最大并发数
#max_inflight_messages 10

# 客户端心跳消息缓存队列
#max_queued_messages 100

# 用于设置客户端长连接的过期时间,默认永不过期
#persistent_client_expiration

# =================================================================
# Default listener
# =================================================================

# 服务绑定的IP地址
#bind_address

# 服务绑定的端口号
#port 1883

# 允许的最大连接数,-1表示没有限制
#max_connections -1

# cafile:CA证书文件
# capath:CA证书目录
# certfile:PEM证书文件
# keyfile:PEM密钥文件
#cafile
#capath
#certfile
#keyfile

# 必须提供证书以保证数据安全性
#require_certificate false

# 若require_certificate值为true,use_identity_as_username也必须为true
#use_identity_as_username false

# 启用PSK(Pre-shared-key)支持
#psk_hint

# SSL/TSL加密算法,可以使用“openssl ciphers”命令获取
# as the output of that command.
#ciphers

# =================================================================
# Persistence
# =================================================================

# 消息自动保存的间隔时间
#autosave_interval 1800

# 消息自动保存功能的开关
#autosave_on_changes false

# 持久化功能的开关
persistence true

# 持久化DB文件
#persistence_file mosquitto.db

# 持久化DB文件目录
#persistence_location /var/lib/mosquitto/

# =================================================================
# Logging
# =================================================================

# 4种日志模式:stdout、stderr、syslog、topic
# none 则表示不记日志,此配置可以提升些许性能
log_dest none

# 选择日志的级别(可设置多项)
#log_type error
#log_type warning
#log_type notice
#log_type information

# 是否记录客户端连接信息
#connection_messages true

# 是否记录日志时间
#log_timestamp true

# =================================================================
# Security
# =================================================================

# 客户端ID的前缀限制,可用于保证安全性
#clientid_prefixes

# 允许匿名用户
#allow_anonymous true

# 用户/密码文件,默认格式:username:password
#password_file

# PSK格式密码文件,默认格式:identity:key
#psk_file

# pattern write sensor/%u/data
# ACL权限配置,常用语法如下:
# 用户限制:user 
# 话题限制:topic [read|write] 
# 正则限制:pattern write sensor/%u/data
#acl_file

# =================================================================
# Bridges
# =================================================================

# 允许服务之间使用“桥接”模式(可用于分布式部署)
#connection 
#address [:]
#topic  [[[out | in | both] qos-level] local-prefix remote-prefix]

# 设置桥接的客户端ID
#clientid

# 桥接断开时,是否清除远程服务器中的消息
#cleansession false

# 是否发布桥接的状态信息
#notifications true

# 设置桥接模式下,消息将会发布到的话题地址
# $SYS/broker/connection//state
#notification_topic

# 设置桥接的keepalive数值
#keepalive_interval 60

# 桥接模式,目前有三种:automatic、lazy、once
#start_type automatic

# 桥接模式automatic的超时时间
#restart_timeout 30

# 桥接模式lazy的超时时间
#idle_timeout 60

# 桥接客户端的用户名
#username

# 桥接客户端的密码
#password

# bridge_cafile:桥接客户端的CA证书文件
# bridge_capath:桥接客户端的CA证书目录
# bridge_certfile:桥接客户端的PEM证书文件
# bridge_keyfile:桥接客户端的PEM密钥文件
#bridge_cafile
#bridge_capath
#bridge_certfile
#bridge_keyfile



二.mosquitto安装完成后,启动服务端 输入命令:mosquitto

2.1接着再开个终端当做客户端订阅消息,例子:进入mosquitto-1.3.4
   输入命令:mosquitto_sub  -t test -h 192.168.1.162
   // mosquitto_sub 是订阅消息,-t 是要订阅的主题,-h 服务端的ip地址

2.2 然后要开个客户端推送消息,安装虚拟机,安装ubuntu,例子:进入mosquitto-1.3.4
    输入命令:mosquitto_pub -t test -m "123456" -h 192.168.1.162
    // mosquitto_pub 是发布消息,-t 是要发布的主题,-h 服务端的ip地址




----------


----------
三.**mosquitto_pub参数说明:**
-d,                  // 开启debug选项

-f, --file           // 把一个文件的内容做为消息的内容发送。经测试,支持txt文件,不   支持doc等其他形式文件。

-h, --host            //说明所连接到的域名,默认是localhost

-i, --id              //客户端的ID号,如果没有指定,默认是mosquitto_pub_加上客户端的进程id,不能和--id_prefix同时使用。 

-I, --id-prefix       //指定客户端ID的前缀,与客户端的进程ID连接组成客户端的ID,不能喝--id同时使用。

-l, --stdin-line      //从总段读取输入发送消息,一行为一条消息,空白行不会被发送。

-m, --message        // 从命令行发送一条消息,-m后面跟发送的消息内容。

-n, --null-message    //发送一条空消息。

-p, --port           // 连接的端口号,默认是1883.

-P, --pw (大写P)     // 指定密码用于代理认证,使用此选项时必须有有效的用户名。 

-q, --qos            //  指定消息的服务质量,可以为0,1,2,默认是0.

--quiet               // 如果指定该选项,则不会有任何错误被打印,当然,这排除了无效的用户输入所引起的错误消息。

-r, --retain         //  如果指定该选项,该条消息将被保留做为最后一条收到的消息。下一个订阅消息者将能至少收到该条消息。

-s, --stdin-file       //从标准输入接收传输的消息内容,所有输入做为一条消息发送。

-t, --topic           // 指定消息所发布到哪个主题。

-u, --username        // 指定用户名用于代理认证。

--will-payload       // 如果指定该选项,则万一客户端意外和代理服务器断开,则该消息将被保留在服务端并发送出去,该选项必须同时用--will
-topic                // 指定主题。
--will-qos           //  指定Will的服务质量,默认是0.必须和选项 --will-topic同时使用.

--will-retain         // 如果指定该选项,则万一客户端意外断开,已被发送的消息将被当做retained消息。必须和选项 --will-topic同时使用.

--will-topic          // 指定客户端意外断开时,Will消息发送到的主题。


----------


----------
 **3.1mosquitto_pub参数说明(跟mosquitto_sub不同的)**
-c, --disable-        // clean-session 禁止'clean session'选项,即如果客户端断开连接,这个订阅仍然保留来接收随后到的QoS为1和2的消息,当改客户端重新连接之后,它将接收到已排在队列中的消息。建议使用此选项时,客户端id选项设为--id

-k, --keepalive       // 给代理发送PING命令(目的在于告知代理该客户端连接保持且在正常工作)的间隔时间,默认是60s

-v, --verbose        // 冗长地打印收到的消息。若指定该选项,打印消息时前面会打印主题名——“主题 消息内容”,否则,只打印消息内容


----------


----------
四.mosquitto分析

【1】程序文件说明
    mosquitto – 代理器主程序
    mosquitto.conf – 配置文件
    mosquitto_passwd – 用户密码管理工具
    mosquitto_tls –  SSL和TLS
    mosquitto_pub – 用于发布消息的命令行客户端
    mosquitto_sub – 用于订阅消息的命令行客户端
    mqtt – MQTT的后台进程
    libmosquitto – 客户端编译的库文件

【2】使用订阅树发布消息
     在Mosquito程序中,消息发送过程主要通过遍历订阅树来完成,具体为:递归遍历订阅树找到指定的订阅列表,并将消息挂到订阅列表中的每个contextg的消息队列中,如果消息的retain字段被设置为1,则mosquitto还需要保存此消息,以备新订阅的客户端可以立即收到上次发送的消息;另外,发往系统topic的消息也会被mosquitto保存起来。上述消息发送过程主要通过函数mqtt3_db_messages_queue来完成。

【3】从订阅树中删除订阅客户端
    在Mosquitto程序中,客户端可以向mosquitto服务器发送取消对某个topic的订阅请求,服务器收到请求之后,将从订阅树中删除该客户端,该过程需要遍历订阅树以找该topic在订阅树中的位置,进而获得到订阅该topic的订阅列表,从而将其从订阅树中删掉。该过程与发送消息类似,首先将topic进行分片,然后根据topic片段遍历订阅树找到该topic的订阅列表;然后遍历订阅列表,将该客户端从订阅列表中删除。

【4】订阅树机制的优缺点
    Mosquito程序采用订阅树形式维护客户端之间的订阅与发布消息,这种方式优点是逻辑清晰,便于开发和维护。缺点是其遍历过程效率较低。同时,程序中存在很多对订阅树的遍历过程:订阅、发布消息、取消订阅等,在客户端数量增加时,该功能对效率的影响将更为明显。




你可能感兴趣的:(mqtt)