一、背景

目前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. 将网站发布到阿里云的Linux服务器上(简述)

    这里以idea的springboot项目为例(打成jar包) 这里去阿里云购买服务器的过程就不说了,自行百度 还有这篇只是简述,因为把一个项目部署到服务器要做的事情还是不少的,然后没学过Linux的建 ...

  2. (二)Amazon Lightsail 部署LAMP应用程序之部署单片LAMP应用程序

    部署单片LAMP应用程序 简介:通过复制应用程序代码并提供链接PHP前端和本地MySQL数据库的参数,将LAMP对战应用程序部署到先前启动的Lightsail实例中.完成后,Apache/PHP前端和 ...

  3. Java学习路线|转至CodeSheep

    Java学习路线 基础知识 . 基本语法 基本网络知识:tcp/ip http/https 工具方面 . 操作系统:linux (CentOS\Ubuntu\Fe..) 代码管理:svn/git 持续 ...

  4. pwn-pwn2

    环境说明 Ubuntu 16.04 pwntool IDA gdb-peda 先丢到Ubuntu看看文件的类型  64位 然后看看保护机制,发现没有保护机制 然后丢到IDA看看  F5查看伪代码 ma ...

  5. TeamyinyinFish-> 测试报告

    测试人员 1. 姓名:鱼嘤嘤 2. 年龄: 21 3. 职业: 大三学生 4. 感情状况: 单身 用户故事 软件工程课上,老师想要他们组实现一个小组项目,鱼嘤嘤原本想摸鱼,但是转念一想觉得 还是需要好 ...

  6. Codeforces Round #604 (Div. 2) 练习A,B题解

    A题 链接 思路分析: 因为只需要做到相邻的不相同,利用三个不同的字母是肯定可以实现的, 所以直接先将所有的问号进行替换,比如比前一个大1,如果与后面的冲突,则再加一 代码(写的很烂): #inclu ...

  7. oracle 循环插入数据

    参考链接:oracle 行转列 pivot函数基本用法 --建表 --drop table SalesList; create table SalesList( keHu varchar2(20), ...

  8. MySQL统计信息简介

    作者:王小龙@网易乐得DBA 原文地址: http://mp.weixin.qq.com/s/698g5lm9CWqbU0B_p0nLMw MySQL执行SQL会经过SQL解析和查询优化的过程,解析器 ...

  9. VMWare 怎样复制/copy部署好的一台虚拟机

    1:修改 vi /ect/udev/rules.d/70-persisten-net.rules 2:执行命令:uuidgen eth0 3:vi /etc/sysconfig/network-scr ...

  10. 深圳龙华有轨电车BIM项目

    本项目是“龙华有轨电车BIM+GIS运维管理平台“研发组成的内容之一,包含站台.电车.变电所等模型绘制. 龙华区有轨电车是深圳市的一条位于龙华区的有轨电车线路,项目规划了三条线路,总长51公里.试验线 ...