0 前言

2014年8月yeelink推出基于MQTT协议的开关类型设备控制API,相比于基于HTTP RESTful的轮训方式,通过订阅相关主题消息,可以远程控制类应用实时性更好。本文使用两种方式实现开关类型设备的远程控制,一种是基于nodeJS的 MQTT.js扩展库,另一种是基于python的 paho-mqtt扩展库。
【相关博文——MQTT】
【 MQTT学习笔记——MQTT协议体验 Mosquitto安装和使用】
【 MQTT学习笔记——树莓派MQTT客户端 使用Mosquitto和paho-python】
【相关博文——HTTP RESTful】
【 Yeelink Http请求格式分析】
【 Yeelink平台查询开关量——套接字编程 Windows平台 】
【 Yeelink平台推送传感器结果——套接字编程 Windows平台】
【 Yeelink平台使用——远程控制 RT Thread + LwIP+ STM32】

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协议中可指定用户名和密码,在yeelink协议中,用户名变为U-ApiKey,密码为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 jsonhostname = '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 = 18def 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 和 valuegpio = 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_connectclient.on_message = on_messagegpio_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 参考资料

【1】 Yeelink MQTT API

MQTT学习笔记——Yeelink MQTT服务 使用mqtt.js和paho-mqtt相关推荐

  1. ASP.Net学习笔记002--ASP.Net服务端控件做了什么2

    ASP.Net学习笔记002--ASP.Net服务端控件做了什么2 以前写的课程都没有附上源码,很抱歉! 课程中的源码可以加qq索要:1606841559 技术交流qq1群:251572072 技术交 ...

  2. Netty学习笔记(二) 实现服务端和客户端

    在Netty学习笔记(一) 实现DISCARD服务中,我们使用Netty和Python实现了简单的丢弃DISCARD服务,这篇,我们使用Netty实现服务端和客户端交互的需求. 前置工作 开发环境 J ...

  3. Netty学习笔记(二)Netty服务端流程启动分析

    先贴下在NIO和Netty里启动服务端的代码 public class NioServer { /*** 指定端口号启动服务* */public boolean startServer(int por ...

  4. SAP FSM 学习笔记(四) : 现场服务技师使用的移动应用

    这个系列的前三篇文章: SAP FSM 学习笔记(一) : 使用API消费FSM的数据 SAP FSM 学习笔记(二) : SAP FSM的微信接入 SAP FSM 学习笔记(三) : 在微信里创建S ...

  5. 【转】Dicom 学习笔记-Dicom 消息服务(DIMSE-C/DIMSE-N)

    转自:https://www.jianshu.com/p/2812b0b6e548 引言   DICOM(Digital Imaging and Communications in Medicine) ...

  6. 树莓派学习笔记——yeelink 远程控制LED

    1.前言 前段时间玩了树莓派的GPIO,串口和I2C接口,把树莓派当成单片机来玩,期间深入分析了wiringPi.相对于单片机,以Linux为操作系统的树莓派在网络功能方面要强大的多,下面就结合当下流 ...

  7. Spring Cloud 学习笔记一 微服务架构

    文章目录 前言 一.微服务 二.微服务的特点 1.小型化 2.自治化 3. 扁平化 4. 轻量级设计 5. 渐进式设计 微服务架构和整体式架构的区别 微服务架构和SOA的比较 区别一:微服务通信的轻量 ...

  8. zset获取指定score_redis zset更新score redis学习笔记5 - Redis - 服务器之家

    redis zset更新score redis学习笔记5 发布时间:2017-04-03 来源:服务器之家 一:概述 zset全称为sorted-sets类型,和set数据类型有极为相似,都是字符串的 ...

  9. MQTT学习笔记--阿里云物联网连接(一)连接

    在学习了海创电子的MQTT理论知识之后,做此笔记,供自己查看. 参考文章链接:https://blog.csdn.net/daniaoxp/article/details/103039296 1.阿里 ...

最新文章

  1. 小程序输入框导致界面上移,在输入的时候固定住页面的解决代码
  2. CSS background 之设置图片为背景技巧
  3. oracle sql命令行中上下左右使用
  4. 点击button 验证倒计时
  5. linux 编辑启动菜单,grub2的配置,linux启动菜单修改
  6. echart data放入数组_线性表(数组、链表、队列、栈)详细总结
  7. Mono 之 Jexus
  8. python对象属性是与数据有关的项目_python之对象产生,属性(定义的值)的查找原则,对象绑定关系...
  9. 【干货】js 数组操作合集(前端自我修养)
  10. FPV穿越机飞行入门练习
  11. 莫烦python之python基础学习备忘
  12. Nginx 跨域配置
  13. 企业wifi认证登录靠谱吗
  14. 9.4 多元复合函数求导
  15. CAD三维图怎么倒斜角?
  16. Windows Server执行定时任务
  17. python分析出nba球员的位置_虎扑热帖|Python数据分析|NBA的球星们喜欢在哪个位置出手...
  18. NU Virgos(圣女天团)
  19. 计算机教案三维目标,“三维目标”的三个问题 教学设计三维目标模板
  20. Java身份证处理工具

热门文章

  1. Bzoj3653 谈笑风生
  2. 使用CCleaner删除系统还原点
  3. 杭电OJ 第一周 Problem H:小虫子爬爬爬~
  4. 怎么画人体(动漫人体教程)
  5. Dubbo配置加载问题
  6. Thymeleaf th:each遍历,th:if、th:switch 条件判断,input,select,radio 回显赋值
  7. 2020胡润80后白手起家富豪榜公布,掌门教育张翼强势登榜
  8. 我们这么努力到底为了什么
  9. Windows下cmd命令无法切换盘符
  10. Echarts显示行政区域图并上色