آموزش برنامه نویسی ماژول MC60, اینترنت اشیاء, پروژه, توصیه شده, کویکتل

کار با ماژول تمام عیار mc60 – قسمت هفتم – کار با MQTT

کار با ماژول تمام عیار mc60 - قسمت هفتم - کار با MQTT

اگر که توی حوزه IOT کار میکنید یا حداقل یه بار از کنارش رد شده باشید به احتمال زیاد اسم MQTT به گوشتون خورده ، پروتکلی تحت شبکه که خوراک بحث اینترنت اشیا هست و این روزها همه دارند به سمتش میرند. توی این آموزش مختصری این پروتکل رو توضیح داده و سپس سراغ پیاده سازی یک پروژه به کمک اون میریم ، پس با سیسوگ همراه باشید.

شاید برای شما مفید باشد: پروژه الکترونیک با میکروکنترلر های مختلف و آموزش 0 تا 100 راه اندازی پروژه

 

MQTT چگونه کار میکند ؟!

نمیدونم چرا تا قبل از نوشتن این مطلب MQTT برام خیلی ترسناک بود و فکر میکردم خیلی سخته (البته سراغشم نرفته بودم) ! برای همین سعی میکنم خیلی ساده توضیح بدم تا برای همه قابل فهم باشه .

 

به تصویر بالا نگاه کنید نقطه شروع ما دماسنج سمت چپ هست ، این دماسنج یک کلاینت mqtt هست که به صورت publisher عمل میکنه ، یعنی دیتا ارسال میکنه ، به سروری که به اون broker میگیم. حالا دماسنج اطلاعات رو به آدرس خاصی در بروکر ارسال میکنه ، میتونیم اون آدرس رو مثل یک کانال تلگرامی درنظر بگیریم ، حالا کلاینت هایی که میخواند دیتا رو دریافت کنند ، توی این کانال (به آدرسی که در اون ، اطلاعات ارسال میشه) عضو میشند و هر موقع که یک دیتای جدید اومد متوجه میشند ، این دریافت دیتا رو کتابخونه ای که شما استفاده میکنید نحوه کارش رو مشخص میکنه ، مثلا به شما یک تابع میده که هرموقع دیتا اومد اون تابع فراخوانی میشه. هر کلاینت میتونه هم به عنوان publisher و هم subscriber (دریافت کننده اطلاعات) عمل کنه.

برای یادگیری و اطلاعات بیشتر در رابطه با mqtt توصیه میکنم که این مطلب رو بررسی کنید:

پروتکل MQTT  چگونه کار می‌کند؟

 

حالا بریم سراغ پروژه خودمون! ما میخوایم از یک ماژول mc60 به عنوان mqtt client استفاده کنیم و هم دیتا ارسال کنیم به سرور و هم دریافت کنیم (publisherوsubscriber). این کار رو هم میخوایم به صورت open cpu انجام بدیم نه با at command. بعد از اون هم داشبوردی که به کمک پلتفرم thingsboard طراحی میکنیم و دیتاهای دریافتی رو توی اون نمایش میدیم.

این هم از کد برنامه:

همچنین لازمه که یک تسک به نام proc_subtask1 اضافه بشه به برنامه و کتابخانه های sht20 و oled هم به پروژه اضافه بشه.

 

توضیح کلیات کد

توی کد ما دو تسک اجرا میشه تسک اصلی وظیه راه اندازی بخش های مختلف و oled و … رو داره ، تسک دوم هم در صورتی که به سرور متصل باشیم هر 3 ثانیه دما رو برای سرور ارسال میکنه.

غیر از اون هم یه تایمر داریم که هر 500 میلی ثانیه اجرا میشه و مرحله به مرحله اتصال به سرور و راه اندازی mqtt رو انجام میده.

بعد از اتصال به سرور و subscribe شدن ماژول ، بعد از هر بار دریافت دیتا در تاپیک مورد نظر تابع mqtt_recv صدا زده میشه ، من توی این تابع کدی نوشتم که بیاد و متن دریافت شده رو برای تابع message ارسال کنه تا هم روی نمایشگر نشون داده بشه و هم توی سریال چاپ بشه.

لازم هست که شما آدرس سرورتون رو داخل HOST_NAME مشخص کنید و توکنی رو هم که broker به شما میده توی متغیر username قرار بدید.

 

نکته:

نسخه ای sdk که من برای نوشتن این مطلب ازش استفاده کردم 1.8 هست. برای اینکه به درستی بتونید ازش جواب بگیرید لازم هست که حتما فریمور ماژول رو هم آپدیت کنید. نسخه مناسب این sdk ورژن MC60CAR01A15 هست که میتونید از باکس دانلود در آخر مطلب دریافتش کنید.

 

حالا بریم سراغ broker

من از thingsboard برای اینکار استفاده کردم که بتونم داشبوردی هم داخلش طراحی کنم و اطلاعات رو اونجا نمایش بدم. برای اینکار لازمه که یه اکانت داخلش بسازید (که رایگان هست) و بعد از اون دستگاه رو داخلش اضافه کرده و داشبورد رو طراحی کنید. این مراحل رو به صورت فیلم آماده کردم که میتونید استفاده کنید:

 

و این هم از تست ماژول و ارسال و دریافت دیتا

همونطور که در ویدئو بالا مشخص هست من از یک level shfter برای تغییر سطح ولتاژ i2c استفاده کردم تا بشه از oled و سنسور sht20 استفاده کرد.

کتابخونه های sht20 و oled رو هم خودم آماده کردم که میتونید توی فایل پروژه اونها رو هم پیدا کنید.

 

روند ساخت کتابخانه

روند ساخت این کتابخونه ها هم چندان مشکل نیست و شما میتونید هر ماژول دیگه ای رو  حتی با پروتکل های دیگه به کتابخونه های open cpu ماژول اضافه کنید من روندی که برای ساخت این کتابخونه ها طی کردم رو میگم که شاید به درد شما هم بخوره:

  • اول از همه یک کتابخونه سبک و کوچیک مرتبط با ماژولی که میخوام ازش استفاده کنم رو توی کتابخونه های آردوینو پیدا میکنم (این یکی از جاهایی هست که آردوینو توی کار حرفه ای کمکتون میکنه)
  • بعد کد c++ رو به c تبدیل می کنم (چون معمولا کتابخونه های آردوینو با کمک شی گرایی نوشته شدند).
  • حالا توابعی که وابسته به سخت افزار هستند رو تغییر میدم مثلا تابعی که اطلاعات i2c رو ارسال میکنه در آردوینو و mc60 متفاوت هستند ، پس لازمه که اونها دوباره نوشته بشند.
  • مرحله آخر هم تست کتابخونه هست. من برای اینکار یکبار از آردوینو استفاده میکنم و با ماژول ارتباط میگیرم و با لاجیک آنالایزر پکت ها رو بررسی میکنم ، بعد از اون کتابخونه ای که خودم نوشتم رو اجرا کرده و همین تست رو تکرار میکنم و کد رو ویرایش میکنم (بعضا هم نیاز به کمک گرفتن از دیتاشیت ماژول میشه که مهارت دیتاشیت خوندن اینجا به کمکتون میاد).

کدی که در بالا آورده شد به کمک example ی که در sdk بود نوشته شده ، میتونه بهتر از این نوشته بشه پس بهتره که آستینتون رو بالا بزنید و یه ادیتی روش برید?. برای دست گرمی و اینکه بهتر درکش بکنید میتونید علاوه بر دما، رطوبت رو هم برای سرور ارسال کرده و توی یک باکس جدا نمایش بدید، یا اگه حرفه ای تر هستید اطلاعات مکان رو هم ارسال کنید و توی نقشه نشون بدید.

 

خرید برد و ماژول MC60 از فروشگاه سیسوگ:

https://shop.sisoog.com/wp-content/uploads/2022/05/EB_MC60_1-2.png

 

 

 

 

 

انتشار مطالب با ذکر نام و آدرس وب سایت سیسوگ، بلامانع است.

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

35 دیدگاه در “کار با ماژول تمام عیار mc60 – قسمت هفتم – کار با MQTT

  1. علی گفت:

    من از sdk1.8 و فریموری که داخل سایت گذاشته بودین استفاده کردم
    بعد از اجرای دستور RIL_NW_SetGPRSContext(0) یکدفه آنتن میپره و ماژول از شبکه خارج میشه
    لطفا راهنمایی کنید چطوری میتونم این مشکل بر طرف کنم

    1. Mahdi.h   گفت:

      سلام
      از چه بردی استفاده میکنید ؟
      احتمال زیاد در زمان اتصال به شبکه ، ماژول ، تغذیه کم میاره

  2. معین گفت:

    سلام وقت بخیر
    من وقتی میخوام فریمور رو آپدیت کنم با Qflash4.0, بعد از حدود 200 ثانیه با همچین پیغامی مواجه میشم:
    FAIL, COM:5, FlashToolError:3236, S_DA_GPS_DOWNLOAD_FAIL
    به نظر شما مشکل چی میتونه باشه که آپدیت نمیشه.

    1. Mahdi.h   گفت:

      سلام
      باید پایه های سریال AUX و GPS رو به هم متصل کنید
      مطابق چیزی که در قسمت اول سری آموزش گفته شده

  3. Mehran tehrani گفت:

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

    ماژول من هر بار که برنامه به اخر میرسد دوباره راه اندازی میشود .
    اول فکر کردم شاید مشکل از کد من است ، اما بعد از این که از مثال خود SDK استفاده کردم دیدم هر بار که برنامه کار میکند بعد از گزشت چند ثانیه دوباره همان اتفاق رخ میدهد.
    ایا این مشکل از فایل SDK است و شماهم همین مشکل را دارید؟

    1. Mahdi.h   گفت:

      سلام
      منظور از به آخر رسیدن برنامه چی هست ؟
      و نکته دیگه اینکه شما کدتون باید توی یک حلقه while true اجرا بشه
      و اینکه ما مشکل شما رو نداریم

      1. Mehran tehrani گفت:

        منظور از به اخر رسیدن برنامه ، یعنی اخر حلقه While true هست ، که گاهی بعد از این که دیتا به سرور ارسال میشه و یا گاهی در همون اول برنامه قبل از این که اصلا بالا بیاد ، و وارد while بشه شروع میکنه به ری استارت شدن ، و ولی بعد از ری استارت تا چند دقیقه درست کار میکنه و دوباره همین اتفاق میوفته ، برد رو از نظر سخت افزار ی بررسی کردم ، حتی ولتاژ رو هم همینطور ( روی 4.2 ثابته) . ماژول با AT کامند درست کار میکنه ولی وقتی برنامه بهش میدم این مشکل پیش میاد ، ماژول رو هم عوض کردم ، اما باز هم همین آش و همین کاسه شد.
        نمیدونم مشکل از کجاست و واقعا گیج شدم!

  4. ali گفت:

    سلام برای ماژول M66 باید از کدوم sdk استفاده کرد ؟؟؟
    من نسخه 2.4 دارم ولی بازم فایل های Mqtt داخلش نیس …. اضافه هم که میکنم ارور میده داخل فایل ql_system

    1. Mahdi.h   گفت:

      سلام
      پوزش بابت تاخیر
      شما میتونید برای استفاده از mqtt در ماژول m66 از این نسخه sdk و فریمور استفاده کنید
      https://dl.sisoog.com/software/V3S%D9%80training/M66FAR02A09BT.zip
      https://dl.sisoog.com/software/V3S%D9%80training/M66_QuecOpen_GS3_SDK_V2.6.zip

  5. میثم گفت:

    سلام
    من هم با این ارور روبرو شدم
    //<Activate PDP context,ret = 0
    //<Select version 3.1.1 successfully
    //<Start opening a MQTT client
    //<Open a MQTT client successfully
    //<Start connect to MQTT server
    //<Publish a message to server failure,ret = -1

    //<Publish a message to server failure,ret = -1
    //<Connect to MQTT server failure,error = 2
    //<Publish a message to server failure,ret = -1
    //<Publish a message to server failure,ret = -1
    //<Publish a message to server failure,ret = -1
    //<Publish a message to server failure,ret = -1
    //<Publish a message to server failure,ret = -1
    //<Publish a message to server failure,ret = -1
    کاملا طبق آموزش پیش رفتم و فریم ورک را هم آپدیت کردم
    ایده ای دارید؟

    1. Mahdi.h   گفت:

      سلام
      اینطور که به نظر میاد به مشکل در سرور هست و پارامتر های سرور رو درست تنظیم نکردید

  6. احمد گفت:

    سلام، ممنون از آموزش خوبتون
    من وقتی پیامی از mqtt به mc60 میفرستم خود به خود ریست میشه، دلیلش رو نمیتونم بفهمم، کد شمارو کپی کردم و اجرا کردم و ورژن sdk ام 1.8 هست، ایده ای ندارید که مشکل از کجا میتونه باشه؟ ممنون

    1. Mahdi.h   گفت:

      سلام. خواهش میکنم
      لازم هست که حتما فریمور خود ماژول رو هم آپدیت کنید

      1. احمد گفت:

        ممنون از شما، چجوری میتونم ورژن firmware دستگاهمو ببینم؟ و برای گرفتن ورژن جدید باید به تیم quectel ایمیل بدم یا جایی برای دانلودشون هست؟

        1. Mahdi.h   گفت:

          با دستور ATI میتونید نسخه فریمور رو چک کنید.
          لینک دانلود فریمور مورد نیاز ، داخل باکس دانلود در انتهای مطلب موجوده

  7. smahvis گفت:

    سلام.
    من فایل فریمور ماژول mc60 رو از کجا می تونم دانلود کنم. هر چی گشتم تو فایل های قابل دالود تو سایت تون نتوستم پیداش کنم.

    1. Mahdi.h   گفت:

      سلام ، از طریق دانلود باکسی که در انتهای مطلب هست میتونید دانلود کنید ، اینجا هم دوباره لینکش رو میزارم:
      http://dl.sisoog.com/Quectel/mc60_sdk_firmware.zip

  8. مهدی گفت:

    ممنون از آموزش های خیلی خوبتون بنظرتون چرا خروجی من به این صورت هست ؟
    به سرور هم با موفقیت متصل میشه
    فقط سرور من ssl داره ولی کانکشن موفق میزنه بهش
    نظرتون چی هست ؟؟

    //<Set PDP context 0
    //<Set APN
    //<Activate PDP context,ret = 0
    //<Select version 3.1.1 successfully
    //<Start opening a MQTT client
    //<Publish a message to server failure,ret = -1
    //<Open a MQTT client successfully
    //<Start connect to MQTT server
    //<Publish a message to server failure,ret = -1
    //<Publish a message to server failure,ret = -1
    //<Publish a message to server failure,ret = -1
    //<Publish a message to server failure,ret = -1
    //<Publish a message to server failure,ret = -1

    1. Mahdi.h   گفت:

      خواهش میکنم?
      مطمئن بشید که تنظیمات مربوط به ssl رو انجام داده باشید
      از این داکیومنت میتونید اطلاعات بیشتری کسب کنید:
      https://sisoog.com/wp-content/uploads/2021/11/Quectel_GSM_MQTT_Application_Note_V1.3.pdf

  9. فاضل اعصامی گفت:

    سلام
    کدام یک از محصولات کویکتل فقط GSM و GPRS را دارند. میخوام بدون بلوتوث و GPS باشه.البته در بازار هم موجود باشه
    تشکر

    1. Mahdi.h   گفت:

      سلام . از ماژول m65 میتونید استفاده کنید
      توی این مطلب هم در موردش توضیح داده شده:
      https://sisoog.com/2022/02/08/%da%a9%d8%a7%d8%b1-%d8%a8%d8%a7-%d9%85%d8%a7%da%98%d9%88%d9%84-m65/

      1. فاضل اعصامی گفت:

        تشکر

  10. hosseinhk36 گفت:

    سلام و روز بخیر
    من در کامپایل برنامه با تابع Ql_Mqtt_Recv_Register به مشکل خوردم.
    لطف میکنید بفرمایید در کدام بخش تعریف شده این تابع؟

    1. Mahdi.h   گفت:

      سلام
      برای استفاده از این تابع حتما باید از نسخه 1.8 sdk استفاده کنید

      1. hosseinhk36 گفت:

        من از Eclipse استفاده میکنم. متاسفانه SDK ورژن 1.8 رو نتونستم پیدا کنم.
        اگر راهی باشه که بشه همین رو تبدیل کرد ممنون میشم راهنمایی بکنید.
        یک راه دیگه که کمک میکنه اینه که اگر تابعی باشه که بشه به کمک اون وقتی پیغامی در بخش MSG_ID_URC_INDICATION میاد نمایش داد! میشه دیتاشو تحلیل کرد و چیزی که سرور میفرسته رو از داخلش درآورد

  11. Alireza گفت:

    سلام ممنون از وقتی که میزارید و این مطالب را تهیه میکنید ببخشید فانکشن Ql_Mqtt_Recv_Register به صورت لیب هستش ؟اگر اره چه لیبی رو باید بزارم براش چون من پروژه رو جدا دارم و ورژن 1.3 هستم

    1. Mahdi.h   گفت:

      سلام خواهش میکنم.??
      فکر میکنم توی یکی از فایل های هدر فانکشنش معرفی شده باشه .
      در هر صورت بهتون پیشنهاد میکنم اگر از mqtt میخواید استفاده کنید کدتون رو روی ورژن sdk 1.8 بیارید ، چون ممکنه به ارور هایی بر بخورید که هیچ دلیلی ندارند و نتونید دیباگ کنید

      1. Alireza گفت:

        بله در یک هدری معرفی شده ولی چون اون لیب رو ندارم ارور میده باسه اون پرسیدم ولی اگر راهی نداره که میرم 1.8 ممنون

  12. Omid Azadeh گفت:

    البته کارتون عالیه … ممنونم از زحماتتون ?

  13. Omid Azadeh گفت:

    سلام … چرا از نمونه ایرانی تینگز‌بورد استفاده نکردین ؟

    1. Sisoog Os گفت:

      سلام نمونه های ایرانی را همینجا معرفی کنید تا بقیه هم ببینن

      1. Omid Azadeh گفت:

        یکی از دوستان که تو همین سایت IOT Dashboard رو معرفی کرد و تینگز بورد رو توی یه هاست ایرانی راه اندازی کرد فکر کنم … اسم یایتش یادم نیست …

    2. Mahdi.h   گفت:

      باسلام
      هدف معرفی پلتفرم و نحوه راه اندازی بوده.
      حالا میشه از سرویسی که در داخل سایت اصلی به صورت رایگان ارائه شده استفاده کرد و یا روی سرور شخصی راه اندازی کرد و یا از سایت های داخلی که این سرویس رو ارائه دادند استفاده کرد.

  14. ali alibalaei گفت:

    سلام
    خیلی عالی بود لذت بردیم .

    1. Mahdi.h   گفت:

      سلام
      نظر لطفتون هست?

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *