MQTT协议学习及实践(Linux服务端,Android客户端的例子)

前言

MQTT(Message Queuing Telemetry Transport),是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。MQTT是专门针对物联网开发的轻量级传输协议。MQTT协议针对低带宽网络,低计算能力的设备,做了特殊的优化,使得其能适应各种物联网应用场景。本文旨在研究其在消息发布/订阅/接收场景下的应用.

MQTT协议中的几个重要概念

  • 服务端

    是发送消息的客户端和请求订阅的客户端之间的中介,又称为broker.它接收来自客户端的网络连接;接收客户端发布的消息;处理客户端的订阅和取消订阅请求;转发相应消息给符合条件的已订阅客户端.

  • 客户端

    订阅相关的消息;发布消息给其它相关的客户端

  • 订阅

    订阅包含一个主题过滤器和一个最大的服务质量(QoS)等级.客户端只有订阅了相关主题时,才能接收到对应主题的消息

mosquitto编译安装及使用

mosquitto是一款实现了MQTT协议v3.1版的开源消息代理软件,下载地址https://mosquitto.org/download/,使用的是目前最新的版本1.4.10

tar xvf mosquitto-1.4.10.tar.gz
cd mosquitto-1.4.10
vi config.mk(将WITH_SRV:=yes中的yes改为no,否则会报ares.h文件找不到的错误)
make
sudo make install

如果不做全局安装的话,需要将lib/libmosquitto.so.1动态库拷贝到/usr/lib/下,然后执行,否则会报动态库无法使用的错误.

安装完毕后,我们来模拟下整个信息推送的过程.

我们用3个Terminal分别表示broker,订阅者和发布者.

Terminal A启动mosquitto broker服务,它可以监听到所有的交互过程

mosquitto

Terminal B开启订阅服务,之后所有关于该订阅主题的消息,它都能接收到

mosquitto_sub -v -t shopping

参数-v显示详细信息,-t表示主题

Terminal C发布消息

mosquitto_pub -t shopping -m "What a nice day! Go shopping with me?"

参数-t表示主题,-m表示具体消息的内容

mtqq_mosquitto

MQTT Androd客户端

利用MQTT3的java实现代码,做了简单的android客户端

mtqq_mosquitto

主界面上放了4个按钮,分别对应连接,订阅,发布和断开连接4个操作.在操作之前,必须先启动MQTT服务,我这服务器的ip地址是10.10.10.48,然后在android端按下CONNECT按钮,可以看到logcat的连接成功的打印信息,接着再按下SUBSCRIBE的按钮完成主题为shopping的订阅(作为demo,我这里写死了).为了接收到android端发布的信息,我在服务器端打开了一个终端,同样订阅了shopping为主题的消息.一切准备工作就绪后,按下android端的PUBLISH,完成之后,就可以在订阅的终端看到shopping What a nice day! Go shopping with me?的主题消息.

mtqq_mosquitto

mtqq_mosquitto

android端除了可以发送消息,当然也可以接收.打开另一个终端,发布一条主题为shopping的消息

mosquitto_pub -t shopping -m "Sorry,I have no time."

可以看到android中的logcat,显示已经接收到了相应的消息.

mtqq_mosquitto

mtqq_mosquitto

Android工程下载

https://github.com/djstava/MqttClientAndroid

参考文献

1 https://mosquitto.org/documentation/

2 http://tokudu.com/post/50024574938/how-to-implement-push-notifications-for-android

3 http://blog.csdn.net/xukai871105/article/details/39252653

4 http://mqtt.org/

5 https://github.com/LichFaker/MqttClientAndroid

作者:djstava
链接:http://www.jianshu.com/p/a7de93895416
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

http://www.jianshu.com/p/a7de93895416

时间: 2024-08-21 07:20:01

MQTT协议学习及实践(Linux服务端,Android客户端的例子)的相关文章

SVN1.6服务端和客户端安装配置指导

本节向大家描述SVN1.6服务端和客户端安装配置步骤,随着SVN的快速发展,版本也进行了升级更新,本节就和大家一起学习一下SVN1.6服务端和客户端安装配置步骤,欢迎大家一起来学习.下面是具体介绍.1.软件下载下载SVN1.6服务器程序.http://subversion.tigris.org/servlets/ProjectDocumentList?folderID=91[注意]如果之前已经安装了TortoiseSVN客户端,必须选择与之配套的SVN服务端版本,否则会出现各种问题,可以从Tor

关于ntp(时间同步协议)服务端和客户端的配置说明

本文主要写了一些在Linux(CentOS)服务器上配置ntp的经验,事件缘由来源于配置Zabbix监控ntp服务时的测试配置. NTP时间同步协议的服务端(ntpd服务)和客户端(ntpdate服)不能同时运行,即在运行ntpd服务后不能运行ntpdate服务,否则ntpdate服务会提示启动失败,而且日志中也会提示"the NTP socket is in use, exiting",如下图所示. 但客户端运行时,服务端可以运行,但服务端运行时,客户端不能运行,要运行客户端服务,就

MQTT 协议学习:006-订阅主题

背景 之前我们提到了怎么发布消息对应的报文:现在我们来看,订阅一个主题的报文是怎么样的. SUBSCRIBE - 订阅主题 客户端向服务端发送SUBSCRIBE报文用于创建一个或多个订阅.每个订阅注册客户端关心的一个或多个主题.为了将应用消息转发给与那些订阅匹配的主题,服务端发送PUBLISH报文给客户端.SUBSCRIBE报文也(为每个订阅)指定了最大的QoS等级,服务端根据这个发送应用消息给客户端. SUBSCRIBE 的 固定报头 Bit 7 6 5 4 3 2 1 0 byte 1 MQ

linux服务端的网络编程

常见的Linux服务端的开发模型有多进程.多线程和IO复用,即select.poll和epoll三种方式,其中现在广泛使用的IO模型主要epoll,关于该模型的性能相较于select和poll要好不少,本文也主要讨论该模型而忽略另外两种IO复用模型. 多线程相较于多进程开销比较小,但是要主要主线程往子线程传递数据的时候要注意变量互斥访问来保证线程安全. epoll模型在Linux2.6内核中引入的,改进了select中的一些明显设计上的缺点,具有更高的效率.主要体现在以下几个方面: 1. epo

linux(centos 6.4)下安装php memcache服务端及其客户端(详细教程)

前言 在搭建个人博客时,由于没有使用任何框架,纯手工code前台和后台,导致遇到许多问题,其中一个问题就是mysql连接导致的页面相应速度异常低.在查询各种途径后,只能考虑使用memcache缓存.在参考了许多文章后,终于成功的在centos6.4下安装memcache.由于发现在安装过程中,许多文章在有些细节没有解释清楚,导致我一直卡在一个问题上面.为了帮助其他可能和我遇到了同样问题的娃们,我准备也把我的安装过程详细介绍下,而不是ctrl+c,ctrl+v.希望对大家有帮助.(部分参考www.

tcp 服务端和客户端程序设计

一.实验目的 学习和掌握Linux下的TCP服务器基本原理和基本编程方法,体会TCP与UDP编程的不同,UDP编程:http://blog.csdn.net/yueguanghaidao/article/details/7055985 二.实验平台 linux操作系统 三.实验内容 编写Linux下TCP服务器套接字程序,程序运行时服务器等待客户的连接,一旦连接成功,则显示客户的IP地址.端口号,并向客户端发送字符串. 四.实验原理 使用TCP套接字编程可以实现基于TCP/IP协议的面向连接的通

Java网络编程【Socket服务端和客户端】

Socket 编程大家都不陌生,Java 学习中必学的部分,也是 Java网络编程核心内容之一.Java 网络编程又包括 TCP.UDP,URL 等模块.TCP 对应 Socket模块,UDP 对应 DatagramPacket 模块.URL 对应 URL 模块.其中 TCP 和 UDP 是网络传输协议,TCP 是数据流传输协议,UDP 是数据包传输协议.两者之间的异同就不在这里说了,推荐一本入门书籍 <TCPIP入门经典>.我们开始 Socket 服务端和客户端编程吧. 一.Socket 服

socket服务端和客户端

#!/usr/bin/env python#encoding: utf-8import socketdef handle_request(client): buf = client.recv(1024) client.send("HTTP/1.1 200 OK\r\n\r\n") client.send("Hello, World") def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREA

用Java实现HTTP Multipart的服务端和客户端

今天简单介绍一下如何用Java支持HTTP Multipart的request和response. 整个项目的代码可以在https://github.com/mcai4gl2/multi下载. 在这个程序里,我们的业务场景很简单.在服务端有一个随机数生成器,可以生成随机的Integer和Guid,客户端通过服务,可以请求一个或多个随机数.同时,客户端可以向服务端发送一个或多个随机数,这些随机数会被加入到一个队列中,被其他的客户端通过请求获得.以下是我们的随机数Bean的定义: [java] vi