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 mqtt

1.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:ffa3826972d6cc7ba5b17e104ec59fa3@mqtt.yeelink.net

/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协议中可指定username和password,在yeelink协议中,username变为U-ApiKey,password为U-ApiKey的详细值。
    【2】订阅主题为设备URI,须要把API版本改动为v1.1
    【3】主机名称为mqtt.yeelink.net,而不是api.yeelink.net
    在mqtt.js的演示样例代码中:client = mqtt.connect('mqtt://user:pass@localhost');
    在yeelink的演示样例代码中:client = mqtt.connect("mqtt://U-ApiKey:<your_key>@mqtt.yeelink.net");
    以上的两个演示样例代码更能够说明各參数的相应关系。

2 安装和使用paho-mqtt

    本例演示在树莓派上安装paho-mqtt。通过推送消息的内容控制GPIO

2.1 安装paho-mqtt

    pip install paho-mqtt

2.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:
# 配置username与password
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】请注意代码中的username,password设置,通过client.username_pw_set(username, password)设置username和password。可是username和password此时变为了U-ApiKey和U-ApiKey的详细值。
    【2】on_connect为连接成功回调函数。on_message为收到推送消息回调函数。
    【3】连接成功之后订阅主题,若接收到server推送的消息。通过消息中value控制GPIO。


3 总结

    【1】在yeelink应用中U-ApiKey变为了username和password
    【2】设备URI变为了主题
    【3】订阅了相关主题的消息之后,若通过其它方法(HTTP RESTful)改变开关设备状态。那么设备便会接收到来自yeelink平台的推送消息,我们能够觉得消息推送是实时的。

    【4】相对于设备控制,MQTT协议比HTTP协议要简洁些,实时性更好。

4 參考资料

版权声明:本文博主原创文章。博客,未经同意不得转载。

MQTT学习笔记——Yeelink MQTT维修 采用mqtt.js和paho-mqtt的更多相关文章

  1. Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例

    目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装项目其它需要包 清除冗余文件并重新规划项目目录 配置文件 规划示例路由,并新建相关文件 实现数据访问和业务逻辑相关方法 编写mys ...

  2. [转]Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例

    本文转自:https://www.cnblogs.com/zhongweiv/p/nodejs_koa2_webapp.html 目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装 ...

  3. Nodejs学习笔记(十五)—Node.js + Koa2 构建网站简单示例

    前言 前面一有写到一篇Node.js+Express构建网站简单示例:http://www.cnblogs.com/zhongweiv/p/nodejs_express_webapp.html 这篇还 ...

  4. Node.js学习笔记(1):Node.js快速开始

    Node.js学习笔记(1):Node.js快速开始 Node.js的安装 下载 官方网址:https://nodejs.org/en/ 说明: 在Windows上安装时务必选择全部组件,包括勾选Ad ...

  5. javascripts学习笔记(五):用js来实现缩略语列表、文献来源链接和快捷键列表。

    1 缩略语列表问题出发点:一段包含大量缩略语的文本,例如: <p> The <abbr title="World Wide Web Consortium"> ...

  6. Dynamic CRM 2013学习笔记(十六)用JS控制Tab可见,可用

    一个Form里经常会有好几个Tab,有时要根据一些条件设置哪些Tab可用,可见.下面就介绍下如何用JS对Tab进行控制. 1. 控制可见   function setTabVisableByName( ...

  7. Dynamic CRM 2013学习笔记(二十三)CRM JS智能提示(CRM 相关的方法、属性以及页面字段),及发布前调试

    我们知道在CRM的js文件里引用XrmPageTemplate.js后,就可以实现智能提示,但每个js文件都引用太麻烦了,其实可以利用vs的功能让每个js文件自动实现智能提示CRM的js: 另外,我们 ...

  8. Dynamic CRM 2013学习笔记(二十五)JS调用web service 实现多条记录复制(克隆)功能

    前面介绍过如何克隆一条当前的记录: Dynamic CRM 2013学习笔记(十四)复制/克隆记录 , 主要是通过界面上加一个字段,单击form上的clone 按钮时,改变这个字段的值以触发插件来实现 ...

  9. Vue.js 学习笔记 第1章 初识Vue.js

    本篇目录: 1.1 Vue.js 是什么 1.2 如何使用Vue.js 本章主要介绍与Vue.js有关的一些概念与技术,并帮助你了解它们背后相关的工作原理. 通过对本章的学习,即使从未接触过Vue.j ...

随机推荐

  1. C#整理

    输入输出--数据类型--变量与常量--运算符表达式--语句(顺序.分支.循环)--数组--函数--结构体一.输入与输出.Console.ReadLine();Console.WriteLine();C ...

  2. android JNI处理图片的例子

    android JNI处理图片的例子 原地址:http://blog.csdn.net/xjwangliang/article/details/7065670 <pre class=" ...

  3. 用Python对体积较大的CSV文件进行比较的经验

    用Python对体积较大的CSV文件进行比较的经验 » 进化的测试 | 进化的测试 用Python对体积较大的CSV文件进行比较的经验  python  Add comments 八 032010   ...

  4. remove()和直接使用system的一个差别

    1.事出有因 今天在做一个从web页面中得到POST回应数据的时候.须要把暂时目录里面(包括子文件)内容清空.本来一直使用的是system("rmdir /s /q ..//tmp//dat ...

  5. Ubuntu下实现双屏独立切换

    在编码时,总觉得屏幕大小不够,要是能多个屏多好,可以这样 把你的显示器连接到你的电脑,然后开启一个终端 输入:xrandr 显示如下: LVDS1 connected 1366x768+1024+0 ...

  6. Office 2016九大新功能

    Office 2016将于2015年秋季正式公布,下面是九大新功能. 预測 基于数据透视表的时间分组建模 联机分析(OLAP)下的PowerView 数据透视表(PivotTable)建模的自己主动关 ...

  7. iOS 单元測试之XCTest具体解释(一)

    原创blog,转载请注明出处 blog.csdn.net/hello_hwc 欢迎关注我的iOS-SDK具体解释专栏 http://blog.csdn.net/column/details/huang ...

  8. POJ 2365 Rope(水题)

    [题意简述]:给出我们钉子个数与半径,让我们求出缠绕在钉子上的绳子有多长. [分析]:从题目中我们能够看出,绳子长度的和等于每两个钉子的距离的和加上接触在钉子上的绳子的长度,不难发现这部分长度事实上就 ...

  9. poj3254(状压dp)

    题目连接:http://poj.org/problem?id=3254 题意:一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧,可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相 ...

  10. birdnest是什么意思_birdnest在线翻译_英语_读音_用法_例句_海词词典

    birdnest是什么意思_birdnest在线翻译_英语_读音_用法_例句_海词词典 birdnest