物聯(lián)網(wǎng)系統(tǒng)開發(fā):從0到1構(gòu)建IoT平臺 第2版 付強 傅靜濤
定 價:99 元
本書是一部從技術(shù)原理、工程實踐、設計模式和最佳實踐等多個維度詳細講解物聯(lián)網(wǎng)系統(tǒng)和產(chǎn)品開發(fā)的著作。它涵蓋物聯(lián)網(wǎng)應用開發(fā)80%的場景,能指導讀者零基礎的讀者從0到1構(gòu)建一個功能齊備的物聯(lián)網(wǎng)平臺,并附有代碼和解釋。本書既有作者在物聯(lián)網(wǎng)行業(yè)多年實操經(jīng)驗的總結(jié),也結(jié)合了作者在高校的多年教學實踐經(jīng)驗,是一本既適合高校學生、物聯(lián)網(wǎng)初學者,也適合有經(jīng)驗的物聯(lián)網(wǎng)開發(fā)者和架構(gòu)師閱讀的佳作。本書第1版是物聯(lián)網(wǎng)系統(tǒng)開發(fā)領(lǐng)域的暢銷書,幾乎零差評。第2版新增了全面解析MQTT 5.0協(xié)議特性的內(nèi)容,同時,為了適配EMQX最新版本,對書中的相關(guān)代碼和配置均進行了更新。全書共14章,分為三大部分:第一部分(第1~2章)物聯(lián)網(wǎng)基礎介紹物聯(lián)網(wǎng)基礎知識,涵蓋物聯(lián)網(wǎng)的概念和常用協(xié)議。第二部分(第3~6章)MQTT協(xié)議詳解與實戰(zhàn)詳細講解MQTT協(xié)議,通過詳盡的示例代碼對物聯(lián)網(wǎng)的核心協(xié)議MQTT協(xié)議的規(guī)范和特性進行講解。內(nèi)容包括MQTT 3.1.1和MQTT 5.0。第三部分(第7~14章)實戰(zhàn):從零開始搭建一個IoT平臺物聯(lián)網(wǎng)平臺開發(fā)實戰(zhàn),講解如何使用開源組件從0到1構(gòu)建一個功能完備的物聯(lián)網(wǎng)平臺。
(1)作者背景權(quán)威:作者曾就職于趨勢科技、諾基亞,現(xiàn)擔任某物聯(lián)網(wǎng)企業(yè)的CTO,在物聯(lián)網(wǎng)領(lǐng)域有較大的影響力。(2)作者經(jīng)驗豐富:作者在物聯(lián)網(wǎng)領(lǐng)域從業(yè)近15年,一直致力于物聯(lián)網(wǎng)軟硬件產(chǎn)品和平臺的設計和開發(fā),經(jīng)驗豐富。(3)暢銷書全新升級:第1版是物聯(lián)網(wǎng)領(lǐng)域的暢銷書,累計印刷10余次,網(wǎng)店零差評,是讀者公認的經(jīng)典著作。(4)零基礎可上手:可指導沒有任務物聯(lián)網(wǎng)技術(shù)基礎的讀者理解物聯(lián)網(wǎng)的核心協(xié)議,并從0到1開發(fā)功能齊備的物聯(lián)網(wǎng)平臺。(5)注重實戰(zhàn):本書以實戰(zhàn)為導向,手把手逐步教讀者開發(fā)物聯(lián)網(wǎng)平臺,附案例代碼,并給出了解釋。
Preface 前 言為什么要寫這本書2011年我在硅谷的時候,曾經(jīng)參與設計和開發(fā)了一個物聯(lián)網(wǎng)平臺。這個平臺的目的是為各種物聯(lián)網(wǎng)設備提供統(tǒng)一的通信接口,以及提供數(shù)據(jù)存儲和分析功能,降低物聯(lián)網(wǎng)設備商的開發(fā)和運營成本。不過,由于物聯(lián)網(wǎng)設備的異構(gòu)性太強,同時平臺的愿景過于超前,而當時物聯(lián)網(wǎng)應用的發(fā)展包括資本的投入都遠不及現(xiàn)在,這個項目不得不半路中止。2015年,我在國內(nèi)和朋友聯(lián)合創(chuàng)辦了一家物聯(lián)網(wǎng)相關(guān)的公司。為了支持公司的硬件產(chǎn)品,我們開發(fā)了一個提供統(tǒng)一通信和數(shù)據(jù)服務的物聯(lián)網(wǎng)平臺,不過吸取了之前的教訓,這個平臺只對同一組織(公司)里的多個產(chǎn)品提供支持。當時各大云服務商,比如阿里云,提供了非常成熟的物聯(lián)網(wǎng)套件,我們將這些物聯(lián)網(wǎng)套件中的一些功能移植到了自研的物聯(lián)網(wǎng)平臺上。這個平臺從技術(shù)層面很好地支持了公司從0到1、從1到N持續(xù)盈利的全流程。在這個過程中我遇到過一些問題,也總結(jié)出一些非常有用的經(jīng)驗。在此期間,我也加入了一些物聯(lián)網(wǎng)開發(fā)者的社區(qū)。在日常的技術(shù)交流里,我發(fā)現(xiàn)一些開發(fā)人員對常用的物聯(lián)網(wǎng)協(xié)議的理解是有問題的,對一些功能應該在協(xié)議層面實現(xiàn)還是在業(yè)務層面實現(xiàn)不是很清楚。我曾在互聯(lián)網(wǎng)上搜索過相關(guān)的技術(shù)文章,發(fā)現(xiàn)系統(tǒng)性講解協(xié)議的規(guī)范和特性的文章非常少,不是只對一兩個功能進行介紹,就是只翻譯協(xié)議規(guī)范,缺乏代碼示例。在這種情況下,我在GitChat的專欄寫了我的第一篇文章《MQTT協(xié)議快速入門》,詳細地講解了物聯(lián)網(wǎng)應用中最常見的MQTT協(xié)議的規(guī)范和特性,并對每一個特性附以豐富的代碼示例。加入專欄文章的讀者交流群后,我又發(fā)現(xiàn)讀者還有很多關(guān)于設計、業(yè)務架構(gòu)的疑問,深入理解MQTT協(xié)議并不能解決這些問題。這讓我意識到,物聯(lián)網(wǎng)應用開發(fā)并不像Web開發(fā)那樣有成熟的設計模式和框架可以使用,開發(fā)者往往都是從協(xié)議級別開始往上搭,重復地造輪子。因此,我覺得有必要把我們在開發(fā)物聯(lián)網(wǎng)平臺中遇到的困難和總結(jié)的經(jīng)驗分享出來,從協(xié)議開始講起,再覆蓋物聯(lián)網(wǎng)后臺開發(fā)中常見的設計模式和最佳實踐,讓其他的物聯(lián)網(wǎng)開發(fā)者少走一些彎路,少造一些輪子,進而更快速、更高效地上線自己的產(chǎn)品。讀者對象物聯(lián)網(wǎng)應用開發(fā)人員物聯(lián)網(wǎng)架構(gòu)師物聯(lián)網(wǎng)平臺開發(fā)人員對物聯(lián)網(wǎng)感興趣的開發(fā)人員有一定經(jīng)驗的IM平臺、移動推送平臺開發(fā)人員渴望學習更多物聯(lián)網(wǎng)實際開發(fā)經(jīng)驗的人員如何閱讀本書本書涵蓋物聯(lián)網(wǎng)應用開發(fā)80%的場景,理論和實戰(zhàn)并重。本書內(nèi)容分為三大部分。第一部分(第1~2章)為物聯(lián)網(wǎng)基礎知識介紹,涵蓋物聯(lián)網(wǎng)的概念和常用協(xié)議。第二部分(第3~6章)為MQTT協(xié)議詳解,通過詳盡的示例代碼對MQTT 3.1.1和MQTT 5.0協(xié)議的規(guī)范和特性進行講解。第三部分(第7~14章)為物聯(lián)網(wǎng)平臺開發(fā)實戰(zhàn),從零開始用開源的組件搭建一個名為Maque IotHub的物聯(lián)網(wǎng)平臺,在這個過程中講解物聯(lián)網(wǎng)后臺開發(fā)中常見的設計模式和最佳實踐。本書最后補充有結(jié)語與附錄。結(jié)語總結(jié)了本書講到的相關(guān)系統(tǒng)與知識體系,附錄介紹了運行Maque IotHub的方法和步驟。如果你對MQTT協(xié)議已經(jīng)非常了解,可以直接從第三部分開始看起,第二部分可作為協(xié)議規(guī)范參考指南。如果你是一名初學者,請務必從第1章的基礎知識開始學習。勘誤和支持由于作者的水平有限,書中難免會出現(xiàn)一些錯誤或者不準確的地方,懇請讀者批評指正。書中大量的實例代碼都可以從我的GitHub站點(https://github.com/suf?ish)下載。你也可以關(guān)注我在GitChat的專欄(https://gitbook.cn/gitchat/author/59ed8409991df70ecd5a0f8f),并加入專欄讀者群進行交流。如果你有更多的寶貴意見,也歡迎發(fā)郵件到y(tǒng)fc@hz.cmpbook.com。期待能夠得到你們的真摯反饋。致謝首先要感謝EMQX的開發(fā)者和貢獻者,開發(fā)和維護一款強大的開源MQTT Broker非常不易。感謝GitChat提供平臺并促成了本書的出版。感謝在寫作過程中很多人的支持與幫助,他們是:趙華振、李斌鋒、鄧斌、戚祥、于偉、皮文星、陳育春、陸正武、虞曉東、張恒汝、高喆、劉威、劉冉、付志濤、宗杰、王大平、李振捷、李波、張鵬、管西京、閆芳、王玉芹、王秀明、楊振珂。 感謝公司的全體同人,大家的共同努力才給我提供了一個能夠?qū)嵺`自己想法的機會。最后感謝關(guān)心我的家人,尤其是我的妻子和女兒,她們的支持是我完成本書的動力!謹以此書獻給我最親愛的家人,以及廣大物聯(lián)網(wǎng)開發(fā)者!
付 強
付強,資深物聯(lián)網(wǎng)技術(shù)專家,有超過15年的物聯(lián)網(wǎng)行業(yè)從業(yè)經(jīng)驗,現(xiàn)擔任某物聯(lián)網(wǎng)軟硬件解決方案公司的創(chuàng)始人兼CTO。曾就職于趨勢科技、諾基亞創(chuàng)新中心硅谷實驗室,專注于物聯(lián)網(wǎng)軟硬件產(chǎn)品和平臺的設計和開發(fā)。 CSDN專欄作者,撰寫了多篇物聯(lián)網(wǎng)和AI相關(guān)的專欄文章。傅靜濤,工信部高級項目經(jīng)理,在一流高校從事相關(guān)專業(yè)科研和教學近30年, 在物聯(lián)網(wǎng)領(lǐng)域有非常深厚的積累。主持和實施了多個物聯(lián)網(wǎng)軟硬件產(chǎn)品和平臺的研發(fā)與落地。
目 錄 Contents前言第一部分 物聯(lián)網(wǎng)基礎第1章 什么是物聯(lián)網(wǎng) 21.1 物聯(lián)網(wǎng)和人工智能 31.2 物聯(lián)網(wǎng)的現(xiàn)狀與前景 4第2章 常見的物聯(lián)網(wǎng)協(xié)議 62.1 MQTT協(xié)議 62.2 MQTT-SN協(xié)議 72.3 CoAP 82.4 LwM2M協(xié)議 92.5 HTTP 92.6 LoRaWAN協(xié)議 92.7 NB-IoT協(xié)議 102.8 本章小結(jié) 10第二部分 MQTT協(xié)議詳解與實戰(zhàn)第3章 MQTT協(xié)議基礎 133.1 MQTT協(xié)議的通信模型 133.2 MQTT的不同版本 143.3 MQTT Client 143.4 MQTT Broker 163.5 MQTT協(xié)議數(shù)據(jù)包格式 173.6 本章小結(jié) 19第4章 MQTT 3.1.1協(xié)議詳解 204.1 建立到Broker的連接 204.1.1 CONNECT數(shù)據(jù)包 204.1.2 CONNACK數(shù)據(jù)包 234.1.3 關(guān)閉連接 254.1.4 代碼實踐 264.2 訂閱與發(fā)布 294.2.1 PUBLISH數(shù)據(jù)包 304.2.2 代碼實踐:發(fā)布消息 324.2.3 訂閱一個主題 324.2.4 代碼實踐:訂閱主題 354.2.5 取消訂閱 374.3 QoS及其最佳實踐 404.3.1 MQTT協(xié)議中的QoS等級 404.3.2 QoS0 404.3.3 QoS1 414.3.4 QoS2 424.3.5 代碼實踐:使用不同的QoS發(fā)布消息 454.3.6 實際的QoS 484.3.7 QoS的最佳實踐 484.4 Retained消息和LWT 494.4.1 Retained消息 494.4.2 代碼實踐:發(fā)布和接收Retained消息 504.4.3 LWT 524.4.4 代碼實踐:監(jiān)控Client連接狀態(tài) 524.5 Keep Alive與連接;睢544.5.1 Keep Alive 544.5.2 代碼實踐 564.5.3 連接;睢574.6 本章小結(jié) 59第5章 MQTT 5.0協(xié)議詳解 605.1 協(xié)議包內(nèi)容擴展 605.1.1 屬性集 605.1.2 原因碼 605.2 更完善的連接管理 635.2.1 獲取MQTT Broker的連接屬性 635.2.2 代碼實踐:建立MQTT 5.0連接 655.2.3 Client主動斷開連接 655.2.4 代碼實踐:主動斷開連接,觸發(fā)遺愿機制 665.2.5 Broker主動斷開連接 675.2.6 代碼實踐:處理客戶端標識符沖突 675.3 更完善的會話管理 685.3.1 清理會話啟動 695.3.2 會話過期時間 695.3.3 代碼實踐:在CONNECT數(shù)據(jù)包中設定會話過期時間 705.3.4 代碼實踐:在DISCONNECT數(shù)據(jù)包中更新會話過期時間 705.4 新增消息過期機制 715.4.1 消息過期時間 715.4.2 代碼實踐:發(fā)布帶有過期時間的消息 725.5 協(xié)議級別支持共享訂閱 735.5.1 如何使用共享訂閱 735.5.2 代碼實踐:使用共享訂閱 745.5.3 代碼實踐:使用帶通配符的共享訂閱 755.5.4 代碼實踐:多個共享訂閱組 765.6 數(shù)據(jù)包可攜帶用戶屬性 775.6.1 為什么要引入用戶屬性 775.6.2 典型的使用場景 785.7 可聲明消息體格式 795.7.1 為什么要聲明消息體格式 795.7.2 如何聲明消息體格式 795.7.3 代碼實踐:發(fā)布帶有消息體格式的消息 795.8 可設置主題別名 805.8.1 主題名映射 815.8.2 代碼實踐:使用主題別名 815.9 新增請求/響應模式 825.9.1 MQTT 5.0之前的解決方案 825.9.2 MQTT 5.0的解決方案 835.9.3 代碼實踐:使用請求/響應模式進行數(shù)據(jù)交互 845.10 訂閱時可指定訂閱標識符 855.10.1 訂閱標識符 855.10.2 代碼實踐:使用訂閱標識符 855.11 更完善的訂閱選項 865.11.1 QoS等級選項 875.11.2 非本地選項 875.11.3 保留Retain標識符選項 875.11.4 保留消息處理選項 875.11.5 代碼實踐:設置非本地選項 875.11.6 代碼實踐:設置保留Retain標識符選項 885.11.7 代碼實踐:設置保留消息處理選項 895.12 更完善的認證機制 915.13 本章小結(jié) 92第6章 MQTT協(xié)議實戰(zhàn) 936.1 AI IoT項目實戰(zhàn) 936.1.1 用TensorFlow在Android系統(tǒng)上進行物體識別 936.1.2 如何在MQTT協(xié)議里傳輸大文件 946.1.3 消息去重 956.1.4 最終的消息數(shù)據(jù)格式 956.1.5 代碼實踐:上傳識別結(jié)果 956.1.6 在瀏覽器中運行MQTT Client 976.1.7 代碼實踐:接收識別結(jié)果 976.1.8 搭建私有MQTT Broker 986.1.9 傳輸層安全 1006.2 MQTT常見問題解答 1016.3 開發(fā)物聯(lián)網(wǎng)應用,學會MQTT協(xié)議就夠了嗎 1016.4 本章小結(jié) 103第三部分 實戰(zhàn):從零開始搭建 一個IoT平臺第7章 準備工作臺 1077.1 安裝需要的組件 1077.2 Maque IotHub的組成部分 1087.3 項目結(jié)構(gòu) 1097.3.1 IotHub Server 1097.3.2 IotHub DeviceSDK 1097.4 本章小結(jié) 111第8章 設備生命周期管理 1128.1 設備注冊 1128.1.1 設備三元組 1128.1.2 EMQX的認證方式 1138.1.3 設備接入流程 1178.1.4 Server API:設備注冊 1188.1.5 調(diào)整EMQX配置 1208.1.6 修改DeviceSDK 1218.1.7 Server API:設備信息查詢 1228.1.8 Server API:獲取接入IotHub的一次性密碼(JWT) 1238.1.9 完善細節(jié) 1258.2 設備連接狀態(tài)管理 1278.2.1 Poor mans Solution 1278.2.2 使用EMQX的解決方案 1288.2.3 管理設備的連接狀態(tài) 1328.3 設備的禁用與刪除 1368.3.1 禁用設備 1368.3.2 刪除設備 1418.4 設備權(quán)限管理 1428.4.1 為什么要控制Publish和Subscribe權(quán)限 1428.4.2 EMQX的ACL功能 1428.4.3 集成EMQX的ACL功能 1468.5 給IotHub加一點擴展性 1488.5.1 EMQX的縱向擴展 1488.5.2 EMQX的橫向擴展 1498.6 本章小結(jié) 151第9章 上行數(shù)據(jù)處理 1529.1 選擇一個可擴展的方案 1529.1.1 完全基于MQTT協(xié)議的方案 1539.1.2 基于WebHook的方案 1549.1.3 數(shù)據(jù)格式 1559.1.4 主題名規(guī)劃 1569.1.5 上行數(shù)據(jù)存儲 1569.1.6 通知業(yè)務系統(tǒng) 1579.1.7 上行數(shù)據(jù)查詢 1579.1.8 上行數(shù)據(jù)處理流程 1579.2 實現(xiàn)上行數(shù)據(jù)處理功能 1589.2.1 DeviceSDK的功能實現(xiàn) 1589.2.2 IotHub Server的功能實現(xiàn) 1609.2.3 代碼聯(lián)調(diào) 1629.2.4 通知業(yè)務系統(tǒng) 1649.2.5 Server API歷史消息查詢 1679.3 設備狀態(tài)上報 1689.3.1 設備狀態(tài) 1689.3.2 DeviceSDK的實現(xiàn) 1699.3.3 IotHub Server 的實現(xiàn) 1699.3.4 Server API:查詢設備狀態(tài) 1719.3.5 代碼聯(lián)調(diào) 1729.3.6 為何不用Retained消息 1729.4 時序數(shù)據(jù)庫 1739.4.1 時序數(shù)據(jù) 1739.4.2 時序數(shù)據(jù)庫概述 1749.4.3 收集設備連接狀態(tài)變化的數(shù)據(jù) 1749.5 本章小結(jié) 177第10章 下行數(shù)據(jù)處理 17810.1 選擇一個可擴展的方案 17910.1.1 完全基于 MQTT協(xié)議的方案 17910.1.2 基于EMQX RESTful API的方案 18010.1.3 下行數(shù)據(jù)格式 18010.1.4 主題名規(guī)劃 18110.1.5 如何訂閱主題 18210.1.6 設備端消息去重 18210.1.7 指令回復 18310.2 DeviceSDK端的實現(xiàn) 18310.2.1 消息去重 18310.2.2 提取元數(shù)據(jù) 18410.2.3 處理指令 18510.2.4 回復指令 18610.3 服務端的實現(xiàn) 18710.3.1 更新ACL 列表 18710.3.2 EMQX發(fā)布功能 18710.3.3 Server API:發(fā)送指令 18810.3.4 Broker自動訂閱 18910.3.5 通知業(yè)務系統(tǒng) 19010.3.6 代碼聯(lián)調(diào) 19210.4 本章小結(jié) 195第11章 IotHub的高級功能 19611.1 RPC式調(diào)用 19611.1.1 主題規(guī)劃 19711.1.2 等待指令回復 19811.1.3 服務端實現(xiàn) 19811.1.4 Server API:發(fā)送RPC指令 20011.1.5 更新設備ACL列表 20111.1.6 更新服務器訂閱列表 20111.1.7 DeviceSDK端實現(xiàn) 20211.1.8 代碼聯(lián)調(diào) 20311.2 設備數(shù)據(jù)請求 20411.2.1 更新設備ACL列表 20511.2.2 服務端實現(xiàn) 20611.2.3 DeviceSDK端實現(xiàn) 20711.2.4 代碼聯(lián)調(diào) 20711.3 NTP服務 20911.3.1 IotHub 的 NTP 服務 20911.3.2 DeviceSDK端實現(xiàn) 21011.3.3 服務端實現(xiàn) 21111.3.4 代碼聯(lián)調(diào) 21211.4 設備分組 21211.4.1 功能設計 21311.4.2 服務端實現(xiàn) 21511.4.3 DeviceSDK端實現(xiàn) 21811.4.4 代碼聯(lián)調(diào) 22111.5 M2M設備間通信 22311.5.1 主題名規(guī)劃 22311.5.2 服務端實現(xiàn) 22411.5.3 DeviceSDK端實現(xiàn) 22511.5.4 代碼聯(lián)調(diào) 22511.6 OTA升級 22711.6.1 功能設計 22711.6.2 服務端實現(xiàn) 22911.6.3 DeviceSDK端實現(xiàn) 23311.6.4 代碼聯(lián)調(diào) 23511.7 設備影子 23811.7.1 什么是設備影子 23811.7.2 設備影子的數(shù)據(jù)結(jié)構(gòu) 23811.7.3 設備影子的數(shù)據(jù)流向 23911.7.4 服務端實現(xiàn) 24111.7.5 DeviceSDK端實現(xiàn) 24611.7.6 代碼聯(lián)調(diào) 24811.8 本章小結(jié) 250第12章 擴展EMQX Broker 25112.1 EMQX的插件系統(tǒng) 25112.1.1 Erlang語言 25212.1.2 安裝編譯工具 25212.2 我們會用到的Erlang特性 25312.2.1 Erlang簡介 25312.2.2 變量和賦值 25412.2.3 特殊的 Erlang 數(shù)據(jù)類型 25512.2.4 模式匹配 25512.2.5 模塊與函數(shù) 25612.2.6 宏定義 25712.2.7 OTP 25712.3 搭建開發(fā)和編譯環(huán)境 25712.3.1 使用插件模板 25712.3.2 代碼結(jié)構(gòu) 25712.3.3 編譯和打包 26012.4 實現(xiàn)基于RabbitMQ的Hook插件:emqx_rabbitmq?_?plugin 26012.4.1 插件配置文件 26012.4.2 建立RabbitMQ的連接池 26112.4.3 處理client.connected事件 26312.4.4 處理client.disconnected事件 26312.4.5 處理message.publish事件 26412.5 使用emqx_rabbitmq?_?plugin插件 26512.5.1 安裝和啟用插件 26512.5.2 測試插件 26612.5.3 管理插件配置 26712.5.4 集成emqx_rabbitmq?_?plugin插件 26812.5.5 IotHub 的全新架構(gòu) 26912.6 本章小結(jié) 270第13章 集成CoAP 27113.1 CoAP簡介 27113.1.1 CoAP的消息模型 27213.1.2 CoAP的請求/響應機制 27213.1.3 CoAP OBSERVE 27313.1.4 CoAP HTTP網(wǎng)關(guān) 27313.2 集成CoAP到IotHub 27413.2.1 EMQX的CoAP網(wǎng)關(guān) 27413.2.2 設備發(fā)起連接 27713.2.3 設備上報數(shù)據(jù) 27913.2.4 設備發(fā)送心跳 28013.2.5 設備主動斷開連接 28113.3 本章小結(jié) 282第14章 使用其他語言擴展 EMQX 28314.1 EMQX的gRPC鉤子 28314.2 gRPC簡介 28414.3 基于EMQX的gRPC鉤子實現(xiàn)插件功能 28414.3.1 ExHook的服務定義 28414.3.2 代碼結(jié)構(gòu) 28614.3.3 OnProviderLoaded接口 28714.3.4 OnClientConnected接口 28814.3.5 OnClientDisconnected接口 29014.3.6 OnMessagePublish接口 29014.4 啟用emqx_rabbitmq?_node_plugin 29314.5 本章小結(jié) 294結(jié)語 我們學到了什么 295附錄A 如何運行Maque IotHub 299