基于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.pswp.cn/news/458561.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458561.shtml
英文地址,請注明出處:http://en.pswp.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/科技有…