BACnet device对象详解以及协议栈相关代码

2024-03-14 06:12

本文主要是介绍BACnet device对象详解以及协议栈相关代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • BACnet 设备对象device详细介绍和应用场景
    • BACnet设备对象类型及其相关的函数
    • 查找BACnet设备对象类型的辅助函数
    • 获取特定对象类型的特殊属性列表Device_Objects_Property_List
    • 处理BACnet协议中的写属性操作 Device_Write_Property_Local
    • 处理BACnet协议中的读属性操作 Device_Read_Property_Local

BACnet 设备对象device详细介绍和应用场景

BACnet(Building Automation and Control Networks)是一种用于建筑自动化和控制系统的通信协议。BACnet设备对象是BACnet协议中的一个重要概念,用于表示建筑自动化系统中的设备。

BACnet设备对象(Device Object)是BACnet网络中的主要实体,代表了一个物理设备或网络上的虚拟设备。每个BACnet设备对象都有一个唯一的标识符,称为设备实例号(Device Instance)。

BACnet设备对象具有以下属性:

设备标识(Device Identifier):一个唯一的标识符,用于区分BACnet网络中的不同设备。

设备类型(Device Type):指定设备的类型,例如控制器、传感器、执行器等。

设备名称(Device Name):设备的人类可读名称,用于标识设备。

设备描述(Description):对设备的描述信息,用于提供有关设备的详细说明。

系统状态(System Status):表示设备当前的状态,例如正常、故障、离线等。

支持的对象类型(Supported Object Types):列出设备支持的其他BACnet对象类型,例如输入对象、输出对象、变量对象等。

BACnet设备对象的主要应用场景是建筑自动化和控制系统,其中包括楼宇管理系统、智能家居系统、工业控制系统等。通过BACnet设备对象,可以实现以下功能:

监测和控制:BACnet设备对象允许监测和控制建筑自动化系统中的各种设备,例如传感器、执行器、控制器等。通过读取和写入设备对象的属性,可以获取传感器的测量值、控制执行器的操作等。

系统管理:BACnet设备对象提供了管理设备和网络的功能。可以通过设备对象的属性设置设备的参数、配置网络设置、监控设备状态等。

通信和集成:BACnet设备对象作为BACnet网络中的实体,可以与其他设备进行通信和集成。通过BACnet协议的通信机制,设备对象之间可以交换数据、发送命令和通知等。

事件和报警:BACnet设备对象可以生成事件和报警,用于监测系统中的异常情况。例如,当温度传感器检测到过高的温度时,设备对象可以生成一个报警,并通知相关的设备或操作人员。

BACnet设备对象是BACnet协议中的核心概念,用于表示建筑自动化系统中的设备,并提供了监测、控制、管理和通信等功能。它在楼宇管理、智能家居、工业控制等领域都有广泛的应用。

BACnet设备对象类型及其相关的函数

static object_functions_t My_Object_Table[] = {
{ OBJECT_DEVICE, NULL /* Init - don't init Device or it will recourse! /,
Device_Count, Device_Index_To_Instance,
Device_Valid_Object_Instance_Number, Device_Object_Name,
Device_Read_Property_Local, Device_Write_Property_Local,
Device_Property_Lists, DeviceGetRRInfo, NULL / Iterator /,
NULL / Value_Lists /, NULL / COV /, NULL / COV Clear /,
NULL / Intrinsic Reporting / },
#if (BACNET_PROTOCOL_REVISION >= 17)
{ OBJECT_NETWORK_PORT, Network_Port_Init, Network_Port_Count,
Network_Port_Index_To_Instance, Network_Port_Valid_Instance,
Network_Port_Object_Name, Network_Port_Read_Property,
Network_Port_Write_Property, Network_Port_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
#endif
{ OBJECT_ANALOG_INPUT, Analog_Input_Init, Analog_Input_Count,
Analog_Input_Index_To_Instance, Analog_Input_Valid_Instance,
Analog_Input_Object_Name, Analog_Input_Read_Property,
Analog_Input_Write_Property, Analog_Input_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /,
Analog_Input_Encode_Value_List, Analog_Input_Change_Of_Value,
Analog_Input_Change_Of_Value_Clear, Analog_Input_Intrinsic_Reporting },
{ OBJECT_ANALOG_OUTPUT, Analog_Output_Init, Analog_Output_Count,
Analog_Output_Index_To_Instance, Analog_Output_Valid_Instance,
Analog_Output_Object_Name, Analog_Output_Read_Property,
Analog_Output_Write_Property, Analog_Output_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_ANALOG_VALUE, Analog_Value_Init, Analog_Value_Count,
Analog_Value_Index_To_Instance, Analog_Value_Valid_Instance,
Analog_Value_Object_Name, Analog_Value_Read_Property,
Analog_Value_Write_Property, Analog_Value_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /,
Analog_Value_Encode_Value_List, Analog_Value_Change_Of_Value,
Analog_Value_Change_Of_Value_Clear, Analog_Value_Intrinsic_Reporting },
{ OBJECT_BINARY_INPUT, Binary_Input_Init, Binary_Input_Count,
Binary_Input_Index_To_Instance, Binary_Input_Valid_Instance,
Binary_Input_Object_Name, Binary_Input_Read_Property,
Binary_Input_Write_Property, Binary_Input_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /,
Binary_Input_Encode_Value_List, Binary_Input_Change_Of_Value,
Binary_Input_Change_Of_Value_Clear, NULL / Intrinsic Reporting / },
{ OBJECT_BINARY_OUTPUT, Binary_Output_Init, Binary_Output_Count,
Binary_Output_Index_To_Instance, Binary_Output_Valid_Instance,
Binary_Output_Object_Name, Binary_Output_Read_Property,
Binary_Output_Write_Property, Binary_Output_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_BINARY_VALUE, Binary_Value_Init, Binary_Value_Count,
Binary_Value_Index_To_Instance, Binary_Value_Valid_Instance,
Binary_Value_Object_Name, Binary_Value_Read_Property,
Binary_Value_Write_Property, Binary_Value_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_CHARACTERSTRING_VALUE, CharacterString_Value_Init,
CharacterString_Value_Count, CharacterString_Value_Index_To_Instance,
CharacterString_Value_Valid_Instance, CharacterString_Value_Object_Name,
CharacterString_Value_Read_Property,
CharacterString_Value_Write_Property,
CharacterString_Value_Property_Lists, NULL / ReadRangeInfo /,
NULL / Iterator /, NULL / Value_Lists /, NULL / COV /,
NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_COMMAND, Command_Init, Command_Count, Command_Index_To_Instance,
Command_Valid_Instance, Command_Object_Name, Command_Read_Property,
Command_Write_Property, Command_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_INTEGER_VALUE, Integer_Value_Init, Integer_Value_Count,
Integer_Value_Index_To_Instance, Integer_Value_Valid_Instance,
Integer_Value_Object_Name, Integer_Value_Read_Property,
Integer_Value_Write_Property, Integer_Value_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
#if defined(INTRINSIC_REPORTING)
{ OBJECT_NOTIFICATION_CLASS, Notification_Class_Init,
Notification_Class_Count, Notification_Class_Index_To_Instance,
Notification_Class_Valid_Instance, Notification_Class_Object_Name,
Notification_Class_Read_Property, Notification_Class_Write_Property,
Notification_Class_Property_Lists, NULL / ReadRangeInfo /,
NULL / Iterator /, NULL / Value_Lists /, NULL / COV /,
NULL / COV Clear /, NULL / Intrinsic Reporting / },
#endif
{ OBJECT_LIFE_SAFETY_POINT, Life_Safety_Point_Init, Life_Safety_Point_Count,
Life_Safety_Point_Index_To_Instance, Life_Safety_Point_Valid_Instance,
Life_Safety_Point_Object_Name, Life_Safety_Point_Read_Property,
Life_Safety_Point_Write_Property, Life_Safety_Point_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_LOAD_CONTROL, Load_Control_Init, Load_Control_Count,
Load_Control_Index_To_Instance, Load_Control_Valid_Instance,
Load_Control_Object_Name, Load_Control_Read_Property,
Load_Control_Write_Property, Load_Control_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_MULTI_STATE_INPUT, Multistate_Input_Init, Multistate_Input_Count,
Multistate_Input_Index_To_Instance, Multistate_Input_Valid_Instance,
Multistate_Input_Object_Name, Multistate_Input_Read_Property,
Multistate_Input_Write_Property, Multistate_Input_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_MULTI_STATE_OUTPUT, Multistate_Output_Init,
Multistate_Output_Count, Multistate_Output_Index_To_Instance,
Multistate_Output_Valid_Instance, Multistate_Output_Object_Name,
Multistate_Output_Read_Property, Multistate_Output_Write_Property,
Multistate_Output_Property_Lists, NULL / ReadRangeInfo /,
NULL / Iterator /, NULL / Value_Lists /, NULL / COV /,
NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_MULTI_STATE_VALUE, Multistate_Value_Init, Multistate_Value_Count,
Multistate_Value_Index_To_Instance, Multistate_Value_Valid_Instance,
Multistate_Value_Object_Name, Multistate_Value_Read_Property,
Multistate_Value_Write_Property, Multistate_Value_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /,
Multistate_Value_Encode_Value_List, Multistate_Value_Change_Of_Value,
Multistate_Value_Change_Of_Value_Clear,
NULL / Intrinsic Reporting / },
{ OBJECT_TRENDLOG, Trend_Log_Init, Trend_Log_Count,
Trend_Log_Index_To_Instance, Trend_Log_Valid_Instance,
Trend_Log_Object_Name, Trend_Log_Read_Property,
Trend_Log_Write_Property, Trend_Log_Property_Lists, TrendLogGetRRInfo,
NULL / Iterator /, NULL / Value_Lists /, NULL / COV /,
NULL / COV Clear /, NULL / Intrinsic Reporting / },
#if (BACNET_PROTOCOL_REVISION >= 14) && defined(BACAPP_LIGHTING_COMMAND)
{ OBJECT_LIGHTING_OUTPUT, Lighting_Output_Init, Lighting_Output_Count,
Lighting_Output_Index_To_Instance, Lighting_Output_Valid_Instance,
Lighting_Output_Object_Name, Lighting_Output_Read_Property,
Lighting_Output_Write_Property, Lighting_Output_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_CHANNEL, Channel_Init, Channel_Count, Channel_Index_To_Instance,
Channel_Valid_Instance, Channel_Object_Name, Channel_Read_Property,
Channel_Write_Property, Channel_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting */ },
#endif#if defined(BACFILE)
{ OBJECT_FILE, bacfile_init, bacfile_count, bacfile_index_to_instance,
bacfile_valid_instance, bacfile_object_name, bacfile_read_property,
bacfile_write_property, BACfile_Property_Lists,
NULL /* ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
#endif
{ OBJECT_OCTETSTRING_VALUE, OctetString_Value_Init, OctetString_Value_Count,
OctetString_Value_Index_To_Instance, OctetString_Value_Valid_Instance,
OctetString_Value_Object_Name, OctetString_Value_Read_Property,
OctetString_Value_Write_Property, OctetString_Value_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_POSITIVE_INTEGER_VALUE, PositiveInteger_Value_Init,
PositiveInteger_Value_Count, PositiveInteger_Value_Index_To_Instance,
PositiveInteger_Value_Valid_Instance, PositiveInteger_Value_Object_Name,
PositiveInteger_Value_Read_Property,
PositiveInteger_Value_Write_Property,
PositiveInteger_Value_Property_Lists, NULL / ReadRangeInfo /,
NULL / Iterator /, NULL / Value_Lists /, NULL / COV /,
NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ OBJECT_SCHEDULE, Schedule_Init, Schedule_Count,
Schedule_Index_To_Instance, Schedule_Valid_Instance,
Schedule_Object_Name, Schedule_Read_Property, Schedule_Write_Property,
Schedule_Property_Lists, NULL / ReadRangeInfo /, NULL / Iterator /,
NULL / Value_Lists /, NULL / COV /, NULL / COV Clear /,
NULL / Intrinsic Reporting / },
{ OBJECT_ACCUMULATOR, Accumulator_Init, Accumulator_Count,
Accumulator_Index_To_Instance, Accumulator_Valid_Instance,
Accumulator_Object_Name, Accumulator_Read_Property,
Accumulator_Write_Property, Accumulator_Property_Lists,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /, NULL / Intrinsic Reporting / },
{ MAX_BACNET_OBJECT_TYPE, NULL / Init /, NULL / Count /,
NULL / Index_To_Instance /, NULL / Valid_Instance /,
NULL / Object_Name /, NULL / Read_Property /,
NULL / Write_Property /, NULL / Property_Lists /,
NULL / ReadRangeInfo /, NULL / Iterator /, NULL / Value_Lists /,
NULL / COV /, NULL / COV Clear /,
NULL / Intrinsic Reporting */ }
};

这段代码定义了一个名为My_Object_Table的静态数组,该数组存储了一系列object_functions_t类型的结构体对象。

每个结构体对象表示一个BACnet设备对象类型及其相关的函数和属性列表。每个结构体对象包含以下字段:

type:对象类型,这里是BACnet设备对象类型。
Init:初始化函数指针,用于初始化该BACnet设备对象类型的实例。
Count:计数函数指针,用于获取该BACnet设备对象类型的实例数量。
Index_To_Instance:索引转实例函数指针,用于将索引转换为BACnet设备对象的实例号。
Valid_Instance:验证实例函数指针,用于验证给定的BACnet设备对象实例号是否有效。
Object_Name:对象名称函数指针,用于获取BACnet设备对象的名称。
Read_Property:读取属性函数指针,用于读取BACnet设备对象的属性值。
Write_Property:写入属性函数指针,用于写入BACnet设备对象的属性值。
Property_Lists:属性列表函数指针,用于获取BACnet设备对象支持的属性列表。
ReadRangeInfo:读取范围信息函数指针,用于获取BACnet设备对象属性的范围信息。
Iterator:迭代器函数指针,用于在BACnet设备对象实例之间进行迭代。
Value_Lists:值列表函数指针,用于获取BACnet设备对象属性的值列表。
COV:COV(Change Of Value)函数指针,用于处理BACnet设备对象属性值的变化。
COV_Clear:COV清除函数指针,用于清除BACnet设备对象属性值的变化标志。
Intrinsic_Reporting:内在报告函数指针,用于处理BACnet设备对象的内在报告。

查找BACnet设备对象类型的辅助函数

/*** 辅助函数,用于让Device对象在被处理程序调用时查找需要调用的对象类型。* @ingroup ObjHelpers* @param Object_Type [in] 处理程序希望访问的BACnet对象类型。* @return 指向实现此类型对象的对象辅助函数组的指针。*/
static struct object_functions *Device_Objects_Find_Functions(BACNET_OBJECT_TYPE Object_Type)
{struct object_functions *pObject = NULL;// 将pObject指向对象表的起始位置pObject = Object_Table;// 遍历对象表中的每个对象类型while (pObject->Object_Type < MAX_BACNET_OBJECT_TYPE) {/* 处理每个对象类型 */// 如果找到与传入的Object_Type相匹配的对象类型if (pObject->Object_Type == Object_Type) {// 返回该对象类型的对象辅助函数组return (pObject);}// 指向下一个对象类型pObject++;}// 如果没有找到匹配的对象类型,则返回NULLreturn (NULL);
}
该函数通过遍历Object_Table数组中的对象辅助函数组,将pObject指针逐个与传入的Object_Type进行比较,直到找到匹配的对象类型为止。如果找到了匹配的对象类型,则返回该对象类型的对象辅助函数组的指针;如果没有找到匹配的对象类型,则返回NULL。这个辅助函数在处理BACnet设备对象时非常有用,它允许根据需要动态查找和调用不同类型的对象辅助函数。/*** 辅助函数,尝试查找所请求对象类型的rr_info_function辅助函数。* @ingroup ObjIntf** @param object_type [in] 处理程序希望访问的BACnet对象类型。* @return 指向实现该对象类型的ReadRangeInfo函数(Object_RR_Info)的对象辅助函数指针,*         如果不支持该对象类型或该对象类型没有ReadRangeInfo函数,则返回空指针(NULL)。*/
rr_info_function Device_Objects_RR_Info(BACNET_OBJECT_TYPE object_type)
{struct object_functions *pObject = NULL;// 查找对象类型对应的对象辅助函数组pObject = Device_Objects_Find_Functions(object_type);// 如果找到对应的对象辅助函数组return (pObject != NULL ? pObject->Object_RR_Info : NULL);
}这段代码是一个用于查找BACnet对象类型的ReadRangeInfo函数辅助函数。它尝试查找所请求的对象类型的rr_info_function辅助函数。该函数首先调用Device_Objects_Find_Functions函数,通过传入的object_type参数查找并返回相应BACnet对象类型的对象辅助函数组。然后,它返回对象辅助函数组中的Object_RR_Info函数指针作为ReadRangeInfo函数的实现。如果找到了支持ReadRangeInfo函数的对象类型的对象辅助函数组,则返回该函数指针;如果不支持该对象类型或该对象类型没有ReadRangeInfo函数,则返回空指针(NULL)。这个辅助函数在处理BACnet对象时有用,它允许根据对象类型动态获取和调用相应的ReadRangeInfo函数,以实现对对象属性范围信息的读取操作。

获取特定对象类型的特殊属性列表Device_Objects_Property_List

这段代码是一个用于获取特定对象类型的特殊属性列表的函数。该函数用于处理ReadPropertyMultiple调用,该调用只需要必需属性、可选属性或所有属性。
/**

  • 对于给定的对象类型,返回特殊属性列表。

  • 此函数用于ReadPropertyMultiple调用,它只需要必需属性、可选属性或所有属性。

  • @ingroup ObjIntf

  • @param object_type [in] 所需的BACNET_OBJECT_TYPE,其属性将被列出。

  • @param pPropertyList [out] 引用结构的指针,该结构将在返回时分别列出必需、可选和专有对象属性及其计数。
    */
    void Device_Objects_Property_List(BACNET_OBJECT_TYPE object_type,
    uint32_t object_instance,
    struct special_property_list_t *pPropertyList)
    {
    struct object_functions *pObject = NULL;

    (void)object_instance;

这篇关于BACnet device对象详解以及协议栈相关代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/807463

相关文章

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

Linux ls命令操作详解

《Linuxls命令操作详解》通过ls命令,我们可以查看指定目录下的文件和子目录,并结合不同的选项获取详细的文件信息,如权限、大小、修改时间等,:本文主要介绍Linuxls命令详解,需要的朋友可... 目录1. 命令简介2. 命令的基本语法和用法2.1 语法格式2.2 使用示例2.2.1 列出当前目录下的文

MySQL中的交叉连接、自然连接和内连接查询详解

《MySQL中的交叉连接、自然连接和内连接查询详解》:本文主要介绍MySQL中的交叉连接、自然连接和内连接查询,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、引入二、交php叉连接(cross join)三、自然连接(naturalandroid join)四

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

mysql的基础语句和外键查询及其语句详解(推荐)

《mysql的基础语句和外键查询及其语句详解(推荐)》:本文主要介绍mysql的基础语句和外键查询及其语句详解(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录一、mysql 基础语句1. 数据库操作 创建数据库2. 表操作 创建表3. CRUD 操作二、外键

Spring Boot项目部署命令java -jar的各种参数及作用详解

《SpringBoot项目部署命令java-jar的各种参数及作用详解》:本文主要介绍SpringBoot项目部署命令java-jar的各种参数及作用的相关资料,包括设置内存大小、垃圾回收... 目录前言一、基础命令结构二、常见的 Java 命令参数1. 设置内存大小2. 配置垃圾回收器3. 配置线程栈大小

鸿蒙中@State的原理使用详解(HarmonyOS 5)

《鸿蒙中@State的原理使用详解(HarmonyOS5)》@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式,本文给大家介绍... 目录一、@State在鸿蒙中是做什么的?二、@Spythontate的基本原理1. 依赖关系的收集2.

jupyter代码块没有运行图标的解决方案

《jupyter代码块没有运行图标的解决方案》:本文主要介绍jupyter代码块没有运行图标的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录jupyter代码块没有运行图标的解决1.找到Jupyter notebook的系统配置文件2.这时候一般会搜索到

Redis实现延迟任务的三种方法详解

《Redis实现延迟任务的三种方法详解》延迟任务(DelayedTask)是指在未来的某个时间点,执行相应的任务,本文为大家整理了三种常见的实现方法,感兴趣的小伙伴可以参考一下... 目录1.前言2.Redis如何实现延迟任务3.代码实现3.1. 过期键通知事件实现3.2. 使用ZSet实现延迟任务3.3