当前位置: 首页 > news >正文

物联网实战--平台篇之(一)架构设计

本项目的交流QQ群:701889554

物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html

物联网实战--驱动篇https://blog.csdn.net/ypp240124016/category_12631333.html

一、平台简介

        物联网平台这个概念比较宽,大致可以分为两大类,一类是行业物联网平台,面对的政企客户,定制化程度比较高,例如智慧消防平台,需要跟现有业务做对接;一种是通用物联网平台,就像小米智能家居一样,用户就是普通个人,下载一个APP就能使用设备了。不管是哪种平台,它的核心底层功能都是承载设备的连接、管理和数据存储,是用户与设备的连接纽带。

        所谓平台,其实就是一个或多个运行在服务器的软件了,这个软件涉及的知识点和技术栈会比较多,以下是一个常规的物联网平台的架构图(来自IOT-DC3),仅供参考。

二、平台定位

        这里有一些开源的物联网组件和平台盘点 12 个物联网开源项目,yyds! - 知乎,总的来讲,这些平台的技术栈过多、设计思想类似、体系过于臃肿,看似什么都能干,但在实际项目中却很难达到理想效果,因为中间件过多,有时候一个数据可以延时好几秒,甚至中间件掉链子,无法到达终端,在定位问题时经常是踢皮球,整个开发体系沟通成本过高,这是目前很多物联网公司的通病。

        总的来讲,还是定位和设计思想的问题,很多公司在设计物联网平台时候心都很大,都是要包罗万象的,MQTT、Coap、LORA、OPC、BACNet、modbus什么协议都要支持,电力、消防、水务各个行业都要能应用,地图、3D、BIM、数字孪生哪个高端整哪个,到头来基本上是老板强推、一线骂娘。这一类的物联网平台往往是政策驱动的,而不是市场驱动的。

        在从事物联网行业期间,自己也一直在找有没有简单、实用、高可靠性的物联网平台,只需要基础的设备接入和管理功能,让我可以把心思放在用户需求分析、产品设备的定义和开发上。其实米家生态是一个比较合适的对象,只不过它更倾向于消费级的商业化产品,对接一个产品前后可能要花几千甚至几万的成本,还有很多协议需要遵守。结合学习的需求,最终觉得还是得自己设计一个平台软件,对标的就是米家这种类型的,针对个人用户,用户拿到设备后只需要简单添加就可以使用了。

三、架构设计

        上图是平台架构图,主要由五部分组成:设备端、MQTT服务器、用户端、数据服务器和应用服务器。其中,MQTT服务器是中心,负责数据的路由转发,其它各模块通过话题的定义进行交流。

        在设计目标中,简单和高可靠性是两个比较重要的指标,所以设备端和用户端(主要是手机APP)采用端到端的通讯,中间除了MQTT服务器做数据转发外没有其它中间件,设备发送的数据到手机端直接解析和显示,很大程度上也降低了延时,提升了体验感;另外,即使应用服务器和数据服务器都宕机了,短时间内也不会影响用户对设备的使用和操控。而在传统的物联网平台设计中,数据需要汇集到统一的中心进行处理,然后再转发到用户端,这个过程只要数据处理服务停止运行,用户就收不到数据了,而且在设备数量上升后,对服务器的压力也会变大,意味着需要升级硬件、增加很多的服务器成本。

        应用服务器主要是对账户、应用和设备进行管理,属于常规的、各个平台都会有的内容,其主要还是跟用户端进行交互;数据服务器的作用是存储设备数据,同时实时解析设备的数据包内是否包含紧急的报警信息,这样才能及时通知用户。

        那么,使用这么一个端到端平台对于物联网开发会有什么好处呢?这个话题得回到 “物联网” 三个字本身,首先得要有物,其次才是联网,物也就是产品,跟用户直接接触的东西,大家在买智能家居产品的时候应该都有这么一个感觉--设备才是我自己的,软件和联网等功能是附加体验,决定我买不买的主要因素还是设备本身的价格和功能,平台软件很难成为决定因素。但是,在现有的开发体系中,设备端往往没有很大的话语权,一切都是以平台为中心的,很多协议、功能都只能适应平台,这也导致了很多设备产品的定义和设计只能妥协,用户体验自然就下降了。平台用端到端的设计后,设备端和用户端的定义可以自行决定,平台方无需增加开发,降低了沟通成本,提升了设备端的自主权。这样说可能比较抽象,举个例子,比如一个温度传感器,要设置报警温度阈值,我现在用过的几个产品都是把这个阈值放在平台数据库内,平台根据设备上报的温度数据进行对比,超过阈值就进行报警推送,整体逻辑没什么问题,但是体验感和可靠性上是不太行的,首先设备多久上报一次数据?有的几秒,有的几分钟,如果上报周期太长导致报警延迟,可能会导致严重的后果。比如工厂化鸡舍,如果通风系统或者制冷设备故障,高密度养殖会导致温度迅速上升,如果没有及时预警处理,可能会对用户造成极大的损失。如果把这个阈值设置在设备内部,那温度检测都是毫秒级别的,基本上能在5秒内发出报警信息。这里只是大概举例,核心要说明的问题其实还是设备端跟平台端在协议对接上的交流成本是挺高的,两边的开发人员都是站在自己的角度考虑问题,容易发生矛盾。比如对于平台来讲协议如果用json这样的文本是最好的了,简单明了,但是对于设备端来说资源受限,一般采用二进制形式,而且对于采用4G的设备来说,流量也是个大问题。所以说,这就是采用端到端开发产品的好处了,设备端可以自定义协议内容,减少沟通成本。后面等这个平台软件开发完成后,我们就会不断地用这种模式去开发各式各样的硬件产品,效率极高。

四、开发规划

        依据上面的架构图,我们主要的工作量还是在应用服务器和用户端的对接开发,包含了帐号注册、登录,密码修改,子账户管理,应用管理,分组管理,设备管理,手机验证码,扫码添加,报警消息通知等等。对于APP的设计,我们还是参考米家APP,UI设计是技术人员的短板,还是直接模仿比较快,当然了,很多冗余的东西也会删除,毕竟人家是商业性的APP了,我们这个主要还是为了学习用的,下面放一张APP截图作为参考。

        在开发技术上,我们全部使用Qt进行开发,包括服务器相关的程序和手机APP,当然了只要你理解了技术原理和设计思想,那么你用Java和安卓开发都是可以的,不限具体的技术形式。

        接下来,每一篇文章都会对新的功能模块进行开发,开发完后上传,一步一步完成,沉浸式体验整个过程,让大家在学习过程中理解物联网整个体系的设计原理和开发思维,同时掌握实战性的开发技巧。

        最后,回答一个经常有人问的问题,很多物联网专业的同学看到自己要学的内容那么多、那么杂,瞬间失去了兴趣和方向,不自觉地灵魂拷问:物联网的出路在哪里?我个人的观点是三个方向:

1、纯粹做技术,那你把物联网各个环节中的某一个环节学精来就行了,比如嵌入式、硬件设计、后台开发、前端开发等等,选一个自己感兴趣的深入学习,然后早点去找个公司实习,积累经验,这样未来找工作的时候简历就很丰富了,竞争力也就强了;

2、市场销售,物联网销售还是需要有点技术底子的,至少表面功夫得学一学,跟客户交流这是基本功了,还要有比较好的新知识的吸收能力,比如让你去给客户推销NB烟感,客户问你电池多大容量的,一天发送几次,大概能用几年,电信和移动的啥区别,用的谁家模组,报警声音几分贝,这些问题常规的销售应该是搞不定的,更何况还有更深入的问题,比如电池仓库放太久没安装,钝化了怎么办?物联网设备的销售主要还是以量取胜,谈一单往往出货量是比较可观的,够你吃一阵子了。

3、市场发掘,这个要求你是复合型人才,创业型选手,既要懂技术,又要懂产业,深入了解某个产业中的痛点和刚需,并分析出产品如何设计才能更好地适应当前产业,让用户乐意买单,这里面产业、技术、需求、成本、管理、产品各个环节缺一不可,这也是未来物联网发展的一个新契机。就目前来讲,物联网有点不温不火,风头早已经不能跟人工智能和机器人相提并论了,甚至很多物联网企业都快倒闭了,不过这在起初就可以预知的,2018年后的那几年,虽然概念火热,但是参与其中会发现物联网技术并未解决太多生活中的刚需问题,更多的是为了KPI而推行的项目。所以,要想让物联网真正改变生活,还是很需要这样的复合型人才来填补产业与技术之间的鸿沟,让物联网真正的成为一个市场驱动型的产业,这样整个行业才有未来。

相关文章:

物联网实战--平台篇之(一)架构设计

本项目的交流QQ群:701889554 物联网实战--入门篇https://blog.csdn.net/ypp240124016/category_12609773.html 物联网实战--驱动篇https://blog.csdn.net/ypp240124016/category_12631333.html 一、平台简介 物联网平台这个概念比较宽,大致可以分为两大类&#x…...

spi 驱动-数据发送流程分析

总结 核心函数是spi_sync, 设备驱动->核心函数-> 控制器驱动 实例分析 (gdb) c Continuing.Thread 115 hit Breakpoint 1, bcm2835_spi_transfer_one (master0xffffffc07b8e6000, spi0xffffffc07b911800, tfr0xffffff8009f53c40) at drivers/spi/spi-bcm2835…...

平面分割--------PCL

平面分割 bool PclTool::planeSegmentation(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, pcl::ModelCoefficients::Ptr coefficients, pcl::PointIndices::Ptr inliers) {std::cout << "Point cloud data: " << cloud->points.size() <<…...

前端之深拷贝

前提&#xff1a; 就是在实际开发中&#xff0c;我有一个编辑的弹窗&#xff0c;可以查看和编辑&#xff0c;因为弹窗里面是一个步骤条&#xff0c;点击下一步就要向对应的接口发送请求&#xff0c;考虑到就比如我点击下一步&#xff0c;此次表箱信息其实不需要修改&#xff0…...

2024年 Java 面试八股文——SpringCloud篇

目录 1.Spring Cloud Alibaba 中的 Nacos 是如何进行服务注册和发现的&#xff1f; 2.Spring Cloud Alibaba Sentinel 的流量控制规则有哪些&#xff1f; 3.Spring Cloud Alibaba 中如何实现分布式配置管理&#xff1f; 4.Spring Cloud Alibaba RocketMQ 的主要特点有哪些&…...

linux C语言Makefile

ChatGPT 在Linux中使用Makefile来自动化C语言项目的构建过程是很普遍的实践。Makefile是一个包含了一系列构建目标及如何构建这些目标的依赖和规则的文本文件。 一个基本的Makefile例子可能会像这样&#xff1a; # 定义编译器 CCgcc# 定义编译选项 CFLAGS-I.# 定义可执行文件…...

pgvector扩展在IvorySQL Oracle兼容模式下的应用实践

向量数据库是生成式人工智能(GenAI)的关键组成部分。作为PostgreSQL的重要扩展&#xff0c;pgvector支持高达16000维的向量计算能力&#xff0c;使得PostgreSQL能够直接转化为高效的向量数据库。 IvorySQL基于PostgreSQL开发&#xff0c;因此它同样支持添加pgvector扩展。在Ora…...

c++ 线程概述

C中的线程是并发编程的重要组成部分&#xff0c;它允许程序同时执行多个任务。以下是对C线程的概述&#xff1a; 基本概念&#xff1a; 并发&#xff1a;意味着两个或多个任务同时执行。在单核CPU上&#xff0c;由于只有一个CPU&#xff0c;某一时刻只能执行一个任务&#xff0…...

纯血鸿蒙APP实战开发——短视频切换实现案例

短视频切换实现案例 介绍 短视频切换在应用开发中是一种常见场景&#xff0c;上下滑动可以切换视频&#xff0c;十分方便。本模块基于Swiper组件和Video组件实现短视频切换功能。 效果图预览 使用说明 上下滑动可以切换视频。点击屏幕暂停视频&#xff0c;再次点击继续播放…...

36.Docker-Dockerfile自定义镜像

镜像结构 镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。 镜像是分层机构&#xff0c;每一层都是一个layer BaseImage层&#xff1a;包含基本的系统函数库、环境变量、文件系统 EntryPoint:入口&#xff0c;是镜像中应用启动的命令 其他&#xff1a;在…...

【webrtc】MessageHandler 4: 基于线程的消息处理:以Fake 收发包模拟为例

G:\CDN\rtcCli\m98\src\media\base\fake_network_interface.h// Fake NetworkInterface that sends/receives RTP/RTCP packets.虚假的网络接口,用于模拟发送包、接收包单纯仅是处理一个ST_RTP包 消息的id就是ST_RTP 类型,– 然后给到目的地:mediachannel处理: 最后消息消…...

C#运算符“/”使用方法

C#中&#xff0c;当需要对两个整数进行除法运算时&#xff0c;结果会被截断为整数部分&#xff0c;即使结果本应是一个小数。这是因为整数除法会丢弃小数部分&#xff0c;只保留整数部分。 要想保留小数部分&#xff0c;需要将至少其中一个操作数转换为float、double或者 deci…...

虚拟机网络桥接模式无法通信,获取到的ip为169.254.X.X

原因&#xff1a;VMware自动选择的网卡可能不对 解决&#xff1a;编辑-虚拟网络编辑器-更改桥接模式-选择宿主机物理网卡&#xff0c;断开虚拟机网络连接后重新连接即可...

【数据结构】初识数据结构

引入&#xff1a; 哈喽大家好&#xff0c;我是野生的编程萌新&#xff0c;首先感谢大家的观看。数据结构的学习者大多有这样的想法&#xff1a;数据结构很重要&#xff0c;一定要学好&#xff0c;但数据结构比较抽象&#xff0c;有些算法理解起来很困难&#xff0c;学的很累。我…...

相机知识的补充

一&#xff1a;镜头 1.1MP的概念 相机中MP的意思是指百万像素。MP是mega pixel的缩写。mega意为一百万&#xff0c;mega pixel 指意为100万像素。“像素”是相机感光器件上的感光最小单位。就像是光学相机的感光胶片的银粒一样&#xff0c;记忆在数码相机的“胶片”&#xff…...

在Linux操作系统中实现磁盘开机自动挂载

当一个分区创建好&#xff0c;然后文件系统创建完毕之后&#xff0c; 需要使用mount命令将分区挂载到空目录上&#xff0c;这个挂载关系是临时的&#xff0c;也就是说当重启机器的时候&#xff0c;硬盘分区于空目录之间的挂载关系就会解除。 磁盘于目录之间的挂载关系断开意味…...

单片机编程实例400例大全(100-200)

今天继续分享单片机编程实例第100-200例。 今天的实例会比前面100复杂一些&#xff0c;我大概看了下&#xff0c;很多都具备实际产品的参考价值。 今天继续分享单片机编程实例第100-200例。 今天的实例会比前面100复杂一些&#xff0c;我大概看了下&#xff0c;很多都具备实际…...

新兴游戏引擎Godot vs. 主流游戏引擎Unity和虚幻引擎,以及版本控制工具Perforce Helix Core如何与其高效集成

游戏行业出现一个新生事物——Godot&#xff0c;一个免费且开源的2D和3D游戏引擎。曾经由Unity和虚幻引擎&#xff08;Unreal Engine&#xff09;等巨头主导的领域如今迎来了竞争对手。随着最近“独特”定价模式的变化&#xff0c;越来越多的独立开发者和小型开发团队倾向于选择…...

Leetcode—1652. 拆炸弹【简单】

2024每日刷题&#xff08;127&#xff09; Leetcode—1652. 拆炸弹 实现代码 class Solution { public:vector<int> decrypt(vector<int>& code, int k) {int codeSize code.size();vector<int> ans(codeSize, 0);if(k 0) {return ans;}if(k > 0)…...

JAVASE---抽象类相关

instanceof 和类型转换 System.out.println(X instanceof Y );主要看X与Y之间是否存在父子&#xff08;继承&#xff09;关系&#xff0c;如果存在则编译可完成&#xff0c;否则无法 进行编译。 1.父类引用指向子类的对象 2.把子类转换为父类&#xff0c;向上转型; 3.把父类转…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...