网易博客旧文----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);
}

也就是链路层接收,交给网络层处理,自然就传递给应用层,然后就会调用应用层设置的回调函数
我认为所有基于这个协议栈的程序都应该这么写吧,这样不管是写服务端还是客户端,都可以启动通讯了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/56030.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hbuilderx+uniapp+Android健身房管理系统 微信小程序z488g

目录 项目介绍支持以下技术栈:具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是:数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 用户功能…

【React】如何对组件加载进行优化

1. 懒加载 (Lazy Loading) 使用 React.lazy() 和 Suspense 来实现懒加载(按需加载)组件。只有在需要时才加载对应组件,可以减小初始加载的体积。 const LazyComponent React.lazy(() > import(./LazyComponent));function App() {retur…

初级网络工程师之从入门到入狱(五)

本文是我在学习过程中记录学习的点点滴滴,目的是为了学完之后巩固一下顺便也和大家分享一下,日后忘记了也可以方便快速的复习。 网络工程师从入门到入狱 前言一、链路聚合1.1、手动进行链路聚合1.1.1、 拓扑图:1.1.2、 LSW11.1.3、 LSW2 1.2、…

RabbitMQ(学习前言)

目录 学习MQ之前有必要先去温故下微服务知识体系,以加深本章节的理解 一、微服务间的通讯方式 1. 基本介绍 2. 同步通讯 2.1. 什么是同步通讯 2.2. 同步通讯存在的问题 问题一:耦合度高 问题二:性能和吞吐能力下降 问题三&#xff1a…

SpringMVC源码-处理器适配器HandlerAdapter

因为定义controller的方式有三种,每种不同的方式调用的方法不同,尤其是注解修饰的 方法名是自定义的 因此需要通过适配器模式来调用方法执行 initStrategies进行适配器的初始化 处理器适配器一共有如下四种: org.springframework.web.servlet.Handl…

数据结构与算法——Java实现 32.堆

人的想法和感受是会随着时间的认知改变而改变, 原来你笃定不会变的事,也会在最后一刻变得释然 —— 24.10.10 堆 堆是基于二叉树实现的数据结构 大顶堆每个分支的上一个节点的权值要大于它的孩子节点 小顶堆每个分支的上一个节点的权值要小于它的孩子…

开源催生开源:Tesla 如何加速 AI 发展

特斯拉最近宣布开源其特斯拉以太网传输协议 (TTPoE),这是一种尖端网络结构,专为 AI/ML 数据中心环境中的高速、低延迟数据传输而设计,从而掀起了波澜。此举反映了特斯拉利用开源战略加速全行业进步的更广泛历史&#x…

Spring Boot课程问答:技术难题轻松解决

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示: 图4-1系统工作原理…

Spring Security(常见过滤器介绍)

Spring Security是一个基于Spring框架的安全性解决方案,为Java应用程序提供了一套全面的安全解决方案。 一、概述 Spring Security是Spring采用AOP(面向切面编程)思想,基于servlet过滤器实现的安全框架。它致力于保护基于Spring的…

基于pytorch的手写数字识别-训练+使用

import pandas as pd import numpy as np import torch import matplotlib import matplotlib.pyplot as plt from torch.utils.data import TensorDataset, DataLoadermatplotlib.use(tkAgg)# 设置图形配置 config {"font.family": serif,"mathtext.fontset&q…

洗衣店订单管理:Spring Boot技术革新

3系统分析 3.1可行性分析 通过对本洗衣店订单管理系统实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本洗衣店订单管理系统采用JAVA作为开发语言,S…

CSS 鼠标悬停时让父元素和子元素以不同的方式进行变换

要在鼠标悬停时让父元素和子元素以不同的方式进行变换&#xff08;transform&#xff09;&#xff0c;可以分别设置它们的 transform 属性&#xff0c;并使用 transition 来实现平滑的效果。以下是一个示例&#xff0c;展示了如何实现这一效果。 HTML 结构 <!DOCTYPE html…

pytest(六)——allure-pytest的基础使用

前言 一、allure-pytest的基础使用 二、需要掌握的allure特性 2.1 Allure报告结构 2.2 Environment 2.3 Categories 2.4 Flaky test 三、allure的特性&#xff0c;allure.step()、allure.attach的详细使用 3.1 allure.step 3.2 allure.attach&#xff08;挺有用的&a…

如何利用wsl-Ubuntu里conda用来给Windows的PyCharm开发

前提&#xff1a;咱们在wsl-Ubuntu上&#xff0c;有conda的虚拟环境 咱们直接打开PyCharm,打开Settings 更换Python Interpreter即可 当然一开始可能没有下面的选项&#xff0c;需要我们点击右边的Add Interpreter 这里选择wsl 点击next 将这两步进行修改 可以看出来&#xff0…

kubernetes中微服务部署

微服务 问&#xff1a;用控制器来完成集群的工作负载&#xff0c;那么应用如何暴漏出去&#xff1f; 答&#xff1a;需要通过微服务暴漏出去后才能被访问 Service 是一组提供相同服务的Pod对外开放的接口借助Service&#xff0c;应用可以实现服务发现和负载均衡Service 默认只…

智谱开放平台API调用解析

一、什么是智谱AI 智谱AI成立于2019年&#xff0c;由‌清华大学计算机系知识工程实验室的技术成果转化而来&#xff0c;是一家致力于人工智能技术研发和应用的公司。智谱致力于打造新一代认知智能大模型&#xff0c;专注于做大模型的中国创新。 二、智谱开放平台API调用 官方文…

【LeetCode】动态规划—673. 最长递增子序列的个数(附完整Python/C++代码)

动态规划—673. 最长递增子序列的个数 前言题目描述基本思路1. 问题定义2. 理解问题和递推关系3. 解决方法3.1 动态规划方法3.2 优化方法 4. 进一步优化5. 小总结 代码实现PythonPython3代码实现Python 代码解释 CC代码实现C 代码解释1. 初始化&#xff1a;2. 动态规划过程&…

FiBiNET模型实现推荐算法

1. 项目简介 A031-FiBiNET模型项目是一个基于深度学习的推荐系统算法实现&#xff0c;旨在提升推荐系统的性能和精度。该项目的背景源于当今互联网平台中&#xff0c;推荐算法在电商、社交、内容分发等领域的广泛应用。推荐系统通过分析用户的历史行为和兴趣偏好&#xff0c;预…

Django学习笔记十三:优秀案例学习

Django CMS 是一个基于 Django 框架的开源内容管理系统&#xff0c;它允许开发者轻松地创建和管理网站内容。Django CMS 提供了一个易于使用的界面来实现动态网站的快速开发&#xff0c;并且具有丰富的内容管理功能和多种插件扩展。以下是 Django CMS 的一些核心特性和如何开始…

opencv的相机标定与姿态解算

首先我们要知道四个重要的坐标系 世界坐标系相机坐标系图像成像坐标系图像像素坐标系 坐标系之间的转换 世界坐标系——相机坐标系 从世界坐标系到相机坐标系&#xff0c;涉及到旋转和平移&#xff08;其实所有的运动也可以用旋转矩阵和平移向量来描述&#xff09;。绕着不…