环境:Ubuntu 16.04

介绍MQTT

MQTT是一种机器到机器的消息传递协议,旨在为“物联网”设备提供轻量级的发布/订阅通信。它通常用于地理跟踪车队,家庭自动化,环境传感器网络和公用事业规模数据收集。

Mosquitto是一种流行的MQTT服务器(或MQTT中的代理),具有出色的社区支持,易于安装和配置的特点。

在本教程中,我们将安装Mosquitto并设置我们的代理以使用SSL来保护受密码保护的MQTT通信。

MQTT 是一个轻量级即时通信协议,使用基于 TCP/IP 协议的发布/订阅消息转发模式, MQTT 协议的中心是 broker( 服务器/代理),客户端通过订阅消息和发布消息进行数据交互。
若初次接触MQTT协议,可先理解以下概念:
【MQTT协议特点】——相比于RESTful架构的物联网系统,MQTT协议借助消息推送功能,可以更好地实现远程控制。
【MQTT协议角色】——在RESTful架构的物联网系统,包含两个角色客户端和服务器端,而在MQTT协议中包括发布者,代理器(服务器)和订阅者。
【MQTT协议消息】——MQTT中的消息可理解为发布者和订阅者交换的内容(负载),这些消息包含具体的内容,可以被订阅者使用。
【MQTT协议主题】——MQTT中的主题可理解为相同类型或相似类型的消息集合。

Mosquitto是一款实现了 MQTT v3.1 协议的开源消息代理软件,包括了服务器端和客户端,可以跨平台部署,提供轻量级的,支持发布/订阅的的消息推送模式,使设备对设备之间的短消息通信简单易用。

一.安装测试mosquitto

2.1安装mosquitto

1.引入mosquitto仓库并更新

sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
sudo apt-get update

2.执行以下命令安装mosquitto

sudo apt-get install mosquitto

3.查看mosquitto服务状态

sudo service mosquitto status 

4.开启/停止mosquitto服务

sudo service mosquitto start
sudo service mosquitto stop

2.2简单的测试

一个完整的MQTT示例包括代理器,发布者和订阅者。
测试分为以下几个步骤:
(1)启动服务mosquitto
(2)订阅者通过mosquitto_sub订阅指定主题的消息。
(3)发布者通过mosquitto_pub发布指定主题的消息。
(4)代理服务器把该主题的消息推送到订阅者。

本机测试: 
代理器,发布者和订阅者都在本机。

1.安装mosquitto客户端

sudo apt-get install mosquitto-clients

2.打开一个终端,订阅主题

mosquitto_sub -h localhost -t "mqtt" -v

【-h】指定要连接的MQTT服务器 
【-t】订阅主题,此处为mqtt 
【-v】打印更多的调试信息

3.打开另一个终端,发布主题

mosquitto_pub -h localhost -t "mqtt" -m "Hello2 MQTT"

【-h】指定要连接的MQTT服务器 
【-t】向指定主题推送消息 
【-m】指定消息内容

网络测试 
test.mosquitto.org是一个公开可用的Mosquitto MQTT服务器/代理。 
1.通过以下命令从test.mosquitto.org订阅所有主题,任何人发布的任何消息你都可以收到,你会看到大量有趣消息滚动在你的屏幕上。

mosquitto_sub -h test.mosquitto.org -t "#" -v

2.也可以通过以下命令订阅特定主题,用来接收自己的消息

mosquitto_sub -h test.mosquitto.org -t "msg_only_from_me" -v

 

mosquitto_pub -h test.mosquitto.org -t "msg_only_from_me" -m "My cat is Luna"

二 、配置MQTT密码

我们配置Mosquitto使用密码。Mosquitto包含一个实用程序来生成一个名为mosquitto_passwd的特殊密码文件。此命令将提示您输入指定用户名的密码,并将结果放入/etc/mosquitto/passwd

sudo mosquitto_passwd -c /etc/mosquitto/passwd sammy

现在我们将为Mosquitto打开一个新配置文件,并告诉它使用此密码文件来要求所有连接的登录:

sudo nano /etc/mosquitto/conf.d/default.conf

这应该打开一个空文件。粘贴如下:

allow_anonymous false
password_file /etc/mosquitto/passwd

请务必在文件末尾留下尾随换行符。

allow_anonymous false将禁用所有未经过身份验证的连接,该password_file行告诉Mosquitto在哪里查找用户和密码信息。保存并退出该文件。

现在我们需要重启Mosquitto并测试我们的更改。

sudo systemctl restart mosquitto

尝试发布没有密码的邮件:

mosquitto_pub -h localhost -t "test" -m "hello world"

该邮件应被拒绝:

Connection Refused: not authorised.
Error: The connection was refused.

在我们再次尝试使用密码之前,请再次切换到第二个终端窗口,并使用用户名和密码订阅“test”主题:

mosquitto_pub -h localhost -t "test" -m "hello world" -u "sammy" -P "password"

  

mosquitto_sub -h localhost -t test -u "sammy" -P "password"

它应该连接并等待消息。您可以将本终端打开并连接到本教程的其余部分,因为我们会定期发送测试消息。

现在再次使用用户名和密码与您的其他终端发布消息:

三、 配置MQTT SSL

要启用SSL加密,我们需要告诉Mosquitto存储Let的加密证书的位置。打开我们之前启动的配置文件:

sudo nano /etc/mosquitto/conf.d/default.conf

在文件末尾粘贴以下内容,留下我们已经添加的两行:

. . .
listener localhost listener
certfile /etc/letsencrypt/live/mqtt.example.com/cert.pem
cafile /etc/letsencrypt/live/mqtt.example.com/chain.pem
keyfile /etc/letsencrypt/live/mqtt.example.com/privkey.pem

同样,请务必在文件末尾留下尾随换行符。

我们在配置中添加了两个单独的listener块。

第一个,listener 1883 localhost更新端口上的默认MQTT监听器1883,这是我们到目前为止所连接的。1883是标准的未加密MQTT端口。该localhost行的部分指示Mosquitto仅将此端口绑定到localhost接口,因此无法从外部访问它。无论如何,我们的防火墙都会阻止外部请求,但明确是好的。

listener 8883在端口上设置加密侦听器8883。这是MQTT + SSL的标准端口,通常称为MQTTS。

接下来的三行: certfilecafile,和keyfile,都指向Mosquitto到适合我们加密文件建立的加密连接。

保存并退出该文件,然后重新启动Mosquitto以更新设置:

sudo systemctl restart mosquitto

更新防火墙以允许连接到端口8883

sudo ufw allow 

输出如下所示:

Rule added
Rule added (v6)

现在我们再次使用mosquitto_pub测试一些不同的SSL选项:

mosquitto_pub -h mqtt.example.com -t test -m "hello again" -p  --capath /etc/ssl/certs/ -u "sammy" -P "password"

请注意,我们使用的是完整的主机名而不是localhost。因为我们发出了mqtt.example.comSSL证书,如果我们尝试localhost安全连接,我们会收到一个错误,说主机名与证书主机名不匹配(即使它们都指向同一个Mosquitto服务器)。

--capath /etc/ssl/certs/启用SSL mosquitto_pub,并告诉它在哪里查找root证书。这些通常由您的操作系统安装,因为Mac OS,Windows等的路径不同。mosquitto_pub使用root证书验证Mosquitto服务器的证书是否由Let的加密证书颁发机构正确签名。需要很注意的是mosquitto_pub而且它没有这个选项不会尝试(或类似的SSL连接--cafile选项),即使你连接的标准安全端口8883

如果测试结果一切正常,我们会再次看到hello出现在另一个mosquitto_sub终端。这意味着您的服务器已完全设置好!如果您想扩展MQTT协议以使用websockets,您可以按照最后一步操作。

参考链接:

https://cloud.tencent.com/developer/article/1350337

 

Ubuntu 16.04安装测试MQTT Mosquitto的更多相关文章

  1. Ubuntu 16.04 安装Mysql 5.7 踩坑小记

    title:Ubuntu 16.04 安装Mysql 5.7 踩坑小记 date: 2018.02.03 安装mysql sudo apt-get install mysql-server mysql ...

  2. ROS_Kinetic_01 在ubuntu 16.04安装ROS Kinetic 2017.01更新

    ROS_Kinetic系列学习(一),在ubuntu 16.04安装ROS Kinetic. Celebrating 9 Years of ROS! ubuntu16.04已经发布半年多了,ROS的K ...

  3. Ubuntu 16.04安装sogou 拼音输入法

    一.更换为国内的软件源 安装搜狗输入法之前请先更换为国内的软件源,否则无法解决依赖问题.首先,用以下命令打开源列表: sudo gedit /etc/apt/sources.list #用文本编辑器打 ...

  4. ubuntu 16.04 安装Tensorflow

    ubuntu 16.04 安装Tensorflow(CPU) 安装python ubuntu 16.04自带python2.7,因此可以略过这一步 安装pip sudo apt-get install ...

  5. Ubuntu 16.04 安装和配置 Redis

    因为发现之前手动安装的 redis 与现有的教程不一样,所以总结统一一下安装的标准步骤. 安装依赖项 为了获取最新版本的 Redis,我们将从源代码进行编译和安装.下载源代码之前,需要先安装一些编译所 ...

  6. Ubuntu 16.04安装cuda7.5 GCC

    http://www.linuxidc.com/Linux/2017-01/139320.htm 在介绍Ubuntu 16.04安装 CUDA7.5开始前,先辨析几个概念GPU.NVIDIA.NVID ...

  7. ubuntu 16.04 安装opencv 2.4.13

    ubuntu 16.04 安装opencv 2.4.13 https://blog.csdn.net/u011557212/article/details/54706966?utm_source=it ...

  8. Ubuntu 16.04安装Memcached(单机)

    Ubuntu 16.04安装Memcached,不过不仅限与Ubuntu,可以用CentOS等去安装,只不过测试时使用的是Ubuntu机器.Windows下不建议使用,本机调试可以使用,线上环境除了W ...

  9. Ubuntu 16.04 安装 Kodi v17 “Krypton” Alpha 2

    Ubuntu 16.04 安装 Kodi v17 “Krypton” Alpha 2:sudo add-apt-repository ppa:team-xbmc/xbmc-nightlysudo ap ...

随机推荐

  1. Apache commons StringUtils 在运行时出现NoClassDefError错误的解决方法

    Apache commons StringUtils 在运行时出现NoClassDefError错误的解决方法 在用tomcat运行WEB项目,并且使用了StringUtils包的时候,会出现 jav ...

  2. c# 前后日期设置

    List<string> list = new List<string>(); //根据当月 显示前6个月 for(int i=0;i<6;i++) { list.add ...

  3. MyBatis入门及CRUD

    MyBatis是一个ORM的数据操作框架 myBatis的基本配置 首先创建一个普通 java项目,引入响应jar包,然后引入mybatis的xml配置, <?xml version=" ...

  4. C#读入整数

    // ClassLibrary1.h #include<iostream> #pragma once using namespace System; namespace ClassLibr ...

  5. Generating an arbitrary digit password dictionary

    原理说明:以增量方式从开始到结束! 实现方法:CMD命令 特点:纯数字 语法: FOR /L %variable IN (start,step,end) DO command [command-par ...

  6. 个人KPI制定

    1.工作量 1.1 能独立完成工作优先级 1.2 能独立预估工作时间 2.工作质量 2.1 项目按时完成没有延期 2.2 交付件质量 2.2.1 测试用例设计没有明显遗漏 2.2.2 测试bug符合规 ...

  7. select子句排列顺序与聚集函数

    selcet   要返回的列或表达式 from   从中检索数据的表 where    行级过滤 group by 分组说明 having 组级过滤 order by  输出排列顺序   ASC正序排 ...

  8. [总结帖]Web小白的基础恶补帖

    1. jQuery实现按钮点击跳转网页 <script src="js/jquery/jQuery-2.2.0.min.js" type="text/javascr ...

  9. QuantLib 金融计算——基本组件之 DayCounter 类

    目录 QuantLib 金融计算--基本组件之 DayCounter 类 DayCounter 对象的构造 一些常用的成员函数 如果未做特别说明,文中的程序都是 Python3 代码. QuantLi ...

  10. (C/C++) STL 標頭檔 algorithm (一)

    因為解題需求認識了一些STL相關funciton. 分別是 max_element (ForwardIterator first, ForwardIterator last); min_element ...