日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > Linkit 7688 DUO(六) 加入MQTT物聯網協議

Linkit 7688 DUO(六) 加入MQTT物聯網協議

來源:程序員人生   發布時間:2016-06-08 08:37:31 閱讀次數:6315次

Linkit 系列博文:

聯發科Linkit 7688 (1) 上手及在Mac下搭建OpenWrt交叉編譯環境,C語言編譯Hello,World

聯發科Linkit 7688 (2)GPIO基本操作與C語言編程

聯發科Linkit 7688 DUO(3): 通過 Arduino 控制外設和傳感器

Linkit 7688 DUO(4): 接上各種Arduino傳感器和模塊——基礎篇

Linkit 7688 DUO(5) 接上各種Arduino傳感器和模塊—擴大篇

Linkit 7688 DUO(6) 加入MQTT物聯網協議


本篇介紹 將 MQTT物聯網協議加載到 Linkit 7688 DUO開發板上 ( 其中的源碼和方法也適用于所有的Linux系統、也合適于Windows系統)

MQTT是IBM開發的1種物聯網即時通訊協議,該協議支持所有平臺,幾近可以把所有聯網物品、電腦APP、手機APP、網頁等連接起來,讓它們隨時相互交換信息。

有了MQTT協議,Linkit 7688開發板就能夠稱得上物聯網開發板了,可以實現很多場景,比如:手機遠程控制、網頁遠程控制、服務器監測物體狀態等等。


1、MQTT協議簡介

1,MQTT是1種基于TCP的網絡消息協議,用于發送和接收消息。 

在1個MQTT網絡中,有1個服務器和多個客戶端。 每一個客戶端以TCP Socket與服務器連接,并保持為長連接。

客戶端可以是1個聯網物體、電腦軟件、手機APP、乃至是網頁。以下圖:



2,  消息傳輸采取發布/定閱(publish/subscribe)模式。

  客戶端可以發布(publish)消息, 每一個消息由1個主題(topic)和1個消息內容組成。比如:某溫度傳感器發布1個消息: topic = "sensor1/temperature", message="25“

  客戶端可以定閱(subscribe)1個或多個主題的消息。 當網絡中有人發布了這些主題的消息,則客戶端將收到這條消息。比如: 手機App定閱了 “sensor1/temperature"消息,則上述消息將被收到, 手機App就知道sensor1的溫度值了。

  由于客戶端與服務器保持著Socket長連接,消息將立即實時推送到客戶端,也就是說:PUSH到客戶端。

  MQTT服務器的主要作用是接收-轉發:接收消息、判斷哪些客戶端定閱了該主題的消息,PUSH給相應客戶端。

  這類機制,可以實現1對1發送消息,也能夠實現1對多發送消息(群發)。

利用場景舉例:

場景1:  手機APP發布查溫度的消息, 各個傳感器裝置收到消息后,發布溫度消息。則手機就能夠搜集到各個傳感器的溫度。

場景2:  當火警傳感器裝置檢測到起火后,發布消息。 則定閱了該類型消息的手機、電腦等都可立即收到火警。


3,MQTT的消息包傳輸數據量很?。ü潭ㄩL度的頭部僅為 2 字節),能充分下降網絡流量,非常合適于低帶寬、不可靠連接、嵌入式裝備。 

同時非常合適于手機等移動通訊環境,可以省流量、省電。因此,有人用MQTT作為手機PUSH使用。


4, 為保障消息有效力到達,MQTT定義了3種消息發布服務質量(Qos, Quality Of Service):

“最多1次”(At most once),開消最小,消息發布完全依賴底層 TCP/IP 網絡,會產生消息丟失或重復。這1級別可用于以下情況,環境傳感器數據,丟失1次讀記錄無所謂,由于不久后還會有第2次發送。
“最少1次”(At least once),確保消息到達,但消息重復可能會產生。
“只有1次”(Exactly once),確保消息到達1次。這1級別可用于以下情況,在計費系統中,消息重復或丟失會致使不正確的結果。經常使用于精確控制。

每條消息都可以有自己的Qos定義。每個客戶端定閱某主題時,也能夠指定Qos.


5, MQTT協議由IBM公司于1999年提出,經過量年發展已比較成熟,目前版本是3.1.1。服務器和客戶端均有多個開源實現,支持各類操作系統和開發語言。


2、合適嵌入式裝備的MQTT協議客戶端(C語言實現)

對Linkit 7688開發板,我選取 “Eclipse Paho C” 的MQTT 客戶端開源代碼庫 。其主頁在這:https://www.eclipse.org/paho/clients/c/

這個代碼庫是IBM公司提供的,Eclipse項目組保護的,可以稱為官方的。

我的使用方式是: 將它作為1個函數庫, 在Linkit 7688上編寫C語言程序,實現MQTT消息收發。

這個庫有1點點復雜,需要對協議比較了解。如果你要完全弄懂它,需要先讀它的文檔(http://www.eclipse.org/paho/files/mqttdoc/Cclient/index.html)

我們1般總是喜歡把復雜的事情簡單化,因此,我對這個庫進行了封裝,  變成幾個函數, 不需要懂太多就能夠用.

庫和例程在我的資源中下載:  MQTT客戶端Paho C代碼

解壓后,其中mqtt目錄是Paho C所有的庫文件( 原本的文件都沒改,我增加了 mqtt_client.c ,  mqtt_client.h 兩個文件),使用時將mqtt目錄復制到你的項目文件夾中便可。


在使用前,需要有1個測試用的MQTT服務器, 我用的是 IBM提供的測試服務器:  messagesight.demos.ibm.com, 端口是1883 (1883是MQTT的默許端口)

同時需要有1個測試用的MQTT客戶端作為對端,我用的是IBM提供的網頁版MQTT客戶端:http://m2m.demos.ibm.com/mqttclient/


1, 在Linkit 7688上編1個發送MQTT消息的程序:

  用Eclipse 建立1個交叉編譯項目 ( 開發環境搭建請見:聯發科Linkit 7688 (1) 上手及在Mac下搭建OpenWrt交叉編譯環境,C語言編譯Hello,World)

  將mqtt目錄復制到你的項目文件夾下。

  創建1個 mqtt_publish.c文件, 編寫主程序以下:

#include <stdio.h> #include <stdlib.h> #include <errno.h> #include "mqtt/mqtt_client.h"//這個是我對mqtt_client封裝后的頭文件 int publish(int argc, char ** argv) { mqtt_client *m; //mqtt_client 對象指針 int ret; //返回值 char *host = "messagesight.demos.ibm.com:1883";//測試服務器 char *topic = "test_topic"; //主題 char *client_id = "clientid33883";//客戶端ID; 對測試服務器,可以隨意寫 char *username = NULL;//用戶名,用于驗證身份。對測試服務器,無。 char *password = NULL;//密碼,用于驗證身份。對測試服務器,無。 int Qos; //Quality of Service //create new mqtt client object m = mqtt_new(host, MQTT_PORT, client_id); //創建對象,MQTT_PORT = 1883 if ( m == NULL ) { printf("mqtt client create failure, return code = %d\n", errno); return 1; } else { printf("mqtt client created\n"); } //connect to server ret = mqtt_connect(m, username, password); //連接服務器 if (ret != MQTT_SUCCESS ) { printf("mqtt client connect failure, return code = %d\n", ret); return 1; } else { printf("mqtt client connect\n"); } //publish message Qos = QOS_EXACTLY_ONCE; //Qos ret = mqtt_publish(m, topic, "hello from Linkit 7688", Qos);//發布消息 printf("mqtt client publish, return code = %d\n", ret); mqtt_disconnect(m); //disconnect mqtt_delete(m); //delete mqtt client object return 0; }


主程序分為3個步驟:

1, 調用 mqtt_new()創建 客戶端對象

2, 調用 mqtt_connect() 連接服務器

3, 調用 mqtt_publish() 發布消息


用Eclipse編譯項目

如果出現毛病提示:

undefined reference to `pthread_create’
undefined reference to `pthread_mutexattr_init’

這是由于沒有在編譯連接時包括pthread庫, 解決辦法: 需在GCC中添加 -lpthread 參數。

如果出現毛病提示:

undefined reference to `dlclose’
undefined reference to `dlopen’
undefined reference to `dlsym
這是由于沒有在編譯連接時包括dl庫, 解決辦法: 需在GCC中添加 -ldl 參數

在eclipse中的操作是:   項目Property =>  C/C++ Build => Settings, 在"Tools Setting"頁,選Cross GCC linker, 在 "Linker flags"編譯框中填入:  -lpthread -ldl

OK, 編譯成功了。


用scp將 mqtt_publish 程序上傳到 linkit 7688:   scp mqtt_publish root@mylinkit.local:/root


先準備接收消息的網頁客戶端: 用閱讀器打開 http://m2m.demos.ibm.com/mqttclient/

在Connect欄中, 點Connect.

在Subscribe欄中,將topic設為 test_topic, 按subscribe

OK, 網頁客戶端準備好接收主題(topic)為 test_topic的消息了。


用SSH登錄入Linkit 7688,  運行 mqtt_publish 程序。

運行結果, 顯示mqtt 創建、連接、發布消息的進程, return code >=0 表示成功

mqtt client created

mqtt client connect

mqtt client publish,  return code = 1


這時候,可以看到閱讀器中的MQTT網頁客戶端收到了Linkit 7688發布的MQTT消息


 

成功了: Linkit 7688發布MQTT消息到服務器, 網頁客戶端實時收到服務器推送來的消息。



2, 在Linkit 7688上編1個接收MQTT消息的程序:

  用Eclipse 建立1個交叉編譯項目 ( 開發環境搭建請見:聯發科Linkit 7688 (1) 上手及在Mac下搭建OpenWrt交叉編譯環境,C語言編譯Hello,World)

  將mqtt目錄復制到你的項目文件夾下。

  創建1個 mqtt_subscribe.c文件, 編寫主程序以下:

#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <signal.h> #include "mqtt/mqtt_client.h"//這個是我對mqtt_client封裝后的頭文件 int running = 1; void stop_running(int sig) { signal(SIGINT, NULL); running = 0; } int main(int argc, char ** argv) { mqtt_client *m; //mqtt_client 對象指針 int ret; //返回值 char *host = "messagesight.demos.ibm.com:1883";//測試服務器 char *topic = "test_topic"; //主題 char *client_id = "clientid33883";//客戶端ID; 對測試服務器,可以隨意寫 char *username = NULL;//用戶名,用于驗證身份。對測試服務器,無。 char *password = NULL;//密碼,用于驗證身份。對測試服務器,無。 int Qos; //Quality of Service //create new mqtt client object m = mqtt_new(host, MQTT_PORT, client_id); //創建對象,MQTT_PORT = 1883 if ( m == NULL ) { printf("mqtt client create failure, return code = %d\n", errno); return 1; } else { printf("mqtt client created\n"); } //connect to server ret = mqtt_connect(m, username, password); //連接服務器 if (ret != MQTT_SUCCESS ) { printf("mqtt client connect failure, return code = %d\n", ret); return 1; } else { printf("mqtt client connect\n"); } //subscribe Qos = QOS_EXACTLY_ONCE; ret = mqtt_subscribe(m, topic, Qos);//定閱消息 printf("mqtt client subscribe %s, return code = %d\n", topic, ret); signal(SIGINT, stop_running); signal(SIGTERM, stop_running); printf("wait for message of topic: %s ...\n", topic); //loop: waiting message, 循環 while (running) { int timeout = 200; if ( mqtt_receive(m, timeout) == MQTT_SUCCESS ) { //recieve message,接收消息 printf("received Topic=%s, Message=%s\n", m->received_topic, m->received_message); } mqtt_sleep(200); //sleep a while } mqtt_disconnect(m); //disconnect printf("mqtt client disconnect"); mqtt_delete(m); //delete mqtt client object return 0; }

主程序分為幾個步驟:

1, 調用 mqtt_new()創建 客戶端對象

2, 調用 mqtt_connect() 連接服務器

3, 調用 mqtt_subscribe() 定閱消息

4, 進入循環:不斷用 mqtt_receive()檢測有否新消息,如有,則打印出來。

用Eclipse編譯項目 (記得必須在GCC中加入連接選項:  -lpthread -ldl )

OK, 編譯成功了。

用scp將 mqtt_subscribe 程序上傳到 linkit 7688:   scp mqtt_subscribe root@mylinkit.local:/root


用SSH登錄入Linkit 7688,  運行 mqtt_subscribe 程序。則此時出現:

mqtt client created

mqtt client connect

mqtt client subscribe,  return code = 0

wait for message of topic: test_topic ...


顯示程序在等待消息到來


準備發送消息的網頁客戶端: 用閱讀器打開 http://m2m.demos.ibm.com/mqttclient/

在Connect欄中, 點Connect.

在Publish欄中,將topic設為 test_topic, 將Message設為 “Say hello to linkit 7688” 按publish, 則發出1條MQTT消息。


這時候, 看Linkit 7688 SSH客戶端,可以看到,Linkit7688立即收到了這條MQTT消息

mqtt client created

mqtt client connect

mqtt client subscribe,  return code = 0

wait for message of topic: test_topic ...

received Topic=test_topic, Message=Say hello to linkit 7688


成功了: Linkit 7688 實時收到了網頁客戶端發來的消息。

mqtt_subscribe 程序是死循環,1直在接收消息。 可按CTRL+C退出。



通用性: Eclipse Paho C 的 MQTT客戶端代碼,可以運行在Linux、Windows、Mac上。所以,上述的代碼可以用于Linux、Windows、Mac操作系統,編寫各種App。

對Android手機, Eclipse Paho另提供了Java的代碼庫。





生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 久久婷婷亚洲 | 三级毛片在线 | 日韩福利在线观看 | 欧美视频一区二区 | 亚洲a毛片 | 久久久一区二区 | 亚洲精品电影网在线观看 | 91在线tv| 色一区二区 | 一区二区中文字幕 | 欧美精品在线视频 | 不卡的一区二区 | 久久久www成人免费无遮挡大片 | 日韩精品二区 | 亚洲精品福利在线 | 国产一区二区三区在线观看免费 | 亚洲综合久久久 | 欧美91视频| 欧美日韩电影一区二区 | 久久精品 | 在线a视频网站 | 五月婷婷六月丁香 | 成人免费在线电影 | 久久久91精品国产一区二区三区 | 亚洲a毛片| 国产毛片在线 | 欧美日韩在线观看视频 | 欧美激情不卡 | 欧美亚洲免费 | 91久久精品国产91久久 | 国产午夜精品久久久久久免费视 | 精品欧美乱码久久久久久 | 欧美日韩免费 | 蜜月久综合久久综合国产 | 99re视频在线| 国产电影一区 | 久久国产区 | 一区二区三区在线免费播放 | 日本九九视频 | 亚洲一区二区精品视频 | 免费黄色一级 |