1. 程式人生 > >MQTT學習筆記——Yeelink MQTT服務 使用mqtt.js和paho-mqtt

MQTT學習筆記——Yeelink MQTT服務 使用mqtt.js和paho-mqtt

0 前言

    2014年8月yeelink推出基於MQTT協議的開關型別裝置控制API,相比於基於HTTP RESTful的輪訓方式,通過訂閱相關主題訊息,可以遠端控制類應用實時性更好。本文使用兩種方式實現開關型別裝置的遠端控制,一種是基於nodeJS的MQTT.js擴充套件庫,另一種是基於python的paho-mqtt擴充套件庫。    【相關博文——MQTT】    【相關博文——HTTP RESTful】1 安裝和使用mqtt.js    由於沒有在樹莓派上安裝nodeJS,也沒有安裝GPIO擴充套件庫,所以本例並沒有演示如何通過yeelink推送的訊息控制GPIO。所以本例暫時只能在PC機上執行,但是通過該例子可以熟悉yeelink MQTT的基本使用方法。1.1 安裝mqtt.js
npm install mqtt 或 cnpm install mqtt1.2 實現程式碼——yeelink_mqtt.js
var mqtt = require('mqtt'); 

var username = 'U-ApiKey'; 
var password = 'ffa3826972d6cc7ba5b17e104ec5xxxx'; 
var hostname = 'mqtt.yeelink.net'; 
var topic = '/v1.1/device/1949/sensor/2511/datapoints'; 

var url = 'mqtt://' + username + ':' + password + '@' + hostname; 

console.log(url);

var client = mqtt.connect(url); 
// 訂閱主題 
client.subscribe(topic); 

client.on('message', function(topic, message) { 
    console.log(topic); 
    console.log(message); 
});
1.3 執行    【執行程式碼】    node yeelink_mqtt.js    【修改狀態】    登入yeelink平臺通過網頁修改開關裝置狀態,也可通過其他方法修改裝置狀態。一旦裝置狀態發生修改,那麼控制檯便會輸出被推送的訊息,整個過程幾乎沒有延時。    【控制檯輸出】mqtt://U-ApiKey:[email protected]
/v1.1/device/1949/sensor/2511/datapoints
{"sensor_id":2511,"timestamp":1410835745,"value":1}
/v1.1/device/1949/sensor/2511/datapoints
{"sensor_id":2511,"timestamp":1410835754,"value":0}
1.4 簡單說明    【1】MQTT協議中可指定使用者名稱和密碼,在yeelink協議中,使用者名稱變為U-ApiKey,密碼為U-ApiKey的具體值。    【2】訂閱主題為裝置URI,需要把API版本號修改為v1.1    【3】主機名稱為mqtt.yeelink.net,而不是api.yeelink.net    在mqtt.js的示例程式碼中:client = mqtt.connect('mqtt://user:[email protected]');    在yeelink的示例程式碼中:client = mqtt.connect("mqtt://U-ApiKey:<your_key>@mqtt.yeelink.net");    以上的兩個示例程式碼更可以說明各引數的對應關係。2 安裝和使用paho-mqtt    本例演示在樹莓派上安裝paho-mqtt,通過推送訊息的內容控制GPIO2.1 安裝paho-mqtt    pip install paho-mqtt2.2 實現程式碼
# -*- coding: utf-8 -*-  
import paho.mqtt.client as mqtt
import RPi.GPIO as GPIO
import json

hostname = 'mqtt.yeelink.net'
username = 'U-ApiKey'
password = 'ffa3826972d6cc7ba5b17e104ec5xxxx'
topic = '/v1.1/device/1949/sensor/2511/datapoints'
# BCM GPIO編號
pins = [17,18,27,22,23,24,25,4]
pin = 18

def gpio_setup():
    # 採用BCM編號
    GPIO.setmode(GPIO.BCM)
    # 設定所有GPIO為輸出狀態,且輸出低電平
    for pin in pins:
        GPIO.setup(pin, GPIO.OUT)
        GPIO.output(pin, GPIO.LOW)
        
def gpio_destroy():
    for pin in pins:
        GPIO.output(pin, GPIO.LOW)
        GPIO.setup(pin, GPIO.IN)
        
# 連線成功回撥函式
def on_connect(client, userdata, flags, rc):
    print("Connected with result code " + str(rc))
    # 連線完成之後訂閱主題
    client.subscribe(topic)

# 訊息推送回調函式
def on_message(client, userdata, msg):
    print(msg.topic+" "+str(msg.payload))
    # 獲得負載中的pin 和 value
    gpio = json.loads(str(msg.payload))

    if gpio['value'] == 0:
        GPIO.output(pin, GPIO.LOW)
    else:
        GPIO.output(pin, GPIO.HIGH)    

if __name__ == '__main__':
    client = mqtt.Client()
    client.on_connect = on_connect
    client.on_message = on_message
    gpio_setup()
    
    try:
        # 配置使用者名稱和密碼
        client.username_pw_set(username, password)
        client.connect(hostname, 1883, 60)
        client.loop_forever()
    except KeyboardInterrupt:
        client.disconnect()
        gpio_destroy()
2.3 執行    【執行程式碼】    python yeelink_mqtt.js    【修改狀態】    登入yeelink平臺通過網頁修改開關裝置狀態,也可通過其他方法修改裝置狀態。一旦裝置狀態發生修改,那麼控制檯便會輸出被推送的訊息,整個過程幾乎沒有延時。    【控制檯輸出】Connected with result code 0/v1.1/device/1949/sensor/2511/datapoints {"sensor_id":2511,"timestamp":141083559 8,"value":1} /v1.1/device/1949/sensor/2511/datapoints {"sensor_id":2511,"timestamp":141083560 2,"value":0}2.4 簡單說明    【1】請注意程式碼中的使用者名稱,密碼設定,通過client.username_pw_set(username, password)設定使用者名稱和密碼,但是使用者名稱和密碼此時變為了U-ApiKey和U-ApiKey的具體值。    【2】on_connect為連線成功回撥函式,on_message為收到推送訊息回撥函式。    【3】連線成功之後訂閱主題,若接收到伺服器推送的訊息,通過訊息中value控制GPIO。3 總結    【1】在yeelink應用中U-ApiKey變為了使用者名稱和密碼    【2】裝置URI變為了主題    【3】訂閱了相關主題的訊息之後,若通過其他方法(HTTP RESTful)改變開關裝置狀態,那麼裝置便會接收到來自yeelink平臺的推送訊息,我們可以認為訊息推送是實時的。    【4】相對於裝置控制,MQTT協議比HTTP協議要簡潔些,實時性更好。4 參考資料

相關推薦

MQTT學習筆記——Yeelink MQTT服務 使用mqtt.jspaho-mqtt

0 前言    2014年8月yeelink推出基於MQTT協議的開關型別裝置控制API,相比於基於HTTP RESTful的輪訓方式,通過訂閱相關主題訊息,可以遠端控制類應用實時性更好。本文使用兩種方式實現開關型別裝置的遠端控制,一種是基於nodeJS的MQTT.js擴充套

MQTT 學習筆記

內容 -s 應用程序 方式 主題 網絡流 有關 信息 版本 MQTT特點 MQTT協議是為大量計算能力有限,且工作在低帶寬、不可靠的網絡的遠程傳感器和控制設備通訊而設計的協議。 1、使用發布/訂閱消息模式,提供一對多的消息發布,解除應用程序耦合 2、對負載內容屏蔽的消息傳輸

MQTT學習筆記——MQTT協議體驗 Mosquitto安裝使用

0 前言    MQTT是IBM開發的一個即時通訊協議。MQTT是面向M2M和物聯網的連線協議,採用輕量級釋出和訂閱訊息傳輸機制。Mosquitto是一款實現了 MQTT v3.1 協議的開源訊息代理軟體,提供輕量級的,支援釋出/訂閱的的訊息推送模式,使裝置對裝置之間的短訊息

MQTT學習筆記-Mosquitto的安裝與啟動

Mosquitto是一個實現了MQTT3.1協議的代理伺服器,由MQTT協議創始人之一的Andy Stanford-Clark開發,它為我們提供了非常棒的輕量級資料交換的解決方案。 在ubuntu下的

Linux學習筆記:Linux服務以及服務的安全

加密 解密一、數據加密和解密 進程間通信: 同一主機內的進程間通信: 發送信號(signal), 共享內存(shm), semaphore message queue, MQ, RabbitMQ 不同主機之間的進程間通信: Socket-pair,套接字對兒; 三種類型的套接字: 流套接

【知了堂學習筆記】--關於對Node.js訪問數據庫連接池的理解與簡單的建立---@wan<

png 程序 數據庫連接池 新建 -s const 服務 pre conf 是什麽數據庫連接池 官方解釋:數據庫連接池負責分配、管理和釋放數據庫連接,它允許應用程序重復使用一個現有的數據庫連接,而不是再重新建立一個;釋放空閑時間超過最大空閑時間的數據庫連接來避免因為沒有

Angular5學習筆記 - 創建服務(九)

sym oca cal gen temp 創建服務 .get ide use 一、創建服務 ng generate service service-name #簡寫 ng g s component-name ng g s services/userService 二、

MySQL學習筆記:計算機服務中找不到MySQL服務

技術分享 sql AS 目錄 exe class sql安裝 .com com   不知道什麽原因,連接了遠程服務器之後,本地服務就連接不上。   經排查,發現服務中的MySQL服務居然不見,一番搜索之後,在CMD中進入到MySQL安裝目錄的bin下執行以下語句: mys

Ceph分布式存儲學習筆記之ISCSI服務配置

ceph本文分兩部分分別介紹Ceph Luminous版集群的安裝以及配置ISCSI服務。 一、部署ceph集群 [root@ceph01 ~]# yum -y install ceph 1.1 Ceph Monitor部署 [root@ceph01 ~]# mkdir ceph;cd ceph [root@

Nodejs學習筆記(七)—Node.js + Express 構建網站簡單示例

ren 結構 crypto 中間件 實現 cmd ews path releases 前言   上一篇學習了一些構建網站會用到的一些知識點:https://www.cnblogs.com/flyingeagle/p/9192936.html   這一篇主要結合前面講到的知識

Nodejs學習筆記(八)—Node.js + Express 實現上傳文件功能(felixge/node-formidable)

blog args 一個 type屬性 ole java mod device 前端 前言   前面講了一個構建網站的示例,這次在此基礎上再說說web的常規功能----文件上傳,示例以一個上傳圖片的功能為例子   上傳功能命名用formidable實現,示例很簡單!   P

學習筆記--配置DHCP服務器(基於接口的地址池)

mar huawei adb def exclude day sha png images 一,開啟DHCP功能,並且把相應端口加入VLAN,並且設置vlan網關1.開啟dhcp功能.[Huawei]dhcp enable 2.創建vlan 10 20[Huawei]vl

Vue.js實戰 學習筆記 一(初識Vue.js

hid dom 介紹頁面 pan 分離 name 管理 end 筆記 官方文檔中介紹:漸進式技術棧(漸進式即可以階段性地使用Vue,或者可以在使用jQuery的同時,部分模塊上使用Vue,而不是像Angular一樣一用就是全部使用) 在設計上,使用MVVM(Model-V

Angular學習筆記9:服務(Service)(2)

可觀察的物件(observable)的資料 在現在的是情況下:HeroService.getHeroes() 的函式簽名是同步的,它所隱含的假設是 HeroService 總是能同步獲取英雄列表資料。 而 HeroesComponent 也同樣假

Angular6學習筆記8: 服務(Service)(1)

服務(Service) 繼學習筆記7,可以使用主從元件,現在繼續學習(服務)Service; 問題:為什麼需要服務? 因為:元件不應該直接獲取或儲存資料,它們不應該瞭解是否在展示假資料。 它們應該聚焦於展示資料,而把資料訪問的職責委託給某個服務。 這次將建立一個 H

Oracle學習筆記:11g服務介紹及哪些服務必須開啟?

  由於工作環境中oracle版本為10g,不支援行轉列函式pivot,特在自己電腦上安裝了oracle 11g,但因為不經常使用,便把服務自動啟動給關閉了,只在需要使用時手動啟動,因此記錄一下需要啟動的各個服務具體情況。   windows 7 64位 oracle 11g R2 共有7個服務,具體如下:

Spring Cloud學習筆記16——微服務的消費

微服務的消費模式 基於http的客戶端經常被用作微服務的消費者,因為http本身是平臺無關的、語言無關的,所以基於http的客戶端往往會被廣大的社群支援 服務直連模式 特點: 簡潔明瞭,只要傳入一個URL,就能直接連過去,獲取到資源 平臺語言無關性,非常直白,不

Linux學習筆記之DNS服務

DNS(Domain Name System,域名系統):全球資訊網上作為域名和IP地址相互對映的一個分散式資料庫,能夠使使用者更方便的訪問網際網路,而不用去記住能夠被機器直接讀取的IP數串。通過域名,最終得到該域名對應的IP地址的過程叫做域名解析(或主機名解析)。DNS協議執行在UDP協議之上,使用埠號53

web前端學習(四)JavaScript學習筆記部分(6)-- js內建物件

1、JS內建物件-什麼是物件 1.1、什麼是物件:   JavaScript中的所有事物都是物件:字串、數值、陣列、函式   每個物件帶有屬性和方法   JavaScript允許自定義物件 1.2、自定義物件:   1.定義並建立物件例項   2.使用函式來定義物件,然後建立新的物件例項 小紙

linux學習筆記之squid服務

本地 intern 進行 apache服務 only 主機 遠程服務器 顯式 主頁 一,Squid是什麽?[1] Squid是一種用來緩沖Internet數據的軟件。它是這樣實現其功能的,接受來自人們需要下載的目標(object)的請求並適當地處理這些請求。也就是說,如果