基于MQTT协议进行应用开发

来自:http://www.cnblogs.com/secondtononewe/p/6073089.html


官方协议有句如下的话来形容MQTT的设计思想:

“It is designed for connections with remote locations where a "small code footprint" is required or the network bandwidth is limited.”

MQTT:开源、可靠、轻巧、简单,MQTT的传输格式非常精小,最小的数据包只有2个比特,且无应用消息头。
MQTT可以保证消息的可 靠性,它包括三种不同的服务质量(最多只传一次、最少被传一次、一次且只传一次),如果客户端意外掉线,可以使用“遗愿”发布一条消息,同时支持持久订 阅。MQTT在物联网以及移动应用中的优势有:
  • 可靠传输。MQTT可以保证消息可靠安全的传输,并可以与企业应用简易集成。
  • 消息推送。支持消息实时通知、丰富的推送内容、灵活的Pub-Sub以及消息存储和过滤。
  • 低带宽、低耗能、低成本。占用移动应用程序带宽小,并且带宽利用率高,耗电量较少。  
    因此MQTT被广泛应用于物联网。

源码位置,可下载时间最新的CODE:http://mosquitto.org/files/source/

截止到2016年6月,最新的code为:
mosquitto-1.4.9.tar.gz 
虚拟机搭建MQTT环境,进行MQTT初体验
参考:http://blog.csdn.net/xukai871105/article/details/39252653
安装:
# 下载源代码包 
wget http://mosquitto.org/files/source/mosquitto-1.4.9.tar.gz
# 解压
tar zxfv mosquitto-1.4.9.tar.gz
# 进入目录
cd mosquitto-1.4.5
# 编译
make
# 安装
sudo make install
安装mosquitto时候出现这样的问题
1.mosquitto_internal.h:51:20: error: ares.h: No such file or directory
其实是因为它新加的功能的原因。打开config.mk文件。
吧WITH_SRV:=yes 改成WITH_SRV:=no 就可以编译了
或者sudo apt-get install libc-ares-dev
2,
找不到libmosquitto.so.1
error while loading shared libraries: libmosquitto.so.1: cannot open shared object file: No such file or directory
【解决方法】——修改libmosquitto.so位置
# 创建链接
sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
# 更新动态链接库
sudo ldconfig
简单测试
一个完整的MQTT示例包括一个代理器,一个发布者和一个订阅者。测试分为以下几个步骤:
【1】启动服务mosquitto。
【2】订阅者通过mosquitto_sub订阅指定主题的消息。
【3】发布者通过mosquitto_pub发布指定主题的消息。
【4】代理服务器把该主题的消息推送到订阅者。
【测试说明】
测试环境:ubuntu 14.04 虚拟机
在本例中,发布者、代理和订阅者均为localhsot,但是在实际的情况下三种并不是同一个设备,在mosquitto中可通过-h(--host)设置主机名称(hostname)为了实现这个简单的测试案例,需要在linux中打开三个控制台,分别代表代理服务器、发布者和订阅者。
启动代理服务  
mosquitto -v
【-v】打印更多的调试信息
订阅主题
mosquitto_sub -v -t SmartAudio_zhangling
【-t】指定主题,此处为SmartAudio_zhangling
【-v】打印更多的调试信息
root@ubuntu:/opt/mqtt/mosquitto-1.4.10/src# ./mosquitto -c ../mosquitto.conf
1474336624: mosquitto version 1.4.10 (build date 2016-09-19 18:55:57-0700) starting
1474336624: Config loaded from ../mosquitto.conf.
1474336624: Opening ipv4 listen socket on port 1883.
1474336624: Opening ipv6 listen socket on port 1883.
1474336624: Error: Invalid user 'mosquitto'.
root@ubuntu:/opt/mqtt/mosquitto-1.4.10/src#
解决方法:
1.修改配置文件:mosquitto.conf ,增加登录的用户
2.执行 adduser mosquitto
发布消息
mosquitto_pub -t SmartAudio_zhangling -m 12
【-t】指定主题
【-m】指定消息内容
【-f】 是可以发送文件
通过-f传递的文件上限默认是256M。逻辑中有对文件大小的判断,超过256M的文件则不传。不知道这里如果吧这个值修改更大,会不会产生影响,笔者没有尝试,因为传7M的文件都感觉很慢。(这个问题在MQTT协议介绍中可以得到答案,MQTT文件长度的表示是用1至4个字节来表示,而其表示长度的方式又有特殊的加密方式,按照这种方式,其最大表示的长度为256M) 
如果不是在同一个设备,可通过-h指定代理的IP。
另外还有一个mosquitto_passwd,用于管理密码,应该是关闭SSL的原因
运行结果
当发布者推送消息之后,订阅者获得以下内容
=======================mosquitto部分,嵌入音箱端及手机微信端,可实现广域网内手机微信对音箱的控制=================================
服务器部分
mosquitto服务器部分,肖同学负责搭建好。音箱端与手机端pub和sub都是通过服务器进行消息传递。IP地址为"120.76.30.18";
音箱部分
进入网络模式下,则需要开启一个线程,用来开启mosquitto subscribe 订阅一个主体。一个音箱实体对应一个主体。其他客户端可通过这个主题,来与音箱端实现链接。
本项目,定义的主题名字利用音箱的物理地址的唯一性,如SmartAudio_MacAddress。
手机微信部分
而,手机客户端如何得知音箱端这个主题,方法一,是微信客户端有提供对应开发包,局域网设备发现,但是这个功能依赖微信端,尚不稳定,最后并没采用;
方法二:将主题生成二维码,贴在音箱上。目前采用方法二。
而协议约定客户端名字,可以是b_MacAddress。
而手机微信部分是客户端IOS/Android同仁负责,这里不作介绍。
下面主要介绍音箱部分移植mosquitto进行应用开发的内容:
开启订阅主题线程
pthread_create(&mosquitto_client_thread_id, NULL, mosquitto_sub_start, NULL)
mosquitto_sub_start 是利用mosquitto sub的源码加以修改。
核心内容是,
两个回调函数的注册

mosquitto_connect_callback_set(mosq, my_connect_callback);    
mosquitto_message_callback_set(mosq, my_message_callback);

其中my_connect_callback是mosquitto_loop_forever这个一直存在的循环函数在收到服务器传递回来CONNACK信息(见_mosquitto_handle_connack),则会被触发,用来呼叫mosquitto_subscribe完成订阅。

其中my_message_callback则是用于音箱端应用程序的开发,用来接收手机微信端传递过来的内容。与手机客户端定义交互的协议,用于控制音箱的推歌、上下首切换、音源切换、网络模式的切换、音量大小的改变等等。

      交互的内容采用json包,因此需要进行json包的解析和封装。

 

正确完成音箱端的订阅,

注意设定好:

cfg.port = 1883;

cfg.topics[cfg.topic_count-1] = strdup(deviceName);

cfg.host = strdup(serverIp);  //服务器地址

 

这里初始化了一个属于音箱端全局的mosq,可用它关联pub和sub;(pub和sub共用一个全局mosq即可,并不需要分别申请一个mosq)

 

音箱端部分,需要pub消息给手机微信端。采用mosquitto_pub_start发送消息。这个不同于sub是一个一直存在的线程,pub属于一次性,消息传递完毕即结束。

mosquitto_pub_start 中 全局变量pub_topic ,在mosquitto_sub_start里面有初始化。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458561.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SortedDictionaryTKey,TValue正序与反序排序及Dicttionary相关

SortedDictionary<TKey,TValue>能对字典排序 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace SortDictionary {class Program{static void Main(string[] args){TestDictionarySort();…

DOS窗口的编码页从UTF-8调回GBK

2019独角兽企业重金招聘Python工程师标准>>> 之前在DOS窗口操作MySQL数据库的时候&#xff0c;将编码页从GBK设置成了UTF-8&#xff0c;解决了在DOS窗口显示MySQL数据库中的表中的中文字符出现乱码的问题。但是除此之外&#xff0c;DOS窗口显示的其他中文字符都是乱…

UIBezierPath

学习UIBezierPath画图 笔者在写本篇文章之前&#xff0c;也没有系统学习过贝塞尔曲线&#xff0c;只是曾经某一次的需求需要使用到&#xff0c;才临时百度看了一看而且使用最基本的功能。现在总算有时间停下来好好研究研究这个神奇而伟大的贝塞尔先生&#xff01; 笔者在学习时…

系统架构设计理论与原则

一、无共享架构 1、无共享架构 无共享架构是一种分布式计算架构&#xff0c;这种架构中不存在集中存储的状态&#xff0c;系统中每个节点都是独立自治的&#xff0c;整个系统中没有资源竞争&#xff0c;这种架构具有非常强的扩张性&#xff0c;目前在web应用中被广泛使用。 无共…

VS2010 教程:创建一个 WPF 应用程序 (第一节)

来自&#xff1a;https://msdn.microsoft.com/zh-cn/library/ff629048.aspx [原文发表地址] VS2010 Tutorial: Build a WPF App (Step 1) [原文发表时间] Friday, May 22, 2009 8:00 AM 这篇文章里&#xff0c;我将使用VS2010 Beta 1创建一个WPF 应用程序。并且 我将展示这个产…

js 日期星期 带农历

Weekday代码 //得到当前日期如2009年6月19日 星期五 function getDate(){ var today new Date(); var x new Array("星期日", "星期一", "星期二","星期三","星期四", "星期五","星期六"…

FMDB的使用

// // FMDBmanager.h // database // // Created by PRL on 16/10/13. // Copyright © 2016年PRL. All rights reserved. // #import <Foundation/Foundation.h> interface FMDBmanager : NSObject{ FMDatabase * _db; } (FMDBmanager *)sharedManager; //获取…

深入浅出WPF之Binding的使用(一)

from: http://www.cnblogs.com/akwwl/p/3421005.html 在WPF中Binding可以比作数据的桥梁&#xff0c;桥梁的两端分别是Binding的源&#xff08;Source&#xff09;和目标&#xff08;Target&#xff09;。 一般情况下&#xff0c;Binding源是逻辑层对象&#xff0c;Binding目…

arm处理器中a5 a8 a9,v6 v7,arm7 arm9 arm11都是依据什么来分类的【转】

转自&#xff1a;http://blog.csdn.net/maochengtao/article/details/9951131ARM处理器发展这么多年&#xff0c;有很多架构&#xff0c;很多不同的内核 架构有armv1 v2 v3 v4 v5 v6 v7 内核太多了&#xff0c;比如armv1对应的是arm1&#xff0c;armv5对应的arm9&#xff0c;ar…

前端开发一些很有用的工具

apiview.com 接口规范管理平台 restClient 谷歌浏览器接口测试工具 postman 接口测试工具 SSH Secure Shell Client 抓包工具 SSH SecureFile Transfer Client wireshark 抓包分析工具 Xshell linux远程工具 Balsamiq Mockups 原型图 visio 流程图 xmind top图 SourceCounter、…

所有的iPhone设备cell的宽度都是320,解决办法是?

-(id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { self [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { self.frameCGRectMake(0, 0, SW, 44); } return self; } 自己重设一下宽度就行了

深入浅出WPF之Binding的使用(二)

from: http://www.cnblogs.com/akwwl/p/3421250.html 在上一篇中介绍了Binding的基本绑定方法&#xff0c;这一篇中我们在深入的介绍Binding的其他用法。 Binding的源也就是数据的源头&#xff0c;在日常的工作中&#xff0c;除了使用像上一篇中的Student对象作为数据源外&a…

iOS 推送

最近在研究ios的推送问题&#xff0c;遇到了一些问题&#xff0c;最终整理了一下。放在这里和大家分享APNS的推送机制首先我们看一下苹果官方给出的对ios推送机制的解释。如下图 Provider就是我们自己程序的后台服务器&#xff0c;APNS是Apple Push Notification Service的缩写…

Bash判断文件夹(目录)是否存在

1 #!/bin/bash 2 if [ -d DirName ]; then 3 echo Dir exist 4 else 5 echo Dir not exist 6 fi 转载于:https://www.cnblogs.com/imzye/p/5059031.html

iOS 加载本地html文件详细操作

webView的加载&#xff0c;如果是纯文本&#xff0c;有内部样式的话&#xff0c;简单的加载请求就可以了。如下: 这种加载简单直接&#xff0c;易操作。 如果需要加载images&#xff0c;css文件 需要把xcode的项目请求路径的位置告诉webView.代码如下&#xff1a; 这样html文件…

HDU 5573 Binary Tree 构造

Binary Tree题目连接&#xff1a; http://acm.hdu.edu.cn/showproblem.php?pid5573 Description The Old Frog King lives on the root of an infinite tree. According to the law, each node should connect to exactly two nodes on the next level, forming a full binary…

志邦橱柜坑爹,志邦橱柜大忽悠,志邦橱柜欺骗

本人实实在在经历的&#xff0c;志邦橱柜就是个大忽悠,志邦橱柜没诚信!! 志邦橱柜先骗客户下订单,在预算时低开,到真正签合同时&#xff0c;不仅仅尺寸坑你,一大堆增项都会出来,原本1.5w预算到最后签合同总价到2.2w,签合同增项高开最后志邦橱柜总价超预算非常非常离谱&#xff…

多线程的那点儿事(之读写锁)

在编写多线程的时候&#xff0c;有一种情况是十分常见的。那就是&#xff0c;有些公共数据修改的机会比较少。相比较改写&#xff0c;它们读的机会反而高的多。通常而言&#xff0c;在读的过程中&#xff0c;往往伴随着查找的操作&#xff0c;中间耗时很长。给这种代码段加锁&a…

iOS获取设备IP

获取iOS设备IP wifi和流量环境下 在网上找的比较好的获取ip的代码 #include <ifaddrs.h> #include <arpa/inet.h> #include <net/if.h> #define IOS_CELLULAR "pdp_ip0" #define IOS_WIFI "en0" #define IOS_VPN …

一些不错的网站

http://www.huxiu.com/虎嗅网&#xff0c;一个关注最新创业信息的网站http://36kr.com/创业天花板https://www.zhihu.com/与世界分享你的经验http://www.mafengwo.cn/世界那么大&#xff0c;想去哪就去那http://www.mt-bbs.com/找到属于自己的设计本http://www.guokr.com/科技有…