前言
-  物联网vs互联网? 
 数据量/数据源:物联网的数据多是设备的自动采集,其数量远远超过互联网,互联网的数据更多是人工生成的
-  MQTT 协议(Message Queuing Telemetry Transport)vs AMQP 协议(Advanced Message Queuing Protocol)是两种在 物联网中广泛使用的协议。
 物联网应用的独特:
 (1) 大量设备和中心系统的通信
  
(2)设备所处的环境资源有限,例如深山老林中低功耗或者不稳定的网络
- 消息中间件与调试工具
 MQTT: mosquitto;调试工具:MQTTfx(mqtt3.1之后要收费)、Mqtt x(免费,来自EMQX)
 AMQP:rabbitmq
注意区分消息传输协议与消息中间件
一、MQTT
协议
-  场景: 资源受限的设备和低带宽、高延迟或不可靠的网络环境,IOT场景 
-  发布/订阅模式:客户端订阅(subcribe)主题(topic),获得发布的消息,消息内容:【topic】+payload 
-  适合轻量级(报文小) 
-  客户端可以是publisher或subscriber 
-  Qos( 质量服务等级) 可以保证消息传输的可靠性 
 0:最多发一次。以发送端发完结束
 1:最少发一次。以发送段收到接收端的PUBACK确认接收消息后结束。接收端断可能收到重复信息
 2:保证收一次。发送段和接收端将要进行两次确认。消息不回丢失或重复。
 所以,可见qos=2是最安全的,但是速度和安全不可兼得
-  安全: 支持TLS加密 ,用户名和密码的身份验证 

- 持久化:broker默认不能持久化,但是可以设置publish的‘retain’标志,这样broker就能实现消息存储
二、MQTT消息中间件
也就是上图的MQTT Broker的软件系统实现
所有消息中间件其实都是相当于建立了一个MQTT Broker或AMQP Broker
1. EMQX
开源
2. mosquitto

(1)安装
windows(不推荐)
下载地址:https://mosquitto.org/download/
 安装:mosquitto
 修改配置文件:
 
// 侦听7788端口
listener 7788
// 不允许匿名用户登录
allow_anonymous false
// 指定配置的用户文件(也就是用户名和密码)的路径(绝对)
password_file D:\Program Files\mosquitto\pwfile.example
创建用户名和密码,admin admin
 
 创建完成后:
 
进入服务,打开mosquitto服务
 
Linux
centos7
mqtt 3.1.1
yum install mosquitto
# 安装后自动注册为系统服务,可通过systemctl操作
systemctl start mosquitto
systemctl status mosquitto
好像yum最新只能安装到1.6版本的了。
启动后mosquitto -v 给出的版本号是 1.6.1
注意,1.6.1是mosquitto的版本,3.1.1是mqtt的版本号。
 
默认端口 1883
默认用户名和密码: 没有
使用mqttfx,直接就是ip:端口匿名连接
 
安装2.0以上版本
因为不想要额外自己安装鉴权插件-
- 源码下载(2.0.18)
 https://mosquitto.org/download/
(2) 配置文件启动
除了systemctl 启动外,还可以用mosquitto -v的方式启动,不过,必须要指定配置文件
因为启动没有带配置文件,则采用的都是默认配置,默认1883,默认允许匿名
(3)创建新用户
vim  /etc/mosquitto/mosquitto.conf
-  设置不允许匿名连接 
  
-  配置 存储密码的文件 
  
 passwd这个文件中保存用户名和密码。
-  同时通过mosquitto_passwd 创建新用户 
[root@ecs-30f1 mosquitto]# mosquitto_passwd -c /etc/mosquitto/passwd ttyMos
Password: 
Reenter password: 
[root@ecs-30f1 mosquitto]# systemctl restart mosquitto
异常:无效的密码
 
增加登录凭证之后,登录报错:
 mosquitto -v的报错: Error: Invalid password hash for user tty, removing entry.
 
客户端用正确的用户名密码登录,也报错:
 not authorized to connect
 
解决:
 其实提示给的很明显了,invalid password hash for user tty ==密码的hash加密无效
还得是官网,
 
针对1.6.10的版本需要指定用sha512加密方式-H sha512
 mosquitto_passwd -H sha512 -c /etc/mosquitto/passwd.conf admin
(4)用户和权限
需要提前声明的是,主题是用户创建的,但是前提是用户有创建主题的权限。
(5) 测试
在更换用户登录方式后,用非正确的用户名和密码还能连接?
不过前提是在mosquitto -v中进入,systemctl 开启的mosquiito服务报的异常则是not authirized
异常: 缺少cJSON依赖
 
执行make命令时
 
这里是缺少cjson的依赖,尝试用yum安装,但是找不到这个依赖
这里进行手动安装
- 下载源码包:https://github.com/DaveGamble/cJSON
git clone https://github.com/DaveGamble/cJSON.git
- 安装
cd cJSON/
mkdir build
cd build/
cmake ..

make
make install
安装后可发现cJson的静态/动态库生成链接存放在/usr/local/lib64中
 



















