{"id":7319,"date":"2019-05-17T11:43:56","date_gmt":"2019-05-17T09:43:56","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=7319"},"modified":"2025-05-07T12:03:18","modified_gmt":"2025-05-07T10:03:18","slug":"mqtt-lekki-i-przyjemny-protokol-dla-komunikacji-m2m","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/mqtt-lekki-i-przyjemny-protokol-dla-komunikacji-m2m\/","title":{"rendered":"MQTT \u2013 lekki i przyjemny protok\u00f3\u0142 dla komunikacji M2M"},"content":{"rendered":"\n<p>IoT (<em>Internet of Things<\/em>) jest obecnie jedn\u0105 z pr\u0119\u017cnie rozwijaj\u0105cych si\u0119 ga\u0142\u0119zi przemys\u0142u le\u017c\u0105c\u0105 na pograniczu IT oraz elektroniki. Do najwa\u017cniejszych zagadnie\u0144 zwi\u0105zanych z t\u0105 dziedzin\u0105 nale\u017cy M2M, czyli komunikacja urz\u0105dzenie do urz\u0105dzenia.<\/p>\n\n\n\n<p>W sieci opartej o WiFi\/Ethernet wykorzystywanych jest wiele r\u00f3\u017cnych wyspecjalizowanych protoko\u0142\u00f3w jak:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>SMTP,<\/li><li>FTP,<\/li><li>HTTP,<\/li><li>HTTPS,<\/li><\/ul>\n\n\n\n<p>kt\u00f3re s\u0142u\u017c\u0105 do obs\u0142ugi poczty czy synchronizacji czasu. HTTP i HTTPS stosowane s\u0105 cz\u0119sto do wymiany informacji. Niekoniecznie do odsy\u0142ania tre\u015bci HTML, aby wizualizowa\u0107 WWW, a np., \u017ceby na polecenie GET odpowiedzie\u0107 odpowiednim JSON-em. Takie podej\u015bcie bywa stosowane w IoT.<\/p>\n\n\n\n<p>Jest jednak protok\u00f3\u0142, kt\u00f3ry okazuje si\u0119 \u0142atwiej skalowalny, l\u017cejszy, a w efekcie wymagaj\u0105cy mniej energii, co dla urz\u0105dze\u0144 embedded jest bardzo wa\u017cne. Chodzi w\u0142a\u015bnie o MQTT (<strong>Message Queue Telemetry Transport<\/strong>) opieraj\u0105ce si\u0119 o model publikacja\/subskrypcja i proste wymiany informacji bez zb\u0119dnych dodatk\u00f3w.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Model publikacja\/subskrypcja<\/strong><\/h2>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/pub_sub-1.jpg\"><img decoding=\"async\" width=\"1024\" height=\"641\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/pub_sub-1-1024x641.jpg\" alt=\"Przyk\u0142adowa relacja pomi\u0119dzy klientami a brokerem w modelu publikacja\/subskrypcja\" class=\"wp-image-7327\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/pub_sub-1-1024x641.jpg 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/pub_sub-1-300x188.jpg 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/pub_sub-1.jpg 1443w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption>Ryc 1. Przyk\u0142adowa relacja pomi\u0119dzy klientami a brokerem w modelu publikacja\/subskrypcja<\/figcaption><\/figure><\/div>\n\n\n\n<p>Jak wida\u0107 na powy\u017cszej grafice mamy tutaj do czynienia z jednym brokerem. Mo\u017ce by\u0107 on umieszczony na kt\u00f3rym\u015b z urz\u0105dze\u0144 w sieci lub udost\u0119pniany na zewn\u0105trz przez providera. Z nim komunikuj\u0105 si\u0119 klienci, wysy\u0142aj\u0105 wiadomo\u015bci, nas\u0142uchuj\u0105 lub wykonuj\u0105 obie te czynno\u015bci. Wszystko uporz\u0105dkowane jest przy zastosowaniu temat\u00f3w.<\/p>\n\n\n\n<p>Dzia\u0142a to troch\u0119 na zasadzie podobnej do forum. Klient okre\u015bla, \u017ce interesuje go dany temat. W powi\u0105zaniu z nim wszyscy mog\u0105 co\u015b czyta\u0107 i\/lub pisa\u0107 nowe wiadomo\u015bci. Tak te\u017c u\u017cy\u0142 tego protoko\u0142u Facebook, wykorzystuj\u0105c MQTT do popularnego Messengera.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Charakterystyka MQTT<\/strong><\/h2>\n\n\n\n<p>Wa\u017cn\u0105 cech\u0105 MQTT jest to, \u017ce klienci nie musz\u0105 by\u0107 skomunikowani ze sob\u0105 \u2013 istotna jest tylko komunikacja z brokerem. MQTT dzia\u0142a na warstwach od sesji do aplikacji nad TCP\/IP. Istnieje tak\u017ce MQTT-SN przeznaczone pod UDP oraz rozwi\u0105zania Bluetooth i BLE (<em>Bluetooth Low Energy<\/em>). Aby odczytywa\u0107 i publikowa\u0107, potrzebne s\u0105 adres brokera, tematy, kt\u00f3re musimy sobie ustali\u0107, oraz zwykle klucz i u\u017cytkownik.<\/p>\n\n\n\n<p>Dla publikacji du\u017c\u0105 rol\u0119 odgrywa parametr <strong>QoS (<em>Quality of Service). <\/em><\/strong>W&nbsp;uproszczeniu okre\u015bla on, jak bardzo dbamy o dostarczenie paczki.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>&#8211; QoS = 0 \u2013 publikujemy i nie obchodzi nas, co dalej dzieje si\u0119 z paczk\u0105.<\/li><li>&#8211; Qos = 1 \u2013 po nadaniu klient publikuj\u0105cy przechowuje wiadomo\u015b\u0107 a\u017c do ACK, daj\u0105c sobie tym samym mo\u017cliwo\u015b\u0107 do powt\u00f3rnego wys\u0142ania w razie braku potwierdzenia.<\/li><li>&#8211; QoS = 2 \u2013 mechanizm oparty o dwupoziomowy handshake, kiedy chcemy by\u0107 pewni dostarczenia naszej paczki oraz unikni\u0119cia wys\u0142ania jej wi\u0119cej ni\u017c raz.<\/li><\/ul>\n\n\n\n<p>W przypadku temat\u00f3w warto wspomnie\u0107 o jeszcze kilku mo\u017cliwo\u015bciach. Grupujemy je podobnie jak drzewo folder\u00f3w, oddzielaj\u0105c kolejne poziomy zag\u0142\u0119bienia znakiem: \u201e\/\u201dnp. \u201e\/urz\u0105dzenie_1\/odczytane_parametry\/temperatura\u201d. Dla u\u0142atwienia mo\u017cna korzysta\u0107 z dw\u00f3ch znak\u00f3w specjalnych:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>\u201e+\u201d \u2013 znajduje analogiczne zastosowanie jak w drzewie folder\u00f3w \u201e*\u201d, nas\u0142uchuj\u0105c wszystkich podtemat\u00f3w na danym poziomie. Dla przyk\u0142adu \u201e\/urz\u0105dzenie_1\/odczytane_parametry\/+\u201d odbierze wiadomo\u015bci nadane na \u201e\/urz\u0105dzenie_1\/odczytane_parametry\/temperatura\u201d i \u201e\/urz\u0105dzenie_1\/odczytane_parametry\/o\u015bwietlenie\u201d;<\/li><li>\u201e#\u201d \u2013 u\u017cywamy, kiedy interesuj\u0105 nas wszystkie kolejne poziomy zagnie\u017cd\u017cenia, np. wykorzystanie \u201e\/urz\u0105dzenie_1\/#\u201d skutkuje odczytaniem wiadomo\u015bci i z \u201e\/urz\u0105dzenie_1\/odczytane_parametry\/temperatura\u201d, i z innych parametr\u00f3w, np. \u201e\/urz\u0105dzenie_1\/diagnostyka\u201d.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Praktyka \u2013 Broker<\/strong><\/h2>\n\n\n\n<p>\u017beby \u0142atwiej zrozumie\u0107 ca\u0142o\u015b\u0107, pos\u0142u\u017c\u0119 si\u0119 przyk\u0142adem. Na pocz\u0105tek potrzeba brokera. Ja przygotuj\u0119 tutaj na <a href=\"https:\/\/mosquitto.org\/\" class=\"ek-link\" rel=\"nofollow\" >PC Mosquitto<\/a>, kt\u00f3ry mo\u017ce dzia\u0142a\u0107 te\u017c jako klient. Mamy tak\u017ce troch\u0119 alternatyw jak np. <a href=\"https:\/\/www.hivemq.com\/\" class=\"ek-link\" rel=\"nofollow\" >popularny HiveMQ.<\/a><\/p>\n\n\n\n<p>Pod Linuxa mo\u017cemy go \u015bci\u0105gn\u0105\u0107 komend\u0105:\u00ad\u00ad\u00ad\u00ad\u00ad<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\napt-get install mosquitto\n<\/pre><\/div>\n\n\n<p><a href=\"https:\/\/mosquitto.org\/download\/\" class=\"ek-link\" rel=\"nofollow\" >Plik instalacyjny dla Windowsa<\/a> jest r\u00f3wnie\u017c dost\u0119pny.<\/p>\n\n\n\n<p>Trzeba jednak jeszcze zajrze\u0107 do redme-windows.txt w folderze, w kt\u00f3rym zainstalowany zosta\u0142 Mosquitto. Tam znajdziemy opis, w tym o <a href=\"http:\/\/slproweb.com\/products\/Win32OpenSSL.html\" class=\"ek-link\" rel=\"nofollow\" >zale\u017cno\u015b\u0107 do OpenSSL.<\/a><\/p>\n\n\n\n<p>Na tym etapie da si\u0119 ju\u017c odpali\u0107 broker.<\/p>\n\n\n\n<p>Mosquitto -v<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/1.png\"><img decoding=\"async\" width=\"1024\" height=\"95\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/1-1024x95.png\" alt=\"\" class=\"wp-image-7332\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/1-1024x95.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/1-300x28.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/1.png 1500w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Jak wida\u0107, MQTT domy\u015blnie korzysta z portu 1883.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Praktyka \u2013 Klienci<\/strong><\/h2>\n\n\n\n<p>Nast\u0119pnie mo\u017cna tworzy\u0107 klient\u00f3w. Do przyk\u0142adu wystarczy dw\u00f3ch \u2013 jeden do subskrypcji, drugi do publikacji. Stworz\u0119 ich na tej samej maszynie, co mo\u017cna zauwa\u017cy\u0107 po IP: 127.0.0.1, ale mo\u017cemy sobie wyobrazi\u0107, \u017ce s\u0105 oni po prostu w tej samej sieci.<\/p>\n\n\n\n<p>Podaj\u0119 tak\u017ce przyk\u0142adowe biblioteki dla klient\u00f3w:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/www.eclipse.org\/paho\/\" class=\"ek-link\" rel=\"nofollow\" >Paho MQTT<\/a> \u2013 dla j\u0119zyk\u00f3w C, C++, Python, Java, JS, Go,<\/li><li><a href=\"https:\/\/m2mqtt.wordpress.com\/\" rel=\"nofollow\" >M2Mqtt<\/a> \u2013 dla C#. (Nuget w Visual Studio),<\/li><li><a href=\"https:\/\/learn.adafruit.com\/adafruit-io\/mqtt-api\" rel=\"nofollow\" >Adafruit IO<\/a> \u2013 dla Ruby on Rails, Node.JS.<\/li><\/ul>\n\n\n\n<p>Ja pos\u0142u\u017c\u0119 si\u0119 t\u0105 pierwsz\u0105 oraz Pythonem.<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/eclipse\/paho.mqtt.python\" class=\"ek-link\" rel=\"nofollow\" >\u0179r\u00f3d\u0142o do instalacji<\/a> znajdziesz tutaj.<\/p>\n\n\n\n<p>Wystarczy otworzy\u0107 \u015bci\u0105gni\u0119t\u0105 paczk\u0119 i zainstalowa\u0107:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; gutter: false; title: ; notranslate\" title=\"\">\ncd paho.mqtt.python\npython setup.py install\n<\/pre><\/div>\n\n\n<p>Skrypt dla subskrypcji:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\nimport paho.mqtt.client as mqtt\n \nlocalhost = '127.0.0.1'\nport = 1883\ntimeout = 60\ntopic = \"\/test\/podtest\"\n \ndef on_connect(client, userdata, flags, rc):\nprint(\"error = \"+str(rc))\nclient.subscribe(topic)\n \ndef on_message(client, userdata, msg):\nprint(\"msg!\")\nprint(msg.payload)\n \nclient = mqtt.Client()\nclient.on_connect = on_connect\nclient.on_message = on_message\n \nclient.connect(localhost, port, timeout)\n \nclient.loop_forever()\n<\/pre><\/div>\n\n\n<p>Skrypt dla publikacji:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: python; title: ; notranslate\" title=\"\">\nimport time\nimport paho.mqtt.client as mqtt\n \nlocalhost = '127.0.0.1'\nport = 1883\ntimeout = 60\ntopic = \"\/test\/podtest\"\nQos = 0\nmessage_payload = \"1\"\n \ndef on_connect(client, userdata, flags, rc):\nprint(\"error = \"+str(rc))\n \nclient = mqtt.Client()\nclient.on_connect = on_connect\n \nclient.connect(localhost, port, timeout)\nclient.publish(topic, message_payload, 0)\n \ntime.sleep(4)\nclient.disconnect()\n<\/pre><\/div>\n\n\n<p>Na pocz\u0105tku uruchamiam subskrypcj\u0119, kt\u00f3ra ca\u0142y czas nas\u0142uchuje na dany temat. Widzimy efekt tak\u017ce na konsoli brokera.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/2.png\"><img decoding=\"async\" width=\"1024\" height=\"223\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/2-1024x223.png\" alt=\"\" class=\"wp-image-7333\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/2-1024x223.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/2-300x65.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/2.png 1500w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Mo\u017cna odpali\u0107 jednorazowo wykonuj\u0105cy si\u0119 skrypt publikacji.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/3.png\"><img decoding=\"async\" width=\"1024\" height=\"81\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/3-1024x81.png\" alt=\"\" class=\"wp-image-7334\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/3-1024x81.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/3-300x24.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/3.png 1500w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Efekt jest widoczny na brokerze, a tak\u017ce na konsoli ze skryptem subskrybuj\u0105cym.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/4.png\"><img decoding=\"async\" width=\"1024\" height=\"345\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/4-1024x345.png\" alt=\"\" class=\"wp-image-7335\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/4-1024x345.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/4-300x101.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/4.png 1500w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Dzia\u0142anie jest niezwykle proste, a ilo\u015b\u0107 potrzebnego ku temu kodu jest minimalna.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Przydatne narz\u0119dzia<\/strong><\/h2>\n\n\n\n<p>Mogliby\u015bmy tak\u017ce zastosowa\u0107 przydatne narz\u0119dzie do tego protoko\u0142u, <a href=\"https:\/\/github.com\/sandro-k\/MQTTLensChromeApp\" class=\"ek-link\" rel=\"nofollow\" >mianowicie MQTTlens<\/a>. Jest to nak\u0142adka na przegl\u0105dark\u0119 Chrome, kt\u00f3ra w \u0142atwy spos\u00f3b pozwala tworzy\u0107 klient\u00f3w oraz publikowa\u0107 i subskrybowa\u0107 w bardzo przejrzystym GUI (rysunek poni\u017cej).<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/5.png\"><img decoding=\"async\" width=\"1507\" height=\"1037\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/5-1024x705.png\" alt=\"\" class=\"wp-image-7331\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/5-1024x705.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/5-300x206.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/5.png 1507w\" sizes=\"(max-width: 1507px) 100vw, 1507px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Do test\u00f3w u\u017cyteczny mo\u017ce by\u0107 podstawowy provider. Jednym z nich jest <a href=\"https:\/\/www.cloudmqtt.com\/\" class=\"ek-link\" rel=\"nofollow\" >CloudMQTT<\/a>, kt\u00f3ry posiada darmowy pakiet z ograniczeniem dziennych wiadomo\u015bci, ale dla ma\u0142ych projekt\u00f3w zupe\u0142nie to wystarcza.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podsumowanie<\/strong><\/h2>\n\n\n\n<p>MQTT na dobre ju\u017c zadomowi\u0142o si\u0119 w komunikacji mi\u0119dzy urz\u0105dzeniami i wielu producent\u00f3w, np. system\u00f3w smart home tj. <a href=\"https:\/\/www.itead.cc\/sonoff-wifi-wireless-switch.html\" class=\"ek-link\" rel=\"nofollow\" >popularna seria Sonoff od Itead<\/a>, korzysta w\u0142a\u015bnie z tego rozwi\u0105zania. Maj\u0105c na uwadze jak proste jest rozpocz\u0119cie pracy z tym protoko\u0142em, warto spr\u00f3bowa\u0107.<\/p>\n\n\n\n<p>***<\/p>\n\n\n\n<p>Je\u015bli interesuj\u0105 Ci\u0119 zagadnienia zwi\u0105zane z Embedded, zach\u0119camy do lektury artyku\u0142\u00f3w naszych ekspert\u00f3w np. <a href=\"https:\/\/sii.pl\/blog\/practical-use-of-cryptography-on-the-example-of-instant-messaging-application\/\" class=\"ek-link\">Practical use of cryptography on the example of instant messaging application<\/a>, <a href=\"https:\/\/sii.pl\/blog\/branchless-programming-czyli-programowanie-bezgaleziowe\/\" class=\"ek-link\">Branchless programming czyli programowanie \u201ebezga\u0142\u0119ziowe\u201d<\/a>, <a href=\"https:\/\/sii.pl\/blog\/tinyml-uczenie-maszynowe-w-systemach-wbudowanych\/\" class=\"ek-link\">TinyML: Uczenie maszynowe w systemach wbudowanych<\/a> oraz <a href=\"https:\/\/sii.pl\/blog\/maszyny-wirtualne-interpretery-czesc-i-architektura\/\" class=\"ek-link\">Maszyny wirtualne \u2013 interpretery.<\/a><\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;7319&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;31&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;3.8&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;3.8\\\/5 ( votes: 31)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;MQTT \u2013 lekki i przyjemny protok\u00f3\u0142 dla komunikacji M2M&quot;,&quot;width&quot;:&quot;104.7&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 104.7px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            3.8\/5 ( votes: 31)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>IoT (Internet of Things) jest obecnie jedn\u0105 z pr\u0119\u017cnie rozwijaj\u0105cych si\u0119 ga\u0142\u0119zi przemys\u0142u le\u017c\u0105c\u0105 na pograniczu IT oraz elektroniki. Do &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/mqtt-lekki-i-przyjemny-protokol-dla-komunikacji-m2m\/\">Continued<\/a><\/p>\n","protected":false},"author":202,"featured_media":7509,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":4,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[563,435,767,766],"class_list":["post-7319","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-embedded","tag-iot","tag-m2m","tag-mqtt"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2019\/04\/mqtt.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/7319"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/202"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=7319"}],"version-history":[{"count":1,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/7319\/revisions"}],"predecessor-version":[{"id":20824,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/7319\/revisions\/20824"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/7509"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=7319"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=7319"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=7319"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}