پروتکل MQTT رایجترین پروتکل مورد استفاده در اینترنت اشیاء(IOT) می باشد ، با گسترش اینترنت و تولید روز افزون لوازم برقی و خانگی و امکان اتصال آنها به شبکه اینترنت ، می توان بسیاری از اشیاء پیرامون خود را با استفاده از تلفنهای هوشمند و رایانهها کنترل و مدیریت کرد .
دستگاههای متصل اینترنت اشیا (IoT) معمولاً باید دادهها را از طریق شبکهای با محدودیت منابع با پهنای باند محدود ارسال و دریافت کنند. این دستگاههای اینترنت اشیا از MQTT برای انتقال دادهها استفاده میکنند، زیرا پیادهسازی آن آسان است و میتواند دادههای اینترنت اشیا را به طور موثر ارسال و دریافت کرد .
موضوعاتی که در این مقاله به آنها پرداخته خواهد شد :
چرا پروتکل MQTT مهم است؟
پروتکل MQTT به یک استاندارد برای انتقال داده های اینترنت اشیا تبدیل شده است زیرا مزایای زیر را ارائه می دهد:
MQTT سبک و کارآمد
پیاده سازی MQTT در دستگاه اینترنت اشیا به حداقل منابع نیاز دارد، بنابراین حتی می توان از آن در میکروکنترلرهای کوچک استفاده کرد. به عنوان مثال، یک پیام کنترل MQTT حداقل می تواند به اندازه دو بایت داده باشد. هدرهای پیام MQTT نیز کوچک هستند تا بتوانید پهنای باند شبکه را بهینه کنید.
MQTT مقیاس پذیر است
این پروتکل دارای ویژگی هایی برای پشتیبانی از ارتباط با تعداد زیادی از دستگاه های IoT است. از این رو، می توانید پروتکل MQTT را برای اتصال با میلیون ها دستگاه از این دست پیاده سازی کنید.
MQTT قابل اعتماد است
پروتکل MQTT دارای ویژگی های داخلی است که زمان اتصال مجدد دستگاه IoT به سرور را کاهش می دهد. همچنین سه سطح مختلف کیفیت خدمات (QOS) را برای اطمینان از تحویل پیام به مقصد را ارایه می دهد .
MQTT امن است
MQTT رمزگذاری پیامها و احراز هویت دستگاهها و کاربران را با استفاده از پروتکلهای احراز هویت ، مانند OAuth، TLS1.3، گواهیهای مدیریت شده توسط مشتری، و غیره را آسان میکند.
MQTT به خوبی پشتیبانی می شود
زبان های برنامه نویسی مختلفی مانند payton , javascript , nodejs و … پشتیبانی گسترده ای از اجرای پروتکل MQTT دارند. از این رو، توسعه دهندگان می توانند به سرعت آن را با حداقل کدنویسی در هر نوع برنامه ای پیاده سازی کنند.
دوره آموزشی جامع ارسال و دریافت دیتا با پروتکل MQTT
جهت پیاده سازی اینترنت اشیاء نیاز به بستر شبکه اینترنت می باشد ، ما از طرق مختلفی می توانیم به شبکه اینترنت دسترسی داشته باشیم .
اینترنت بر روی خطوط تلفن مخابرات مانند ADSL یکی از روشهای دسترسی به شبکه اینترنت می باشد که با مجهز کردن پروژه های خود به یک ماژول وای فای نظیر ESP8266 و اتصال به یک مودم وای فای می توانیم به شبکه اینترنت متصل شویم . یکی از معایب این روش ، نیاز به خط و سیم کشی تلفن می باشد .
روش دیگر اتصال به شبکه اینترنت استفاده از شبکه تلفن همراه و اینترنت GPRS می باشد . تمام نقاط شهری و روستایی و جاده ها تحت پوشش این شبکه می باشد . با استفاده از یک ماژول GSM و یک سیمکارت ، نظیر ماژول های سری SIM800 ، براحتی می توانیم پروژه ها و وسایل برقی خود را به شبکه اینترنت متصل کنیم و از راه دور و حتی بصورت پورتابل وسایل خود را مانیتور و کنترل کنیم .
سایت میکرونیک یک دوره فیلم آموزشی جامع و کامل دیگر برای یادگیری 0 تا 100 ارسال و دریافت دیتا با پروتکل MQTT و ماژول SIM800 در چندین فصل آماده کرده است که سرفصل های آن به شرح زیر می باشد .
فصل یکم : آشنایی با عملکرد پروتکل MQTT
درس یکم شامل ارتباط و تبادل دیتا بین لپ تاپ و اپلیکیشن اندروید و ماژول وای فای ESP8266 با بروکر می باشد . هدف از درس یکم آشنا شدن با عملکرد و طرز کار تمامی آپشنهای پروتکل MQTT می باشد .
در بخشهایی از درس یکم ، مختصری از ماژول وای فای ESP8266 نیز استفاده شده است . از درس دوم به بعد به صورت اختصاصی با ماژول SIM800 کار خواهد شد .
فصل اول پیشنیاز درس های بعدی می باشد . در این درس به موارد زیر به صورت مفصل و عملی پرداخته خواهد شد :
- تشریح عملکرد بروکر ، معرفی اپلیکیشن اندروید جهت تبادل دیتا با پروتکل MQTT
- معرفی نرم افزار mqttbox نسخه ویندوز و انجام تنظیمات جهت کانکت شدن به بروکر
- معرفی TOPIC یا موضوع
- معرفی SUBSCRIBE, UNSUBSCRIBE یا عضویت و لغو عضویت
- معرفیPUBLISH یا انتشار
- معرفی QOS سطح 0 و 1 و 2
- معرفی پرچم RETAIN
- معرفی KEEP ALIVE
- معرفی LWT
- معرفی CLEAN SESSEION
- معرفی USER, PASSWORD
فصل دوم : نصب بروکر اختصاصی mosquitto روی سرور
- تشریح مراحل خرید سرور مجازی(vps) و وصل شدن به سرور از محیط ویندوز
- دانلود و نصب بروکر mosquitto بر روی ویندوز سرور
- باز کردن پورت 1883 بر روی ویندوز سرور
- ارسال و دریافت دیتا با بروکر mosquitto توسط نرم افزار mqttbox
- قرار دادن یوزر و پسورد بر روی بروکر mosquitto
فصل سوم : ساختار پاکتهای پروتکل 3.1.1 MQTT
- تشریح پاکت CONNECT
- تشریح پاکت CONNECT با USER , PASSWORD , LWT
- تشریح پاکت CONNACK
- تشریح پاکت PUBLISH
- تشریح پاکت PUBLISH با Message ID(QOS1,2)
- تشریح پاکت PUBACK
- تشریح پاکت PUBREC , PUBREL , PUBCOMP
- تشریح پاکت SUBSCRIBE , SUBACK
- تشریح پاکت UNSUBSCRIBE , UNSUBACK
- تشریح پاکت PINGREQ , PINQRESP
- تشریح پاکت DISCONNECT
- تست عملی پاکتها توسط نرم افزار Hercules با Broker
فصل چهارم : پیاده سازی پروتکل MQTT توسط ماژول SIM800
- ارسال و دریافت پاکتهای MQTT به بروکر توسط ماژول SIM800 در محیط ترمینال سریال
- معرفی AT COMMAND های مربوط به SIM800_Series_MQTT_Application_Note (فقط مختص ماژول SIM800c)
- ارسال و دریافت دیتا توسط AT COMMAND های MQTT در محیط ترمینال سریال
فصل پنجم : پروژه کنترل رله ، مانیتورینگ دما و رطوبت با MQTT توسط ماژول SIM800 و STM32
- تشریح شماتیک مدار
- ساخت پروژه جدید در stm32cubeide
- تنظیم کلاک میکروکنترلر stm32 در نرم افزار stm32cubemx
- تنظیم پورت یوزارت و فعال کردن وقفه دریافت
- تنظیم تایمر
- پیکربندی پایه ها
- تشریح و کاربرد متغییرهای تعریف شده در کتابخانه MQTT
- آموزش ساخت رینگ بافر و توضیح عملکرد رینگ بافر
- تشریح تمامی توابع تعریف شده در کتابخانه MQTT
- تشریح کامل برنامه نوشته شده در فایل main.c
- تشریح عملکرد مواقعی که ارتباط ماژول sim800 با بروکر قطع می شود و اتصال اتوماتیک به بروکر
- دریافت پاکت دیتا از بروکر بدون از دست دادن دیتا
- تجزیه و تحلیل دیتا
- آموزش کار با اپلیکیشن اندروید IoT MQTT Panel
- ساخت پنل کاربری
- تشریح سخت افزار
- پروگرام کردن برنامه نوشته شده بر روی میکروکنترلر stm32
- خاموش و روشن کردن دو عدد led توسط اپلیکیشن اندروید
- نمایش رطوبت و دما بر روی اپلیکیشن اندروید
- تشریح کامل سورس کد مخصوص ماژول sim800c که از سری at کامندهای mqtt پشتیبانی می کند.
- فایل کامل پروژه شامل کتابخانه mqtt و برنامه اصلی برای نرم افزارهای stm32cubeide و keil
نکته : این دوره آموزشی برای تمامی سری های ماژول SIM800 مانند sim800L , sim800c , sim808 , sim868 کاربردی می باشد .
توابع کتابخانه به شرح زیر می باشد :
#ifndef INC_SIM800_MQTT_H_ #define INC_SIM800_MQTT_H_ /* Includes ------------------------------------------------------------------*/ #include "main.h" extern UART_HandleTypeDef huart1; extern UART_HandleTypeDef huart2; #define SIM800_UART &huart1 #define USART_IRQn USART1_IRQn #define Debug_UART &huart2 #define RX_BUFFER_SIZE 300 #define SIM800_Delay 2000//ms #define KeepAliveTime 60 //s #define MQTT_VERSION_3_1 3 #define MQTT_VERSION_3_1_1 4 #ifndef MQTT_VERSION #define MQTT_VERSION MQTT_VERSION_3_1_1 #endif enum Packet_Types { CONNECT = 1, CONNACK, PUBLISH, PUBACK, PUBREC, PUBREL, PUBCOMP, SUBSCRIBE, SUBACK, UNSUBSCRIBE, UNSUBACK, PINGREQ, PINGRESP, DISCONNECT }; #define DUP_Mask 8 // Duplicate delivery Only for QoS>0 #define QoS_Mask 6 // Quality of Service #define QoS_Scale 2 // (()&QoS)/QoS_Scale #define RETAIN_Mask 1 // RETAIN flag enum connack_return_codes { CONNECTION_ACCEPTED = 0, UNNACCEPTABLE_PROTOCOL = 1, CLIENTID_REJECTED = 2, SERVER_UNAVAILABLE = 3, BAD_USERNAME_OR_PASSWORD = 4, NOT_AUTHORIZED = 5, }; typedef enum { QOS0=0, QOS1=1, QOS2=2 } MQTT_QOS; typedef struct { char *apn; char *apn_user; char *apn_pass; } sim_t; typedef struct { char *Host; int Port; } mqttServer_t; typedef struct { char *ClientID; char *UserName; char *Password; char CleanSession; char Retain; char DUP; short keepAlive;// Hold connect time.default:60,Range: (60-3600) char *WillTopic; char *WillMessage; char WillQoS; char WillRetain; unsigned int MessaseID; } mqttClient_t; typedef struct { uint8_t buff[RX_BUFFER_SIZE + 1]; int index; unsigned char DUP; unsigned char QOS; unsigned char Retain; unsigned int MsgId; char Payload[255]; char Topic[64]; char ReturnCode; char SessionPeresent; } mqttReceive_t; typedef struct { uint8_t Ring_buff[RX_BUFFER_SIZE]; unsigned int rx_wr_index,rx_rd_index; volatile unsigned int rx_counter; char rx_buffer_overflow; uint8_t Rx_data; char rx_buff[RX_BUFFER_SIZE + 1]; char tx_buff[100]; unsigned int buff_index; uint8_t resp[30]; volatile uint8_t sum; uint32_t PINGREQ_Timer; char step; char error; sim_t sim; mqttServer_t mqttServer; mqttClient_t mqttClient; mqttReceive_t mqttReceive; } SIM800_HandleTypeDef; /* Functions -----------------------------------------------------------------*/ void SIM800_RXCallBack(void); bool SIM800_sendCommand(char* ATcommand, char* answer, uint8_t result_len, uint32_t t_out); bool SIM800_sendData(char *data, uint16_t data_len,char *answer, uint8_t result_len,uint32_t t_out); char Serial_read(void); char Serial_available(void); void SIM800_FlushBuffer(void); unsigned int generateMessageID(void); void send_ctrl_z(void); bool SIM800_reset(void); bool SIM800_init(void); bool SIM800_network(void); bool SIM800_connect(char *APN, char *APN_user, char *APN_pass, char *host, uint16_t port); bool SIM800_closeGPRS(void); char SIM800_ReciveData(void); /* Functions -----------------------------------------------------------------*/ char MQTT_connect(char *ClientIdentifier, char *UserName, char *Password, char CleanSession, unsigned short keep_alive, char *WillTopic, char *WillMessage, MQTT_QOS WillQoS, char WillRetain); bool MQTT_publish(unsigned int MessageID, char *topic, char *payload, MQTT_QOS QoS, char Retain); bool MQTT_subscribe(char *topic, MQTT_QOS QoS); bool MQTT_unsubscribe(char *topic); bool MQTT_disconnect(void); bool MQTT_PINGREQ(void); bool MQTT_PINGRESP(void); bool MQTT_PUBREL(unsigned int MsgID); bool MQTT_PUBCOMP(unsigned int MsgID); bool MQTT_PUBREC(unsigned int MsgID); bool MQTT_PUBACK(unsigned int MsgID); uint16_t MQTT_readPacket(uint8_t *buffer, uint32_t _timeout); #endif /* INC_SIM800_MQTT_H_ */