دانلود کتابخانه PUBSUB Client MQTT
برای نصب کتابخانه محتوای فایل زیپ را در فولدر Library کپی کنید و کامپایلر آردینو را ببنید و مجدد باز کنید.
این کتابخانه برای اتصال به سرور های MQTT نوشته شده است، دارای Client می باشد که توانایی برقراری ارتباط به سرور را با آدرس و پورت مورد نظر با نام و رمز کاربری مشخص را دارد.
این کتابخانه سازگاری ارتباط با سرور را بوسیله سخت افزار های زیر را دارد و قابل کامپایل می باشد :
- Arduino Ethernet
- Arduino Ethernet Shield
- Arduino YUN – use the included YunClient in place of EthernetClient, and be sure to do a Bridge.begin() first
- Arduino WiFi Shield – if you want to send packets > 90 bytes with this shield, enable the MQTT_MAX_TRANSFER_SIZE define in PubSubClient.h.
- Sparkfun WiFly Shield
- TI CC3000 WiFi
- Intel Galileo/Edison
- ESP8266
- ESP32
جهت بر قراری با اینترنت نیاز به تعریف یک TcpClient یا EhternetClient را دارد. بهترین اینترفیس برای کار با این کتابخانه استفاده از ESP32/8266//8285 می باشد.
تشریح کتابخانه mqtt
برای تعریف کتابخانه از PubSubClien استفاده نمایید، همزمان با تعریف کلاینت mqtt در ابن مرحله کلاینت اینترفیس مورد نظر را وارد نمایید به شکل زیر :
1 2 |
//Define Client mqtt pubsub PubSubClient mqttclient(tclpclient); |
در این قسمت کلاینت mqttclient معرف کلاینت mqtt برای ادامه کار با کتابخانه و ادامه بقیه تعریف می باشد.
توابع Client :
1 2 |
//تعریف آدرس و پورت سرور mqttclient.setServer(mqtt_server, 1883); |
برای خواندن پیام های دریافت شده از کانال مورد نظر بایستی به شکل زیر یک تابع معرفی شود :
1 2 |
//تعریف تابع اجرایی هنگام دریافت پیام از کاناال ایجاد شده mqttclient client.setCallback(callback); |
نوشتن تابع دریافت پیام به شکل زیر می باشد :
1 2 3 4 5 6 7 8 |
void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i])); } { |
برای اتصال به سرور بایستی از تایع connect به شکل زیر استفاده کنید :
1 2 3 4 |
mqttclient .connect(const char* id, const char* user, const char* pass); //id : رشته حرفی برای ای-دی کانکشن را مشخص می کند //User : نام کاربری //Pass : رمز عبور |
برای چک کردن اینکه انصال با سرور برقرار شده است از دستور زیر استفاده کنید :
client.connected()
اگه این مقدار برگشتی این تابع False باشد یعنی اتصال برقرر نمی باشد .
برای اینکه اتصال ایجاد شده به سرور روی یک تاپیک مد نظر ایجاد و پیام ها دریافت شوند بایستی سابسکرایب شود کانال :
1 2 |
//Subscrieb or start listen to a Topic Mqttclient. Subscribe(“topic-address”); |
برای اینکه از سمت کلاینت به سمت سرور به کانال یا تاپیک مشخصی پیام ارسال شود از دستور زیر استفاده نمایید:
1 2 3 |
Mqttclient publish(const char* topic, const char* payload); //topic : آدرس کانال یا تاپیک //Payload : متن پیام برای ارسال |
بعد از اتصال اگر نیاز به قطع اتصال باشد از تابع زیر استفاده نمایید :
Mqttclient.disconnect();
در مثال زیر یک نمونه از کد نویسی روی ESP8266 را در محیط کامپایلر Arduino مشاهده می کنید :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 |
/* Basic ESP8266 MQTT example This sketch demonstrates the capabilities of the pubsub library in combination with the ESP8266 board/library. It connects to an MQTT server then: - publishes "hello world" to the topic "outTopic" every two seconds - subscribes to the topic "inTopic", printing out any messages it receives. NB - it assumes the received payloads are strings not binary - If the first character of the topic "inTopic" is an 1, switch ON the ESP Led, else switch it off It will reconnect to the server if the connection is lost using a blocking reconnect function. See the 'mqtt_reconnect_nonblocking' example for how to achieve the same result without blocking the main loop. To install the ESP8266 board, (using Arduino 1.6.4+): - Add the following 3rd party board manager under "File -> Preferences -> Additional Boards Manager URLs": http://arduino.esp8266.com/stable/package_esp8266com_index.json - Open the "Tools -> Board -> Board Manager" and click install for the ESP8266" - Select your ESP8266 in "Tools -> Board" */ #include <ESP8266WiFi.h> #include <PubSubClient.h> // Update these with values suitable for your network. const char* ssid = "........"; const char* password = "........"; const char* mqtt_server = "broker.mqtt-dashboard.com"; WiFiClient espClient; PubSubClient client(espClient); unsigned long lastMsg = 0; #define MSG_BUFFER_SIZE (50) char msg[MSG_BUFFER_SIZE]; int value = 0; void setup_wifi() { delay(10); // We start by connecting to a WiFi network Serial.println(); Serial.print("Connecting to "); Serial.println(ssid); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } randomSeed(micros()); Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); // Switch on the LED if an 1 was received as first character if ((char)payload[0] == '1') { digitalWrite(BUILTIN_LED, LOW); // Turn the LED on (Note that LOW is the voltage level // but actually the LED is on; this is because // it is active low on the ESP-01) } else { digitalWrite(BUILTIN_LED, HIGH); // Turn the LED off by making the voltage HIGH } } void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Create a random client ID String clientId = "ESP8266Client-"; clientId += String(random(0xffff), HEX); // Attempt to connect if (client.connect(clientId.c_str())) { Serial.println("connected"); // Once connected, publish an announcement... client.publish("outTopic", "hello world"); // ... and resubscribe client.subscribe("inTopic"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } } void setup() { pinMode(BUILTIN_LED, OUTPUT); // Initialize the BUILTIN_LED pin as an output Serial.begin(115200); setup_wifi(); client.setServer(mqtt_server, 1883); client.setCallback(callback); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); unsigned long now = millis(); if (now - lastMsg > 2000) { lastMsg = now; ++value; snprintf (msg, MSG_BUFFER_SIZE, "hello world #%ld", value); Serial.print("Publish message: "); Serial.println(msg); client.publish("outTopic", msg); } } |