利用VTS与bacnet协议栈进行通信---ReadProperty
@2013/5/131.VTS是使用bacnet服务的一款优秀软件,可以利用这个软件对bacnet设备进行访问2.环境: VTS(pc-1) ------ IP-Switch ------ Bacnet-Device(pc-2:Linux + bacnet-stack-0.8.0) (二层交换机)3.VTS向指定设备发
·
@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替换为我们自己需要的处理函数,如读取当前温度传感器的值等,以满足要求
更多推荐
已为社区贡献3条内容
所有评论(0)