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.js1.3 執行 【執行程式碼】 node yeelink_mqtt.js 【修改狀態】 登入yeelink平臺通過網頁修改開關裝置狀態,也可通過其他方法修改裝置狀態。一旦裝置狀態發生修改,那麼控制檯便會輸出被推送的訊息,整個過程幾乎沒有延時。 【控制檯輸出】mqtt://U-ApiKey:[email protected]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); });
/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}
# -*- 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.js和paho-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)的請求並適當地處理這些請求。也就是說,如果