文章目录
18届985小硕,入职刚满一年,本科研究生都是嵌入式方向,跟着研究生导师做过好几个嵌入式项目,写过驱动画过四层单板,也在一些公司实习过,个人对嵌入式比较感兴趣。入职后被随机分岗,搞了一年JAVA微服务开发,目前想从事嵌入式方向,考虑到自己入职后没有搞嵌入式,在简历上不占任何优势。鉴于此,从上周六开始到今天共6天,每天下班回来熬夜做完了这个“基于微服务和mini2440的WebSocket B/S视频监控及MQTT物联网应用系统”,以便回忆以前的嵌入式知识和总结现阶段所学知识。希望能获取面试的机会吧!
一、系统基本组成架构
浏览器和微服务之间,图像数据采用WebSocket传输,普通数据采用AngularJs传输。
微服务和嵌入式设备之间,图像数据采用Socket传输,普通数据采用MQTT传输。
浏览器和后台建立WebSocket连接,接收并显示后台的监控图像。Mini2440将Camera数据压缩成jpg,并通过Socket上传到服务器,Website微服务将数据通过Websocket发送给浏览器显示。
Mini2440采集到的温度信息通过MQTT发布,MQTT微服务订阅来接收数据,这就是整体的组成框架了,限于时间和能力,系统比较简陋,其实视频传输更好的做法的是基于RTSP等流媒体协议进行视频传输。
二、Spring Cloud微服务
微服务简介
Spring Cloud微服务基于Spring Boot框架,具有约定大于配置的特点,组件丰富,功能齐全,Spring提供https://start.spring.io/ 来辅助搭建微服务,可以通过Gradle和Maven进行项目管理,微服务搭建起来非常方便。
系统的微服务组成框架
基于Maven作为项目管理工具,共搭建了五个微服务,分别是Eureka服务发现、Zuul网关、Sleuth+Zipkin日志跟踪、User微服务、MQTT微服务和WebSite微服务,微服务以Jar包的形式运行,其实更好的做法是发布镜像,基于k8s和docker进行部署,主要关注WebSite微服务和MQTT微服务,MQTT微服务通过mosquitto代理服务器,来订阅嵌入式设备发布的数据。图片数据基于WebSocket进行传输,普通的数据基于AngularJS传输,实现MVC视图控制分离,前台基于BootStrap进行界面样式配置和布局。
Spring Cloud集成WebSocket
1、pom.xml中添加依赖
<!--websocket-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
2、添加注解@ServerEndpoint("/websocket")、@OnOpen、@OnMessage、@OnError和@OnClose等,代码有点长,只贴部分代码说明,后面会附源代码
如果Socket连接有多个网卡,可以通过如下方式指定:
server = new ServerSocket(port,5,InetAddress.getByName (“192.168.1.1”));
img控件通过data显示图片:
document.getElementById(“pic”).src = ‘data:image/jpg;base64,’+msg.data;
Spring Cloud集成MQTT
MQTT是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件 。消息中间件有非常多种,比如activem、 rabbitmq、mosquitto等,我选用mosquitto作为消息中间件。
mosquitto是一款实现了消息推送协议 MQTT v3.1 的开源消息代理软件,C语言开发,提供轻量级的,支持可发布/可订阅的的消息推送模式。
mosquitto服务器的搭建可以参考: https://blog.csdn.net/pjlxm/article/details/79967322
技巧:可以通过Chrome插件MqttLens进行调试,调试教程参考:https://blog.csdn.net/u013022210/article/details/79626682
Spring Cloud集成MQTT参考: https://segmentfault.com/a/1190000017811919?utm_source=tag-newest
参考的MQTT集成教程里,仅提供了mqtt发布的方法,我这里写一下MqttClient订阅的方法:
新建一个MsgRead类,通过调用该类的connect方法即可同mqt