文章目录
前言
春节返工后,我就开始规划这个项目。契机源于春节期间,我发现老家竟开了近十家自助棋牌室,而且朋友也有意投入。更巧的是,年初时我还借助《腾讯混元大模型帮我开发一个自助棋牌室系统》。身为程序员的我,在思考了自助棋牌室背后的技术需求后,嗅到了一丝丝商机:何不开发一个自助棋牌室系统?转眼已过半年之久,借腾讯云开发社区《年中回顾特别季》这个机会,在此分享项目开展过程、遇到的问题以及解决方案,同时也期待能遇到志同道合的伙伴。
技术调研
项目启动的第一个工作就是了解自助棋牌室系统实现需要的技术,明确涉及的技术领域现状并进行选型,所以第一步进行了技术调研。
涉及到的技术
在我看来,自助棋牌室系统功能特别简单,用户在小程序上选择房间下单后,给该房间自动通电,时间到了自动断电即可。
相关技术涉及以下几部分:
- 因为用户需要在手机上下单,所以涉及到前端技术。
- 后端就不用说了。
- 用户下单后需要自动控制房间电源,涉及到物联网技术。
由于本人一直从事后端开发,前端已经有几年没有关注过,物联网技术更是没接触过,所以重点在这两部分。
前端技术调研
前端只考虑小程序,毕竟只有我一个人开发,如果涉及到其他终端开发成本、维护成本可就太高了。再一个小程序的受欢迎程度还是相当高的,而且支付这块小程序有天然的优势。
因为几年没有碰过前端了,所以花了一天了解了下现在比较流行的几个前端框架:vue、react、flutter、uni-app以及微信原生开发。
其中uni-app中的一篇文档《白话uni-app》对传统的前端开发和使用当前流行的前端框架开发的区别给出了非常详细的说明。比如,两者在工程结构、js、css的变化以及对应的关系。对于像我这样几年没有接触过前端的开发人员来讲可以说是非常友好了。
而且了解到uni-app这个框架编写一套代码,可发布到各小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)多个平台,所以,小程序开发选择了uni-app这个框架。
后端技术调研
本身一直是做后端开发的,各路门清,所以也不存在调研。后端涉及到管理系统以及小程序的API,选择了比较火的若依开发框架。
物联网技术调研
至于物联网,当时的状态是:听说过没见过。
针对自助棋牌室系统涉及到的如何实现远程控制房间的电源开关或插座,在网上一顿摸索后有几个方向:
- 使用第三方物联网平台,提供设备和开放平台,可以说不用理会物联网相关技术。
- 找一个开源的物联网平台进行商业授权,购买指定的设备进行绑定。
- 自行购买设备进行开发。
基于我的情况,第一种无疑是最理想的,但是贵呀,设备贵、接口对接10000+/年。
而开源项目的商业授权也得10000+,加上技术支持啥的也得不少钱。
如果采用这两种方案,我的商业计划还没开始呢就搭进去不少钱。而自己开发一个智能开关所需要的元器件也就10几元,所以果断选择自己开发。
自己开发智能开关等设备就得学习相关知识了。不怕大家笑话,第一次知道插座还分10A、16A,什么是交流电、直流电。
目前了解到实现远程控制开关的知识有:
- 通过继电器可以控制开关闭合。
- 继电器结合ESP8266可以实现远程控制。
- 基于Arduino开发工具进行C/C++编写如何控制硬件的代码。
- 可以通过Mqtt、TCP协议和互联网进行通讯。
- 通过烧录器将代码写入硬件设备,实现远程控制开关。
物联网技术POC
开发设备清单
在了解智能开关技术调研之后,就立刻在网上买了相关的设备进行验证。设备清单:
- 一个ESP-01S模块。
- 一个ESP-01S专用继电器模块。
- 一把2mm的一字螺丝刀。
- arduino uno开发板套件。
搭建开发环境
基于ESP8266开发远程控制开关(有多种选择),需要搭建ESP8266开发环境以及开发工具,这里使用Arduino IDE作为开发工具。
Arduino + ESP8266 开发环境搭建网上一大堆,我这里就不多赘述了。
我是mac电脑,跟着这个教程搭建的开发环境,大家可以参考一下。不过需要避免踩坑(下面有说明)。
实现远程控制开关
开发环境搭建完成后,就可以打开Arduino IDE使用C语言进行编程了,此时会看到setup()
和 loop()
这两个函数。
从软件开发的角度来看:
setup()
就相当于main
函数,通常在程序启动时做一些初始化配置。这里可以理解成为:在硬件设备通电后立即执行一次。loop()
则是在setup()
运行完后不断地循环运行。
要实现远程控制,那么设备就需要联网,然后接收命令进行控制。
所以在setup()
中要做以下几件事:
- 连接Wi-Fi。
- 设置控制设备的端口(也叫数字引脚)。这里就是ESP-01S模块的GPIO0端口,最终会通过GPIO0来控制继电器是否通电。
- 设置设备的通讯方式。这里基于TCP协议和设备进行通讯。
代码如下:
#include <ESP8266WiFi.h>
#define RELAY 0 // ESP-01S模块的GPIO0端口
const char *ssid = "WiFi SSID"; // 设备要连接的Wi-Fi名称
const char *password = "WiFi password"; // 设备要连接的Wi-Fi密码
WiFiServer server(80);
//硬件通电后自动执行一次
void setup()
{
pinMode(RELAY, OUTPUT); //设置GPIO0端口为输出模式
digitalWrite(RELAY, LOW); //初始化继电器为关闭状态
WiFi.begin(ssid, password); //进行WiFi连接
server.begin();//启动一个Web服务器,监听80端口
}
到这里Web开发人员应该就很熟悉了。Web服务器启动成功后,就可以接收参数,然后根据参数对GPIO0端口进行高电压、低电压的输出,从而达到远程控制的效果。
这些代码在 loop()
进行编写,关键代码如下。
//setup()执行完成后循环执行该函数
void loop()
{
WiFiClient client = server.available();
if (!client)
return;
String request = client.readStringUntil('\r');
client.flush();
if (request.indexOf("/RELAY=ON") != -1) {
digitalWrite(RELAY, LOW);//低电压关闭
}
if (request.indexOf("/RELAY=OFF") != -1) {
digitalWrite(RELAY, HIGH);//高电压通电
}
}
需要完整的代码请私我。
代码烧录
代码烧录就是通过烧录器将刚才的代码烧写到ESP-01S模块的芯片上,这样ESP-01S模块在通上电后就可以执行代码了。
烧录时只需要将ESP-01S插入烧录器中(下图左),烧录器连接电脑USB,然后在Arduino进行上传(下图右)即可。
烧录完成后,复位 ESP-01S(设备上的一个按钮),通过串口监视器可以查看ESP-01S 的 IP 地址。
此时在浏览器上输入该IP,出现下图页面意味着烧录成功
避坑
由于缺乏物联网相关知识,从购买设备到实现功能的过程踩了不少坑。遂特此记录,希望能够为和我一样在物联网道路上摸索的小伙伴们提供一些参考。
设备的坑
在买设备之前已经了解过,实现一个远程控制开关需要用到继电器和ESP8266,相关的远程控制代码需要一个烧录器烧到ESP8266芯片上。在某宝上一番了解后就在一家店铺购买一个继电器,一个ESP-01S模块,还有一个烧录器。
设备到手后立刻去安装开发环境准备开发,不出意外的话要出意外了。两个意外:
-
继电器连线端子的螺丝口太小了,宽度只有2mm(见图),一般家用的螺丝刀都没办法使用。
-
竟然没有连接继电器的线!!!这个属实没有想到。
于是乎,购买了2mm的一字螺丝刀和arduino uno开发板套件。
驱动的坑
在代码烧录的时候,报了个错A fatal esptool.py error occurred: Failed to write to target RAM (result was 0107)
大家都知道,新人在遇到问题的时候很懵逼的,根本无从下手。好在一位博友(@Grayson_Zheng)的解答下,问题才得以解决。
说明:这个问题和烧录器芯片有关系,我按照教程安装的是cp210驱动。在博友的解答下,才得知我购买的烧录器芯片是CH9102F,这个型号大家可以在烧录器上看到。
不过芯片上的字体太小了,如果不是我这5.3的眼睛,根本看不清。
下载CH9102F驱动后,成功烧录。
需求分析
在对自己不熟悉的技术领域完成测试验证后,也算是前进了一大步。
随后对自助棋牌室系统的需求进行分析,经过几天不全面的线下考察,以及市面上很多成熟的竞品对比,明确了项目需要实现的功能。
用户端功能需求
自助棋牌室系统的使用对象主要就是用户,从用户的角度出发,需要支持以下几个功能:
- 一键登录注册:用户端目前主要考虑小程序,一键登录注册,尽量减少不必要的操作。
- 门店选择:根据用户的定位由近到远显示商家的门店信息,提供用户选择。
- 预约:选择门店后就可以查看各房间的状态及信息并进行预约,可以提前预约减少等待时间。
- 支付:预约时可以选择不同的支付方式进行支付,比如储值卡、微信、卡劵、线下等。
- 开门:支付成功后则预约成功,在预约的时间内可以通过小程序进行开门进入房间。
- 续费:当用户的服务时间即将到期时,可以通过小程序进行续费续时操作,确保服务的无缝衔接。
商家功能需求
从商家的角度出发,需要支持以下几个功能:
- 品牌管理:商家可以创建自己独立的品牌。(当然,小程序也需要单独部署)。
- 门店管理:商家的门店管理会涉及到几个功能:
- 添加门店:只有独立品牌的商家可以添加多个分店或者作为加盟商添加加盟店。
- 设置门店信息:所有的商家都可以设置自己门店信息,包括店名、地理位置、轮播图、文案什么的。
- 门店续费:每个门店涉及到软件服务费,所以临近到期时可以进行续费操作,否则小程序将不显示该门店。
- 房间管理:每个门店下可以管理自己房间,包括:
- 添加/删除房间:商家可通过添加删除操作控制小程序显示的房间信息。
- 设置房间信息:商家可以自己房间的信息进行维护,包括基本信息、标签等。
- 房间计费设置:每个房间可以设置自己的计费方式及费用,比如小时计费、时段计费、会员价、优惠什么的。
- 设备管理:商家的设备管理会涉及到几个功能:
- 设备添加/删除: 用户在小程序进行开门以及房间电源、语音都需要远程控制,这些设备需要在此进行维护。
- 绑定房间:要具体到某个房间设备的远程控制,需要与房间进行绑定,建立关系。
- 营销管理:通商家可以通过营销管理设置一些活动优惠吸引更多的用户,比如储值卡赠送、优惠卷赠送等。
- 订单管理:订单是商家营业最重要的数据,商家可以通过订单管理查看订单数据及状态。
- 营业数据:商家通过营业数据直观的看到每天的订单量、收入等营业数据。
目前考虑商家分为小程序端和PC端,小程序中展示一些关键数据及操作,比如门店的营业数据和营业报表,也可以通过小程序远程控制房间设备等。
系统管理功能需求
系统管理功能除支撑用户和商家的功能外,还要有一套权限管理功能,包括用户管理、角色管理、菜单管理等。因为商家的入驻、加盟以及相关的业务数据可以通过权限设计进行数据隔离,实现一个多租户系统。
架构设计
在完成技术调研、POC、需求分析后,我针对项目架构进行了初步的思考,从开发模式到后期维护进行了全面的梳理。
一定要上微服务吗?
前两年的市场绝对是微服务的天下,开发个什么系统,动不动就是微服务,几乎已经成为每个项目的标配。
在我看来,微服务只适合业务规模大、团队规模庞大的项目。主要是一个大项目在单体应用下确实会存在很多问题,就像2007年的淘宝网一样:
整个淘宝网是一个几百兆字节的WAR包,大大小小的功能模块超过200个。几百人维护一个WAR包就会带来很多问题:
- 项目团队间协同成本太高,业务响应越来越慢。
- 应用复杂度超出负载认知,没有一个人能完全清除每一个功能和业务流程。
- 数据库连接能力很难扩展,数据库的连接数量会随着应用实例的增加而捉襟见肘。
- 错误难于隔离,任何一个小的问题都会造成整个实例崩溃。
- 应用扩展成本高,通常出现业务瓶颈时都是某几个功能模块影响的,但是需要增加一个完整的应用实例,带来的是额外的资源消耗。
每一次的功能升级都要牵一发而动全身,这种情况下就不得不拆分系统。
自助棋牌室系统或者说是无人看守门店系统,一个小小的项目,功能并不多。所以,单体架构,足矣。否则,带来的只有繁琐的开发部署流程以及高昂的运维成本。
上真正的“云”:云托管
虽说是单体应用,但也是可以具备高可用、高并发能力的。除了程序自身的性能外,还需引入很多机制来辅助。例如实施负载均衡、实现数据库的读写分离以及确保应用实例的弹性扩缩容等。
但是,这些机制的引入会消耗自身的一些精力,尤其是后期复杂的维护工作。鉴于该系统后期的维护就我一人,为了降低维护成本果断上“云”,上“真正的云”。
在了解小程序开发期间,我发现了云开发和云托管这两个强大的工具。如果说云开发是专为小程序开发量身打造的,那在我看来,云托管可以算是真正的“云”了。
简单来讲,云托管就是:把你的程序交给云管理,免去人工运维。具体体现在以下几点:
- 自带功能:云托管自带监控告警、日志服务等后期运维所需功能。
(实现哪个功能不需要工作量?) - 自动扩缩容:根据流量多少和自身承载消耗动态的进行扩缩容,从而保证服务高可用、高稳定,也无需为闲置资源付费。
(既不用自己管理计算节点又可以避免额外的资源成本,而且,高可用和高并发是不是解决了?) - DevOps自动化: 提供流水线能力,可以实现从代码仓库到服务发布的全自动流程。还提供灰度发布、版本回滚这样的部署能力。
(不用自己打包部署或者自己搭建DevOps环境)
就是说,单单这三点能为我省去多少工作量。如果应用部署到云服务器上,哪一个工作量不够我喝上一壶?我还用担心半夜的服务监控告警吗?
当然,云托管不只是对应用程序的托管,还提供了Serverless形态的Mysql,也可自动扩缩容,避免产生瓶颈。
(又省了Mysql的运维工作)
不过,这都不是重点,重点是云托管还提供了免费的CDN和DDoS防护。
技术架构
项目依托云托管,所以整体的复杂度会小很多。
在物联网方面,还是考虑接入物联网开发平台。真得会减少很多工作量和后期的维护,而且像国内的这几个云厂商都是有公共免费的额度可以使用,所以在开发阶段不会投入成本。
下面是整个项目的技术架构图
项目当前进展
由于个人时间以及精力有限,目前仍在开发阶段,具体情况如下:
- 商家后端功能基本开发完成。
- 物联网相关已接入某云平台。
- 小程序开发进度10%,主要是头疼前端UI。
最后
“一个人的力量是有限的,但是一群人的力量是无限的。”,还是希望找到志同道合的伙伴,如果对这个项目感兴趣,请联系我。