ASP网站开发技术期末考试,安卓手机开发者模式,seo网站概述,湖南网站建设大全文章目录 前言一、突发 IO1、数据传输①、输入②、输出 2、突发信号相关信息 (SRI)3、多输出端口4、使用复数数据①、在 C 中转换复数数据 5、时间戳6、端口统计①、C 二、消息传递1、消息生产者①、创建一个消息生产者②、发送消息 2、消息消费者①、创建消息消费者②、注册接… 文章目录 前言一、突发 IO1、数据传输①、输入②、输出 2、突发信号相关信息 (SRI)3、多输出端口4、使用复数数据①、在 C 中转换复数数据 5、时间戳6、端口统计①、C 二、消息传递1、消息生产者①、创建一个消息生产者②、发送消息 2、消息消费者①、创建消息消费者②、注册接收消息 3、查看消息4、连接生产者和消费者5、连接回调①、C 6、自定义 IDL 接口①、连接反馈②、连接选择③、方法映射④、读取属性⑤、写入属性 前言
续上文 一、突发 IO
对于那些需要小型且可能是非连续的数据块或突发以及频繁变化的元数据的应用程序突发输入/输出BurstIO提供了满足这些要求的数据传输容器和接口。这个接口仅支持数据向量的传输float, double, octet (int8/uint8), short (int16), ushort (uint16), long (int32), ulong (uint32), longlong (int64), 和 ulonglong(uint64)。与批量输入/输出BulkIO类似BurstIO 提供了突发信号相关信息SRI和精确时间戳但是它通过每个数据突发中的带内信息提供这些信息。由于元数据的增加的开销要求通过将多个突发分组为单次传输无论是通过编程还是通过可配置的策略设置BurstIO 可以实现其最高吞吐量以尝试最大化效率并限制延迟。
1、数据传输
突发输入/输出BurstIO数据传输通过 REDHAWK 资源组件或设备的 BurstIO 端口对象的 pushBurst() 和 pushBursts() 方法调用来实现。资源可以使用这些 push 方法将突发及其关联的元数据从一个资源传输到另一个资源这一过程在资源的服务功能内进行。与批量输入/输出BulkIO相似BurstIO 接口为突发的每个数据向量提供相同的 BULKIO::PrecisionUTCTime 时间戳。BurstIO 定义了一个新的 BurstSRI 信号相关信息SRI对象使开发人员能够进一步描述信号环境和数据转换。这些字段在突发信号相关信息SRI中有进一步的描述。
①、输入
拥有提供端口输入端口的资源使用 getBurst() 方法从端口抓取数据。此方法从输入端口的数据队列返回一个 PacketType 对象在突发包访问器中描述如果队列为空则返回 null/None 值。
以下代码片段是 getBurst() 方法的一个示例。
/**Grab data from the ports getBurst method*/
burstio::BurstShortIn::PacketType *pkt;
pkt inShortPort-getBurst( bulkio::Const::NON_BLOCKING );// check if a valid packet was returned
if ( pkt NULL ) {return NOOP;
}// check for EOS
if ( pkt-getEOS() ) {outShortPort-pushBurst(pkt-getSequence(), pkt-getSRI(), pkt-getEOS());
}... perform algorithm on the data: pkt-getData() ... or pkt-getSequence()②、输出
由于 BurstIO 数据的异步性该接口使开发者能够控制从资源中输出输出突发。将突发数据从一个资源推送到另一个资源的两个主要方法调用是pushBursts() 和 pushBurst()。pushBursts() 允许直接将多个突发作为 BurstType 对象的序列直接下游发送而 pushBurst() 提供了一个接口来排队推送单个突发但根据突发的数量、总队列大小和发送间隔遵循策略指令。这两种方法都使用指定的路由约束和连接过滤器路由突发数据这些可以通过以下接口控制
// this route streams with Stream ID data-stream-one to a connection
// identified as connection-one
shortBurstPort-addConnectionFilter(data-stream-one, connection-one);或者
// update connection filter using the Components connection property
// myConnectionTable
shortBurstPort-updateConnectionFilter(myConnectionTable);// this sets the stream filter to only route streams to specific connections
shortBurstPort-setRoutingMode(burstio::ROUTE_CONNECTION_STREAMS);pushBurst() 和 pushBursts() 方法之间的主要区别在于管理数据传输的方式和时间的能力。只有使用 pushBurst() 排队的突发流量受到策略约束的控制而对 pushBursts() 的调用则直接发送到下游连接的资源。
// this method will limit the maximum number of bursts that
// can be queued before they are sent
shortBurstPort-setMaxBursts(size_t count);// this method will enable threshold monitoring for the amount of sample
// data that exceeds this limit before sending data downstream
shortBurstPort-setByteThreshold(size_t bytes);// this method will enable the latency time between the sending of
// available data downstream
shortBurstPort-setLatencyThreshold( long usec );以下代码片段是一个使用 pushBurst() 方法调用将向量数据样本排队到端口的示例。
std::vector BurstShortOut::NativeType data;
my_transform(data);BURSTIO::BurstSRI sri;
burstio::BurstShortOut::BurstType burst;
burst.SRI sri;
burst.EOS false;
burst.T burstio::utils::now();
burst.data.length(data.size());
for(int i0; i data.size(); i ) burst.data[i] data[i];// this queues a single burst
shortBurstPort-pushBurst( burst );// orstd::vector BurstShortOut::NativeType data;
my_transform(data);// this queues a single burst
shortBurstPort-pushBurst( data, sri, burstio::utils::now() );以下代码片段是一个使用 pushBursts() 方法调用的向量数据样本的示例。此调用中的突发直接传递到下游的连接资源。
std::vector BurstShortOut::NativeType data;
my_transform(data);BurstShortOut::BurstSequenceType bursts;
bursts.length(1);
burstio::BurstShortOut::BurstType burst;
burst.SRI sri;
burst.EOS false;
burst.T burstio::utils::now();
burst.data.length(data.size());
for(int i0; i data.size(); i ) burst.data[i] data[i];
bursts[0] burst;// this pushes the burst directly downstream because
// it is a sequence of bursts
shortBurstPort-pushBursts(bursts);2、突发信号相关信息 (SRI)
BurstSRI 对象随每个数据突发一起传送并描述数据生产者的数据负载和处理状态。下表仅描述了在资源之间传递突发数据时数据结构的必需字段。
3、多输出端口
每个输出突发输入/输出BurstIO端口类型都提供了基于流 ID 和连接 ID 过滤来自资源的突发数据的能力。要使用端口的多出能力资源必须包含类似于以下的代码
structsequence idconnectionTablestruct idconnectionTable::connection_descriptornameconnection_descriptorsimple idconnectionTable::connection_id nameconnection_idtypestringkind kindtypeconfigure//simplesimple idconnectionTable::stream_id namestream_id typestringkind kindtypeconfigure//simplesimple idconnectionTable::port_name nameport_name typestringkind kindtypeconfigure//simple/structconfigurationkind kindtypeconfigure/
/structsequence为了将特定的数据流引导到特定的连接需要将 connectionTable 对象传递给端口的 updateConnectionFilter 方法。当路由模式设置为 ROUTE_CONNECTION_STREAMS 时端口将会将过滤状态应用于通过资源的 BurstIO 端口传出的任何突发流量。要将突发传递给现有连接端口的过滤器表中必须存在与下游资源的突发的流 ID 和连接 ID 匹配的项。
4、使用复数数据
每个传入数据的 BurstPacket 提供了 getComplex() 方法以表示向量是否包含复数样本它由实部和虚部组成。复数数据以交替的实部和虚部值发送。开发者可以以任何方式处理这些数据然而本节描述了将数据转换为更易于处理形式的常用方法。
①、在 C 中转换复数数据
在 C 中传入的突发输入/输出BurstIO数据向量可以被强制转换为复数值的 std::vector。例如
BurstShortIn::BurstPacket *pkt myShortPort-getPacket(bulkio::Const::BLOCKING);
if ( pkt-isComplex() ) {BurstShortIn::ComplexType cplx_data pkt-getComplexData();// ... do some processing with cplx_data
}5、时间戳
以下代码段提供了一个示例展示如何构造一个要在突发信号相关信息SRI中发送的 BULKIO::PrecisionUTCTime 时间戳。
/*** To create a time stamp from the current time of day*/BULKIO::PrecisionUTCTime tstamp burstio::utils::now();6、端口统计
所有突发输入/输出BurstIO端口支持批量输入/输出BulkIO统计接口并添加了跟踪特定于突发的指标的额外关键词。统计数据是在 10 次 pushBurst 调用的窗口中跟踪的。输入端口包含单个 PortStatistics 结构而输出端口包含一系列 PortStatistics 结构每个连接一个结构。有关 BULKIO::PortStatistics 的更多信息请参见端口统计。输入和输出端口的额外 BurstIO 指标在以下表格中描述
①、C
以下示例说明了一个组件该组件对传入的突发数据进行转换并将结果向下游推送。
burstio::BurstShortIn::PacketType *pkt;
pkt inShortPort-getPacket(bulkio::Const::NON_BLOCKING);// check if a valid packet was returned
if ( pkt NULL ) {return NOOP;
}// check for EOS
if ( pkt-getEOS() ) {outShortPort-pushBurst(pkt-getSequence(), pkt-getSRI(), pkt-getEOS());
}// do some processing.....to the burst contents
BurstShortOut::SequenceType data do_some_magic(pkt-getSequence());// we changed the data so calc new time stamp....
BULKIO::PrecisionUTCTime newTS calc_timestamp(pkt-getTime()); outShortPort-pushBurst(data, pkt-getSRI(), newTS, pkt-getEOS());二、消息传递
消息传递依赖于 CORBA 的事件结构作为传输结构。在 CORBA 的事件 API 中消息通过使用函数 push() 以 Any 类型传递。
虽然 CORBA 管理数据的编组和传递但它并未提供任何固有于事件的机制来描述 Any 类型的内容。REDHAWK 决定利用现有的负载结构描述符来描述消息的负载即属性接口描述语言IDL。选择此接口消除了创建描述消息的新 IDL 的需要。此外已有一种 XML 结构映射到高效的二进制数据结构允许使用 XML 来描述消息内容同时消除了在消息传递机制中引入 XML 解析器的需要。
为了支持这项额外功能REDHAWK 扩展了属性描述符允许属性具有消息类型。唯一可以具有有效消息类型的属性是结构。
1、消息生产者
在创建新组件或编辑现有组件时可以创建一个消息生产者。创建消息生产者后您必须注册您的代码以便从端口发送消息。以下程序解释了如何创建消息生产者并发送消息。
①、创建一个消息生产者
使用 REDHAWK IDE 向组件或设备添加消息生产者端口请遵循以下步骤 1从项目资源管理器视图中双击组件的软件包描述符SPD文件。此时将显示组件编辑器。 2在组件编辑器中选择“属性”标签。组件编辑器的属性标签页将被显示。 3要添加结构属性请点击“添加结构”。此时将显示属性标签的结构属性部分。 4在结构属性部分输入产生的消息的名称。ID 默认为您输入的名称。从“类型Kind”下拉菜单中选择“消息message。 5在“所有属性All Properties”部分选择您添加的结构属性。默认情况下已经存在一个简单成员。您可以修改它并为结构属性创建额外的成员。有关属性结构、类型和种类的更多信息请参考管理和定义属性。修改和/或创建这些成员后结构的成员和相应的属性信息将被显示。 6选择“端口Ports”标签点击“添加Add”并在“名称Name”字段中输入名称。在“端口详情Port Details”部分在“方向Direction”下拉菜单中选择“出out ”。在“接口Interface”字段旁点击“浏览Browse”。将显示“选择接口Select an Interface”对话框。从显示的接口列表中选择“ExtendedEvent MessageEvent”并点击“确定OK”。此时将显示消息生产者端口的信息。 7重新生成组件。创建消息生产者后您可以从消息生产者端口发送消息。
②、发送消息
以下代码示例演示了如何在 C中从组件的消息输出端口向事件通道或另一个组件的消息输入端口发送外发消息。
出于以下示例的目的假设结构如下
id: foo包含两个成员 name: some_string, type: stringname: some_float, type: float 组件的 uses 端口称为 message_out组件的名称是 message_producer
在每个示例中通过声明该类型的变量来创建消息。然后设置其状态并使用消息端口的 sendMessage() 方法发送消息消息变量作为参数。
C 要生成消息可以在实现文件的 serviceFunction() 方法中添加以下代码。
foo_struct my_msg;
my_msg.some_string hello;
my_msg.some_float 1.0;
this-message_out-sendMessage(my_msg);
// Send a message to a specific connection by providing a connectionId parameter.
// If connectionId does not match any connection, an std::illegal_argument exception is thrown.
this-message_out-sendMessage(my_msg, connection_1);2、消息消费者
在创建新组件或编辑现有组件时可以创建消息消费者。创建消息消费者后您必须注册您的代码以从端口接收消息。以下程序解释了如何创建消息消费者并注册代码以处理消息。
①、创建消息消费者
流程同上消息生产者流程与创建消息消费者流程不同之处只是在端口详细信息部分的方向下拉列表中选择bi-diruses/provides
②、注册接收消息
以下示例解释了如何在 C中注册代码以处理传入消息。
出于以下示例的目的假设结构如下
id: foo包含两个成员 name: some_string, type: stringname: some_float, type: float 组件的 uses/provides 端口称为 message_in组件的此消息的回调函数为 messageReceived()组件的名称是 message_consumer 如果此组件与消息生产者或事件通道之间存在连接则以下代码示例将处理传入消息。 任何带有属性 ID foo 的消息都将触发回调函数 messageReceived()。 C 鉴于事件的异步性质为消费者选择了回调模式。在组件头文件中声明以下回调函数
void messageReceived(const std::string id, const foo_struct msg);在组件源文件中实现回调函数
void message_consumer_i::messageReceived(const std::string id, const foo_struct msg) {LOG_INFO(message_consumer_i, id msg.some_float msg.some_string);
}在构造器constructor()方法中注册回调函数
message_in-registerMessage(foo, this, message_consumer_i::messageReceived);3、查看消息
消息是事件其有效负载定义与组件属性中的结构相关联。查看消息可以使用用于查看事件的相同技术。 要在终端窗口查看发送到事件通道的事件和消息
eventviewer domain name event channel实用程序的帮助:
eventviewer --helpeventviewer REDHAWK_DEV testchan 示例输出 这里出现了错误还未找到解决办法待后续找到后修改
4、连接生产者和消费者
生产者和消费者可以点对点连接也可以通过IDE 中的事件通道连接。将生产者直接连接到消费者不需要应用程序并且可以在沙箱中完成
from ossie.utils import sb
sb.catalog()
#[structs_test, m_in, prop_changes, m_out,pass]
prodsb.launch(m_out)
conssb.launch(m_in)
prod.connect(cons)
#True
sb.start()这里出现了错误还未找到解决办法待后续找到后修改
5、连接回调
在组件中许多 REDHAWK 中的 Uses 端口类支持在连接建立或断开时进行通知。支持的端口类型和语法因语言而异。
①、C
在 C 中Bulk 输入/输出BulkIO、Burst 输入/输出BurstIO和消息 Uses 端口的连接通知机制已标准化。连接和断开回调被注册在端口上。
以下示例假设一个 C 组件具有 BulkIO 浮点输出端口dataFloat_out然而对于 BurstIO 和消息端口语法是相同的。
在组件头文件中将回调声明为私有成员函数。连接和断开回调都接收单一参数连接 ID一个引用的 std::string
void dataFloatConnected(const std::string connectionId);
void dataFloatDisconnected(const std::string connectionId);在组件源文件中实现回调函数
void MyComponent_i::dataFloatConnected(const std::string connectionId)
{LOG_INFO(MyComponent_i, New connection connectionId on dataFloat_out);
}void MyComponent_i::dataFloatDisconnected(const std::string connectionId)
{LOG_INFO(MyComponent_i, Disconnected connectionId on dataFloat_out);
}然后在组件 constructor() 中注册回调函数
dataFloat_out-addConnectListener(this, MyComponent_i::dataFloatConnected);
dataFloat_out-addDisconnectListener(this, MyComponent_i::dataFloatDisconnected);addConnect Listener()和 addDisconnectListener() 接受两个参数目标对象通常是this和一个指向成员函数的指针。 没有必要同时注册连接和断开回调。 6、自定义 IDL 接口
REDHAWK提供前端接口FEI和标准核心框架CF接口如 CF::Resource用于控制实体并促进互操作性。在某些用例中您可能会发现需要使用自定义接口描述语言IDL来控制实体。对于这些用例您可以在 IDE 中创建自定义 IDL 项目。
将端口从 FEI 接口或自定义 IDL 接口添加到组件或设备中允许该实体通过 CORBA 控制其他实体。由于这些端口的通用性质不可能创建像 BulkIO 这样的语言映射因此交互是通过标准的 CORBA API 进行的其完整描述超出了本手册的范围。然而REDHAWK 代码生成器将生成简化与端口交互的端口。以下部分解释了使用输出端口的情况因为它们最有可能被生成例如用于控制 FEI 设备。
①、连接反馈
在所有三种支持的语言中FEI、标准 CF 或自定义 IDL 端口将有所有方法和属性映射到端口并且端口将委托调用给远程连接。在 REDHAWK 中端口可能没有连接、有一个连接或多个连接。这些条件中的每一个都可能为使用端口进行通信的人创建问题例如如果发送了一个控制请求并且没有连接那么用户应该被告知请求没有发送到任何地方。
同时并非所有方法都是相同的。一些方法只在一个方向上推送数据一些方法有返回值一些方法有作为指针的参数需要用信息填充输出或输入/输出参数。当调用端口方法并且端口无法进行调用或调用无法明确时例如如果存在两个连接并且函数包含返回值则在用户代码中引发 PortCallError。下表描述了满足的方法签名标准及其对应的行为。 如果一个方法作为其非异常 API 的一部分有任何形式的返回值表现为非 void 返回值或一个输出或输入/输出参数那么如果端口有多于一个的连接就会引发一个异常。此外如果尝试调用时实际上没有连接就会引发一个错误。
②、连接选择
虽然当所需的连接不明确时生成的端口类会触发一个错误但它也包含一个 API允许开发者选择应该使用哪个连接。每个方法都有一个可选参数connection_id允许调用者明确应该使用哪个连接。默认值行为将使用最后建立的连接。如果指定的 connection_id 不存在将引发 PortCallError。
在以下部分中用于明确连接的相同模式在所有三种支持的语言中都提供了。
以下代码示例使用调用 CF::File 接口的 read 方法时的默认行为。 CF::OctetSequence_var _data new CF::OctetSequence();CF::OctetSequence_out data(_data);this-file_out-read(data, 10); // read 10 characters from the last connection made to the port以下代码示例将读取调用明确指向一个特定的连接connection1。 CF::OctetSequence_var _data new CF::OctetSequence();CF::OctetSequence_out data(_data);this-file_out-read(data, 10, connection1); // read 10 characters from the connection called connection1要查看可用的连接请使用以下代码 std::vectorstd::string _connection_ids this-file_out-getConnectionIds();③、方法映射
方法名称映射遵循在连接选择中描述的模式即方法名称与 IDL 中描述的名称相同但增加了一个额外的参数可选地使用可以指定应使用哪个连接。属性被映射为对 CORBA 对象的函数。REDHAWK 提供额外的 API 来消除对多个连接的调用的歧义。
④、读取属性
通过调用属性的名称作为函数来执行读取属性。例如如果端口 my_port 包含字符串属性 greeting则可以如下检索 greeting 的值 std::string _greeting this-my_port-greeting();要从特定连接检索值需要_get_前缀 std::string _greeting this-my_port-_get_greeting(some_connection_name);⑤、写入属性
在 C 中写入属性涉及使用适当的参数调用函数 this-my_port-greeting(hello); // write hello to the attribute greetingthis-my_port-greeting(hello, some_connection_name); // write hello to the attribute greeting over connection some_connection_name我的qq2442391036欢迎交流