Przedmowa
Internet rzeczy (Internet of Things, IoT) ma szansę stać się jedną z najbardziej przełomowych zmian technologicznych naszych czasów. Jeśli zgodnie z prognozami w ciągu kilku następnych lat do sieci dołączonych zostanie ponad 50 miliardów urządzeń, IoT będzie miał ogromny wpływ na wszystkie branże. Opracowane zostaną nowe ekscytujące urządzenia podłączane i systemy pomocnicze, które będą rozwiązywać problemy z zakresu medycyny, transportu, rolnictwa, budownictwa, energetyki, produkcji i innych. Wiele z tych projektów już rozpoczęto i większość firm chce rozszerzyć swoje produkty i ofertę z wykorzystaniem IoT.
Internet rzeczy leży na przecięciu wielu technologii rozwijanych w ciągu ostatnich kilkudziesięciu lat i bazuje na innowacjach i redukcji kosztów w obszarze pomiarów, metrologii, mikroelektroniki, komunikacji bezprzewodowej, usług w chmurze oraz ekspansji sieci WWW. Choć tak szeroki zakres pociąga za sobą szereg wyzwań, stwarza również możliwość zaprojektowania i zbudowania oprogramowania z wyłamaniem się poza tradycyjne ścieżki kariery. Praca w IoT zmusza do wyjścia poza strefę komfortu i poznania pełnego spektrum inżynierii oprogramowania. W większości sytuacji rozwiązanie zahacza o wszystkie poziomy stosu technologicznego: począwszy od kodu typu bare-metal na urządzenia podłączonych, poprzez agregację przez węzły brzegowe o większych możliwościach przed skierowaniem do chmury. To oznacza, że programista musi wystarczająco dobrze znać każdy z poziomów, aby zrozumieć dostępne protokoły, języki, wzorce i platformy w celu zbudowania stabilnego i skalowalnego sytemu.
Programowanie Internetu rzeczy to rzetelnie przygotowany podręcznik budowania kompleksowego systemu IoT. Uważnie studiując tekst i wykorzystując materiały pomocnicze, czytelnicy zaimplementują uniwersalną platformę testową zbudowaną w oparciu o wzorce i protokoły wykorzystywane w prawdziwych komercyjnych systemach IoT. Zachęcam do zainwestowania w opcjonalne komponenty sprzętowe. Jednym z najbardziej satysfakcjonujących aspektów tej pracy jest integracja oprogramowania i świata fizycznego. Angażując się w prostą czynność kontrolowania świateł LED z chmury albo monitorowania warunków klimatycznych w pomieszczeniach, łatwo złapać bakcyla IoT.
Struktura tej książki i jej materiałów pomocniczych świadczy o tym, że Andy ma duże doświadczenie praktyczne nie tylko w zakresie IoT, ale także ogólnej inżynierii i architektury oprogramowania. Poszczególne etapy zostały celowo zaprojektowane tak, aby naśladować proces realizacji rzeczywistych projektów programistycznych, w oparciu o system zarządzania metodą Kanban wykorzystywaną przez większość zespołów programistycznych. Czytelnicy, którzy zrealizują każde ćwiczenie wraz z materiałami pomocniczymi, lepiej zrozumieją IoT i przy okazji zapoznają się z procesami i najlepszymi metodami powszechnie stosowanymi w procesach rozwoju oprogramowania.
Choć Andy omawia Internet rzeczy, schodząc do poziomu implementacji, moim zdaniem ta książka dostarcza również cennych informacji osobom pełniącym rolę liderów technologicznych. Studiując architekturę oprogramowania, która jest podstawą większości systemów IoT, można lepiej zrozumieć złożoność procesu jej implementacji. Każde z ćwiczeń jest cennym źródłem informacji o wyzwaniach, zagrożeniach i kompromisach związanych z danym segmentem systemu.
Zdecydowanie zalecam zwrócenie uwagi na liczne uwagi i odwołania dotyczące bezpieczeństwa w Internecie rzeczy. Jak w każdej innej technologii, presja, by dostarczyć rozwiązanie, może często przyćmić konieczność zapewnienia solidnych zabezpieczeń. Luki w zabezpieczeniach doprowadziły już do upadku wiele systemów IoT. Technologia ta rozpowszechniania się i w związku z tym będzie stawała się częścią wielu kluczowych systemów. Bezpieczeństwo musi być jednym z pierwszych aspektów rozważanych w każdym projekcie IoT i powinno być regularnie poddawane rewizji w cyklu życia rozwiązania.
Książka Programowanie Internetu rzeczy pokazuje programistom na dowolnym poziomie zaawansowania, jak dostać się do jednej z najszybciej rozwijających się dziedzin informatyki. Zachęcam do wnikliwego przestudiowania jej treści i rozważenia, jak wykorzystać podobne systemy do rozwiązania wyzwań napotykanych we własnym życiu. Mam nadzieję, że wkrótce zobaczę projekty utworzone przez inżynierów, którzy zainspirowani tą książką zajęli się budowaniem IoT.
Tim StrunckDyrektor działu Software EngineeringAtom Power Charlotte, Karolina PółnocnaKwiecień 2021
Wstęp
Internet rzeczy (Internet of Things, IoT) to złożony, połączony "system systemów" składający się z różnych urządzeń sprzętowych, aplikacji, standardów danych, paradygmatów komunikacji oraz usług w chmurze. Dość trudno jest zdecydować, od czego zacząć własny projekt IoT. Książka Programowanie Internetu rzeczy została zaprojektowana tak, aby pomóc czytelnikom w rozpoczęciu przygody z budowaniem systemów IoT i pokazać programistom, jak zapewnić sprawne działanie tych rozwiązań.
Osoby, które przestudiują niniejszą książkę od początku do końca, dowiedzą się, jak pisać, testować i wdrażać oprogramowanie potrzebne do zbudowania własnego prostego, ale kompletnego rozwiązania IoT.
Do kogo kierowana jest ta książka?
Programowanie Internetu rzeczy jest przede wszystkim książką o budowaniu rozwiązań IoT - od urządzenia po chmurę.
Ta książka została pierwotnie napisana jako pomoc naukowa do kursu Connected Devices prowadzonego przez Andiego Kinga na Northeastern University oraz z myślą o studentach, którzy chcą nauczyć się programowania rozwiązań IoT. Chociaż jej podstawowym założeniem było wsparcie studentów i praktyków, może również pomóc osobom, które chcą lepiej poznać koncepcje i zasady IoT.
W tej książce znaleźć można instrukcje, jak krok po kroku zbudować własne całościowe rozwiązanie IoT, a każdy z rozdziałów zawiera stopniowo rozbudowywane ćwiczenia, które pomagają w utrwaleniu wiedzy o IoT. Jednak osoby zainteresowane przede wszystkim ideami również mogą skorzystać z tej książki. Mogą dowiedzieć się z niej co i dlaczego, szybko przechodząc przez jak i całkiem pomijając ćwiczenia.
Autor książki jest edukatorem i konsultantem, dlatego zorganizował ją tak, by mogła ona posłużyć jako program nauczania dla kursu Wprowadzenie do programowania IoT, który ma na celu omówienie kluczowych idei i stopniowe rozwijanie podstawowej wiedzy w tym ważnym obszarze. Książka ma za zadanie pomóc w budowaniu kursu i wiedzy zarówno nauczycielom akademickim, jak i studentom, którzy chcą rozwinąć swoje umiejętności w zakresie IoT.
Książka pomija większość szczegółowych instrukcji i opisów, polegając na istniejących specyfikacjach i interfejsach API typu open source. Choć pewne fragmenty książki mogą posłużyć jako ogólne wprowadzenie, głównym celem jest pomoc w wykorzystaniu istniejących informacji do budowania własnego rozwiązania. Na szczęście mamy do dyspozycji dobrze napisane specyfikacje protokołów i aktywną społeczność projektów open source. Jesteśmy wdzięczni tym, którzy uczestniczą w tych przedsięwzięciach.
Do programistów
Przyjęto założenie, że praktycy, którzy zaczynają naukę IoT, chcą przede wszystkim zdobyć nowe umiejętności. Być może zauważyli rosnące zapotrzebowanie na specjalistów IoT i chcą uczestniczyć w ewolucji tej ważnej technologii. Wieloletnie doświadczenie nauczyło nas, że najłatwiej jest zrozumieć zawiłości IoT, krok po kroku budując od podstaw zintegrowane, oparte na otwartych standardach rozwiązania IoT, dlatego ten model został zastosowany w niniejszej książce.
Przedstawione przykłady programistyczne autor książki opracował na własnej drodze ku poznawaniu IoT i wiele z nich zostało zapoczątkowanych jako zadania z kursu Connected Devices, który wchodzi w skład programu studiów magisterskich Cyber Physical Systems na Northeastern University.
Każdy rozdział i zestaw ćwiczeń bazuje na poprzednim, dlatego czytelnikom rozpoczynającym pracę z IoT i niezaznajomionym z tym, w jaki sposób poszczególne komponenty oprogramowania budują całościowy system IoT, zaleca się przejście przez ćwiczenia w wyznaczonej kolejności i wykonanie każdego z nich zgodnie z opisem. Ewentualne ulepszenia najlepiej rozważyć dopiero po opanowaniu każdego rozdziału.
Doświadczeni programiści, którzy używają tej książki jak przewodnika, mogą pominąć niektóre podstawowe procedury konfigurowania środowiska deweloperskiego i tylko przejrzeć wybrane ćwiczenia programistyczne, jednak zaleca się przestudiowanie wymagań określonych w każdym z nich, nawet osobom, które zdecydowały się na użycie własnego projektu.
Do instruktorów
Materiały, na których opiera się ta książka, od kilku lat były z powodzeniem wykorzystywane przez jej autora na magisterskim kursie Connected Devices. Niniejsza książka porządkuje te fragmenty wykładów, prezentacji oraz ćwiczeń i została zorganizowana w taki sam sposób, jak kurs.
Kurs miał być początkowo wprowadzeniem do IoT, ale po uwzględnieniu opinii studentów i sugestii asystentów szybko przekształcił się w kurs programistyczny skupiający się na realizacji projektu. Są to aktualnie jedne z ostatnich wymaganych zajęć, którymi studenci kończą swoje studia magisterskie o specjalizacji Cyber Physical Systems. Celem tego kursu jest dostarczenie studentom solidnej podstawowej wiedzy o IoT, która pomoże im w przejściu ze świata akademickiego do przemysłu i wniesieniu podstawowej wiedzy oraz umiejętności IoT do docelowych organizacji.
Niniejsza książka została zorganizowana w taki sposób, by mogła służyć jako materiał referencyjny lub nawet główny komponent pełnego programu i może pomóc w opracowaniu własnego kursu IoT. Koncentruje się na budowaniu całościowego, zintegrowanego i opartego na otwartych standardach rozwiązania IoT, od urządzenia po chmurę, z wykorzystaniem metody nauczania, którą można nazwać "nauką poprzez budowanie". Ponieważ każdy rozdział bazuje na poprzednim, ta książka może pomóc studentom w rozwijaniu od podstaw własnej platformy.
Ćwiczenia można śledzić na bieżąco w internetowej tablicy Kanban zatytułowanej Programming the IoT (https://oreil.ly/5b4Gx)1. Dodatkowe materiały pomocne w nauczaniu i wyjaśnianiu niektórych idei przedstawionych w książce znaleźć można na stronie internetowej https://programmingtheiot.com/programming-the-iot-book.
Do menedżerów i dyrektorów ds. technologii
Ta książka powinna pomóc w lepszym zrozumieniu wyzwań integracyjnych wiążących się z każdym projektem IoT i pokazać, jakie umiejętności musi posiadać zespół IT, aby móc pomyślnie realizować inicjatywy IoT.
Przyjęliśmy założenie, że głównym celem członków tej grupy jest zrozumienie całego obszaru technologicznego IoT: wyzwań związanych z integracją, wymagań zespołów IT dotyczących środowiska programistycznego, obszarów kompetencji zespołu, obaw wobec IoT wyrażanych przez użytkowników biznesowych i innych zainteresowanych oraz problemów z zarządzaniem zmianami, jakie mogą się pojawić, gdy organizacja rozpoczyna przygodę z IoT.
Dyrektorzy i menedżerowie ds. technologii mogą zrezygnować z implementacji ćwiczeń, ale warto by przeczytali całą książkę, by zrozumieć wyzwania, jakie prawdopodobnie napotka ich zespół.
Użytkownikom biznesowym i innym zainteresowanym, którzy chcą przede wszystkim zrozumieć, z czym wiąże się IoT, zaleca się przeczytanie przynajmniej zestawienia znajdującego się na początku każdego rozdziału, a następnie skoncentrowanie się na końcowym rozdziale, w którym opisane zostały pewne praktyczne przypadki, scenariusze i sugestie dotyczące implementacji.
Co trzeba wiedzieć?
Chociaż przedstawione w tej książce ćwiczenia bazują na założeniu, że czytelnik ma pewne doświadczenie w programowaniu, większość z nich nie wymaga zaawansowanych umiejętności ani wykształcenia informatycznego. Jednak aby zrealizować ćwiczenia zawarte na końcu każdego rozdziału, trzeba posiadać podstawowe umiejętności w zakresie: programowania w językach Python oraz Java w stopniu umożliwiającym budowanie prostych aplikacji, korzystania ze zintegrowanych środowisk programistycznych (IDE), czytania, pisania i wykonywania testów jednostkowych oraz konfigurowania systemów opartych na Linuksie za pośrednictwem wiersza poleceń2.
Wszystkie ćwiczenia są poprzedzone projektem stanu docelowego dla danego zadania, który ilustruje, w jaki sposób nowo budowane komponenty logiczne powinny współdziałać z istniejącymi komponentami, które zostały utworzone wcześniej. Większość z nich to proste diagramy blokowe, które pokazują podstawowe relacje między komponentami aplikacji.
Większość diagramów nie została zaprojektowana zgodnie z żadną konkretną metodą dokumentowania i przedstawia jedynie ogólny widok komponentów i ich podstawowych interakcji. Niektóre diagramy wymagają doprecyzowania, dlatego, aby wyjaśnić zamierzenia projektu, dołączono do nich jeden lub więcej diagramów klas bazujących na języku UML (Unified Modeling Language)3.
Jak została zorganizowana ta książka?
Ta książka przedstawia proces budowania krok po kroku całościowego, zintegrowanego rozwiązania IoT obejmującego wszystkie warstwy stosu technologicznego i wykorzystującego różne biblioteki open source oraz komponenty programistyczne. Każdy komponent będzie częścią większego systemu i realizując ćwiczenia przedstawione w każdym rozdziale będzie można zobaczyć, w jaki sposób komponenty łączą się i mapują do docelowej architektury.
W każdym rozdziale zawarte zostanie krótkie wprowadzenie do tematu danego rozdziału wraz z pomocnymi materiałami uzupełniającymi, które zawierać będą pewne powiązane definicje. Przedstawione zostanie również wyjaśnienie, dlaczego wybrany temat jest ważny i czego można się będzie nauczyć. Później zaprezentowane zostaną ćwiczenia programistyczne związane z tematem. Wiele rozdziałów zawiera na końcu dodatkowe ćwiczenia, które warto zaimplementować, aby lepiej utrwalić zdobytą wiedzę.
Powiązane rozdziały zostały ze sobą zgrupowane i w ten sposób powstały cztery części książki: Część I: Rozpoczęcie pracy, Część II: Łączenie się ze światem fizycznym, Część III: Łączenie się z innymi rzeczami oraz Część IV: Łączenie się z chmurą. Każda część i rozdział zostaną teraz pokrótce omówione, a następnie przedstawione zostaną pewne informacje o samym Internecie rzeczy.
Każda część i rozdział zaczynają się od miniatury poetyckiej, która ma na celu oddanie istoty wiedzy, jaka jest przekazywana i wyzwań, jakich należy się spodziewać. Skąd taki pomysł? Na początku kariery programisty autor książki pracował w zespole, w którym obowiązywała następująca reguła: osoba odpowiedzialna za kod, który zakłócił przeprowadzany w nocy proces kompilacji, musiała napisać i wysłać do wszystkich członków zespołu haiku nawiązujące do problemu. Choć wykonywanie przedstawionych w niniejszej książce ćwiczeń najprawdopodobniej nie będzie pociągać za sobą tak poważnych konsekwencji, może warto napisać własne haiku, popełniając błędy i ucząc się na nich.
Część I: Rozpoczęcie pracy
Ta część stanowi wprowadzenie do budowania rozwiązań IoT. Na początku utworzymy środowisko programistyczne i testowe, a następnie napiszemy dwie proste aplikacje do sprawdzania, czy utworzone środowisko działa prawidłowo.
Rozdział 1: Rozpoczęcie pracy to najdłuższy rozdział w książce. Buduje fundamenty dla całościowego rozwiązania i pomaga w zdobyciu podstawowej wiedzy o IoT. Przeprowadza czytelników po procesie konfigurowania stacji roboczej i środowiska programistycznego, aby jak najszybciej mogli oni zacząć produktywną pracę. W tym rozdziale omówimy pewne podstawowe pojęcia IoT, napiszemy prosty opis problemu, zdefiniujemy najważniejsze idee architektoniczne i ustalimy początkowy projekt, który będzie punktem odniesienia dla każdego kolejnego ćwiczenia.
Internet rzeczy składa się z wielu różnych urządzeń oraz systemów i dostępnych jest wiele narzędzi wspierających programowanie oraz automatyzację systemu. W tej książce wykorzystywane będą narzędzia typu open source. Stanowią one jedynie niewielki podzbiór wszystkich dostępnych rozwiązań i nie należy ich traktować jako uniwersalnych rekomendacji - być może czytelnicy mają inne preferencje. Chcieliśmy po prostu uzyskać dobrze zdefiniowaną treść i opisać ogólne podejście do rozwoju i automatyzacji, które pomoże w implementacji ćwiczeń.
Rozdział 2: Początkowe aplikacje warstwy brzegowej opisuje konfigurowanie środowiska programistycznego i metody zbierania wymagań, a następnie przechodzi do programowania. W tym rozdziale utworzymy pierwsze aplikacje IoT - jedną w języku Python, a drugą w języku Java. Będą one dość proste, ale stanowią przygotowanie dla kolejnych rozdziałów. Wykonanie tych ćwiczeń w opisany sposób zaleca się nawet doświadczonym programistom, abyśmy w dalszej części książki mogli bazować na tych samych podstawach.
Część II: Łączenie się ze światem fizycznym
W tej części omówiona zostanie główna właściwość IoT - integracja ze światem fizycznym. Choć ćwiczenia koncentrują się na symulacji i emulacji sprzętu, przedstawione zasady (sposób odczytywania danych czujników i wirtualnego wyzwalania siłownika, czyli elementu wykonawczego) okażą się pomocne, jeśli w przyszłości czytelnicy zdecydują się na użycie prawdziwego sprzętu.
Rozdział 3: Symulacja danych przedstawia różne metody zbierania danych ze świata fizycznego (pomiarów dokonywanych za pomocą czujników) i wyzwalania akcji w oparciu o te dane (wykonywania) przy użyciu symulacji. Na początku zbudowany zostanie zestaw symulatorów, który będzie wykorzystywany we wszystkich kolejnych ćwiczeniach. Te symulatory, choć mają bardzo prosty projekt, ułatwią zrozumienie podstawowych zasad zbierania danych i wykorzystywania tych danych do wyzwalania zdarzeń wykonania.
Rozdział 4: Emulacja danych rozszerza funkcje symulacji opracowane w rozdziale 3, aby emulować działanie czujnika i siłownika. Ten rozdział również koncentruje się na świecie wirtualnym, wykorzystując emulator sprzętu typu open source, który można uruchomić na własnym komputerze.
Rozdział 5: Zarządzanie danymi omawia telemetrię i formatowanie danych, z uwzględnieniem metod strukturalizowania danych w taki sposób, aby mogły być łatwo przechowywane, przesyłane i interpretowane zarówno przez ludzi, jak i maszyny. To zbuduje fundament dla współpracy z innymi "rzeczami".
Część III: Łączenie się z innymi rzeczami
To tu następuje konfrontacja z rzeczywistością. Część III koncentruje się na integracji urządzeń. Prawdziwa integracja wymaga opracowania metody przesyłania danych telemetrycznych i innych informacji z jednego miejsca w drugie. W tym rozdziale będzie można poznać i wykorzystać protokoły warstwy aplikacji zaprojektowane z myślą o ekosystemach IoT. Przyjęte zostanie założenie, że warstwa sieciowa jest już dostępna i działa, choć przy okazji zostanie omówionych również kilka bezprzewodowych protokołów.
Rozdział 6: Integracja MQTT - Wprowadzenie i klient Python opisuje protokoły publikowania/subskrypcji, a konkretnie protokół Message Queuing Telemetry Transport (MQTT), który jest powszechnie wykorzystywany w aplikacjach IoT. Rozdział zawiera omówienie wybranych szczegółów specyfikacji i wyjaśnia, jak można zacząć budowanie prostej warstwy abstrakcji, która ułatwia korzystanie z wspólnych bibliotek open source, zaczynając od języka Python.
Rozdział 7: Integracja MQTT - klient Java kontynuuje rozszerzanie wiedzy o MQTT, opisując bibliotekę open source, która umożliwia aplikacjom Java łączenie się z serwerem MQTT. W końcowej części rozdziału wykorzystamy protokół MQTT w ćwiczeniach i testach służących do zintegrowania się z kodem Python opracowanym w rozdziale 6.
Rozdział 8: Implementacja serwera CoAP koncentruje się na protokołach żądanie/odpowiedź, w szczególności protokole Constrained Application Protocol (CoAP), który także jest powszechnie wykorzystywany w aplikacjach IoT. Jednak tym razem na początku użyjemy języka Java i zbudujemy serwer CoAP wykorzystujący inną bibliotekę open source. Rozdział zawiera również opcjonalne ćwiczenia, w których serwer CoAP jest budowany w języku Python.
Rozdział 9: Integracja klienta CoAP kontynuuje pracę z protokołem CoAP, ale koncentruje się na pisaniu kodu klienta, który posłuży do łączenia się z nowo zbudowanym serwerem Java. Ten kod klienta, napisany zarówno w języku Python, jak i Java, pozwoli na wspieranie komunikacji między urządzeniami z wykorzystaniem protokołu CoAP.
Rozdział 10: Integracja warstwy brzegowej koncentruje się na integracji, umożliwiając nam połączenie dwóch utworzonych wcześniej aplikacji ze sobą za pomocą protokołu MQTT lub CoAP. Dodane zostały ćwiczenia dla każdego z tych protokołów, aby ułatwić wybór tego lepiej dostosowanego do wymogów sytuacji. Podobnie jak rozdział 9, ten rozdział będzie wymagał zaimplementowania rozwiązań zarówno w języku Python, jak i Java.
Część IV: Łączenie się z chmurą
Na zakończenie, na samej "górze" stosu integracji będzie można się dowiedzieć, jak połączyć całą infrastrukturę urządzeń IoT z chmurą, wykorzystując aplikację bramy jako pośrednika między funkcjami chmury a wszystkimi urządzeniami.
W tej części przedstawione zostaną podstawowe zasady łączności z chmurą i omówione różne usługi w chmurze, które pozwalają przechowywać i analizować dane oraz zarządzać środowiskiem IoT. Zbudowana zostanie ta sama prosta aplikacja w chmurze dla każdej z platform.
Rozdział 11: Integracja z różnymi usługami w chmurze wyjaśnia kluczowe koncepcje związane z łączeniem rozwiązania IoT z chmurą i opisuje różne ćwiczenia integracji z chmurą, jakie można zaimplementować przy użyciu protokołu MQTT. Ponieważ platformom chmury poświęcono już wiele książek i samouczków, przedstawiony zostanie jedynie przegląd ich możliwości, bez szczegółowego omawiania jakichkolwiek rozwiązań. Ćwiczenia pomogą czytelnikom w zadecydowaniu, której platformy chmury chcą użyć we własnej implementacji.
Rozdział 12: Oswajanie IoT opisuje kluczowe czynniki wspierające rozwiązania IoT i mapuje je do kilku prostych przypadków użycia IoT, które były szczególnie pomocne w przygotowywaniu kursu Connected Devices. Dla każdego z nich przedstawiony zostanie ogólny opis problemu, oczekiwany wynik i wysokopoziomowy projekt koncepcyjny.
Mamy nadzieję, że ta książka pomoże czytelnikom zrozumieć i zbudować zintegrowany, całościowy system IoT.
Wprowadzenie do IoT
Oto krótkie podsumowanie historii IoT.
Ogromnym postępem w dziedzinie informatyki było wynalezienie tranzystora w latach 1950., a następnie opublikowanie w latach 1960. artykułu Gordona Moore'a opisującego podwajanie się liczby tranzystorów mieszczących się na tej samej powierzchni fizycznej (uaktualnionego w latach 1970.)4.
Wraz z nowoczesną informatyką nadeszły nowoczesne sieci i zalążki Internetu zapoczątkowane przez wynalezienie ARPAnet w 19695. To doprowadziło do opracowania w latach 1970. nowych metod porcjowania lub pakietowania danych przy użyciu protokołów NCP (Network Control Protocol) oraz TCP (Transmission Control Protocol) przez protokół IP (Internet Protocol) i wykorzystanie istniejącej infrastruktury sieci przewodowych. Znalazły one zastosowanie w przemyśle, umożliwiając rozwój automatyki przemysłowej w kierunku scentralizowanego zarządzania rozproszonymi, połączonymi systemami. Systemy SCADA (Supervisory Control and Data Acquisition) - przodkowie technologii M2M (machine-to-machine), które doprowadziły do powstania IoT - wyłoniły się z różnych niestandardowych rozwiązań, a programowalne sterowniki logiczne (PLC) - wynalezione tuż przed ARPAnet - ewoluowały tak, aby wykorzystywać TCP/IP i powiązane standardy sprzętowe6.
W latach 1980. pojawił się protokół UDP (User Datagram Protocol7) i narodziło się to, co przez wielu jest postrzegane jako początek nowoczesnego Internetu (World Wide Web) wynalezionego w końcówce lat 1980. przez Tima Bernersa-Lee8.
Ten okres był również ważny dla rozwoju tego, co obecnie nazywane jest Przemysłowym Internetem rzeczy (Industrial Internet of Things, IIoT), czyli podzbiorem IoT i ważnym składnikiem jego ewolucji.
Czytelnicy na pewno zauważyli pewien powtarzający się schemat: problem prowadzi do powstania rozwiązującej go innowacji technologicznej (często niestandardowej), która następnie zostaje ustandaryzowana lub zostaje wyparta przez jeden lub więcej standardów, co prowadzi do rozpowszechniania się i dalszych innowacji.
I tak oto nadeszła era IoT. W latach 1980. i na początku lat 1990. pojawiły się pierwsze podłączone urządzenia, w tym pierwszy połączony z Internetem toster zaprezentowany przez Johna Romkey i Simona Hacketta na konferencji Interop 19909. W roku 1991 użytkownicy zajęć laboratoryjnych w pobliżu pokoju Trojan Room na uniwersytecie University of Cambridge podłączyli kamerkę webową tak, by móc monitorować ekspres do kawy - bo komu chce się pokonywać cały ten dystans tylko po to, by odkryć, że dzbanek jest pusty10?
To oczywiście utorowało drogę dla innych urządzeń - wiele z nich zostało pewnie zbudowanych i podłączonych w ramach eksperymentów w uczelnianych laboratoriach, akademikach, domach, mieszkaniach i firmach. W tym samym czasie komputery i sieci stawały się coraz tańsze, mocniejsze i oczywiście mniejsze. Powszechnie uważa się, że termin Internet of Things został użyty po raz pierwszy przez Kevina Ashtona w 1999 roku, gdy prowadził on poświęconą tej tematyce prezentację w firmie Proctor & Gamble11.
Przechodząc prosto do roku 2005, Interaction Design Institute Ivrea we Włoszech wydał niedrogi, zaprojektowany z myślą o laikach komputer jednopłytkowy (single-board computer, SBC) Arduino 12, który pozwolił większej liczbie ludzi tworzyć własne systemy detekcji i automatyzacji. Wystarczy łatwo dostępna pamięć i funkcja analizowania danych za pomocą usług dostępnych z dowolnego miejsca w Internecie i powstają podstawy ekosystemu IoT: czyli wielu osobnych, unikalnych rzeczy, które można połączyć ze sobą w celu osiągania lepszych rezultatów.
Jednak postrzeganie IoT jako zbioru rzeczy, które łączą świat fizyczny z Internetem, nie oddaje całej prawdy. Kwintesencją IoT i głównym motorem napędzającym jego złożoność jest heterogeniczność: odmienność i ogromne zróżnicowanie typów, funkcji i możliwości urządzeń, ich zastosowań, sposobów implementacji, wspieranych protokołów, zabezpieczeń i technik zarządzania.
Ponowne definiowanie koncepcji
A zatem czym dokładnie jest Internet rzeczy? To złożony zbiór ekosystemów technologii, które łączą świat fizyczny z Internetem z wykorzystaniem różnych brzegowych urządzeń komputerowych i usług obliczeniowych w chmurze.
W tej książce zastosowane zostaną nieco uproszczone definicje. Do brzegowych urządzeń komputerowych możemy zaliczyć wbudowane urządzenia elektroniczne, systemy komputerowe i aplikacje, które albo podejmują bezpośrednią interakcję ze światem fizycznym za pomocą czujników i siłowników, albo zapewniają bramę bądź mostek umożliwiający tym urządzeniom i aplikacjom łączenie się z Internetem. Usługi obliczeniowe w chmurze to systemy komputerowe, aplikacje, magazyny danych i inne usługi obliczeniowe, które funkcjonują w jednym lub wielu centrach danych i są zawsze dostępne za pośrednictwem Internetu.
W dalszej części książki będziemy odwoływać się do tych dwóch obszarów za pomocą odpowiadających im warstw architektonicznych: warstwy chmury dla usług obliczeniowych w chmurze i warstwy brzegowej dla brzegowych urządzeń komputerowych. Warstwy architektoniczne rozdzielają kluczowe funkcje IoT z perspektywy fizycznej i logicznej, co oznacza na przykład, że pomiary i wykonania zachodzą w warstwie brzegowej, natomiast wszystkie operacje przechowywania długoterminowego i złożone analizy zachodzą w warstwie chmury.
Czytelnicy, którzy chcą dowiedzieć się więcej o architekturze i powiązanych standardach, mogą zainteresować się organizacjami biorącymi aktywny udział w pracach i publikującymi informacje na ten temat. Oto kilka z nich:
European Telecommunications Standards Institute (ETSI) (https://www.etsi.org), Europejska organizacja standaryzacyjna
The International Telecommunication Union (ITU) (https://www.itu.int/en/Pages/default.aspx), agencja Organizacji Narodów Zjednoczonych ds. technologii informacyjnych i komunikacyjnych
The Internet Engineering Task Force (IETF) (https://www.ietf.org), międzynarodowa organizacja zajmująca się standardami w Internecie
The Industrial Internet Consortium (IIC) (https://www.iiconsortium.org), zrzesza firmy i organizacje zainteresowane IIoT
IIC opublikowała różne przydatne dokumenty. Szczególnie interesujący jest dokument Industrial Internet Reference Architecture, który omawia framework i wspólną terminologię dla systemów IIoT i ma ogromny wpływ na to, w jaki sposób autor książki podchodzi do tematu architektury IoT13.
Wnoszenie wartości
Prawdziwą wartością każdego systemu IoT jest zdolność oferowania lepszego lub wzbogaconego rezultatu poprzez integrację świata fizycznego i logicznego oraz zbieranie i analizowanie danych szeregów czasowych.
Za prosty przykład może posłużyć zwykła kuchnia wyposażona w wiele urządzeń. Jeśli można na przykład mierzyć co minutę temperaturę wewnątrz lodówki, można ustalić, jak długo rzeczy przechowywane w lodówce były wystawione na określoną temperaturę. Gdyby temperatura wewnątrz lodówki była sprawdzana tylko raz dziennie, nie istniałyby wystarczająco szczegółowe dane, by można to było ustalić.
Oczywiście jeśli inne systemy nie rozumieją zbieranych danych, są one mało przydatne. Choć każda poszczególna część może być unikatowa i niezależna od innych części, budowanie integrowalnych rozwiązań IoT wymaga od programisty uważnego przemyślenia, w jaki sposób projekt i dane poszczególnych części systemu IoT mogą wpływać na inne systemy (i innych programistów).
Innym kluczowym elementem w łańcuchu wartości jest skalowalność. Co innego jest zbudować system, który wspiera garstkę sygnałów wejściowych, a co innego obsługiwać tysiące, miliony, a nawet miliardy takich sygnałów. To właśnie w skalowalności, czyli zdolności systemu do obsługiwania zarówno dużej, jak i małej ilości danych w zależności od potrzeb, leży prawdziwa moc Internetu rzeczy. Na przykład, skalowalny system w chmurze wspierający IoT to taki, który może z powodzeniem obsługiwać jedno urządzenie bramy nadsyłające do niego dane, jak również tysiące (lub miliony bądź miliardy) takich źródeł danych.
Jest już pewnie jasne, że budowanie zintegrowanego systemu IoT wymaga uwzględnienia na każdym etapie istotnych niuansów. Nie można oczekiwać, że systemy przysyłające dane będą mogły być automatycznie podłączane lub nawet że będą zachowywały się w przewidywalny sposób. Co więcej, nawet jeśli kod zostanie napisany w tak ogólny sposób, aby mógł działać tak samo na różnych urządzeniach sprzętowych, nie zawsze będzie się sprawdzał na każdej platformie.
W jednej książce nie można omówić wszystkich specjalistycznych platform. Nie jest również łatwo napisać spójny, semi-niskopoziomowy kod na poziomie urządzenia, którego nie trzeba optymalizować dla każdego urządzenia. Choć każde urządzenie ma pewne cechy szczególne, które trzeba uwzględnić tworząc (i testując) rozwiązania, przykłady kodu przedstawione w tej książce są przenośne (z pewnymi małymi wyjątkami) i mogą być wykorzystywane w większości systemów, w których można uruchomić maszynę wirtualną Java lub interpretera Python 3.
Na brzegu
Ze względu na ogromną moc i elastyczność warstwy chmury, rozwiązanie IoT zazwyczaj wykazuje największą złożoność na brzegu, gdzie skupia się większość (a często cała) heterogeniczność systemu. Ta książka koncentruje się na dwóch kategoriach urządzeń: urządzeniach ograniczonych i urządzeniach bramy.
W ogromnym uproszczeniu: urządzenia ograniczone mają jakieś ograniczenia związane z mocą, komunikacją lub przetwarzaniem, natomiast urządzenia bramy w zasadzie ich nie mają.
Celowo nie używamy nazwy "urządzenia inteligentne (smart)", ponieważ coraz trudniej jest zdefiniować "urządzenia inteligentne" tak, aby odróżnić je od tych "mniej inteligentnych".
Urządzenie ograniczone to może być jednopłytkowy komputer o ograniczonej mocy (czasem zasilany baterią), który albo odczytuje dane ze środowiska (takie jak temperatura, ciśnienie czy wilgotność), albo inicjuje jakąś mechaniczną akcję (takie jak otwarcie lub zamknięcie zaworu).
IETF oferuje szczegółowe definicje i terminologię dla różnych urządzeń ograniczonych i węzłów" w RFC 722814. Intencją tej książki nie jest zmienianie tych definicji w jakikolwiek sposób - terminy urządzenie ograniczone i aplikacja urządzenia ograniczonego służą po prostu do oddzielenia przewidywanej funkcjonalności urządzenia ograniczonego od urządzenia bramy, wskazując jednocześnie naturę tych dwóch typów urządzeń (w skrócie, to pierwsze ma więcej ograniczeń technicznych niż to drugie).
Urządzenie bramy można również zaimplementować jako komputer jednopłytkowy, ale ma ono dużo większy potencjał: może komunikować się z wieloma różnymi urządzeniami ograniczonymi i ma dość mocy obliczeniowej, aby agregować dane z różnych urządzeń, wykonywać pewne funkcje analityczne oraz określać, kiedy (i jak) przesłać odpowiednie dane do chmury w celu ich dalszego przechowywania i przetwarzania.
Rysunek P-1 przedstawia koncepcyjny projekt architektury systemu IoT, który reprezentuje relacje między tymi typami urządzeń w warstwie brzegowej a usługami i innymi funkcjami znajdującymi się w warstwie chmury.
Rysunek P-1 Koncepcyjny projekt architektury systemu IoT
Na potrzeby niniejszej książki te urządzenia zostaną skategoryzowane w następujący sposób:
Urządzenia bramy koncentrują się na przetwarzaniu, interpretowaniu i integrowaniu danych brzegowych oraz interakcji z chmurą. Przeprowadzają analizy "na brzegu", konwertują i transformują stosy protokołów, ustalają sposób przekierowywania wiadomości (i czy to konieczne) oraz oczywiście bezpośrednio łączą się z Internetem oraz różnymi usługami w chmurze, dzięki którym system IoT przynosi korzyści biznesowe.
Urządzenia ograniczone odpowiadają jedynie za pomiary i/lub wykonanie oraz kontrolowanie, samodzielnie przetwarzając wiadomości lub przekazując je, jeśli zaimplementowany został odpowiedni protokół i wysyłając wiadomości do urządzenia bramy. W skrócie, mają one ograniczone możliwości i czasem nie mogą bezpośrednio łączyć się z Internetem, bazując na łączności z chmurą zapewnianej przez urządzenie bramy.
Czy urządzenie ograniczone może bezpośrednio łączyć się z Internetem? Oczywiście, jeśli wspiera stos protokołów TCP/IP, ma rutowalny adres IP dostępny dla i z publicznego Internetu i zawiera odpowiedni sprzęt do łączenia się z Internetem.
Jednak w tej książce zawęziliśmy kategorię urządzeń ograniczonych, narzucając następujące dwa ograniczenia:
Nie wspierają one przesyłania pakietów bezpośrednio do i z publicznego Internetu (przy jednoczesnym założeniu, że wspierają TCP/IP i UDP/IP) i muszą podejmować interakcję z urządzeniem bramy, aby być częścią jakiegokolwiek ekosystemu IoT.
Nie zawierają odpowiednich zasobów obliczeniowych, aby inteligentnie określać tok postępowania w oparciu o zebrane dane.
Ta książka koncentruje się na paradygmacie "urządzenie ograniczone do urządzenia bramy do połączenia z chmurą", chociaż w różnych przypadkach użycia warto rozważyć inne potencjalnie lepsze modele warstwy brzegowej.
Wnioski
To wszystko oznacza, że rozwijanie urządzeń komputerowych, które są mniejsze, szybsze i tańsze, wykorzystywanie ich do interakcji ze światem fizycznym i łączenie ich (lub ich danych) z Internetem w celu przetwarzania przy użyciu usług w chmurze umożliwia uzyskiwanie informacji, które pomagają w osiąganiu lepszych wyników biznesowych.
Dziękujemy za lekturę!
Konwencje użyte w tej książce
Oto konwencje typograficzne przyjęte w tej książce:
Kursywa
Wyróżnia nowe terminy, adresy URL i adresy email, nazwy i rozszerzenia plików.
Stała szerokość
Służy do prezentowania fragmentów kodu programu, a także wewnątrz akapitów do odwoływania się do elementów programu, takich jak nazwy zmiennych i funkcji, bazy danych, typy danych, zmienne środowiskowe, instrukcje czy słowa kluczowe.
Stała szerokość z pogrubieniem
Przedstawia polecenia i inne rodzaje tekstu, który ma zostać wpisany przez użytkownika w identyczny sposób.
Stała szerokość z kursywą
Przedstawia tekst, który ma zostać zastąpiony wartościami podanymi przez użytkownika lub wynikającymi z kontekstu, a także komentarze w przykładach kodu.
Wykorzystywanie przykładów kodu
Materiały pomocnicze (przykładowy kod i szablony dokumentacji) są dostępne na stronie https://github.com/programming-the-iot. Przedstawione w książce przykłady kodu są objęte licencją MIT (https://www.mit.edu/~amini/LICENSE.md).
Pytania techniczne bądź problemy z wykorzystaniem przykładów kodu można zgłaszać drogą mailową: bookquestions@oreilly.com.
Ta książka ma pomóc programistom w osiąganiu własnych celów. Zasadniczo jeśli książka zawiera przykładowy kod, można użyć go we własnych programach oraz dokumentacji. Nie ma potrzeby kontaktowania się w celu uzyskania zezwolenia, o ile nie planuje się reprodukcji znaczącej części kodu. Na przykład, napisanie programu wykorzystującego kilka fragmentów kodu z książki nie wymaga zezwolenia. Natomiast sprzedaż lub dystrybucja przykładów z książek wydawnictwa O'Reilly wymaga zezwolenia. Udzielenie odpowiedzi poprzez zacytowanie tej książki i przykładowego kodu nie wymaga zezwolenia. Umieszczenie znaczącej części przykładów kodu z tej książki w dokumentacji własnego produktu wymaga zezwolenia.
Będziemy wdzięczni za wskazanie źródła, choć nie jest to wymagane. Odwołanie do źródła zwykle zawiera nazwisko autora, tytuł, wydawnictwo oraz numer ISBN. Na przykład: Andy King, "Programowanie Internetu rzeczy (wydawnictwo O'Reilly). Prawa autorskie Andrew D. King 2021, 978-1-492-08141-8."
W przypadku wątpliwości czy planowane zastosowanie przykładowego kodu wykracza poza przedstawione powyżej zezwolenia, prosimy o kontakt za pośrednictwem adresu e-mail: permissions@oreilly.com.
Jak się z nami skontaktować
Komentarze i pytania dotyczące tej książki prosimy kierować do wydawnictwa:
O'Reilly Media, Inc.
1005 Gravenstein Highway North Sebastopol, CA 95472
800-998-9938 (w USA lub Kanadzie) 707-829-0515 (połączenia międzynarodowe lub lokalne)
707-829-0104 (fax)
Przygotowaliśmy stronę internetową dla tej książki, na której umieszczamy erratę, przykłady i dodatkowe informacje. Jest ona dostępna pod adresem: https://oreil.ly/programming-the-IoT.
Aby przekazać swój komentarz lub zadać pytanie techniczne dotyczące tej książki, można wysłać e-mail na adres: bookquestions@oreilly.com.
Aktualne informacje dotyczące naszych książek i kursów umieszczamy na stronie: http://oreilly.com.
Można nas znaleźć na Facebooku: http://facebook.com/oreilly
śledzić na Twitterze: http://twitter.com/oreillymedia
i oglądać na kanale YouTube: http://youtube.com/oreillymedia
Podziękowania
Myślę, że wszyscy stale szukamy samych siebie, czy to poprzez karierę, relacje z innymi czy pracę misjonarską. Różne zawirowania, przez które Bóg poprowadził mnie na drodze życia oraz mentorzy i towarzysze, których umieścił na tej drodze, reprezentują okno, przez które doświadczam Jego miłości do mnie. Oczywiste jest, że niniejsza książka nie powstałaby bez cierpliwości, krytyki, zachęty i mądrości mojej rodziny, przyjaciół i kolegów, którzy byli gotowi przebyć tę drogę ze mną. Spróbuję podziękować wszystkim, którzy mieli wpływ na mnie i na tę książkę, ale obawiam się, że mogę niechcący pominąć kilka osób. Proszę wybaczcie mi przeoczenia.
Zacząłem programowanie w wieku około 12 lat, gdy mój tata przyniósł do domu Atari 400, które pożyczył mu kolega. Gdy zainteresowałem się językiem BASIC (tracąc efekty pracy po każdym wyłączeniu zasilania), moi rodzice kupili mi własny komputer Atari 800XL, w którym nośnikiem danych były kasety (kto to jeszcze pamięta?), które później zastąpiły dyskietki 5?" , a końcową inwestycją był piekielnie szybki modem 1200 Kbps. Dziękuję Wam Mamo i Tato. Tato... bardzo chciałbym byś nadal był z nami.
I tak oto 25 lat później (w końcu) zostałem programistą i informatykiem. Ale jak to się zaczęło? Mój przyjaciel Jimmy Song, autor książki Programming Bitcoin (O'Reilly), skierował mnie do zespołu O'Reilly Media, gdy pewnego dnia powiedziałem, że "Myślę o napisaniu książki..." Jestem naprawdę wdzięczny Jimmiemu za szczerą poradę, opinie i zachęcanie mnie do tej podróży.
Oczywiście źródłem praktycznej zawartości tej książki był kurs Connected Devices, jaki prowadziłem na Northeastern University. I mam ogromne szczęście, że miałem okazję współpracować ze wspaniałymi akademikami, takimi jak dr Peter O'Reilly, dyrektor programu Cyber Physical Systems na wydziale College of Engineering uniwersytetu Northeastern, który dał mi okazję wykładać Connected Devices. dr Rolando Herrero, również z uniwersytetu Northeastern, był jednym z pierwszych recenzentów zawartości tej książki. Jego ekspercka znajomość systemów i protokołów IoT niezmiernie pomogła w określaniu formatu i funkcji prezentowanego materiału. Kooperacja z Peterem i Rolando, zarówno w roli przyjaciół, jak i współpracowników w rozwijaniu dziedziny IoT, jest jednym z najciekawszych aspektów mojej kariery i jestem im niezmiernie wdzięczy za mentoring.
Ogromne podziękowania dla wszystkich studentów Connected Devices, których miałem zaszczyt uczyć i z którymi miałem okazję współpracować. Treść tej książki i prezentowane w niej ćwiczenia zostały zainspirowane przez Wasze opinie, sugestie, prośby, komentarze i wyrozumiałość dla moich odgrzewanych, niemądrych żartów. To głównie dzięki Wam powstała ta książka i mogę realizować swoją pasję, ucząc (zamiast robić karierę jako kabareciarz).
Wielu asystentów prowadzonego przeze mnie kursu recenzowało i komentowało tę książkę i pomogło mi zbudować pomost między tekstem a ćwiczeniami online. Serdeczne podziękowania dla tych wspaniałych kolegów: Chenga Shu, Ganeshrama Kanakasabai, Harsha Vardhanrama Kalyanaramana, Jaydeepa Shaha, Yogesha Suresha oraz Yuxianga Cao. Cieszę się, że miałem okazję pracować z każdym z nich i jestem ogromnie wdzięczny za ich wkład w sukces kursu.
Niektórzy przyjaciele i koledzy z branży dostarczyli szczegółowych opinii i komentarzy dotyczących wersji roboczej książki. Tim Strunck, ekspert w budowaniu komercyjnych rozwiązań IoT, przekazał wiele informacji zwrotnych dotyczących ogólnej organizacji książki i jej zawartości technicznej - jestem wdzięczny za jego przyjaźń i cenne uwagi oraz za wspaniałą Przedmowę do tej książki. Steve Resnick, dyrektor zarządzający w dużej firmie konsultingowej i autor dwóch książek, podzielił się ze mną swoją menedżerską perspektywą i udzielił rad dotyczących organizacji, kształtu i zawartości, co pomogło w uwypukleniu pewnych kluczowych założeń. Ben Pu popatrzył na książkę z nowej perspektywy, co pomogło mi lepiej zrozumieć, w jaki sposób mogą postrzegać ją przyszli czytelnicy. Doceniam to, że mam kontakt z takimi profesjonalistami, jak Tim, Steve oraz Ben i jestem bardzo wdzięczny za szybkie przekazywanie komentarzy i opinii.
Dziękuję wszystkim kolegom i przyjaciołom w O'Reilly Media - co za zespół! Mike Loukides, VP i Intake Editor, który poświęcił godziny na rozmowy video i telefoniczne oraz korespondencję e-mail, pomógł mi sformułować propozycję wydawniczą i przeprowadził ją przez proces przyjęcia. Melissa Duffield, VP of Content Strategy, która pracowała ze mną nad potencjałem komercyjnym książki i w ekspresowym tempie przepchnęła ją przez proces akceptacji. Cassandra Furtado, która cierpliwie odpowiedziała na wszystkie moje początkowe pytania. Chris Faucher, który przekształcił mój manuskrypt w książkę. Virginia Wilson, która pomogła w zarządzaniu harmonogramem i procesem recenzji technicznej. Arthur Johnson, który jako redaktor wyłapał i poprawił wiele błędów w tekście i problemów ze spójnością formatowania. I oczywiście Sarah Grey, która jako Development Editor pomogła mi przemyśleć organizację materiału i urzeczywistnić go. Bardzo ich szanuję i dziękuję za profesjonalizm, wsparcie, szybką reakcję i koleżeństwo w czasie realizacji tego projektu.
Do przygotowywania tej książki, jej przykładów i ćwiczeń wykorzystano wiele oprogramowania open source i ogólnie dostępnych specyfikacji. Chciałbym podziękować programistom i kontrybutorom każdego z tych projektów.
A przede wszystkim dziękuję mojej wspaniałej żonie Yoon-Hi i niesamowitemu synowi Eliotowi: jesteście moją ostoją i nie mam pojęcia, jak mógłbym w ogóle zacząć ten projekt bez Waszej zachęty i wsparcia. Dziękuję za wszystkie opinie, dyskusje nad moim tekstem (i edytowanie go), wyzwania, wsparcie i wiarę we mnie! Wyciągacie mnie z dolin i dajecie siłę, by zdobywać szczyty. Jesteście cudowni i kocham Was bardziej, niż potrafię wyrazić słowami.
1 Wszystkie prezentowane w tej książce ćwiczenia bazują na tablicy Kanban Programming the IoT utworzonej przez autora i są wykorzystywane za jego zgodą.
2 Jako że kod źródłowy, a także tablice Kanban i inne zasoby dołączone do książki pozostają w oryginale, konieczna jest również znajomość języka angielskiego w zakresie koniecznym do czytania dokumentacji, identyfikowania poszczególnych plików i kroków procedur (przyp. red. wydania polskiego).
3 Dodatek zawiera podstawową reprezentację każdego ćwiczenia w postaci diagramu UML. Najnowszą specyfikację języka UML można znaleźć na stronie internetowej Object Management Group (OMG) (https://www.omg.org/spec/UML).
4 Encyclopaedia Britannica Online, pod hasłem "Moore's law" (https://oreil.ly/6sqQr), napisanym przez edytorów Encyclopaedia Britannica, ostatnia aktualizacja 26 grudnia 2019.
5 Encyclopaedia Britannica Online, pod hasłem "ARPANET" (https://oreil.ly/tHVZq), napisanym przez Kevina Featherly'a, ostatnia aktualizacja 23 marca 2021.
6 Simon Duque Antón i inni, artykuł: "Two Decades of SCADA Exploitation: A Brief History" (https://doi.org/10.1109/AINS.2017.8270432), opublikowany w 2017 IEEE Conference on Application, Information and Network Security (AINS) (Nowy Jork: IEEE, 2017), 98-104.
7 John Postel, artykuł: "User Datagram Protocol" (https://tools.ietf.org/html/rfc768), Internet Standard RFC 768, 28 sierpnia 1980.
8 Dodatkowe informacje o propozycji sieci WWW Tima Bernersa-Lee znaleźć można na stronie https://www.w3.org/History/1989/proposal.html.
9 Wyjaśnienie znaleźć można w artykule: "The Internet Toaster" (https://oreil.ly/VxRcP).
10 Encyclopaedia Britannica Online, artykuł: "Know Your Joe: 5 Things You Didn't Know About Coffee" (https://oreil.ly/j7pVk) (2. The Watched Pot), napisany przez Alison Eldridge, dostępny 18 stycznia 2021.
11 Kevin Ashton, artykuł "That 'Internet of Things' Thing" (https://oreil.ly/BqzmG), RFID Journal, 22 czerwca 2009.
12 Krótka historia narodzin Arduino została przedstawiona w artykule "Timeline of Computer History" na stronie Computer History Museum (https://oreil.ly/Qv6AW).
13 The Industrial Internet of Things, Volume G1: Reference Architecture (https://www.iiconsortium.org/IIRA.htm), Version 1.9 (Needham, MA: Industrial Internet Consortium, 2019).
14 Carsten Bormann, Mehmet Ersue i Ari Keränen, "Terminology for Constrained-Node Networks" (https://tools.ietf.org/html/rfc7228), IETF Informational RFC 7228, Maj 2014, 8-10.