在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用ESP32連接騰訊云實現遠程控制

嵌入式開發愛好者 ? 來源:嵌入式開發愛好者 ? 作者:嵌入式開發愛好者 ? 2022-11-22 09:19 ? 次閱讀

大家好,我是ST!

上次給大家分享了如何使用ESP32實現藍牙通信,今天跟大家聊聊如何使用ESP32連接騰訊云實現遠程控制。本次實驗用到MQTT協議,同樣,我用miropython編寫程序實現,最終可以通過騰訊連連微信小程序添加設備來發布主題消息給騰訊云,ESP32負責訂閱騰訊云主題消息,當收到某訂閱消息時,來控制ESP32設備上LED燈的亮滅。

第一步、創建騰訊云產品和設備

瀏覽器搜索【騰訊云】,進入騰訊云官網,微信注冊登錄

點擊【產品】搜索【物聯網開發平臺】,點擊【管理控制臺】

fa01dd48-69b2-11ed-8abf-dac502259ad0.png

fa2131ac-69b2-11ed-8abf-dac502259ad0.png

在實例管理中點擊【公共實例】

fa4b4258-69b2-11ed-8abf-dac502259ad0.png

點擊【新建項目】

fa659306-69b2-11ed-8abf-dac502259ad0.png

填寫自己的項目名稱,點擊【保存】

fa808238-69b2-11ed-8abf-dac502259ad0.png

點擊剛新建的項目

fa9d933c-69b2-11ed-8abf-dac502259ad0.png

點擊【新建產品】

fabbe166-69b2-11ed-8abf-dac502259ad0.png

輸入自己定義的【產品名稱】,【產品類別】選智慧城市->公共事業->路燈照明,【通信設備】填wi-fi,其他的默認,點擊【確定】

facd8fa6-69b2-11ed-8abf-dac502259ad0.png

點擊自己剛新建的產品名稱

faea64f0-69b2-11ed-8abf-dac502259ad0.png

下拉到最后點擊【下一步】

fb05daaa-69b2-11ed-8abf-dac502259ad0.png

點擊【基于模組開發】,產品平臺選擇【樂鑫】,類型選擇【wifi】,點擊【樂鑫ESP-WROOM-】點擊【確定】

fb21b2a2-69b2-11ed-8abf-dac502259ad0.png

下拉到最后,點擊【下一步】

fb48045c-69b2-11ed-8abf-dac502259ad0.png

點擊【產品展示配置】右側的【配置】

fb682142-69b2-11ed-8abf-dac502259ad0.png

【產品展示名稱】填寫自己自定義的名稱,【廠家名稱】填安信可,【產品信號】填esp32,點擊【保存】,上拉點擊【<-】返回

fb81d38a-69b2-11ed-8abf-dac502259ad0.png

點擊【快捷入口配置】右側的【配置】,默認不修改,點擊【保存】,上拉點擊【<-】返回

fb9a39de-69b2-11ed-8abf-dac502259ad0.png

點擊【面板配置】右側的【配置】,默認不修改,點擊【保存】,點擊【<-】返回

點擊【配網引導】右側的【配置】,【芯片方案選擇】選擇樂鑫,【首選配網方式】選擇Smart Config,【次配網方式】選擇Soft Ap,點擊;【保存】,點擊【<-】返回

fbae5eb4-69b2-11ed-8abf-dac502259ad0.png

點擊【掃一掃產品介紹】右側的【配置】,默認不修改,點擊【保存】,點擊【<-】返回

點擊【智能聯動配置】右側的【配置】,默認不修改,點擊保存,點擊【<-】返回

點擊【下一步】

fbc7d736-69b2-11ed-8abf-dac502259ad0.png

點擊【新建設備】,自定義【設備名稱】,點擊【保存】

fbe236ee-69b2-11ed-8abf-dac502259ad0.png

點擊【二維碼】,用手機微信小程序【騰訊連連】掃碼添加設備

fbf197ce-69b2-11ed-8abf-dac502259ad0.png

此時設備已經創建完成,但是設備還未激活,需要后面的的操作連接才可激活

第二步:生成Username和Password

點擊【設備調試】,點擊【設備名稱】

fc0899f6-69b2-11ed-8abf-dac502259ad0.png

復制保存設備信息三件套:設備名稱、產品ID、設備密鑰

后面生成MOTT協議中的Username和Password需要用到

fc2786e0-69b2-11ed-8abf-dac502259ad0.png

打開password生成工具,在文件夾里有給出,點擊【sign.html】

fc422d10-69b2-11ed-8abf-dac502259ad0.png

輸入剛剛復制的設備信息三件套,Hmac簽名算法選擇【HMAC-SHA1】,點擊【Generate】,即可生成Usename和Password,復制保存,后面esp32連接騰訊云和MQTTfx模擬的客戶端連接騰訊云需要用到

fc5cc5f8-69b2-11ed-8abf-dac502259ad0.png

第三步:MQTTfx模擬客戶端連接騰訊云步驟與調試(非必須步驟)

打開MQTT.fx軟件,我的壓縮包里面有,點擊下圖的齒輪圖形,進入設置

fc7551cc-69b2-11ed-8abf-dac502259ad0.png

【Profile name】:自定義的名字

【Profile Type】:選擇【MQTT Broker】

【Broker Address】:騰訊云三件套中的產品ID+.iotcloud.tencentdevices.com

如我的騰訊云ID為:D89S2VVAFT,

那么Broker Address為:D89S2VVAFT.iotcloud.tencentdevices.com

Broker Port:1883

【Client ID】:騰訊云產品ID+騰訊云設備名稱+|securemode=3,signmethod=hmacsha1|

例如我的騰訊云產品ID為:D89S2VVAFT,騰訊云產品名稱為:esp_led

則Client ID為:D89S2VVAFTesp_led|securemode=3,signmethod=hmacsha1|

填寫這些數據完畢后,點擊【User Credentlals】

fcbcdae2-69b2-11ed-8abf-dac502259ad0.png

User Name和Password填寫第二步生成的,每個人的都不一樣

【User Name】:D89S2VVAFTesp_led;12010126;CU7SQ;1660090317

【Password】:cd6c31a3d4cfdba2759deab02fb831a0f672e008;hmacsha1

點擊【OK】保存

fcdcad04-69b2-11ed-8abf-dac502259ad0.png

點擊【Connect】連接騰訊云

fcf675fe-69b2-11ed-8abf-dac502259ad0.png

MQTT.fx模擬的客戶端連接騰訊云成功后可以看到右邊的原點變綠,并且有個打開的所,

這時候我們就可以通過手機端小程序騰訊連連來給騰訊云發送消息,騰訊云再將此消息發送給MQTT.fx客戶端,但是前提是MQTT.fx客戶端需要訂閱騰訊云,下面是訂閱的步驟

fd0f312a-69b2-11ed-8abf-dac502259ad0.png

點擊【Subscribe】,Subscribe左邊的空格填寫格式為:

$thing/down/property/“騰訊云產品ID”/“騰訊云產品名稱”

例如:$thing/down/property/D89S2VVAFT/esp_led

填寫完成后,點擊【Subscribe】,現在手機端騰訊練練發送消息,MQTT.fx可以收到消息了

fd24163a-69b2-11ed-8abf-dac502259ad0.png

可以看到MQTT.fx收到了消息,MQTT.fx只是模擬一個客戶端接收消息,我們需要將我們的esp32模塊替代MQTT.fx,這樣我們就可以通過手機發送消息給騰訊云,騰訊云轉發消息給esp32模塊了,通過單片機對收到的數據處理,就可以通過手機端控制開發板的LED燈亮滅。

fd4101fa-69b2-11ed-8abf-dac502259ad0.png

第四步、編寫程序代碼

首先需要用到MQTT的驅動代碼,我在網上找到了一個用miropython寫的驅動代碼,大家可以直接復制使用,命名為umqttsimple.py即可,代碼如下:

import usocket as socket
import ustruct as struct
from ubinascii import hexlify




class MQTTException(Exception):
    pass




class MQTTClient:
    def __init__(
        self,
        client_id,
        server,
        port=0,
        user=None,
        password=None,
        keepalive=0,
        ssl=False,
        ssl_params={},
    ):
        if port == 0:
            port = 8883 if ssl else 1883
        self.client_id = client_id
        self.sock = None
        self.server = server
        self.port = port
        self.ssl = ssl
        self.ssl_params = ssl_params
        self.pid = 0
        self.cb = None
        self.user = user
        self.pswd = password
        self.keepalive = keepalive
        self.lw_topic = None
        self.lw_msg = None
        self.lw_qos = 0
        self.lw_retain = False


    def _send_str(self, s):
        self.sock.write(struct.pack("!H", len(s)))
        self.sock.write(s)


    def _recv_len(self):
        n = 0
        sh = 0
        while 1:
            b = self.sock.read(1)[0]
            n |= (b & 0x7F) << sh
            if not b & 0x80:
                return n
            sh += 7


    def set_callback(self, f):
        self.cb = f


    def set_last_will(self, topic, msg, retain=False, qos=0):
        assert 0 <= qos <= 2
        assert topic
        self.lw_topic = topic
        self.lw_msg = msg
        self.lw_qos = qos
        self.lw_retain = retain


    def connect(self, clean_session=True):
        self.sock = socket.socket()
        addr = socket.getaddrinfo(self.server, self.port)[0][-1]
        self.sock.connect(addr)
        if self.ssl:
            import ussl


            self.sock = ussl.wrap_socket(self.sock, **self.ssl_params)
        premsg = bytearray(b"x10")
        msg = bytearray(b"x04MQTTx04x02")


        sz = 10 + 2 + len(self.client_id)
        msg[6] = clean_session << 1
        if self.user is not None:
            sz += 2 + len(self.user) + 2 + len(self.pswd)
            msg[6] |= 0xC0
        if self.keepalive:
            assert self.keepalive < 65536
            msg[7] |= self.keepalive >> 8
            msg[8] |= self.keepalive & 0x00FF
        if self.lw_topic:
            sz += 2 + len(self.lw_topic) + 2 + len(self.lw_msg)
            msg[6] |= 0x4 | (self.lw_qos & 0x1) << 3 | (self.lw_qos & 0x2) << 3
            msg[6] |= self.lw_retain << 5


        i = 1
        while sz > 0x7F:
            premsg[i] = (sz & 0x7F) | 0x80
            sz >>= 7
            i += 1
        premsg[i] = sz


        self.sock.write(premsg, i + 2)
        self.sock.write(msg)
        # print(hex(len(msg)), hexlify(msg, ":"))
        self._send_str(self.client_id)
        if self.lw_topic:
            self._send_str(self.lw_topic)
            self._send_str(self.lw_msg)
        if self.user is not None:
            self._send_str(self.user)
            self._send_str(self.pswd)
        resp = self.sock.read(4)
        assert resp[0] == 0x20 and resp[1] == 0x02
        if resp[3] != 0:
            raise MQTTException(resp[3])
        return resp[2] & 1


    def disconnect(self):
        self.sock.write(b"xe0")
        self.sock.close()


    def ping(self):
        self.sock.write(b"xc0")


    def publish(self, topic, msg, retain=False, qos=0):
        pkt = bytearray(b"x30")
        pkt[0] |= qos << 1 | retain
        sz = 2 + len(topic) + len(msg)
        if qos > 0:
            sz += 2
        assert sz < 2097152
        i = 1
        while sz > 0x7F:
            pkt[i] = (sz & 0x7F) | 0x80
            sz >>= 7
            i += 1
        pkt[i] = sz
        # print(hex(len(pkt)), hexlify(pkt, ":"))
        self.sock.write(pkt, i + 1)
        self._send_str(topic)
        if qos > 0:
            self.pid += 1
            pid = self.pid
            struct.pack_into("!H", pkt, 0, pid)
            self.sock.write(pkt, 2)
        self.sock.write(msg)
        if qos == 1:
            while 1:
                op = self.wait_msg()
                if op == 0x40:
                    sz = self.sock.read(1)
                    assert sz == b"x02"
                    rcv_pid = self.sock.read(2)
                    rcv_pid = rcv_pid[0] << 8 | rcv_pid[1]
                    if pid == rcv_pid:
                        return
        elif qos == 2:
            assert 0


    def subscribe(self, topic, qos=0):
        assert self.cb is not None, "Subscribe callback is not set"
        pkt = bytearray(b"x82")
        self.pid += 1
        struct.pack_into("!BH", pkt, 1, 2 + 2 + len(topic) + 1, self.pid)
        # print(hex(len(pkt)), hexlify(pkt, ":"))
        self.sock.write(pkt)
        self._send_str(topic)
        self.sock.write(qos.to_bytes(1, "little"))
        while 1:
            op = self.wait_msg()
            if op == 0x90:
                resp = self.sock.read(4)
                # print(resp)
                assert resp[1] == pkt[2] and resp[2] == pkt[3]
                if resp[3] == 0x80:
                    raise MQTTException(resp[3])
                return


    # Wait for a single incoming MQTT message and process it.
    # Subscribed messages are delivered to a callback previously
    # set by .set_callback() method. Other (internal) MQTT
    # messages processed internally.
    def wait_msg(self):
        res = self.sock.read(1)
        self.sock.setblocking(True)
        if res is None:
            return None
        if res == b"":
            raise OSError(-1)
        if res == b"xd0":  # PINGRESP
            sz = self.sock.read(1)[0]
            assert sz == 0
            return None
        op = res[0]
        if op & 0xF0 != 0x30:
            return op
        sz = self._recv_len()
        topic_len = self.sock.read(2)
        topic_len = (topic_len[0] << 8) | topic_len[1]
        topic = self.sock.read(topic_len)
        sz -= topic_len + 2
        if op & 6:
            pid = self.sock.read(2)
            pid = pid[0] << 8 | pid[1]
            sz -= 2
        msg = self.sock.read(sz)
        self.cb(topic, msg)
        if op & 6 == 2:
            pkt = bytearray(b"x40x02")
            struct.pack_into("!H", pkt, 2, pid)
            self.sock.write(pkt)
        elif op & 6 == 4:
            assert 0


    # Checks whether a pending message from server is available.
    # If not, returns immediately with None. Otherwise, does
    # the same processing as wait_msg.
    def check_msg(self):
        self.sock.setblocking(False)
        return self.wait_msg()

主程序代碼如下:

import time
import network
from umqttsimple import MQTTClient
from machine import Pin,Timer


def do_connect():
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('connecting to network...')
        wlan.connect('11', '1234567a')
        i = 1
        while not wlan.isconnected():
            print("正在鏈接...{}".format(i))
            i += 1
            time.sleep(1)
    print('network config:', wlan.ifconfig())




def sub_cb(topic, msg): # 回調函數,收到服務器消息后會調用這個函數
    print(topic, msg)
    top=str(topic,'UTF-8')
    strdata=str(msg,'UTF-8')
    count=strdata.find("power_switch")
    print(strdata[count+len("power_switch")+2])
    if strdata[count+len("power_switch")+2]=='0' and top=='$thing/down/property/D89S2VVAFT/esp_led':
        led.value(1)
    if strdata[count+len("power_switch")+2]=='1' and top=='$thing/down/property/D89S2VVAFT/esp_led':
        led.value(0)
        
#客戶端ID    
client_id="D89S2VVAFTesp_led|securemode=3,signmethod=hmacsha1|"
#服務器域名
addr="D89S2VVAFT.iotcloud.tencentdevices.com"
#端口號
port=1883
#用戶名
username="D89S2VVAFTesp_led;12010126;KTXHT;1669512546"
#密碼
password="0569df86e0c75494960cc922703c9ddd47c3fee048ed03d6b1a22d89a8b8a305;hmacsha256"




led=Pin(22,Pin.OUT)
led.value(1)
# 1. 聯網
do_connect()
# 2. 創建mqt
c = MQTTClient(client_id=client_id,server=addr,port=port,user=username,password=password,keepalive=60)  # 建立一個MQTT客戶端
c.set_callback(sub_cb)  # 設置回調函數
c.connect()  # 建立連接
c.subscribe(b"$thing/down/property/D89S2VVAFT/esp_led")  # 監控ledctl這個通道,接收控制命令
timer1 = Timer(0)
timer1.init(period=1000*60, mode=Timer.PERIODIC, callback=lambda t: c.ping())
while True:
    c.check_msg()

fd57451e-69b2-11ed-8abf-dac502259ad0.png

點擊編譯,編譯成功如下

fd76b6f6-69b2-11ed-8abf-dac502259ad0.png

查看騰訊云建立的設備,可以看到,此時設備已經在線

fd94977a-69b2-11ed-8abf-dac502259ad0.png

點擊二維碼,打開騰訊連連小程序,掃碼添加設備

fdb7937e-69b2-11ed-8abf-dac502259ad0.png

現在就可以通過騰訊連連來控制ESP32設備啦!點擊點燈開關,ESP32設備打印出收到的消息,如下:

fdd28e04-69b2-11ed-8abf-dac502259ad0.png

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 遠程控制
    +關注

    關注

    4

    文章

    637

    瀏覽量

    35008
  • 騰訊云
    +關注

    關注

    0

    文章

    215

    瀏覽量

    16840
  • MQTT
    +關注

    關注

    5

    文章

    653

    瀏覽量

    22692
  • ESP32
    +關注

    關注

    18

    文章

    978

    瀏覽量

    17528

原文標題:使用ESP32連接騰訊云實現遠程控制

文章出處:【微信號:嵌入式開發愛好者,微信公眾號:嵌入式開發愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    GD32F310連接ESP8266實現遠程控制

    通過mcu與esp01通過uart連接,通過at指令來創建socket連接,接收遠端控制燈的指令,來實現燈亮,滅及閃爍;
    的頭像 發表于 09-22 18:10 ?3027次閱讀
    GD32F310<b class='flag-5'>連接</b><b class='flag-5'>ESP</b>8266<b class='flag-5'>實現</b><b class='flag-5'>遠程</b>燈<b class='flag-5'>控制</b>

    使用CW32單片機通過ESP8266連接OneNET物聯網平臺

    這期視頻向大家介紹如何使用CW32單片機通過ESP8266連接OneNET物聯網平臺,發送溫濕度數據到平臺,并接受平臺的控制。
    的頭像 發表于 11-09 14:32 ?1632次閱讀

    ESP32S3連接阿里物聯網平臺LinkSDK報錯怎么解決?

    posix_port.c,具體報錯信息如圖所示。向阿里客服提交工單希望能夠解決,客服最終回復:posix_port.c這個文件,是系統依賴接口的實現,也是用戶需要進行移植的那一部分,根據對應的底層系統進行實現。由于本人對這個不
    發表于 06-28 11:30

    STM32F103C8T6連接阿里物聯網平臺

    STM32F103C8T6連接阿里物聯網平臺(1)—阿里lot Studio控制Web開發分享一下自己使用stm32f103c8t6通過ESP
    發表于 08-11 09:33

    請問esp8266如何通過mqtt協議建立連接實現小車的遠程控制?

    請問esp8266如何通過mqtt協議建立連接實現小車的遠程控制?
    發表于 11-01 06:32

    為什么ESP32騰訊ASR平臺會出現偶發性的簽名錯誤問題呢

    為什么ESP32騰訊ASR平臺會出現偶發性的簽名錯誤問題呢?怎樣去解決這個問題?
    發表于 12-23 09:24

    如何使用Arduino IDE開發讓ESP32連接wifi?

    如何使用Arduino IDE開發讓ESP32連接wifi?
    發表于 01-14 07:09

    有沒有例程通過esp32連接AWS IOT平臺?如何連接到AWSiot平臺?

    有沒有例程通過esp32連接AWS IOT平臺??如何連接到AWSiot平臺?百度找的一些博客都說在樂鑫SDK esp-idf的例程esp-
    發表于 02-20 06:00

    使用esp8266連接阿里進行OTA升級提示錯誤咋辦?

    使用esp8266連接阿里進行OTA升級提示no memory recive buffer
    發表于 02-24 14:25

    請問能提供一份release版本的ESP32騰訊AT固件嗎?

    請問能提供一份 release 版本的 ESP32 騰訊 AT 固件嗎? 我們在 ESP-AT 倉庫編譯出來的固件在驗證 ota 時候有問題: 發現顯示 207 報錯,經查文檔這個
    發表于 04-24 09:16

    想通過ESP8266連接阿里,固件哪里有?

    想用新唐的板子,通過esp8266連接阿里 有沒有測試好的esp8266的固件? 還是說,這個固件要自己修改,自己寫?
    發表于 06-27 07:40

    關于ESP8266和機智實現遠程控制車庫卷簾門解析

    [?本文概述 ? ] 本案例展示通過機智IoT開發平臺,使用單片機搭載ESP8266Wi-Fi模塊連接路由器,實現設備聯網,同時借助機智
    的頭像 發表于 05-31 09:12 ?3941次閱讀
    關于<b class='flag-5'>ESP</b>8266和機智<b class='flag-5'>云</b><b class='flag-5'>實現</b><b class='flag-5'>遠程控制</b>車庫卷簾門解析

    吃白菜一樣用micropython玩esp32(四)—— siri遠程控制點燈

    這節讓esp32通過wifi自己建立一個web server,就是自己建立一個網站服務器,就會有一個ip地址,在手機或電腦和esp32連接同一個wifi的情況下,讓手機或電腦登錄那個ip地址的網站
    發表于 12-29 19:02 ?7次下載
    吃白菜一樣用micropython玩<b class='flag-5'>esp32</b>(四)—— siri<b class='flag-5'>遠程控制</b>點燈

    使用ESP32、Python和javascript的遠程控制繼電器

    電子發燒友網站提供《使用ESP32、Python和javascript的遠程控制繼電器.zip》資料免費下載
    發表于 11-10 10:27 ?1次下載
    使用<b class='flag-5'>ESP32</b>、Python和javascript的<b class='flag-5'>遠程控制</b>繼電器

    啟明云端測試分享|ESP32-C3連接阿里

    啟明云端手把手教程ESP32-C3連接阿里
    的頭像 發表于 09-13 15:10 ?2809次閱讀
    啟明云端測試分享|<b class='flag-5'>ESP32</b>-C3<b class='flag-5'>連接</b>阿里<b class='flag-5'>云</b>
    主站蜘蛛池模板: 国产精品嫩草影院在线播放 | 婷婷丁香激情五月 | 欧美性网| 色综合成人网 | 亚洲精品九色在线网站 | 91中文在线观看 | 色视频在线观看完整免费版 | 开心激情五月网 | 精品女同同性视频很黄很色 | 亚洲日本精品 | 久久国模 | 综合爱爱 | 国产精品三级在线观看 | 成人精品福利 | 日本又粗又长一进一出抽搐 | 欧美一级免费看 | 久久精品亚洲 | 欧美jizzhd精品欧美4k | 色婷婷综合久久久中文字幕 | 欧美67194| 美女扒开尿口让男人桶 | 在线另类| 日韩a一级欧美一级 | 欧美午夜网 | 美女喷白浆 | 18毛片 | 在线播放你懂 | 天天操天天射天天舔 | 色色色爱| 日本污全彩肉肉无遮挡彩色 | 手机看片神马午夜 | 韩国三级无遮挡床戏视频 | 少妇被按摩 | 七月丁香八月婷婷综合激情 | 亚洲 另类 在线 欧美 制服 | 四虎永久免费在线观看 | 男人天堂网址 | 国内精品手机在线观看视频 | 97精品伊人久久大香线蕉 | 大香交伊人| 亚洲国产成人久久笫一页 |