网易博客旧文----bacnet学习系列之三----读取属性程序的分析

bacnet学习系列之三----读取属性程序的分析

2014-01-21 16:29:42| 分类: BACnet | 标签: |举报 |字号大中小 订阅

先上一张自己画的流程图

bacnet学习系列之三----读取属性程序的分析 - xzhoumin - MMZHOU的博客

程序一开始就是分析命令行,用法如下:

Usage: bacnetTest.exe device-instance object-type object-instance property [index]

含义就是需要读取哪个设备的什么对象类型的哪个对象的哪个属性

构建客户端信息包括:设置本身的设备实例号,地址初始化,服务回调函数设置,链路层环境设置,退出时清理设置回调

服务回调比较重要的就是设置读属性响应的回调(apdu_set_confirmed_ack_handler(SERVICE_CONFIRMED_READ_PROPERTY,My_Read_Property_Ack_Handler);),这个函数会在应用层解析到有读属性响应服务时调用

书中p105讲到需要确定接收方可接收的APDU的最大长度,便于分帧。方法是要么读取对方设备对象中Max_APDU_Length_Accepted,要么发送一个Who-Is服务,当对方回复I-Am服务时,读取其中的Max APDU Length Accepted参数来获取,显然这里使用后者。因此在设置服务回调的时候,也设置了I-Am服务回调(apdu_set_unconfirmed_handler(SERVICE_UNCONFIRMED_I_AM,

handler_i_am_bind))

不过用的是协议栈库中的h_iam.c

设备地址的绑定一定是在响应了I-Am服务后才会有的,因此第一次一定不会绑定成功。

在绑定成功后,发送读取属性的有证实的服务(调用的是协议栈的s_rp.c中的Send_Read_Property_Request),这里就会用到前面获取的MaxAPDU,因此这个顺序不能搞错,一定要先发一个Who-Is非证实的服务。

对于Invoke_ID,协议栈也已经进行了管理,包括申请回收,超时等(tsm.c,tsm.h),只需要使用即可。

协议中有讲:

bacnet学习系列之三----读取属性程序的分析 - xzhoumin - MMZHOU的博客

bacnet学习系列之三----读取属性程序的分析 - xzhoumin - MMZHOU的博客

程序用到了APDU超时和APDU重发次数,并且组合为总的超时(timeout_seconds = (apdu_timeout() / 1000) * apdu_retries())

其中 apdu_timeout 在设置链路层环境变量的时候会进行设置:

pEnv = getenv("BACNET_APDU_TIMEOUT");

if (pEnv) {

apdu_timeout_set((uint16_t) strtol(pEnv, NULL, 0));

fprintf(stderr, "BACNET_APDU_TIMEOUT=%s\r\n", pEnv);

} else {

#if defined(BACDL_MSTP)

apdu_timeout_set(60000);

#endif

可以看到如果没有环境变量 BACNET_APDU_TIMEOUT 会讲此值设置为60秒

而 apdu_retries 则使用了默认值3。当然在apdu.h中提供了

apdu_timeout_set和

apdu_retries_set供大家修改使用

最终的通讯泵也就两句话

/* returns 0 bytes on timeout */

pdu_len = datalink_receive(&src, &Rx_Buf[0], MAX_MPDU, timeout);

/* process */

if (pdu_len) {

npdu_handler(&src, &Rx_Buf[0], pdu_len);

}

也就是链路层接收,交给网络层处理,自然就传递给应用层,然后就会调用应用层设置的回调函数

我认为所有基于这个协议栈的程序都应该这么写吧,这样不管是写服务端还是客户端,都可以启动通讯了。

相关推荐
-Springer-5 分钟前
STM32 学习 —— 个人学习笔记2-2(新建工程)
笔记·stm32·学习
tb_first16 分钟前
万字超详细苍穹外卖学习笔记4
java·spring boot·笔记·学习·spring·mybatis
代码游侠1 小时前
学习笔记——Linux字符设备驱动开发
linux·arm开发·驱动开发·单片机·嵌入式硬件·学习·算法
charlie1145141911 小时前
嵌入式C++教程——ETL(Embedded Template Library)
开发语言·c++·笔记·学习·嵌入式·etl
李小星同志2 小时前
VID2WORLD: CRAFTING VIDEO DIFFUSION MODELSTO INTERACTIVE WORLD MODELS论文学习
学习
laplace01232 小时前
Claude Code 逆向工程报告 笔记(学习记录)
数据库·人工智能·笔记·学习·agent·rag
lingggggaaaa2 小时前
安全工具篇&Go魔改二开&Fscan扫描&FRP代理&特征消除&新增扩展&打乱HASH
学习·安全·web安全·网络安全·golang·哈希算法
Daydream.V3 小时前
网页学习——HTML
学习
张永清-老清3 小时前
每周读书与学习->JMeter性能测试脚本编写实战(四)-利用JMeter对MySQL数据库查询进行性能测试
学习·jmeter·性能调优·jmeter性能测试·性能分析·每周读书与学习
InterestOriented3 小时前
中老年线上学习发展:兴趣岛“内容+服务+空间”融合赋能下的体验升级
人工智能·学习