一、背景

目前MQTT的标准组织官网:http://www.mqtt.org,里面列出了很多支持的软件相关资源。

一个轻量级的MQTT服务器是:http://www.mosquitto.org,可以运行ARM/MIPS的嵌入式linux系统上。

物联网常使用 “消息队列遥测传输(Message Queuing Telemetry Transport, MQTT)” 协议订阅数据,这里用Python实现从MQTT服务器订阅数据。

首先和TCP协议比较

首先TCP是传输层协议,实现了一个双向的通信链路。

MQTT是基于TCP的应用层协议。(当然中间可能多一层,websocket)

两者不在一个层级,比较谁比谁好是没有意义的。

我们用raw TCP 也可以实现数据通信,比如发送传感器数据到服务器。为什么要用到MQTT呢 ?

假设现在有一个物联网的应用,题主当然可以直接用TCP socket 做通信,实际上不少人也是这么做的。然后你就会发现:

  • 需要自己写确认重传的机制,因为TCP 连接说不定就断了。

  • 如果有很多个传感器(生产者),又要写代码管理这么多TCP连接呢。

  • 如果同时又有多个地方需要用到这些数据,还得写一个转发的逻辑。

  • 如果系统很复杂,参与人或公司很多,那通信格式要怎么定,怎么改,沟通成本就很大了。

这些东西这么麻烦,又不想加班写代码,那有没有办法简便地解决呢?当然有,就是用现成的协议啦,比如MQTT。

MQTT 提供两个核心功能:

  • 三个级别的QOS

  • 基于订阅/发布的消息转发服务。

用了MQTT, 上面提到的这些问题就都被优雅地解决掉啦。

其实,同类应用的很多问题,都是有一定共性的。这时候就会有一些人提出一般性的解决方式,这样大家就不用重复造轮子,同时又保证了互操作性。这就是协议存在的意义啦。

所以一句话总结,MQTT 和其他的应用层协议,比如 HTPP, FTP, BitTorrent 协议一样,都是为了解决特定问题而生的一套方案,可以帮我们省好多事。

二、安装部署

环境:Python 2.7.5

mosquitto version 1.5.8

mosquitto is an MQTT v3.1.1 broker.

安装安装mosquitto,这里比较省事了

yum -y install mosquitto mosquitto-clients python-mosquitto

安装paho-mqtt,pypi上有这个库,可以自行安装

三、测试

启动命令: mosquitto
server:mosquitto_pub -t test -h 127.0.0.1 -m '{"pin":1,"value":0}'
client:mosquitto_sub -v -t test -h 127.0.0.1 (先启动)

 测试结果

[root@test ~]# mosquitto_sub -v -t test -h 127.0.0.1
test {"pin":1,"value":0} 

使用脚本测试

client.py

#!/usr/bin/python

import sys
import datetime
import socket, sys #======================================================
try:
import paho.mqtt.client as mqtt
except ImportError:
print("MQTT client not find. Please install as follow:")
print("git clone http://git.eclipse.org/gitroot/paho/org.eclipse.paho.mqtt.python.git")
print("cd org.eclipse.paho.mqtt.python")
print("sudo python setup.py install") # 服务器地址
strBroker = "localhost"
# 通信端口
port = 1883
# 用户名
username = 'username'
# 密码
password = 'password'
# 订阅主题名
topic = 'topic' #======================================================
def on_connect(mqttc, obj, rc):
print("OnConnetc, rc: "+str(rc)) def on_publish(mqttc, obj, mid):
print("OnPublish, mid: "+str(mid)) def on_subscribe(mqttc, obj, mid, granted_qos):
print("Subscribed: "+str(mid)+" "+str(granted_qos)) def on_log(mqttc, obj, level, string):
print("Log:"+string) def on_message(mqttc, obj, msg):
curtime = datetime.datetime.now()
strcurtime = curtime.strftime("%Y-%m-%d %H:%M:%S")
print(strcurtime + ": " + msg.topic+" "+str(msg.qos)+" "+str(msg.payload))
on_exec(str(msg.payload)) def on_exec(strcmd):
print "Exec:",strcmd #=====================================================
if __name__ == '__main__':
mqttc = mqtt.Client("test")
mqttc.on_message = on_message
mqttc.on_connect = on_connect
mqttc.on_publish = on_publish
mqttc.on_subscribe = on_subscribe
mqttc.on_log = on_log # 设置账号密码(如果需要的话)
#mqttc.username_pw_set(username, password=password) mqttc.connect(strBroker, port, 60)
mqttc.subscribe(topic, 0)
mqttc.loop_forever()

server.py

#!/usr/bin/python

import sys
import datetime
import socket, sys
import paho.mqtt.publish as publish def transmitMQTT(strMsg):
strMqttBroker = "localhost"
strMqttChannel = "test"
print(strMsg)
publish.single(strMqttChannel, strMsg, hostname = strMqttBroker) if __name__ == '__main__':
transmitMQTT("Hello,MQTT")
print "Send msg ok."

四、开发中需要注意的一些问题

  • MQTT连接心跳时间

  • MQTT单个发布消息最大长度

  • 离线消息最长缓存时间

  • 单MQTT连接的最大订阅数

Python实现MQTT接收订阅数据的更多相关文章

  1. 【python】-- Socket接收大数据

    Socket接收大数据 上一篇博客中的简单ssh实例,就是说当服务器发送至客户端的数据,大于客户端设置的数据,则就会把数据服务端发过来的数据剩余数据存在IO缓冲区中,这样就会造成我们想要获取数据的完整 ...

  2. Python socket ssh接收大数据

    通过socket连续接收返回数据 Server服务端 import socket,os server = socket.socket() server.bind(('localhost',9999)) ...

  3. python链接mqtt订阅与发布

    什么是mqtt: MQTT 全称为 Message Queuing Telemetry Transport(消息队列遥测传输)是一种基于发布/订阅范式的"轻量级"消息协议.该协议构 ...

  4. angular项目实现mqtt的订阅与发布 ngx-mqtt

    angular项目实现mqtt的订阅与发布 如果要写一个exe可执行文件,可以使用angular编写,然后使用electron打包成一个exe文件. https://github.com/maxime ...

  5. python3 Serial 串口助手的接收读取数据

    其实网上已经有许多python语言书写的串口,但大部分都是python2写的,没有找到一个合适的python编写的串口助手,只能自己来写一个串口助手,由于我只需要串口能够接收读取数据就可以了,故而这个 ...

  6. Python3 Tcp未发送/接收完数据即被RST处理办法

    一.背景说明 昨天一个同事让帮忙写个服务,用于接收并返回他那边提交过来的数据,以便其查看提交的数据及格式是否正确. 开始想用django写个接口,但写接口接口名称就得是定死的,他那边只能向这接口提交数 ...

  7. 网络编程基础【day09】:socket接收大数据(五)

    本节内容 1.概述 2.socket接收大数据 3.中文字符的坑 一.概述 上篇博客写到了,就是说当服务器发送至客户端的数据,大于客户端设置的数据,则就会把数据服务端发过来的数据剩余数据存在IO缓冲区 ...

  8. Python Socket请求网站获取数据

     Python Socket请求网站获取数据 ---阻塞 I/O     ->收快递,快递如果不到,就干不了其他的活 ---非阻塞I/0 ->收快递,不断的去问,有没有送到,有没有送到,. ...

  9. Python基本语法_强制数据类型转换

    目录 目录 前言 软件环境 Python数据类型的显式转换 显式转换的多种类型 Non-String转换为String str函数 repr str和repr的区别 eval Non-int转换为in ...

随机推荐

  1. layui增删改查

    dao方法 package com.dao; import java.sql.SQLException; import java.util.List; import java.util.Map; im ...

  2. G1 垃圾收集器架构和如何做到可预测的停顿(阿里)

    CMS垃圾回收机制 参考:图解 CMS 垃圾回收机制原理,-阿里面试题 CMS与G1的区别 参考:CMS收集器和G1收集器优缺点 写这篇文章是基于阿里面试官的一个问题:众所周期,G1跟其他的垃圾回收算 ...

  3. 炫酷的CSS3响应式表单

    原创YouTube@ Online Tutorials css代码: * { margin: 0; padding: 0; box-sizing: border-box; font-family: ' ...

  4. destoon模块绑定二级域名出现 File not found解决办法

    昨天晚上帮一个朋友给我说他绑定模块二级域名出现 File not found,所以今天分享关于解决办法. 模块启用二级域名后,首页打开正常,但是点内容页和列表页出现File not found. 解决 ...

  5. 在Python中用许多点找到两个最远点的点

    我需要找到距离彼此最远的两个点. 正如屏幕截图所示,我有一个包含其他两个数组的数组.一个用于X,一个用于Y坐标.确定数据中最长线的最佳方法是什么?通过这样说,我需要选择情节中最远的两个点.希望你们能帮 ...

  6. Django views 中的装饰器

    关于装饰器 示例: 有返回值的装饰器:判断用户是否登录,如果登录继续执行函数,否则跳回登录界面 def auth(func): def inner(request, *args, **kwargs): ...

  7. 调试九法: 软硬件错误的排查之道 (David J. Agans 著)

    第1章 简介 (已看) 第2章 总体规则 (已看) 第3章 理解系统 (已看) 第4章 制造失败 第5章 不要想, 而要看 第6章 分而治之 第7章 一次只改一个地方 第8章 保持审计跟踪 第9章 检 ...

  8. MySQL实战45讲学习笔记:第四十讲

    一.本节概述 在上一篇文章中,我提到 MySQL 对自增主键锁做了优化,尽量在申请到自增 id 以后,就释放自增锁. 因此,insert 语句是一个很轻量的操作.不过,这个结论对于“普通的 inser ...

  9. 剑指offer:二叉树打印成多行(层次遍历)

    1. 题目描述 从上到下按层打印二叉树,同一层结点从左至右输出.每一层输出一行. 2. 思路 层次遍历 3. 递归 public class Solution { ArrayList<Array ...

  10. Azure DevOps Server(TFS) 客户端分析

    Azure DevOps Server(TFS) 是微软公司的软件协作开发管理平台产品,为软件研发.测试.实施提供全流程的服务.作为一款应用服务器产品,他的客户端是什么,在哪里下载客户端?我们在项目实 ...