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

ESP 8266端的程序分為兩個部分:simple.py , main.py,其中simple.py直接用uPyLoader傳到ESP 8266內(nèi)涮因,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)?????????????????????????????????????????????? # 當收到消息時的回調(diào)函數(shù), 即收到消息后动知,對數(shù)據(jù)進行處理或觸發(fā)其它動作的函數(shù),自定義編寫功能

? ? c.connect()?????????????????????????????????????????????????????????????? # 接入服務器

? ? c.subscribe(b"foo_topic")??????????????????????????????????????? # 訂閱主題topic员辩, 需自定義修改

? ? while True:????????????????????????????????????????????????????????????? # 進入主循環(huán)盒粮,檢查是否有消息到達

? ? ? ? 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中奠滑,上電后丹皱,首先執(zhí)行boot.py妒穴,然后執(zhí)行main.py,所以用戶功能寫在這個文件內(nèi)摊崭。? 這里讼油,我把上一步的example_sub.py中的內(nèi)容修改后,加入main.py呢簸,作為連接MQTT服務器的功能函數(shù)汁讼。程序如下:

???? from simpleimport MQTTClient?????????????????????????????????????? # simple.py已經(jīng)復制到ESP 8266了,所以直接從simple導入MQTTClient

???? from machineimport Pin???????????????????????????????????????????????? # esp 8266的python硬件庫

???? import network??????????????????????????????????????????????????? ? ??????? # 用于連接WIFI

# 在MQTT的消息回調(diào)函數(shù)內(nèi)阔墩,主要實現(xiàn)將ESP 8266開發(fā)板上的藍色LED(連接到pin2)指示燈點亮和熄滅的測試,如有需要可以自行添加其它功能瓶珊。

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

# Default MQTT server to connect to

SERVER= "0PM6216BMJ.iotcloud.tencentdevices.com"??????????????????????????? # 根據(jù)官方文件(開發(fā)者手冊一欄)的說明啸箫,設置服務器地址

PORT= 1883?????????????????????????????????????????????????????????????????????????????????????????????? # 服務器端口

# 產(chǎn)品名、設備名伞芹、密碼忘苛,作為IotHmac的入口參數(shù)

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'', 訂閱的主題和控制臺->“設備”->“權(quán)限列表”中的主題相關(guān)

state=

# 消息回調(diào)函數(shù)

def sub_cb(topic, msg):
????????????? global state

???????????? if msg== b"on":

? ?????????? # 開led

? ? ? ? ? ? ? led.value(0)

? ??????????? state= 1

????????????? elif msg== b"off":

? ?????????? # 關(guān)led

? ? ? ? ? ? ? led.value(1)

? ???????????? state= 0

???????????? elif msg== b"toggle":

? ? ? ? ? ? ?? # 翻轉(zhuǎn)led狀態(tài)唱较, 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秒,如果在這段時間內(nèi)ESP 8266未向服務器端發(fā)送至少一個消息汉形,服務器將斷開與它的連接纸镊。

? ??????????????? # 消息回調(diào)函數(shù),對接收到的消息進行自定義的處理

? ? ? ? ? ? ? ? ?? 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處于“在線”狀態(tài)凯旭。


4、連接到服務器后使套,可以進入設備列表的“操作”下方的“管理”->“在線調(diào)試界面”罐呼,從服務器發(fā)送消息到ESP 8266,進行單向調(diào)試童漩,測試程序功能弄贿。在調(diào)試前,需要弄清楚騰訊云MQTT服務器對topic主題的管理和命名方式:

(1)topic命名方式:產(chǎn)品ID+設備名+自定義名稱矫膨。

(2)由于topic名和設備名相關(guān)聯(lián)差凹,因此不同設備(如ESP 8266和手機端APP)之間不能直接通過控制臺設定的topic進行消息傳遞期奔。

(3)在“設備”->“權(quán)限列表”中羅列了自定義的topic和系統(tǒng)topic的權(quán)限,該設備只能使用其中的topic進行上傳或訂閱消息危尿,“自定義topic”可以增加和刪除呐萌,在上一層的“產(chǎn)品”管理界面操作。

(4)在“設備”->“在線調(diào)試”界面也可以看到谊娇,當點擊topic選擇下拉框時肺孤,只能選擇和本設備相關(guān)的topic。

(5)不同設備之間济欢,要進行消息傳遞赠堵、訂閱,需通過設置控制臺主界面中的“規(guī)則引擎”來進行topic關(guān)聯(lián)法褥。

(6)“規(guī)則引擎”里有多種轉(zhuǎn)發(fā)方式茫叭,這里選擇“轉(zhuǎn)發(fā)到另一個topic”,就可實現(xiàn)手機端APP發(fā)送消息到ESP 8266硬件平臺半等。


5揍愁、首先在“產(chǎn)品”->“管理”->“權(quán)限列表”中編輯topic的權(quán)限(訂閱/發(fā)布),編輯完成后杀饵,在各“設備”的“權(quán)限列表”中就會對應的產(chǎn)生變化莽囤,這兒可以自己新增一個topic用來測試,取名為info切距,權(quán)限為“發(fā)布和訂閱”朽缎。


6、回到“規(guī)則引擎”里蔚舀,新建一個規(guī)則饵沧,然后編輯“篩選數(shù)據(jù)”,設置對接收到的消息進行篩選赌躺,“字段”對應的是JSON數(shù)據(jù)格式的KEY值狼牺,下面的“條件”、“當前SQL”也是對應的規(guī)則語句礼患,如果前面創(chuàng)建設備時是钥,選擇的“自定義數(shù)據(jù)格式”,那么缅叠,這里就可以用通配符“*”悄泥,表示不篩選,接收所有消息肤粱,“條件”一欄就空著不填弹囚; “Topic”設置為消息發(fā)布設備的topic,這里設置成手機APP客戶端設備的topic(同樣為發(fā)布和訂閱雙重權(quán)限)领曼。


(“篩選數(shù)據(jù)”設置)


7鸥鹉、最后“添加行為操作”蛮穿,“行為類型”選擇“數(shù)據(jù)轉(zhuǎn)發(fā)到另一個Topic(Republish)”,“產(chǎn)品”選擇另一個設備對應的產(chǎn)品名毁渗,“設備”和“Topic”選擇esp8266和對應的可訂閱的info主題践磅;保存好后,回到“規(guī)則引擎”主界面灸异,將“狀態(tài)”設置為“已激活”府适。這樣,在手機端APP發(fā)送的消息就可以通過服務器轉(zhuǎn)發(fā)給ESP 8266了肺樟。

(行為操作設置檐春,轉(zhuǎn)發(fā)到另一個topoic,即esp8266)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末么伯,一起剝皮案震驚了整個濱河市喇聊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蹦狂,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件朋贬,死亡現(xiàn)場離奇詭異凯楔,居然都是意外死亡,警方通過查閱死者的電腦和手機锦募,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門摆屯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人糠亩,你說我怎么就攤上這事虐骑。” “怎么了赎线?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵廷没,是天一觀的道長。 經(jīng)常有香客問我垂寥,道長颠黎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任滞项,我火速辦了婚禮狭归,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘文判。我一直安慰自己过椎,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布戏仓。 她就那樣靜靜地躺著疚宇,像睡著了一般亡鼠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上灰嫉,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天拆宛,我揣著相機與錄音,去河邊找鬼讼撒。 笑死浑厚,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的根盒。 我是一名探鬼主播钳幅,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼炎滞!你這毒婦竟也來了敢艰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤册赛,失蹤者是張志新(化名)和其女友劉穎钠导,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體森瘪,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡牡属,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了扼睬。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逮栅。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖窗宇,靈堂內(nèi)的尸體忽然破棺而出措伐,到底是詐尸還是另有隱情,我是刑警寧澤军俊,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布侥加,位于F島的核電站拍屑,受9級特大地震影響谈宛,放射性物質(zhì)發(fā)生泄漏敲霍。R本人自食惡果不足惜魁衙,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一空猜、第九天 我趴在偏房一處隱蔽的房頂上張望患雏。 院中可真熱鬧郭毕,春花似錦浇辜、人聲如沸朋魔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至孙援,卻和暖如春害淤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拓售。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工窥摄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人础淤。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓崭放,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鸽凶。 傳聞我的和親對象是個殘疾皇子币砂,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345