如何使用覆盆子pi和esp8266使用mqtt

124,052

182

47

简介:如何将MQTT与覆盆子Pi和ESP8266结合使用

关于:我是一个20岁的有抱负的物理学家,他们喜欢编码和制作东西!

在这种说明中,我将解释MQTT协议是什么以及它用于在设备之间进行通信的方式。然后,作为实际演示,我将向您展示如何设置简单的两个客户端系统,其中esp8266模块将发送消息按下按钮时的Python程序。具体而言,我正在使用该项目的Adafruit Huzzah模块,覆盆子PI和台式电脑。raspberry pi将作为MQTT代理作为MQTT代理,并且Python客户端将从单独的桌面计算机运行(可选,因为这可以在Raspberry PI上运行)。

要随之而来,您需要有一些电子产品的基本知识,以及如何使用Arduino软件。您还应该熟悉使用命令行界面(用于覆盆子PI)。希望,一旦您获得了MQTT的知识,以及如何在基本场景中使用它,您将能够创建自己的IOT项目!

所需零件

  • 1 x覆盆子pi,连接到本地网络(运行jessie)
  • 1 x esp8266模块(Adafruit Huzzah)
  • 1 x面包板
  • 3 x跨接电线(公对公)
  • 1 x按钮
  • 1 x 10k欧姆电阻(棕色黑色橙色码)

我创建了这个指示,因为MQTT一直感兴趣是一个协议,并且可以使用许多不同的方式。但是,我似乎无法让我的脑部如何用它来代码使用它。这是因为我不知道/了解它实际上要拿走我的“你好,世界!”从设备A并将其发送到设备B.因此,我决定写这个指示(希望)教你它是如何工作的,也加强了我对它的理解!

第1步:什么是mqtt?

MQTT或MQ遥测传输是一种消息传递协议,它允许多个设备彼此交谈。目前,它是一种用于物联网的流行协议,但它已被用于其他目的 - 例如,Facebook Messenger。有趣的是MQTT是在1999年发明的 - 意思是它和我一样古老!

MQTT是基于设备可以发布或者订阅话题.因此,例如。如果设备#1已从其中一个传感器记录过温度,则可以发布包含其记录的温度值的消息,发送至主题(例如。“温度”)。此消息被发送到MQTT代理,您可以将其视为局域网上的交换机/路由器。一旦MQTT代理已收到消息,它将将其发送到任何设备(在这种情况下,设备#2)订阅同一个话题。

在这个项目中,我们将使用esp8266发布到一个主题,并通过覆盆子pi创建将订阅同一主题的Python脚本,该raspberry pi将充当mqtt broker。关于MQTT的伟大事物是它很轻,因此它非常适合在诸如ESP8266等小型微控制器上运行,但它也可广泛使用 - 所以我们也可以在Python脚本上运行它。

希望在本项目结束时,您将了解什么是MQTT,以及将来如何将其用于您自己的项目。

第2步:在覆盆子PI上安装MQTT代理

要设置我们的MQTT系统,我们需要一个代理,如前一步中所述。对于覆盆子pi,我们将使用“Mosquitto.“MQTT Broker。在我们安装此之前,最好更新覆盆子PI。

sudo apt-get更新sudo apt-get升级

完成此操作后,请安装Mosquitto.然后是Mosquitto-Clients.包装。

sudo apt get install mosquitto-y sudo apt get install mosquitto clients-y

当您完成这两个包的安装后,我们将需要配置代理。蚊子代理的配置文件位于/etc/mosquitto/mosquitto.conf.,所以用你最喜欢的文本编辑器打开它。如果您没有最喜欢的文本编辑器或不知道如何使用任何命令行编辑器,我将使用纳米因此,您可以继续:

sudo nano /etc/mosquitto/mosquitto.conf.

在这个文件的底部,你应该看到一行:

include_dir /etc/mosquitto/conf.d.

删除此行。将以下行添加到文件底部。

allow_anonymous false password_file / etc / mosquitto / pwfile listener 1883

通过键入这些行,我们已经告诉mosquitto,我们不希望任何人连接到我们的代理,而这些代理不提供有效的用户名和密码(我们马上就开始设置这些用户名和密码),并且我们希望mosquitto监听端口号1883上的消息。

如果您不希望代理需要用户名和密码,请不要包括我们添加的前两行(即允许匿名)。。。和密码文件。如果您已经这样做了,那么跳到重新启动覆盆子Pi。

现在关闭(并保存)该文件。如果您正在跟随nano示例,请按CTRL + X和类型y当提示。

因为我们刚刚告诉Mosquitto,用户尝试使用MQTT Broker需要进行身份验证,我们现在需要告诉Mosquitto用户名和密码是什么!因此,键入以下命令 - 替换用户名使用您想要的用户名 - 然后输入提示时要输入的密码(注意:如果在编辑配置文件时,则指定了不同的password_file.路径,将下面的路径替换为您使用的路径)。

Sudo mosquitto_passwd -c /etc/mosquitto/pwfile用户名

由于我们刚刚更改了MOSQUITO配置文件,我们应该重新启动Raspberry Pi。

sudo重新启动

覆盆子PI完成重新启动后,您应该拥有完全运行的MQTT经纪人!接下来,我们将尝试与它互动,使用许多不同的设备/方法!

步骤3:测试代理

一旦您在Raspberry PI上安装Mosquitto,您可以提供快速测试 - 只是为了确保一切正常工作。为此目的,我们可以在命令行上使用两个命令。mosquitto_pubmosquitto_sub..在这一步中,我将指导您使用这些方法来测试我们的代理。

为了测试代理,您需要打开两个命令行窗口。如果您正在使用Putty或其他SSH客户端,这与打开另一个SSH窗口并照常登录一样简单。如果您是从UNIX终端访问Pi,这是完全相同的。如果您直接使用树莓派,您将需要在GUI模式下打开两个终端窗口(命令startx可以用来启动GUI)。

现在你已经打开了两个窗口,我们可以开始测试了。在两个终端中的一个中,输入以下命令,替换用户名密码使用您在上一步中设置的。

mosquitto_sub -d -u用户名-p password -t test


如果您决定在上一步中设置用户名和密码,那么从现在开始,请忽略命令中的-u和-p标志。因此,作为示例,MoSquitto_Sub命令现在是:

Mosquito_sub-d-t检验


Mosquitto_sub命令将订阅主题,并显示发送到终端窗口中指定主题的任何消息。这里,-D.方法调试模式,因此所有消息和活动都将在屏幕上输出。-U-P.应该是不言自明的。最后,-T.这是你的名字吗话题我们想订阅——在本例中是“test”。

接下来,在另一个终端窗口中,我们将尝试向“test”主题发布一条消息。输入以下内容,再次记住更改用户名密码

mosquitto_pub -d -u用户名-p password -t test-m“hello,world!”


按enter键时,您应该会看到您的消息“你好,世界!”出现在我们使用的第一个终端窗口(订阅)。如果是这种情况,你们都必须开始在esp8266上工作!

第4步:设置ESP8266(Adafruit Huzzah)

这一步如果特定于adafruit huzzah(因为它是我使用的是完成这个项目)。如果您使用的是使用不同的Arduino / ESP8266设备,您可能希望跳过此步骤。但是,我建议您浏览浏览它,以防在这里有任何信息可能与您相关。

对于这个项目,我将与Arduino软件一起编程Huzzah。所以,如果您还没有,请务必安装Arduino软件(new1.6.4)。你可以下载它在这里

安装Arduino软件后,打开它并导航到文件 - >首选项.在这里,您应该看到(靠近窗口底部)带标签的文本框:“额外的电路板经理URL”.在此文本框中,复制并粘贴以下链接:

http://arduino.esp8266.com/stable/package_esp8266com_index.json.


单击“确定”以保存更改。现在打开董事会经理(工具- >板- >板经理)并搜索ESP8266。安装esp8266的esp8266社区包裹。重新启动Arduino软件。

现在,在对电路板进行编程之前,我们需要选择几个不同的选项。在工具菜单选项中,选择Adafruit Huzzah ESP8266董事会,80兆赫对于CPU频率(你可以使用160 MHz,如果你想超频,但现在我将使用80 MHz),4米(3米高)为Flash大小,和115200用于上传速度。此外,请确保选择您正在使用的COM端口(这取决于您的设置)。

在上传任何代码之前,您需要确保HUZZAH处于引导加载程序模式。要启用此功能,请按住板上标记的按钮GPIO0,而虽然这是持有的,但按住重启按钮。然后,释放重启按钮,然后GPIO0. 如果操作正确,则按下GPIO0时亮起的红色LED现在应为微弱亮起。

要将代码上载到微控制器,首先确保HUZZAH处于引导加载模式,然后只需单击Arduino IDE中的上载按钮。

如果您在建立Huzzah遇到任何问题,则可以在Adafruit自己自己找到更多信息教程

第5步:编程ESP8266

现在我们将开始编程ESP8266,但在我们开始之前,您需要在Arduino库管理器中安装以下库(草图->包含库->管理库

  • Bounce2.
  • 公共子客户


一旦安装了这些库,就可以运行我在这个可指示的(MQTT_Publish.zip)中包含的代码。我已经确定要对它进行评论,以便您能够理解每个部分正在做什么,这将有助于您根据自己的需要对其进行调整。

请记住更改代码顶部的常量,以便您的ESP8266可以连接到您的WiFi网络和MQTT经纪人(Raspberry PI)。

如果您决定不为MQTT代理设置用户名和密码,请下载MQTT_PublishNoPassword.zip文件。

步骤6:安装Python客户端(paho-mqtt)

谢天谢地,这一步非常简单!要安装mosquito - To python客户端,只需要在命令行(Linux/Mac)甚至命令提示符(Windows)中输入以下命令。

pip安装paho mqtt


注意:Windows命令提示符可能有一个问题运行pip命令,如果您在安装python时没有指定希望安装pip并将python添加到PATH变量中。有很多方法可以解决这个问题,但我认为重新安装Python是最简单的方法。如果有疑问-给它谷歌!

第7步:Python客户端 - 订阅

在此步骤中,我们将设置Python脚本(无论是在覆盆子pi本身还是连接到网络的另一台计算机上),以处理ESP8266向MQTT主题发送(发布)的所有消息。

我已经在下面包含了python代码(PythonMQTT_Subscribe.py),已经对其进行了注释,以帮助您理解正在发生的事情,但我也将在这里解释一些主要特性。

如果您之前没有为MQTT连接设置用户名和密码,请转而下载pythonmqtt_subscribenAsf.py文件。

第8步:在ESP8266设备之间进行通信

例如,如果您想建立物联网网络,您可能希望在ESP8266设备之间进行通信。谢天谢地,这并不比我们以前编写的代码复杂多少,但是,有几个值得注意的变化。

要使一个ESP向另一个ESP发送数据,第一个ESP需要发布到这个话题,第二个ESP需要订阅关于这个话题。此设置将允许进行单向对话-ESP(1)至ESP(2)。如果我们希望ESP(2)与ESP(1)对话,我们可以创建一个新主题,ESP(2)将发布该主题,ESP(1)将订阅该主题。谢天谢地,我们可以在同一个主题上有多个订阅者,因此如果您想向多个系统发送数据,您只需要一个主题(他们都订阅了该主题,但发送数据的设备除外,因为这将发布)。

如果你需要帮助弄清楚每个设备需要做什么,可以把这个系统想象成一间屋子的人。如果ESP(1)是发布,你可以把这个设备想象成一个“speaker”,在这个例子中,任何订阅这个主题的设备都是“listeners”。

我在下面包含了一些示例代码,它演示了ESP8266如何订阅一个主题,并侦听某些消息(1和0)。如果接收到1,则HUZZAH - GPIO 0板载LED灯亮。如果接收到0,则该LED关闭。

如果要处理更复杂的数据,应在接收消息函数(参见代码)。

对于您自己的项目,如果您需要发送和接收数据,可以将前面示例中的发布函数合并到本步骤中包含的代码中。这应该在主Arduino中处理环形()功能。

请记住更改代码顶部的变量以适合您的网络!

单片机比赛2017

参加
单片机比赛2017

2人制作了这个项目!

建议书

  • 让它发光比赛

    让它发光比赛
  • 第一次作者大赛

    第一次作者大赛
  • PCB挑战

    PCB挑战

47讨论

0.
Samm2017

问题6天前

你好,谢谢你的教程,但我有一个努力,我们可以通过套接字重新发送给另一台电脑吗?
谢谢你。

0.
BeerC1

提示12个月前

好的例子。我有一个问题与代理服务器连接。只要把wifi模式设为STA就行了,对我来说很完美。
...
WiFi.模式(WiFi_STA);
...
wifi.begin(SSID,Wifi_password);

0.
sp.fy18

一年前

您是否将树莓圆周率作为访问点(热点)

0.
rfire88.

问题一年前

嘿,伙计,谢谢你的指导,但我面临一个问题。我尝试运行python脚本,但它抛出了这个错误:
execfile(“PythonMQTT_Subscribe.py”)
Traceback(最近的调用):
文件“”,第1行,在
文件“pythonmqt_subscribe.py”,第44行,在
client.connect(mqtt_broker_ip,1883)
文件“/home/rfire88/.local/lib/python2.7/site-packages/paho/mqtt/client.py.,第937行,连接中
返回self.reconnect()
文件“/home/rfire88/.local/lib/python2.7/site-packages/paho/mqtt/client.py.“,第1071行,重新连接
袜子= self._create_socket_connection ()
文件“/home/rfire88/.local/lib/python2.7/site-packages/paho/mqtt/client.py.“,第3522行,在_create_socket_connection中
返回socket.create_connection(addr,source_address = source,timeout = self._keepalive)
文件“/usr/lib/python2.7/socket.py.,第557行,在create_connection中
对于Getaddrinfo(主机,端口,0,Sock_Stream)的Res:
socket.gaierror:[Errno-2]名称或服务未知

请帮忙。
我也有一个疑问。什么是MQTT代理IP地址。在哪里得到这个地址。
谢谢。

1
Shubhadaa3.

问题一年前第8步

如何将来自客户端的数据存储在文本文件中?
将多个ESP8266连接到Raspberry PI Broker的过程是什么?
请引导

0.
Shyamalas2.

2年前

Traceback(最近的调用):

文件"C:\Users\hp\Downloads\F02IQZQIZ6CAGZ9 (1).py",第47行,在 .py .py中

client.loop_forever()

文件"C:\Users\hp\lib\site-packages\paho\mqtt\client.py",第1481行,在loop_forever

rc=self.loop(超时,最大数据包数)

文件“C:\Users\hp\lib\site-packages\paho\mqtt\client.py”,行1003,在循环中

rc = self.loop_read(max_packets)

文件"C:\Users\hp\lib\site-packages\paho\mqtt\client.py",第1284行,在loop_read

rc = self._packet_read()

文件“C:\用户\ hp \ lib \ site-packages \ paho \ mqttt \ client.py”,第1849行,在_packet_read中

rc = self._packet_handle()

文件“C:\ users \ hp \ hib \ site-packages \ paho \ mqttt \ client.py”,第2311行,在_packet_handle中

返回自我。_handle_connack()

文件“C:\ users \ hp \ hib \ site-packages \ paho \ mqttt \ client.py”,第2372行,在_handle_connack中

自我。on_connect(自我,自我。_userdata flags_dict,结果)

on_connect()接受3个位置参数,但给出了4个

这是我在执行PythonMQTT_Subscribe.py文件时遇到的错误,请帮助

0.
托马斯清漆

1年前的回复

哎呀。这可能感谢原始代码中的错误...

感谢SR_Hashemi的帮助,我已经更新了Python订阅代码(希望)修复错误。(抱歉耽搁了) :)

0.
阿桑495

2年前

我能够向mqtt代理发送消息。但是,我的python客户端无法连接到mqtt代理。原因可能是什么?请帮忙。

0.
托马斯清漆

1年前的回复

感谢SR_Hashemi的帮助,我已经更新了Python订阅代码(希望)修复错误。(抱歉耽搁了) :)

1
sr_hashemi.

1年前的回复

嗨,你可以看到我的评论。该代码中有一个错误。

0.
emnavarro02

问题2年前

你好
我有个问题,希望你能帮助我。

我能够配置MQTT代理,并可以从我的计算机中的订阅者获得消息。

不,我正在尝试实现Python脚本,但它似乎不按预期工作,因为我无法通过脚本获取邮件。我正在通过终端运行这个。

要执行测试,我已插入了一些打印在外的陈述def函数,我能够在终端上看到这条消息。然而,显然所有的打印声明def脚本不涉及函数。

似乎很多人都能成功地使用这个脚本,所以我不知道我哪里做错了。你能帮我个忙吗?

非常感谢

1
托马斯清漆

答案1年前

感谢SR_Hashemi的帮助,我已经更新了Python订阅代码(希望)修复错误。(抱歉耽搁了) :)

1
sr_hashemi.

答案1年前

嗨,你可以看到我的评论。该代码中有一个错误。

0.
Flaska9999

问题一年前

你好,我有个小问题。对不起,我的英语很差。
我完成了6个步骤。在步骤7中,我用括号修改了Python脚本。然后我用Python3.x开始编写脚本。脚本开始没有错误,但没有发生任何事情,我只看到第一行RESTART和许多equals和文件位置。“蚊子”能很好地接收ESP的信息。

0.
托马斯清漆

答案1年前

感谢SR_Hashemi的帮助,我已经更新了Python订阅代码(希望)修复错误。(抱歉耽搁了) :)

1
sr_hashemi.

答案1年前

嗨,你可以看到我的评论。该代码中有一个错误。

1
sr_hashemi.

一年前

非常感谢分享本教程。这是有益的。但是,当我试图做到这一点时,一个直截了当的错误烦扰着我,让我无法得到正确的答案。我认为上面的一些用户也在与这个bug混战。但最后,我成功地找到了它。
毕竟,脚本正常运行,终端中没有邮件。原因是“on_connect`方法是不正确的。此方法必须有四个args,但在上面的Python代码中,只有三次传递。所以它的正确版本是这样的:
def on_connect(客户端,userdata,标志,rc)。
非常感谢。
0.
托马斯清漆

1年前的回复

非常感谢您的发现(并修复它)!我真的很感激你的帮助。:)
我已经更新了两个“订阅”python脚本,以删除这个bug。

0.
Srijal97.

一年前

这很有帮助,谢谢!

0.
JackWork

一年前

arduino的测试工作好,但...我只做修改以登录参数F02IQZQIZ6CAGZ9.py文件,在我的例子中,usermqtt=username,passwordmqtt=password,您好,我在终端的第19行有一个问题:

Traceback(最近的调用):
文件 ”F02IQZQIZ6CAGZ9.py“,第19行,在
用户名#到代理,并且会发生什么,然后主题收到一条消息
NameError:未定义“用户名”