干货分享 | TSMaster RPC 基础入门:编程指导和使用说明

news2024/9/20 16:48:48

介绍RPC模块前,我们先浅聊一下RPC的相关说明,以及在什么样的情况下需要了解本文 。

1. RPC 说明

远程过程调用(RPC, Remote Procedure Call)是一种网络通信协议,使得程序可以调用另一台计算机上的程序或服务,就像调用本地的程序一样。RPC 的主要目的是简化分布式计算,使得开发者无需关注底层的网络通信细节。

2. 什么情况下需要了解此文章?

用户基于 TSMaster 开发了对应的应用工程,想在外部程序中自动化控制TSMaster,可以查阅此文章。(备注:除了 RPC,TSMaster还提供了基于COM的接口,有需求可另行查阅相关文章。)

本文适用程控模式:TSMaster1 控制 TSMaster2,或者其他进程控制 TSMaster 进程(使用 TSMaster.dll)适用于语言:C++ 、Python、 C#等语言。

一、RPC的基本概念

客户端和服务器:

客户端:发起 RPC 请求的程序。

服务器:接收 RPC 请求并执行相应过程的程序。

代理:

客户端代理:封装请求并将其发送到服务器。

服务器代理:接收请求,解包并调用本地过程,之后将结果返回给客户端代理。

通信机制:

传输协议:底层使用的协议,比如 TCP、UDP。

数据序列化:将数据结构或对象转换成可以传输的格式,比如 JSON、XML、Protocol Buffers。

RPC 工作流程:

  ● 客户端调用本地代理方法:客户端调用一个看似本地的方法,但实际上这个方法由客户端代理负责处理;

  ● 客户端代理序列化请求:将方法名、参数等信息打包成消息;

  ● 消息传输:客户端代理将消息通过网络传输到服务器;

  ● 服务器代理解包请求:接收到消息后,服务器代理解包消息并调用实际的本地方法;

  ● 执行方法并生成响应:本地方法执行完毕后,生成响应结果;

  ● 服务器代理打包响应:服务器代理将结果打包成消息并通过网络发送回客户端;

  ● 客户端代理解包响应:客户端代理接收到响应消息后,解包并将结果返回给客户端。

二、TSMaster RPC 应用

1.RPC 功能

基于 TSMaster 的 RPC 机制,用户可以在 TSMaster 上位机环境中搭建完整的工程,涵盖从测试用例开发到程控设备管理、总线通讯配置以及控制板卡操作等一系列流程。通过这一机制,用户能够高效地在客户端远程控制 TSMaster 服务器,实现对系统变量、CAN 信号、LIN 信号、FlexRay 信号以及以太网(ETH)信号等的读写操作。此外,用户还可以调用 TSMaster 服务器上定义的各种函数,进一步扩展和定制系统功能。

这种集成化的解决方案使得工程管理和自动化测试更加便捷和高效。用户无需在多个平台之间切换,即可完成包括硬件配置、信号监控、数据采集和测试执行等复杂任务。通过TSMaster 的 RPC 机制,用户在客户端即可实现对服务器的远程程控,简化了操作流程,提高了测试和开发效率,确保了系统的稳定性和可靠性。

TSMaster 提供了强大的接口和丰富的功能模块,用户可以根据需求灵活组合使用,实现对各种信号和设备的精细控制和管理。这种架构不仅适用于研发测试阶段,也适用于生产环境中的实时监控和故障诊断,极大提升了工程项目的整体质量和效率。

不仅如此,TSMaster 的 RPC 机制支持多种拓扑结构,不仅可以实现客户端与服务器之间的一对一通信,还能够实现以下复杂的通信拓扑:

1:一对多 (One-to-Many):单个客户端可以同时控制多个 TSMaster 服务器,适用于需要同时管理多个测试环境或设备的情况。

2:多对一 (Many-to-One):多个客户端可以同时连接到一个 TSMaster 服务器,这样不同的用户或测试系统可以共享同一个服务器资源,实现协同工作和资源共享。

3:多对多 (Many-to-Many):多个客户端和多个服务器之间可以进行灵活的通信和控制,构建复杂的分布式测试和控制系统,适用于大型工程项目和分布式测试环境。

图片

这种灵活的拓扑结构使得 TSMaster 能够适应各种复杂的工程需求,无论是在单一项目中还是在跨项目、跨地域的分布式测试中,都能提供高效、可靠的解决方案。通过这种多样化的通信模式,用户可以最大限度地利用硬件和软件资源,提高系统的扩展性和灵活性,满足不同规模和复杂度的工程项目需求。

三、TSMaster RPC 使用说明

基于RPC本身机制,TSMaster提供了相应接口,在需要被程控的工程中,激活RPC server端,为程控脚本提供相应资源。

1. 激活 server

开启server端操作如下:

新建一个C脚本,在启动事件中输入下面代码,即表示激活了当前工程的rpc server rpc_tsmaster_activate_server(true);

实际上,在 TSMaster v2024.06.05.1124 版本之后,所有TSMaster工程已经默认激活了RPC功能。

2. 激活 client

native_int h; //client 句柄

//参数 1 为提供 rpc 服务的 TSMaster 应用程序名

com.rpc_tsmaster_create_client(“TSMaster”,&h);

//激活 client 端

Com.rpc_tsmaster_activate_client(h,true);

3. 修改 server 端数据

3.1 启动停止 server 工程

启动工程:

    TSMaster 小程序:

com.rpc_tsmaster_cmd_start_simulation(h);

     API(C\C++\C#\Python):

rpc_tsmaster_cmd_start_simulation(h);

3.2 读写系统变量

设置系统变量:

     TSMaster 小程序:

com.rpc_tsmaster_cmd_write_system_var(h, "Var1", "1.2345");

     API(C\C++\C#\Python):

rpc_tsmaster_cmd_write_system_var(h,"Var1","1.2345");

获取系统变量:

     TSMaster 小程序:

com.rpc_tsmaster_cmd_read_system_var(h, "Var1", "1.2345");

     API(C\C++\C#\Python):

rpc_tsmaster_cmd_read_system_var(h,"Var1","1.2345");

3.3 读写 CAN 信号

设置 CAN 信号:

     TSMaster 小程序:

com.rpc_tsmaster_cmd_set_can_signal(h,"chnidx/net/node/msg/signal", 1234)

     API(C\C++\C#\Python):

rpc_tsmaster_cmd_set_can_signal(h,"chnidx/net/node/msg/signal", 1234)

获取 CAN 信号:

    double d = 0;

    TSMaster 小程序:

com.rpc_tsmaster_cmd_get_can_signal(h,"chnidx/net/node/msg/signal", %d)

    API(C\C++\C#\Python):

rpc_tsmaster_cmd_get_can_signal(h,"chnidx/net/node/msg/signal", %d)

3.4 读写 LIN 信号

设置 LIN 信号:

    TSMaster 小程序:

com.rpc_tsmaster_cmd_set_lin_signal(h,"chnidx/net/node/msg/signal", 1234);

    API(C\C++\C#\Python):

rpc_tsmaster_cmd_set_lin_signal(h,"chnidx/net/node/msg/signal", 1234);

获取 LIN 信号:

    double d = 0;

    TSMaster 小程序:

com.rpc_tsmaster_cmd_get_lin_signal(h,"chnidx/net/node/msg/signal", %d);

    API(C\C++\C#\Python):

rpc_tsmaster_cmd_get_lin_signal(h,"chnidx/net/node/msg/signal", %d);

3.5 读写 FlexRay 信号

设置 FR 信号:

    TSMaster 小程序:

com.rpc_tsmaster_cmd_set_flexray_signal(h,"chnidx/net/node/msg/signal", 1234);

    API(C\C++\C#\Python):

rpc_tsmaster_cmd_set_flexray_signal(h,"chnidx/net/node/msg/signal", 1234);

获取 FR 信号:

    double d = 0;

    TSMaster 小程序:

com.rpc_tsmaster_cmd_get_can_signal(h,"chnidx/net/node/msg/signal", %d);

    API(C\C++\C#\Python):

rpc_tsmaster_cmd_get_can_signal(h,"chnidx/net/node/msg/signal", %d)

3.6 RPC 使用 TSMaster 系统函数

// 第一步:准备调用函数的输入参数

#define STR_BUFFER_SIZE 1024

char args[4][STR_BUFFER_SIZE];

char* pArgs[4] = {&args[0][0], &args[1][0], &args[2][0], &args[3][0]};

sprintf_s(pArgs[0], STR_BUFFER_SIZE, "%s", "var1");

sprintf_s(pArgs[1], STR_BUFFER_SIZE, "%d", svtString);

sprintf_s(pArgs[2], STR_BUFFER_SIZE, "%s", "string default value");

sprintf_s(pArgs[3], STR_BUFFER_SIZE, "%s", "this is a comment");

// 步骤 2:调用任意 API

s32 ret;

ret = com.rpc_tsmaster_call_system_api(h, "app.create_system_var", 4, STR_BUFFER_SIZE,

&pArgs[0]);

// 步骤 3:处理参数中的返回值(如果可用)

s32 i;

log("API call result = %d", ret);

for (i=0; i<4; i++){

log("Argument %d: %s", i+1, pArgs[i]);

}

上述代码等价与在 TSMaster 进程中使用 app.create_system_var 来创建系统变量,即:app.create_system_var(var1,svtString,”string default value”,”this is a comment”);

需要注意的是,使用该方式调用 TSMaster 内的系统函数,无法使用参数为指针类型(报文类型除外)的函数。

3.7 RPC 使用小程序库函数

// 第一步:准备调用函数的输入参数

#define STR_BUFFER_SIZE 1024

char args[4][STR_BUFFER_SIZE];

char* pArgs[4] = {&args[0][0], &args[1][0], &args[2][0], &args[3][0]};

sprintf_s(pArgs[0], STR_BUFFER_SIZE, "%s", "var1");

sprintf_s(pArgs[1], STR_BUFFER_SIZE, "%d", svtString);

sprintf_s(pArgs[2], STR_BUFFER_SIZE, "%s", "string default value");

sprintf_s(pArgs[3], STR_BUFFER_SIZE, "%s", "this is a comment");

//步骤 2:调用任意 API

s32 ret;TSMaster RPC 编程指导

ret = com.rpc_tsmaster_call_library_api(h, "mylib.create_system_var", 4, STR_BUFFER_SIZE,

&pArgs[0]);

// 步骤 3:处理参数中的返回值(如果可用)

s32 i;

log("API call result = %d", ret);

for (i=0; i<4; i++){

log("Argument %d: %s", i+1, pArgs[i]);

}

四、TSMaster RPC 函数说明

1.rpc_tsmaster_create_client

函数名称

UInt32 rpc_tsmaster_create_client(const char* ATSMasterAppName,const psize_t AHandle)

功能介绍

创建一个 TSMaster Rpc 客户端

调用位置

初始化 tsmaster lib 库之后

输入参数

ATSMasterAppName: TSMaster server 端的应用程序名称;

AHandle : TSMaster Rpc 客户端句柄

返回值

==0: 函数执行成功

其他值:函数执行失败

示例

s32 h;

rpc_tsmaster_create_client("TSMaster1", &h)

2.rpc_tsmaster_activate_client

函数名称

UInt32 rpc_tsmaster_activate_client(const size_t AHandle,const bool AActivate)

功能介绍

激活或者停用一个 TSMaster Rpc 客户端

调用位置

创建 TSMaster Rpc 客户端之后

输入参数

AHandle : TSMaster Rpc 客户端句柄

AActivate: true=激活,false=停用

返回值

==0: 函数执行成功

其他值:函数执行失败

示例

rpc_tsmaster_activate_client(h, true)

3.rpc_tsmaster_is_simulation_running

函数名称

UInt32 rpc_tsmaster_is_simulation_running(const size_t AHandle,const pbool AIsRunning)

功能介绍

获取远程 TSMaster 仿真运行的状态

调用位置

创建 TSMaster Rpc 客户端之后

输入参数

AHandle : TSMaster Rpc 客户端句柄

AIsRunning:远程 TSMaster 仿真运行的状态的数据指针

True=正在运行,false=未运行

返回值

==0: 函数执行成功

其他值:函数执行失败

示例

bool b;

if (0 == com.rpc_tsmaster_is_simulation_running(h, &b)){

if (b){

// current simulation is running

}

}

4.rpc_tsmaster_cmd_set_mode_realtime

函数名称

UInt32 rpc_tsmaster_cmd_set_mode_realtime(const size_t AHandle)

功能介绍

将 TSMaster Rpc server 配置为实时模式

调用位置

创建 TSMaster Rpc 客户端之后,仿真运行之前

输入参数

AHandle : TSMaster Rpc 客户端句柄

返回值

==0: 函数执行成功

其他值:函数执行失败

示例

rpc_tsmaster_cmd_set_mode_realtime(h)

5.rpc_tsmaster_cmd_set_mode_sim

函数名称

UInt32 rpc_tsmaster_cmd_set_mode_sim(const size_t AHandle)

功能介绍

将 TSMaster Rpc server 配置为仿真模式

调用位置

创建 TSMaster Rpc 客户端之后,仿真运行之前

输入参数

AHandle : TSMaster Rpc 客户端句柄

返回值

==0: 函数执行成功

其他值:函数执行失败

示例

rpc_tsmaster_cmd_set_mode_sim(h)

6.rpc_tsmaster_cmd_start_simulation

函数名称

UInt32 rpc_tsmaster_cmd_start_simulation(const size_t AHandle)

功能介绍

启动 TSMaster Rpc server 仿真

调用位置

创建 TSMaster Rpc 客户端之后

输入参数

AHandle : TSMaster Rpc 客户端句柄

返回值

==0: 函数执行成功

其他值:函数执行失败

示例

rpc_tsmaster_cmd_start_simulation(h)

7.rpc_tsmaster_cmd_set_can_signal

函数名称

UInt32 rpc_tsmaster_cmd_set_can_signal(const size_t AHandle,const

char* ASgnAddress,const double AValue)

功能介绍

在远程 TSMaster 上修改数据库中的 CAN 信号值

调用位置

创建 TSMaster Rpc 客户端之后

输入参数

AHandle : TSMaster Rpc 客户端句柄

ASgnAddress:数据库中信号的路径

AValue: 信号值

返回值

==0: 函数执行成功

其他值:函数执行失败

示例

if(0==rpc_tsmaster_cmd_set_can_signal(h,

"0/CAN_FD_Powertrain/Engine/EngineData/EngSpeed", 1234)){

// signal written

}

8.rpc_tsmaster_cmd_get_can_signal

函数名称

UInt32 rpc_tsmaster_cmd_get_can_signal(const size_t AHandle,const

char* ASgnAddress,const pdouble AValue)

功能介绍

在远程 TSMaster 上获取数据库中的 CAN 信号值

调用位置

创建 TSMaster Rpc 客户端之后

输入参数

AHandle : TSMaster Rpc 客户端句柄

ASgnAddress:数据库中信号的路径

AValue: 信号值指针

返回值

==0: 函数执行成功

其他值:函数执行失败

示例

double d;

if(0==rpc_tsmaster_cmd_get_can_signal(h,

"0/CAN_FD_Powertrain/Engine/EngineData/EngSpeed", &d)){

// signal is retrieved

}

9.rpc_tsmaster_cmd_set_lin_signal

函数名称

UInt32 rpc_tsmaster_cmd_set_lin_signal(const size_t AHandle,const

char* ASgnAddress,const double AValue)

功能介绍

在远程 TSMaster 上修改数据库中的 LIN 信号值

调用位置

创建 TSMaster Rpc 客户端之后

输入参数

AHandle : TSMaster Rpc 客户端句柄

ASgnAddress:数据库中信号的路径

AValue: 信号值

返回值

==0: 函数执行成功

其他值:函数执行失败

示例

if(0==rpc_tsmaster_cmd_set_lin_signal(h,

"chnidx/net/node/msg/signal", 1234)){

// signal written

}

10.rpc_tsmaster_cmd_get_lin_signal

函数名称

UInt32 rpc_tsmaster_cmd_get_lin_signal(const size_t AHandle,const

char* ASgnAddress,const pdouble AValue)

功能介绍

在远程 TSMaster 上获取数据库中的 LIN 信号值

调用位置

创建 TSMaster Rpc 客户端之后

输入参数

AHandle : TSMaster Rpc 客户端句柄

ASgnAddress:数据库中信号的路径

AValue: 信号值指针

返回值

==0: 函数执行成功

其他值:函数执行失败

示例

double d;

if(0==rpc_tsmaster_cmd_get_lin_signal(h,

"chnidx/net/node/msg/signal", &d)){

// signal is retrieved

}

11.rpc_tsmaster_cmd_set_flexray_signal

函数名称

UInt32 rpc_tsmaster_cmd_set_flexray_signal(const size_t  AHandle,const char* ASgnAddress,const double AValue)

功能介绍

在远程 TSMaster 上修改数据库中的 flexray 信号值

调用位置

创建 TSMaster Rpc 客户端之后

输入参数

AHandle : TSMaster Rpc 客户端句柄

ASgnAddress:数据库中信号的路径

AValue: 信号值

返回值

==0: 函数执行成功

其他值:函数执行失败

示例

if(0==rpc_tsmaster_cmd_set_flexray_signal(h,

"chnidx/net/node/msg/signal", 1234)){

// signal written

}

12.rpc_tsmaster_cmd_get_flexray_signal

函数名称

UInt32 rpc_tsmaster_cmd_get_flexray_signal(const size_t AHandle,const char* ASgnAddress,const pdouble AValue)

功能介绍

在远程 TSMaster 上获取数据库中的 flexray 信号值

调用位置

创建 TSMaster Rpc 客户端之后

输入参数

AHandle : TSMaster Rpc 客户端句柄

ASgnAddress:数据库中信号的路径

AValue: 信号值指针

返回值

==0: 函数执行成功

其他值:函数执行失败

示例

double d;

if(0==rpc_tsmaster_cmd_get_flexray_signal(h,

"chnidx/net/node/msg/signal", &d)){

// signal is retrieved

}

13.rpc_tsmaster_cmd_write_system_var

函数名称

UInt32 rpc_tsmaster_cmd_write_system_var(const size_t AHandle,const char* ACompleteName,const char* AValue)

功能介绍

从远程 TSMaster 按名称写入系统变量

调用位置

创建 TSMaster Rpc 客户端之后

输入参数

AHandle : TSMaster Rpc 客户端句柄

ACompleteName:系统变量名称

AValue: 数据值

返回值

==0: 函数执行成功

其他值:函数执行失败

示例

rpc_tsmaster_cmd_write_system_var(h, "v1", "1.2345")

14.rpc_tsmaster_cmd_read_system_var

函数名称

UInt32 rpc_tsmaster_cmd_read_system_var(const size_t AHandle,const char* ASysVarName,const pdouble AValue)

功能介绍

从远程 TSMaster 按名称读取系统变量    

调用位置

创建 TSMaster Rpc 客户端之后

输入参数

AHandle : TSMaster Rpc 客户端句柄

ASysVarName:系统变量名称

AValue: 数据值指针

返回值

==0: 函数执行成功

其他值:函数执行失败

示例

double d;

if (0 == rpc_tsmaster_cmd_read_system_var(h, "v1", &d)){

log("value = %f", d);

}

15.rpc_tsmaster_cmd_write_signal

函数名称

UInt32 rpc_tsmaster_cmd_write_signal(const size_t AHandle,const TLIBApplicationChannelType ABusType,const char* AAddr,const double

AValue)

功能介绍

从远程 TSMaster 按名称写入信号值

调用位置

创建 TSMaster Rpc 客户端之后

输入参数

AHandle : TSMaster Rpc 客户端句柄

ABusType:总线类型

AAddr:数据库中信号的路径

AValue: 数据值

返回值

==0: 函数执行成功

其他值:函数执行失败

示例

if(0==rpc_tsmaster_cmd_write_signal(h,APP_CAN,

"0/Powertrain/Engine/EngSpeed", 1234)){

// value written

}

16.rpc_tsmaster_cmd_read_signal

函数名称

UInt32 rpc_tsmaster_cmd_read_signal(const size_t AHandle,const TLIBApplicationChannelType ABusType,const char* AAddr,const

pdouble AValue)

功能介绍

从远程 TSMaster 按名称读取信号

调用位置

创建 TSMaster Rpc 客户端之后

输入参数

AHandle : TSMaster Rpc 客户端句柄

ABusType:总线类型

AAddr:数据库中信号的路径

AValue: 数据值指针

返回值

==0: 函数执行成功

其他值:函数执行失败

示例

double d;

if(0==rpc_tsmaster_cmd_read_signal(h,APP_CAN,

"0/Powertrain/Engine/EngSpeed", &d)){

log("signal value = %f", d);

}

17.rpc_tsmaster_delete_client

函数名称

UInt32 rpc_tsmaster_delete_client(const size_t AHandle)

功能介绍

删除 rpc client

调用位置

创建 TSMaster Rpc 客户端之后

输入参数

AHandle : TSMaster Rpc 客户端句柄

返回值

==0: 函数执行成功

其他值:函数执行失败

示例

rpc_tsmaster_delete_client(h)

18.rpc_tsmaster_cmd_stop_simulation

函数名称

UInt32 rpc_tsmaster_cmd_stop_simulation(const size_t AHandle)

功能介绍

停止远程 TSMaster 仿真

调用位置

创建 TSMaster Rpc 客户端之后

输入参数

AHandle : TSMaster Rpc 客户端句柄

返回值

==0: 函数执行成功

其他值:函数执行失败

示例

rpc_tsmaster_cmd_stop_simulation(h)

19.rpc_tsmaster_call_system_api

函数名称

UInt32 rpc_tsmaster_call_system_api(const size_t AHandle,const char* AAPIName,const s32 AArgCount,const s32 AArgCapacity,const

char** AArgs)

功能介绍

Client 调用 server 端使用系统函数

调用位置

创建 TSMaster Rpc 客户端之后

输入参数

AHandle : TSMaster Rpc 客户端句柄

AAPIName:系统函数名称,”app.create_system_var”

AArgCount: 函数参数数量

AArgCapacity:参数字符串长度

AArgs:参数字符串数组

返回值

==0: 函数执行成功

其他值:函数执行失败

示例

// 第一步:准备调用函数的输入参数

#define STR_BUFFER_SIZE 1024

char args[4][STR_BUFFER_SIZE];

char* pArgs[4] = {&args[0][0], &args[1][0], &args[2][0], &args[3][0]};

sprintf_s(pArgs[0], STR_BUFFER_SIZE, "%s", "var1");

sprintf_s(pArgs[1], STR_BUFFER_SIZE, "%d", svtString);

sprintf_s(pArgs[2], STR_BUFFER_SIZE, "%s", "string default value");

sprintf_s(pArgs[3], STR_BUFFER_SIZE, "%s", "this is a comment");

// 步骤 2:调用任意 API

s32 ret;

ret = com.rpc_tsmaster_call_system_api(h, "app.create_system_var", 4,

STR_BUFFER_SIZE, &pArgs[0]);

// 步骤 3:处理参数中的返回值(如果可用)

s32 i;

log("API call result = %d", ret);

for (i=0; i<4; i++){

log("Argument %d: %s", i+1, pArgs[i]);

}

20.rpc_tsmaster_call_library_api

函数名称

UInt32 rpc_tsmaster_call_library_api(const size_t AHandle,const char* AAPIName,const s32 AArgCount,const s32 AArgCapacity,const  char** AArgs)

功能介绍

Client 调用 server 端使用系统函数

调用位置

创建 TSMaster Rpc 客户端之后

输入参数

AHandle : TSMaster Rpc 客户端句柄

AAPIName:小程序库函数名称,”mylib.create_system_var”

AArgCount: 函数参数数量

AArgCapacity:参数字符串长度

AArgs:参数字符串数组

返回值

==0: 函数执行成功

其他值:函数执行失败

示例

// 第一步:准备调用函数的输入参数

#define STR_BUFFER_SIZE 1024

char args[4][STR_BUFFER_SIZE];

char* pArgs[4] = {&args[0][0], &args[1][0], &args[2][0], &args[3][0]};

sprintf_s(pArgs[0], STR_BUFFER_SIZE, "%s", "var1");

sprintf_s(pArgs[1], STR_BUFFER_SIZE, "%d", svtString);

sprintf_s(pArgs[2], STR_BUFFER_SIZE, "%s", "string default value");

sprintf_s(pArgs[3], STR_BUFFER_SIZE, "%s", "this is a comment");

//步骤 2:调用任意 API

s32 ret;

ret = com.rpc_tsmaster_call_library_api(h, "mylib.create_system_var",

4, STR_BUFFER_SIZE, &pArgs[0]);

// 步骤 3:处理参数中的返回值(如果可用)

s32 i;

log("API call result = %d", ret);

for (i=0; i<4; i++){

log("Argument %d: %s", i+1, pArgs[i]);

}

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

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

相关文章

# Redis 入门到精通(五)-- redis 持久化(2)

Redis 入门到精通&#xff08;五&#xff09;-- redis 持久化&#xff08;2&#xff09; 一、redis 持久化–save 配置与工作原理 1、RDB 启动方式&#xff1a;反复执行保存指令&#xff0c;忘记了怎么办&#xff1f;不知道数据产生了多少变化&#xff0c;何时保存&#xff1…

多核并行加速 tokenizer

import multiprocessingdef tokenize_text(text):return tokenizer(text, truncationTrue, paddingTrue, max_length256)def parallel_tokenize(texts, num_processesNone):"""使用多核并行处理文本分词"""with multiprocessing.Pool(processesn…

uniapp开发APP,主动连接mqtt,订阅消息

一、安装依赖 通过查阅资料&#xff0c;了解到现在mqtt.js库的最新版本已经是5&#xff0c;但是目前应该mqtt3.0.0版本最为稳定&#xff0c;我项目开发中使用的也是mqtt3.0.0版本 npm install mqtt3.0.0 参考插件&#xff1a;MQTT使用-模板项目 - DCloud 插件市场 参考文档…

鸿蒙Harmony--文本组件Text属性详解

金樽清酒斗十千&#xff0c;玉盘珍羞直万钱。 停杯投箸不能食&#xff0c;拔剑四顾心茫然。 欲渡黄河冰塞川&#xff0c;将登太行雪满山。 闲来垂钓碧溪上&#xff0c;忽复乘舟梦日边。 行路难&#xff0c;行路难&#xff0c;多歧路&#xff0c;今安在&#xff1f; 长风破浪会有…

java中的String 以及其方法(超详细!!!)

文章目录 一、String类型是什么String不可变的原因(经典面试题)String不可变的好处 二、String的常用构造形式1.使用常量串构造2.使用newString对象构造3.字符串数组构造 三、常用方法1. length() 获取字符串的长度2. charAt() 获取字符串中指定字符的值 (代码单元)3. codePoin…

ES快速开发,ElasticsearchRestTemplate基本使用以及ELK快速部署

最近博主有一些elasticsearch的工作&#xff0c;所以更新的慢了些&#xff0c;现在就教大家快速入门&#xff0c;并对一些基本的查询、更新需求做一下示例&#xff0c;废话不多说开始&#xff1a; 1. ES快速上手 es下载&#xff1a;[https://elasticsearch.cn/download/]()这…

记录|C#连接PLC通讯

参考视频C#连接S71200PLC 参考资料 目录 前言一、使用工具二、博图PLC1.创建好PLC设备Step1. 创建新设备Step2. 自动配置CPUStep3. 配置IP协议和连接机制隐藏步骤&#xff1a;重置解决PLC硬件版本和PLCSim创建的PLC版本不兼容Step4. 通过HslDemo来测试是否连通Step5. 配置DB数据…

C语言课程回顾:十、C语言之 指针

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 C语言之 指针 10 指针10.1 地址指针的基本概念10.2 变量的指针和指向变量的指针变量10.2.1 定义一个指针变量10.2.2 指针变量的引用10.2.3 指针变量作为函数参数10.2.4 指针变…

性能测试中唯一标识的JMH测试

前文分享了几种性能测试中常用到的生成全局唯一标识的案例&#xff0c;虽然在文中我猜测了几种方案设计的性能&#xff0c;并根据自己的经验给出了适用的场景。 但对于一个性能测试工程师来讲&#xff0c;有真是测试数据才更有说服力。这让我想起来之前学过的Java微基准测试框…

记录些MySQL题集(2)

MySQL 不使用limit的分页查询 limit问题&#xff1a;limit&#xff0c;offset递增问题。随着offset的增加&#xff0c;条数不变&#xff0c;耗时却增加了。 limit 0,10 耗时1ms limit 300000,10 耗时152ms limit 600000,10 耗时312ms 毫秒级别可能没感觉。假…

java:aocache 与Spring Aop兼容问题

本文适用于所有AspectJ与Spring AOP混用的场景。 Spring AOP 是基于动态代理的实现AOP&#xff0c;基于 JDK代理和CGLib代理实现运行时织入&#xff08;runtime weaving&#xff09;。 Spring AOP的切面定义沿用了ASpectJ的注解体系&#xff0c;所以在Spring体系中注解定义切面…

Java 将图片转base64和base64转图片

工具 Base64 和 图片互转。 导入的依赖 <!-- https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-impl --><dependency><groupId>com.sun.xml.bind</groupId><artifactId>jaxb-impl</artifactId><version>4.0.5</versi…

【Hot100】LeetCode—118. 杨辉三角

目录 题目1- 思路2- 实现⭐118. 杨辉三角——题解思路 3- ACM 实现 题目 原题连接&#xff1a;118. 杨辉三角 1- 思路 思路 爬楼梯&#xff1a;动规五部曲 2- 实现 ⭐118. 杨辉三角——题解思路 class Solution {List<List<Integer>> res new ArrayList<&g…

嵌入式全栈设计思路:STM32G4+ChibiOS+FreeRTOS+PID控制+PFC算法构建高效智能电源管理系统(附代码示例)

智能电源管理系统是一个基于STM32G4微控制器的高性能数字电源控制解决方案。本项目旨在设计一个功能全面、高效稳定的电源管理系统,可广泛应用于工业控制、新能源、通信设备等领域。 1.1 系统主要特点 高精度数字电源控制&#xff1a;利用STM32G4的高性能ADC和定时器,实现精确…

2024年肥西县“北斗·劳技科普进校园”赛事活动圆满举行

2024年6月13日肥西县“北斗劳技科普进校园”赛事活动在肥西实验高级中学圆满举行。本次赛事由肥西县关心下一代工作委员会和肥西县教育体育局主办&#xff0c;肥西县航空航海模型协会承办&#xff0c;肥西县实验高级中学协办&#xff0c;并得到了赛哆哆、凡尼科技中心和肥西艾瞳…

为什么渲染农场渲染的是帧,而不是视频?

在3D动画产业的壮阔画卷中&#xff0c;渲染农场作为幕后英雄&#xff0c;以其庞大的计算能力支撑起无数视觉奇观的诞生。这些由高性能计算机集群构成的系统&#xff0c;通过独特的逐帧渲染策略&#xff0c;解锁了单机难以企及的创作自由与效率。本文将深入剖析这一策略背后的逻…

springcloud使用微服务的搭建

微服务的搭建 1.配置对应信息 Springboot 、springcloud、springcloud alibaba对应关系 https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E 2.pom.xml的配置 2.1 总项目pom.xml引入依赖 <parent><groupId>org.sprin…

从库存超卖问题分析锁和分布式锁的应用(二)

本文从一个经典的库存超卖问题分析说明常见锁的应用&#xff0c;假设库存资源存储在Redis里面。 假设我们的减库存代码如下&#xff1a; Autowired StringRedisTemplate redisTemplate;public void deduct(){String stock redisTemplate.opsForValue().get("stock"…

docker desktop历史版本安装

1.安装choco Windows安装 choco包管理工具-CSDN博客 2.通过choco安装 下面例子为安装旧版2.3.0.2,其它版本类似 Chocolatey Software | Docker Desktop 2.3.0.2 https://download.docker.com/win/stable/45183/Docker%20Desktop%20Installer.exe choco install docker-des…

linux高级编程(网络)(www,http,URL)

数据的封包和拆包 封包&#xff1a; 应用层数据&#xff08;例如HTTP请求&#xff09;被传递给传输层。传输层&#xff08;TCP&#xff09;在数据前添加TCP头部&#xff08;包含端口号、序列号等&#xff09;。网络层&#xff08;IP&#xff09;在TCP段前添加IP头部&#xff…