Հատուկ հավելված մշակելու և այն մոդուլում բեռնելու մեխանիզմը հասանելի է ինչպես Linux, այնպես էլ Windows օպերացիոն համակարգերում: Այս հոդվածում մենք մանրամասն կանդրադառնանք, թե ինչպես՝ օգտագործելով տրված SDK-ի օրինակները
Հոդվածը գրելուց առաջ ծանոթներիցս մեկը, հեռու Linux-ի համար մշակվելուց, խնդրեց ինձ հնարավորինս մանրամասն մոտենալ SIM7600E-H մոդուլի համար սեփական հավելվածի մշակման գործընթացը նկարագրելու հարցին։ Նյութի ներկայացման մատչելիությունը գնահատելու չափանիշը եղել է «որպեսզի հասկանամ» արտահայտությունը։
Հրավիրում եմ ձեզ ծանոթանալու տեղի ունեցածին։
Հոդվածը պարբերաբար լրացվում և թարմացվում է
Նախերգանք
Սովորաբար, բջջային կապի մոդուլները օգտագործվում են միայն տվյալների փոխանցման, ձայնային զանգերի, SMS փոխանցման և այլնի համար: Այս ամենը կատարվում է AT հրամանների միջոցով, որոնք ուղարկվում են արտաքին կառավարման միկրոկոնտրոլերից։ Բայց կա մոդուլների մի կատեգորիա, որը թույլ է տալիս կատարել դրսից բեռնված մաքսային կոդը: Որոշ դեպքերում դա զգալիորեն նվազեցնում է սարքի ընդհանուր բյուջեն՝ թույլ տալով տախտակի վրա տեղադրել ավելի պարզ (և նույնքան բյուջետային) միկրոկառավարիչ կամ ընդհանրապես հրաժարվել դրանից: Android կամ Linux OS-ով կառավարվող LTE մոդուլների և դրանց հզոր ռեսուրսների հայտնվելու շնորհիվ հնարավոր է լուծել բոլոր առաջադրանքները, որոնք հասանելի են հանրաճանաչ պրոցեսորներին: Այս հոդվածում կխոսվի SIM7600E-H-ի մասին, որը վերահսկվում է Linux OS-ով: Մենք կանդրադառնանք, թե ինչպես ներբեռնել և գործարկել գործարկվող հավելվածը:
Շատ առումներով նյութը հիմնված է «SIM7600 Open Linux-ի մշակման հարց» փաստաթղթի վրա, սակայն որոշ լրացումներ և, առաջին հերթին, ռուսերեն տարբերակը օգտակար կլինեն: Հոդվածը կօգնի նրանց, ովքեր նոր են սկսում տիրապետել մոդուլին, հասկանալ, թե ինչպես ներբեռնել ցուցադրական հավելվածը և տրամադրել անհրաժեշտ հմտություններ հետագա աշխատանքի համար։
Համառոտ այն մասին, թե ով է SIM7600E-H
SIM7600E-H-ը Qualcomm-ի ARM Cortex-A7 1.3 ԳՀց պրոցեսորի վրա կառուցված մոդուլ է, որն ունի Linux օպերացիոն համակարգ (միջուկ 3.18.20), որը կարող է աշխատել եվրոպական (ներառյալ ռուսերեն) հաճախականությունների տիրույթների 2G/3G/LTE աջակցող Cat-ի հետ։ .4՝ ապահովելով ներբեռնման առավելագույն արագություն մինչև 150 Մբիթ/վրկ և վերբեռնման մինչև 50 Մբ/վ արագություն: Հարուստ ծայրամասային սարքերը, արդյունաբերական ջերմաստիճանի միջակայքը և ներկառուցված GPS/GLONASS նավիգացիայի առկայությունը ծածկում են M2M ոլորտում ժամանակակից մոդուլային լուծման ցանկացած պահանջ:
Համակարգի ակնարկ
SIM7600E-H մոդուլը հիմնված է Linux օպերացիոն համակարգի վրա (միջուկ 3.18.20): Իր հերթին, ֆայլային համակարգը կառուցված է UBIFS (Unsorted Block Image File System) օրագրված ֆայլային համակարգի հիման վրա:
Այս ֆայլային համակարգի կարևոր առանձնահատկությունները ներառում են.
- աշխատում է միջնապատերի հետ, թույլ է տալիս ստեղծել, ջնջել կամ փոխել դրանց չափը.
- ապահովում է ձայնագրման հավասարեցում ամբողջ մեդիա ծավալով.
- աշխատում է վատ բլոկների հետ;
- նվազագույնի է հասցնում հոսանքի անջատման կամ այլ խափանումների ժամանակ տվյալների կորստի հավանականությունը.
- տեղեկամատյաններ պահելը.
Նկարագրությունը վերցված է
Նրանք. Այս տեսակի ֆայլային համակարգը իդեալական է մոդուլի ծանր աշխատանքային պայմանների և հոսանքի հնարավոր խնդիրների համար: Բայց դա չի նշանակում, որ անկայուն էներգիայի պայմանները կլինեն մոդուլի շահագործման ակնկալվող ռեժիմը, սա միայն ցույց է տալիս սարքի ավելի մեծ կենսունակությունը:
հիշողություն
Հիշողության տարածքների բաշխումը կառուցված է հետևյալ կերպ.
Առանձնացվում են երեք հիմնական ոլորտներ.
ubi0:rootfs – միայն կարդալու համար և պարունակում է հենց Linux միջուկը
ubi0:usrfs – օգտագործվում է հիմնականում օգտագործողի ծրագրերի և տվյալների պահպանման համար
ubi0:cahcefs – վերապահված է FOTA թարմացումների համար: Եթե առկա տարածքը բավարար չէ թարմացումը ներբեռնելու համար, համակարգը կջնջի չօգտագործված ֆայլերը և այդպիսով տարածք կազատի: Բայց անվտանգության նկատառումներից ելնելով, դուք չպետք է այնտեղ տեղադրեք ձեր ֆայլերը:
Բոլոր երեք բաժինները բաշխված են հետևյալ կերպ.
Ֆայլային համակարգ
չափ
Սովոր
Մատչելի
Օգտագործել%
Տեղադրված է
ubi0:rootfs
40.7M
36.2M
4.4M
89%
/
ubi0:usrfs
10.5M
360K
10.1M
3%
/ տվյալներ
ubi0:cachefs
50.3M
20K
47.7M
0%
/ քեշ
Հասանելի ֆունկցիոնալություն
Ինչպես նշվեց վերևում, մոդուլը կառուցված է Qualcomm-ի Cortex A7 չիպսեթի վրա: Սխալ կլինի չտրամադրել այդքան բարձր արդյունավետության միջուկ՝ օգտատիրոջ ծրագիրը մշակելու և սարքի հիմնական պրոցեսորը բեռնաթափելու համար՝ ծրագրի որոշ հատված բեռնաթափելով մոդուլում։
Օգտատիրոջ ծրագրի համար մեզ հասանելի կլինեն ծայրամասային աշխատանքի հետևյալ ռեժիմները.
Քորոց
Անուն
Sys GPIO No.
Կանխադրված գործողություն
Գործառույթ 1
Գործառույթ 2
Քաշեք
Արթնացման ընդհատում
6
SPI_CLK
-
UART1_RTS
-
-
B-PD
-
7
SPI_MISO
-
UART1_Rx
-
-
B-PD
-
8
SPI_MOSI
-
UART1_Tx
-
-
B-PD
-
9
SPI_CS
-
UART1_CTS
-
-
B-PD
-
21
SD_CMD
-
SD քարտ
-
-
B-PD
-
22
SD_DATA0
-
SD քարտ
-
-
B-PD
-
23
SD_DATA1
-
SD քարտ
-
-
B-PD
-
24
SD_DATA2
-
SD քարտ
-
-
B-PD
-
25
SD_DATA3
-
SD քարտ
-
-
B-PD
-
26
SD_CLK
-
SD քարտ
-
-
B-PN
-
27
SDIO_DATA1
-
WLAN
-
-
B-PD
-
28
SDIO_DATA2
-
WLAN
-
-
B-PD
-
29
SDIO_CMD
-
WLAN
-
-
B-PD
-
30
SDIO_DATA0
-
WLAN
-
-
B-PD
-
31
SDIO_DATA3
-
WLAN
-
-
B-PD
-
32
SDIO_CLK
-
WLAN
-
-
B-PN
-
33
GPIO3
GPIO_1020
MIFI_POWER_EN
GPIO
MIFI_POWER_EN
B-PU
-
34
GPIO6
GPIO_1023
MIFI_SLEEP_CLK
GPIO
MIFI_SLEEP_CLK
B-PD
-
46
ADC2
-
ADC
-
-
-
-
47
ADC1
-
ADC
-
-
B-PU
-
48
SD_DET
GPIO_26
GPIO
GPIO
SD_DET
B-PD
X
49
STATUS- ը
GPIO_52
Ստատուս
GPIO
Ստատուս
B-PD
X
50
GPIO43
GPIO_36
MIFI_COEX
GPIO
MIFI_COEX
B-PD
-
52
GPIO41
GPIO_79
BT
GPIO
BT
B-PD
X
55
SCL
-
I2C_SCL
-
-
B-PD
-
56
SDA
-
I2C_SDA
-
-
B-PU
-
66
RTS
-
UART2_RTS
-
-
B-PD
-
67
CTS
-
UART2_CTS
-
-
B-PD
-
68
RxD
-
UART2_Rx
-
-
B-PD
-
69
RI
-
GPIO (RI)
-
-
B-PD
-
70
DCD
-
GPIO
-
-
B-PD
-
71
TxD
-
UART2_Tx
-
-
B-PD
-
72
DTR
-
GPIO (DTR)
-
-
B-PD
X
73
PCM_OUT
-
PCM
-
-
B-PD
-
74
PCM_IN
-
PCM
-
-
B-PD
-
75
PCM_SYNC
-
PCM
-
-
B-PD
-
76
PCM_CLK
-
PCM
-
-
B-PU
-
87
GPIO77
GPIO77
BT
GPIO
BT
B-PD
-
Համաձայն եմ, ցանկը տպավորիչ է և նկատի ունեցեք. ծայրամասային սարքերի մի մասն օգտագործվում է մոդուլը որպես երթուղիչ գործարկելու համար: Նրանք. Նման մոդուլի հիման վրա կարելի է փոքրիկ երթուղիչ պատրաստել, որը ինտերնետը կտարածի Wi-Fi-ի միջոցով։ Ի դեպ, կա պատրաստի լուծում, որը կոչվում է SIM7600E-H-MIFI և իրենից ներկայացնում է miniPCIE քարտ՝ զոդված SIM7600E-H մոդուլով և մի քանի ալեհավաքի պիններով, որոնցից մեկը Wi-Fi ալեհավաք է։ Այնուամենայնիվ, սա առանձին հոդվածի թեմա է:
Չորեքշաբթի (շաբաթվա օր չէ)
Այն, ինչ ձեզ անհրաժեշտ է, ազատ հասանելի չէ ներբեռնման համար՝ SDK, որը կարող եք պահանջել ձեր դիստրիբյուտորից:
Մոդուլի հետ աշխատելու համար կոմունալ ծառայությունների տեղադրում
Այսուհետ մենք կաշխատենք Windows-ի ներքո՝ որպես օգտատերերի մեծ մասի համար առավել ծանոթ ՕՀ:
Մեզ անհրաժեշտ կլինի տեղադրել անհրաժեշտ ծրագրակազմը մի քանի պարզ քայլով, որպեսզի հետագայում տիրապետենք մոդուլի հետ աշխատելուն.
- GNU / Linux
- Cygwin
- Վարորդ
- ԱԶԲ
GNU/Linux-ի տեղադրում
Հավելվածը ստեղծելու համար կարող եք օգտագործել ցանկացած ARM-Linux համատեղելի կոմպիլյատոր: Մենք կօգտագործենք SourceryCodeBenchLiteARM GNU/Linuxtranslater-ը, որը հասանելի է ներբեռնման համար այստեղ
Ապահովելու համար, որ բոլոր բաղադրիչները ճիշտ տեղադրվեն, ես կթողնեմ տեղադրման գործընթացի մի քանի սքրինշոթ: Սկզբունքորեն, տեղադրման մեջ բարդ բան չկա:
Ապահովելու համար, որ բոլոր բաղադրիչները ճիշտ տեղադրվեն, ես կթողնեմ տեղադրման գործընթացի մի քանի սքրինշոթ: Սկզբունքորեն, տեղադրման մեջ բարդ բան չկա:
- Մենք ընդունում ենք լիցենզային պայմանագիրը
- Նշեք տեղադրման թղթապանակը
- Անհրաժեշտ բաղադրիչները թողնում ենք անփոփոխ
- Թողեք այնպես, ինչպես կա
- Մի քանի անգամ «Հաջորդ», «Տեղադրել» և հիմնականում դա է
Cygwin-ի տեղադրում
Ավելին, զարգացման համար ձեզ անհրաժեշտ կլինի գրադարանների և կոմունալ ծառայությունների հավաքածու տրամադրված հավաքածուից
Cygwin-ի տեղադրման մեջ բարդ բան չկա, միակ բանը, որ դուք պետք է ընտրեք, հայելին է, որից տեղադրողը կներբեռնի անհրաժեշտ ֆայլերը, կընտրի որևէ մեկը և կտեղադրի այն, ինչպես նաև մի շարք կոմունալ ծառայություններ և գրադարաններ՝ թողնելով բոլոր հասանելի գրադարանները և ընտրված կոմունալ ծառայություններ:
Վարորդների տեղադրում
Այն բանից հետո, երբ մոդուլը միացված է համակարգչին, դուք պետք է տեղադրեք վարորդներ: Դրանք կարող են պահանջվել ձեր դիստրիբյուտորից (խորհուրդ է տրվում): Ես խորհուրդ չեմ տալիս ինքնուրույն որոնել ինտերնետը, քանի որ... Սարքի կոնֆլիկտի պատճառը պարզելու համար կարող է շատ ժամանակ պահանջվել:
Ընտրված նավահանգիստների թվում մենք տեսնում ենք հետևյալը.
Windows
Linux
Նկարագրություն
SimTech HS-USB ախտորոշում
USB սերիալ
Ախտորոշիչ ինտերֆեյս
SimTech HS-USB NMEA
USB սերիալ
GPS NMEA ինտերֆեյս
SimTech HS-USB AT նավահանգստում
USB սերիալ
AT պորտի ինտերֆեյս
SimTech HS-USB մոդեմ
USB սերիալ
Մոդեմի պորտի ինտերֆեյս
SimTech HS-USB աուդիո
USB սերիալ
USB Audio Interface
SimTech HS-USB WWAN ադապտեր
USB ցանց
NDIS WWAN ինտերֆեյս
Android Composite ADB ինտերֆեյս
USB ADB
Android-ն ավելացնել վրիպազերծման պորտը
Ինչպես հավանաբար նկատել եք, սքրինշոթի պորտերի մեջ USB ADB չկա, դա պայմանավորված է նրանով, որ մոդուլի ADB պորտը լռելյայն փակ է, և դուք պետք է միացնեք այն՝ ուղարկելով «AT+CUSBADB=1» հրամանը AT-ին: մոդուլի նավահանգիստը և վերագործարկեք այն (դա կարելի է անել «AT+CRESET» հրամանով):
Արդյունքում մենք ստանում ենք ցանկալի ինտերֆեյսը սարքի կառավարիչում.
Վարորդներով վերջացրինք, անցնենք ԱԶԲ-ին:
ԱԶԲ-ի տեղադրում
Գնացեք Android Developer-ի պաշտոնական կայք
Ներբեռնեք և բացեք ստացված արխիվը դեպի C drive-ի արմատը:
Շրջակա միջավայրի փոփոխականներ
Cygwin-ը տեղադրելուց հետո դուք պետք է ավելացնեք Cygwin/bin/ ուղին զարգացման միջավայրի փոփոխականներին (Դասական Կառավարման վահանակ → Համակարգ → Ընդլայնված համակարգի կարգավորումներ → Ընդլայնված → Շրջակա միջավայրի փոփոխականներ → Համակարգի փոփոխականներ → Ուղ → Խմբագրել), ինչպես ցույց է տրված ստորև ներկայացված սքրինշոթում։
Նմանապես, ներբեռնված և չփաթեթավորված ADB արխիվի ուղին ավելացրեք C սկավառակի արմատին:
Սեղմեք OK մի քանի անգամ և վերագործարկեք համակարգիչը:
Վերագործարկվելուց հետո կարող եք հեշտությամբ ստուգել, թե արդյոք ԱԶԲ-ն ճիշտ է աշխատում՝ բացելով հրամանի տողը (Win+R → cmd) և մուտքագրելով «adb version» հրամանը: Մենք ստանում ենք նման բան.
Եկեք միացնենք մոդուլը համակարգչին (եթե պատահել է, որ այն անջատվել է) և ստուգել, թե արդյոք ADB-ն տեսնում է այն «adb սարքեր» հրամանով.
Կատարված է, սա ավարտում է մոդուլի հետ կապի կարգավորումը, և մենք կարող ենք գործարկել կեղևը մոդուլի հետ աշխատելու համար:
SDK-ի ապափաթեթավորում և կազմում
Այժմ, երբ մենք մուտք ունենք shell-ը և կարող ենք սկսել աշխատել մոդուլի հրամանի տողի հետ, եկեք փորձենք կազմել մոդուլում բեռնելու մեր առաջին հավելվածը:
Շատերը կարող են դժվարություններ ունենալ այս հարցում: Որովհետեւ Մոդուլն աշխատում է Linux օպերացիոն համակարգով, Windows-ի տակ կոդ կազմելիս բախումներից խուսափելու համար լավագույնն է կոմպիլյացիա կատարել բնիկ միջավայրում՝ Linux-ում:
Մենք մանրամասն չենք խոսի այն մասին, թե ինչպես, Linux-ի բացակայության և ձեր մեքենայի վրա տեղադրելու ցանկության դեպքում, դուք կարող եք այն տեղադրել վիրտուալ մեքենայի վրա: Մենք կօգտագործենք VirtualBox-ը, կտեղադրենք Ubuntu-ի 20.04 տարբերակը (ներկայիս տարբերակը գրելու պահին) և դրա տակ կսկսենք աշխատել կոմպիլյատորների, SDK-ների և այլնի հետ:
Եկեք գնանք Linux միջավայր և բացենք դիստրիբյուտորից ստացված արխիվը:
simcom@VirtualBox:~/Desktop/OpenLinux$ sudo tar -xzf MDM9x07_OL_2U_22_V1.12_191227.tar.gz
Գնացեք sim_open_sdk գրացուցակ և ավելացրեք միջավայրը.
simcom@VirtualBox:~/Desktop/OpenLinux/sim_open_sdk$ cd sim_open_sdk
simcom@VirtualBox:~/Desktop/OpenLinux/sim_open_sdk$ source sim_crosscompile/sim-crosscompile-env-init
Մենք մնում ենք նույն թղթապանակում և դրանում գտնվելու ընթացքում կատարում ենք հաջորդ հրամանները:
Տեղադրեք libncurses5-dev գրադարանը, եթե այն տեղադրված չէ.
simcom@VirtualBox:~/Desktop/OpenLinux/sim_open_sdk$ sudo apt-get update && sudo apt-get install libncurses5-dev -y
Python, եթե այն նույնպես տեղադրված չէ.
simcom@VirtualBox:~/Desktop/OpenLinux/sim_open_sdk$ sudo apt-get install python -y
և gcc:
simcom@VirtualBox:~/Desktop/OpenLinux/sim_open_sdk$ sudo apt-get install gcc
Կազմում:
Այժմ մենք պետք է մի քանի ֆայլ կազմենք, հաջորդաբար գործարկում ենք հետևյալ հրամանները.
Եթե կոմպիլյացիայի ժամանակ բացվում է միջուկի կազմաձևման պատուհանը, պարզապես ընտրեք «Ելք» և վերադարձեք կոնսոլ, մենք հիմա միջուկը կարգավորելու կարիք չունենք:
Մենք անում ենք:
simcom@VirtualBox:~/Desktop/OpenLinux/sim_open_sdk$ make
Bootloader-ի կազմում.
simcom@VirtualBox:~/Desktop/OpenLinux/sim_open_sdk$ make aboot
Կազմելով միջուկը.
simcom@VirtualBox:~/Desktop/OpenLinux/sim_open_sdk$ make kernel_menuconfig
simcom@VirtualBox:~/Desktop/OpenLinux/sim_open_sdk$ make kernel
Կազմել արմատային ֆայլային համակարգը.
simcom@VirtualBox:~/Desktop/OpenLinux/sim_open_sdk$ make rootfs
Linux օգտագործողների համար տեղին կլինի մոդուլի դրայվերը կազմելը.
simcom@VirtualBox:~/Desktop/OpenLinux/sim_open_sdk$ make kernel_module
Եկեք կազմենք ցուցադրությունը.
simcom@VirtualBox:~/Desktop/OpenLinux/sim_open_sdk$ make demo
Որից հետո մի քանի նոր ֆայլեր կհայտնվեն sim_open_sdk/output գրացուցակում.
simcom@VirtualBox:~/Desktop/OpenLinux/sim_open_sdk$ ls output/
appsboot.mbn boot.img demo_app helloworld system.img
Դեմո
Եկեք փորձենք բեռնել ցուցադրությունը մեր մոդուլում և տեսնել, թե ինչ է ստացվում դրանից:
Բեռնել
sim_open_sdk գրացուցակում մենք կարող ենք տեսնել demo_app ֆայլը: Մենք վերցնում ենք այն և փոխանցում այն համակարգչի C սկավառակի արմատին, որին միացված է մոդուլը: Այնուհետև գործարկեք Windows հրամանի տողը (Win+R -> cmd) և մուտքագրեք.
C:>adb push C:demo_app /data/
Վահանակը մեզ կասի.
C:demo_app: 1 file pushed, 0 skipped. 151.4 MB/s (838900 bytes in 0.005s)
Սա նշանակում է, որ ֆայլը հաջողությամբ ուղարկվել է մոդուլ, և մեզ մնում է միայն գործարկել այն: Եկեք չվարանենք.
Մենք անում ենք:
C:>adb shell
Մենք ընդլայնում ենք ներբեռնված ֆայլի իրավունքները.
/ # cdhmod 777 /data/demo_app
Եվ մենք վազում ենք.
/ # /data/demo_app
Նույն վահանակում մոդուլը մեզ կասի հետևյալը.
SDK_VER : SIM_SDK_VER_20191205
DEMO_VER: SIM_SDK_VER_20191205
Please select an option to test from the items listed below.
1. WIFI 2. VOICE CALL
3. DATA CALL 4. SMS
5. WDS(APN) 6. NAS
7. AT 8. OTA
9. TTS 10. GPIO
11. GPS 12. Bluetooth
13. TCP/UDP 14. Timer
15. ADC 16. I2C
17. UIM(SimCard) 18. DMS(IMEI,MEID)
19. UART 20. SPI
21. Version 22. Ethernet
23. FTP 24. SSL
25. HTTP(S) 26. FTP(S)
27. MQTT(S) 28. ALSA
29. DEV 30. AUDIO
31. JSON 32. LBS
99. EXIT
Option >
Եկեք նայենք մոդուլի IMEI-ին, մուտքագրեք 7 (անցեք հրամանի ռեժիմին) և այնուհետև մուտքագրեք 5:
Please select an option to test from the items listed below.
1. WIFI 2. VOICE CALL
3. DATA CALL 4. SMS
5. WDS(APN) 6. NAS
7. AT 8. OTA
9. TTS 10. GPIO
11. GPS 12. Bluetooth
13. TCP/UDP 14. Timer
15. ADC 16. I2C
17. UIM(SimCard) 18. DMS(IMEI,MEID)
19. UART 20. SPI
21. Version 22. Ethernet
23. FTP 24. SSL
25. HTTP(S) 26. FTP(S)
27. MQTT(S) 28. ALSA
29. DEV 30. AUDIO
31. JSON 32. LBS
99. EXIT
Option > 7
Please select an option to test from the items listed below.
1. get Module Version 2. get CSQ
3. get CREG 4. get ICCID
5. get IMEI 6. get CIMI
99. back
Option > 5
IMEI: 867584030090489
Please select an option to test from the items listed below.
1. get Module Version 2. get CSQ
3. get CREG 4. get ICCID
5. get IMEI 6. get CIMI
99. back
Option >
Այս կերպ մենք կտեսնենք մոդուլի IMEI-ը:
Որպես եզրակացություն
Հուսով եմ, որ մենք կարողացանք ընդհանուր պատկերացում կազմել, թե ինչպես սկսել մոդուլը: Հետևյալ հոդվածներում մենք ավելի մանրամասն կանդրադառնանք SIM7600E-H հարթակի հնարավորություններին, ինչպես նաև այն մասին, թե ինչպես կարող եք հեռակա կարգով թարմացնել ձեր սեփական հավելվածը մոդուլում:
Հրավիրում եմ ձեզ հարցեր տալ մեկնաբանություններում, ինչպես նաև նշել, թե մոդուլի կարողությունների որ կողմը պետք է արտացոլվի հաջորդ հոդվածներում:
Source: www.habr.com