记录一下在建立mqtt调试环境上遇到的问题及对策。
我的PC环境为,win10为办公环境,Vmware虚拟机安装ubuntu18,虚拟机主要用来进行代码编译,建立mosquitto server测试环境。
1. ubuntu 安装mosquitto
安装mosquitto网上很多教程,这里简单列举一下:
sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
这一步我遇到了gpg key timeout的错误,猜测应该是外网连线的问题,毕竟大陆现在访问github不太稳定,加上我已经将更新源设置为华为的镜像地址,所以跳过这步。
sudo apt-get update
sudo apt-get install mosquitto //安装mosquitto broker
sudo apt-get install mosquitto-clients //安装mosquitto client
在/etc/mosquitto/conf.d
目录下,添加配置文件myconfig.conf
配置文件:
sudo gedit /etc/mosquitto/conf.d/myconfig.conf
粘入下面这些配置:
#添加监听端口(很重要,否则只能本机访问)
listener 1883
#-------------------------------------------
# 关闭匿名访问,客户端必须使用用户名
allow_anonymous false#指定 用户名-密码 文件
password_file /etc/mosquitto/pwfile.txt
#--------------------------------------------
添加账户及密码
sudo mosquitto_passwd -c /etc/mosquitto/pwfile.txt 用户名
回车后连续输入2次用户密码即可。
启动mosquitto
可以有以下两种方式,第一种是使用默认配置 /etc/mosquitto/mosquitto.conf,启动命令如下:
sudo service mosquitto start
另一种是指定使用哪一个配置文件,启动命令如下:
sudo mosquitto -c /etc/mosquitto/conf.d/myconfig.conf -v
查看mosquitto运行状态
sudo service mosquitto status
运行本机local测试:
订阅主题(新开一个终端1)
mosquitto_sub -h localhost -t "lai001/#" -u 用户名 -P 密码 -i “client1”
发布主题(新开一个终端2)
mosquitto_pub -h localhost -t "lai001/testTopic" -u 用户名 -P 密码 -m "Hello MQTT from mosquitto-clients"
因为我的ubuntu版本是18.0x的,这个版本上支持的最新的mosquitto版本为v1.4.5,支持到MQTT 3.1。
到这里虚拟机上的mosquitto server安装完毕了,此时遇到一个问题,本机localhost测试没有问题,可以正常pub/sub,但是外网的PC无法connect上ubuntu的mosquitto server。进一步测试发现,我的ubuntu虚拟机能够ping通外网的PC,但是外网的PC无法ping通虚拟机的IP。
这个问题的原因是因为主机WIN10的Vmware的网络连接设定问题导致:
我原来设定为NAT模式下的固定IP(方便win10下映射网络驱动盘),但实际发现NAT模式下,虚拟机的网络功能一切正常,就是没办法被其他设备(除了win10主机)ping通。
参考网上的教程将Vmware的网络连接设定为桥接模式后,修复了这个问题。
有几个地方记录一下:
需要将Vmware的权限设定为管理员权限启动,要不然看不到VMnet0,无法设定为桥接模式。
引用其他博主桥接模式下的win10主机及Vmware虚拟机与Ubuntu设定如下:
桥接模式下的网络设置
2.1 真实主机设置
使用桥接模式,首先要设置用于桥接的真实主机的网卡(一般是连接外网的网卡)。以win10为例,点击右下角网络和Internet设置-更改适配器选项,找到连接外网的网卡(我的就是下图中2位置啦),右键-属性,在WLAN属性中选中VMware Bridge Protocol,然后确定即可。
2.2 VMware虚拟交换机设置
设置好真实主机配置后,接下来需要设置VMware虚拟交换机的网络设置。
如上图,点击VMware上编辑-虚拟网络编辑器进入网络设置页面(下图)。你的界面有可能看不到VMnet0选项,按照上述方法解决。然后按下图,依次选择2处桥接模式,桥接位置3处选择你的真实主机连接外网的那块网卡,点击4处确定。
虚拟机设置
接下来就需要设置VMware上的虚拟主机设置,如下图所示,在虚拟机关闭的情况下,依次点击编辑虚拟机设置-网络适配器-启动时连接-桥接模式。点击右上角关闭按钮,设置完成。
接下来,为了方便我们在win10下开发,将ubuntu设定为固定IP的方式比较友好。
在ubuntu中设定网络,wired Settings。
使用固定IP上网,则需要选择手动模式,此时需要设置IP地址,子网掩码,默认网关等。先在真实主机(假定为windows系统)上使用ipconfig命令查看下真实主机的IP地址,子网掩码,默认网关等。下面3、4处子网掩码和网关填写与真实主机相同的参数,IP地址保证与真实主机的IP地址在同一网段即可。DNS可以选择自动或者手动,手动模式下也保持和真实主机的设置一致即可。
ubuntu系统文件设置
为了保证ubuntu虚拟机后续重新开机后保持这个固定IP,最后咱还需要设置一下系统文件。
首先,在虚拟机终端中,输入命令ifconfig,可以找到我们设置的希望用于和真实主机及外网通信的网卡名称,如下图,我的网卡名称是ens33,对应IP地址已经是我前面设置的静态IP了;
修改/etc/netplan/01-network-manager-all.yaml文件:
sudo gedit /etc/netplan/01-network-manager-all.yaml
编辑为如下内容,将固定IP,gateway,NDS等信息填入:
network:
version: 2
renderer: NetworkManager
ethernets:
ens33: #网卡名,以ubuntu操作系统的网卡名称为准
dhcp4: no #ipv4关闭dhcp,用static模式
dhcp6: no #ip6关闭dhcp
addresses:
- 192.168.31.130/24 #本机IP地址
gateway4: 192.168.31.1 #vmware网关的的IP地址
nameservers: #DNS服务器
addresses: [114.114.114.114, 8.8.8.8, 1.1.1.1]
修改配置后先测试一下:
sudo netplan try
如果测试通过,再应用配置:
sudo netplan apply
重启网络服务:
sudo service network-manager restart
至此,网络环境已经全部设定好。重启Vmware与ubuntu后,分别测试 虚拟机与主机,虚拟机与外网机器互ping(同网段下),都可以正常ping通。
此时,在ubuntu启动mosquitto broker/mosquitto_pub/mosquitto_sub,在另外一台PC上使用MQTT tool,我使用的是MQTT explorer,连接ubuntu上的mosquitto broker,测试pub与sub主题,ubuntu server上的mosquitto_sub可以收到MQTT explorer pub的数据,MQTT explorer可以收到ubuntu server上的mosquitto_pub的数据,测试环境建立完成。
补充一下,桥接模式需要win10主机一定要有网络连接,才能远程访问虚拟机,这样当没有网络环境时,开发会很麻烦,所以在没有网络连接的情况下,需要使用Vmware的NAT模式来启动ubuntu,这样WIN10主机可以远程访问虚拟机了。
记录一下NAT模式的设定:
1.WIN10主机先设定“VMware Virtual Ethernet Adapter for VMnet8” 这张虚拟网卡的IP,将其设定为与ubuntu IP(192.168.31.130)为同一网段,我这里设置为 192.168.31.1,如下:
控制面板->网络和 Internet->网络和共享中心->更改适配器设置
VMware Virtual Ethernet Adapter for VMnet8 ->鼠标右键->属性
Internet协议版本4(TCP/IPv4)->鼠标右键->属性
2.Vmware设定如下:
设定“虚拟网络编辑器” -> VMnet8子网地址(与192.168.3.1同一网段)
编辑虚拟机设置 -> 选择NAT模式
启动虚拟机,此时WIN10主机与ubuntu在同一网段,就可以通过VMnet8这张虚拟网卡远程访问ubuntu虚拟机了。