# mini-iot **Repository Path**: aero-iot/mini-iot ## Basic Information - **Project Name**: mini-iot - **Description**: No description available - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 11 - **Forks**: 1 - **Created**: 2021-06-22 - **Last Updated**: 2025-03-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # mini-iot #### 介绍 [mini-iot](http://gitee.com/aero-iot/mini-iot) 是一款基于 SpringBoot+Netty+Fastjson 实现的 物联网iot 框架。代码注释详细,结构清晰,非常适合阅读和学习。 虽说 iot 的原理实际不难,但是,自己在实现的过程中自己也遇到了很多问题。mini-iot 目前只实现了 iot 框架最基本的功能,一些可优化点都在下面提到了,有兴趣的小伙伴可以自行完善。欢迎 fork 本项目,然后 clone 到本地,在本地修改后提交 PR 给我,我会在第一时间 Review 你的代码。 #### 软件架构 软件架构说明 [mini-iot](http://gitee.com/aero-iot/mini-iot) 框架使用示意图如下图所示 ![mini-iot架构](https://images.gitee.com/uploads/images/2021/0622/222528_efad1458_9318389.png "架构图 (2).png") **一般情况下,iot 框架不仅要提供可靠的连接通信能力,还要提供容错监控、设备管理、设备上下行处理等功能,这样的物联网iot框架才算真正合格的。** **简单说一下设计一个最基本的 IOT 框架的思路:** 1. 消息中间件 :消息中间件首先是要有的,推荐使用 Kafka。消息中间件提供解耦、削峰、异步处理的作用。由于某些传感器数据量会很大,单一程序处理很容易出现性能瓶颈,这时就需要将单一的程序拆分数据接收程序和数据处理程序,提高系统的性能。 2. 网络传输 :既然要获取设备的数据要网络传输,传输过程中要解决数据的粘包和拆包!推荐基于 NIO 的 Netty 框架。 3. 网络协议 :既然涉及到网络传输就一定涉及到网络协议,由于各大厂商的传感器上报数据协议都有所不同。 所以,你还需要兼容市面上比较常用的传感器上报协议,比较常用的协议有 TCP、UDP、MQTT等。 4. 负载均衡 :负载均衡也是需要的。为啥?举个例子我们的系统中的某个服务的访问量特别大,我们将这个服务部署在了多台服务器上,当客户端发起请求的时候,多台服务器都可以处理这个请求。那么,如何正确选择处理该请求的服务器就很关键。假如,你就要一台服务器来处理该服务的请求,那该服务部署在多台服务器的意义就不复存在了。负载均衡就是为了避免单个服务器响应同一请求,容易造成服务器宕机、崩溃等问题,我们从负载均衡的这四个字就能明显感受到它的意义。 #### 已实现功能 1. 提供tcp、udp、mqtt交互 2. 支持sdk动态加载 3. 集成spi技术 4. 提供一键部署脚本 5. 数据同步 #### 安装教程 1. fork 项目到自己的仓库,然后克隆项目到自己的本地:git clone git@gitee.com:username/mini-iot.git,使用 IDEA 打开,等待项目初始化完成。 2. 下载运行mongodb 下载 ``` docker pull mongo:latest ``` 安装mongodb ``` docker run --name some-mongo -d mongo:latest ``` 3. 运行项目 可以使用idea运行项目,或通过脚本执行 运行 ``` start.bat ``` 停止 ``` stop.bat ``` #### 使用说明 用户自己接入厂商传感器需实现以下接口 1. IMessageConverter是基础的接口,用户需要根据厂商传感器的协议类型来实现接口。 ``` public interface IMessageConverter { /** * 是否使用ssl加密 * @return */ boolean useSsl(); /** * 端口号 (非加密) * @return int */ int port(); /** * 加密传输端口 * @return int */ int sslPort(); /** * 超时离线时间 单位:秒(s) * @return int */ long ttl(); /** * 对接协议类型 * @return ProtocolType */ ProtocolType protocolType(); /** * 设备(传感器)类型 * @return SensorProtocol */ SensorProtocol sensorType(); /** * 解析出消息头中必要属性 * @param in 反转义后的数据 * @return Header * @throws Exception */ Header parseHeader(ByteBuf in, Session session) throws Exception; /** * 解析出消息内容 * @param header 消息头 * @return Message * @throws Exception */ Message parseBody(Header header) throws Exception; /** * 构建设备日志 * @param deviceId 设备号 * @param streamType 上行/下行 * @param raw 原始报文byte[] * @return DeviceLog */ DeviceLog buildLog(String deviceId, StreamType streamType, byte[] raw); /** * 解析结果分发前的前置处理 * @param message 通用解析对象 */ void preDispatchHandle(Message message); /** * 是否需要将解析结果发布到MQ * @param msgType 消息类型 * @return boolean */ boolean needPublish(MessageType msgType); } ``` 2、如传感器使用的是TCP、UDP协议等,就可以使用项目内置的协议接口 ``` public interface ITcpUdpConverter extends IMessageConverter { /** * 拆包 * @return ByteBuf * @throws Exception */ ByteBuf split(ByteBuf in) throws Exception; /** * 转化为原始报文 * @param unescapeBytes 反转义后的数据 * @return string */ String getOriginLog(byte[] unescapeBytes); /** * 校验 * @return boolean * @throws Exception */ boolean validate(ByteBuf in) throws Exception; /** * 转义, 如 7e -> 7d 01 * @return ByteBuf * @throws Exception */ ByteBuf escape(ByteBuf out) throws Exception; /** * 反转义,如:7d 01 -> 7e * @return ByteBuf * @throws Exception */ ByteBuf unescape(ByteBuf in) throws Exception; /** * 回复设备上行消息 * @param message 通用解析对象 */ void response(Message message); /** * 根据下行命令创建设备回复的识别标识 * @return ReplySign * @throws Exception */ ReplySign buildReplySign(ControlApi.Command command, Session session) throws Exception; /** * 匹配是否回复消息 * @return boolean * @throws Exception */ ReplySign replyMatch(Message message, Session session) throws Exception; /** * 生成控制指令 * @param command * @return * @throws Exception */ ByteBuf buildCommand(ControlApi.Command command, Session session) throws Exception; } ``` #### 项目优化点 - 使用checkstyle规划代码格式 - 使用开源的序列化机制 Kyro(也可以用其它的)替代FastJson序列化机制; - 运维监控中心 - kafka中间件拆分服务 - 增加可配置比如序列化方式、避免硬编码 - 编写单元测试 - 集成docker - 前后端分离