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页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

例程中有2个port,所以程序中建立了一个主线程,两个子线程。两个子线程中收到信息之后通过消息队列,发送给主线程进行网络层处理或者转发。主线程如果需要回复或者转发报文给两个子线程,则向子线程对应的消息队列中发送消息,报文到达子线程中后,取出后发送到相应的端口port上去。主线程网络民根文號理或者应用找根主线程网络民根文號理或者应用找根程序流程:读取init.cfg配置文件,初始化ROUTER_PORT*head这个port链表读取配置文件中device_type,初始化current->typeo读取配置文件中port,初始化current->params.bip_params.porto读取配置文件中network,初始化current->route_o..…•初始化路由o创建主消息队列,初始化每个端口的prot->main_ido初始化两个端口的port->func函数指针(routerportthreadfunctiono初始化port->state=INITo创建两个子线程,此时应该会并发运行两个线程的start_routine函数。o设置两个子线程的状态设置为detached,线程运行结束后会自动释放所有资源•两个子线程的start_routinej函数流程dl_ip_threado端口的数据链路层ip(IP_DATAip_data初始化,如果失败,设置port->state=INIT_FAILED,返回初始化ip_data->port初始化ip_data->local_addr初始化ip_data->broadcast_addr建立udp的Socket,设置socket属性为:SO_REUSEADDR(设置调用closesocket()后,仍可继续重用该socket。调用closesocket()—般不会立即关闭socket,而经历TIME_WAIT的过程。),SO_BROADCAST(—般在发送UDP数据报的时候,希望该socket发送的数据具有广播特性)bindthesockettothelocalportnumberaddbipaddresstorouterportstructure,memcpy(&port->route_info.mac[0],&p_data->local_addr.s_addr,4);memcpy(&port->route_info.mac[4],&port->params.bip_params.port,2);port->route_info.mac_len=6;给ip_data分配空间,分配失败,设置port->state=INIT_FAILED,返回为子线程创建消息队列初始化port->port_id,成功则设置port->state=RUNNING,如果失败,设置port->state=INIT_FAILED,返回进入一个循环,不断从子进程对应的消息队列中取数据・如果没有取到数据,则从该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中。收到数据后,初始化msg_data数据的src.len和src.adr,初始化msg_storage,将msg_storage发送给主消息队列,主消息队列也会不停的轮询是否有消息到达,有的话会进行处理・如果取到数据,则说明主进程给该端口的消息队列回复或者转发了消息,需要通过该端口的数据链路层发送出去获得目的地址和数据・数据链路层发送该数据根据目的地址(广播或者其他)和数据初始化bip_dest和IP_DATA,组装成BVLL类型的编码主进程中不断轮询主消息队列,看是否有子消息队列发来消息o如果端口有消息・获取源消息队列id・为数据分配空间・打印收到的数据・判断是否是网络层数据如果是网络层数据拷贝消息数据到主线程创建的空间解码网络层数据(MSG_DATA*data->pdudecodedest,BACNET_NPDU_DATA)在RouterPort链表中寻找源端口srcport初始化主进程中维护的msg->data->二srcport->route_・根据不同类型的网络层报文分别进行相应的处理比如NETWORK_MESSAGE_WHO_IS_ROUTER_TO_NETWORK等《详细见后面》如果不是网络层数据拷贝消息数据到主线程创建的空间解码网络层数据(MSG_DATA*data->pdudecodedest,src,BACNET_NPDU_DATA)在RouterPort链表中寻找源端口srcport・在路由表中根据目的网络号,寻找目的端口・如果都找到相应的源和目的端口则进行下列操作・初始化主进程中维护的msg->data->二srcport->route_当报文中有源网络和源地址,且不是广播网络,且该报文中的源网络不是路由器直接相连的网络data->!=,则将data->src信息,用最原始的原地址更新(解释:当该路由器收到的报文是由另一个路由器转发的,此时报文中的源地址是最早发送该报文的设备所在网络,而不是该路由器直连端口所对应的网络)・以上确认好了源地址如果目的网络是全局广播网络,或者目的网络和转发端口网络不是同一个网络(还没有到最终的网络),则重新编码npdu(将目的网络和源网络都编码进去)。否则目的网络和转发端口网络是同一个网络(已经到达最终的网络),重新编码npdu(只编码源网络,不编码目的网络)分配空间给buff,存储新的npdu和原来的apdu数据否则需要进行网络搜索(返回后在外层进行搜索发送whoisrouter。。。。)释放子线程中分配的msg->data・如果形成了一个新的npdu数据,则将新组成的数据打印出来发送给相应的端口网络层数据从哪来回哪去应用层

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论