一个关于小程序Iot的具体实现(MQTT版)

智数星河客
• 阅读 5453

前言

Iot,这个名词应该很多人都听过了吧,即大数据、Ai等兴起后也紧跟着研发大潮流的到来,即物联网。传统简单的说就是智能化、程序化的控制硬件设施,大家最容易想到的应该是智能家居,通过一个App或者遥控进行对家具设置的远程控制。而今天要说的是人与物之间的通信控制,且通过互联网产品来执行人的命令,而机器进行应答。

竞品

说到小程序控制硬件,大家应该立马想到什么产品呢?某拜、某FO、售货机等等,他们的架构上会大致上有一个共通点就是存在或者类似的云Iot功能。就拿某拜的云架构来说就用了Azure IoT 中心、存储、虚拟机等服务。
一个关于小程序Iot的具体实现(MQTT版)

做小想大

那么我们可以展望更大的架构与实现、或者希望能配出、实现出类似的功能也好,但是我们还是要一步一步的实现一下这个功能或小产品的功效。

目标拟定:用户控制端是小程序,硬件端我们选用简单的售货机(或快递柜),我们要实现的就是针对性的通过小程序命令通知售货机对应的柜子开锁关锁。

那么我们需要构思对应的简易版架构还有对接的实现方式了!

目前传统且大家熟悉的前后端交互方式应该大部分是REST API吧,那么我们在小程序(将它仅仅视为一个单纯的前端展示)与后台(这里就是下图的Iot,我们可以用SpringBoot+Netty构建一个Iot中心)之间的通信就选用API的形式,后台开放对应的指令接口,由小程序去调用,这里可能还有一个业务就是:那么服务器对小程序的主动通信还有通知呢?这里就不细讲了,这个可以当作是产品迭代的后期考虑问题,大家也可以考虑下实现方式。

本文小程序为MQTT调试测试Demo,未做REST API对接,下一篇文章会着重介绍。

那么Iot中心与售货机(快递柜)的通信呢?可能只做软件的同学一般比较少接触到,我一开始做的时候也是很懵,不过大致说下就是不同的通信协议来实现通信,我们就拿单片机来说的话,可以了解到它支持多少种通信协议,比如MQTT或者TCP/IP等等。

这个版本我们就做MQTT的通信版本,那么流程图就如下啦。
一个关于小程序Iot的具体实现(MQTT版)

【图片】

准备什么?

选择已有的现成Github资源,本次选用paho.js用来方便MQTT通信

本文将着重讲解小程序与MQTT之间的对接通信,暂未出现API调用

小程序端:你需要一定的小程序开发基础,我这次选择了友人的一个Github项目作为我小程序的Demo

后台端:使用SpringBoot+Netty做一个对接MQTT和小程序的小的Iot中心

MQTT硬件模拟端:我选用了Github权威的Eclipse的paho,mqtt.java作为模拟

很简单,你需要实现的就是核心的后台端也是你最擅长的Java端。

先简后难

当你的职位做到一定的程度后,你可能需要做的不是去写底层详细的实现代码,而是一个这样实现的模板或者思路与流程,所以我们暂时先做一个简单版的小程序到硬件之间的通信流程。

netty很好,这里我不多说,因BAT大厂对高级的定义一般也是需要了解到Netty的源码程度等。那么你需要基于SpringBoot去加Netty,自定义对应的编解码内容,由于我们使用的paho,所以有它本身的一些格式,大致的思路就是定义协议规范,通信这块其实相较简单因为很大一部分netty其实已经帮你做好了。

小程序的socket通信是ws的开头,那么我们的Iot中心也需要有ws的通信通道。

这里我们的通信地址是:ws://localhost:8094/mqtt

并未使用wss,一样的说法吧,先把简单的实现了再想复杂的。

那么小程序对应也是连接这个地址,小程序可以调式下启动连接,而Mqtt的Java硬件模拟端也是同一个地址的连接。

对于MQTT而言,小程序需要去订阅一个主题,Java模拟端也正对这个主题去发送信息,如果两端都发送接收正常且都通过了我们的Iot中心,那么我们的这个小项目就是已经成功啦!

效果

一个关于小程序Iot的具体实现(MQTT版)
一个关于小程序Iot的具体实现(MQTT版)一个关于小程序Iot的具体实现(MQTT版)一个关于小程序Iot的具体实现(MQTT版)

GitHub

本文的相关全部源码已经放到了GitHub项目上的paho-mqtt项目上了

地址:paho-mqtt
项目介绍:基于Netty4与SpringBoot,聊天室WebSocket(文字图片)加API调用Netty长链接执行发送消息(在线数、用户列表)、Iot物联网-MQTT协议、TCP/IP协议单片机通信,异步存储聊天数据


一个关于小程序Iot的具体实现(MQTT版)

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这