2020-10-22_MQTT--ESP 8266端程序文件的改造

ESP 8266端的程序分为两个部分:simple.py , main.py,其中simple.py直接用uPyLoader传到ESP 8266内,main.py使用umqtt库文件夹中的example_sub.py文件改造,再加上自定义的ESP 8266控制程序。

1、example_sub.py原始文件:

import time

from umqtt.simple import MQTTClient

# Publish test messages e.g. with:

# mosquitto_pub -t foo_topic -m hello

# Received messages from subscriptions will be delivered to this callback

def sub_cb(topic, msg):

    print((topic, msg))

def main(server="localhost"):

    c = MQTTClient("umqtt_client", server)                        # MQTT客户端实例

    c.set_callback(sub_cb)                                               # 当收到消息时的回调函数, 即收到消息后,对数据进行处理或触发其它动作的函数,自定义编写功能

    c.connect()                                                               # 接入服务器

    c.subscribe(b"foo_topic")                                        # 订阅主题topic, 需自定义修改

    while True:                                                              # 进入主循环,检查是否有消息到达

        if True:

            # Blocking wait for message

            c.wait_msg()

        else:

            # Non-blocking wait for message

            c.check_msg()

            # Then need to sleep to avoid 100% CPU usage (in a real

            # app other useful actions would be performed instead)

            time.sleep(1)

    c.disconnect()

if __name__ == "__main__":

    main()


2、micropython中,上电后,首先执行boot.py,然后执行main.py,所以用户功能写在这个文件内。  这里,我把上一步的example_sub.py中的内容修改后,加入main.py,作为连接MQTT服务器的功能函数。程序如下:

     from simpleimport MQTTClient                                       # simple.py已经复制到ESP 8266了,所以直接从simple导入MQTTClient

     from machineimport Pin                                                 # esp 8266的python硬件库

     import network                                                              # 用于连接WIFI

# 在MQTT的消息回调函数内,主要实现将ESP 8266开发板上的蓝色LED(连接到pin2)指示灯点亮和熄灭的测试,如有需要可以自行添加其它功能。

led= Pin(2, Pin.OUT, value=1)

# Default MQTT server to connect to

SERVER= "0PM6216BMJ.iotcloud.tencentdevices.com"                            # 根据官方文件(开发者手册一栏)的说明,设置服务器地址

PORT= 1883                                                                                               # 服务器端口

# 产品名、设备名、密码,作为IotHmac的入口参数

pid= "0BC7N862MJ"

dname= "esp8266"

pwd= b"pa123"

# 在控制台的设备信息一栏中

USERNAME= "0BC7M86BMJesp8266;12010126;DKWDD;1603349745"

PASSWORD= "880c6a8cac1e9326bc2353365324ee24123506bd5ea2450ab387d6acf24df0a83a;hmacsha256"        # password: pa123

CLIENT_ID= "0BC7M86BMJesp8266"

TOPIC= b"0BC7M86BMJ/esp8266/info"      # 这儿必须加b'', 订阅的主题和控制台->“设备”->“权限列表”中的主题相关

state=

# 消息回调函数

def sub_cb(topic, msg):
              global state

             if msg== b"on":

             # 开led

              led.value(0)

              state= 1

              elif msg== b"off":

             # 关led

              led.value(1)

               state= 0

             elif msg== b"toggle":

               # 翻转led状态, 0->1,或1->0

                led.value(state)

                state= 1 - state

# 建立MQTT连接

def main(server=SERVER):

                   c= MQTTClient(CLIENT_ID, server, PORT, USERNAME, PASSWORD, keepalive=600)       # keepalive,设置保持连接的时间,单位秒,这儿设置600秒,如果在这段时间内ESP 8266未向服务器端发送至少一个消息,服务器将断开与它的连接。

                  # 消息回调函数,对接收到的消息进行自定义的处理

                   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()

# 使ESP 8266连接到WIFI

def wifi_connect():

             wlan= network.WLAN(network.STA_IF)

               wlan.active(True)

              wlan.disconnect()

             if not wlan.isconnected():

                   pass

            wlan.connect('TP-LINK_1', '12345678')                    # wifi 账号和密码

            while not wlan.isconnected():

                      pass

                      print("wifi is connected")


if __name__== '__main__':

    wifi_connect()

    main()


3、将上述main.py文件传送到ESP 8266中,就可以建立和服务器的连接了,在控制台的设备列表中可以看到,esp8266处于“在线”状态。


4、连接到服务器后,可以进入设备列表的“操作”下方的“管理”->“在线调试界面”,从服务器发送消息到ESP 8266,进行单向调试,测试程序功能。在调试前,需要弄清楚腾讯云MQTT服务器对topic主题的管理和命名方式:

(1)topic命名方式:产品ID+设备名+自定义名称。

(2)由于topic名和设备名相关联,因此不同设备(如ESP 8266和手机端APP)之间不能直接通过控制台设定的topic进行消息传递。

(3)在“设备”->“权限列表”中罗列了自定义的topic和系统topic的权限,该设备只能使用其中的topic进行上传或订阅消息,“自定义topic”可以增加和删除,在上一层的“产品”管理界面操作。

(4)在“设备”->“在线调试”界面也可以看到,当点击topic选择下拉框时,只能选择和本设备相关的topic。

(5)不同设备之间,要进行消息传递、订阅,需通过设置控制台主界面中的“规则引擎”来进行topic关联。

(6)“规则引擎”里有多种转发方式,这里选择“转发到另一个topic”,就可实现手机端APP发送消息到ESP 8266硬件平台。


5、首先在“产品”->“管理”->“权限列表”中编辑topic的权限(订阅/发布),编辑完成后,在各“设备”的“权限列表”中就会对应的产生变化,这儿可以自己新增一个topic用来测试,取名为info,权限为“发布和订阅”。


6、回到“规则引擎”里,新建一个规则,然后编辑“筛选数据”,设置对接收到的消息进行筛选,“字段”对应的是JSON数据格式的KEY值,下面的“条件”、“当前SQL”也是对应的规则语句,如果前面创建设备时,选择的“自定义数据格式”,那么,这里就可以用通配符“*”,表示不筛选,接收所有消息,“条件”一栏就空着不填; “Topic”设置为消息发布设备的topic,这里设置成手机APP客户端设备的topic(同样为发布和订阅双重权限)。


(“筛选数据”设置)


7、最后“添加行为操作”,“行为类型”选择“数据转发到另一个Topic(Republish)”,“产品”选择另一个设备对应的产品名,“设备”和“Topic”选择esp8266和对应的可订阅的info主题;保存好后,回到“规则引擎”主界面,将“状态”设置为“已激活”。这样,在手机端APP发送的消息就可以通过服务器转发给ESP 8266了。

(行为操作设置,转发到另一个topoic,即esp8266)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352