使用最新版的wvp和ZLMediaKit搭建Gb28181测试服务器

news2024/11/27 2:17:38

文章目录

  • 说明
  • 安装
    • 1.安装nodejs
      • 简介
      • 安装步骤
    • 2.安装java环境
    • 3.安装mysql
      • 安装
      • 修改密码
    • 4.安装redis
    • 5.安装编译器
    • 6.安装cmake
    • 7.安装依赖库
    • 8.编译ZLMediaKit
    • 9.编译wvp-GB28181-pro
  • 配置
    • 1.ZLMediaKit配置
    • 2.wvp-GB28181-pro配置
      • 2.1.配置ZLMediaKit连接信息
      • 2.2.28181服务器的配置
      • 2.3.配置web服务器
      • 2.4.数据库配置
        • 2.4.1.修改root用户的密码
        • 2.4.2.删除以前wvp相关数据库
        • 2.4.3.删除mysql数据库中wvp相关表格
        • 2.4.4.数据库连接配置修改
        • 2.4.5.建立并导入数据库
      • 2.5.跨域配置
  • 运行
    • 准备运行脚本
      • ZLMediaKit.sh
      • wvp_gb28181.sh
    • 运行服务
  • 使用国标设备对接国标服务器
  • 云端录像

说明

前段时间发布了一系列GB28181测试环境的搭建,最近整理一下服务器和模拟设备一个完整的博客,不需要设备就可以熟悉GB28181协议.

安装

主机建议使用Ubuntu 22.04.5 LTS x86_64及以上版本.

1.安装nodejs

简介

到nodejs官网下载最新LTS版本. 因为nodejs依赖glic库,所以ubuntu使用最新的LTS版本.

当前nodejs依赖glibc2.28版本,为了确保nodejs能正常运行,需要先查询系统的glibc版本.

strings /lib/x86_64-linux-gnu/libc.so.6 | grep GLIBC_
#输出如下信息
......
GLIBC_2.27
GLIBC_2.28
GLIBC_2.29
GLIBC_2.30
GLIBC_2.31
GLIBC_2.32
GLIBC_2.33
GLIBC_2.34
GLIBC_2.35

安装步骤

#解压缩
tar -Jxf node-v20.9.0-linux-x64.tar.xz

#移动位置
sudo mv node-v20.9.0-linux-x64/ /opt

#编辑/etc/profile内容
export PATH="/opt/node-v20.9.0-linux-x64/bin:$PATH"

#使环境变量使能
source /etc/profile

#查看nodejs是否正常安装
node -v
v20.9.0
npm -v
10.1.0

2.安装java环境

sudo apt install -y openjdk-11-jre maven

#确认java安装成功
java -version
#输出版本信息
openjdk 11.0.21 2023-10-17
OpenJDK Runtime Environment (build 11.0.21+9-post-Ubuntu-0ubuntu122.04)
OpenJDK 64-Bit Server VM (build 11.0.21+9-post-Ubuntu-0ubuntu122.04, mixed mode, sharing)

#maven
mvn -version
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 11.0.24, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "6.5.0-18-generic", arch: "amd64", family: "unix"

3.安装mysql

安装

#移除以前的mysql相关
sudo apt remove --purge mysql-\*
#安装mysql
sudo apt install mysql-server mysql-client
#查看是否启动
systemctl status mysql
#手动启动
systemctl start mysql
#查看mysql版本
mysql --version

修改密码

#免密进入mysql
sudo mysql -uroot
#your_new _password 修改成用户密码
alter user 'root'@'localhost' identified with mysql_native_password by 'your_new _password';
#然后就可以使用密码登录了
mysql -u root -p

use mysql;
#root账号可以访问所有主机
update user set host='%' where user= 'root';
#ERROR 1046 (3D000): No database selected
flush privileges;
#授权
grant all on *.* to 'root'@'%';
flush privileges;
quit;

4.安装redis

sudo apt update
sudo apt install redis-server

#启动
redis-server

#查看Redis是否正常
systemctl status redis
redis-cli
#输入ping返回PONG表示正常

5.安装编译器

sudo apt install build-essential
g++ --version
g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

6.安装cmake

官网https://cmake.org/下载最新稳定版本 cmake-3.27.8-linux-x86_64.tar.gz, 这样的好处可以方便查找帮助文档,方便查看cmake内部的资料.

tar -zxvf cmake-3.27.8-linux-x86_64.tar.gz
sudo mv cmake-3.27.8-linux-x86_64 /opt/
sudo vim /etc/profile
#增加
export PATH="/opt/cmake-3.27.8-linux-x86_64/bin:$PATH"
source /etc/profile
cmake --version
#显示安装成功
cmake version 3.27.8

CMake suite maintained and supported by Kitware (kitware.com/cmake).

/opt/cmake-3.27.8-linux-x86_64/doc/cmake/html为网页帮助文档.

7.安装依赖库

sudo apt install -y libssl-dev
sudo apt install -y libsdl1.2-dev
sudo apt install -y libavcodec-dev
sudo apt install -y libavutil-dev
sudo apt install -y ffmpeg

8.编译ZLMediaKit

git clone https://gitee.com/xia-chu/ZLMediaKit
cd ZLMediaKit
git submodule update --init
git submodule status 
    08c094ea14f259ecf0c356e6243cb47ee96ce292 3rdpart/ZLToolKit (heads/master)
    69098a18b9af0c47549d9a271c054d13ca92b006 3rdpart/jsoncpp (1.9.0-178-g69098a18)
    cf83ebc62e65ae6f3b73bc5ebd06cb0b2da49fa5 3rdpart/media-server (v1.0.0-173-gcf83ebc6)
    b02d2a4c1abf95db45e50bb77d789defa0fcc4b7 www/webassist (heads/main)
#编译
mkdir build
cd build
cmake ..
make -j4

编译结果在release目录下,主要有三部分组成:

  • MediaServer 进程

    cd ZLMediaKit/release/linux/Debug
    #通过-h可以了解启动参数
    ./MediaServer -h
    
  • c api 的 SDK

头文件在ZLMediaKit/api/include
库文件为:ZLMediaKit/release/linux/Debug/libmk_api.so
  • test_开头的测试程序

相关代码在ZLMediaKit/tests目录下,你可以对照代码启动测试进程。

9.编译wvp-GB28181-pro

git clone https://gitee.com/pan648540858/wvp-GB28181-pro.git

#1.编译前端页面
cd wvp-GB28181-pro/web_src/
npm --registry=https://registry.npmmirror.com install
npm run build
#编译完成后会生成目录: wvp-GB28181-pro/src/main/resources/static

#2.生成可执行jar
cd wvp-GB28181-pro
mvn package
#编译后生成文件: wvp-GB28181-pro/target/wvp-pro-2.7.3-10250742.jar

#3.生成war
cd wvp-GB28181-pro
mvn package -P war
#编译后生成文件: wvp-GB28181-pro/target/wvp-pro-2.7.3-10250742.war

配置

目录结构如下

.
├── config #配置文件
├── record #录像保存
├── wvp-GB28181-pro 
└── ZLMediaKit

把所有的配置文件放到config目录中

cp wvp-GB28181-pro/target/classes/配置详情.yml config
cp ZLMediaKit/release/linux/Debug/config.ini config

最终config目录内容如下:

config
├── wvp_gb28181.sh #wvp-GB28181-pro运行脚本
├── wvp_gb28181.yml #wvp-GB28181-pro配置文件
├── ZLMediaKit.ini #ZLMediaKit配置文件
└── ZLMediaKit.sh #ZLMediaKit运行脚本

1.ZLMediaKit配置

[api]
    #和 wvp_gb28181.yml 中 media:secret: 一致
    secret=BkPj2ca6QPpY5RccREJq4kAOu9ZEt70x

[general]
    #和 wvp_gb28181.yml 中 media:id: 一致
    mediaServerId=FQ3TF8yT83wh5Wvz

[http]
    #和 wvp_gb28181.yml 中 media:http-port: 一致
    port=80
    
[rtp_proxy]
	 #和 wvp_gb28181.yml 中 media:rtp:port-range: 一致
    port_range=30000-35000	

2.wvp-GB28181-pro配置

2.1.配置ZLMediaKit连接信息

media:
	#和ZLMediaKit设置一致
	secret: BkPj2ca6QPpY5RccREJq4kAOu9ZEt70x
	id: FQ3TF8yT83wh5Wvz
	http-port: 80
	rtp:
		port-range: 30000,30500
	
	# [必须修改] zlm服务器的内网IP
	ip: 192.168.137.2
	hook-ip: 192.168.137.2

2.2.28181服务器的配置

sip:
	ip: 192.168.137.2
    # [可选] 没有任何业务需求,仅仅是在前端展示的时候用
    show-ip: 192.168.137.2
    # [可选] 28181服务监听的端口
    port: 5061
    # [可选]
    domain: Local1
    # [可选]
    id: 32050950002000005001
    # [可选] 默认设备认证密码,后续扩展使用设备单独密码, 移除密码将不进行校验
    password: eLTE@com123    

2.3.配置web服务器

#web访问
server:
    port: 18080

2.4.数据库配置

2.4.1.修改root用户的密码
#查看数据库状态
systemctl status mysql
#进入mysql
mysql -u root -p

#更改root用户密码为root123,并修改为root用户可以使用任何电脑访问所有数据库
use mysql;
update user set host='%' where user= 'root';
flush privileges;
select host,user,plugin from user where user='root';
alter user 'root'@'%' identified with mysql_native_password by 'root123';
flush privileges;
grant all on *.* to 'root'@'%';
flush privileges;

2.4.2.删除以前wvp相关数据库
#显示所有数据库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| wvp                |
| wvp2               |
+--------------------+
6 rows in set (0.00 sec)

#显示当前数据库
 select database();
+------------+
| database() |
+------------+
| mysql      |
+------------+
1 row in set (0.00 sec)


#删除wvp相关数据库
mysql> drop database wvp;
Query OK, 17 rows affected (0.32 sec)

mysql> drop database wvp2;
Query OK, 0 rows affected (0.01 sec)
2.4.3.删除mysql数据库中wvp相关表格
#显示mysql数据库中所有表格
mysql> show tables;
+------------------------------------------------------+
| Tables_in_mysql                                      |
+------------------------------------------------------+
| columns_priv                                         |
| component                                            |
| db                                                   |
| default_roles                                        |
| engine_cost                                          |
| func                                                 |
| general_log                                          |
| global_grants                                        |
| gtid_executed                                        |
| help_category                                        |
| help_keyword                                         |
| help_relation                                        |
| help_topic                                           |
| innodb_index_stats                                   |
| innodb_table_stats                                   |
| password_history                                     |
| plugin                                               |
| procs_priv                                           |
| proxies_priv                                         |
| replication_asynchronous_connection_failover         |
| replication_asynchronous_connection_failover_managed |
| replication_group_configuration_version              |
| replication_group_member_actions                     |
| role_edges                                           |
| server_cost                                          |
| servers                                              |
| slave_master_info                                    |
| slave_relay_log_info                                 |
| slave_worker_info                                    |
| slow_log                                             |
| tables_priv                                          |
| time_zone                                            |
| time_zone_leap_second                                |
| time_zone_name                                       |
| time_zone_transition                                 |
| time_zone_transition_type                            |
| user                                                 |
| wvp_cloud_record                                     |
| wvp_device                                           |
| wvp_device_alarm                                     |
| wvp_device_channel                                   |
| wvp_device_mobile_position                           |
| wvp_gb_stream                                        |
| wvp_log                                              |
| wvp_media_server                                     |
| wvp_platform                                         |
| wvp_platform_catalog                                 |
| wvp_platform_gb_channel                              |
| wvp_platform_gb_stream                               |
| wvp_resources_tree                                   |
| wvp_stream_proxy                                     |
| wvp_stream_push                                      |
| wvp_user                                             |
| wvp_user_role                                        |
+------------------------------------------------------+
54 rows in set (0.00 sec)

#删除wvp相关表格
drop table wvp_cloud_record;
drop table wvp_device;
drop table  wvp_device_alarm;;
drop table  wvp_device_channel;
drop table  wvp_device_mobile_position;
drop table  wvp_gb_stream;
drop table  wvp_log;
drop table  wvp_media_server;
drop table  wvp_platform;
drop table  wvp_platform_catalog;
drop table  wvp_platform_gb_channel;
drop table  wvp_platform_gb_stream;
drop table  wvp_resources_tree;
drop table  wvp_stream_proxy;
drop table  wvp_stream_push;
drop table  wvp_user;
drop table  wvp_user_role;
2.4.4.数据库连接配置修改

原来的

        dynamic:
            primary: master
            datasource:
                master:
                    type: com.zaxxer.hikari.HikariDataSource
                    driver-class-name: com.mysql.cj.jdbc.Driver
                    url: jdbc:mysql://127.0.0.1:3306/wvp2?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&serverTimezone=PRC&useSSL=false&allowMultiQueries=true
                    username: root
                    password: root123
                    hikari:
                        connection-timeout: 20000             # 是客户端等待连接池连接的最大毫秒数
                        initialSize: 50                       # 连接池初始化连接数
                        maximum-pool-size: 200                # 连接池最大连接数
                        minimum-idle: 10                       # 连接池最小空闲连接数
                        idle-timeout: 300000                  # 允许连接在连接池中空闲的最长时间(以毫秒为单位)
                        max-lifetime: 1200000                 # 是池中连接关闭后的最长生命周期(以毫秒为单位)
                share:
                    type: com.zaxxer.hikari.HikariDataSource
                    driver-class-name: com.mysql.cj.jdbc.Driver
                    url: jdbc:mysql://127.0.0.1:3306/wvp269_1?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&serverTimezone=PRC&useSSL=false&allowMultiQueries=true&allowPublicKeyRetrieval=true
                    username: root

修改为

        dynamic:
            primary: master
            datasource:
                master:
                    type: com.zaxxer.hikari.HikariDataSource
                    driver-class-name: com.mysql.cj.jdbc.Driver
                    url: jdbc:mysql://127.0.0.1:3306/wvp2?useUnicode=true&characterEncoding=UTF8&rewriteBatchedStatements=true&serverTimezone=PRC&useSSL=false&allowMultiQueries=true
                    username: root
                    password: root123
                    hikari:
                        connection-timeout: 20000             # 是客户端等待连接池连接的最大毫秒数
                        initialSize: 50                       # 连接池初始化连接数
                        maximum-pool-size: 200                # 连接池最大连接数
                        minimum-idle: 10                       # 连接池最小空闲连接数
                        idle-timeout: 300000                  # 允许连接在连接池中空闲的最长时间(以毫秒为单位)
                        max-lifetime: 1200000                 # 是池中连接关闭后的最长生命周期(以毫秒为单位)    
2.4.5.建立并导入数据库
#复制数据库
cp wvp-GB28181-pro/数据库/2.7.3/初始化-mysql-2.7.3.sql config/mysql.sql
create DATABASE wvp2;
use wvp2;
source /home/multimedia/gb28181/wvp_zlm_platform/config/mysql.sql;
flush privileges;
exit

2.5.跨域配置

# [根据业务需求配置]
user-settings:
    # 跨域配置,不配置此项则允许所有跨域请求,配置后则只允许配置的页面的地址请求, 可以配置多个
    allowed-origins:
        - http://localhost:8008
        - http://192.168.137.2:8008

运行

准备运行脚本

ZLMediaKit.sh

WVP_ZLM_PLATFORM_PATH=/home/multimedia/gb28181/wvp_zlm_platform
ZLMEDIAKIT_MEDIASERVER=${WVP_ZLM_PLATFORM_PATH}/ZLMediaKit/release/linux/Debug/MediaServer
ZLMEDIAKIT_CONFIG_FILE=${WVP_ZLM_PLATFORM_PATH}/config/ZLMediaKit.ini

sudo ${ZLMEDIAKIT_MEDIASERVER} -c ${ZLMEDIAKIT_CONFIG_FILE}

wvp_gb28181.sh

WVP_ZLM_PLATFORM_PATH=/home/multimedia/gb28181/wvp_zlm_platform
WVP_GB28181_JAR=${WVP_ZLM_PLATFORM_PATH}/wvp-GB28181-pro/target/wvp-pro-2.7.3-10250742.jar
WVP_GB28181_CONFIG_FILE=${WVP_ZLM_PLATFORM_PATH}/config/wvp_gb28181.yml

sudo java -jar ${WVP_GB28181_JAR} --spring.config.location=${WVP_GB28181_CONFIG_FILE}

运行服务

每个脚本需要一个终端窗口

#需要先运行ZLMediaKit
ZLMediaKit.sh
#测试
http://192.168.137.2/
https://192.168.137.2/webassist/?secret=BkPj2ca6QPpY5RccREJq4kAOu9ZEt70x
https://192.168.137.2/webrtc

#然后运行wvp_gb28181
./wvp_gb28181.sh
#测试
http://192.168.137.2:18080/#/login
#用户名: admin
#密码: admin

使用国标设备对接国标服务器

可能手头没有国标设备,为了方便验证国标服务器是否搭建成功,这里使用国标模拟设备进行对接测试.国标模拟设备选择 http://happytimesoft.com/的国标模拟设备,下载地址为 http://happytimesoft.com/products/gb28181-device/index.html,支持windows x86,windows x64, linux,andorid等,这里使用windows x64版本.

下载后解压修改配置文件gb28181device.cfg,其他保持不变.

<?xml version="1.0" encoding="utf-8"?>
<config>                    
    <server_ip>192.168.137.2</server_ip>
    <server_port>5061</server_port>
    <server_id>32050950002000005001</server_id>
    <server_domain>Local1</server_domain>
    <device_id>32050950002000005067</device_id>
    <device_name>myTestDevice</device_name>
    <password>eLTE@com123</password>
    <channel>
        <cid>32050950001320418045</cid>
        <cname>myTestCh1</cname>
    </channel>
</config>

双击GB28181Device.exe运行国标模拟设备,在国标设备页面显示出设备

在这里插入图片描述

虚拟设备控制台显示如下信息说明注册成功

Happytime GB28181 Device V7.0
Registering to the platform 192.168.137.2
sip_ntf_cb, evt : PUEVT_REGING
sip server date : 2024-10-28T14:58:32.148
sip_ntf_cb, evt : PUEVT_REG_PASS

http://192.168.137.2:18080中打开’国标设备->通道->播放’,即可正常播放,效果如下图

在这里插入图片描述

云端录像

参考官网文档: https://doc.wvp-pro.cn/#/

由于需要验证音频是否正常,录像后发送到手机端播放.

摘录官方文档说明
云端录像 云端录像是对录制在zlm服务下的录像文件的管理,录像的文件路径默认在ZLM/www/record下。

  • 国标设备是否录像: 可以再WVP的配置中user-settings.record-sip设置为true那么每次点播以及录像回放都会录像;
  • 推流设备是否录像: 可以再WVP的配置中user-settings.record-push-live设置为true;
  • 拉流代理的是否录像: 在添加和编辑拉流代理时可以指定, 每次点播都会进行录像
  • 录像文件存储路径配置: 可以修改media.record-path来修改录像路径,但是如果有旧的录像文件,请不要迁移,因为数据库记录了每一个录像的绝对路径,一旦修改会造成找到文件,无法定时移除以及播放
  • 录像保存时间: 可以修改media.record-day来修改录像保存时间,单位是天;

保证如下设置即可:

# [根据业务需求配置]
user-settings:
    # 国标是否录制
    record-sip: true

在国标设备页面设置开启音频,然后播放,此时会在ZLMediaKit相应目录下录制文件.

例如:

/home/multimedia/gb28181/wvp_zlm_platform/ZLMediaKit/release/linux/Debug/www/record/rtp
tree
.
├── 32050950002000005065_32050950002000005061
│   └── 2024-10-28
│       ├── 15-42-12-0.mp4
│       └── 15-44-26-0.mp4
├── 32050950002000005065_32050950002000005062
│   └── 2024-10-28
│       └── 15-44-00-0.mp4
├── 32050950002000005065_32050950002000005063
│   └── 2024-10-28
│       └── 15-44-40-0.mp4
└── 32050950002000005067_32050950001320418045
    └── 2024-10-28
        └── 15-36-13-0.mp4

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AutoOps 使每个 Elasticsearch 部署都更易于管理

作者&#xff1a;来自 Elastic Ziv Segal&#xff0c;Ori Shafir AutoOps for Elasticsearch 通过性能建议、资源利用率和成本洞察、实时问题检测和解决路径显著简化了集群管理。 虽然 Elasticsearch 是一款功能强大且可扩展的搜索引擎&#xff0c;可提供多种功能&#xff0c;但…

Excel:vba实现正则匹配

一、匹配数字 实现的效果&#xff1a;(点击右边“提取数字”按钮) 实现的代码&#xff1a; Sub 提取数字() Dim cell As Range Dim sj As Object Dim regx As Object Dim ss As Object Dim n As Integer创建了一个 VBScript 正则表达式对象 regx&#xff0c;用于匹配特定模式…

第三十五篇:HTTP报文格式,HTTP系列二

HTTP 是超⽂本传输协议&#xff0c;也就是HyperText Transfer Protocol。 前面我们讲到第三章中网络协议的定义&#xff0c;网络协议的定义&#xff1a;网络协议是通信计算机双方必须共同遵从的一组约定。就像两个人要进行交流&#xff0c;如果不制定一套约定&#xff0c;一方…

[JAVAEE] 面试题(四) - 多线程下使用ArrayList涉及到的线程安全问题及解决

目录 一. 多线程下使用ArrayList 1.1. 自行判断加锁 1.2 使用Collections.synchronizedList()套壳加锁 1.3 CopyOnWriteArrayList类 二. 总结 一. 多线程下使用ArrayList 多线程下使用ArrayList会涉及到线程安全问题, 例如: public static void main(String[] args) thro…

使用axois自定义基础路径,自动拼接前端服务器地址怎么办

请求路径&#xff1a; http://localhost:5173/http://pcapi-xiaotuxian-front-devtest.itheima.net/home/category/head 很明显多拼接了路径地址 查看基础路径文件发现&#xff1a; //axios基础封装 import axios from axiosconst httpInstance axios.create({baseURL: /h…

docker镜像仓库常用命令

docker镜像仓库常用命令 docker logindocker logoutdocker pulldocker pushdocker searchdocker imagesdocker image inspectdocker tagdocker rmidocker image prunedocker savedocker loaddocker history docker login 语法: docker login [options] [server] 功能&#xff…

itextpdf打印A5的问题

使用A5打印的时候&#xff0c;再生成pdf是没有问题的。下面做了一个测试&#xff0c;在打印机中&#xff0c;使用A5的纸张横向放入&#xff0c;因为是家用打印机&#xff0c;A5与A4是同一个口&#xff0c;因此只能这么放。 使用itextpdf生成pdf&#xff0c;在浏览器中预览pdf是…

python项目实战---使用图形化界面下载音乐

音乐下载 设计思路&#xff1a; 设计界面编写爬虫代码绑定爬虫打包exe文件 这个是最终的设计成果&#xff0c;所有的下载歌曲都在“下载mp3”文件夹里面 完整代码 逻辑代码 import os.path import reimport requests from PyQt5.QtWidgets import QApplication,QWidget,QM…

Golang--协程和管道

1、概念 程序&#xff1a; 是为完成特定任务、用某种语言编写的一组指令的集合,是一段静态的代码。(程序是静态) 进程&#xff1a; 是程序的一次执行过程。正在运行的一个程序&#xff0c;进程作为资源分配的单位&#xff0c;在内存中会为每个进程分配不同的内存区域&#xff0…

C语言 | Leetcode C语言题解之第543题二叉树的直径

题目&#xff1a; 题解&#xff1a; typedef struct TreeNode Node;int method (Node* root, int* max) {if (root NULL) return 0;int left method (root->left, max);int right method (root->right, max);*max *max > (left right) ? *max : (left right);…

如何简化App Store提现?——作为游戏开发者的跨境收款体验分享

目录 如何简化App Store提现&#xff1f;——作为游戏开发者的跨境收款体验分享跨境收款常见的几个问题使用万里汇收款后的体验1. 结算流程简单&#xff0c;到账更快2. 多场景收付更灵活3. 多种支付方式支持 使用后的效果&#xff1a;资金管理更高效个人建议 如何简化App Store…

sql报错信息将字符串转换为 uniqueidentifier 时失败

报错信息&#xff1a; [42000] [Microsoft][SQL Server Native Client 10.0][SQL Server]将字符串转换为 uniqueidentifier 时失败 出错行如下&#xff1a; 表A.SourceCode 表B.ID 出错原因&#xff1a; SourceCode是nvarchar,但ID是uniqueidentifier 数据库查询字段和类…

【简信CRM-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

DevOps业务价值流:架构设计最佳实践

系统设计阶段作为需求与研发之间的桥梁&#xff0c;在需求设计阶段的原型设计评审环节&#xff0c;尽管项目组人员可能未完全到齐&#xff0c;但关键角色必须到位&#xff0c;包括技术组长和测试组长。这一安排旨在同步推进两项核心任务&#xff1a;一是完成系统的架构设计&…

分享:文本转换工具:PDF转图片,WORD转PDF,WORD转图片

前言 鉴于网上大多数在线转换工具要么需要收费&#xff0c;要么免费后但转换质量极差的情况&#xff0c;本人开发并提供了PDF转图片&#xff0c;WORD转PDF&#xff0c;WORD转图片等的文本转换工具。 地址 http://8.134.236.93/entry/login 账号 账号&#xff1a;STAR001&a…

sublime可以写python吗

首先你需要安装一个Sublime Text&#xff08;http://www.sublimetext.com/&#xff09;和一个Python&#xff08;https://www.python.org/downloads/&#xff09;&#xff0c; 接下来打开Sublime Text&#xff1a; 1、如下图所示&#xff0c;点击菜单栏中的Tools —> Buil…

聊一聊Elasticsearch的基本原理与形成机制

1、搜索引擎的基本原理 通常搜索引擎包括&#xff1a;数据采集、文本分析、索引存储、搜索等模块&#xff0c;它们之间的协作流程如下图&#xff1a; 数据采集模块负责采集需要搜索的数据源。 文本分析模块是将结构化数据中的长文本切分成有实际意义的词&#xff0c;这样用户…

IO流篇(一、File)

目录 一、学习前言 二、文件简介 三、文件使用 1. 绝对路径 vs 相对路径 2. 路径分隔符 3. 属性&#xff08;字段&#xff09; 4. 构造方法 5. 常用方法 5.1. 获取文件的相关信息 5.2. 判断功能 5.3. 新建和删除 5.4. 文件的获取 5.5. 重命名文件 四、文件使用练习…

【部署glm4】属性找不到、参数错误问题解决(思路:修改模型包版本)

前言&#xff1a;在部署glm时&#xff0c;遇到了一些属性找不到、参数错误的问题&#xff0c;通常遇到这种问题都是因为模型包版本问题导致的&#xff0c;要注意模型版本是否可用。 【运行官方vllm_cli_demo.py】报错 GLM-4: [rank0]: Traceback (most recent call last): [ran…

全双工通信协议WebSocket——使用WebSocket实现智能学习助手/聊天室功能

一.什么是WebSocket&#xff1f; WebSocket是基于TCP的一种新的网络协议。它实现了浏览器与服务器的全双工通信——浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c;并进行双向数据传输 HTTP 协议是一种无状态的、无连接的、单向的应用…