会议签到系统的架构和实现

会议签到系统的架构和实现
摘要:通过定制安卓会议机开机APP呈现签到界面,并且通过W/B结构采集管理签到信息,实现会议签到的功能。为达到此目标本文将探讨使用Redis提供后台数据支持;使用SocketIo处理适时消息;使用Flask进行原型开发;使用Rust的Axum框架对Web访问进行优化等各个方面。
关键词:会议机、签到、反向代理、KV数据库、Redis、Flask、Axum

目录

一、    组织框架

二、功能实现

1、    安卓启动软件定制

2、    Caddy配置

3、    Flask和Redis交互

4、    简要介绍前端Vue

5、    Rust对核心代码的优化和配置

6、    SocketIO适时响应的作用

三、安装和部署

四、总结


一、    组织框架


我们使用长安视讯的会议机某个系列,使用的是安卓版本7.0定制系统,兼容安卓软件,通过定制开机App,可以实现开机画面显示本站签到人员信息,对其的点击,提交到WEB端及Redis数据库,这就是本系统的基础处理流程。
Caddy作为代理,提供灵活配置和故障冗余,对于Rust替换Flask实现特定功能特别有用,而对于容器后面的Flask服务也用于提供remoteIP的必要属性。
WEB服务器使用Flask,通过逐层添加模块,最终实现签到人员采集,设备状态监控,存储分配名单等等功能。
Redis提供一个数据存储,保存并提供车站人员信息、设备IP绑定等。
最终为了签到提速,使用Rust跨平台二进制程序,分离部分签到接口,建立适时快速的签到通道。

二、功能实现


1、    安卓启动软件定制


将安卓启动软件项目AnyLaucher下载到本地,安装Android Develop Tools工具链,修改界面加入WebView控件,删除无用代码和按钮。在程序启动函数加入上线检测和页面加载代码:

完成以后的界面:

2、    Caddy配置


反向代理flask:

代理socketio:

3、    Flask和Redis交互


引用和初始化:
from flask_redis import FlaskRedis # 使用flask-redis库
app = Flask(__name__)
app.config['SECRET_KEY'] = 'top-secret!'
app.config['REDIS_URL']="redis://:pass@ip:6379/9"
app.config['WERKZEUG_RUN_MAIN']=True  # 
cl.init_app(app)
操作实例,将IP到车站名的字典存入和取出:
def  redis2ipdic():
    global ipdic
    ipdic.clear()
    for k,v in cl.hgetall(IPDIC_KEY).items():
        ipdic[k.decode() ]=v.decode()
    return ipdic
def ipdic2redis():
    global ipdic
  # 将字典保存到Redis的哈希中
    cl.delete(IPDIC_KEY)
cl.hmset(IPDIC_KEY,ipdic)
最后Flask实现汇总点名信息界面如下:

4、    简要介绍前端Vue


在开发过程中,车站人名列表是个灵活改变的项目,需要一个web端的维护界面,于是用到了Vue3,NativeUI组件。其开发文档比较全面。最后绑定Flask后端的json数据,并且将更新提交到Flask的更新接口。
全部车站的人员模板:

保密+脑补1

单个车站编辑:

保密+脑补2

实现汇总打印的界面:

保密+脑补3

5、    Rust对核心代码的优化和配置


Rust在同一时间可以响应更多的请求,使用了异步请求模式可以更快响应请求。
会议机请求页面在初始开发时,点击人名是整页刷新,在切换Rust过程中,修改为Ajax局部刷新、只变更本站最新人名列表和状态,
这两项修改压缩单次请求处理时间2倍以上。
A.Rust使用Axum实现签到功能后的大小5M上下,可以跨平台部署在多个节点,Caddy只需修改App首页链接的跳转地址,就可完成切换。遇到故障或错误,可随时调整到原来的Flask接口。

B.Caddy的负载均衡配置如下:
   redir /ck/test  /rk/test

    handle  /rk/*   {
    reverse_proxy  {
         header_up Host {host}
         header_up X-Real-IP {remote}
            health_uri  /
            health_interval 60s
            health_timeout 1s
            to  10.80.133.00:6055  192.168.1.00:3001
}
    }
其中 /ck/test是默认安卓启动页, /rk/test是Rust程序接口,所有的/rk请求转向Rust的Axum服务。并且被部署在两个节点10.80.133.00:6055  192.168.1.00:3001,轮流接受请求。使用主动健康检查,60秒检查一次。如果其中一个离线,所有请求使用在线的另一个。

6、    SocketIO适时响应的作用


在开发过程中由于需要即时适时采集车站会议机人名,使用刷新轮询无疑会影响速度和性能。因此引入WebSocket的实现Flask-SocketIO,它能很方便的引入现有的Flask应用。
cl.init_app(app)
message_queue= app.config['REDIS_URL']
socketio = SocketIO(app, async_mode='threading',cors_allowed_origins='*' ,message_queue= app.config['REDIS_URL'])
SokcetIO用途
1.    SocketIO的js客户端支持断线重连,长期在线,即便AnyLauncher处于后台也能从socketio-client判断会议机开关机状态。

2.    车站签到人名点击后,会控端首页和状态页可以收到消息通知,刷新签到信息。
3.    车站会前开机未签到,会收到会前提醒。在页面加载时通过null消息订阅,若有消息到达,则调用Android在WebBrowser接口toast显示提醒签到的消息。

注意事项:SocketIO一个限制是不能再多开工作进程,无法使用gunicorn的多worker, Rust使用socketioxide实现同样功能,并且完成了上线运行,作为优化的一部分。

三、安装和部署


本软件需要安装以下部分:
1、会议端APP,以apk发布,安装于会议机,并设置为开机启动,安装前需要把web默认申请地址内置于apk。
2、Web服务器需要安装Caddy,设为开机启动,对CaddyFile文件进行适当修改。
3、安装python3,较新版本及所需依赖,主要是Flask,推荐安装gunicorn以用于生产环境。安装完成后运行本app。
4、安装和运行Redis服务,然后修改Flask连接参数。
5、视情况运行Axum二进制服务,以提高响应速度,改变Caddy的配置文件,并重启Caddy服务。

四、总结


本文提供了安卓会议机实现签到功能的方案,本方案包含前后端实现,有较为灵活的编码架构以方便增改功能,使用Flask和Vue提供按需定制;也有较高的性能冗余,可以提供成百上千的同时访问,由Rust的二进制web服务支持。文中对技术细节和配置文件做了详细讲解,据此每个安卓会议系统的用户,可以实现符合自己需求的量身定制的签到系统。
本项目在开发过程中重度使用了百度AI问答和Github开源项目,并得到了长安视讯及本部门同事的大力支持,特此感谢。 

参考资料:
1)    Flask文档
2)    Rust程序设计语言-简体中文版
3)    Redis使用说明
4)    Caddy2中文文档
5)    Flask-socketio文档


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/958347.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PIC单片机HEX文件格式分析

在调试PIC单片机在bootloader程序时,需要将hex文件转换为bin文件,在转换之前先了解一下hex文件中数据是如何定义的。 直接打开一个LED灯闪烁的程序生成的hex文件,芯片型号为PIC18F46K80 可以看到每条数据都是由6部分组成的,下面分…

17-使用椭圆制作鼻子

17-使用椭圆制作鼻子_哔哩哔哩_bilibili17-使用椭圆制作鼻子是一次性学会 Canvas 动画绘图(核心精讲50个案例)2023最新教程的第18集视频,该合集共计53集,视频收藏或关注UP主,及时了解更多相关视频内容。https://www.bi…

通过 Visual Studio Code 启动 IPython

在Visual Studio Code 中,你可以使用内置的终端来启动 ipython,当然首先要安装好ipython。 安装ipython的方法是在cmd里面输入以下命令安装: pip install ipython 启动ipython的步骤如下: 打开 VSCode 终端: 在 VSCo…

网络(三) 协议

目录 1. IP协议; 2. 以太网协议; 3. DNS协议, ICMP协议, NAT技术. 1. IP协议: 1.1 介绍: 网际互连协议, 网络层是进行数据真正传输的一层, 进行数据从一个主机传输到另一个主机. 网络层可以将数据主机进行传送, 那么传输层保证数据可靠性, 一起就是TCP/IP协议. 路径选择: 确…

Qt基础项目篇——Qt版Word字处理软件

一、核心功能 本软件为多文档型程序,界面是标准的 Windows 主从窗口 拥有:主菜单、工具栏、文档显示区 和 状态栏。 所要实现的东西,均在下图了。 开发该软件,主要分为下面三个阶段 1)界面设计开发 多窗口 MDI 程序…

Python+langchain+通义千问qwen(大模型实现自己的聊天机器人)

Langchain langchain是一个用于开发由语言模型驱动的应用程序的框架,致力于简化AI模型应用的开发。简单来说,langchain就是一个(帮助开发者轻松完成AI模型应用开发的)框架,现在支持python和js两个版本,它集成多种大语…

FPGA中场战事

2023年10月3日,英特尔宣布由桑德拉里维拉(Sandra Rivera)担任“分拆”后独立运营的可编程事业部首席执行官。 从数据中心和人工智能(DCAI)部门总经理,转身为执掌该业务的CEO,对她取得像AMD掌门人苏姿丰博士类似的成功,无疑抱以厚望。 十年前,英特尔花费167亿美元真金白银…

【超详细】ELK实现日志采集(日志文件、springboot服务项目)进行实时日志采集上报

本文章介绍,Logstash进行自动采集服务器日志文件,并手把手教你如何在springboot项目中配置logstash进行日志自动上报与日志自定义格式输出给logstash。kibana如何进行配置索引模式,可以在kibana中看到采集到的日志 日志流程 logfile-> l…

探索Linux中的进程控制:从启动到退出的背后原理

个人主页:chian-ocean 文章专栏-Linux 前言: 进程控制是操作系统对进程的创建、运行、调度、中止等活动进行管理和协调的行为。它是操作系统中至关重要的一部分,保证多任务处理环境下的资源分配和系统稳定性。 进程创建 fork( ) fork() 调…

【ComfyUI】python调用生图API,实现批量出图

官方给的示例: https://github.com/comfyanonymous/ComfyUI/blob/master/script_examples/websockets_api_example.pyhttps://github.com/comfyanonymous/ComfyUI/blob/master/script_examples/websockets_api_example.pyhttps://github.com/comfyanonymous/ComfyU…

推箱子游戏

java小游戏2 一游戏介绍 二图像准备 墙、箱子、人、箱子目的地,人左边、人右边、人上边、人下边 三结构准备 地图是什么,我们把地图想象成一个网格,每个格子就是工人每次移动的步长,也是箱子移动的距离,设置一个二维数…

软件鉴定测试重要性和流程分享

在当今快速发展的数字时代,软件系统的可靠性和安全性变得至关重要。越来越多的企业意识到,进行专业的软件鉴定与测试不仅是保证产品质量的必要步骤,也是提升市场竞争力的重要手段。软件鉴定测试指通过对软件进行评估和验证,以确保…

Linux C\C++编程-建立文件和内存映射

【图书推荐】《Linux C与C一线开发实践(第2版)》_linux c与c一线开发实践pdf-CSDN博客 《Linux C与C一线开发实践(第2版)(Linux技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 Linu…

15-spring整合mybatis方式一

spring整合mybatis 方式一【重要】 步骤: 1.导入相关jar包 junit mybatis mysql数据库 spring相关的 aop织入 mybatis-spring 【new】 junit junit 4.12 mysql mysql-connector-java 8.0.23 org.mybatis mybatis 3.5.2 org.springframework spring-webmvc 5…

基于深度学习的视觉检测小项目(十五) 用户的登录界面

用户管理离不开的是消息框(QMessageBox)和对话框(QDialog),比如对话框用于用户名和密码输入,消息框用于提示登录成功、密码错误。 • 基础知识:PySide6(PyQT5)的常用对话…

什么是COLLATE排序规则?

在当今数字化世界中,数据的整理、比较和排序是至关重要的。在数据库管理和编程语言中,我们经常需要对字符串进行排序,以展示或处理信息。为了实现这一点,各种系统和工具提供了排序规则,其中COLLATE排序规则就是其中的一…

Linux:信号的保存[2]

1.信号在内核中的表示 因为是三种内核的数据结构,操作系统就可以通过操作这些数据结构提供接口。 如果一个信号没有产生,并不妨碍它可以先被阻塞。 当同一时刻发送大量相同信号时,会丢失。 2.信号的捕捉(重点) 信号产…

顺序表和链表(详解)

线性表 线性表( linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构,也就说是连续的一条直线。…

【电脑无法通过鼠标和键盘唤醒应该怎么办】

【电脑无法通过鼠标和键盘唤醒应该怎么办】 方法一(有时候不起作用):方法二(方法一无效时,使用方法二): 方法一(有时候不起作用): 方法二(方法一无效时,使用方法二):

动态规划(路径问题)

62. 不同路径 62. 不同路径 - 力扣(LeetCode) 动态规划思想第一步:描述状态~ dp[i][j]:表示走到i,j位置时,一共有多少种方法~ 动态规划思想第二步:状态转移方程~ 动态规划思想第三步&#xf…