项目导图:
2023/7/21:请注意,由于插件更新迭代,您在复制该项目的过程中可能会出现诸多问题,这是正常的,若有无法解决的请与我联系一同解决(1638779636@qq.com),我在此处简要概述可能遇到的问题:
1.插件中无法找到2.0版本python项目管理器,由于插件不断更新,2.0版本的下载渠道已经无法找到,您可下载最新版本2.5。
2.python项目管理器2.5版本在创建项目后无法自动下载依赖库,表现为提示正在安装依赖库,可点击项目右侧库文件中仅有少数库,该问题会导致项目无法正常使用,解决方法: 在项目根目录找到下图文件并将该文件中的库一一进行下载安装:
注意:模块版本留空。
项目简介:
有时候会遇到特定的场所,比如学校,这种场所通常覆盖无线网络,一般情况不让带手机,那么如果在校外的A同学需要向在校内的B同学传递消息,而又不通过其他方式的情况下,那么我的设备就有用了,实际上也是因为这个原因我才做这个设备的,下面我会按照项目导图的顺序分别说明硬件、软件、服务器端。
硬件设备QucikChatBox :
硬件设备担任着客户端的角色,它同时也是信息的发送者和接收者,在对该设备进行初始化配置后,设备会自动连接网络并从服务器端拉取数据并进行处理。
A.实物图如下:
B.硬件构成:
1.充电管理与修改充电电流:
设备使用TC4056A作为锂电池的充电管理芯片,选择该芯片一是因为兼容TP4056,二是因为便宜。
在电路中,该芯片引脚PROG的接地电阻阻值改变充电电流,该电阻阻值在原理图中默认3K(充电电流400mA),建议该电阻阻值不大于4K,您可根据电阻与充电电流关系表自行改变充电速度.
图二右侧框内的LED为充电指示引脚,亮起代表充电中。
(电阻与充电电流关系表)
(TC4056A在原理图中位置)
2.锂电池选型:
影响锂电池规格的主要有两个参数,一个是续航,我认为在空间允许的范围内越大越好。另一个放置电池的空间,这与设备外壳的预留空间有关,锂电池宽度取决于预留空间的宽度,锂电池的高则取决于四周螺丝孔柱的高。
预留区参数:高 <= 13mm 宽 <= 42mm
*选择锂电池时请不要超过该范围,我选择的锂电池规格803040-1000mAh作为参考.*
模型如下,红色框为预留区:
3.OLED显示屏选型:中景园1.3寸OLED显示屏,tb关键字如下:
4.微动按钮:按钮定义如下:
GPIO
状态触发
响应类型
按钮1
GPIO13
低电平触发
向上翻阅、返回
按钮2
GPIO14
低电平触发
确定
按钮3
GPIO12
低电平触发
向下翻阅、下一步
5.主控芯片 ESP8266EX :
选择主控芯片前,我要考虑在这个设备都要有什么功能,1.设备能连接wifi 、2.可以连接OLED显示屏、3.有足够的IO进行按键监测和LED状态显示、4.有ADC,可以检测电压,ESP8266满足这些要求,并且可以用Arduino快速开发,其次,该芯片的市面价格最低可以到2.5元、算上外围电路也只有3.5-4元左右(大概),价格较友好。
6.ADC获取锂电池电压 :
当锂电池电量不足,设备会在屏幕上显示电量不足用于提醒使用者充电,另外当向服务器请求数据时会将电压作为参数上传,在目前,该电压取的近似值与实际电压相差约0.1v,上传至服务器的电压会作为返回值给到对应账号的Anroid端QuickChatApp,详情请结合代码。
ESP8266 ADC 引脚具有10 位分辨率,可以获得值范围为 0 - 1023,因此要检测电压最大为4.2V的锂电池,需要建立ADC分压电路,原理图如下:
6.充电指示灯与 状态指示灯:
上文的实物图中可以看到按钮下方有两个LED。
左侧为充电状态指示灯,当TypeC口有外部电源接入时,设备开始充电,该状态灯亮起,当电量满或者外部电源移除时为灭。
右侧则是状态指示灯,该灯连接到主控的GPIO2引脚,当上点电时该灯闪烁一次,其他情况我还没想好。
7.固件烧录说明:
这里要提一嘴Flash大小的问题,在原理图中我使用的是GD25Q32CSIG,这是我建议的合适Flash大小,其它较小的储存芯片请自行测试使用。
设备上预留了一排烧录孔,该烧录孔的定义已在旁边标出:
烧录孔不能让设备与电脑直接相连进行烧录工作,因此我们需要准备一个串口转TTL烧录器,在这里使用的是我自己的烧录器,同时也是另一个开源项目 https://oshwhub.com/zhbaa/c340-chuan-kou-gong-ju,该烧录器的引脚定义与烧录孔相对应。
我们还需要了解一下ESP8266如何进行烧录,该芯片进行固件烧录的前提是GPIO0引脚在上电时为低电平(工作模式为高电平)。
1.首先我们需要下载Arduino 1.X版本,项目的硬件设备就是用Arduino进行编写的,请注意不要下载最新版2.X的Arduino。
第一种下载方式:点击蓝色字进入Arduino官网进行下载Arduino官网,在该界面向下翻阅,找到旧版本,如下所示进行下载和安装(安装我就不多说了):
2.安装完成之后我们需要为Arduino安装ESP8266FS插件,设备的静态资源(例如html)通过该插件进行上传,在Arduino2.0版本中我暂时没找到版本安装该插件,这是我建议安装旧版本的原因。在项目的附件压缩包中找到ESP8266FS文件夹,将ESP8266FS文件夹整个移到你的Arduino安装目录的tools文件夹下:
3.打开Arduino,配置ESP8266开发环境,这一步参考博客 Arduino搭建Esp8266开发环境(两种方法)
4.添加依赖库,项目所用到的依赖库有两种,一种是可以在arduino管理库中直接搜索并安装的,另一种是需要通过zip进行导入的,它们的入口都在左上角的项目->加载库中:
先点击管理库,搜索并安装如下库,注意版本:
再点击添加ZIP库并选择压缩包导入,这两个zip库已上传至附件:
1.使用arduino打开QuickChatBox1.0V.ino文件,点击下图所示按钮进行程序验证:
若验证成功则如下图所示:
如果弹出红色报错,请参考上方的依赖库添加,看看是不是忘了哪个步骤。
2.将数据线与烧录器进行连接,将烧录器上的GPIO0引脚电平切换开关置于GND一侧,数据线另一端先不插入电脑。
3.将烧录器插入设备的烧录孔后把另一端的USB插入电脑,注意引脚不能插反:
4.此时电脑检测到新设备,打开Arduino左上角的工具按钮,在下方的端口处选择烧录器的串口,不确定是哪个的可以多次插拔看看哪个端口在变化,参数参考如下图:
5.向flash上传静态资源,设备初始化阶段会向外广播AP,使用者通过连接该AP访问ip地址在网页端进行初始化配置,网页的静态资源则通过ESP 8266FS 插件上传,设备缺少该文件无法正常工作,参考上图找到 ESP8266 Sketch Data Upload 并点击,此时开始上传静态资源,状态如下所示:
正在上传中:
上传成功:
6.静态资源上传成功后再进行固件上传,此时重新插拔USB(整个烧录过程中烧录器需要一直顶在烧录孔上),然后点击上传按钮,等待固件上传。
7.固件上传完成,拔掉USB,将烧录器的切换开关置为3v3,重新插入USB,设备界面如下图所示则视为烧录成功:
C.如何使用硬件设备:
1.进入配置模式,若设备未进行初始化配置则自启动AP模式,使用者访问192.168.4.1进行初始化配置,手动进入模式请在关机状态下按住中间按键并启动,演示:
2.连接设备热点并使用浏览器访问 http://192.168.4.1 进行初始化配置,演示如下:
参数说明:
无线网络名称和密码,保存后重启,设备自动搜寻该wifi并连接。
设备密钥,通过软件端进行获取,请参考下文的软件说明。
服务器地址,文章最后提供了一个公共服务器,在此处填写该服务器地址,请注意最后以 / 结尾,关于服务器的私有搭建请参考下文服务器端搭建教程。
3.确认无误点击保存配置并重启,设备自动重启并搜寻初始化配置中的网络且自动连接,在连接成功后则可进行正常使用,如何使用请参考下方的视频,在视频中,我将演示服务器的配置以及通过邮箱进行登录,我准备了两个账号进行好友的申请、互发信息、设备端的发信收信和相关配置的上传、同步,个人有点社恐,所以视频就不说话了。
演示视频
QucikChatAPP(Android端软件程序)
软件程序作为客户端,除了拥有与设备一样的功能外,还可以对设备的各项功能、参数进行修改保存,显示设备电量等等,软件使用AndroidStudio+Kotlin进行开发,对安卓系统版本6以上的手机提供支持,更低的系统版本的可用性未经测试。
在软件中,我引用了一些开源库,下面我只对okhttp进行说明,其他开源库的作用请自行查阅代码:
网络请求框架OkHttp3,软件中使用该框架与服务器进行交互,目前与服务器交互的操作方法都放置在UserBb类中,在该类中,我定义了所有与服务器交互的方法,包括但不限于获取验证码、申请添加好友、取消添加好友、拒绝好友申请、向好友发信,而这些方法大同小异,在该类中定义方法 getOkHttpGetCall ,该方法接收String格式的get请求连接,返回Call对象:
在与服务器交互的方法中,都需要调用getOkHttpGetCall获取call对象,在回调中对服务器返回的数据进行解析处理,以向好友发送为例:
应用功能:
1.设置服务器:
在写这个项目的时候,我构想的是服务器私有部署化,这样就更需要把设置服务器功能单独拿出来。
安装软件,打开软件之后是如下的界面,如果您自行部署了服务器,请点击右下角的“设置服务器”对服务器进行修改。
2.登录或注册账户:参考上面的Login to server界面,在邮箱一栏填写能够接收到验证码的邮箱,点击获取验证码,若服务器地址正确很快验证码就会发送到你的邮箱,微信接受邮件效果:
输入验证码后点击登录或注册并登录按钮,如果邮箱在这个服务器上没有注册过,服务器将自动注册,若存在该邮箱则正常登录,成功后跳转至主界面 MainActivity ,登陆部分完毕。
3.注销账户:注销账户是指删除在该服务器上的关于该账户的所有数据,包括但不限于用户表、作为发送者的所有聊天数据、从所有好友的好友列表中移除、清除DKey、UserKey等一切关于该账户的数据,注销成功后跳转至登陆界面,该按钮在如下图所示右上角区域。
4.数据轮询间隔:数据轮询就是定期向服务器申请最新数据并将其展示出来,在MainActivity界面中,好友的申请信息、未读消息、设备状态、参数等需要不断刷新的数据,这些都需要数据轮询,您可以自定义该轮询的间隔,默认为3秒,如果您服务器的交互速度快可以适当降低该值,若服务器速度慢且刷新间隔短,或导致软件闪退,一般情况3s就OK。
5.收到消息时向邮箱发信:
当收到好友消息时并不会通过系统弹窗进行提示,这个功能也是由于时间关系暂时简化了,替代方案就是当好友向你发送消息时,服务器会通过邮箱向你的邮箱发信进行提醒,目前该提醒无间隔,意思就是好友发多少条消息就提醒多少次,后面我会增加提醒间隔,格式如下:
6.修改硬件设备参数:
在我的使用情境中,可能出现以下几种情况:
1.设备对设备进行消息交互
2.设备对手机进行消息交互
3.手机对手机进行消息交互
这个项目主要针对上面的1、2种情况,第三种就不做讨论了,两个人都有手机了还用这个干什么,下面我会对软件段进行设备参数修改进行说明。
首先要了解一个名词:DKey -> DeviceKey 设备的唯一密钥,每个账户都拥有一个DKey,当对设备进行初始化时DKey是必填项,若设备无此参数,则无法访问服务器。DKey是唯一的,请确保只有自己知晓DKey。DKey可以被重置,当你重置DKey后旧的DKey会被删除,服务器会重新生成新的DKey并返回,而旧DKey的参数会被保留下来,如快捷回复列表、附加网络配置等。
快捷回复列表:上面说明过设备的结构,它只有三个按钮进行操控以完成上翻、下翻、确定等逻辑功能,就目前而言,设备无法进行拼音输入等功能,即使实现也会变得很麻烦,所以我采用的是预填充内容方案,通过软件将想要回复的消息内容上传至服务器,设备再访问服务器同步该回复消息的数据列表以作为回复项,硬限制:每条最多50字,最多200条。
附加网络配置:整个硬件设备的构建以来的就是它的可以进行WIFI通信,这就会产生一个弊端,倘若我换了一个环境,由于设备性质又无法手动更换网络,那么该怎么办,解决这个问题的就是附加网络配置功能,通过软件将固定的地点的WIFI账号密码进行服务器上传,再让设备访问服务器进行保存,设备开机后会搜寻附近中是否存在已保存的WIFI数据,若存在则自动连接。
7.好友管理:我分三个状态进行说明
A.发出好友申请,作为申请人可以使用添加好友功能,通过对方的邮箱向对方发出好友申请,此时处于等待对方同意或拒绝状态,申请人状态如下图所示,您可在此时取消该申请:
B.等待被申请人同意或拒绝该好友申请:作为被申请人接收到来自其他用户的申请,界面如下所示,在此时可以可以选择同意或拒绝该用户的好友申请,若同意则成为好友,显示在好友列表中,拒绝则显示如C所示:
C.作为申请者的好友申请被拒绝,则显示如下界面,此时可点击了解,则该Item被删除:
8.与好友的信息交互:在与其他用户成为好友后,软件会将好友显示在消息列表中,如下图所示:
马赛克掉的是邮箱号,右侧的是在线状态,此时显示暂无消息,说明好友没有新的消息传来,对于好友的消息新旧的状态判断请自行查看代码。
点击View进入与该好友的消息界面,以app 1.0V 为例,界面组成如下:
搭建服务器端(QuickChat Server):
客户端的数据都要经由服务器进行保存、处理、下发,在文章末尾我会提供一个公共的服务器地址以供进行可通性测试,但受限于经济、安全、维护等原因,我不保证该服务器能够长久有效开放,因此建议您搭建自己的服务器。在这里我以华为云为例进行搭建,您也可以选择其他的云服务器厂商,比如阿里、腾讯,它们都有免费体验服务器一个月之类的活动,这里选择华为云是因为其它的都被我白嫖完了。
1.购买服务器: https://activity.huaweicloud.com/free_test/index.html
下翻页面可以看到有不同规格的服务器,这里选择最低配的1核1G就够用了,不过既然是免费的也可选择更高配。
点击0元试用按钮进行购买,在购买页面中需要注意的是镜像,请按下图进行配置:
其他配置项默认即可。
2.点击右上角控制台: 购买服务器成功后点击右上角的控制台
3.在左侧的总览菜单中找到弹性云服务器ECS并点击:
4.此时应该能看到我们刚才新创建的服务器实例,根据华为云的规定,新创建实例需要重置密码,点击右侧更多->重置密码(不要忘记勾选自动重启):
5.点击远程登录,此时会弹出一个界面用于选择登陆方式,这里我们选择第一种 "CloudShell登录":
6:点击连接按钮登录CloudShell,跳转至如下所示界面:
7.安装宝塔面板,点击蓝字跳转至宝塔官网
找到下图中界面并点击右侧复制:
等待一段时间后弹出 Do you want to install Bt-Panel to the /www directory now?(y/n):
这里选择y并回车,若后续还有询问项,同样输入y并回车.
8.等待宝塔安装,当出现如下数据,则安装完成:
妥善保存如下信息,我们后续的操作都在宝塔面板上进行。
9.对外网面板地址进行访问,此时大概率是无法访问的,查看上图的黄字,无法访问的原因就是服务器没有开放该端口,在此示例中是23829,请以实际为准,我们需要在安全组中开放该端口,操作如下:
首先打开实例的详细界面:
再说一下,在您实际操作时该端口不一定是我示例中的23829,具体要看步骤8的图片中数据。
开放端口后再次访问外网面板地址,正常会出现如下界面,密码账号请参照步骤8中的username,password:
10.安装服务器所需依赖程序,请按照图片内版本下载:
所有软件均选择极速安装
11.当所有软件安装完成,点击Python项目管理器右侧的设置:
点击左侧的版本管理,安装python3.7.9:
12.创建数据库: 点击宝塔左侧的数据库,再点击添加数据库,数据库参数如下所示,用户名和密码可进行自定义,其他请与图保持一致:
点击提交后数据库创建完成,再次点击该数据库右侧的管理按钮进入phpMyAdmin导入模板数据库:
用户名、密码与数据库对应:
创建站点,点击宝塔右侧网站按钮,再点击添加站点: 请注意箭头所指的IP需要改成自己服务器的外网ip,域名一行是ip+端口,请在安全组中放行8000端口。
此时站点中应该有你新建的网站:
以我的为例,访问http://139.9.90.194:8000可看到如下所示,则站点创建成功,若无法访问请检查端口是否放行,创建站点时参数是否填写错误:
点击网站右侧的配置修改配置文件,将下面的代码复制到指定位置并保存:
PS:这里本应该有图片告诉你代码复制到哪个位置,但死活不显示 我已经没办法了。。。。
用文字说明:将下面代码复制到配置文件的第五行 root的下一行。
location / { include uwsgi_params; uwsgi_pass 0.0.0.0:8000; #端口要和uwsgi里配置的一样 uwsgi_param UWSGI_SCRIPT DJ_QuickChatServer.wsgi; #wsgi.py所在的目录名+.wsgi uwsgi_param UWSGI_CHDIR /www/wwwroot/quickchatserver; #项目路径 } location /static/ { alias /www/wwwroot/quickchatserverstatic/; #静态资源路径 }
进入站点根目录,将根目录所有文件删除:点击上传,将DJ_QuickChatServer.zip上传至根目录后右键进行解压,解压后如图所示:
进入如下图所示目录,找到settings.py,在约80行的位置修改参数为你的数据库参数:
邮箱管理者:我们接收的验证码和消息提醒都是通过这个邮箱管理者实现的,它负责服务器中所有邮件的收发,在搭建服务器后,您必须修改服务器中的EmailSender.py文件中的全局参数,如下所示:
可以看到其实质就是依托于第三方邮箱的smtp服务,因此你需要申请到一个邮箱并开启smtp,请参考https://blog.csdn.net/liuyuinsdu/article/details/113878840
等待很长时间后安装完成:1.点击模块手动安装Django:2.安装完成后点击运行中停止项目,如上图绿色箭头所示。3.点击配置适当增大进程线程:参考博客:uwsgi开多少进程才能最大使用服务器我的配置如下:4.重新启动项目
到此服务器端的配置全部完成,请参考上方的软件说明,在软件端进行服务器配置后尝试登录,能够收到验证码证明服务器端正常运行。
公共测试服务器:已过期项目资源 https://www.aliyundrive.com/s/U5wzHk67JQX在不使用设备时请关闭电源,避免电池过放。