zoukankan      html  css  js  c++  java
  • MicroPython入坑记(四)利用MQTT实现0编程远程控制(下)(用安卓手机)

    先介绍下这个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)

      

  • 相关阅读:
    索引优化策略
    mysql列类型选择
    redis安装
    redis相关面试题
    aop动态代理源码分析
    JVM运行时数据区
    redis应用场景
    JPA相关知识
    技术栈
    linux上安装mysql5.6
  • 原文地址:https://www.cnblogs.com/yafengabc/p/8685028.html
Copyright © 2011-2022 走看看