友情提示点击顶部放大镜 可以使用站内搜索 记住我们的地址 www.hainabaike.com
MQTT我就不详细介绍了,毕竟看到这个标题进来的一般也就有些基础知识了。简单说说:
MQTT是IBM发布的一个物联网协议,怎么说呢,微信大家都知道,微信是大家互相联系用的,MQTT其实就类似一个物联网的微信,各个设备间可以通过MQTT来沟通信息。
其实设备间联系的协议有很多,比如TCP/UDP,HTTP等。MQTT作为很晚才出现的后辈,当然是解决以前协议的痛点的。
1.TCP/UDP(SOCKET通讯)这个是物联网甚至是互联网的基础。在应用层面,这算底层了,优点当然是灵活,其实灵活,往往就意味着难用(比如C++就很灵活)你如果想开发一个基于TCP通讯,你需要考虑通讯的方方面面,比如断线重连,比如心跳包,比如加密传输,这些都得自己来实现,可能会占用你大量的调优时间。
2.HTTP,HTTP协议大家都知道是网页传输协议,其实网页传输是HTTP的一种应用而已,HTTP属于对TCP的高层封装,是一种短链接协议,可用于设备间连接。基于HTTP协议的连接方式又有个名字叫RESTful,这个编程就简单了,因为短链接么,就不用考虑啥断线重连之类的了,并且python有urllib,requsets等库,通讯就是一句代码的事,简单至极,但也有缺点:包头太长,每次通讯都要重新连接一次。如果几秒或者几分钟以上通讯一次还差不多,如果太过频繁,不但浪费资源,也太占带宽。
MQTT完美解决了上边这些协议的痛点,并且由于是个标准,现在各种语言,乃至安卓、IOS上都有现成的客户端,特别适合我这种懒得开发JAVA APP的懒人。这里介绍一个好用的安卓APP:ioT MQTT Panel,装了这个APP,设置一下,就能通过MQTT控制设备了,下边是我随便做了个界面:
怎么样?是不是有点意思,值得说的是: 这是完全不需要编写代码的装上这个APP,设置一下就可以了,嗯这是跟我的树莓派连接的:
树莓派上我接了一个继电器,一个超声波测距仪,手机客户端则是实时显示树莓派CPU温度、超声波测距的距离,以及控制继电器吸合、断开。
下面,我会实战介绍下用这个APP控制ESP8266(nodemcu)来实现无线控制LED灯的亮灭。
先介绍下这个APP(ioT MQTT Panel)怎么用:
安装我就不怎么说了,安装完打开软件是这个样子的:
提示没有连接,点那个红色按钮创建一个连接:
前两项都是随便填的,值得注意的的是那个Broker Web/IP Address,这个最好自己架个服务器,而不是用我填的这个测试用服务器,当然这里做个例子,先用这个凑数了,填完后点那个CREATE:
可以看到名为”测试连接“的项目建成了。然后点进去:
这理解释下:Topic可以理解为一个通道,比如开关,按下后会往ledctl这个通道里发ledon这个信息,再按一下会往ledctl通道里发ledoff这个信息,最终界面如下:
下面,我们在MicroPython里边编写一点程序,用来接收这个界面发出的消息:
首先,下载micropython的MQTT库:
https://github.com/micropython/micropython-lib
下找到:umqtt.simple
这个目录下有几个例子,以及一个umqtt的目录(里边的simple.py就是库了)
吧simple.py库拷进ESP8266:
然后新建一个ledctl.py内容如下:
import time from simple import MQTTClient def sub_cb(topic, msg): #回调函数,收到服务器消息后会调用这个函数 print(topic, msg) c = MQTTClient("umqtt_client", "test.mosquitto.org") #建立一个MQTT客户端 c.set_callback(sub_cb) #设置回调函数 c.connect() #建立连接 c.subscribe(b"ledctl") #监控ledctl这个通道,接收控制命令 while True: c.check_msg() time.sleep(1)
然后点手机上的开关,在终端会收到如下信息:
好了,我们的ESP8266收到了手机发来的消息!
然后改写代码控制LED(我的板子上的LED为GPIO2)
import time from simple import MQTTClient from machine import Pin led=Pin(2,Pin.OUT) def sub_cb(topic, msg): print(topic, msg) if topic==b'ledctl': if msg==b'ledon': led.off() #因为实际IO为0ff时灯是亮的 if msg==b'ledoff': led.on() c = MQTTClient("umqtt_client", "test.mosquitto.org") c.set_callback(sub_cb) c.connect() c.subscribe(b"ledctl") while True: c.check_msg() time.sleep(1)
运行代码,发现手机可以正常控制灯的亮灭了
再写代码让第二个LED控件显示LED的状态:
import time from simple import MQTTClient from machine import Pin led=Pin(2,Pin.OUT) def sub_cb(topic, msg): print(topic, msg) if topic==b'ledctl': if msg==b'ledon': led.off() if msg==b'ledoff': led.on() c = MQTTClient("umqtt_client", "test.mosquitto.org") c.set_callback(sub_cb) c.connect() c.subscribe(b"ledctl") while True: c.check_msg() if led.value()==1: c.publish('ledstatus','ledoff') if led.value()==0: c.publish('ledstatus','ledon') time.sleep(1)
https://www.cnblogs.com/yafengabc/p/8685028.html
标签: 编程ESP8266pythonMicroPytMicroPythonESP32android
评论列表