利用VTS与bacnet协议栈进行通信---ReadProperty

来源:互联网 发布:艺术字设计软件下载 编辑:程序博客网 时间:2024/04/30 08:24

@2013/5/13

1.VTS是使用bacnet服务的一款优秀软件,可以利用这个软件对bacnet设备进行访问

2.环境:

   VTS(pc-1)  ------   IP-Switch ------ Bacnet-Device(pc-2:Linux + bacnet-stack-0.8.0)

                          (二层交换机)

3.VTS向指定设备发送ReadProperty服务原语,bacnet-device运行bacserv这个程序进行回复:

(1).ReadProperty属于对象访问服务,有三个参数,对应于下面。现在我选择的是analog-input这个对象,property用于标识被访问对象中的访问属性,选择的是present-value这个参数,也就是读取当前值

(2).bacnet-device进行回复的时候可以看出,返回的值Real:3.14159,后面会有解释,为什么会是这个值

4.源代码分析:

目录:bacnet-stack/demo/server:main  -> Init_Service_Handlers   -> apdu_set_confirmed_handler(SERVICE_CONFIRMED_READ_PROPERTY,handler_read_property);      /* 设置READ_PROPERTY这个服务的回调函数,也就是handler_read_property */   handler_read_property :/* 当接收到READ_PROPERTY这个服务原语时候,就会调用本函数 */    ->Device_Read_Property(BACNET_READ_PROPERTY_DATA * rpdata)     ->Device_Objects_Find_Functions(rpdata->object_type) /* 根据object_type查找对应的处理函数,此处是OBJECT_ANALOG_INPUT = 0 */      ->根据这个全局变量Object_Table来查找处理函数       ->对于OBJECT_ANALOG_INPUT,有如下操作函数:        {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 */ ,            NULL /* Value_Lists */ ,            NULL /* COV */ ,            NULL /* COV Clear */ ,            Analog_Input_Intrinsic_Reporting}       而我们需要的就是Analog_Input_Read_Property这个函数:   Analog_Input_Read_Property(BACNET_READ_PROPERTY_DATA * rpdata)    ->switch ((int) rpdata->object_property) /* 根据object_property进行处理,此处PROP_PRESENT_VALUE = 85,从VTS发送的数据也可看                                                出:0x55 */     ->case PROP_PRESENT_VALUE:            apdu_len =                encode_application_real(&apdu[0],                     Analog_Input_Present_Value_Test(rpdata->object_instance));            break;      ->Analog_Input_Present_Value_Test(rpdata->object_instance) /* 这个函数是我用来测试读取值的 */        /* 代码如下: */        /* 代码如下: */        float Analog_Input_Present_Value_Test(uint32_t object_instance){    float value = 0.0;unsigned int index;index = Analog_Input_Instance_To_Index(object_instance);if (index < MAX_ANALOG_INPUTS){        value = 3.14159;}    return value;}
所以,我们完全可以将这个函数Analog_Input_Present_Value_Test替换为我们自己需要的处理函数,如读取当前温度传感器的值等,以满足要求

 

原创粉丝点击