/JiWang_ExtraHW

2022同济大学计算机网络 沈坚班加分作业 基于webrtc的监考录屏 Flask

Primary LanguagePython

ExtraHW

JiWang ExtraHW


杨:

三天时间, 每天睡5h, 从6.16晚上开始从零开始学习webrtc+JavaScript+flask的各种操作和源码, 到6.18晚上好像完成了大部分

6.19出现莫名其妙的bug, 因为着急准备算法期末考试, 实在是整不明白bug在哪里.

整了6.19一整天, 没整出来, 6.19晚上决定摆烂

6.22: 渣哥居然把ddl延长到这么远, 赞美渣哥, 上午重新研究bug, 发现是websocket发送事件有顺序问题, 成功解决

6.22 晚上: 真的把webrtc实现了, 还好这连着三天时间没白费, 如果提前一个月做, 做的效率有这三天的50%~60%, 大概能做的很好罢.

hoarah_loux

这几天的vscode的工作时间达到了惊人的44h, 除去4h是vscode干别的

平均到4天(6.16晚~6.19晚 + 6.22全天)里, 平均每天工作10H

感觉死神在朝我招手



TODO_服务端

  1. 将ssl的证书文件整合到本目录下 不干了, 就绝对地址罢

使用数据库的方法 使含有数据库的server端正常运行的方法

先安装mariadb

  • 数据库的用户要求是root(后期可能会改)
  • 数据库的密码要求是A6080o--a__TtVFR

mariadb初始化: 执行python ./initdatabase.py即可

initdatabase.py 默认使用./user.sql, 如果要另外指定sql文件需要使用命令行参数

python initdatabase.py <文件名>

运行init.py的时候如果遇到如下错误

ModuleNotFoundError: No module named 'MySQLdb' flask

需要执行如下指令

pip install mysqlclient

使用配置文件的方法

默认配置文件为./webrtc-Tony.conf, 直接执行python init.py的话就会使用这个配置文件

如果想要使用其他的配置文件, 可以使用命令行参数

python init.py <文件名>

配置文件中现在支持的内容有, 配置文件中不出现的内容使用默认值, 默认值及配置文件示例如下

[root_dir]
dir = /home/webrtc/video # 录像保存位置, 暂时还用不到

[frame]
width=1920
    high =    1080 # 高度

rate = 15 ;每秒帧率

[断联时间]
disconnect=15 #断联15s后提示

[ssl]
crt = /etc/pki/tls/certs/cert.crt # crt文件的位置
key = /etc/pki/tls/private/cert.key # key文件的位置

客户端与服务端通信方法:

使用socketIO

C接受S的信息:(C端写法)

在客户端的js文件里添加如下内容

socket = io() //声明变量

//data和callback是两个变量名
//创建的这个function会在客户端收到Server发的事件的时候执行
socket.on('事件名', function(data, callback){
    ...
    //data的格式是{name:value}的格式
    //可以通过data['name']或者data.name的格式访问传送的内容
    //callback可以不写, 是回调函数, 大概率用不上
    //客户端收到信息后调用callback(参数), 服务端如果定义了对应的函数的话, 服务端会有对应的处理
    //callback的例子: 客户端执行callback("event received!");
    //如果服务端的对该callback的定义是print(arg), 那服务端就会输出上面的字符串



});

S接受C的信息:(C端写法)

在客户端的js文件里添加如下内容

socket = io() //同上, 一个变量只需要一次这个
//格式为socket.emit('事件名', data, callback);
//例子:
socket.emit('client_event', {num1 : 114514, str1: "1919810"}, function(data){
    console.log("server received data", data);
}
//server会收到名为'client_event'的事件
//server会收到{num1 : 114514, str1: "1919810"}数据包, 
//server如果执行了callback函数, 则客户端会受到反馈, 在控制台上输出内容

部署方式

如果没有pythonpip命令, 可以试一试有没有python3, pip3

pip install Flask
pip install configparser
pip install Flask-SocketIO
pip install Flask-SQLAlchemy
pip install mysqlclient # 运行init.py的时候如果提示没有MySQLdb, 需要运行这个
pip install pyOpenSSL
python init.py 

安装完python的库就可以直接运行init.py

需要先自己生成https的签名, 用http协议webrtc好像不好使

ssl生成的两个文件位置和文件名需要固定~~(因为路径写死了)~~, 否则需要在init.py文件中改ssl_certificatessl_certificate_key的值

生成的.crt文件必须是/etc/pki/tls/certs/cert.crt

生成的.key文件必须是/etc/pki/tls/private/cert.key

写的html文件需要放在templates文件夹下, 可以有子文件夹, 支持由服务端在打开一个html的时候提供一些信息, 如下

学号: <input type="number" name="ID" value="{{user_id}}"> <br>

{{变量名}}这种格式的变量会在flask显示html的时候填充提供的信息, 服务端使用的python函数为``render_template("index.html", user_id=user_id)

上面一行在显示的时候会将value的 {{user_id}}替换为python传入的user_id变量的值, 可以是空, 具体样式为

这样