OpenLinux به عنوان بخشی از ماژول های SIM7600E-H

OpenLinux به عنوان بخشی از ماژول های SIM7600E-H

مکانیسم توسعه یک برنامه کاربردی سفارشی و بارگذاری آن در ماژول در هر دو سیستم عامل لینوکس و ویندوز موجود است. در این مقاله با استفاده از مثال‌هایی از SDK ارائه شده، نگاهی دقیق به نحوه انجام آن خواهیم داشت راه حل های بی سیم سیمکام کامپایل و بارگذاری یک برنامه سفارشی در یک ماژول.

قبل از نوشتن مقاله، یکی از آشنایان من، به دور از توسعه برای لینوکس، از من خواست تا به این موضوع بپردازم که فرآیند توسعه برنامه خودم برای ماژول SIM7600E-H را تا حد امکان با جزئیات بیشتر توضیح دهم. معیار ارزیابی دسترسی به ارائه مطالب عبارت "بطوری که بفهمم" بود.

شما را دعوت می کنم تا با اتفاقاتی که افتاده آشنا شوید.

مقاله به طور مرتب تکمیل و به روز می شود

پیشگویی

به طور معمول، ماژول های ارتباط سلولی فقط برای انتقال داده، تماس های صوتی، ارسال پیامک و موارد مشابه استفاده می شود. همه اینها از طریق دستورات AT ارسال شده از یک میکروکنترلر کنترل خارجی انجام می شود. اما دسته ای از ماژول ها وجود دارند که به شما امکان می دهند کدهای سفارشی بارگذاری شده از خارج را اجرا کنید. در برخی موارد، این به طور قابل توجهی بودجه کلی دستگاه را کاهش می دهد و به شما این امکان را می دهد که یک میکروکنترلر ساده تر (و به همان اندازه بودجه) را روی برد نصب کنید یا آن را به طور کلی رها کنید. با ظهور ماژول‌های LTE که توسط سیستم‌عامل اندروید یا لینوکس کنترل می‌شوند و منابع قدرتمند آن‌ها، می‌توان هر کاری را که در دسترس پردازنده‌های محبوب است، حل کرد. این مقاله در مورد SIM7600E-H که توسط سیستم عامل لینوکس کنترل می شود صحبت می کند. ما نحوه دانلود و اجرای یک برنامه اجرایی را بررسی خواهیم کرد.

از بسیاری جهات، این مطالب بر اساس سند "SIM7600 Open Linux program توسعه" است، اما برخی از موارد اضافه شده و، اول از همه، نسخه روسی مفید خواهد بود. این مقاله به کسانی که تازه شروع به تسلط بر ماژول کرده اند کمک می کند تا نحوه بارگیری برنامه آزمایشی را درک کنند و مهارت های لازم را برای کارهای بعدی ارائه دهند.

مختصری در مورد اینکه SIM7600E-H کیست

SIM7600E-H یک ماژول ساخته شده بر روی پردازنده ARM Cortex-A7 با فرکانس 1.3 گیگاهرتز از کوالکام است که دارای سیستم عامل لینوکس (هسته 3.18.20) در داخل است و قادر به کار با باندهای فرکانسی اروپایی (از جمله روسی) 2G/3G/LTE است که Cat را پشتیبانی می کند. .4، حداکثر سرعت دانلود تا 150 مگابیت در ثانیه و سرعت آپلود تا 50 مگابیت در ثانیه را ارائه می دهد. تجهیزات جانبی غنی، محدوده دمای صنعتی و وجود ناوبری داخلی GPS/GLONASS هر گونه نیاز برای یک راه حل مدولار مدرن در زمینه M2M را پوشش می دهد.

بررسی اجمالی سیستم

ماژول SIM7600E-H مبتنی بر سیستم عامل لینوکس (هسته 3.18.20) است. به نوبه خود، سیستم فایل بر اساس سیستم فایل ژورنال شده UBIFS (سیستم فایل تصویر بلوک طبقه بندی نشده) ساخته شده است.

ویژگی های مهم این فایل سیستم عبارتند از:

  • با پارتیشن ها کار می کند، به شما امکان می دهد اندازه آنها را ایجاد، حذف یا تغییر دهید.
  • تراز ضبط را در کل حجم رسانه تضمین می کند.
  • با بلوک های بد کار می کند.
  • احتمال از دست رفتن داده ها در هنگام قطع برق یا سایر خرابی ها را به حداقل می رساند.
  • نگه داشتن سیاهههای مربوط

توضیحات گرفته شده است از این رو، همچنین شرح مفصل تری از چنین فایل سیستمی وجود دارد.

آن ها این نوع فایل سیستم برای شرایط سخت عملیاتی ماژول و مشکلات احتمالی برق ایده آل است. اما این بدان معنا نیست که شرایط ناپایدار قدرت، حالت مورد انتظار عملکرد ماژول خواهد بود، بلکه فقط نشان‌دهنده دوام بیشتر دستگاه است.

حافظه

توزیع مناطق حافظه به صورت زیر ساخته شده است:

OpenLinux به عنوان بخشی از ماژول های SIM7600E-H

سه حوزه اصلی برای برجسته کردن وجود دارد:

ubi0:rootfs – فقط خواندنی و حاوی خود هسته لینوکس است
ubi0:usrfs - در درجه اول برای برنامه های کاربر و ذخیره سازی داده ها استفاده می شود
ubi0:cahcefs - برای به روز رسانی FOTA رزرو شده است. اگر فضای موجود برای دانلود آپدیت کافی نباشد، سیستم فایل های استفاده نشده را حذف کرده و در نتیجه فضا را آزاد می کند. اما به دلایل امنیتی، نباید فایل های خود را در آنجا قرار دهید.

هر سه بخش به شرح زیر توزیع می شوند:

سیستم فایل
اندازه
استفاده می شود
در دسترس
استفاده کنید٪
سوار شده

ubi0:rootfs
40.7M
36.2M
4.4M
٪۱۰۰
/

ubi0:usrfs
10.5M
360K
10.1M
3%
/داده ها

ubi0:cachefs
50.3M
20K
47.7M
0%
/ حافظه پنهان

عملکرد موجود

همانطور که در بالا ذکر شد، این ماژول بر روی چیپست Cortex A7 از کوالکام ساخته شده است. ارائه نکردن هسته با کارایی بالا برای پردازش برنامه کاربر و تخلیه پردازنده اصلی دستگاه با بارگذاری بخشی از برنامه در ماژول، اشتباه است.

برای برنامه کاربر، حالت های عملیات جانبی زیر در دسترس ما خواهد بود:

شماره پین
نام
Sys GPIO No.
اقدام پیش فرض
Func1
Func2
کشیدن
وقفه بیداری

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
وضعیت
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 لحیم شده و چندین پین آنتن است که یکی از آنها آنتن وای فای است. با این حال، این موضوع برای یک مقاله جداگانه است.

چهارشنبه (یک روز از هفته نیست)

راه حل های بی سیم سیمکام این فرصت را برای توسعه دهندگان فراهم می کند تا آشناترین محیط توسعه را برای لینوکس یا ویندوز انتخاب کنند. اگر ما در مورد یک برنامه اجرایی در یک ماژول صحبت می کنیم، بهتر است ویندوز را انتخاب کنید، سریعتر و آسان تر خواهد بود. اگر انتظار می‌رود معماری پیچیده برنامه‌ای و ارتقای بعدی آن وجود داشته باشد، بهتر است از لینوکس استفاده کنید. ما همچنین برای کامپایل فایل های اجرایی برای بارگذاری بعدی در ماژول به لینوکس نیاز داریم؛ یک ماشین مجازی برای کامپایل کافی است.

آنچه شما نیاز دارید به صورت رایگان برای دانلود در دسترس نیست - یک SDK که می توانید از توزیع کننده خود درخواست کنید.

نصب ابزارهای کمکی برای کار با ماژول

از این پس، ما تحت ویندوز به عنوان آشناترین سیستم عامل برای اکثر کاربران کار خواهیم کرد.

برای تسلط بر کار با ماژول، باید نرم افزار لازم را در چند مرحله ساده نصب کنیم:

  1. گنو / لینوکس
  2. Cygwin
  3. رانندگان
  4. ADB

نصب گنو/لینوکس

برای ساخت برنامه، می توانید از هر کامپایلر سازگار با ARM-Linux استفاده کنید. ما از SourceryCodeBenchLiteARM GNU/Linuxtranslater که برای دانلود در دسترس است استفاده خواهیم کرد پیوند.

برای اطمینان از نصب صحیح همه اجزاء، چند اسکرین شات از مراحل نصب می گذارم. در اصل، هیچ چیز پیچیده ای در نصب وجود ندارد.

برای اطمینان از نصب صحیح همه اجزاء، چند اسکرین شات از مراحل نصب می گذارم. در اصل، هیچ چیز پیچیده ای در نصب وجود ندارد.

  1. ما موافقت نامه مجوز را می پذیریم
    OpenLinux به عنوان بخشی از ماژول های SIM7600E-H
  2. پوشه نصب را مشخص کنید
    OpenLinux به عنوان بخشی از ماژول های SIM7600E-H
  3. اجزای لازم را بدون تغییر می گذاریم
    OpenLinux به عنوان بخشی از ماژول های SIM7600E-H
  4. آن را به حال خود رها کنید
    OpenLinux به عنوان بخشی از ماژول های SIM7600E-H
  5. چندین بار "Next"، "Install" و اساساً همین است
    OpenLinux به عنوان بخشی از ماژول های SIM7600E-H

نصب Cygwin

علاوه بر این، برای توسعه، به مجموعه ای از کتابخانه ها و ابزارهای کمکی از مجموعه ارائه شده نیاز دارید Cygwin. همه چیز در اینجا ساده است، نسخه فعلی Cygwin را می توان به صورت رایگان در وب سایت رسمی پروژه دانلود کرد؛ در زمان نگارش، نسخه 3.1.5 موجود بود که در هنگام تهیه مطالب از آن استفاده کردیم.

هیچ چیز پیچیده ای در نصب Cygwin وجود ندارد، تنها چیزی که باید انتخاب کنید آینه ای است که نصب کننده فایل های لازم را از آن دانلود می کند، هر کدام را انتخاب می کند و نصب می کند، همچنین مجموعه ای از ابزارها و کتابخانه ها، تمام کتابخانه های موجود و باقی می ماند. آب و برق انتخاب شده است.

نصب درایور

پس از اتصال ماژول به رایانه شخصی، باید درایورها را نصب کنید. اینها را می توان از توزیع کننده شما درخواست کرد (توصیه می شود). من توصیه نمی کنم به تنهایی در اینترنت جستجو کنید، زیرا ... یافتن علت تداخل دستگاه ممکن است زمان زیادی طول بکشد.

OpenLinux به عنوان بخشی از ماژول های SIM7600E-H

در بین پورت های انتخاب شده موارد زیر را مشاهده می کنیم:

ویندوز
لینـوکــس
شرح

SimTech HS-USB Diagnostics
سریال USB
رابط تشخیصی

سیم تک HS-USB NMEA
سریال USB
رابط GPS NMEA

SimTech HS-USB AT Port
سریال USB
رابط پورت AT

مودم سیم تک HS-USB
سریال USB
رابط پورت مودم

SimTech HS-USB Audio
سریال USB
رابط USB صوتی

آداپتور سیم‌تک HS-USB WWAN
شبکه USB
رابط NDIS WWAN

رابط ADB ترکیبی اندروید
USB ADB
اندروید پورت اشکال زدایی را اضافه کنید

همانطور که احتمالا متوجه شده اید، در اسکرین شات در بین پورت های USB ADB وجود ندارد، دلیل آن این است که پورت ADB در ماژول به طور پیش فرض بسته است و باید با ارسال دستور "AT+CUSBADB=1" به AT آن را فعال کنید. پورت ماژول و راه اندازی مجدد آن (این را می توان با دستور 'AT+CRESET' انجام داد).

در نتیجه، رابط مورد نظر را در مدیر دستگاه دریافت می کنیم:

OpenLinux به عنوان بخشی از ماژول های SIM7600E-H

کار با درایورها تمام شد، بیایید به ADB برویم.

نصب ADB

به وب سایت رسمی برنامه نویس اندروید بروید پیوند. ما اندروید استودیو حجیم را دانلود نمی‌کنیم؛ فقط به خط فرمان نیاز داریم که از طریق پیوند «دانلود SDK Platform-Tools برای Windows» برای دانلود در دسترس است.

OpenLinux به عنوان بخشی از ماژول های SIM7600E-H

بایگانی به دست آمده را در ریشه درایو C دانلود و باز کنید.

متغیرهای محیطی

پس از نصب Cygwin، باید مسیر Cygwin/bin/ را به متغیرهای محیط توسعه اضافه کنید (کنترل کلاسیک → سیستم → تنظیمات پیشرفته سیستم → پیشرفته → متغیرهای محیط → متغیرهای سیستم → مسیر → ویرایش) همانطور که در تصویر زیر نشان داده شده است:

OpenLinux به عنوان بخشی از ماژول های SIM7600E-H

به همین ترتیب، مسیر بایگانی ADB دانلود شده و بسته نشده را به ریشه درایو C اضافه کنید.

OpenLinux به عنوان بخشی از ماژول های SIM7600E-H

چند بار روی OK کلیک کنید و کامپیوتر را مجددا راه اندازی کنید.

پس از راه اندازی مجدد، می توانید با باز کردن خط فرمان (Win+R → cmd) و تایپ کردن دستور "adb version" به راحتی بررسی کنید که آیا ADB به درستی کار می کند یا خیر. ما چیزی شبیه به این دریافت می کنیم:

OpenLinux به عنوان بخشی از ماژول های SIM7600E-H

بیایید ماژول را به رایانه شخصی وصل کنیم (اگر قطع شود) و بررسی کنیم که آیا ADB آن را با دستور "adb devices" می بیند یا خیر:

OpenLinux به عنوان بخشی از ماژول های SIM7600E-H

انجام شد، این پیکربندی اتصال به ماژول را کامل می کند و می توانیم پوسته را برای کار با ماژول راه اندازی کنیم.

OpenLinux به عنوان بخشی از ماژول های SIM7600E-H

باز کردن و کامپایل کردن SDK

اکنون که به پوسته دسترسی داریم و می توانیم با خط فرمان ماژول شروع به کار کنیم، بیایید سعی کنیم اولین برنامه خود را برای بارگذاری در ماژول کامپایل کنیم.

بسیاری از افراد ممکن است در این مورد مشکل داشته باشند! زیرا ماژول بر روی سیستم عامل لینوکس اجرا می شود؛ برای جلوگیری از برخورد هنگام کامپایل کد تحت ویندوز، بهتر است در محیط اصلی - لینوکس کامپایل شود.

ما در مورد اینکه چگونه، در غیاب لینوکس و تمایل به نصب آن بر روی دستگاه خود، چگونه می توانید آن را بر روی یک ماشین مجازی نصب کنید، به جزئیات نمی پردازیم. ما از VirtualBox استفاده می کنیم، نسخه 20.04 اوبونتو (نسخه فعلی در زمان نوشتن) را نصب می کنیم و در زیر آن کار با کامپایلرها، SDK ها و غیره را آغاز می کنیم.

بیایید به محیط لینوکس برویم و آرشیو دریافتی از توزیع کننده را باز کنیم.

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

اگر پایتون هم نصب نشده بود:

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

تلفیقی:

حالا باید چندین فایل را کامپایل کنیم، دستورات زیر را به ترتیب اجرا می کنیم.

اگر پنجره پیکربندی هسته در حین کامپایل ظاهر شد، فقط Exit را انتخاب کنید و به کنسول بازگردید؛ اکنون نیازی به پیکربندی هسته نداریم.

ما انجام می دهیم:

simcom@VirtualBox:~/Desktop/OpenLinux/sim_open_sdk$ make

کامپایل بوت لودر:

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

برای کاربران لینوکس، کامپایل درایور ماژول مرتبط خواهد بود:

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 در رایانه شخصی که ماژول به آن متصل است منتقل می کنیم. سپس خط فرمان ویندوز را اجرا کنید (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 ارائه می‌دهد، و همچنین نحوه به‌روزرسانی از راه دور اپلیکیشن خود در ماژول خواهیم داشت.

از شما دعوت می‌کنم در نظرات سؤالات خود را بپرسید، و همچنین مشخص کنید که کدام جنبه از قابلیت‌های ماژول باید در مقالات بعدی منعکس شود.

منبع: www.habr.com

اضافه کردن نظر