物联网产业作为新基建的重要内容,在未来必然会迎来更多的发展机会。《物联网系统开发:从0到1构建IoT平台》着重介绍物联网应用的架构和设计,经验和场景都来自实际运营的平台和产品,对物联网架构师和开发者有非常大的学习和参考价值。
这是一本从技术原理、工程实践、设计模式和实践4个维度讲解物联网系统开发的著作,是作者10余年实践经验的总结。首先,通过代码实例循序渐进、深入浅出地介绍了物联网协议的原理与实践;然后,以一个功能完备的综合性物联网平台的搭建过程为例,讲解了如何从0到1搭建物联网平台,同时总结了物联网平台开发中常用的设计模式和实践。 《物联网系统开发:从0到1构建IoT平台》一共12章,从逻辑上可分为三部分。 第一部分(第1~2章)物联网基础对物联网的一些关键常识和各种协议进行了详细的介绍。 第二部分(第3~5章)MQTT协议详解与实践通过大量代码实例详细分析和讲解了MQTT协议的规范、特性、原理和应用。 第三部分(第6~12章)实战:从0搭建一个IoT平台详细讲解了如何使用开源组件和云服务从0到1搭建一个具备完备功能的物联网平台。
付强
资深物联网技术专家,有10余年从业经验,专注于物联网平台和产品的设计与开发,非常熟悉各种物联网协议和物联网系统的架构与开发。
现就职于某智慧社区解决方案企业的联合创始人兼CTO, 曾就职于趋势科技、诺基亚中国,以及德国和美国硅谷的初创公司。
从 C 语言到 Web 开发,从微服务架构到移动开发,都有涉猎。GitChat专栏作者, 撰写了多篇物联网和AI相关的专栏文章。
★该书内容翔实,理论与实践结合,是目前为数不多的、专注于物联网应用架构和开发的著作,对初学者和有经验的开发者来说,都是非常优质的学习资料。 ——陈良银 四川大学工业互联网研究院副院长/物联网系主任 ★作者站在物联网的整体角度,从关键协议到系统,再到未来展望,由简入繁,娓娓道来。对于物联网开发浪潮中的每一位技术人员,该书可以帮助他们了解到物联网系统开发的清晰脉络,是专业人员不可多得的一本好书。 ——王玉成 IoT GDE ★在这本书里,付老师先向读者展示了物联网和物联网协议的整体图景,再带领读者从MQTT协议入手,深入浅出地讲解了其他物联网协议,最后引导读者了解搭建IoT平台的精要。 ——王晓东 诺基亚通信有限公司研发主管/创业磨坊成都联合总监 ★物联网产业作为新基建的重要内容,在未来必然会迎来更多的发展机会。该书着重介绍物联网应用的架构和设计,经验和场景都来自实际运营的平台和产品,对物联网架构师和开发者有非常大的学习和参考价值。 ——王俭 腾讯云与智慧产业事业群高级架构师 ★作者在IoT领域有多年实践经验,熟悉各种IoT实际业务场景。该书由基础开始,结合各种场景逐步展开,对于初学者来说是非常好的经验借鉴。 ——王衡 字节跳动技术专家
前言第一部分 物联网基础第1章 什么是物联网1.1 物联网和人工智能1.2 物联网的现状与前景第2章 常见的物联网协议2.1 MQTT协议2.2 MQTT-SN协议2.3 CoAP协议2.4 LwM2M协议2.5 HTTP协议2.6 LoRaWAN协议2.7 NB-IoT协议2.8 本章小结第二部分 MQTT协议详解与实战第3章 MQTT协议基础3.1 MQTT协议的通信模型3.2 MQTT Client3.3 MQTT Broker3.4 MQTT协议数据包格式3.5 本章小结第4章 MQTT协议详解4.1 建立到Broker的连接4.1.1 CONNECT数据包4.1.2 CONNACK数据包4.1.3 关闭连接4.1.4 代码实践4.2 订阅与发布4.2.1 PUBLISH数据包4.2.2 代码实践:发布消息4.2.3 订阅一个主题4.2.4 代码实践:订阅主题4.2.5 取消订阅4.3 QoS及其最佳实践4.3.1 MQTT协议中的QoS等级4.3.2 QoS04.3.3 QoS14.3.4 QoS24.3.5 代码实践:使用不同的QoS发布消息4.3.6 实际的Subscribe QoS4.3.7 QoS的最佳实践4.4 Retained消息和LWT4.4.1 Retained消息4.4.2 代码实践:发布和接收Retained消息4.4.3 LWT4.4.4 代码实践:监控Client连接状态4.5 Keepalive与连接保活4.5.1 Keepalive4.5.2 代码实践4.5.3 连接保活4.6 MQTT 5.0 的新特性4.6.1 用户属性4.6.2 共享订阅4.6.3 消息过期4.6.4 重复主题4.6.5 Broker能力查询4.6.6 双向DISCONNECT4.7 本章小结第5章 MQTT协议实战5.1 “AI+IoT”项目实战5.1.1 用TensorFlow在Android系统上进行物体识别5.1.2 如何在MQTT协议里传输大文件5.1.3 消息去重5.1.4 最终的消息数据格式5.1.5 代码实践:上传识别结果5.1.6 在浏览器中运行MQTT Client5.1.7 代码实践:接收识别结果5.1.8 搭建私有MQTT Broker5.1.9 传输层安全5.2 MQTT常见问题解答5.3 开发物联网应用,学会MQTT协议就够了吗5.4 本章小结第三部分 实战:从0搭建一个IoT平台第6章 准备工作台6.1 安装需要的组件6.2 Maque IotHub的组成部分6.3 项目结构6.3.1 IotHub Server6.3.2 IotHub DeviceSDK6.4 本章小结第7章 设备生命周期管理7.1 设备注册7.1.1 设备三元组7.1.2 EMQ X的认证方式7.1.3 设备接入流程7.1.4 Server API:设备注册7.1.5 调整EMQ X配置7.1.6 修改DeviceSDK7.1.7 Server API:设备信息查询7.1.8 Server API:获取接入IotHub的一次性密码(JWT)7.1.9 完善细节7.2 设备连接状态管理7.2.1 Poor man’s Solution7.2.2 使用EMQ X的解决方案7.2.3 管理设备的连接状态7.3 设备的禁用与删除7.3.1 禁用设备7.3.2 删除设备7.4 设备权限管理7.4.1 为什么要控制Publish和Subscribe7.4.2 EMQ X的ACL功能7.4.3 集成EMQ X ACL7.5 给IotHub加一点扩展性7.5.1 EMQ X的纵向扩展7.5.2 EMQ X的横向扩展7.6 本章小结第8章 上行数据处理8.1 选择一个可扩展的方案8.1.1 完全基于MQTT协议的方案8.1.2 基于Hook的方案8.1.3 数据格式8.1.4 主题名规划8.1.5 上行数据存储8.1.6 通知业务系统8.1.7 上行数据查询8.1.8 上行数据处理流程8.2 实现上行数据处理功能8.2.1 DeviceSDK的功能实现8.2.2 IotHub Server的功能实现8.2.3 代码联调8.2.4 通知业务系统8.2.5 Server API历史消息查询8.3 设备状态上报8.3.1 设备状态8.3.2 DeviceSDK的实现8.3.3 IotHub Server的实现8.3.4 Server API:查询设备状态8.3.5 代码联调8.3.6 为何不用Retained Message8.4 时序数据库8.4.1 时序数据8.4.2 时序数据库8.4.3 收集设备连接状态变化的数据8.5 本章小结第9章 下行数据处理9.1 选择一个可扩展的方案9.1.1 完全基于MQTT协议的方案9.1.2 基于EMQ X RESTful API的方案9.1.3 下行数据格式9.1.4 主题名规划9.1.5 如何订阅主题9.1.6 设备端消息去重9.1.7 指令回复9.2 DeviceSDK端的实现9.2.1 消息去重9.2.2 提取元数据9.2.3 处理指令9.2.4 回复指令9.3 服务端的实现9.3.1 更新ACL列表9.3.2 EMQ X发布功能9.3.3 Server API:发送指令9.3.4 服务器订阅9.3.5 通知业务系统9.3.6 代码联调9.4 本章小结第10章 IotHub的高级功能10.1 RPC式调用10.1.1 主题规划10.1.2 等待指令回复10.1.3 服务端实现10.1.4 Server API:发送RPC指令10.1.5 更新设备ACL列表10.1.6 更新服务器订阅列表10.1.7 DeviceSDK端实现10.1.8 代码联调10.2 设备数据请求10.2.1 更新设备ACL列表10.2.2 服务端实现10.2.3 DeviceSDK端实现10.2.4 代码联调10.3 NTP服务10.3.1 IotHub的NTP服务10.3.2 DeviceSDK端实现10.3.3 服务端实现10.3.4 代码联调10.4 设备分组10.4.1 功能设计10.4.2 服务端实现10.4.3 DeviceSDK端实现10.4.4 代码联调10.5 M2M设备间通信10.5.1 主题名规划10.5.2 服务端实现10.5.3 DeviceSDK端实现10.5.4 代码联调10.6 OTA升级10.6.1 功能设计10.6.2 服务端实现10.6.3 DeviceSDK端实现10.6.4 代码联调10.7 设备影子10.7.1 什么是设备影子10.7.2 设备影子的数据结构10.7.3 设备影子的数据流向10.7.4 服务端实现10.7.5 DeviceSDK端实现10.7.6 代码联调10.8 IotHub的状态监控10.8.1 使用RESTful API10.8.2 使用系统主题10.8.3 EMQ X的Listener Zone10.8.4 代码演示10.9 本章小结第11章 扩展EMQ X Broker11.1 EMQ X的插件系统11.1.1 Erlang语言11.1.2 安装Erlang编译工具11.2 我们会用到的Erlang特性11.2.1 Erlang简介11.2.2 变量和赋值11.2.3 特殊的Erlang数据类型11.2.4 模式匹配11.2.5 模块与函数11.2.6 宏定义11.2.7 OTP11.3 搭建开发和编译环境11.3.1 下载和编译EMQ X11.3.2 使用插件模板11.3.3 插件的代码结构11.3.4 修改模板插件11.4 实现基于RabbitMQ的Hook插件:emqx-rabbitmq-hook11.4.1 代码结构11.4.2 建立RabbitMQ连接和连接池11.4.3 处理client.connected事件11.4.4 处理client.disconnected事件11.4.5 处理message.publish事件11.4.6 编译插件11.4.7 插件的配置文件11.4.8 应用配置项11.5 使用emqx-rabbitmq-hook11.5.1 发布emqx-rabbitmq-hook插件11.5.2 集成emqx-rabbitmq-hook11.5.3 IotHub的全新架构11.6 本章小结第12章 集成CoAP协议12.1 CoAP协议简介12.1.1 CoAP协议的消息模型12.1.2 CoAP协议的请求-应答机制12.1.3 CoAP OBSERVE12.1.4 CoAP HTTP Gateway12.2 集成CoAP协议12.2.1 EMQ X的CoAP插件12.2.2 CoAP设备端代码12.2.3 代码联调12.2.4 CoAP协议的连接状态12.3 本章小结结语 我们学到了什么附录 如何运行Maque IotHub
为什么要写这本书 2011年我在硅谷的时候,曾经参与设计和开发了一个物联网平台。这个平台的目的是为各种物联网设备提供统一的通信接口,以及提供数据存储和分析功能,降低物联网设备商的开发和运营成本。不过由于物联网设备的异构性太强,同时平台的愿景过于超前,而当时物联网应用的发展包括资本的投入都远不及现在,这个项目不得不半路中止。 2015年,我在国内和朋友联合创办了一家物联网相关的公司。为了支撑公司的硬件产品,我们开发了一个提供统一通信和数据服务的物联网平台,不过吸取了之前的教训,这个平台只限于对同一组织(公司)里的多个产品提供支持。当时各大云服务商,比如阿里云,也提供了非常成熟的物联网套件,我们将这些物联网套件中的一些功能移植到了自研的物联网平台上。这个平台从技术层面很好地支持了公司从0到1、从1到Ⅳ持续盈利的全流程。 在这个过程中我遇到过一些问题,也总结了一些非常有用的经验。在此期间,我也加入了一些物联网开发者的社区。在日常的技术交流里,我发现一些开发人员对常用的物联网协议的理解是有问题的,对一些功能应该在协议层面解决还是在业务层面解决不是很清楚。我曾在互联网上搜索过相关的技术文章,发现系统性地讲解协议的规范和特性非常少,不是只对一两个功能进行介绍,就是翻译协议规范,缺乏代码示例。 在这种情况下,我在GitChat码字专栏写了我的第一篇文章《MQTT协议快速入门》,详细地对物联网应用中最常见的MQTT协议的规范和特性进行了讲解,并对每一个特性附以丰富的代码示例。 加入专栏文章的读者交流群后,我又发现读者们还有很多关于设计、业务架构上的疑问,深入理解MQTT协议并不能解决这些问题。这让我意识到,在物联网行业,并不像Web开发那样有成熟的设计模式和框架可以使用,开发者往往都是从协议级别开始往上搭,重复地造轮子。 这时,我觉得有必要把我们在开发物联网平台中遇到的困难和总结的经验分享出来,从协议开始讲起,再覆盖物联网后台开发中常见的设计模式和最佳实践,让其他的物联网开发者少走一些弯路,少造一些轮子,进而更快速、高效地上线自己的产品。 读者对象 物联网应用开发者 物联网架构师 物联网平台开发者 对物联网感兴趣的开发人员 有一定经验的IM平台、移动推送平台开发人员 渴望学习更多物联网实际开发经验的人员 如何阅读本书 本书涵盖物联网应用开发80%的场景,理论和实战并重。本书内容分为三大部分。 第一部分(第1~2章)为物联网基础知识介绍,涵盖物联网的概念和常用协议。 第二部分(第3~5章)为MQTT协议详解,通过详尽的示例代码对MQTT协议的规范和特性进行讲解。 第三部分(第6~12章)为物联网平台开发实战,从0开始用开源的组件搭建一个名为“Maque IotHub”的物联网平台,在这个过程中讲解物联网后台开发中常见的设计模式和最佳实践。 在最后补充有结语与附录。结语总结了本书讲到的相关系统与知识体系,附录介绍了运行Maque IotHub的方法和步骤。 如果你对MQTT协议已经非常了解,可以直接从第三部分开始看起,第二部分可用作协议规范参考。 如果你是一名初学者,请务必从第1章的基础知识开始学习。