AppInventor之数据库、MQTT及导出Excel表格

准备工作

AppInventor服务器:Wxbit

数据库:TinyWebDB数据库

MQTT:EasyIoT

工作过程

当K210板识别到未穿校服后,会自动进行人脸识别,人脸识别的结果为班别+学号,例:865,通过串口传输到掌控板后再通过MQTT发送至App。

App接收到消息后会对消息进行分析,首先判断此人的班别,然后在对应班别的数据库里对学号匹配查找得到此人姓名。

最后将未穿校服学生的班别与姓名合并保存到TinyWebDB数据库中,同时保存至本地数据库,方便后续的导出数据操作。

具体代码

MQTT连接

在这里插入图片描述
初始化时首先连接MQTT,其中MQTT客户端组件的设置如下:

服务器端口为iot.dfrobot.com.cn:1883

客户端标识为1883

在这里插入图片描述

获取今日未穿校服人数

首先我们需要创建一个局部变量,并赋值为今天的日期文本,可以通过调用计时器并通过当前日历获取。此举是为了简化代码,提高可读性。

在这里插入图片描述

接着我们获取以日期文本为标签的数据库值,其中会存在以下情况:

  1. 数据库数值为空,即今日机器未运行或没有检测到未穿校服人员;

  2. 数据库数值为1,即检测到未穿校服人员,但未对数据进行匹配。

所以我们要对获取的数值进行分析,如果数据为0或1时,我们给它补上一个数字,不至于让数值空空如也导致后续运行出错;同时保存至本地数据库。

接着我们要对正常的数值进行分析提取,例如我的数据库保存格式为总人数-班别姓名.班别姓名,其中的-.分别为人数与名字、名字与名字间的间隔符。

在这里插入图片描述

所以我们只需提取数据库数值的第一位-出现的前一个位置

在这里插入图片描述
最后,我们需要将没穿校服人员的名单提取出来,与上同理,我们可以通过截取-出现的位置到文本最后一位取得。再使用.将数据分割为列表显示出来。

最后保存一份数据至本地,此段完整代码如下:
在这里插入图片描述

获取昨日未穿校服人数

这里的代码与上面大同小异,不作阐述。

其中需要判断昨天是否有数据,无数据的话显示为0.
在这里插入图片描述

获取本周未穿校服人数

需要用到遍历的手法,一一将前六天的数据截取出来。

需要使用到一个判断,如果获取数据不为0时才提取内容,否则可能使用中会报错。
在这里插入图片描述
最后,把前面获得的名字列表显示出来,再在本周人数的基础上将今日的人数相加得到最终本周总人数并呈现。

在这里插入图片描述

接收MQTT

当接收到掌控板发来的MQTT消息后,我们首先判断这名不穿校服学生的班别,即截取前两位数字,在另外的学生数据库中获取对应学号的姓名。
在这里插入图片描述
在这里插入图片描述
接着,我们需要对数据库进行判断,即如果有出现前文提到的数据库数据为空的情况时,我们需要先将人数及-符号补齐,再将学生信息追加回去。

如果数据库数据前面已有数据,则直接追加班别姓名至数据库中。最后再更新一下列表。

在这里插入图片描述

导出excel表格

这部分十分难搞,我花了一个小时才想通整个逻辑。

先讲讲这个csv表格是怎么构成的,首先这个csv表格得是一个列表,然后这个列表中的第一项为第一行,第二项为第二行以此类推。

那怎么分列呢?就是在这个列表里的第一项中再放一个列表。这个最外面列表里的第一项中的列表中的第一项即为第一列第一行的内容以此类推。

单单文字的阐述很难理解,但是你实际上机,写多两条代码,套几个列表进去就能明白了。总之就是列表里套列表。

回到程序,我们自定义一个函数,这个函数带一个值,那么这个x起到控制读取不同天数数据库的作用,

在这里插入图片描述
在这里插入图片描述
接着我们需要读取每一天的未穿校服人员名单:

这里有一个判断,因为会有一种情况,即每天人员的数量是不同的,无法做到只读取今天多少人就多少次,所以尽可能多读取,如果x大于今天的总人数了就丢个空值回去。
在这里插入图片描述
number是不变的,即无论如何遍历都是读这一天,而x即读取这一天中的第x个人:
在这里插入图片描述
最后利用文件管理器将csv表格导出,此段完整代码如下:

在这里插入图片描述
最终导出表格效果如下:

清空数据库

因为AppInventor功能受限无法直接对数据库内容进行删除操作,于是我们可以曲线救国,通过发送MQTT消息至掌控板,掌控板收到消息后再执行delete.

在这里插入图片描述