Tagged Stream Blocks
如果以流的形式传递数据包,很重要的是如何判断数据包的边界。blocks可以是input-drived也可以是output-drived。Tagged stream blocks传递数据包的时候,利用tag传输包长度。
PDU(Protocol Data Unit)协议数据单元。
例子:
加入crc32校验码的数据包:
声明:初始化增加tag长度和check位。
#include <digital/crc32_bb.h>
namespace gr {
namespace digital {
class crc32_bb_impl : public crc32_bb
{
public:
crc32_bb_impl(bool check, const std::string& len_tag_key);
~crc32_bb_impl();
int calculate_output_stream_length(const gr_vector_int &ninput_items);
int work(int noutput_items,
gr_vector_int &ninput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items);
};
} // namespace digital
} // namespace gr
实现
#include <gnuradio/io_signature.h>
#include "crc32_bb_impl.h"
namespace gr {
namespace digital {
crc32_bb::sptr crc32_bb::make(bool check, const std::string& len_tag_key)
{
return gnuradio::get_initial_sptr (new crc32_bb_impl(check, len_tag_key));
}
crc32_bb_impl::crc32_bb_impl(bool check, const std::string& len_tag_key)
: tagged_stream_block("crc32_bb",
io_signature::make(2, 1, sizeof (char)),
io_signature::make(1, 1, sizeof (char)),
len_tag_key),
d_check(check)
{
}
int
crc32_bb_impl::calculate_output_stream_length(const gr_vector_int &ninput_items)
{
if (d_check) {
return ninput_items[0] - 4;
} else {
return ninput_items[0] + 4;
}
}
int
crc32_bb_impl::work (int noutput_items,
gr_vector_int &ninput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
const unsigned char *in = (const unsigned char *) input_items[0];
unsigned char *out = (unsigned char *) output_items[0];
// Do all the signal processing...
// Don't call consume!
return new_packet_length;
}
} // namespace digital
} // namespace gr
- work每次只能处理一个PDU
ninput_items给定了每次需要消耗的item数量,所以不需要构建consume
调用produce