gunradio软件无线电发送接收字符程序.docx
GNURADlO软件无线电benchmark程序发送接收文件测试笔记在GNlJRADlO软件无线电程序中,benchmark程序可以发射900MHZ,接收900MHZ的无线电信号。具体做法是,把两台装有BaSiC子板的USRPl母板分别连上两台电脑的USB端口上,接通电源,在UbUntU操作系统下,在其中一台电脑的终端提示符下键入:“Cdusrlocalsharegnuradioexampledigitalz*进入benchmark程序的目录,再键入:.benchmark-tx.py-f900Mz,这时候,和这台山脑USB端口连接的USRP母板上的LFTX子板通过电线就会发送一个900M11Z的无线电信号,电脑显示器显示:表示正在发射无线电信号。这时,在另外的一台电脑上的终端提示符下键入:“Cdusrlocaulsharegnuradioexampledigitalz"进入benchmark程序的目录,再键入:./benchmark_rx.py-f900M”这时候,和这台脑USB端口连接的USRP母板上的LFTX子板通过电线就会收到一个900MHZ的无线电信号,电脑显示器显示:ok=Truepktno=1202n_rcvd=ln_right=0表明接收信号正常。现在的问题是要从这个电脑发送一个文件到另外一个电脑,我查找了相关资料发现,benchmark具有发送文件的功能,但是开源程序里没有这项功能,需要用户根据自己的需要修改程序来达到发送接收文件的功能。我通过研究发现,修改程序后,可以把这台电脑的aa.txt文件的"hello“字符发送到另外一台电脑的tt.txt文件中。具体做法是,在发送端电脑的“usrlOCaisharegnuradioexampledigital”目录下新建aa.txt,tt.txt两个文本文件,在aa.txt中输入“hello并保存,然后在终端下输入:“vibenchmark_tx.py在vi编辑器下打开benchmark_tx.py程序,在第124行tb.start()#startflowgraph”,后输入f=open(zzusrlocalsharegnuradioexamplesdigitalaa.txt”,r),a1ines=f.readlines()”两行新程序,第一行程序是以只读方式打开aa.txt文件,第二行程序的作用是以每行阅读的方式读出aa.txt中的文本内容,然后再赋值给IineS数组,接着把第140行程序payload=struct,pack(,!H*,pktno&Oxffff)+data改为payload=str(options,num)÷Str(Iines)这步的作用是,去掉了打包发送Pkno函数的功能,而加入发送IineS函数和options,num函数的功能。现在说一下options.num函数是从哪来的。首先把程序的第95行至第100行,改为parser.add_oPtiOn-discontinuous,action=z'store-truezz,default=False,help二enablediscontinoustransmission(burstsof5packets),)parser.add_oPtiOr-from_filez,dest=z'from-file,default=None,help二USCintputfileforpacketcontents")parser.add_oPtiOn(-T,-to_file,dest=z*to-file,z,default=None,help=,zOutputfileformodulatedsamples")parser.add_oPtion(-n,一num”,type二int,dest=,znum,default=l000,help二Sendmessage")parser.add_oPtion(-e,-file”,dest=z"filename,z,help二WritereporttoFILE,z,metavar=zzFILEzz)parser,add-option(zz-p/-Pdbk,action=zzstore-true,dest=,pdcl,;default=False,help二Writepdbkdatatooracledb)ParSCr.add_oPtiOn(-z,一Zdbk,action=zzstore-truez",dest="zdcl",default=False,help二Writezdbkdatatooracledb)简单说一下,在终端输入wbenchmark_tx-f900M-111500”时,程序以900MHZ的频率发送数组options,num中的数字1500和IineS数组,因为parser.add_option(-n,一num”,type二int,dcst="nu,default=1000,help二Sendmessage")定义了一个属性是num的OPtiOrLnum函数通过提示符"-nxxx”来返回一个值给option,num数组,上面其他程序的作用是定义了在终端提示符下发送文件-W,接收文件写入给数据库-p,读取数据库-z,其他功能这里暂时不讨论。修改完成后保存文件,退出Vi编辑器。下来在接收端的电脑上的/usr1ocalshare/gnuradio/exampledigitalnarrowband”目录下新建aa.txt,tt.txt两个空白文本文件,然后在终端下输入:“vibenchmark_rx.pyz"在Vi编辑器下打开benchmark_rx.py程序,把第79行到第98行的内容改为globaln_rcvd,n_rightglobaln_datadefmain():globaln_rcvd,n_rightglobaln_datan_rcvd=0n_right=0n_data=str()defrx_calIback(ok,payload):globaln_rcvd,n_rightglobaln_data(pktno,)=struct,unpack(,!H,PayIoad0:2)n_data=payload0:4096f=open(/usrlocalsharegnuradio/examples/digital/tt.八txt,W)f.write(payload)n_rcvd+=1ifok:n_right+=1print,zok=%5spktno=%4dn_rcvd=%4dn_right-%4dn_data=%5s"%(ok,pktno,n_rcvd,n_right,n_data)其中,n_data=payload0:4096定义变量n_data用来显示接收的options.num数组和IineS数组。还有上述f=open(/usrlocalshare/gnuradio/examples/digital/narrowband/tt.txt,w)f.write(payload)两行程序实现了以写入方式打开tt.txt文本文件,然后把接收的payload数组写入tt.txt中。保存修改退出Vi编辑器后,在发送端的电脑/usrlocalshare/gnuradio/example/digitai的目录下键入.benchmark-tx.py-f900M-n1900后,电脑显示表示发送正常,然后在接收端电脑usrlocalsharegnuradioexample/digitai的目录下键入.benchmark-tx.py-f900M电脑显示Ok-Truepktno-12598n_rcvd=458n_right=458n_data-1900,hellon,表示接收正常。用“ctrl+c”键停止接收,打开接收端电脑usrlOCaIsharegnuradioexampledigital的目录下的tt.txt文件,发现原来是空文件的tt.txt,出现'he11on'显示,表示发送接收正常.说明发送端电脑上的aa.txt文件中的“hello”字符已经传送到接收端电脑的tt.txt文件中。给发送端电脑的aa.txt文件中添加字符,如把"hello”改为“hellopython,接收端点脑上的tt.txt文件中显示“'helloPythonn'表明接受正常,当aa.txt中字符的长度超过3571个字节时,接收端就会显示乱码,因为每次程序只能发送低于3571字节的文本,一旦文本超过了3571字节,发送的信息量太大就会使程序读入数据出错,接收端就会收到乱码,要传送更多字节的文本就要修改程序,这个问题还在研究,现在不做讨论。下面测试一下能不能用其他子板正常发送接收文本。把上面的两个BaSiC子板换成两个WBX子板,WBX子板上都连有天线。测试后发现接收端的tt.txt就会显示乱码和误码。例如原来发送aa.txt文本中的hc11o”,接收到的tt.txt文本却是为造成这个结果的原因是WBX子板靠天线发送信号,而LFRX子板是通过屏蔽线传输信号。WBX子板发送无线电后,由于空间中的干扰,无线电信号在传输中会产生衰减和变化,另外的WBX子板接收到的无线电信号就会和发送的无线电信号不同。要想传输的内容不发生变化,就要修改程序,使每次只发送一个数据,这样接收就不容易产生误码和乱码。修改程序后,把benchmark_tx.Py中的z/payload=data+Str(Iines)+chr(options,num&Oxff)改为z/payload=Str(Iines)”作用是只把IineS的值赋给发送函数PaIoad,相当于只发送了IineS数组。同时把发送端电脑的aa.txt文件里的“hell。”改为“h”,只发送一个字符h,减少了传送的数据量,此时运行接收.benchmark-rx.Py-f900M和发送.benchmark-tx.Py-f900M发现接收端电脑的tt.txt文本显示'h,;表明接收成功附件:bcnchmark_rx.py源码ft!usrbinpython#!/USrbinenvpython# Copyright2010,2011,2013FreeSoftwareFoundation,Inc.# ThisfileispartofGNURadio# GNURadioisfreesoftware;youcanredistributeitand/ormodify# itunderthetermsoftheGNUGeneralPublicLicenseaspublishedby# theFreeSoftwareFoundation;eitherversion3,or(atyouroption)# anylaterversion.# GNURadioisdistributedinthehopethatitwillbeuseful,# butWITHOUTANYWARRANTY;withouteventheimpliedwarrantyof# MERCHANTABILITYorFITNESSFORAPARTICULARPURPOSE.Seethe# GNUGeneralPublicLicenseformoredetails.# YoushouldhavereceivedacopyoftheGNUGeneralPublicLicenseftalongwithGNURadio;seethefileCOPYING.Ifnot,writeto# theFreeSoftwareFoundation,lnc.,51FranklinStreet,# Boston,MA02110-1301,USA.#fromgnuradioimportgr,grufromgnuradioimportblocksfromgnuradioimporteng_notationfromgnuradio.eng_optionimporteng_optionfromoptparseimportOptionParser# Fromgr-digitalfromgnuradioimportdigital# fromcurrentdirfromreceive_pathimportreceive_pathfromUhdJnterfaceimportuhd_receiverimportstructimportsys#importos#printos.getpid()#raw_input('Attachandpressenter:,)classmy_top_block(gr.top_block):def_init_(Seltdemodulator;r×-callback,options):gr.top_block._init_(self)if(options.rx_freqisnotNone):#Work-aroundtogetthemodulation'sbits_per_symbolargs=demodulator.extract_kwargs_from_options(options)symbol_rate=options.bitrate/demodulator(*args).bits_per_symbol()self.source=Uhd_receiVer(OPtionS.args,symbol_rate,options.samples-per-symbolzoptions.rx-freqzoptions.Io_offset,options.rx_gain,options.spec,options.antenna,options.clock-sourcezoptions.verbose)options.samples_per_symbol=self.source._spselif(options.from_fileisnotNone):sys.stderr.write("Readingsamplesfrom'%s'.nn"%(options.from_file)self.source=blocks.file_source(gr.sizeof_gr_complex,options.from_file)else:sys.stderr.write("Nosourcedefined,pullingsamplesfromnullsource.nn")self.source=blocks.null_source(gr.sizeof_gr_complex)# Setupreceivepath# dothisafterforanyadjustmentstotheoptionsthatmay# occurinthesinks(specificallytheUHDsink)self.rxpath=receive-path(demodulatorzrx-callbackzoptions)self.connect(self.sourcezself.rxpath)nIiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii#mainnIiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiglobaln_rcvd,n_rightdefmain():globaln_rcvd,n_rightglobalc_revn_rcvd=On_right=Odefrx_callback(ok,payload):#dingyirx_callbackhanshu,zuoyongshixianshiJieshoushujubaoglobaln_rcvd,n_rightglobalc_revftdingyic_revweijieshouhanshu(pktnoz)=struct.unpack(,!Hpayload0:2)(c_revz)=struct.unpack(,H',payload0:2)#c_revjieshou×inhaon_rcvd+=1ifok:n_right+=1print"ok=%5spktno=%4dn_rcvd=%4dn_right=%4dc_rev=%4d"%(ok,pktno,n_rCVd,n_right,c_rev)demods=digital.modulation_utils.type_l_demods()# CreateOptionsParser:parser=OptionParser(option-class=eng-optionzconflict_handler="resolve")expert_grp=parser.add_option_group("Expert")parser.add-option(""m","-modulation",type="choice"zchoices=demods.keys(),default='psk",help="Selectmodulationfrom:%sdefault=%default"%(,z'.join(demods.keys()J)parser.add-option("",-from-file"zdefault=None,help="inputfileofsamplestodemod")receive_path.add_options(parser;expert_grp)uhd_receiver.add_options(parser)formodindemods.values():mod.add_options(expert_grp)(options,args)=parser.parse_args()iflen(args)!=O:parser.print_help(sys.stderr)sys.exit(l)ifoptions.from_fileisNone:ifoptions.rx_freqisNone:sys.stderr.write("Youmustspecify-fFREQor-freqFREQn")parser.print_help(sys.stderr)sys.exit(l)# buildthegraphtb=my_top_block(demodsoptions.modulation,rx_callback,options)r=gr.enable_realtime_scheduling()ifr!=gr.RT_OK:print"Warning:Failedtoenablerealtimescheduling."tb.start() tb.wait()#startflowgraph#waitforittofinishif_name_=,_main_,:try:main()exceptKeyboardlnterrupt:passbenchmark_tx.py源码#!/usr/bin/Python#!/usr/bin/envpython#ftCopyright2010,2011,2013FreeSoftwareFoundation,Inc.# ThisfileispartofGNURadio# GNURadioisfreesoftware;youcanredistributeitand/ormodify# itunderthetermsoftheGNUGeneralPublicLicenseaspublishedby# theFreeSoftwareFoundation;eitherversion3,or(atyouroption)# anylaterversion.# GNURadioisdistributedinthehopethatitwillbeuseful,# butWITHOUTANYWARRANTY;withouteventheimpliedwarrantyof# MERCHANTABILITYorFITNESSFORAPARTICULARPURPOSE.Seethe#GNUGeneralPublicLicenseformoredetails.# YoushouldhavereceivedacopyoftheGNUGeneralPublicLicense# alongwithGNURadio;seethefileCOPYING.Ifnot,writeto# theFreeSoftwareFoundation,lnc.,51FranklinStreet,# Boston,MA02110-1301,USA.#fromgnuradioimportgrfromgnuradioimportblocksfromgnuradioimporteng_notationfromgnuradio.eng_optionimporteng_optionfromoptparseimportOptionParser#diaoyongminglinghangchulicanshu# Fromgr-digitalfromgnuradioimportdigital# fromcurrentdirfromtransmit_pathimporttransmit_pathfromUhdJnterfaceimportuhd_transmitterimporttime,struct,sys#importos#printos.getpid()#raw_input('Attachandpressenter')classmy_top_block(gr.top_block):def_init_(self,modulator;options):gr.top_block._init_(self)if(options.tx_freqisnotNone):# Work-aroundtogetthemodulation'sbits_per_symbolargs=modulator.extract_kwargs_from_options(options)symbol_rate=options.bitrate/modulator(*args).bits_per_symbol()self.sink=Uhd_transmitter(OPtionS.args,SymbOLrate,options.samples_per_symbol,options.tx_freq,options.Io_offset,options.tx-gainfoptions.spec,options.antenna,options.clock-sourcezoptions.verbose)options.samples_per_symbol=self.sink._spselif(options.to_fileisnotNone):sys.stderr.write("Savingsamplesto'%s,nn"%(options.to_file)self.sink=blocks.file_sink(gr.sizeof_gr_complex,options.to_file)else:sys.stderr.write("Nosinkdefined,dumpingsamplestonullsink.nn")self.sink=blocks.null_sink(gr.sizeof_gr_complex)# dothisafterforanyadjustmentstotheoptionsthatmay# occurinthesinks(specificallytheUHDsink)self.txpath=transmit-path(modulator;options)self.connect(self.txpathzself.sink)iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii#main#Illlllllllilllllllllllllllllllllllllllllllilllllllllllllllllllllllllllllllllldefmain():defsend-pkt(payload=,zeof=False):#dingyifasonghanshureturntb.txpath.send_pkt(payload,eof)mods=digital.modulation_utils.type_l_mods()parser=OptionParser(option-class=eng-optionzconflict_handler="resolve")expert_grp=parser.add_option_group("Expert")parser.add-option("-m","-modulation",type="choice"zchoices=mods.keys()zdefault='pskhelp="Selectmodulationfrom:%sdefault=%default"%('z'.join(mods.keys()z)parser.add-option("-s,"-size",type="eng-float"zdefault=1500zhelp="setpacketsizedefault=%default")parser.addptionC'-M'*,"-megabytes",type="eng_float",default=1.0,help="setmegabytestotransmitdefault=%default")parser.add-option("-E"z,-discontinuous",action="store-true"zdefault=FaIse,help="enablediscontinoustransmission(burstsof5packets)")parser.add-option("-W'7'-from-file",dest="from-file',default=None,help="useintputfileforpacketcontents")parser.add-option("-T",-to-file",dest='to-file'zdefault=None,help="0utputfileformodulatedsamples")parser.add-option("-n"'-num"ztype="int",dest="num"zdefault=1000,help="sendmessage")parser.add_option(""p","-pdbk",action="store-true",dest="pdd,default=Falsezhelp="writedbkdatatooracledb")parser.add-option("-z,"-zdbk",action="store-true,dest="zdcl",default=Falsezhelp="writezdbkdatatooracledb")transmit_path.add_options(parsei;expert_grp)uhd_transmitter.add_options(parser)formodinmods.values():mod.add_options(expert_grp)(options,args)=parser.parse_args()#ifoptions.pdcl=True:#print'pdclistrue'#ifoptions.zdcl=True:# print'zdclistrue'iflen(args)!=0:parser.print_help()sys.exit(l)ifoptions.from_fileisnotNone:source_file=open(options.from-filez'r,)# buildthegraphtb=my_top_block(modsoptions.modulation,options)r=gr.enable_realtime_scheduling()ifr!=gr.RT_OK:print"Warning:failedtoenablerealtimescheduling"tb.start()#startflowgraph#generateandsendpacketsnbytes=int(le6*options.megabytes)n=0pktno=0pkt_size=int(options.size)whilen<nbytes:ifoptions.from_fileisNone:data=(pkt_size-2)*chr(pktno&Oxff)else:data=source_file.read(pkt_size-2)ifdata=-,:break;payload=struct.pack(,!H',pktno&Oxffff)+data#+open(options.data)#PayIoad=data#+StrUCt.pack('!H',pktno&Oxffff)send_pkt(payload)n+=len(payload)sys.stderr.write(,.')ifoptions.discontinuousandpktno%5=4:time.sleep(l)pktno+=1send_pkt(eof=True)tb.wait()#waitforittofinishif_name_='_main_':try:main()exceptKeyboardlnterrupt:pass