GNU Radio message

前面介绍过GNU Radio中协议数据包的传递方式之一——消息机制。仔细研究GNU Radio的源代码会发现,其中的消息机制是很重要的。几乎在所有实际的发送、接收中都会用到消息(message):在GRC中的packet_encoder和packet_decoder、pkt.py中的pkd_mod和pkd_demod以及packet.py中的packet_encoder和packet_decoder、packet_mod、packet_demod等等都用到了message_source和message_sink。

下面是一个使用message的例子:

from gnuradio import gr,blocks
from time import sleep

class msg_blocks(gr.top_block):

    def __init__(self):
        gr.top_block.__init__(self, 'Message Blocks Test')

        # initialize the queues
        self.sink_queue = gr.msg_queue()
        self.source_queue = gr.msg_queue()

        # initialize the blocks
        self.msg_source = blocks.message_source(gr.sizeof_char, self.source_queue)
        self.msg_sink = blocks.message_sink(gr.sizeof_char, self.sink_queue, False)

        self.connect((self.msg_source, 0), (self.msg_sink, 0))

    def send_pkt(self, payload):
        self.source_queue.insert_tail(gr.message_from_string(payload))

    def recv_pkt(self):
        pkt = ""

        if self.sink_queue.count():
            pkt = self.sink_queue.delete_head().to_string()

        return pkt            

if __name__=="__main__":
    tb = msg_blocks()
    tb.start()

    # operate on queues directly
    print 'operating on the queues directly'
    print 'sink queue count:', tb.sink_queue.count()

    print 'inserting:', 'a'
    tb.source_queue.insert_tail(gr.message_from_string('a'))

    sleep(1) # sleep to yield to tb thread

    print 'sink queue count:', tb.sink_queue.count()

    print 'received:', tb.sink_queue.delete_head().to_string()

    # operate using methods
    print 'operating with fuctions supplied by the top block'
    print 'sending:', 'a'*512
    tb.send_pkt('a'*512)
    sleep(1)

    print 'received:', tb.recv_pkt()
运行结果:

GNU Radio message_第1张图片

你可能感兴趣的:(GNU Radio message)