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

相关文章

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Redis 的 SUBSCRIBE命令详解

《Redis的SUBSCRIBE命令详解》Redis的SUBSCRIBE命令用于订阅一个或多个频道,以便接收发送到这些频道的消息,本文给大家介绍Redis的SUBSCRIBE命令,感兴趣的朋友跟随... 目录基本语法工作原理示例消息格式相关命令python 示例Redis 的 SUBSCRIBE 命令用于订

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有