@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替换为我们自己需要的处理函数,如读取当前温度传感器的值等,以满足要求

 

Logo

更多推荐