优化运营:EMQX在自助洗车项目中的实践应用

本文正在参与 EMQ 征文活动

首先简要介绍业务流程,方便文章后续观看。

流程:门店提供洗车设备,然后基于小程序通过车牌识别、扫码等方式开启卷帘门并控制水电,系统开始计费,结算通过倒车识别、结算按钮、扫码等方式关门、断电。

1. 自助洗车项目的背景和目的

项目开发缘由是一个表弟看到我们市里某品牌自助洗车做的火热想加盟,一问价格加盟费用需要2~3万,正好去年因为口罩原因在家,所以提议自己开发一个。

目的是为解决人工洗车费用高,且不能随时洗车的问题,当然最终的核心是挣钱 :joy:

2. 方案选型

对于一个专业做物联网的单看流程会觉得实现起来很简单,但本人一直是做java后端开发,软件计费、小程序开发这些都不是问题,但对于硬件、物联网这些一窍不通。主要是通过后端程序控制门、电这是一个很大的问题,所以接下来将围绕如何解决这个问题来说下开发中的经历。

首先,去市场上看这家品牌用的什么方案,发现它是门口放一台车牌识别器相机,店里放一台电脑。那首先去买车牌识别相机,刚开始不懂在本地花了高价,而且这个机器已经是几年前的淘汰产品了,买回来后这销售公司也是垃圾,一点服务没有,问他们技术人员显示屏文字如何修改?他们说改不了,还在微信群里互相一口一个总,现在想起这些人还觉得恶心,很郁闷这样的公司如何生存到现在。然后问相机厂家拿到了开发文档,大概看了下相机支持有http,本地sdk调用。

  1. http是首先排除的。http是通过轮询的方式,相机识别到车牌后会及时通知给服务端程序,但是如果后端要实时的控制门的开启,则会有延迟,所以首先排除
  2. 本地sdk。我猜想市场上那家店里需要放电脑是因为他们是通过sdk调用开发,所以刚开始也采用了此方式对接。但是本地sdk开发后,通过局域网连接相机是可以实现控制了,如何和服务端通信呢?最后想了一个办法就是自己再包装一下,写了一个websocket的程序和服务端通过制定好的规则实时通讯来发送指令给相机,然后做了开机自启,断线重连,这样也完美实现了,并且非常稳定。但这个方案在后期有很大的弊端,就是如果后台代码升级更新通讯后,必须连带修改这里再部署到电脑上。(这个方案直到现在还有一个店在用,因为不想增加更换相机的成本)
  3. mqtt。当时还不知道mqtt是什么

3. 方案优化

运营稳定后,就在考虑是不是有更好的方案支持,随即在网上查询,无意间看到有文章说MQTT是物联网间最常用的通讯协议,就开始搜索资料,看到EMQX,查阅了文档后当时也没当回事。因为相机层面不支持看了也没用。后来要开新店了,在网上买了一台新的车牌识别相机,打开控制台发现新的相机是支持MQTT的,所以就又开始查阅EMQX文档开始开发。第一个版本用的是4.4.X,然后像是发现了一个新大陆,代码经过升级后,不仅开发运营方便了,店里也不需要购买电脑增加额外的成本。期间还写了博文分享。在这里就不做陈述,有兴趣的可以看EMQX中如何监听客户端上下线?

4. 升级V5以及期间出现过的小问题

4.4运营一直很稳定,在一次部署项目时拉取镜像包,发现EMQX升级了V5。查阅文档发现V5增强了很多,在我看来最主要的是在配置方面的优化。4.4旧版本认证、上下线通知等都需要开启插件,在配置文件修改,操作比较麻烦。升级后增强了dashboard(web管理界面),好多插件都成为内置插件,无需开启,且很多操作无需进入配置文件,直接在web即可配置。V5上线后,我需要配置webhook上下线在网上一直没有成熟的文档,经过实践当时还分享了一篇MQTT EMQX v5.0版本监听客户端上下线通知、认证、授权。新的项目一直就开始使用5.0.X,接下来将说下升级后出现的小问题。

  1. 第一个出现的就是因为每次部署时候喜欢采用新版本,记得5.0.21(或者22,记不太清了),因为那段时间eqmx升级比较频繁,估计我拉取了一个不成熟的镜像使用,配置的时候会保存失败,后来经过自己查看配置文件解决了,写了篇文章400 BAD_REQUEST:<<“{config_update_crashed,{badmatch,{error,{scan_invalid_utf8, EMQX v5 设置出错解决方法

  2. 第二个是因为业务需要知道设备状态,所以用了webhook,配置webhook的时候选择了异步发送,我想这样性能更好,可是后台的设备在线状态完全乱了,明明在线的,却显示成了离线,后来连续从5.0.22 到25都试了一直有这个问题,没办法从论坛发了帖子,技术支持人员也比较负责,经过测试后确实发现了这个问题还做了回复。有兴趣的可以看 5.0.2x 版本 Webhook桥接客户端上下事件状态不一致问题,这个问题其实我到现在也不知道解决没有,我猜想这个问题如果做了异步应该是不好解决的。只能改用同步的方式解决目前的问题。

5. EMQX带来的好处

使用EMQX只需要关心业务即可,不需要考虑中间如何通讯,这样大大节省了开发精力。项目的初期比较简单,就是通过车牌识别控制门、水电,可是有些门店不需要放车牌识别器怎么办?然后发现网上买开发版,基本都支持MQTT,所以项目又集成了另外的开门方式,通过策略模式,增加新的通讯方案,可以说一套程序已经不限于某一种方案,可以支持市场上90%以上的自助洗车方案。这样对于以后不管开发还是运营都更简单、方便。

6. 结语

其实文章开始更多的想分享EMQX在项目中的应用代码和实际中碰到的问题来回报EMQX。奈何文笔实在有限,写到最后回看发现只是一篇项目开发的过程经历。如果写些具体的如何控制门、水电好像又太关联项目了,写些其他的吧,因为项目中只用到了设备认证、授权、webhook,在第三方链接中该说的都已经说了,暂时又想不到,就这样吧。

最后是真心的感谢EMQX,让我开启了一扇新大门。通过EMQX间接学习了很多新的知识,让我知道了如何控制硬件,知道了门开启、以及一些常用设备的控制原理,以至于现在看到道闸、门禁、充电桩、自动售货机等,内心都会有一种:‘我知道它们怎么回事,我也会做,我也可以做’的奇怪想法 :sweat_smile:。也希望我们的开发者通过EMQX做出更多有趣、有用的产品来回馈社区。祝福EMQX越来越好,共勉。

1 个赞