hanyeguxingwo 发表于 2016-11-22 11:32

MicroPython使用MQTT协议接入OneNET云平台

<div class='showpostmsg'> 本帖最后由 hanyeguxingwo 于 2016-11-22 11:33 编辑

       之前使用Arduino+ESP8266使用EDP协议成功接入了OneNET,实现了物联网控制,本次使用板载ESP8266的ESP-MP-01 MicroPython开发板使用MQTT协议同样成功接入,通过发布TOPIC成功实现智能设备控制。
【1】MQTT协议简介:
      MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。做为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。
【2】硬件与软件:
      本次使用的硬件为ESP-MP-01开发板:

         需要准备的软件有:
1、ESP_DOWNLOAD_TOOL用于下载开发板固件;
2、uPyLoader 用于与开发板的文件传输,同时该软件也具有终端软件调试的功能,该软件的使用和介绍可以在:https://github.com/BetaRavener/uPyLoader/中查看;
3、第三方库文件:umqtt,该模块封装了MQTT协议,该模块可以在:https://github.com/micropython/micropython-lib中找到。
【3】创建产品和设备:
      在OneNET平台创建MQTT公开协议的产品并添加设备:


【4】程序代码:
1、使用ESP_DOWNLOAD_TOOL 工具下载Micropython固件到开发板,固件: ;
2、打开命令行窗口,在uPyLoader目录下输入python main.py打开uPyLoader软件,该软件的运行需要使用pip安装PyQt5和pyserial;


3、选择与开发板连接的串口,连接成功后点击File->Init transfer files初始化传输文件,初始化成功后在MCU端会新增_upload.py和_download.py两个文件:

4、编辑boot.py,mqtt.py和main.py,并将编辑完成后的三个文件和umqtt目录下的simple.py文件一起传输至MCU端;
boot.py用于设置和连接网络:def do_connect():
      import network
      sta_if = network.WLAN(network.STA_IF)
      ap_if = network.WLAN(network.AP_IF)
      if ap_if.active():
                ap_if.active(False)
      if not sta_if.isconnected():
                print('connecting to network...')
      sta_if.active(True)
      sta_if.connect('MicroPython', '12345678') #wifi的SSID和密码
      while not sta_if.isconnected():
                pass
      print('network config:', sta_if.ifconfig())
      do_connect()
      gc.collect()


mqtt.py用于平台接入和消息处理:
from simple import MQTTClient
from machine import Pin
import machine
import micropython
# ESP8266 ESP-12 modules have blue, active-low LED on GPIO2, replace
# with something else if needed.
led = Pin(2, Pin.OUT, value=1)
# Default MQTT server to connect to
SERVER = "183.230.40.39"
CLIENT_ID = "4070825"
TOPIC = b"micropython1"
username='76013'
password='micropythonespmp01'
state = 0
def sub_cb(topic, msg):
    global state
    print((topic, msg))
    if msg == b"on":
            led.value(0)
            state = 1
            print("1")
    elif msg == b"off":
            led.value(1)
            state = 0
            print("0")
    elif msg == b"toggle":
            # LED is inversed, so setting it to current state
            # value will make it toggle
            led.value(state)
            state = 1 - state
def main(server=SERVER):
    c = MQTTClient(CLIENT_ID, server,6002,username,password)
    # Subscribed messages will be delivered to this callback
    c.set_callback(sub_cb)
    c.connect()
    c.subscribe(TOPIC)
    print("Connected to %s, subscribed to %s topic" % (server, TOPIC))
    try:
            while 1:
                  #micropython.mem_info()
                  c.wait_msg()
    finally:
            c.disconnect()


main.py用于程序的运行:
import mqtt
mqtt.main()
simple.py无需更改。

【5】连接测试:
      打开uPyLoader的终端窗口,复位开发板后可以看到成功连接值无线网络和接入OneNET服务器:


       发送MQTT命令,发送on开发板LED灯亮;发送off命令开发板LED灯灭。


【6】效果展示:
MicroPython接入OneNET云平台效果演示


</div><script>                                var loginstr = '<div class="locked">查看精华帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                               
                                if(parseInt(discuz_uid)==0){
                                                                                        (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                }
</script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>

slotg 发表于 2016-11-22 11:52

感谢分享,最近也在捣鼓这方面的技术。 :handshake:handshake:handshake

lyzhangxiang 发表于 2016-11-22 12:59

赞一个
mpy现在这么给力mqtt的库都有

johnrey 发表于 2016-11-22 13:21

搜了下oneNet,有好多个啊。用的是哪个呢?移动的那个开放平台吗?

hanyeguxingwo 发表于 2016-11-22 13:39

johnrey 发表于 2016-11-22 13:21
搜了下oneNet,有好多个啊。用的是哪个呢?移动的那个开放平台吗?

对,中国移动的

paderboy 发表于 2016-11-23 10:46

多谢分享。。。赞

lishuun 发表于 2016-11-23 21:52

请问一下,
TOPIC = b"micropython1"
username='76013'
password='micropythonespmp01'
这几个参数对应onenet那几个参数。我一直都没有连上。我用你代码的参数就不会报错。:time:

hanyeguxingwo 发表于 2016-11-24 08:08

lishuun 发表于 2016-11-23 21:52
请问一下,
TOPIC = b"micropython1"
username='76013'
password='micropythonespmp01'
这几个参数对应 ...

TOPIC是你发布的消息,发布和订阅的消息要一致,username是你的产品ID,password是你的鉴权信息

wmh522 发表于 2016-11-24 08:20

{:1_103:}

strong161 发表于 2016-11-24 09:19

不错不错,我来学习一下!{:1_103:}

zengdz 发表于 2016-12-1 23:14

感谢分享,运行的时候报错 File "simple.py", line 57, in connect; AttributeError: 'MQTTClient' object has no attribute 'settimeout',把该行代码删除之后正常了,

verybigman 发表于 2018-4-23 16:46

请问这个怎麽上传数具到ONENET,试了好久都没成功

youxinweizhi 发表于 2018-7-31 14:02

onenet一直发送空数据,板子不到一分钟就断开mqtt了。

target512 发表于 2021-5-7 14:03

<p>学习了,楼主分析很到位,经典不容错过,感谢大神。</p>

lkh747566933 发表于 2023-7-1 14:43

楼主厉害呀,资料很好,凑个热闹,来看看楼主的学习笔记

回归原点 发表于 2024-6-17 17:30

<p>感谢分享,谢谢</p>
页: [1]
查看完整版本: MicroPython使用MQTT协议接入OneNET云平台