ns-3 ցանցի սիմուլյատորի ձեռնարկ: Գլուխ 3

ns-3 ցանցի սիմուլյատորի ձեռնարկ: Գլուխ 3
գլուխ 1,2

3 Սկսել
3.1 Ընդհանուր ակնարկ
3.2 Նախադրյալներ
3.2.1 Ներբեռնում ns-3 թողարկումը որպես աղբյուրի արխիվ
3.3 Ներբեռնում ns-3 Git-ի միջոցով
3.3.1 Բեռնում ns-3՝ օգտագործելով «Թխում»:
3.4 Համագումար ns-3
3.4.1 Շենք build.py-ով
3.4.2 Բեյքի հետ շենք
3.4.3 Կառուցել Waf-ով
3.5 Փորձարկում ns-3
3.6 Սցենարի գործարկում
3.6.1 Հրամանի տողի արգումենտներ
3.6.2 Վրիպազերծում
3.6.3 Աշխատանքային գրացուցակ

Գլուխ 3

Սկսել

Այս գլուխը նախատեսված է նախապատրաստելու ընթերցողին սկսելու համակարգիչ, որը, հնարավոր է, երբեք չի տեղադրել ns-3: Այն ներառում է աջակցվող հարթակներ, նախադրյալներ, ինչպես ստանալ ns-3, ինչպես կառուցել ns-3 և ինչպես փորձարկել ձեր կառուցումը և գործարկել պարզ ծրագրերը:

3.1 Ընդհանուր ակնարկ

ns-3 սիմուլյատորը կառուցված է որպես համագործակցային ծրագրային գրադարանների համակարգ: Մոնտաժման ժամանակ օգտատերերի ծրագրերի կոդը կապվում է այս գրադարանների հետ: C++ կամ Python ծրագրավորման լեզուները օգտագործվում են հատուկ ծրագրեր գրելու համար:

Ns-3-ը բաշխվում է որպես սկզբնաղբյուր, ինչը նշանակում է, որ թիրախային համակարգը պետք է ունենա ծրագրային ապահովման մշակման միջավայր, որպեսզի նախ կառուցի գրադարանները, այնուհետև օգտագործողի ծրագիրը: Սկզբունքորեն, ns-3-ը կարող է բաշխվել որպես պատրաստի գրադարաններ կոնկրետ համակարգի համար, իսկ ապագայում դրանք կարող են տարածվել այս կերպ։ Բայց մեր օրերում շատ օգտատերեր իրականում կատարում են իրենց աշխատանքը՝ խմբագրելով ns-3-ը, ուստի օգտակար է ունենալ սկզբնաղբյուր՝ գրադարաններ կառուցելու համար: Եթե ​​որևէ մեկը ցանկանում է ստանձնել օպերացիոն համակարգերի համար պատրաստի գրադարանների և փաթեթների ստեղծման աշխատանքը, խնդրում ենք դիմել փոստային ցուցակին: ns-ծրագրավորողներ.

Հաջորդը, մենք կքննարկենք ns-3 ներբեռնելու և կառուցելու երեք եղանակ: Առաջինը հիմնական կայքից պաշտոնական թողարկումը ներբեռնելն ու կառուցելն է: Երկրորդը հիմնական ns-3 տեղադրման զարգացման տարբերակների պատճենների ընտրությունն ու հավաքումն է: Երրորդը լրացուցիչ կառուցման գործիքներ օգտագործելն է՝ ns-3-ի համար ավելի շատ ընդլայնումներ բեռնելու համար: Մենք կանցնենք յուրաքանչյուրի միջով, քանի որ գործիքները մի փոքր տարբեր են:

Փորձառու Linux օգտագործողները կարող են մտածել, թե ինչու ns-3-ը չի տրամադրվում որպես փաթեթ, ինչպես փաթեթների կառավարիչ օգտագործող այլ գրադարանների մեծ մասը: Թեև կան երկուական փաթեթներ Linux-ի տարբեր բաշխումների համար (օրինակ՝ Debian), օգտատերերի մեծամասնությունը վերջում խմբագրում է գրադարանները և ստիպված է լինում ինքնուրույն վերակառուցել ns-3-ը, ուստի աղբյուրի կոդը հասանելի է: Այդ իսկ պատճառով մենք կկենտրոնանանք աղբյուրից տեղադրելու վրա:

Ծրագրերի մեծ մասի համար ns-3 իրավունքներ արմատ անհրաժեշտ չեն, խորհուրդ է տրվում օգտագործել ոչ արտոնյալ օգտվողի հաշիվ:

3.2 Նախադրյալներ

Հասանելի ns-3 գրադարանների ամբողջ հավաքածուն ունի մի շարք կախվածություններ երրորդ կողմի գրադարաններից, բայց մեծ մասամբ ns-3-ը կարող է կառուցվել և օգտագործվել մի քանի ընդհանուր (հաճախ լռելյայն տեղադրված) բաղադրիչների աջակցությամբ՝ C++ կոմպիլյատոր, Python, կոդերի խմբագիր (օրինակ, եռանդ, emacs կամ Խավարում) և, եթե օգտագործվում են զարգացման պահոցներ, Git տարբերակի կառավարման համակարգեր: Առաջին անգամ օգտագործողների մեծամասնությունը կարիք չի ունենա անհանգստանալու, եթե նրանց կոնֆիգուրացիան հայտնում է, որ որոշ ns-3 առաջադեմ գործառույթներ բացակայում են, բայց նրանց համար, ովքեր ցանկանում են ամբողջական տեղադրում, նախագիծը տրամադրում է վիքի, որը ներառում է բազմաթիվ օգտակար խորհուրդներով և հնարքներով էջեր: Այդպիսի էջերից մեկը տեղադրման էջն է՝ տարբեր համակարգերի տեղադրման հրահանգներով, հասանելի հետևյալ հասցեով՝ https://www.nsnam.org/wiki/Installation.

Այս վիքիի «Նախադրյալներ» բաժինը բացատրում է, թե որ փաթեթներն են անհրաժեշտ ընդհանուր ns-3 տարբերակներն աջակցելու համար, ինչպես նաև տրամադրում է հրամաններ, որոնք օգտագործվում են դրանք Linux-ի կամ macOS-ի սովորական տարբերակների վրա տեղադրելու համար:

Դուք կարող եք օգտվել այս հնարավորությունից՝ ուսումնասիրելու ns-3 վիքի էջը կամ հիմնական կայքը. https://www.nsnam.org, քանի որ այնտեղ շատ տեղեկություններ կան։ Սկսած ns-3-ի վերջին տարբերակից (ns-3.29), ns-3-ը գործարկելու համար անհրաժեշտ են հետևյալ գործիքները.

Գործիքների փաթեթ/տարբերակ

  • C++ կոմպիլյատոր
    clang++ կամ g++ (g++ տարբերակ 4.9 կամ ավելի բարձր)
  • Python
    python2 տարբերակ >= 2.7.10, կամ python3 տարբերակ >=3.4
  • գնալ
    ցանկացած վերջին տարբերակ (ns-3 GitLab.com-ում մուտք գործելու համար)
  • կուպր
    ցանկացած վերջին տարբերակ (ns‑3 թողարկումը ապափաթեթավորելու համար)
  • bunzip2
    ցանկացած վերջին տարբերակ (ns‑3 թողարկումը բացելու համար)

Python-ի լռելյայն տարբերակը ստուգելու համար մուտքագրեք python -V. g++ տարբերակը ստուգելու համար մուտքագրեք g++ -v. Եթե ​​որևէ գործիք բացակայում է կամ շատ հին է, խնդրում ենք ծանոթանալ ns-3 վիքի էջում տեղադրված տեղադրման ուղեցույցին:

Այսուհետ մենք ենթադրում ենք, որ ընթերցողը աշխատում է Linux, MacOS կամ Linux էմուլյատորով և ունի առնվազն վերը նշված գործիքները:

3.2.1 Ներբեռնում ns-3 թողարկումը որպես աղբյուրի արխիվ

Սա գործողությունների ընթացքն է նոր օգտվողի համար, ով ցանկանում է ներբեռնել և փորձարկել ns-3-ի վերջին թողարկման և փաթեթի տարբերակները: ns-3 թողարկումները հրապարակվում են որպես սեղմված աղբյուրի արխիվներ, որոնք երբեմն կոչվում են խեժ. խեժ ծրագրային ապահովման արխիվի հատուկ ձևաչափ է, որտեղ մի քանի ֆայլեր միավորված են միասին: Արխիվը սովորաբար սեղմվում է: ns-3 բեռնման գործընթացը միջոցով խեժ պարզ է, պարզապես անհրաժեշտ է ընտրել թողարկում, ներբեռնել և ապափաթեթավորել այն:

Ենթադրենք, որ դուք, որպես օգտվող, ցանկանում եք կառուցել ns-3 տեղական գրացուցակում, որը կոչվում է աշխատանքային տարածք. Դուք կարող եք ստանալ թողարկման աշխատանքային պատճենը՝ մուտքագրելով հետևյալը Linux կոնսոլում (իհարկե, փոխարինելով համապատասխան տարբերակի համարները)

$ cd 
$ mkdir workspace 
$ cd workspace 
$ wget https://www.nsnam.org/release/ns-allinone-3.29.tar.bz2 
$ tar xjf ns-allinone-3.29.tar.bz2 

Ուշադրություն դարձրեք վերևում օգտագործված օգտակարությանը wget, որը հրամանի տողի գործիք է ինտերնետից օբյեկտներ ներբեռնելու համար։ Եթե ​​դուք չեք տեղադրել այն, կարող եք օգտագործել ձեր բրաուզերը դրա համար:

Այս քայլերին հետևելը ձեզ կտանի դեպի ns-allinone-3.29 գրացուցակը, որտեղ դուք պետք է տեսնեք մի քանի ֆայլ և դիրեկտորիա:

$ cd ns-allinone-3.29
$ ls
bake constants.py ns-3.29 README
build.py netanim-3.108 pybindgen-0.17.0.post58+ngcf00cc0 util.py

Այժմ դուք պատրաստ եք կառուցել ns-3 բազային բաշխումը և կարող եք անցնել ns-3 շենքի հատվածին:

3.3 Ներբեռնում ns-3 Git-ի միջոցով

ns-3 կոդը հասանելի է Git-ի պահոցներում GitLab.com կայքում https://gitlab.com/nsnam/. Խումբ nsnam միավորում է բաց կոդով նախագծի կողմից օգտագործվող տարբեր շտեմարանները:

Git շտեմարաններն օգտագործելու ամենահեշտ ձևը միջավայրը պատառաքաղելն է կամ կլոնավորումը ns-3-allinone. Սա սկրիպտների մի շարք է, որը ղեկավարում է առավել հաճախ օգտագործվող ns-3 ենթահամակարգերի բեռնումը և հավաքումը: Եթե ​​դուք նոր եք Git-ում, ապա «պատառաքաղ» և «կլոն» տերմինները կարող են ձեզ անծանոթ լինել. Եթե ​​այո, խորհուրդ ենք տալիս պարզապես կլոնավորել (ստեղծել ձեր սեփական պատճենը) GitLab.com-ում տեղակայված պահոցն այսպես.

$ cd 
$ mkdir workspace 
$ cd workspace 
$ git clone https://gitlab.com/nsnam/ns-3-allinone.git 
$ cd ns-3-allinone 

Այս փուլում ձեր գրացուցակի տեսքը ns-3-allinone մի փոքր տարբերվում է վերը նկարագրված թողարկման արխիվային գրացուցակից: Այն պետք է նման լինի հետևյալին.

$ ls
build.py constants.py download.py README util.py

Խնդրում ենք նկատի ունենալ, որ կա սցենար download.py, որը լրացուցիչ կարտահանի ns-3 և ուղեկցող կոդ: Այստեղ դուք ունեք ընտրություն. կա՛մ ներբեռնեք ns-3 զարգացման վերջին նկարը.

$ python download.py

կամ նախընտրում են ns-3 թողարկումը՝ օգտագործելով դրոշը -n թողարկման համարը նշելու համար.

$ python download.py -n ns-3.29

Այս քայլից հետո դեպի գրացուցակ ns-3-allinone լրացուցիչ պահոցներ կներբեռնվեն ns-3, թխել, pybindgen и նեթանիմ.

Նշում
Մաքուր Ubuntu16.04 ունեցող մեքենայի վրա ես պետք է փոխեի հրամանը հետևյալի վրա. $ sudo python3 download.py -n ns-3.29 (այսուհետ՝ թարգմանչի նշումները)։

3.3.1 Բեռնում ns-3՝ օգտագործելով «Թխում»:

Վերոհիշյալ երկու մեթոդները (աղբյուրի արխիվ կամ պահոց ns-3-allinone Git-ի միջոցով) օգտակար են մի քանի հավելումներով ամենապարզ ns-3 տեղադրումը ստանալու համար (pybindgen Python կապեր ստեղծելու և նեթանիմ ցանցային անիմացիայի համար): ns-3-allinone-ում լռելյայն տրամադրված երրորդ պահեստը կոչվում է թխել.

Թխել ns-3 նախագծի համար մշակված մի քանի պահեստներից ծրագրային ապահովման համակարգված կառուցման գործիք է: Թխել կարող է օգտագործվել ns-3-ի մշակման տարբերակները ձեռք բերելու, ինչպես նաև ns-3 բաշխման բազային տարբերակի ընդլայնումներ ներբեռնելու և կառուցելու համար, ինչպիսին է միջավայրը: Կոդի ուղղակի կատարում, CradleNetwork Simulation Cradle, Python-ի նոր կապեր և տարբեր ns-3 «հավելվածներ» ստեղծելու հնարավորություն։

Նշում
CradleNetwork Simulation Cradle-ը շրջանակ է, որը թույլ է տալիս օգտագործել իրական TCP/IP ցանցի կույտեր ցանցային սիմուլյատորի ներսում:

Եթե ​​ակնկալում եք, որ ձեր ns-3 տեղադրումը կունենա առաջադեմ կամ լրացուցիչ հնարավորություններ, կարող եք հետևել տեղադրման այս ճանապարհին:

Վերջին ns-3 թողարկումներում Թխել ավելացվել է թառի թողարկմանը։ Թողարկումը ներառում է կազմաձևման ֆայլ, որը թույլ է տալիս ներբեռնել ընթացիկ ծրագրաշարի տարբերակները թողարկման պահին: Դա, օրինակ, տարբերակն է Թխել, որը բաշխված է թողարկման ns-3.29-ով, կարող է օգտագործվել ns-3-ի կամ ավելի վաղ թողարկման բաղադրիչները առբերելու համար, բայց չի կարող օգտագործվել հետագա թողարկումների բաղադրիչները առբերելու համար (եթե փաթեթի նկարագրության ֆայլը bakeconf.xml չի թարմացվել):

Կարող եք նաև ստանալ վերջին օրինակը թխելձեր Linux կոնսոլում մուտքագրելով հետևյալ հրամանը (ենթադրելով, որ դուք տեղադրել եք Git).

$ cd 
$ mkdir workspace 
$ cd workspace 
$ git clone https://gitlab.com/nsnam/bake.git

Երբ գործարկում եք git հրամանը, դուք պետք է տեսնեք հետևյալի նման մի բան.

Cloning into 'bake'...
remote: Enumerating objects: 2086, done. 
remote: Counting objects: 100% (2086/2086), done. 
remote: Compressing objects: 100% (649/649), done. 
remote: Total 2086 (delta 1404), reused 2078 (delta 1399) 
Receiving objects: 100% (2086/2086), 2.68 MiB | 3.82 MiB/s, done. 
Resolving deltas: 100% (1404/1404), done.

Հրամանի ավարտից հետո clone դուք պետք է ունենաք անունով գրացուցակ թխել, որի բովանդակությունը պետք է այսպիսի տեսք ունենա.

$ cd bake
$ ls
bake bakeconf.xml bake.py doc examples generate-binary.py test TODO

Նկատի ունեցեք, որ դուք բեռնել եք մի քանի Python սկրիպտներ, Python մոդուլ անունով թխել և XML կազմաձևման ֆայլ: Հաջորդ քայլը այս սկրիպտներն օգտագործելն է՝ ձեր ընտրած ns-3 բաշխումը ներբեռնելու և կառուցելու համար: Անհատականացման մի քանի թիրախներ մատչելի են.

  1. ns-3.29: թողարկմանը համապատասխան մոդուլ; այն կներբեռնի թարբոլի թողարկմանը նման բաղադրիչներ.

  2. ns-3-devնմանատիպ մոդուլ, բայց օգտագործելով մշակման ծառի կոդը;

  3. ns-allinone-3.29Մոդուլ, որը ներառում է այլ լրացուցիչ հնարավորություններ, ինչպիսիք են Սեղմման երթուղին և Ցանցի սիմուլյացիայի օրրան, Openflow ns-3-ի համար:

  4. ns-3-allinone: նման է մոդուլի թողարկման տարբերակին բոլորը մեկում, բայց զարգացման կոդի համար։

Նշում
Սեղմել — մոդուլային ծրագրային ճարտարապետություն՝ երթուղիչներ ստեղծելու համար:

Openflow-ը երթուղիչներով և անջատիչներով տվյալների ցանցով փոխանցվող տվյալների մշակման գործընթացը կառավարելու արձանագրություն է՝ ծրագրային ապահովման կողմից սահմանված ցանցային տեխնոլոգիաների ներդրման համար:

NS-3-ի ընթացիկ զարգացման պատկերը (չհրապարակված) կարելի է գտնել հետևյալ հասցեով՝https://gitlab.com/nsnam/ns-3-dev.git.

Մշակողները փորձում են պահպանել այս պահոցները հետևողական աշխատանքային կարգով, բայց դրանք գտնվում են զարգացման տարածքում և պարունակում են չհրապարակված կոդ, այնպես որ, եթե չեք նախատեսում օգտագործել նոր հնարավորություններ, ապա ընտրեք պաշտոնական թողարկումը:

Դուք կարող եք գտնել կոդի վերջին տարբերակը՝ թերթելով պահեստների ցանկը կամ այցելելով ns-3 Releases վեբ էջ.https://www.nsnam.org/releases/ և սեղմելով վերջին տարբերակի հղումը: Այս օրինակում մենք կշարունակենք ns-3.29-ը:

Այժմ մեզ անհրաժեշտ ns-3 բաղադրիչները ստանալու համար մենք կօգտագործենք գործիքը Թխել. Մի քանի ներածական խոսք ասենք ստեղծագործության մասին Թխել.

Bake-ն աշխատում է՝ փաթեթի աղբյուրները բեռնելով գրացուցակում աղբյուր և տեղադրել գրադարանները build գրացուցակում: Թխել կարող է գործարկվել՝ հղում անելով երկուականին, բայց եթե ցանկանում եք գործարկել Թխել ոչ այն գրացուցակից, որտեղ այն ներբեռնվել է, խորհուրդ է տրվում ավելացնել ուղին թխել դեպի ձեր ճանապարհը (PATH միջավայրի փոփոխական), օրինակ՝ հետևյալ կերպ (օրինակ Linux bash shell-ի համար): Գնացեք «bake» գրացուցակ և այնուհետև սահմանեք հետևյալ միջավայրի փոփոխականները.

$ export BAKE_HOME=`pwd` 
$ export PATH=$PATH:$BAKE_HOME:$BAKE_HOME/build/bin 
$ export PYTHONPATH=$PYTHONPATH:$BAKE_HOME:$BAKE_HOME/build/lib

Սա կտեղադրի ծրագիրը bake.py դեպի shell ուղին և թույլ կտա այլ ծրագրերին գտնել գործադիրներն ու գրադարանները, որոնք ստեղծել է թխել. Օգտագործման որոշ դեպքերում թխել, վերը նկարագրված PATH և PYTHONPATH պարամետրը պարտադիր չէ, սակայն ns-3-allinone-ի ամբողջական կառուցումը (լրացուցիչ փաթեթներով) սովորաբար դա պահանջում է:

Գնացեք ձեր աշխատանքային գրացուցակ և մուտքագրեք հետևյալը վահանակում.

$ ./bake.py configure -e ns-3.29

Հաջորդիվ կհարցնենք Թխել ստուգեք, արդյոք մենք ունենք բավարար գործիքներ տարբեր բաղադրիչները բեռնելու համար: Հավաքեք՝

$ ./bake.py check

Դուք պետք է տեսնեք հետևյալի նման մի բան.

> Python - OK 
> GNU C++ compiler - OK 
> Mercurial - OK 
> Git - OK 
> Tar tool - OK 
> Unzip tool - OK 
> Make - OK 
> cMake - OK 
> patch tool - OK 
> Path searched for tools: /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin ...

Մասնավորապես, վերբեռնման գործիքները, ինչպիսիք են Mercurial-ը, CVS-ը, Git-ը և Bazaar-ը, կարևոր են այս քայլում, քանի որ դրանք թույլ են տալիս մեզ ստանալ կոդը: Այս պահին տեղադրեք բացակայող գործիքները ձեր համակարգի համար սովորական եղանակով (եթե գիտեք, թե ինչպես) կամ օգնության համար դիմեք ձեր համակարգի ադմինիստրատորին:

Հաջորդը, փորձեք ներբեռնել ծրագիրը.

$ ./bake.py download

արդյունքը պետք է լինի նման բան.

>> Searching for system dependency setuptools - OK 
>> Searching for system dependency libgoocanvas2 - OK 
>> Searching for system dependency gi-cairo - OK 
>> Searching for system dependency pygobject - OK 
>> Searching for system dependency pygraphviz - OK 
>> Searching for system dependency python-dev - OK 
>> Searching for system dependency qt - OK 
>> Searching for system dependency g++ - OK 
>> Downloading pybindgen-0.19.0.post4+ng823d8b2 (target directory:pybindgen) - OK 
>> Downloading netanim-3.108 - OK 
>> Downloading ns-3.29 - OK

Սա կնշանակի, որ ներբեռնվել է երեք աղբյուր։ Այժմ գնացեք աղբյուրի գրացուցակ և մուտքագրեք ls; Դուք պետք է տեսնեք.

$ cd source 
$ ls
netanim-3.108 ns-3.29 pybindgen

Այժմ դուք պատրաստ եք կառուցել ns-3 բաշխումը:

3.4 Համագումար ns-3

Ինչպես ns-3-ը ներբեռնելու դեպքում, ns-3 կառուցելու մի քանի եղանակ կա: Հիմնական բանը, որ մենք ուզում ենք ընդգծել, այն է, որ ns-3-ը կառուցված է կառուցման գործիքի միջոցով, որը կոչվում է վաֆնկարագրված է ստորև: Օգտատերերի մեծ մասը կաշխատի վաֆ, բայց կան մի քանի հարմար սցենարներ, որոնք կօգնեն ձեզ սկսել կամ կազմակերպել ավելի բարդ կառուցումներ: Այսպիսով, խնդրում եմ, նախքան դրա մասին կարդալը վաֆ, նայեք build.py և հավաքում հետ թխել.

3.4.1 Շենք build.py-ով

Զգուշացում! Կառուցման այս քայլը հասանելի է միայն սկզբնաղբյուրի արխիվի տարբերակից, որը ստացվել է, ինչպես նկարագրված է վերևում. և չի ներբեռնվում git-ի կամ bake-ի միջոցով:

Ազատման արխիվի հետ աշխատելիս խեժՄեջ ns-3-allinone Կա հարմար սցենար, որը կարող է հեշտացնել բաղադրիչների հավաքումը: Այն կոչվում է build.py: Այս ծրագիրը կստեղծի նախագիծը ձեզ համար ամենաօգտակար ձևով: Այնուամենայնիվ, նկատի ունեցեք, որ ավելի առաջադեմ կարգավորումը և ns-3-ի հետ աշխատանքը սովորաբար ներառում է ns-3-ի սեփական կառուցման համակարգի՝ Waf-ի օգտագործումը, որը կներկայացվի ավելի ուշ այս ձեռնարկում:

Եթե ​​ներբեռնել եք՝ օգտագործելով խեժ, ապա ձեր գրացուցակում ~/workspace գրացուցակ, որի անունը նման է ns-allinone-3.29. Մուտքագրեք հետևյալը.

$ ./build.py --enable-examples --enable-tests

Զանգահարելիս build.py Մենք օգտագործել ենք հրամանի տողի արգումենտներ՝ այս ձեռնարկում օգտագործվող օրինակներն ու թեստերը կառուցելու համար, որոնք լռելյայնորեն կառուցված չեն ns-3-ում: Լռելյայնորեն, ծրագիրը նաև կառուցում է բոլոր հասանելի մոդուլները: Այնուհետև, եթե ցանկանում եք, կարող եք կառուցել ns-3 առանց օրինակների և թեստերի, կամ բացառել մոդուլները, որոնք անհրաժեշտ չեն ձեր աշխատանքի համար։

Դուք կտեսնեք շատ կոմպիլյատորի ելքային հաղորդագրություններ, որոնք ցուցադրվում են սցենարով, երբ այն կառուցում է ձեր բեռնված տարբեր մասերը: Նախ սցենարը կփորձի կառուցել անիմատորը նեթանիմ, ապա պարտադիր գեներատորը pybindgen և վերջապես ns-3. Երբ գործընթացը ավարտված է, դուք պետք է տեսնեք հետևյալը.

Waf: Leaving directory '/path/to/workspace/ns-allinone-3.29/ns-3.29/build'
'build' finished successfully (6m25.032s) 

Modules built:
antenna                aodv                     applications
bridge                 buildings                config-store
core                   csma                     csma-layout
dsdv                   dsr                      energy 
fd-net-device          flow-monitor             internet
internet-apps          lr-wpan                  lte
mesh                   mobility                 mpi
netanim (no Python)    network                  nix-vector-routing 
olsr                   point-to-point           point-to-point-layout 
propagation            sixlowpan                spectrum 
stats                  tap-bridge               test (no Python) 
topology-read          traffic-control          uan 
virtual-net-device     visualizer               wave 
wifi                   wimax 

Modules not built (see ns-3 tutorial for explanation):
brite                  click                    openflow 
Leaving directory ./ns-3.29

Ցուցակման վերջին երեք տողերում մենք տեսնում ենք հաղորդագրություն չկառուցված մոդուլների մասին.

Modules not built (see ns-3 tutorial for explanation):
brite                     click

Սա պարզապես նշանակում է, որ որոշ ns-3 մոդուլներ, որոնք կախված են արտաքին գրադարաններից, կարող են կառուցված չլինել, կամ որ դրանք չեն պահանջվում կառուցել այս կազմաձևման համար: Սա չի նշանակում, որ սիմուլյատորը հավաքված չէ կամ հավաքված մոդուլները ճիշտ չեն աշխատի։

3.4.2 Բեյքի հետ շենք

Եթե ​​դուք օգտագործել եք bake վերը նշված ծրագրի պահեստներից աղբյուրի կոդը ստանալու համար, կարող եք շարունակել օգտագործել այն ns-3-ը կառուցելու համար: Հավաքեք՝

$ ./bake.py build

և դուք պետք է տեսնեք նման բան.

>> Building pybindgen-0.19.0.post4+ng823d8b2 - OK 
>> Building netanim-3.108 - OK 
>> Building ns-3.29 - OK

TooltipԴուք կարող եք նաև կատարել և՛ ներբեռնման, և՛ կառուցման քայլերը միանգամից՝ զանգահարելով «bake.py deploy»:

Բոլոր բաղադրիչների հավաքումը կարող է ձախողվել, բայց հավաքումը կշարունակվի, եթե բաղադրիչ չպահանջվի: Օրինակ, վերջին տեղափոխելիության խնդիրն այն էր castxml կարող է հավաքվել գործիքով թխել ոչ բոլոր հարթակներում: Այս դեպքում կհայտնվի այսպիսի հաղորդագրություն.

>> Building castxml - Problem 
> Problem: Optional dependency, module "castxml" failed
This may reduce the functionality of the final build.
However, bake will continue since "castxml" is not an essential dependency.
For more information call bake with -v or -vvv, for full verbose mode.

Սակայն castxml միայն անհրաժեշտ է, եթե ցանկանում եք ստեղծել թարմացված Python կապեր: Օգտատերերի մեծամասնության համար դրա կարիքը չկա (համենայն դեպս, քանի դեռ նրանք չեն փոխել ns-3-ը), այնպես որ նման նախազգուշացումներն առայժմ կարող են ապահով կերպով անտեսվել:

Եթե ​​այն ձախողվի, հետևյալ հրամանը ձեզ հուշում է բացակայող կախվածությունների մասին.

$ ./bake.py show

Ցուցակված կլինեն փաթեթների տարբեր կախվածությունները, որոնք դուք փորձում եք ստեղծել:

3.4.3 Կառուցել Waf-ով

Մինչև այս պահը, ns-3-ի կառուցումը սկսելու համար մենք օգտագործում էինք կամ սցենարը build.py, կամ գործիք թխել. Այս գործիքները օգտակար են ns-3 կառուցելու և գրադարաններ պահպանելու համար: Փաստորեն, կառուցելու համար նրանք գործարկում են build գործիքը վաֆ ns-3 գրացուցակից: վաֆ տեղադրված է ns-3 աղբյուրի կոդով: Օգտատերերի մեծամասնությունը արագորեն անցնում է ուղղակի օգտագործման՝ ns‑3-ը կարգավորելու և հավաքելու համար վաֆ. Այսպիսով, շարունակելու համար, խնդրում ենք գնալ ns-3 գրացուցակ, որը դուք ի սկզբանե ստեղծել եք:

Սա այս պահին խստորեն պարտադիր չէ, բայց օգտակար կլինի մի փոքր հետ կանգնել և տեսնել, թե ինչպես կարելի է փոփոխություններ կատարել նախագծի կազմաձևում: Հավանաբար ամենաօգտակար կոնֆիգուրացիայի փոփոխությունը, որը դուք կարող եք կատարել, կոդի օպտիմիզացված տարբերակ ստեղծելն է: Լռելյայնորեն, դուք կարգավորել եք ձեր նախագիծը վրիպազերծման տարբերակ ստեղծելու համար: Եկեք դիտարկենք օպտիմիզացված կառուցվածք ստեղծելու նախագիծը: Waf-ին բացատրելու համար, որ այն պետք է ստեղծի օպտիմիզացված կառուցումներ, որոնք ներառում են օրինակներ և թեստեր, դուք պետք է գործարկեք հետևյալ հրամանները.

$ ./waf clean 
$ ./waf configure --build-profile=optimized --enable-examples --enable-tests

Սա կմեկնարկի վաֆ տեղական գրացուցակից դուրս (ձեր հարմարության համար): Առաջին հրամանը մաքրվում է նախորդ կառուցվածքից, դա սովորաբար խիստ անհրաժեշտ չէ, բայց դա լավ պրակտիկա է (նաև տես ստորև կառուցման պրոֆիլները); սա կջնջի նախկինում ստեղծված գրադարանները և գրացուցակում գտնվող օբյեկտների ֆայլերը կառուցել/. Երբ նախագիծը վերակազմավորվում է, և կառուցման համակարգը ստուգում է տարբեր կախվածությունները, դուք պետք է տեսնեք հետևյալ արդյունքը.

Setting top to      : /home/ns3user/workspace/bake/source/ns-3-dev
Setting out to      : /home/ns3user/workspace/bake/source/ns-3-dev/build
Checking for 'gcc' (C compiler)        : /usr/bin/gcc 
Checking for cc version                : 7.3.0 
Checking for 'g++' (C++ compiler)      : /usr/bin/g++ 
Checking for compilation flag -march=native support : ok 
Checking for compilation flag -Wl,--soname=foo support : ok 
Checking for compilation flag -std=c++11 support       : ok 
Checking boost includes   : headers not found, please ,!provide a --boost-includes argument (see help) 
Checking boost includes   : headers not found, please ,!provide a --boost-includes argument (see help) 
Checking for program 'python'            : /usr/bin/python 
Checking for python version >= 2.3       : 2.7.15 python-config                                                                     : /usr/bin/python-config
Asking python-config for pyembed '--cflags --libs --ldflags' flags : yes
Testing pyembed configuration                                      : yes
Asking python-config for pyext '--cflags --libs --ldflags' flags   : yes
Testing pyext configuration                                        : yes

Checking for compilation flag -fvisibility=hidden support          : ok 
Checking for compilation flag -Wno-array-bounds support            : ok 
Checking for pybindgen location          : ../pybindgen ,!(guessed) 
Checking for python module 'pybindgen'   : 0.19.0. ,!post4+g823d8b2 
Checking for pybindgen version           : 0.19.0. ,!post4+g823d8b2 
Checking for code snippet                : yes 
Checking for types uint64_t and unsigned long equivalence : no 
Checking for code snippet                                 : no 
Checking for types uint64_t and unsigned long long equivalence     : yes 
Checking for the apidefs that can be used for Python bindings                       : gcc-LP64 
Checking for internal GCC cxxabi         : complete 
Checking for python module 'pygccxml'    : not found 
Checking for click location              : not found 
Checking for program 'pkg-config'        : /usr/bin/pkg- ,!config 
Checking for 'gtk+-3.0'                  : not found 
Checking for 'libxml-2.0'                : yes 
checking for uint128_t                   : not found 
checking for __uint128_t                 : yes 
Checking high precision implementation   : 128-bit integer ,!(default) 
Checking for header stdint.h             : yes 
Checking for header inttypes.h           : yes 
Checking for header sys/inttypes.h       : not found 
Checking for header sys/types.h          : yes 
Checking for header sys/stat.h           : yes 
Checking for header dirent.h             : yes 
Checking for header stdlib.h             : yes 
Checking for header signal.h             : yes 
Checking for header pthread.h            : yes 
Checking for header stdint.h             : yes 
Checking for header inttypes.h           : yes 
Checking for header sys/inttypes.h       : not found
Checking for library rt                  : yes 
Checking for header sys/ioctl.h          : yes 
Checking for header net/if.h             : yes 
Checking for header net/ethernet.h       : yes 
Checking for header linux/if_tun.h       : yes 
Checking for header netpacket/packet.h   : yes 
Checking for NSC location                : not found 
Checking for 'sqlite3'                   : not found 
Checking for header linux/if_tun.h       : yes 
Checking for python module 'gi'          : 3.26.1 
Checking for python module 'gi.repository.GObject'      : ok 
Checking for python module 'cairo'                      : ok 
Checking for python module 'pygraphviz'                 : 1.4rc1 
Checking for python module 'gi.repository.Gtk'          : ok 
Checking for python module 'gi.repository.Gdk'          : ok 
Checking for python module 'gi.repository.Pango'        : ok 
Checking for python module 'gi.repository.GooCanvas'    : ok 
Checking for program 'sudo'                             : /usr/bin/sudo 
Checking for program 'valgrind'                         : not found 
Checking for 'gsl' : not found python-config            : not found 
Checking for compilation flag -fstrict-aliasing support : ok 
Checking for compilation flag -fstrict-aliasing support : ok 
Checking for compilation flag -Wstrict-aliasing support : ok 
Checking for compilation flag -Wstrict-aliasing support : ok 
Checking for program 'doxygen'                          : /usr/bin/doxygen
---- Summary of optional ns-3 features:
Build profile : optimized
Build directory : 
BRITE Integration : not enabled (BRITE not enabled (see option --with- ,!brite)) 
DES Metrics event collection : not enabled (defaults to disabled) 
Emulation FdNetDevice        : enabled 
Examples                     : enabled 
File descriptor NetDevice    : enabled 
GNU Scientific Library (GSL) : not enabled (GSL not found) 
Gcrypt library               : not enabled
(libgcrypt not found: you can use ,!libgcrypt-config to find its location.) GtkConfigStore               : not enabled (library 'gtk+-3.0 >= 3.0' not fou   nd)
MPI Support                  : not enabled (option --enable-mpi not selected)
ns-3 Click Integration       : not enabled (nsclick not enabled (see option --with- ,!nsclick))
ns-3 OpenFlow Integration   : not enabled (Required boost libraries not found) 
Network Simulation Cradle    : not enabled (NSC not found (see option --with-nsc))
PlanetLab FdNetDevice         : not enabled (PlanetLab operating system not detected ,!(see option --force-planetlab)) PyViz visualizer : enabled 
Python API Scanning Support   : not enabled (Missing 'pygccxml' Python module)
Python Bindings : enabled 
Real Time Simulator           : enabled 
SQlite stats data output      : not enabled (library 'sqlite3' not found)
Tap Bridge                    : enabled 
Tap FdNetDevice               : enabled
Tests                         : enabled 
Threading Primitives          : enabled 
Use sudo to set suid bit   : not enabled (option --enable-sudo not selected)
XmlIo                         : enabled
'configure' finished successfully (6.387s)

Խնդրում ենք նկատի ունենալ վերը նշված ցուցակի վերջին մասը: Որոշ ns-3 տարբերակներ լռելյայն միացված չեն կամ պահանջում են համակարգի աջակցություն՝ ճիշտ գործելու համար: Օրինակ, XmlTo-ն ակտիվացնելու համար գրադարանը պետք է ներկա լինի համակարգում libxml-2.0. Եթե ​​այս գրադարանը չի գտնվել, և համապատասխան ns-3 ֆունկցիան միացված չէ, կցուցադրվի հաղորդագրություն: Նաև նշեք, որ հնարավոր է օգտագործել հրամանը sudo որոշ ծրագրերի համար «սահմանել խմբի ID-ն գործարկման ժամանակ» suid բիթը սահմանելու համար: Այն լռելյայն միացված չէ, և, հետևաբար, այս հատկությունը հայտնվում է որպես «միացված չէ»: Վերջապես, միացված ընտրանքների ցանկը ստանալու համար օգտագործեք վաֆ պարամետրով --check-config.

Հիմա եկեք վերադառնանք և վերադառնանք վրիպազերծման կառուցվածքին, որը պարունակում է օրինակներ և թեստեր:

$ ./waf clean 
$ ./waf configure --build-profile=debug --enable-examples --enable-tests

Կառուցման համակարգը այժմ կարգավորված է, և դուք կարող եք ստեղծել ns-3 ծրագրերի վրիպազերծման տարբերակներ՝ պարզապես մուտքագրելով.

$ ./waf

Վերոհիշյալ քայլերը կարող են ստիպել ձեզ երկու անգամ կառուցել ns-3 համակարգի մի մասը, բայց այժմ դուք գիտեք, թե ինչպես փոխել կոնֆիգուրացիան և ստեղծել օպտիմալացված կոդը:

Ստուգելու համար, թե որ պրոֆիլն է ակտիվ տվյալ նախագծի կազմաձևման համար, կա հրաման.

$ ./waf --check-profile 
Waf: Entering directory `/path/to/ns-3-allinone/ns-3.29/build' 
Build profile: debug

Վերոնշյալ սցենարը build.py նաև աջակցում է փաստարկներին --enable-examples и --enable-tests, բայց այլ տարբերակներ վաֆ այն ուղղակիորեն չի աջակցում: Օրինակ, սա չի աշխատի.

$ ./build.py --disable-python

արձագանքը կլինի հետևյալը.

build.py: error: no such option: --disable-python

Այնուամենայնիվ, հատուկ օպերատոր - - կարող է օգտագործվել լրացուցիչ պարամետրեր փոխանցելու համար վաֆուստի վերը նշվածի փոխարեն կաշխատի հետևյալ հրամանը.

$ ./build.py -- --disable-python

քանի որ այն առաջացնում է հիմնական հրամանը ./waf configure --disable-python. Ահա ևս մի քանի ներածական խորհուրդներ վաֆ.

Կառուցման սխալների կառավարում

ns-3 թողարկումները փորձարկվում են վերջին C++ կոմպիլյատորների վրա, որոնք հասանելի են թողարկման պահին ընդհանուր Linux և MacOS բաշխումների վրա: Այնուամենայնիվ, ժամանակի ընթացքում նոր բաշխումները թողարկվում են նոր կոմպիլյատորներով, և այս նոր կոմպիլյատորները հակված են ավելի խելամիտ լինել նախազգուշացումների նկատմամբ: ns-3-ը կարգավորում է իր կառուցվածքը, որպեսզի բոլոր նախազգուշացումները վերաբերվի որպես սխալներ, այնպես որ երբեմն, եթե դուք աշխատում եք ավելի հին տարբերակով նոր համակարգում, կոմպիլյատորի նախազգուշացումը կարող է դադարեցնել կառուցումը:

Օրինակ, նախկինում եղել է ns‑3.28-ի թողարկում Fedora 28-ի համար, որը ներառում էր նոր հիմնական տարբերակ: gcc (gcc-8) NS-3.28 թողարկումը կամ ավելի վաղ տարբերակները կառուցելիս Fedora 28-ի ներքո, Gtk2+-ով տեղադրված, տեղի կունենա հետևյալ սխալը.

/usr/include/gtk-2.0/gtk/gtkfilechooserbutton.h:59:8: error: unnecessary parentheses ,!in declaration of ‘__gtk_reserved1’ [-Werror=parentheses] void (*__gtk_reserved1);

ns‑3.28.1-ից սկսած թողարկումներում, in վաֆ այս խնդիրները լուծելու տարբերակ կա: Այն անջատում է «-Werror» դրոշի կարգավորումը g++-ում և clang++-ում: Սա «--disable-error» տարբերակն է և պետք է կիրառվի կազմաձևման ժամանակ.

$ ./waf configure --disable-werror --enable-examples --enable-tests

Կարգավորել կամ հավաքել

Որոշ հրամաններ վաֆ նշանակություն ունեն միայն կազմաձևման փուլում, իսկ որոշները վավեր են միայն կառուցման փուլում: Օրինակ, եթե ցանկանում եք օգտագործել ns-3 emulation հատկանիշները, կարող եք միացնել բիթերի կարգավորումը հարավ օգտագործելով sudo, ինչպես նկարագրված է վերևում: Սա կվերացնի կազմաձևման քայլի հրամանները, և այդպիսով դուք կարող եք փոխել կոնֆիգուրացիան՝ օգտագործելով հետևյալ հրամանը, որը ներառում է նաև օրինակներ և թեստեր:

$ ./waf configure --enable-sudo --enable-examples --enable-tests

Եթե ​​դուք դա անեք վաֆ կմեկնարկի sudoէմուլացիոն կոդի վարդակների ստեղծման ծրագրերը փոխելու թույլտվություններով գործարկելու համար արմատ: Մեջ վաֆ Կան բազմաթիվ այլ տարբերակներ, որոնք հասանելի են կազմաձևման և կառուցման քայլերի համար: Ձեր տարբերակներն ուսումնասիրելու համար մուտքագրեք՝

$ ./waf --help

Հաջորդ բաժնում մենք կօգտագործենք փորձարկման հետ կապված որոշ տարբերակներ:

Ժողովի պրոֆիլներ

Մենք արդեն տեսել ենք, թե ինչպես կարող եք կարգավորել վաֆ հավաքների համար Debug и օպտիմիզացված:

$ ./waf --build-profile=debug

Կա նաև միջանկյալ հավաքման պրոֆիլ, ազատ արձակել. Տարբերակ -d հոմանիշ է --build-profile. Կառուցման պրոֆիլը վերահսկում է գրանցման, պնդումների և կոմպիլյատորների օպտիմալացման անջատիչների օգտագործումը.

ns-3 ցանցի սիմուլյատորի ձեռնարկ: Գլուխ 3

Ինչպես տեսնում եք, գրանցումն ու պնդումները հասանելի են միայն վրիպազերծման կառուցումներում: Առաջարկվող պրակտիկան այն է, որ ձեր սցենարը մշակեք վրիպազերծման ռեժիմում, այնուհետև կատարեք կրկնվող գործարկումներ (վիճակագրության կամ պարամետրերի փոփոխության համար) օպտիմիզացված կառուցման պրոֆիլում:

Եթե ​​ունեք կոդ, որը պետք է գործարկվի միայն որոշակի շինարարական պրոֆիլներում, օգտագործեք Code Wrapper Macro-ն.

NS_BUILD_DEBUG (std::cout << "Part of an output line..." << std::flush; timer.Start ,!()); DoLongInvolvedComputation ();
NS_BUILD_DEBUG (timer.Stop (); std::cout << "Done: " << timer << std::endl;)

Կանխադրված, վաֆ տեղադրում է կառուցման արտեֆակտները build գրացուցակում: Դուք կարող եք նշել այլ ելքային գրացուցակ՝ օգտագործելով տարբերակը - -out, օրինակ `

$ ./waf configure --out=my-build-dir

Համակցելով սա կառուցապատման պրոֆիլների հետ՝ կարող եք հեշտությամբ անցնել տարբեր կոմպիլյատորական տարբերակների միջև.

$ ./waf configure --build-profile=debug --out=build/debug
$ ./waf build
... 
$ ./waf configure --build-profile=optimized --out=build/optimized 
$ ./waf build
...

Ինչը թույլ է տալիս աշխատել բազմաթիվ հավաքների հետ՝ առանց ամեն անգամ վերաշարադրելու վերջին ժողովը: Երբ անցնում եք մեկ այլ պրոֆիլի, վաֆ կկազմի միայն այն՝ առանց ամեն ինչ ամբողջությամբ վերակազմավորելու։

Երբ դուք փոխում եք կառուցման պրոֆիլները այս ձևով, դուք պետք է զգույշ լինեք ամեն անգամ նույն կազմաձևման տարբերակները տալուց: Մի քանի միջավայրի փոփոխականների սահմանումը կօգնի ձեզ խուսափել սխալներից.

$ export NS3CONFIG="--enable-examples --enable-tests" 
$ export NS3DEBUG="--build-profile=debug --out=build/debug"
$ export NS3OPT=="--build-profile=optimized --out=build/optimized" 

$ ./waf configure $NS3CONFIG $NS3DEBUG
$ ./waf build 
... 
$ ./waf configure $NS3CONFIG $NS3OPT
$ ./waf build

Կազմողներ և դրոշակներ

Վերոնշյալ օրինակներում վաֆ ns-3 կառուցելու համար օգտագործում է C++ կոմպիլյատորը GCC-ից ( g ++) Այնուամենայնիվ, դուք կարող եք փոխել ձեր օգտագործածը վաֆ C++ կոմպիլյատոր՝ սահմանելով CXX միջավայրի փոփոխականը։ Օրինակ՝ C++ կոմպիլյատորը Clang օգտագործելու համար clang++,

$ CXX="clang++" ./waf configure 
$ ./waf build 

Նույն կերպ կարող եք կարգավորել վաֆ օգտագործել բաշխված կոմպիլյացիան՝ օգտագործելով distcc:

$ CXX="distcc g++" ./waf configure 
$ ./waf build

Distcc-ի և բաշխված կոմպիլյացիայի մասին լրացուցիչ տեղեկություններ կարելի է գտնել նախագծի էջում՝ Փաստաթղթեր բաժնում: ns-3-ը կարգավորելիս կոմպիլյատորի դրոշներ ավելացնելու համար օգտագործեք CXXFLAGS_EXTRA միջավայրի փոփոխականը:

Տեղակայում

վաֆ կարող է օգտագործվել համակարգի տարբեր վայրերում գրադարաններ տեղադրելու համար: Լռելյայնորեն, կազմված գրադարանները և գործարկվողները գտնվում են գրացուցակում կառուցել, և քանի որ Waf-ը գիտի այս գրադարանների և գործարկվող սարքերի գտնվելու վայրը, կարիք չկա գրադարաններն այլուր տեղադրել։

Եթե ​​օգտվողները նախընտրում են տեղադրել build գրացուցակից դուրս, նրանք կարող են գործարկել հրամանը ./waf տեղադրել. Տեղադրման լռելյայն նախածանցն է / usr / տեղականԱյնքան ./waf տեղադրել կտեղադրի ծրագրերը / usr / local / bin, գրադարաններ / usr / local / lib և վերնագրի ֆայլերը /usr/local/include. Գերօգտագործողի իրավունքները սովորաբար պետք է սահմանվեն լռելյայն նախածանցով, ուստի սովորական հրամանը կլինի sudo ./waf տեղադրում. Երբ գործարկվի, Waf-ը նախ կընտրի օգտագործել ընդհանուր գրադարանները build գրացուցակում, այնուհետև որոնել գրադարաններ տեղական միջավայրում կազմաձևված գրադարանների ճանապարհին: Այսպիսով, համակարգում գրադարաններ տեղադրելիս լավ պրակտիկա է ստուգել, ​​թե արդյոք օգտագործվում են ճիշտ գրադարանները: Օգտատերերը կարող են ընտրել տեղադրել այլ նախածանցով՝ անցնելով տարբերակը կազմաձևման ընթացքում --prefix, օրինակ `

./waf configure --prefix=/opt/local

Եթե ​​ավելի ուշ, կառուցումից հետո, օգտագործողը մուտքագրում է տեղադրման հրամանը ./waf, կօգտագործվի նախածանցը /opt/local.

Թիմ ./waf clean պետք է օգտագործվի նախքան նախագիծը վերակազմավորելը, եթե տեղադրումը կօգտագործի վաֆ այլ նախածանցի տակ։

Այսպիսով, ns-3-ն օգտագործելու համար զանգահարելու կարիք չկա ./waf install. Շատ օգտատերեր այս հրամանի կարիքը չեն ունենա, քանի որ վաֆ կվերցնի ընթացիկ գրադարանները build գրացուցակից, սակայն որոշ օգտվողներ կարող են դա օգտակար համարել, եթե նրանց գործունեությունը ներառում է ns-3 գրացուցակից դուրս ծրագրերի հետ աշխատելը:

Waf single

ns-3 աղբյուրի ծառի վերին մակարդակում կա միայն մեկ Waf սցենար: Երբ սկսեք աշխատել, շատ ժամանակ կանցկացնեք գրացուցակում scratch/ կամ ավելի խորը մեջsrc/... և միևնույն ժամանակ պետք է վազել վաֆ. Դուք կարող եք պարզապես հիշել, թե որտեղ եք գտնվում և վազել վաֆ հետեւյալ կերպ.

$ ../../../waf ...

բայց դա հոգնեցուցիչ և սխալների հակված կլինի, ուստի ավելի լավ լուծումներ կան: Ընդհանուր ձևերից մեկը տեքստային խմբագրիչ օգտագործելն է, ինչպիսին է emacs կամ եռանդ, որտեղ բացվում են երկու տերմինալային նիստեր, մեկը օգտագործվում է ns-3 կառուցելու համար, իսկ երկրորդը՝ սկզբնական կոդը խմբագրելու համար։ Եթե ​​միայն ունես խեժ, ապա շրջակա միջավայրի փոփոխականը կարող է օգնել.

$ export NS3DIR="$PWD" 
$ function waff { cd $NS3DIR && ./waf $* ; } 

$ cd scratch 
$ waff build

Մոդուլի գրացուցակում կարող է գայթակղիչ լինել ավելացնել չնչին waf սցենար, ինչպիսին է exec ../../waf. Խնդրում եմ, մի արեք դա։ Սա շփոթեցնող է նորեկների համար և, երբ դա վատ է արվում, հանգեցնում է կառուցման դժվար հայտնաբերվող սխալների: Վերևում ներկայացված լուծումներն այն ճանապարհն են, որը պետք է օգտագործվի:

3.5 Փորձարկում ns-3

Դուք կարող եք գործարկել ns-3 բաշխման միավորի թեստերը՝ գործարկելով սցենարը ./test.py:

$ ./test.py

Այս թեստերն իրականացվում են զուգահեռ վաֆ. Ի վերջո, դուք պետք է տեսնեք հաղորդագրություն, որտեղ ասվում է.

92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors)

Սա կարևոր հաղորդագրություն է valgrind-ի խափանումները, վթարները կամ սխալները բացահայտելու համար՝ նշելով կոդի հետ կապված խնդիրները կամ գործիքների և կոդի միջև անհամատեղելիությունը:

Դուք նաև կտեսնեք վերջնական արդյունքը վաֆ և փորձարկող, որն իրականացնում է յուրաքանչյուր թեստ, որը կունենա հետևյալ տեսքը.

Waf: Entering directory `/path/to/workspace/ns-3-allinone/ns-3-dev/build' 
Waf: Leaving directory `/path/to/workspace/ns-3-allinone/ns-3-dev/build' 
'build' finished successfully (1.799s) 

Modules built:
aodv           applications          bridge
click          config-store          core
csma           csma-layout           dsdv
emu            energy                flow-monitor
internet       lte                   mesh
mobility       mpi                   netanim
network        nix-vector-routing    ns3tcp
ns3wifi        olsr                  openflow
point-to-point point-to-point-layout propagation
spectrum       stats                 tap-bridge
template       test                  tools
topology-read  uan                   virtual-net-device
visualizer     wifi                  wimax

PASS: TestSuite ns3-wifi-interference
PASS: TestSuite histogram 

...

PASS: TestSuite object
PASS: TestSuite random-number-generators
92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors)

Այս հրամանը սովորաբար գործարկվում է օգտվողների կողմից՝ արագ ստուգելու համար, որ ns-3 բաշխումը ճիշտ է կառուցված: (Նշեք, որ «PASS: ...» տողերի հերթականությունը կարող է տարբեր լինել, սա նորմալ է: Կարևորն այն է, որ հաշվետվության վերջում ամփոփ տողում ցույց է տրվում, որ բոլոր թեստերն անցել են, ոչ մի թեստ չի ձախողվել կամ խափանվել): Եվ վաֆԻսկ test.py զուգահեռաբար կկատարվի աշխատանքը մեքենայի առկա պրոցեսորային միջուկների միջև:

3.6 Սցենարի գործարկում

Մենք սովորաբար հսկողության տակ ենք գործարկում սցենարները վաֆ. Սա թույլ է տալիս build համակարգին ապահովել, որ գրադարանի ընդհանուր ուղիները ճիշտ են սահմանվել, և որ գրադարանները հասանելի են գործարկման ժամանակ: Ծրագիրը գործարկելու համար պարզապես օգտագործեք վաֆ պարամետրով - -run. Եկեք գործարկենք ամենուր տարածված ծրագրի ns-3 համարժեքը hello worldմուտքագրելով հետևյալը.

$ ./waf --run hello-simulator

Waf-ը նախ կստուգի, որ ծրագիրը ճիշտ է կառուցված և անհրաժեշտության դեպքում կկառուցի: Հետո վաֆ կգործարկի ծրագիր, որն արտադրում է հետևյալ արդյունքը.

Hello Simulator

Շնորհավորում եմ: Դուք այժմ ns-3 օգտվող եք:

Ի՞նչ պետք է անեմ, եթե արդյունքներ չտեսնեմ:

Եթե ​​տեսնում եք հաղորդագրություններ վաֆցույց տալով, որ կառուցումն ավարտվել է հաջողությամբ, բայց դուք չեք տեսնում արդյունքը «Բարև սիմուլյատոր», ապա հավանականություն կա, որ [Build-with-Waf] բաժնում դուք ձեր կառուցման ռեժիմը միացրել եք օպտիմիզացված, բայց բաց է թողել ռեժիմին վերադառնալը Debug. Այս ձեռնարկում օգտագործվող վահանակի բոլոր ելքերը օգտագործում են հատուկ ns-3 բաղադրիչ, որն իրականացնում է գրանցում և օգտագործվում է հատուկ հաղորդագրություններ վահանակում տպելու համար: Այս բաղադրիչի ելքը ավտոմատ կերպով անջատվում է, երբ օպտիմիզացված կոդը կազմվում է. այն «օպտիմիզացված է»: Եթե ​​չեք տեսնում «Hello Simulator» ելքը, մուտքագրեք հետևյալը.

$ ./waf configure --build-profile=debug --enable-examples --enable-tests

կարգավորելու համար վաֆ կառուցել ns-3 ծրագրերի վրիպազերծման տարբերակները, որոնք ներառում են օրինակներ և թեստեր: Այնուհետև դուք պետք է վերակառուցեք կոդի ընթացիկ վրիպազերծման տարբերակը՝ մուտքագրելով

$ ./waf

Այժմ, եթե դուք գործարկում եք ծրագիրը բարև-սիմուլյատոր, դուք պետք է տեսնեք սպասվող արդյունքը։

3.6.1 Հրամանի տողի արգումենտներ

Հրամանի տողի փաստարկները ns-3 ծրագրին փոխանցելու համար օգտագործեք հետևյալ օրինակը.

$ ./waf --run <ns3-program> --command-template="%s <args>"

Փոխարինել ձեր ծրագրի անվանմանը և փաստարկներին: Փաստարկ - -command-template համար վաֆ ըստ էության հրամանի տող կառուցելու բաղադրատոմս է վաֆ օգտագործվում է ծրագիրը գործարկելու համար: Waf-ը ստուգում է, որ կառուցումն ավարտված է, սահմանում է ընդհանուր գրադարանի ուղիները, այնուհետև օգտագործում է տրամադրված հրամանի տողի ձևանմուշը և փոխարինում է ծրագրի անունը %s տեղապահի համար՝ գործարկվողը կանչելու համար: Եթե ​​դուք գտնում եք, որ այս շարահյուսությունը բարդ է, կա ավելի պարզ տարբերակ, որը ներառում է ns-3 ծրագիրը և դրա արգումենտները, որոնք կցված են մեկ չակերտների մեջ.

$ ./waf --run '<ns3-program> --arg1=value1 --arg2=value2 ...'

Մեկ այլ հատկապես օգտակար օրինակ է թեստային փաթեթների ընտրովի գործարկումը: Ենթադրենք, որ կա մի թեստային փաթեթ, որը կոչվում է mytest (իրականում չկա): Վերևում մենք օգտագործեցինք ./test.py սկրիպտը՝ զուգահեռաբար մի շարք թեստեր կատարելու համար, որը բազմիցս կանչում է թեստային ծրագիրը։ թեստ-վազորդ. Զանգահարեք թեստ-վազորդ ուղղակիորեն մեկ թեստ կատարելու համար.

$ ./waf --run test-runner --command-template="%s --suite=mytest --verbose"

Փաստարկները կփոխանցվեն ծրագրին թեստ-վազորդ. Քանի որ mytest-ը գոյություն չունի, սխալի հաղորդագրություն կստեղծվի: Հասանելի թեստավորման տարբերակները տպելու համար մուտքագրեք՝

$ ./waf --run test-runner --command-template="%s --help"

3.6.2 Վրիպազերծում

ns-3 ծրագրեր գործարկելու համար մեկ այլ օգտակար ծրագրի ներքո, ինչպիսին է վրիպազերծիչը (օրինակ, gdb) կամ հիշողության փորձարկման գործիք (օրինակ, valgrind), օգտագործեք նմանատիպ ձև - -command-template = "…". Օրինակ՝ վրիպազերծիչում աշխատելու համար gdb ձեր hello-simulator ns-3 ծրագիրը փաստարկներով.

$ ./waf --run=hello-simulator --command-template="gdb %s --args <args>"

Նկատի ունեցեք, որ ns-3 ծրագրի անունը գալիս է փաստարկի հետ - -runև կառավարման կոմունալ ծառայությունը (այստեղ gdb) փաստարկի առաջին նշանն է - -command-template. Տարբերակ - -args տեղեկացնում է gdbոր հրամանի տողի մնացած մասը պատկանում է «ստորին» ծրագրին։ (Որոշ տարբերակներ gdb չեմ հասկանում տարբերակը - -args. Այս դեպքում հեռացրեք ծրագրի արգումենտները - -command-template և օգտագործեք հրամանների հավաքածու gdb աղեղներ.) Մենք կարող ենք համատեղել այս բաղադրատոմսը և նախորդը` թեստը կարգաբերիչի տակ գործարկելու համար.

$ ./waf --run test-runner --command-template="gdb %s --args --suite=mytest --verbose"

3.6.3 Աշխատանքային գրացուցակ

Waf-ը պետք է գործարկվի իր տեղից՝ ns-3 ծառի վերևում: Այս թղթապանակը դառնում է աշխատանքային գրացուցակ, որտեղ կգրվեն ելքային ֆայլերը: Բայց ի՞նչ, եթե ցանկանում եք այս ֆայլերը պահել ns-3 աղբյուրի ծառից դուրս: Օգտագործեք փաստարկ - -cwd:

$ ./waf --cwd=...

Դուք կարող եք ավելի հարմար գտնել ելքային ֆայլերը ձեր աշխատանքային գրացուցակում: Այս դեպքում կարող են օգնել հետևյալ անուղղակի գործողությունները.

$ function waff {
CWD="$PWD" 
cd $NS3DIR >/dev/null 
./waf --cwd="$CWD" $*
cd - >/dev/null 
}

Հրամանի նախորդ տարբերակի այս ձևավորումը պահպանում է ընթացիկ աշխատանքային գրացուցակը, գնում է գրացուցակ վաֆիսկ հետո հրահանգում է վաֆ փոխել աշխատանքային գրացուցակը դեպի ընթացիկ աշխատանքային գրացուցակը, որը պահպանվել է նախքան ծրագիրը սկսելը: Նշում ենք թիմը - -cwd Լրիվ լինելու համար օգտվողների մեծամասնությունը պարզապես գործարկում է Waf-ը վերին մակարդակի գրացուցակից և այնտեղ արտադրում ելքային ֆայլեր:

Շարունակություն՝ Գլուխ 4

Source: www.habr.com

Добавить комментарий