利用VTS与bacnet协议栈进行通信---ReadProperty
2013-05-13 12:46
197 查看
@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.源代码分析:
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替换为我们自己需要的处理函数,如读取当前温度传感器的值等,以满足要求
相关文章推荐
- Java中利用Socket进行通信
- 父进程利用fork()函数创建子进程并且利用shared_memory进行通信的实例
- C#与java利用XML进行通信
- 利用C#进行Socket通信编程之一
- 一个完整的通过encoding/json信息传递格式,采用http.POST利用进行与服务器通信,并对返回结果进行解析处理的典型案例
- 利用WinSock进行无连接的通信
- LInux中利用线程实现多个客户端和服务器端进行通信
- 利用WinInet类进行TCP/IP通信内容
- android利用handler进行内部通信
- SilverLight 利用 .Net RIA Service 进行数据库通信
- 利用C#进行Socket通信编程
- Android 利用httpclient进行网络通信,实现用户登录的方法
- ajax利用json进行服务器与客户端的通信
- 利用Intent进行Activity之间的通信(2)
- 关于利用android-serialport-api实现在安卓设备上进行串口通信,附精简版demo,亲测可用。
- 利用Qt进行接口间通信
- ------------------------------利用BroadcastReceiver进行Activity和Service之间的通信(留着自己参考用)
- 利用管道进行进程的通信示例
- 利用管道进行通信
- android中利用Socket实现手机客户端与PC端进行通信