春节返工后,我就开始规划这个项目。契机源于春节期间,我发现老家竟开了近十家自助棋牌室,而且朋友也有意投入。更巧的是,年初时我还借助《腾讯混元大模型帮我开发一个自助棋牌室系统》。身为程序员的我,在思考了自助棋牌室背后的技术需求后,嗅到了一丝丝商机:何不开发一个自助棋牌室系统?转眼已过半年之久,借腾讯云开发社区《年中回顾特别季》这个机会,在此分享项目开展过程、遇到的问题以及解决方案,同时也期待能遇到志同道合的伙伴。
项目启动的第一个工作就是了解自助棋牌室系统实现需要的技术,明确涉及的技术领域现状并进行选型,所以第一步进行了技术调研。
在我看来,自助棋牌室系统功能特别简单,用户在小程序上选择房间下单后,给该房间自动通电,时间到了自动断电即可。
相关技术涉及以下几部分:
由于本人一直从事后端开发,前端已经有几年没有关注过,物联网技术更是没接触过,所以重点在这两部分。
前端只考虑小程序,毕竟只有我一个人开发,如果涉及到其他终端开发成本、维护成本可就太高了。再一个小程序的受欢迎程度还是相当高的,而且支付这块小程序有天然的优势。
因为几年没有碰过前端了,所以花了一天了解了下现在比较流行的几个前端框架:vue、react、flutter、uni-app以及微信原生开发。
其中uni-app中的一篇文档《白话uni-app》对传统的前端开发和使用当前流行的前端框架开发的区别给出了非常详细的说明。比如,两者在工程结构、js、css的变化以及对应的关系。对于像我这样几年没有接触过前端的开发人员来讲可以说是非常友好了。
而且了解到uni-app这个框架编写一套代码,可发布到各小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)多个平台,所以,小程序开发选择了uni-app这个框架。
本身一直是做后端开发的,各路门清,所以也不存在调研。后端涉及到管理系统以及小程序的API,选择了比较火的若依开发框架。
至于物联网,当时的状态是:听说过没见过。
针对自助棋牌室系统涉及到的如何实现远程控制房间的电源开关或插座,在网上一顿摸索后有几个方向:
基于我的情况,第一种无疑是最理想的,但是贵呀,设备贵、接口对接10000+/年。
而开源项目的商业授权也得10000+,加上技术支持啥的也得不少钱。
如果采用这两种方案,我的商业计划还没开始呢就搭进去不少钱。而自己开发一个智能开关所需要的元器件也就10几元,所以果断选择自己开发。
自己开发智能开关等设备就得学习相关知识了。不怕大家笑话,第一次知道插座还分10A、16A,什么是交流电、直流电。
目前了解到实现远程控制开关的知识有:
在了解智能开关技术调研之后,就立刻在网上买了相关的设备进行验证。设备清单:
基于ESP8266开发远程控制开关(有多种选择),需要搭建ESP8266开发环境以及开发工具,这里使用Arduino IDE作为开发工具。
Arduino + ESP8266 开发环境搭建网上一大堆,我这里就不多赘述了。
我是mac电脑,跟着这个教程搭建的开发环境,大家可以参考一下。不过需要避免踩坑(下面有说明)。
开发环境搭建完成后,就可以打开Arduino IDE使用C语言进行编程了,此时会看到setup()
和 loop()
这两个函数。
从软件开发的角度来看:
setup()
就相当于main
函数,通常在程序启动时做一些初始化配置。这里可以理解成为:在硬件设备通电后立即执行一次。loop()
则是在setup()
运行完后不断地循环运行。要实现远程控制,那么设备就需要联网,然后接收命令进行控制。
所以在setup()
中要做以下几件事:
代码如下:
#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的一字螺丝刀和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包就会带来很多问题:
每一次的功能升级都要牵一发而动全身,这种情况下就不得不拆分系统。
自助棋牌室系统或者说是无人看守门店系统,一个小小的项目,功能并不多。所以,单体架构,足矣。否则,带来的只有繁琐的开发部署流程以及高昂的运维成本。
虽说是单体应用,但也是可以具备高可用、高并发能力的。除了程序自身的性能外,还需引入很多机制来辅助。例如实施负载均衡、实现数据库的读写分离以及确保应用实例的弹性扩缩容等。
但是,这些机制的引入会消耗自身的一些精力,尤其是后期复杂的维护工作。鉴于该系统后期的维护就我一人,为了降低维护成本果断上“云”,上“真正的云”。
在了解小程序开发期间,我发现了云开发和云托管这两个强大的工具。如果说云开发是专为小程序开发量身打造的,那在我看来,云托管可以算是真正的“云”了。
简单来讲,云托管就是:把你的程序交给云管理,免去人工运维。具体体现在以下几点:
就是说,单单这三点能为我省去多少工作量。如果应用部署到云服务器上,哪一个工作量不够我喝上一壶?我还用担心半夜的服务监控告警吗?
当然,云托管不只是对应用程序的托管,还提供了Serverless形态的Mysql,也可自动扩缩容,避免产生瓶颈。
(又省了Mysql的运维工作)
不过,这都不是重点,重点是云托管还提供了免费的CDN和DDoS防护。
项目依托云托管,所以整体的复杂度会小很多。
在物联网方面,还是考虑接入物联网开发平台。真得会减少很多工作量和后期的维护,而且像国内的这几个云厂商都是有公共免费的额度可以使用,所以在开发阶段不会投入成本。
下面是整个项目的技术架构图
由于个人时间以及精力有限,目前仍在开发阶段,具体情况如下:
“一个人的力量是有限的,但是一群人的力量是无限的。”,还是希望找到志同道合的伙伴,如果对这个项目感兴趣,请联系我。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。