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


results matching ""

    No results matching ""