#背景
Mosquitto是一个开源(BSD许可证)的消息代理,实现MQTT(消息队列遥测传输)协议版本3.1。

MQTT(MQ Telemetry Transport),消息队列遥测传输协议,轻量级的发布/订阅协议,适用于一些条件比较苛刻的环境,进行低带宽、不可靠或间歇性的通信。值得一提的是mqtt提供三种不同质量的消息服务:

“至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
“至少一次”,确保消息到达,但消息重复可能会发生。
“只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。

#安装

## 下载源代码包

wget http://mosquitto.org/files/source/mosquitto-1.5.tar.gz

## 解压

tar zxfv mosquitto-1.5.tar.gz

## 进入目录

cd mosquitto-1.5

## 编译

make

## 安装

sudo make install

#安装及使用过程的错误

##编译找不到openssl/ssl.h

sudo apt-get install libssl-dev

##编译过程找不到ares.h

sudo apt-get install libc-ares-dev

##编译过程找不到uuid/uuid.h

sudo apt-get install uuid-dev

##使用过程中找不到libmosquitto.so.1

error while loading shared libraries: libmosquitto.so.1: cannot open shared object file: No such file or directory

解决方法:修改libmosquitto.so位置

###创建链接

sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1

### 更新动态链接库

sudo ldconfig

#简单测试

一个完整的MQTT示例包括一个代理器,一个发布者和一个订阅者。测试分为以下几个步骤:

注:在本次测试中,发布者、代理和订阅者均在一台主机上,启用3个终端窗口完成测试。

##启动服务mosquitto。

mosquitto -v

【-v】打印更多的调试信息

##订阅者通过mosquitto_sub订阅指定主题的消息。

mosquitto_sub -v -t test

【-t】指定主题,此处为test【-v】打印更多的调试信息

##发布者通过mosquitto_pub发布指定主题的消息。

mosquitto_pub -t test -m hello

【-t】指定主题 【-m】指定消息内容

##代理服务器把该主题的消息推送到订阅者。

#mosquitto_pub 用法详解

用法:
mosquitto_pub [-d] [-h hostname] [-i client_id] [-I client id prefix] [-p port number] [-q message QoS] [–quiet] [-r] { -f file | -l | -m message | -n | -s} [-u username [-P password] ] [ –will-topic topic [–will-payload payload] [–will-qos qos] [–will-retain] ] -t message-topic
选项:
-d, –debug
开启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
指定密码用于代理认证,使用此选项时必须有有效的用户名。
-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消息发送到的主题。

#mosquitto_sub 用法详解

用法:
mosquitto_sub [-c] [-d] [-h hostname] [-i client_id] [-I client id prefix] [-k keepalive time] [-p port number] [-q message QoS] [–quiet] [-v] [ -u username [-Ppassword] ] [ –will-topic topic [–will-payload payload] [–will-qos qos] [–will-retain] ] -t message topic …
选项:
-c, –disable-clean-session
禁止’clean session’选项,即如果客户端断开连接,这个订阅仍然保留来接收随后到的QoS为1和2的消息,当改客户端重新连接之后,它将接收到已排在队列中的消息。建议使用此选项时,客户端id选项设为–id
If using this option, it is recommended that the client id is set manually with –id
-d, –debug
开启debug选项
-h, –host
说明所连接到的域名,默认是localhost
-i, –id
客户端的ID号,如果没有指定,默认是mosquitto_pub_加上客户端的进程id,不能和–id_prefix同时使用。
-I, –id-prefix
指定客户端ID的前缀,与客户端的进程ID连接组成客户端的ID,不能喝–id同时使用。
-k, –keepalive
给代理发送PING命令(目的在于告知代理该客户端连接保持且在正常工作)的间隔时间,默认是60s
-p, –port
说明客户端连接到的端口,默认是1883
-P, –pw
指定密码用于代理认证,使用此选项时必须有有效的用户名。
-q, –qos
指定消息的服务质量,可以为0,1,2,默认是0.
–quiet
如果指定该选项,则不会有任何错误被打印,当然,这排除了无效的用户输入所引起的错误消息。
-t, –topic
指定订阅的消息主题,允许同时订阅到多个主题
-u, –username
指定用户名用于代理认证。
-v, –verbose
冗长地打印收到的消息。若指定该选项,打印消息时前面会打印主题名——“主题 消息内容”,否则,只打印消息内容
–will-payload
如果指定该选项,则万一客户端意外和代理服务器断开,则该消息将被保留在服务端并发送出去,该选项必须同时用–will-topic指定主题。
–will-qos
指定Will的服务质量,默认是0.必须和选项 –will-topic同时使用.
–will-retain
如果指定该选项,则万一客户端意外断开,已被发送的消息将被当做retained消息。必须和选项 –will-topic同时使用.
–will-topic
指定客户端意外断开时,Will消息发送到的主题。

#mosquitto 用户配置

mosquitto中可以添加多个用户,只有使用用户名和密码才能登陆服务器进行订阅与发布操作。可以说用户机制是mosquitto重要的安全机制,增强服务器的安全性。

##添加用户步骤

1.打开mosquitto.conf文件,找到allow_anonymous节点,这个节点作用是,是否开启匿名用户登录,默认是true,改为false。

allow_anonymous false

2.找到password_file节点,这个节点是告诉服务器你要配置的用户将存放在哪里。打开此配置并指定pwfile.example文件路劲(注意是绝对路劲)

password_file /etc/mosquitto/pwfile.example

3.创建用户名和密码、打开命令窗口 键入如下命令:

sudo mosquitto_passwd /etc/mosquitto/pwfile.example mosquitto

提示连续两次输入密码、创建成功。/etc/mosquitto/pwfile.example 是将用户创建到 pwfile.example文件中、mosquitto是用户名。

#Mosquitto 单向SSL配置

##生成CA证书

创建generate-CA.sh脚本,贴入以下代码:

#!/bin/sh
#(@)generate-CA.sh - Create CA key-pair and server key-pair signed by CA# Copyright (c) 2013 Jan-Piet Mens <jpmens()gmail.com>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice,
#    this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
# 3. Neither the name of mosquitto nor the names of its
#    contributors may be used to endorse or promote products derived from
#    this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.set -eDIR=${TARGET:='.'}
# A space-separated list of alternate hostnames (subjAltName)
# may be empty ""
ALTHOSTNAMES="broker.example.com foo.example.de"
CA_ORG='/O=MQTTitude.org/emailAddress=nobody@example.net'
CA_DN="/CN=An MQTT broker${CA_ORG}"
CACERT=${DIR}/ca
SERVER=${DIR}/server
SERVER_DN="/CN=$(hostname -f)$CA_ORG"
keybits=2048
openssl=$(which openssl)function maxdays() {nowyear=$(date +%Y)years=$(expr 2032 - $nowyear)days=$(expr $years '*' 365)echo $days
}function getipaddresses() {/sbin/ifconfig |sed -En '/inet6? /p' |sed -Ee 's/inet6? (addr:)?//' |awk '{print $1;}' |sed -e 's/[%/].*//' |egrep -v '(::1|127\.0\.0\.1)'    # omit loopback to add it later
}function addresslist() {ALIST=""for a in $(getipaddresses); doALIST="${ALIST}IP:$a,"doneALIST="${ALIST}IP:127.0.0.1,IP:::1,"for h in $(echo ${ALTHOSTNAMES}); doALIST="${ALIST}DNS:$h,"doneALIST="${ALIST}DNS:localhost"echo $ALIST}days=$(maxdays)if [ -n "$CAKILLFILES" ]; thenrm -f $CACERT.??? $SERVER.??? $CACERT.srl
fiif [ ! -f $CACERT.crt ]; then# Create un-encrypted (!) key$openssl req -newkey rsa:${keybits} -x509 -nodes -days $days -extensions v3_ca -keyout $CACERT.key -out $CACERT.crt -subj "${CA_DN}"echo "Created CA certificate in $CACERT.crt"$openssl x509 -in $CACERT.crt -nameopt multiline -subject -nooutchmod 400 $CACERT.keychmod 444 $CACERT.crt
fiif [ ! -f $SERVER.key ]; thenecho "--- Creating server key and signing request"$openssl genrsa -out $SERVER.key $keybits$openssl req -new \-out $SERVER.csr \-key $SERVER.key \-subj "${SERVER_DN}"chmod 400 $SERVER.key
fiif [ -f $SERVER.csr -a ! -f $SERVER.crt ]; then# There's no way to pass subjAltName on the CLI so# create a cnf file and use that.CNF=`mktemp /tmp/cacnf.XXXXXXXX` || { echo "$0: can't create temp file" >&2; exit 1; }sed -e 's/^.*%%% //' > $CNF <<\!ENDconfig%%% [ JPMextensions ]%%% basicConstraints        = critical,CA:false%%% nsCertType              = server%%% keyUsage                = nonRepudiation, digitalSignature, keyEncipherment%%% nsComment               = "Broker Certificate"%%% subjectKeyIdentifier    = hash%%% authorityKeyIdentifier  = keyid,issuer:always%%% subjectAltName          = $ENV::SUBJALTNAME%%% # issuerAltName           = issuer:copy%%% nsCaRevocationUrl       = http://mqttitude.org/carev/%%% nsRevocationUrl         = http://mqttitude.org/carev/
!ENDconfigSUBJALTNAME="$(addresslist)"export SUBJALTNAME     # Use environment. Because I can. ;-)echo "--- Creating and signing server certificate"$openssl x509 -req \-in $SERVER.csr \-CA $CACERT.crt \-CAkey $CACERT.key \-CAcreateserial \-CAserial "${DIR}/ca.srl" \-out $SERVER.crt \-days $days \-extfile ${CNF} \-extensions JPMextensionsrm -f $CNFchmod 444 $SERVER.crt
fi

直接执行这段shell

执行完成后可生成 ca.crt  ca.key  ca.srl  server.crt  server.key  server.csr

##配置mosquitto 配置文件

###进入配置文件

sudo vim /etc/mosquitto/mosquitto.conf

###找到 Default listener,在该栏下进行端口配置

###再找到Certificate based SSL/TLS support字段,进行白色字体的配置。

##重启服务

mosquitto -c /etc/mosquitto/mosquitto.conf

##验证

###终端一订阅

mosquitto_sub -h 192.168.8.19 -p 8883 -u mosquitto -P 123456 --cafile ./ca.crt -t test
###终端二发布

mosquitto_pub -h 192.168.8.19 -p 8883 -u mosquitto -P 123456 --cafile ./ca.crt -t test -m hello

MQTT mosquitto相关推荐

  1. 在ubuntu上安装,使用MQTT Mosquitto

    这是一种相对简单的安装办法,不用去下载源码后再编译安装,省去了编译和运行过程中出现的各种错误和安装各种依赖库. 在ubuntu上安装,使用MQTT Mosquitto 以下描述了如何安装Mosquit ...

  2. MQTT Mosquitto安装和使用

    物联网(Internet of Things,IoT)最近曝光率越来越高.虽然HTTP是网页的事实标准,不过机器之间(Machine-to-Machine,M2M)的大规模沟通需要不同的模式:之前的请 ...

  3. MQTT基本应用(Mosquitto+Eclipse Paho)

    本文主要介绍,MQTT 基本概念和实现方式: 1.概述 1.1MQTT协议 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),由IBM在1999 ...

  4. MQTT:用Mosquitto搭建轻量级的设备接入网关

    开发部署在云端的设备接入网关服务就不得不提到MQTT,使用MQTT不论是从设备到设备,还是设备到云端服务的双向通讯,都可以获得较好的支持. MQTT的起源和我的理解 用tcpdump分析下MQTT的通 ...

  5. mac 安装mqtt

    2019独角兽企业重金招聘Python工程师标准>>> mac 安装mqtt Mosquitto是一个开源的mqtt规则的具体实现库,mosquitto是一个轻量级的lightwei ...

  6. 转mosquitto auth plugin 编译配置

    配置使用 mysql 作为 be (back end) 使用config.mk 配置编译参数 cp config.mk.in config.mk 修改 安装 mysql sudo apt-get in ...

  7. flume与Mosquitto的集成

    文章来自:http://www.cnblogs.com/hark0623/p/4173714.html   转发请注明 因业务需求,需要flume收集MQTT(Mosquitto)的数据.  方法就是 ...

  8. mosquitto简介和使用

    1.简介 一款实现了 MQTT v3.1协议的开源消息代理软件,提供轻量级的,支持可发布/可订阅的的消息推送模式,使设备对设备之间的短消息通信变得简单,比如现在应用广泛的低功耗传感器,手机.嵌入式设备 ...

  9. Mosquitto常用命令

    1 mosquitto服务器的搭建 服务器这里使用了阿里云的服务器,mosquitto默认需要1883的TCP入端口.需要在安全策略里设置一下.端口当然也可以选其他端口进行配置. 服务安装 # 服务器 ...

最新文章

  1. 如何仅从git存储库中稀疏签出单个文件?
  2. 为什么都说猫有九条命呢
  3. 脸书推出VR视频会议应用程序 正式跨出元宇宙第一步;三家公司新入选福布斯2021云计算百强榜;微软挖来亚马逊云业务顶级高管贝尔...
  4. C++笔记-设置cout输出数据的宽度和填充
  5. 英伟达收购交易取消后 ARM将裁员1000人
  6. 控制台报错:java.lang.ClassNotFoundException: javax.xml.bind.JAXBException之解决方法
  7. 一点Python学习资源
  8. 基于C#和SQL SERVER的汉字词典的设计与实现
  9. 计算机管理员账户权限不足,用户权限不足,请使用管理员权限。怎么办啊?求高手帮忙!谢了。...
  10. office 打开wps乱_wps和office冲突怎么办
  11. jquery查子元素
  12. mac开启Airdrop的硬件要求
  13. Android,上传一张本地图片到服务器,Okhttp的post请求上传图片本地服务器
  14. 联想e480怎么一键恢复_Lenovo笔记本电脑如何使用一键恢复
  15. Netbackup 8.1: bparchive 成功备份文件,但无法删除
  16. MFC 利用opencv实现视频播放
  17. 【大学课程自学网站】
  18. Function类型(函数)
  19. 安徽科技学院 信网学院网络文化节 胡鑫
  20. channel-wise卷积--学习笔记

热门文章

  1. 使用runjs在博客园中显示demo效果图
  2. 关于ORB与stitch特征提取代码,图像拼合,图像仿射变换与拼合结果
  3. 2. 通过经典方法进行 PID 调谐
  4. 比尔·盖茨2016年针对疫情爆发的TED演讲, 简直是神预言……
  5. AutoCAD Civil 3D-部件-自定义部件、装配、创建曲面(石料场开挖边坡)
  6. Escaping closure captures non-escaping parameter ‘xx‘
  7. Redis高级项目实战,华为java开发工资
  8. 初识Django(一):Django简介
  9. 取整函数access_Access向上取整的类似Excel的Ceiling函数
  10. CCCC L2-007. 家庭房产 建图 XJB模拟