bacnet-stack-0.8.2中router例程C代码剖析

bacnet-stack-0.8.2中router例程C代码剖析

ID:40962857

大小:60.78 KB

页数:7页

时间:2019-08-12

bacnet-stack-0.8.2中router例程C代码剖析_第1页
bacnet-stack-0.8.2中router例程C代码剖析_第2页
bacnet-stack-0.8.2中router例程C代码剖析_第3页
bacnet-stack-0.8.2中router例程C代码剖析_第4页
bacnet-stack-0.8.2中router例程C代码剖析_第5页
资源描述:

《bacnet-stack-0.8.2中router例程C代码剖析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、例程中有2个port,所以程序中建立了一个主线程,两个子线程。两个子线程中收到信息之后通过消息队列,发送给主线程进行网络层处理或者转发。主线程如果需要回复或者转发报文给两个子线程,则向子线程对应的消息队列中发送消息,报文到达子线程中后,取出后发送到相应的端口port上去。程序流程:·读取init.cfg配置文件,初始化ROUTER_PORT *head这个port链表o读取配置文件中 device_type,初始化current->typeo读取配置文件中 device,初始化current->iface,并通过新建soc

2、ket,并通过ioctl获取设备"eth0"的IP/掩码/硬件址的方式检测是否有效o读取配置文件中 port,初始化 current->params.bip_params.porto读取配置文件中 network,初始化 current->route_info.neto.....·初始化路由o创建主消息队列,初始化每个端口的prot->main_ido初始化两个端口的port->func函数指针(routerportthreadfunction)o初始化port->state=INITo创建两个子线程,此时应该会并发运行两

3、个线程的start_routine函数。o设置两个子线程的状态设置为detached,线程运行结束后会自动释放所有资源·两个子线程的start_routine函数流程dl_ip_threado端口的数据链路层ip(IP_DATAip_data)初始化,如果失败,设置port->state=INIT_FAILED,返回1.初始化ip_data->port2.初始化ip_data->local_addr3.初始化ip_data->broadcast_addr4.建立udp的Socket,5.设置socket属性为:SO_REU

4、SEADDR(设置调用closesocket()后,仍可继续重用该socket。调用closesocket()一般不会立即关闭socket,而经历TIME_WAIT的过程。),SO_BROADCAST(一般在发送UDP数据报的时候,希望该socket发送的数据具有广播特性)6.bindthesockettothelocalportnumber7.addbipaddresstorouterportstructure,1.  memcpy(&port->route_info.mac[0],&ip_data->local_add

5、r.s_addr,4);2.  memcpy(&port->route_info.mac[4],&port->params.bip_params.port,2);3.  port->route_info.mac_len=6;o 给ip_data分配空间,分配失败,设置port->state=INIT_FAILED,返回o为子线程创建消息队列初始化port->port_id,成功则设置port->state=RUNNING,如果失败,设置port->state=INIT_FAILED,返回o进入一个循环,不断从子进程对应的消

6、息队列中取数据§如果没有取到数据,则从该port的数据链路层取§udp接收数据的时候,采用select,非阻塞的方式来读§读取到后判断是否是BVLL_TYPE_BACNET_IP类型的BVLL类型的报文,不是的话返回§然后根据BVLL层的报文类型进入不同的处理:§BVLC_ORIGINAL_UNICAST_NPDU 或者BVLC_ORIGINAL_BROADCAST_NPDU,判断是否来自自己,如果是自己发送的,丢弃。否则:保存src地址,和ipdata->buff[4]开始的数据到msg_data的src和pdu中。§收

7、到数据后,初始化msg_data数据的src.len和src.adr,初始化msg_storage,将msg_storage发送给主消息队列,主消息队列也会不停的轮询是否有消息到达,有的话会进行处理§如果取到数据,则说明主进程给该端口的消息队列回复或者转发了消息,需要通过该端口的数据链路层发送出去§获得目的地址和数据§数据链路层发送该数据§根据目的地址(广播或者其他)和数据初始化bip_dest和IP_DATA,组装成BVLL类型的编码·主进程中不断轮询主消息队列,看是否有子消息队列发来消息o如果端口有消息§获取源消息队列

8、id§为数据分配空间§打印收到的数据§判断是否是网络层数据§如果是网络层数据§拷贝消息数据到主线程创建的空间§解码网络层数据(MSG_DATA*data->pdu decode dest,BACNET_NPDU_DATA)§在RouterPort链表中寻找源端口srcport§初始化主进程中维护的msg

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。