GNUradio tools for packet-switched transmission(message source 和message sink)
|
|
Packet-switching in GNUradio
- In packet-switched transmission, packets of data arrive asynchronously from the data source on the transmit side and from the USRP on the receive side.
- In order to accommodate the asynchronous nature of packet-switched transmission in the signal flow graph operation of GNUradio:
- Special source and sink blocks that contain buffers to hold packets are needed.
- Provisions for inserting packets into and extracting packets from the buffers in the source and sink blocks are needed.
- The flow graph needs to be halted when the buffers are empty, and packets may need to be discarded when the buffers are full.
Message and message queue classes
- The GNUradio
gr_messageandgr_msq_queueclasses provide the underlying buffering support for packet-switched source and sink blocks.
Message
- A message is a
gr_messageclass object, which is constructed by providing thetype(0=data,1=EOF), 2 optional arguments (arg1andarg2), andlengthof the message. - The following methods are provided to set the contents and access the various parameters of a message object:
gr_make_message_from_string (const std::string s, long type, double arg1, double arg2)-
to_string(): returns the message string -
set_type(long type)andtype() -
set_arg1(long arg1)andarg1() -
set_arg2(long arg1)andarg2() -
length() -
msq(): returns a pointer to the message string
Message queue
- A message queue is a
gr_msg_queueclass object, which is a linked list of message objects. The maximum lengthlimitof a message queue is set when constructing the queue. - Thread synchronizing access to a message queue is provided by the following two methods:
-
insert_tail(gr_message_sptr msg): inserts the messagemsqinto the tail of the queue if queue is not full; otherwise waits until some messages are removed from the queue by other threads. -
delete_head(): greps a message from the head of the queue if queue is not empty; otherwise waits until some messages are inserted into the queue by other threads.
-
- Other methods (no thread synchronization) are also provided to manage a message queue:
-
flush(): deletes all messages from the queue -
empty_p(): is the queue empty? -
full_p(): is the queue full? -
count(): returns number of messages in queue -
limit(): returns the maximum queue length
-
Transmit side operations
- Use the GNUradio message source block
gr_message_sourceto create a new message queue (or use an existing queue). - The message source block extracts messages from the queue to provide a character stream to the next block in the signal flow graph until it encounters an EOF message (
type=-1). It waits (halts the output character stream) when the queue is empty. - The message source block provides the method
msgq()to expose the message queue. Users can employ theinsert_tail()method of exposed message queue to add packets to the queue asynchronously. - The set of python programs starting at the top level with
benchmark_tx.pyin the directory$GR_INSTALL/share/gnuradio/examples/digitalillustrates how to perform packet-switched transmission using the message source block.
Receive side operations
- On the receive side, since the packet arrival process is not known in advance, one must search for packets from the received signal samples obtained from the USRP. This means:
- One must continuously perform carrier sensing, carrier synchronization, symbol synchronization, and demodulation (assuming high SNR), and then acquisition to extract packets from the USRP signal samples.
- The packet extraction function may be performed in a GNUradio sink block, which should also insert the extracted packets to a message queue. An example of such a sink block is the GNUradio block
gr_framer_sink_1. - A separate process is needed to monitor the message queue. The process should initiate a
callbackwhen a packet is inserted into the queue by the sink block. This can be achieved by using the thread-synchronizing message queue access methoddelete_head()in the monitoring process.
- The set of python programs starting at the top level with
benchmark_rx.pyin the directory$GR_INSTALL/share/gnuradio/examples/digitalillustrates how to perform packet-switched reception using the framer sink blockgr_framer_sink_1and the message queue class.
最后更新:2017-04-03 12:54:03