ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

cyberRT调用流程

cyberRT调用流程 cyberRT调用流程1 概述2 publisher2.1 创建2.2 enable2.3 发送3 subscriber3.1 创建3.2 enable3.3 Sub rtps消息流向3 可优化的点1 概述cyberRT数据通信方式有Intra/SHM/Rtps三种。下面图中均以Rtps通信方式来展开介绍2 publisher2.1 创建Transmitter继承于Endpoint所以里面包含了一个idIdentity类型。这个Identity中有两个关键成员变量char data_[ID_SIZE] 它是将进程名hostchannelnode一起hash得到的。Endpoint::Endpoint(constRoleAttributesattr):enabled_(false),attr_(attr),id_(true,common::GlobalData::Instance()-GetEndpointHash(common::GlobalData::Instance()-GetExeName(),common::GlobalData::Instance()-HostIp(),attr.node_name(),attr.channel_name(),false,0)){if(!attr_.has_host_name()){attr_.set_host_name(common::GlobalData::Instance()-HostName());}Identity::Identity(boolneed_generate,uint64_tid){if(need_generate){set_data(id);}else{std::memset(data_,0,ID_SIZE);}Update();}// use Little-Endianvoidset_data(uint64_tid){/* Different platform may have different implicit conversion to deal char. For example: * regard as unsigned char on Qualcomm 8155 android; * regard as signed char on Horizon J5 linux. * Therefore, minus sign is discarded at here. */for(inti0;iID_SIZE;i){data_[i](id(8*i))127;}}uint64_t hash_value_ 是将通过data转换得到的其中动态服务发现的情况下会再将data_进行一次hash得到voidIdentity::Update(){if(!common::GlobalData::Instance()-StaticDiscoveryEnabled())hash_value_common::Hash(std::string(data_,ID_SIZE));elsememcpy(hash_value_,data_,sizeof(uint64_t));}Transmitter::Transmitter()中会调用msg_info_.set_sender_id(this-id_) 将Transmitter的id填到msg_info_中。在Transmit中发送每个消息发出去的时候都会将id的二进制内容拷贝到消息中。memcpy(ptr, msg_info.sender_id().data(), ID_SIZE);接收端对收到的二进制数据进行一次hash得到发送端的hash值。2.2 enableHybridTransmitter::Enable中会先通过GetRelation()来获取发送端跟接收端的关系然后enable特定的ransmitterIntraTransmitter/ShmTransmitter/RtpsTransmitter2.3 发送3 subscriber3.1 创建3.2 enableHybridReceiver::Enable中会先通过GetRelation()来获取发送端跟接收端的关系然后enable特定的ReceiverIntraReceiver/ShmReceiver/RtpsReceiverlistener_adapter保存在msg_listeners_这个map中的ListenerHandler后面调度线程会通过ListenerHandler::Run来调用listener_adapterRtpsDispatcher::AddListener的listener_adapter会先调用ParseFromString进行反序列化然后再调用RtpsReceiver::OnNewMessagevoid Dispatcher::AddListener(const RoleAttributes self_attr,const RoleAttributes opposite_attr,const MessageListener listener)会调用handler-Connect并将self_attr.id()跟opposite_attr.id()传入self_attr.id()跟opposite_attr.id()分别是发送端跟接收端Endpoint中id的hashValue。ListenerHandler::Connect(uint64_t self_id, uint64_t oppo_id,const Listener listener)signals_[oppo_id] std::make_shared()将回调函数存到signals_中并跟oppo_id发送端的id的hashValue绑定。3.3 Sub rtps消息流向SubListener::on_data_available中从收到的消息中获取二进制数据填到msg_info.sender_id中。ListenerHandler::Run中通过msg_info.sender_id().HashValue()来找到对应的回调函数并执行。(*signals_[oppo_id])(msg, msg_info);3 可优化的点Identity中的data_就已经是hash后得到的hash_value_没有必要再进行一次hash。Writer::OnChannelChange中每个writer都会收到所有的reader的变化的通知可以改成只有相同channel的reader变化才触发这个callback同理Reader::OnChannelChange也是如此。
返回列表