Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00604 010889 10753376 na godz. na dobę w sumie
Internet rzeczy. Budowa sieci z wykorzystaniem technologii webowych i Raspberry Pi - ebook/pdf
Internet rzeczy. Budowa sieci z wykorzystaniem technologii webowych i Raspberry Pi - ebook/pdf
Autor: , Liczba stron: 384
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-283-2969-0 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> hardware >> inne
Porównaj ceny (książka, ebook (-20%), audiobook).

Internet rzeczy (IoT) przynosi kolejną technologiczną rewolucję: oto coraz więcej przedmiotów, także sprzętów codziennego użytku, dzięki wbudowanym czujnikom i dostępowi do sieci może komunikować się z człowiekiem     i z innymi przedmiotami. Możliwości takiej sieci są niewyobrażalne. Inżynierowie, którzy zajmują się tą koncepcją, rozwijają wiele różnych standardów mających służyć integracji IoT.
Okazuje się jednak, że w chaosie konkurujących rozwiązań brakuje spojrzenia na internet rzeczy z nieco szerszej perspektywy, która pozwoliłaby na opracowanie pragmatycznej i strukturalnej metodologii tworzenia urządzeń   i usług IoT.

Niniejszą książkę napisano dla osób, które zaczynają swoją przygodę z internetem rzeczy. Zawarto tu informacje niezbędne do tworzenia prototypów urządzeń, produktów i aplikacji z wykorzystaniem infrastruktury WWW. Przedstawiono obszerne wprowadzenie w zagadnienia dotyczące internetu rzeczy. Znalazły się tu informacje o urządzeniach, czujnikach, standardach i potrzebnych narzędziach. Szczególnie dokładnie przedstawiono instrumentarium niezbędne do budowania WWW rzeczy — czyli warstwy aplikacji internetu rzeczy. Książka ta pozwoli na zrozumienie problemów dzisiejszego internetu rzeczy, poznanie dostępnych technik i ich wykorzystywanie.

W tej książce znajdziesz między innymi:

Internet rzeczy: fascynująca przyszłość, która zaczyna się dziś!


Dr Dominique Guinard — jest pionierem koncepcji architektury internetu rzeczy. Uczestniczył w wielu projektach związanych z tym zagadnieniem: badał duże sieci RFID, zajmował się telefonami komórkowymi jako bramami IoT, a także integrował sieci czujników z oprogramowaniem SAP.

Dr Vlad Trifa — jest uznanym ekspertem w dziedzinie rozproszonych rozwiązań pomiarowych, a także integracji urządzeń interaktywnych z aplikacjami korporacyjnymi. Zajmował się bioakustyką, przetwarzaniem sygnałów, interakcjami robotów humanoidalnych i sieciami neuronowymi.

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Tytuł oryginału: Building the Web of Things: With examples in Node.js and Raspberry Pi Tłumaczenie: Piotr Rajca ISBN: 978-83-283-2968-3 Original edition copyright © 2016 by Manning Publications Co. All rights reserved Polish edition copyright © 2017 by HELION S.A. All rights reserved. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Wydawnictwo HELION ul. Kościuszki 1c, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Pliki z przykładami omawianymi w książce można znaleźć pod adresem: ftp://ftp.helion.pl/przyklady/intrze.zip Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/intrze Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Przedmowa Podziękowania O książce O autorach Spis treści 9 11 15 21 1.2.1. Scenariusz WWW rzeczy: podłączony hotel 1.2.2. Porównanie IoT oraz WoT 1.2.3. Internet rzeczy — krótka historia 1.3. Przypadki zastosowania — dlaczego obiekty podłączone? 1.1. Definicja internetu rzeczy 1.2. Wejście do świata WWW rzeczy CZĘŚĆ I. PODSTAWY IOT ORAZ WOT ......................................................... 23 Rozdział 1. Od internetu rzeczy do WWW rzeczy 25 26 28 29 30 35 37 37 39 40 41 42 43 45 46 48 49 49 50 1.3.1. Bezprzewodowe sieci czujników i pomiary rozproszone 1.3.2. Urządzenia ubieralne i pomiary osobiste 1.3.3. Inteligentne domy i budynki 1.3.4. Inteligentne miasta i sieci energetyczne 1.3.5. Inteligentna produkcja przemysłowa oraz Przemysł 4.0 1.3.6. Inteligentna logistyka i łańcuchy dostaw 1.3.7. Marketing 2.0 1.4.1. Większa łatwość programowania 1.4.2. Otwarte i rozszerzalne standardy 1.4.3. Szybkie i łatwe wdrażanie, utrzymanie i integracja 1.4.4. Luźne powiązania pomiędzy elementami 1.4.5. Powszechnie stosowane mechanizmy związane 1.4. WWW rzeczy — doładowany internet rzeczy z bezpieczeństwem i prywatnością 1.4.6. WWW rzeczy — mankamenty 1.5. Podsumowanie Rozdział 2. Witaj, świecie WWW rzeczy! 2.1. Poznajemy urządzenie WWW rzeczy 2.1.1. Podejrzany: Raspberry Pi 2.2. Ćwiczenie 1. Przeglądanie urządzenia na WWW rzeczy 2.2.1. Część 1. WWW jako interfejs użytkownika 2.2.2. Część 2. WWW jako API 2.2.3. Wnioski 51 52 53 55 56 57 58 58 62 69 Poleć książkęKup książkę 4 Spis treści 2.3. Ćwiczenie 2. Pobieranie danych z czujników w WWW rzeczy 2.3.1. Część 1. Odczyt bieżącej wartości czujnika 2.3.2. Część 2. Pobieranie danych z czujnika i rysowanie ich wykresu 2.3.3. Część 3. Aktualizacja danych na bieżąco 2.3.4. Wnioski 2.4. Ćwiczenie 3. Działania w realnym świecie 2.4.1. Część 1. Zastosowanie formularza do zmiany tekstu na wyświetlaczu 2.4.2. Część 2. Utworzenie własnego formularza do kontroli urządzenia 2.4.3. Wnioski 2.5. Ćwiczenie 4. Informujemy świat o naszym urządzeniu 2.5.1. Wnioski 2.6. Ćwiczenie 5. Tworzenie pierwszej fizycznej aplikacji typu mashup 2.6.1. Wnioski 2.7. Podsumowanie Rozdział 3. Node.js na potrzeby WWW rzeczy 3.1. Era JavaScriptu — od klientów, przez serwery, do rzeczy! 3.1.1. Stosowanie JavaScriptu w rzeczach 3.2. Wprowadzenie do Node.js 3.2.1. Instalowanie Node.js na komputerze 3.2.2. Pierwszy serwer webowy w Node.js 3.2.3. Zwracanie danych z czujnika w formacie JSON 3.3. Modularność Node.js 3.3.1. npm — menedżer pakietów Node.js 3.3.2. Przejrzyste zależności dzięki zastosowaniu pliku package.json 3.3.3. Pierwszy własny moduł Node 3.4. Przedstawienie pętli obsługi zdarzeń Node.js 3.4.1. Serwery wielowątkowe 3.4.2. Jednowątkowe serwery nieblokujące 3.5. Pierwsze spotkanie z programowaniem asynchronicznym 3.5.1. Anonimowe funkcje zwrotne 3.5.2. Nazwane funkcje zwrotne 3.5.3. Biblioteki sterowania przepływem 3.6. Podsumowanie i dalsze kroki Rozdział 4. Pierwsze spotkanie z systemami osadzonymi 4.1. Świat urządzeń osadzonych 4.1.1. Urządzenia dla hobbystów a urządzenia do zastosowań przemysłowych 4.1.2. Systemy operacyjne czasu rzeczywistego a Linux 4.1.3. Podsumowanie. A co oprócz Pi? 4.2. Przygotowanie pierwszego urządzenia WoT — Raspberry Pi 4.2.1. Prezentacja Raspberry Pi 4.2.2. Wybór urządzenia Pi 4.2.3. Lista zakupów 4.2.4. Przygotowywanie własnego Raspberry Pi 4.2.5. Nawiązywanie połączenia z Pi 69 70 71 72 73 74 74 77 79 79 83 84 86 87 89 90 92 93 94 94 96 98 98 99 101 102 103 103 106 106 110 112 115 117 118 118 119 121 123 124 125 125 126 131 Poleć książkęKup książkę Spis treści 5 4.3. Instalowanie Node.js na Raspberry Pi 4.3.1. Stosowanie Git i serwisu GitHub na Pi 4.3.2. Czas na wnioski 4.4. Podłączanie czujników i innych elementów do Pi 4.4.1. Prezentacja portów GPIO 4.4.2. Korzystanie z płytek stykowych i komponentów elektronicznych 4.4.3. Dostęp do portów GPIO z poziomu Node.js 4.5. Podsumowanie Rozdział 5. Tworzenie sieci rzeczy 5.1. Łączenie rzeczy 5.1.1. Topologie sieciowe 5.1.2. Modele klasyfikacji sieci 5.2. Protokoły sieciowe dla rzeczy 5.2.1. Czynniki specjalne 5.2.2. Protokoły internetowe oraz IoT 5.2.3. Sieci osobiste internetu rzeczy 5.2.4. Sieci rozległe internetu rzeczy 5.2.5. A zatem które rozwiązanie wybrać? 5.3. Protokoły warstwy aplikacji dla rzeczy 5.3.1. Stosy warstwy aplikacji ZigBee i Bluetooth 5.3.2. Apple HomeKit i Google Wave 5.3.3. Message Queuing Telemetry Transport 5.3.4. Constrained Application Protocol 5.3.5. A zatem co warto wybrać? 5.4. Architektura WWW rzeczy 5.4.1. Warstwa 1. — dostęp 5.4.2. Warstwa 2. — odnajdywanie 5.4.3. Warstwa 3. — udostępnianie 5.4.4. Warstwa 4. — kompozycja 5.4.5. Dlaczego WWW rzeczy ma znaczenie? 5.4.6. Dalsze kroki 5.5. Podsumowanie 132 134 135 135 135 136 138 145 147 149 149 151 153 154 154 160 165 168 172 173 174 176 178 179 180 182 182 182 183 183 184 185 CZĘŚĆ II. TWORZENIE WWW RZECZY .................................................... 187 189 Rozdział 6. Dostęp: webowe API dla rzeczy 6.1. Urządzenia, zasoby oraz WWW rzeczy 190 190 192 194 198 201 208 211 212 212 214 6.1.1. REST — Representational State Transfer 6.1.2. A dlaczego potrzebujemy jednolitego interfejsu? 6.1.3. Zasada 1. Możliwość adresowania zasobów 6.1.4. Zasada 2. Manipulacja zasobami poprzez reprezentację 6.1.5. Zasada 3. Zrozumiałe komunikaty 6.1.6. Zasada 4. Hipermedia jako mechanizm stanu aplikacji 6.1.7. Podsumowanie — proces projektowania rzeczy webowych 6.2. Nie tylko REST: WWW rzeczy działająca w czasie rzeczywistym 6.2.1. WWW rzeczy potrzebuje zdarzeń! 6.2.2. Publikacja i subskrypcja Poleć książkęKup książkę 6 Spis treści 6.2.3. Webhook — webowe wywołania zwrotne 6.2.4. Comet — modyfikacje HTTP na potrzeby WWW czasu rzeczywistego 6.2.5. WebSocket 6.2.6. Przyszłość: od HTTP 1.1 do HTTP/2 6.3. Podsumowanie Rozdział 7. Implementacja rzeczy webowych 7.1. Podłączanie urządzeń do WWW 7.2. Wzorzec integracji bezpośredniej — REST na urządzeniu 7.2.1. Tworzenie serwera WoT 7.2.2. Projekt zasobów 7.2.3. Projekt reprezentacji 7.2.4. Projekt interfejsu 7.2.5. Implementacja interfejsu publikacji/subskrypcji przy użyciu WebSocket 7.2.6. Podsumowanie — wzorzec integracji bezpośredniej 7.3. Wzorzec integracyjny bramy — przykład CoAP 7.3.1. Uruchamianie serwera CoAP 7.3.2. Użycie bramy do pośredniczenia w komunikacji CoAP 7.3.3. Podsumowanie — wzorzec integracyjny bramy 7.4. Wzorzec integracyjny chmury — MQTT z użyciem platformy EVRYTHNG 7.4.1. Utworzenie konta EVRYTHNG 7.4.2. Tworzenie klienckiej aplikacji MQTT 7.4.3. Stosowanie akcji do kontrolowania wtyczki 7.4.4. Przygotowanie prostej aplikacji webowej do sterowania urządzeniem 7.4.5. Podsumowanie — wzorzec integracyjny chmury 7.5. Podsumowanie Rozdział 8. Odnajdywanie: opisz i odkryj swoją webową rzecz 8.1. Problem odnajdywania 8.2. Odkrywanie rzeczy 8.2.1. Odkrywanie sieciowe 8.2.2. Wykrywanie zasobów w obrębie WWW 8.3. Opisywanie rzeczy webowych 8.3.1. Prezentacja modelu Web Thing Model 8.3.2. Metadane 8.3.3. Właściwości 8.3.4. Akcje 8.3.5. Rzeczy 8.3.6. Implementacja modelu Web Thing Model na Pi 8.3.7. Podsumowanie — Web Thing Model 8.4. Semantyczna WWW rzeczy 8.4.1. Powiązane dane i RDFa 8.4.2. Uzgodniona semantyka: Schema.org 8.4.3. JSON-LD 8.4.4. Dalsze kroki 8.5. Podsumowanie 215 217 217 222 223 225 226 227 228 230 236 240 243 246 246 247 248 251 251 254 258 260 262 266 267 269 270 272 273 276 279 281 283 284 286 287 288 296 296 297 301 302 305 305 Poleć książkęKup książkę Spis treści 7 Rozdział 9. Udostępnianie: zabezpieczanie i współdzielenie rzeczy webowych 9.1. Zabezpieczanie rzeczy 9.1.1. ABC szyfrowania 9.1.2. Bezpieczeństwo w internecie dzięki TSL: to właśnie jest „S” z nazwy „HTTPS”! 9.1.3. Włączanie HTTPS i WSS korzystających z protokołu TSL na Raspberry Pi 9.2. Uwierzytelnianie i kontrola dostępu 9.2.1. Kontrola dostępu z użyciem REST i żetonów API 9.2.2. OAuth: framework do uwierzytelniania 9.3. Społecznościowa WWW rzeczy 9.3.1. Pośrednik uwierzytelniania społecznościowej WWW rzeczy 9.3.2. Implementacja pośrednika uwierzytelniania społecznościowej WWW rzeczy 9.4. Dalsze kroki 9.5. Podsumowanie Rozdział 10. Kompozycja: fizyczne aplikacje typu mashup 10.1. Tworzenie prostej aplikacji — automatyczna generacja interfejsu użytkownika 10.1.1. Uniwersalny interfejs użytkownika dla rzeczy webowych 10.2. Fizyczne aplikacje typu mashup 10.2.1. Node-RED: wizualne tworzenie aplikacji typu mashup 10.3. IFTTT: tworzenie fizycznych aplikacji typu mashup przy użyciu kreatorów 10.3.1. Publikowanie informacji o włamaniach do arkusza Google 10.3.2. Wysyłanie żądań do rzeczy przy użyciu kanału Maker 10.3.3. Przesyłanie tweetów o włamaniach do arkusza w serwisie Google Drive 10.4. Dalsze kroki 10.4.1. Aplikacje typu mashup — od prostych do złożonych aplikacji „big data” 10.4.2. Lepsze wrażenia użytkowników 10.5. Podsumowanie Dodatek. Arduino, BeagleBone, Intel Edison i WWW rzeczy A.1. Integracja BeagleBone z WoT A.1.1. Poznajemy BeagleBone Black A.1.2. Przygotowywanie BeagleBone Black na potrzeby tej książki A.2. Integracja urządzenia Intel Edison z WoT A.2.1. Przygotowywanie urządzenia Edison na potrzeby tej książki A.3. Integracja Arduino z WWW rzeczy A.3.1. Linux, SSH i Node.js A.4. Integracja innych systemów osadzonych z WWW rzeczy Skorowidz 307 309 311 313 315 320 321 324 327 328 330 339 340 343 345 345 352 353 360 361 363 364 366 366 367 368 369 369 370 370 371 372 373 374 375 377 Poleć książkęKup książkę 8 Spis treści Poleć książkęKup książkę Witaj, świecie WWW rzeczy! Zawartość rozdziału:  Szybki rzut oka na różne poziomy architektury WWW rzeczy.  Uzyskiwanie dostępu do urządzeń przy użyciu protokołu HTTP, adresów URL, technologii WebSocket oraz przeglądarek WWW.  Stosowanie API typu REST do pobierania danych w formacie JSON.  Poznawanie zapisu webowej semantyki.  Tworzenie pierwszej fizycznej aplikacji typu mashup. Zanim rzucimy się na głęboką wodę architektury WWW rzeczy i pokażemy, w jaki sposób można ją zaimplementować od samych podstaw, chcielibyśmy dać czytelnikowi przed- smak tego, czym jest WoT. Ten rozdział został napisany jako zestaw ćwiczeń, w ramach których napiszemy małe i proste aplikacje webowe korzystające z danych generowanych przez rzeczywiste urządzenia. Każde z tych ćwiczeń będzie łagodnym ukazaniem proble- mów oraz zagadnień technicznych, z którymi stykamy się podczas konstruowania urządzeń podłączonych do WWW oraz aplikacji wchodzących z nimi w interakcję. W tym rozdziale czytelnik będzie miał okazję, by zakasać rękawy, wziąć się do ro- boty i napisać kilka prostych (a także parę nieco trudniejszych) aplikacji WoT. A co, jeśli czytelnik nie ma odpowiedniego urządzenia? To żaden problem: może skorzystać z na- szego! Aby umożliwić wykonanie ćwiczeń zaprezentowanych w tym rozdziale bez ko- nieczności kupowania jakiegokolwiek urządzenia, podłączyliśmy nasze urządzenie do internetu i zapewniliśmy dostęp do tego urządzenia. Oczywiście jeśli czytelnik posiada już odpowiednie urządzenie, to będzie mógł pobrać kody źródłowe aplikacji przedsta- wionych w tym rozdziale i uruchomić je na własnym urządzeniu. Sposób uruchamiania kodu na urządzeniu został szczegółowo opisany w rozdziale 7. Poleć książkęKup książkę 56 ROZDZIAŁ 2. Witaj, świecie WWW rzeczy! 2.1. Poznajemy urządzenie WWW rzeczy Jak już wspominaliśmy, ten rozdział składa się z serii krótkich i przyjemnych ćwiczeń. Każde z nich pozwala na interakcję z rzeczywistym urządzeniem WoT, działającym w naszym biurze przez 24 godziny na dobę. Dzięki temu czytelnik będzie mógł wykonywać ćwiczenia bez konieczności posiadania rzeczywistego urządzenia. Urządzenie, które podłączyliśmy w naszym biurze do internetu i udostępniliśmy, to Raspberry Pi 2 (dla rodziny i przyjaciół po prostu Pi), przedstawione na rysunku 2.1 i opi- sane bardziej szczegółowo w rozdziale 4. Jeśli czytelnik nigdy wcześniej nie widział Ra- spberry Pi, to może je sobie wyobrazić jako płytkę drukowaną wielkości karty kredyto- wej, z procesorem i kilkoma czujnikami, podłączoną kablem Ethernet do sieci lokalnej i internetu. W naszym systemie Pi działa jako brama zapewniająca możliwość interakcji z kilkoma podłączonymi do niego czujnikami i urządzeniami. Takie bramy zostały szcze- gółowo opisane w rozdziale 7., a na razie wystarczy wiedzieć, że na naszym Pi został uruchomiony serwer WWW zapewniający możliwość zdalnego dostępu do zasobów kom- putera, jak pokazaliśmy na rysunku 2.2. Rysunek 2.1. Raspberry Pi oraz kamera internetowa używane w ćwiczeniach i działające w naszym biurze w Londynie Poleć książkęKup książkę 2.1. Poznajemy urządzenie WWW rzeczy 57 Rysunek 2.2. Konfiguracja urządzeń i czujników stosowanych w ćwiczeniach przedstawionych w tym rozdziale W czasie gdy pisaliśmy tę książkę, nasze Raspberry Pi było wyposażone w wyświetlacz ciekłokrystaliczny (LCD), kamerę, czujnik temperatury i czujnik RIP (pasywny czujnik podczerwieni, czyli czujnik ruchu). W przyszłości chcielibyśmy dodać do tego systemu kolejne czujniki oraz inne elementy, dlatego też gorąco zachęcamy do przeprowadzania eksperymentów wykraczających poza ćwiczenia zamieszczone w tym rozdziale. Czytelnik zapewne prędko się zorientuje, że różne techniki i wzorce opisane w tej książce pozwolą bardzo szybko dostosować przedstawione tu przykłady do każdego urządzenia, czujnika i przeznaczenia. 2.1.1. Podejrzany: Raspberry Pi Raspberry Pi zaprezentujemy bardziej szczegółowo w rozdziale 4., więc na razie to, co czytelnik musi wiedzieć jego temat, ogranicza się do informacji, że jest to mały kompu- ter, do którego można podłączać wiele różnych czujników i akcesoriów. Udostępnia on wszystkie możliwości, których można oczekiwać od komputerów biurkowych, cechuje się jednak mniejszym zapotrzebowaniem na energię oraz znacznie mniejszymi wymiarami. Co więcej, korzystając z portów GPIO, można do niego dołączać wszelkiego rodzaju cyfrowe czujniki, elementy sygnalizacyjne i wykonawcze. Elementy wykonawcze i sy- gnalizacyjne (ang. actuators) to ogólny termin, którego w tej książce używamy do okre- ślania wszystkich elementów podłączanych do urządzenia mających wpływ na realny świat. Są to elementy, które na przykład włączają określone diody LED, wyświetlają tekst na panelach LCD, obracają motor, otwierają drzwi, odtwarzają muzykę itd. W świe- cie WWW rzeczy takie elementy wykonawcze i sygnalizacyjne aktywuje się w taki sam sposób, w jaki wysyła się żądania zapisu do odpowiedniego API — używa się w tym celu protokołu HTTP. A teraz wróćmy do zapowiadanych ćwiczeń. W pierwszej kolej- ności czytelnik będzie musiał pobrać kody przykładów przedstawionych w dalszej czę- ści rozdziału — można je znaleźć na serwerze FTP wydawnictwa Helion, pod adresem ftp://ftp.helion.pl/przyklady/intrze.zip. Poleć książkęKup książkę 58 ROZDZIAŁ 2. Witaj, świecie WWW rzeczy! Repozytorium z kodami można także skopiować na swój własny komputer; w skład tego repozytorium wchodzi kilka katalogów, po jednym dla każdego rozdziału książki. Ćwiczenia zaprezentowane w tym rozdziale znajdują się w katalogu rozdzial2-witaj-wot/ klient. Jeśli ktoś będzie się zastanawiał, co z kodami aplikacji działającej po stronie serwera, to nie musi się tym przejmować! W dalszej części książki dokładnie pokażemy, jak należy się nimi zająć. Jak zdobyć kody źródłowe przykładów przedstawionych w tym rozdziale Do synchronizacji kodu pomiędzy naszymi komputerami a naszym Pi wykorzystamy serwis GitHuba. Alternatywnym rozwiązaniem jest serwis Bitbucketb, który także działa i jest dość podobny do GitHuba. Oba te serwisy są oparte na systemie kontroli wersji Git. Spolonizowane kody przykładów prezentowanych w tej książce są dostępne na serwerze FTP wydawnictwa Helion, pod adresem ftp://ftp.helion.pl/przyklady/intrze.zip, a oryginalne kody źródłowe można znaleźć w repozytorium w serwisie GitHub (jak również na stronie http://book. webofthings.io/). Przykłady do tego rozdziału znajdują się w katalogu rozdzial02-witaj-wot. Jeśli czytelnik nie zna systemu Git ani jego poleceń, to i tak nie ma się czym przejmować: w internecie można znaleźć bardzo wiele informacji na ten temat. Na wszelki wypadek poniżej przedstawiliśmy kilka najistotniejszych poleceń systemu Git:  git clone — pobiera kopię repozytorium na lokalny komputer. W przypadku pobierania kodów do tej książki konieczne jest zastosowanie opcji recursive, która dodatkowo pobierze także wszystkie projekty podrzędne: git clone https://github.com/ webofthings/wot-book --recursive.  git commit -a -m komunikat... — zatwierdza lokalne zmiany w kodzie.  get push origin master — przesyła ostatnio zatwierdzone lokalne zmiany do zdalnego repozytorium (origin), zapisując je w gałęzi master. a GitHub jest bardzo popularnym internetowym serwisem do zarządzania kodem źródłowym. Korzysta z niego wiele projektów typu open source, ponieważ — jak by to powiedzieć — jest on niesamowity. Doskonałe wprowadzenie do sposobów wykorzystywania tego serwisu można znaleźć na stronie http://bit.ly/intro-git. b https://bitbucket.com. 2.2. Ćwiczenie 1. Przeglądanie urządzenia na WWW rzeczy Poznawanie WWW rzeczy zaczniemy od prostego ćwiczenia — jedyne, co trzeba w nim zrobić, to kliknąć kilka odnośników na stronie wyświetlonej w przeglądarce. Chcielibyśmy w ten sposób pokazać przede wszystkim to, że w świecie WWW rzeczy urządzenia mogą jednocześnie oferować wizualny interfejs użytkownika (strony WWW), pozwalający lu- dziom je kontrolować oraz wchodzić z nimi w interakcję, oraz API — interfejs programo- wania aplikacji — zapewniający analogiczne możliwości innym komputerom i aplikacjom. 2.2.1. Część 1. WWW jako interfejs użytkownika W tym ćwiczeniu czytelnik użyje przeglądarki WWW do wejścia w interakcję z rze- czywistym urządzeniem WoT podłączonym do internetu w naszym biurze. W pierwszej kolejności warto przyjrzeć się konfiguracji systemu, używając do tego kamery interne- towej (patrz rysunek 2.3). W tym celu należy uruchomić ulubioną przeglądarkę i w niej Poleć książkęKup książkę 2.2. Ćwiczenie 1. Przeglądanie urządzenia na WWW rzeczy 59 Rysunek 2.3. Strona WWW kamery wchodzącej w skład naszego zestawu. Zdjęcia są wykonywane przez kamerę na bieżąco wyświetlić najnowsze zdjęcie wykonane przez naszą kamerę, dostępne na stronie http:// devices.webofthings.io/camera/sensors/picture/. Na tej stronie zawsze jest prezentowane najnowsze zdjęcie zrobione przez naszą kamerę, dzięki czemu czytelnik może zobaczyć urządzenie, na którym będzie przeprowadzał eksperymenty (warto to robić w nocy — wtedy jest jeszcze zabawniej!). Oczywiście sama kamera nie będzie widoczna na zdjęciu. Łatwo zauważyć, że podany adres URL ma określoną strukturę. Spróbujmy zatem trochę z tym adresem poeksperymentować i użyć jego podstawowej postaci, która po- zwoli przejść na stronę główną bramy pozwalającej na przeglądanie urządzeń działających w naszym biurze i interakcję z nimi (patrz rysunek 2.4). W tym celu należy wpisać w prze- glądarce następujący adres URL: http://devices.webofthings.io. Ten adres URL zawsze przekieruje na stronę główną bramy działającej w naszym biurze, która prezentuje listę wszystkich podłączonych urządzeń. W tym przypadku widać, że są do niej podłączone dwa urządzenia:  Raspberry Pi z różnymi czujnikami, elementami sygnalizacyjnymi i wykonaw- czymi;  kamera internetowa (ta, której przed chwilą użyliśmy). Poleć książkęKup książkę 60 ROZDZIAŁ 2. Witaj, świecie WWW rzeczy! Rysunek 2.4. Strona HTML bramy do naszego urządzenia WoT. Dwa odnośniki umieszczone u dołu pozwalają przejść na strony urządzeń podłączonych do tej bramy Trzeba zwrócić uwagę na to, że strona ta jest generowana automatycznie, na podstawie urządzeń, które są faktycznie fizycznie podłączone do bramy, dlatego może się zdarzyć, że będzie na niej wyświetlonych kilka dodatkowych urządzeń, o ile tylko je podłączymy. Właśnie tak! Choć wygląda ona na zwyczajną stronę WWW, to jednak w rzeczywistości odczytuje realne dane przesyłane w czasie rzeczywistym przez realne urządzenia dzia- łające w naszym realnym biurze! Spróbujmy teraz kliknąć odnośnik My WoT Raspberry Pi (moje Raspberry Pi), aby przejść na stronę główną samego urządzenia. Ponieważ używamy do tego przeglądarki, z łatwością możemy zauważyć, że adres URL wyświetlanej w niej strony zmienił się na http://devices.webofthings.io/pi, jak pokazaliśmy na rysunku 2.5. To kolejna strona główna — tym razem samego urządzenia. W tym przypadku wy- starczyło dopisać na końcu adresu URL bramy fragment /pi. Wróćmy teraz do samej strony: warto spróbować wskazać myszą różne umieszczone na niej odnośniki, aby przyjrzeć się dokładniej ich strukturze, a następnie kliknąć odnośnik The list of sensors (lista czujników). Także to kliknięcie spowoduje zmianę adresu URL strony wyświetlonej w przeglądarce, tym razem na http://devices.webofthings.io/pi/sensors (patrz rysunek 2.6). Jak na razie wszystko jest bardzo proste: poprosiliśmy o wyświetlenie strony WWW prezentującej listę czujników (/sensors) podłączonych do Raspberry Pi (/pi), które z kolei jest podłączone do bramy deviced.webofthings.io. Warto sobie przypomnieć, że do bramy jest także podłączona kamera, dlatego zamieniając w adresie URL /pi/ na /camera/, można bezpośrednio wyświetlić listę czujników kamery: http://devices.webofthings.io/ camera/sensors (patrz rysunek 2.7). Poleć książkęKup książkę 2.2. Ćwiczenie 1. Przeglądanie urządzenia na WWW rzeczy 61 Rysunek 2.5. Strona główna naszego Raspberry Pi. U dołu tej strony umieszczona jest lista odnośników pozwalających na przeglądanie i poznawanie różnych zasobów podłączonych do urządzenia; w tym przypadku są to czujniki, elementy sygnalizacyjne i wykonawcze Rysunek 2.6. Lista czujników podłączonych do naszego Pi. Można kliknąć każdy z nich, by wyświetlić najnowszą wartość zarejestrowaną przez dany czujnik Poleć książkęKup książkę 62 ROZDZIAŁ 2. Witaj, świecie WWW rzeczy! Rysunek 2.7. Strona czujników kamery. W tym przypadku jest tylko jeden taki czujnik; reprezentuje on zdjęcie wykonane przez kamerę Wróćmy teraz do listy czujników naszego Pi i przyjrzyjmy się im nieco dokładniej. Obec- nie dostępne są tylko trzy czujniki: temperatury, wilgotności i pasywny czujnik pod- czerwieni. Po kliknięciu odnośnika Temperature Sensor (czujnik temperatury) w prze- glądarce zostanie wyświetlona strona tego czujnika, prezentująca aktualnie zmierzoną przez niego wartość. I w końcu, tak samo jak w przypadku czujników, można wyświetlić listę elementów sygnalizacyjnych i wykonawczych podłączonych do naszego Pi, a na- stępnie wyświetlić stronę ze szczegółowymi informacjami o wybranym urządzeniu — Actuator Details (parz rysunek 2.13) — dostępną pod adresem http://devices.webofthings. io/pi/actuators/display. Jeśli chodzi o prezentację, to do naszego Raspberry Pi został podłączony prosty wy- świetlacz LCD, pozwalający na wyświetlanie tekstów. Jego możliwości wykorzystamy w ćwiczeniu 2.4. Prezentowane są także informacje na temat tego komponentu naszego zestawu, a w szczególności tekst aktualnie prezentowany wyświetlaczu, dane o API po- zwalającym na przesyłanie własnego tekstu na wyświetlacz oraz formularz do wysyłania tego tekstu. Na razie formularz nam się nie przyda, jednak wrócimy do niego w podroz- dziale 2.4. 2.2.2. Część 2. WWW jako API W części 1. weszliśmy w interakcję z WWW rzeczy z poziomu przeglądarki WWW. Zo- stał także zaprezentowany sposób, w jaki internauci mogą poznawać zasoby urządzenia (czujniki, elementy sygnalizacyjne i wykonawcze itd.) oraz w jaki można wchodzić w inte- rakcję z tymi zasobami za pośrednictwem stron WWW. Wszystkie te czynności są wy- konywane poprzez przeglądanie zasobów fizycznego urządzenia, dokładnie tak samo jak przeglądamy strony na zwyczajnych witrynach WWW. Co jednak zrobić w przypadku, kiedy chcemy, by zamiast użytkownika te same operacje wykonywało inne urządzenie Poleć książkęKup książkę 2.2. Ćwiczenie 1. Przeglądanie urządzenia na WWW rzeczy 63 lub aplikacja — automatycznie i bez żadnej ingerencji człowieka? Jak można ułatwić wszystkich klientom WWW odnajdywanie urządzenia, zrozumienie, co ono robi, poznanie jego API, określenie, jakie polecenia można do niego przesyłać, itd.? W dalszej części książki pokażemy i wyjaśnimy szczegółowo, jak można wykonywać wszystkie te operacje. Na razie jednak ograniczymy się jedynie do pokazania, w jaki sposób wykorzystanie WWW ułatwia obsługę zarówno ludzi, jak i aplikacji. W tym celu zapre- zentujemy, co „widzi” inne urządzenie lub aplikacja podczas przeglądania zasobów naszego urządzenia. Do wykonania tego ćwiczenia czytelnik będzie potrzebował przeglądarki Chrome z zainstalowanym rozszerzeniem Postman1 — jednym z naszych ulubionych. Jeśli ktoś preferuje pracę z poziomu wiersza poleceń, to równie dobrze może wykorzystać program cURL2. Postman to wygodna, niewielka aplikacja, która może znacznie ułatwić korzy- stanie z webowych API, gdyż pozwala na proste wysyłanie żądań HTTP, ustawianie przeróżnych opcji tych żądań, takich jak nagłówki i treści, itd. Dodatek Postman bardzo ułatwi czytelnikowi życie podczas lektury tej książki, dlatego naprawdę warto go zain- stalować już teraz. W poprzednim punkcie rozdziału — części 1. — przeglądarka pełniła funkcję zwy- czajnego klienta, żądającego od serwera WWW przesyłania treści. Przeglądarka auto- matycznie prosi, by zwracanymi treściami były dokumenty HTML, które po przesłaniu z serwera do przeglądarki są w niej wyświetlane. W tym punkcie rozdziału zrobimy niemal to samo, ale tym razem poprosimy, by serwer zwracał dokumenty w formacie JSON, a nie strony HTML. JSON jest najpraw- dopodobniej najpopularniejszym formatem wymiany danych używanym obecnie w inter- necie. Ma on bardzo prostą składnię, dane zapisane w tym formacie są zwarte i nie zajmują wiele miejsca, co sprawia, że w porównaniu ze swoim rodzicem — formatem XML — JSON jest bardzo efektywny. Co równie ważne, dane w formacie JSON mogą być bez trudu odczytywane i zapisywane przez ludzi, a także analizowane i generowane przez komputery, co z kolei sprawia, że jest on optymalnym formatem do wymiany danych na WWW rzeczy. Proces przesyłania prośby o zastosowanie konkretnego kodowania jest w specyfikacji HTTP 1.1 nazywany negocjowaniem zawartości (ang. content negotiation) — zagadnienie to omówimy w rozdziale 6. KROK 1. POBIERANIE LISTY URZĄDZEŃ Z BRAMY Podobnie jak w poprzednim przypadku, także i teraz w celu pobrania listy urządzeń prze- ślemy żądanie GET na stronę główną bramy. Aby to zrobić, należy wpisać w rozszerzeniu Postman adres URL tej bramy i kliknąć przycisk Send, jak pokazaliśmy na rysunku 2.8. 1 Można je pobrać ze strony http://www.getpostman.com/. 2 cURL to program używany z poziomu wiersza poleceń pozwalający na przesyłanie danych przy użyciu różnych protokołów, w tym także przy użyciu protokołu HTTP. Jeśli nie został on domyślnie zainstalowany na komputerze użytkownika, to bez żadnych problemów można go zainstalować samodzielnie, wybierając odpowiednią wersję: na komputery Mac, systemy Linux oraz Windows. Witryna poświęcona temu programowi znajduje się pod adresem http://curl.haxx.se/. Poleć książkęKup książkę 64 ROZDZIAŁ 2. Witaj, świecie WWW rzeczy! Rysunek 2.8. Pobieranie strony głównej bramy przy użyciu rozszerzenia Postman. Wykorzystujemy w tym celu żądanie HTTP GET (1), podając w nim adres URL bramy (2). Treść odpowiedzi będzie zawierać dokument HTML (4) Ponieważ większość serwerów WWW domyślnie zwraca dokumenty HTML, w obsza- rze prezentującym zawartość odpowiedzi zobaczymy kod strony WWW (4). Dokładnie to dzieje się domyślnie za każdym razem, gdy odwołujemy się do serwera WWW, uży- wając przeglądarki. Teraz, aby zamiast kodu HTML pobrać dane w formacie JSON, trzeba kliknąć przycisk Headers i dodać nagłówek o nazwie Accept i wartości application/ json. Potem można ponownie kliknąć przycisk Send, jak pokazaliśmy na rysunku 2.9. Dodanie tego nagłówka do żądania można by porównać z powiedzeniem serwerowi: „Słuchaj, jeśli możesz, to zwróć mi, proszę, wyniki zapisane w formacie JSON”. Ponieważ brama obsługuje zwracanie takich odpowiedzi, tym razem w obszarze zawartości odpo- wiedzi zostanie wyświetlony kod JSON; będzie on stanowił zrozumiały dla komputerów odpowiednik pobranej wcześniej strony WWW, choć w tym przypadku będzie on za- wierał samą treść, bez żadnych elementów wizualnych (czyli kodu HTML). Poleć książkęKup książkę 2.2. Ćwiczenie 1. Przeglądanie urządzenia na WWW rzeczy 65 Rysunek 2.9. Pobieranie listy urządzeń podłączonych do bramy z użyciem rozszerzenia Postman. W tym przypadku zastosowany został dodatkowo nagłówek Accept o wartości application/json, stanowiący prośbę o przekazanie wyników zapisanych w formacie JSON Kod JSON zwrócony w zawartości odpowiedzi to zrozumiały dla komputerów opis wszyst- kich urządzeń podłączonych do bramy; poniżej pokazaliśmy, jak wygląda ten kod. { pi : { id : 1 , name : My WoT Raspberry Pi , description : A simple WoT-connected Raspberry Pi for the WoT book. , url : http://devices.webofthings.io/pi/ , currentStatus : Live , version : v0.1 , tags : [ raspberry , pi , WoT ], resources : { sensors : { url : sensors/ , name : The list of sensors }, actuators : { Poleć książkęKup książkę 66 ROZDZIAŁ 2. Witaj, świecie WWW rzeczy! url : actuators/ , name : The list of actuators } }, links : { meta : { rel : http://book.webofthings.io , title : Metadata }, doc : { rel : https://www.raspberrypi.org/products/raspberry-pi-2-model-b/ , title : Documentation }, ui : { rel : . , title : User Interface } } }, camera : { [ ... opis obiektu kamery... ] } } W powyższym dokumencie JSON można wskazać dwa elementy pierwszego poziomu (pi oraz camera), które reprezentują dwa urządzenia podłączone do bramy, jak również kilka bardziej szczegółowych informacji na ich temat, takich jak ich adres URL, nazwa, identyfikator i opis. Nie trzeba się przejmować, jeśli nie wszystkie zamieszczone tu infor- macje są zrozumiałe — po przeczytaniu kilku kolejnych rozdziałów wszystko stanie się całkowicie jasne. KROK 2. POBIERANIE INFORMACJI O KONKRETNYM URZĄDZENIU A teraz spróbujmy zmienić adres URL w rozszerzeniu Postman tak, by wskazywał on na nasze Raspberry Pi (to ten sam adres, którego użyliśmy w poprzednim punkcie rozdziału — w części 1.), a następnie kliknijmy przycisk Send, jak pokazano na rysunku 2.10. Obecnie treść odpowiedzi zawiera obiekt JSON z informacjami o urządzeniu Raspberry Pi, takimi samymi jak te, które zobaczyliśmy już wcześniej; ponadto, jak widać na po- niższym przykładzie, obiekt resources zawiera właściwości sensors oraz actuators: resources : { sensors : { url : sensors/ , name : The list of sensors }, actuators : { url : actuators/ , name : The list of actuators } } Poleć książkęKup książkę 2.2. Ćwiczenie 1. Przeglądanie urządzenia na WWW rzeczy 67 Rysunek 2.10. Pobieranie danych o urządzeniu Raspberry Pi zapisanych w formacie JSON. Informacje zwrócone w odpowiedzi zawierają metadane dotyczące urządzenia oraz odnośniki do jego zasobów KROK 3. POBIERANIE LISTY CZUJNIKÓW PODŁĄCZONYCH DO URZĄDZENIA Aby pobrać listę czujników podłączonych do urządzenia, należy — podobnie jak wcześniej — dodać do jego adresu URL końcówkę /sensors i tak zmienione żądanie przesłać, uży- wając rozszerzenia Postman. W tym przypadku żądanie HTTP GET zwróci w odpowiedzi następujący dokument zapisany w formacie JSON: { temperature : { name : Temperature Sensor , description : A temperature sensor. , type : float , unit : celsius , value : 23.4, timestamp : 2017-02-13T14:39:17.240Z , frequency : 5000 }, humidity : { name : Humidity Sensor , description : A temperature sensor. , type : float , unit : percent , value : 38.9, timestamp : 2017-02-13T14:39:17.240Z , frequency : 5000 Poleć książkęKup książkę 68 ROZDZIAŁ 2. Witaj, świecie WWW rzeczy! }, pir : { name : Passive Infrared , description : A passive infrared sensor. True when someone present. , type : boolean , value : true, timestamp : 2017-02-13T14:39:17.240Z , gpio : 20 } } Jak pokazuje powyższy przykład, do urządzenia zostały podłączone trzy czujniki (są to odpowiednio: czujnik temperatury — temperature, czujnik wilgotności — humidity, czujnik ruchu — pir), a w odpowiedzi zostały umieszczone szczegółowe informacje o nich, jak również ostatnia zmierzona przez nie wartość. KROK 4. POBIERANIE SZCZEGÓŁOWYCH INFORMACJI O CZUJNIKU I w końcu pobierzemy szczegółowe informacje o konkretnym czujniku. W tym celu należy dodać do adresu URL w rozszerzeniu Postman końcówkę /temperature i ponownie kliknąć przycisk Send. Adres URL powinien teraz mieć postać: http://devices.webofthings.io/pi/ sensors/temperature, jak pokazaliśmy na rysunku 2.11. Rysunek 2.11. Pobieranie obiektu reprezentującego czujnik temperatury podłączonego do Raspberry Pi. Jak widać, uzyskane informacje obejmują aktualny odczyt czujnika (23,4 stopnia Celsjusza) oraz datę i godzinę wykonania pomiaru (17:53, 13 lutego 2017 r.) Poleć książkęKup książkę 2.3. Ćwiczenie 2. Pobieranie danych z czujników w WWW rzeczy 69 Wykonanie powyższego żądania zwróci dokładne informacje dotyczące czujnika tempe- ratury, a w szczególności ostatnią zmierzoną przez niego wartość (pole value). Aby po- brać wyłącznie wartość pomiaru, do powyższego adresu URL czujnika należy dodać koń- cówkę /value (rozwiązanie to działa także w przypadku pozostałych czujników): { value :22.4 } 2.2.3. Wnioski Teraz nadeszła pora na to, by czytelnik na własną rękę poeksperymentował i wypróbo- wał różne adresy URL przedstawione wcześniej w tym ćwiczeniu. Warto zwrócić uwa- gę na to, czym one się od siebie różnią i jaką mają strukturę, poprzeglądać zasoby urzą- dzenia, spróbować zrozumieć, jakie dane udostępniają poszczególne czujniki, w jakim formacie dane te są zapisywane itd. Dodatkowo można przyjrzeć się urządzeniom elek- tronicznym znajdującym się w naszym otoczeniu: urządzeniom gospodarstwa domowe- go w kuchni, telewizorowi oraz systemowi audio-wideo w salonie, systemowi do zama- wiania kawy, elektronicznemu systemowi informacji kolejowej — zależnie od tego, gdzie czytelnik czyta tę książkę. A teraz spróbujmy sobie wyobrazić, że wszystkie te urządze- nia i usługi mogłyby mieć podobną strukturę: adresy URL, treści, ścieżki itd. Spróbuj- my odwzorować tę strukturę z wykorzystaniem formatu JSON przedstawionego w tym rozdziale: zapisać adresy URL oraz zwracane obiekty JSON. Wszystko, co zobaczyliśmy w tym ćwiczeniu, pokazuje, że zarówno ludzie, jak i apli- kacje mogą pobierać dane, używając dokładnie tych samych adresów URL, lecz nieco innych formatów wyjściowych (dla ludzi bardziej odpowiedni jest format HTML, a dla aplikacji — JSON). Oczywiście dane zwracane w obu tych formatach są identyczne, dzięki czemu programiści aplikacji bez trudu mogą zmieniać stosowane formaty. To tylko jeden z przykładów pokazujących, jak proste — a jednocześnie potężne — są technologie zwią- zane z WWW. Dzięki niezwykle popularnym standardom, takim jak HTTP czy adresy URL, interakcja z rzeczywistym światem z poziomu przeglądarek WWW stała się na- prawdę łatwa. Znacznie więcej informacji na temat tych koncepcji zostało przedstawionych w rozdziale 6. tej książki. 2.3. Ćwiczenie 2. Pobieranie danych z czujników w WWW rzeczy W ćwiczeniu 1. poznaliśmy strukturę urządzenia WoT oraz sposób jego działania. W szcze- gólności przekonaliśmy się, że każdy element takiego urządzenia jest po prostu zasobem, posiada unikalny adres URL i mogą się do niego odwoływać zarówno ludzie, jak i kom- putery, aby odczytywać i zapisywać dane. Teraz czas założyć kapelusz programisty i zabrać się do pisania pierwszej aplikacji wchodzącej w interakcję z urządzeniem należącym do WWW rzeczy. Poleć książkęKup książkę 70 ROZDZIAŁ 2. Witaj, świecie WWW rzeczy! 2.3.1. Część 1. Odczyt bieżącej wartości czujnika W celu wykonania tego ćwiczenia należy przejść do pobranego z serwisu GitHub katalog o nazwie rozdzial02-witaj-wot/klient. W tym katalogu należy dwukrotnie kliknąć plik ex2.1-polling-temp.html, by otworzyć go w nowoczesnej przeglądarce3. Ta strona wyświetla wartość czujnika temperatury podłączonego do Pi w naszym biurze i aktualizuje tę wartość co pięć sekund, pobierając w tym celu dane w formacie JSON (dokładnie tak, jak pokazano na rysunku 2.11). Do pobierania danych z naszego Pi strona używa biblioteki jQuery4. Otwórzmy teraz ten plik w ulubionym edytorze, aby przyjrzeć się jego kodowi źródłowemu. Należy w nim zwrócić uwagę na dwie rzeczy:  znacznik h2 , pokazujący, gdzie zostanie zapisana bieżąca wartość czujnika;  funkcję JavaScript o nazwie doPoll(), która odczytuje wartość czujnika z Raspberry Pi, wyświetla ją, a następnie, po upływie pięciu sekund, wywołuje samą siebie. Kod tej funkcji został przedstawiony na poniższym listingu 2.1. Listing 2.1. Pobieranie wartości z czujnika temperatury Czekamy, aż strona zostanie pobrana, a następnie wywoła funkcję doPoll(). $(document).ready( function doPoll() { $.getJSON( http://devices.webofthings.io/pi/sensors/temperature , function (data) { console.log(data); $( #temp ).html(data.value + + data.unit); setTimeout(doPoll, 5000); }); }); Ta funkcja zostanie wywołana, kiedy nadejdzie odpowiedź. Używamy funkcji pomocniczej do generowania żądań AJAX pobierających z czujnika temperatury dane w formacie JSON. Wybieramy element HTML o identyfikatorze temp i aktualizujemy jego zawartość, używając wyrażeń data.value (wartość) oraz data.unit (jednostka), korzystających z informacji zwróconych w danych JSON przesłanych z naszego urządzenia. Funkcja doPoll() ustawia czasomierz, który wywoła tę samą funkcję po upływie pięciu sekund (5000 milisekund). Podczas tworzenia (a szczególnie testowania!) aplikacji internetowych bardzo przydatna będzie możliwość wyświetlania treści z poziomu kodu JavaScript poza stroną WWW wyświetloną w przeglądarce. Do tego celu można wykorzystać konsolę JavaScript. Aby ją wyświetlić w przeglądarce Chrome, należy kliknąć w dowolnym miejscu strony pra- wym przyciskiem myszy, a następnie z wyświetlonego menu podręcznego wybrać opcję Zbadaj — spowoduje to wyświetlenie konsoli JavaScript poniżej obszaru prezentujące- go kod HTML bieżącej strony. Instrukcja console.log(data) wyświetla na konsoli obiekt JSON data pobrany z serwera. 3 Wszystkie przykłady zostały gruntownie przetestowane w przeglądarkach Firefox ( 41) oraz Chrome ( 46), dlatego też sugerujemy, by czytelnik zainstalował na swoim komputerze jedną z nich. Przykłady powinny także działać w przeglądarce Safari ( 9). Jeśli ktoś koniecznie chce używać przeglądarki Internet Explorer, to musi pamiętać, że będzie potrzebował wersji IE 10 lub nowszej — w starszych wersjach tej przeglądarki przykłady nie będą działać. 4 jQuery jest bardzo wygodną biblioteką języka JavaScript, która znacznie ułatwia wykonywanie na stronach WWW wielu czynności, takich jak korzystanie z API typu REST, manipulowanie elementami HTML, obsługa zdarzeń itd. Więcej informacji na temat tej biblioteki można znaleźć na stronie http://jquery.com/. Poleć książkęKup książkę 2.3. Ćwiczenie 2. Pobieranie danych z czujników w WWW rzeczy 71 2.3.2. Część 2. Pobieranie danych z czujnika i rysowanie ich wykresu No dobrze, ale w niektórych sytuacjach konieczne będzie wyświetlanie czegoś więcej niż jedynie ostatniej wartości odczytanej z czujnika, na przykład potrzebne będzie nary- sowanie wykresu tych wartości zarejestrowanych w ciągu ostatniej godziny. Otwórzmy zatem drugi plik HTML w tym ćwiczeniu (o nazwie ex-2.2-polling-temp-chart.html). To nieco bardziej złożony przykład, który przechowuje 10 ostatnich wartości odczytanych z czujnika temperatury i wyświetla je w formie wykresu. Kiedy otworzymy ten drugi plik w przeglądarce, na stronie zostanie narysowany wykres aktualizowany co dwie sekundy, taki jak ten przedstawiony na rysunku 2.12. Rysunek 2.12. Co dwie sekundy do wykresu dodawana jest automatycznie nowa wartość odczytana z urządzenia Wykres jest tworzony przy użyciu Google Charts5 — niewielkiej i prostej biblioteki JavaScript służącej do sporządzania wszelkiego typu wykresów i diagramów. Sposób jej użycia został zaprezentowany na zamieszczonym poniżej listingu opatrzonym komen- tarzami. Listing 2.2. Pobieranie danych z czujnika i prezentowanie ich na wykresie $(document).ready(function () { var maxDataPoints = 10; var chart = new google.visualization.LineChart($( #chart )[0]); var data = google.visualization.arrayToDataTable([ [ Czas , Temperatura ], [getTime(), 0] ]); var options = { Konfiguracja parametrów wykresu. Inicjalizacja wykresu. Utworzenie tablicy, w której będą zapisywane kolejne punkty wykresu. 5 http://developer.google.com/chart/. Poleć książkęKup książkę 72 ROZDZIAŁ 2. Witaj, świecie WWW rzeczy! title: Temperatura , curveType: function , animation: { duration: 1000, easing: in }, legend: {position: bottom } }; Dodanie danych kolejnego punktu do tablicy z danymi wykresu oraz usunięcie najstarszego punktu, jeśli będzie to konieczne (jeżeli liczba punktów przekroczy 10). function addDataPoint(dataPoint) { if (data.getNumberOfRows() maxDataPoints) { data.removeRow(0); } data.addRow([getTime(), dataPoint.value]); chart.draw(data, options); } Przerysowanie wykresu w celu uwzględnienia nowego punktu. function getTime() { var d = new Date(); return d.toLocaleTimeString(); } Odczyt wartości z czujnika temperatury (jak w poprzednim przykładzie). function doPoll() { $.getJSON( http://devices.webofthings.io/pi/sensors/temperature/value , function (result) { addDataPoint(result); setTimeout(doPoll, 2000); }); } Kiedy będzie dostępna nowa wartość odczytana z czujnika, użyjemy jej w wywołaniu funkcji addDataPoint(). doPoll(); }); 2.3.3. Część 3. Aktualizacja danych na bieżąco W poprzednim przykładzie pobieranie danych z czujnika temperatury podłączonego do Raspberry Pi działało doskonale. Jednak zastosowane rozwiązanie wydawało się trochę nieefektywne, nieprawdaż? Czy nie byłoby lepiej, gdyby nasz skrypt, zamiast samodzielnie pobierać wartość czujnika co każde dwie sekundy lub jakiś inny okres, był informowany o wszelkich zmianach mierzonej temperatury i wyłącznie o nich? Zgodnie z bardziej wyczerpującymi informacjami na ten temat zamieszczonymi w rozdziale 6. ta zmiana to podstawowa różnica pomiędzy modelem standardowo używa- nym na WWW oraz nowym, sterowanym zdarzeniami modelem działania aplikacji współ- pracujących z czujnikami bezprzewodowymi. Na razie przedstawimy jeden ze sposobów rozwiązania tego problemu, polegający na wykorzystaniu stosunkowo nowej technologii internetowej: WebSocket. Ogólnie rzecz ujmując, WebSocket to zespół prostych, lecz dających duże możliwości mechanizmów, których serwery WWW mogą używać do prze- kazywania powiadomień do klientów; mechanizmy te zostały wprowadzone w standar- dzie HTML5. Standard WebSocket składa się z dwóch części: pierwsza z nich działa na serwerze, a druga po stronie klienta. Ponieważ w naszym przypadku część serwerowa została już zaimplementowana, musimy się zająć jedynie częścią kliencką. Kliencki API technologii Poleć książkęKup książkę 2.3. Ćwiczenie 2. Pobieranie danych z czujników w WWW rzeczy 73 WebSocket korzysta z języka JavaScript i jest stosukowo prosty i nieskomplikowany. Po- niższe dwa wiersze kodu to wszystko, czego potrzeba, by nawiązać połączenie z serwerem WebSocket i wyświetlać na konsoli otrzymywane od niego komunikaty. Listing 2.3. Nawiązywanie połączenia z serwerem z użyciem technologii WebSocket i wyświetlanie komunikatów var socket = new WebSocket( ws://ws.webofthings.io ); socket.onmessage = function (event) {console.log(event);}; Wróćmy do naszego przykładu i dwukrotnie kliknijmy plik ex-2.3-websockets-temp- graph.html, aby otworzyć go w przeglądarce. Na stronie zobaczymy dokładnie ten sam wykres co w poprzednim ćwiczeniu, jednak za kulisami będzie on działał zupełnie inaczej. Przyjrzyjmy się zatem kodowi tego przykładu, przedstawionemu na poniższym listingu 2.4. Listing 2.4. Utworzenie połączenia WebSocket i odczytywanie zmian temperatury na bieżąco var socket = new WebSocket( ws://devices.webofthings.io/pi/sensors/temperature ); socket.onmessage = function (event) { var result = JSON.parse(event.data); addDataPoint(result); }; Zarejestrowanie anonimowej funkcji, która ma być wywoływana po odebraniu komunikatu WebSocket. Utworzenie subskrypcji WebSocket pobierającej dane z czujnika temperatury. Koniecznie należy zwrócić uwagę na zastosowanie protokołu WebSocket (ws://…). Zarejestrowanie kolejnej anonimowej funkcji, która będzie wywoływana w przypadku wystąpienia błędów komunikacji WebSocket. socket.onerror = function (error) { console.log( WebSocket error! ); console.log(error); }; W tym przykładzie nie odpytujemy czujnika cyklicznie przez pobieranie jego bieżącego odczytu, lecz rejestrujemy zainteresowanie otrzymywaniem informacji o aktualizacjach mierzonej wartości — w tym celu, korzystając z API WebSocket, tworzymy subskrypcję punktu końcowego /sensors/temperature. Kiedy serwer będzie dysponował nową zmierzo- ną wartością temperatury, wyśle ją do klienta (naszej przeglądarki WWW). Zdarzenie to zostanie przechwycone przez zarejestrowaną funkcję anonimową, a najnowsza zmierzona wartość temperatury zostanie dodana do obiektu zdarzenia przekazywanego do tej funkcji jako jej parametr. 2.3.4. Wnioski Cofnijmy się nieco i zastanówmy nad tym, co zrobiliśmy w ostatnim ćwiczeniu: udało nam się skomunikować z osadzonym urządzeniem (Raspberry Pi), które może się znajdować po drugiej stronie kuli ziemskiej (o ile ktoś nie ma szczęścia i nie mieszka w deszczowej i pięknej Anglii). Z poziomu strony WWW byliśmy w stanie pobierać dane z czujnika podłączonego do urządzenia i cyklicznie — w regularnych odstępach czasu — wyświe- tlać je na wykresie. To naprawdę całkiem nieźle jak na stronę WWW składającą się z 60 wierszy kodów HTML, JavaScript i CSS. Ale to nie wszystko: potrzebowaliśmy mniej niż 10 wierszy kodu JavaScript, by subskrybować powiadomienia z naszego Pi przy wy- Poleć książkęKup książkę 74 ROZDZIAŁ 2. Witaj, świecie WWW rzeczy! korzystaniu technologii WebSocket i wyświetlać temperaturę na bieżąco. W ramach roz- szerzenia dla tego ćwiczenia czytelnik może spróbować napisać prostą stronę WWW, która będzie automatycznie pobierać zdjęcia robione przez naszą kamerę (sugerujemy przy tym, by nie robić tego z częstotliwością 25 klatek na sekundę!). Jeśli to było pierwsze spotkanie czytelnika z WWW rzeczy, to w oczy powinna mu się rzucić przede wszystkim duża prostota przedstawianych przykładów. Załóżmy na chwilkę, że nasze Pi nie byłoby podłączone do internetu przy wykorzystaniu HTTP, JSON-a czy WebSocket, lecz przy użyciu „klasycznego” stosu do wymiany danych pomiędzy aplika- cjami opartego na formacie XML, takiego jak DPWS (jeśli czytelnik nigdy o nim nie słyszał, to nie ma się czym przejmować, bo właśnie o to chodzi!). Najprościej rzecz uj- mując, nie bylibyśmy w stanie porozumiewać się z urządzeniem bezpośrednio z prze- glądarki, a przynajmniej nie tak łatwo. Konieczne byłoby napisanie aplikacji przy użyciu jakiegoś bardziej skomplikowanego języka niższego poziomu, takiego jak C lub Java. Nie można by było przy tym korzystać z powszechnie znanych i popularnych rozwiązań, jak adresy URL, języki HTML, CSS oraz JavaScript. I właśnie o to chodzi w WWW rzeczy: o zapewnienie możliwości programowania oraz dostępu do rzeczywistych przedmiotów poprzez przybliżenie ich szerokim rzeszom programistów aplikacji webowych, czyli osób mających do czynienia z rozwiązaniami i technologiami, w których obecnie wprowadza- nych jest najwięcej innowacji. Jak już wcześniej zaznaczyliśmy, z tej książki czytelnik dowie się znacznie więcej na temat sztuki tworzenia API do wchodzenia w interakcję z fizycznymi przedmiotami. W rozdziale 6. przyjrzymy się dokładniej protokołom HTTP i REST, formatowi JSON, jak również zagadnieniom związanym z interakcjami z WWW rzeczy w czasie rzeczywi- stym, a w rozdziale 7. wyjaśnimy, jak tworzyć bramy, które pozwolą innym protokołom i systemom korzystać z zalet, jakie zapewniają technologie związane z WWW. 2.4. Ćwiczenie 3. Działania w realnym świecie Do tej pory przedstawiliśmy jedynie różne sposoby „odczytu” danych czujników udo- stępnianych przez urządzenia podłączone do WWW. A co z operacjami „zapisu”? Na przykład moglibyśmy chcieć przesłać na urządzenie polecenie zmiany parametru konfi- guracyjnego. W innych przypadkach może się pojawić konieczność kontroli serwome- chanizmu (na przykład w celu otworzenia drzwi garażu lub wyłączenia świateł). 2.4.1. Część 1. Zastosowanie formularza do zmiany tekstu na wyświetlaczu Aby pokazać, w jaki sposób można wysyłać polecenia do elementów wykonawczych i sygnalizacyjnych, w tym ćwiczeniu przedstawimy prostą stronę pozwalającą na prze- syłanie tekstu, który będzie wyświetlany na ekranie LCD podłączonym do naszego Ra- spberry Pi. Aby szybko przetestować te możliwości funkcjonalne, wystarczy otworzyć w przeglądarce stronę WWW ekranu LCD na naszym Pi, która jest dostępna pod adresem http://devices.webofthings.io/pi/actuators/display. Poleć książkęKup książkę 2.4. Ćwiczenie 3. Działania w realnym świecie 75 Na tej stronie (przedstawionej na rysunku 2.13) prezentowane są różne właściwości wyświetlacza LED. Pierwszą z nich jest brightness (jasność), którą można by zmieniać, jednak nie zapewniliśmy takiej możliwości, przez co właściwość ta ma charakter danej tylko do odczytu. Kolejną właściwością jest content (zawartość) i to ją będziemy chcieli ustawiać w tym ćwiczeniu. I w końcu ostatnią właściwością jest duration, która określa, jak długo podany tekst będzie prezentowany na naszym ekranie LCD. Można teraz sko- rzystać z rozszerzenia Postman, aby pobrać obiekt JSON zawierający różne informacje o ekranie LCD, używając w tym celu adresu URL podanego w poprzednim akapicie i po- stępując zgodnie z instrukcjami zamieszczonymi w pierwszym ćwiczeniu w tym rozdziale. Rysunek 2.13. Szczegółowe informacje o wyświetlaczu LCD wraz z polami różnych właściwości, które można ustawiać, takimi jak wyświetlany tekst { name : LCD Display screen , description : A simple display that can write commands. , properties : { brightness : { name : Brightness , timestamp : 2017-02-13T21:06:02.913Z , value : 80, unit : , type : integer , description : Percentage of brightness of the display. Min is 0 which is black, max is 100 which is white. }, content : { name : Content , timestamp : 2017-02-13T21:06:32.933Z , type : string , description : The text to display on the LCD screen. Poleć książkęKup książkę 76 ROZDZIAŁ 2. Witaj, świecie WWW rzeczy! }, duration : { name : Display Duration , timestamp : 2017-02-13T21:06:02.913Z , value : 5000, unit : milliseconds , type : integer , read-only : true, description : The duration for how long text will be displayed on the LCD screen. } }, commands : [ write , clear , blink , color , brightness ] } Oczywiście wyświetlanie czegoś w naszym biurze byłoby mało interesujące, gdybyśmy nie zapewnili możliwości obejrzenia tego, co jest pokazane na ekranie LCD. Właśnie z tego powodu dodaliśmy do naszego zestawu kamerę internetową, która pokazuje ekran LCD podłączony do naszego Pi — dzięki niej zawsze można zobaczyć, co jest w danej chwili wyświetlane. Oto adres URL zapewniający możliwość obejrzenia tego zdjęcia: http://devices.webofthings.io/camera/sensors/picture/. A zatem do dzieła: proszę wyświetlić tę stronę, by zobaczyć najnowsze zdjęcie wykonane przez kamerę, takie jak to przed- stawione na rysunku 2.3 (aby zobaczyć najnowsze zdjęcie, należy odświeżyć stronę w przeglądarce). A teraz spróbujemy przesłać do Pi komunikat tekstowy, który zostanie wyświetlony na podłączonym do niego ekranie LCD. Właściwość content zawsze zawiera bieżący komuni- kat wyświetlany na ekranie LCD, a zatem aby go zaktualizować, należy wygenerować żą- danie typu POST, którego zawartością będzie treść komunikatu, jaki ma zostać wyświetlony na ekranie (na przykład value : Witaj, swiecie ). Można wypróbować to samemu, używając rozszerzenia Postman, jednak prostszym rozwiązaniem będzie skorzystanie ze strony WWW wyświetlacza dostępnego pod adresem http://devices.webofthings.io/pi/ actuators/display. Strona ta została przedstawiona na rysunku 2.13. Omawiana strona prezentuje różne właściwości wyświetlacza LCD. Niektóre z nich pozwalają na ustawianie wartości, a inne są przeznaczone tylko do odczytu. My chcemy ustawić wartość właściwości content, spróbujmy zatem podać treść komunikatu w polu tekstowym i kliknąć przycisk Update. Jeśli wszystko pójdzie dobrze, to w przeglądarce powinny zostać wyświetlone przesłane dane JSON, takie jak te pokazane w poniższym przykładzie: { id :11, messageReceived : Lubie WoT, a nie VAT! , displayInSeconds :20 } Poleć książkęKup książkę 2.4. Ćwiczenie 3. Działania w realnym świecie 77 Te zwrócone dane zawierają komunikat, który zostanie wyświetlony, unikalny identyfi- kator wiadomości oraz szacunkowe opóźnienie, z jakim treść komunikatu zostanie wy- świetlona na ekranie LCD (w sekundach); dzięki tej ostatniej informacji czytelnik będzie wiedział, kiedy wyświetlić obraz z kamery, by zobaczyć podany tekst. 2.4.2. Część 2. Utworzenie własnego formularza do kontroli urządzenia Teraz spróbujemy napisać prostą stronę HTML zawierającą formularz i pozwalającą na przesyłanie do urządzenia podłączonego do WWW wszelkiego rodzaju poleceń. Aby zobaczyć, jak taka strona może wyglądać, otwórzmy w przeglądarce plik ex-3.1-actuator- form.html. Postać tej przykładowej strony została przedstawiona na rysunku 2.14. Rysunek 2.14. Ten prosty formularz HTML działający po stronie klienta pozwala na przesyłanie tekstu, który ma zostać wyświetlony na ekranie LCD podłączonym do naszego Pi Strona zawiera pole tekstowe oraz przycisk Prześlij do Pi, a jej kod został zaprezento- wany na zamieszczonym poniżej listingu 2.5. Dowolny tekst wpisany w polu tekstowym na tej stronie zostanie wyświetlony na ekranie LCD Raspberry Pi w naszym biurze. Prosimy przy tym o kulturalne zachowanie, gdyż API naszego Pi jest publicznie dostępny, a my nie bierzemy żadnej odpowiedzialności za to, co ludzie na nim wyświetlają. Listing 2.5. Prosty formularz do przesyłania poleceń do elementu sygnalizacyjnego form action= http://devices.webofthings.io/pi/actuators/display/content/ method= post label Wpisz komunikat: /label input type= text name= value placeholder= Witaj, swiecie! button type= submit Prześlij do Pi /button /form To prosty formularz HTML, który przesyła dane, używając żądań HTTP typu POST (określonego za pomocą atrybutu method), pod wskazany adres URL (określony przy pomocy atrybutu action). Pole tekstowe nosi nazwę value (atrybut name= value ), dzięki czemu nasze Pi wie, jaki tekst ma wyświetlać. To rozwiązanie świetnie sprawdza się w przypadku prostych witryn WWW. Niestety, tym, czego nie widać, jest to, że prze- glądarka nie wysyła (ani nawet nie daje takiej możliwości) danych w formacie JSON (co możemy bardzo prosto zrobić, używając rozszerzenia Postman), lecz w formacie okre- ślanym jako application/x-www-form-urlencoded. Pi musi rozumieć także ten format, a nie jedynie format application/json, by móc prawidłowo obsługiwać dane przesyłane z for- mularzy HTML. Formularze HTML mogą używać tylko dwóch czasowników protokołu HTTP: POST oraz GET, nie mogą natomiast używać DELETE ani PUT. Naprawdę szkoda, że z jakichś nie- jasnych przyczyn zachowania zgodności wstecz nowoczesne przeglądarki WWW nie potrafią wysyłać zawartości formularzy HTML w formie obiektów JSON; ale cóż… takie jest życie! Poleć książkęKup książkę 78 ROZDZIAŁ 2. Witaj, świecie WWW rzeczy! Jak się przekonamy w dalszej części książki, zapewnienie, że wszystkie przedmioty tworzące WWW rzeczy będą w stanie odbierać i transmitować treści w formacie JSON, jest jednym z kluczowych warunków koniecznych do utworzenia prawdziwie otwartego ekosystemu. Właśnie z tego powodu pokażemy czytelnikowi, jak można przesyłać z for- mularzy HTML dane w formacie JSON (korzystając z połączenia technologii AJAX i ję- zyka JavaScript), gdyż stanowi to jeden z najważniejszych aspektów komunikacji z urzą- dzeniami w WWW rzeczy. Otwórzmy zatem plik ex-3.2-actuator-ajax-json.html, by przyjrzeć się temu samemu formularzowi, który w tej wersji jest obsługiwany przez rozbudowany fragment kodu JavaScript, przedstawiony na poniższym listingu: Listing 2.6. Przesyłanie w żądaniu POST danych z formularza zapisanych w formacie JSON Sposób kodowania wysyłanych danych. Czasownik HTTP określający sposób wysyłania żądania. Oczekiwany format danych wynikowych. (function($){ function processForm(e){ $.ajax({ url: http://devices.webofthings.io/pi/actuators/display/content/ , dataType: json , method: POST , contentType: application/json , data: JSON.stringify({ value : $( #value ).val()}), processData: false, success: function( data, textStatus, jQxhr ){ $( #response pre ).html( JSON.stringify( data ) ); }, error: function( jqXhr, textStatus, errorThrown ){ console.log( errorThrown ); } }); e.preventDefault(); } $( #message-form ).submit(processForm); })(jQuery); Funkcja processForm() zostanie wykonana, kiedy użytkownik naciśnie przycisk wysyłający formularz. Adres URL, na jaki zostanie wysłane żądanie. Wysyłane dane (faktyczna zawartość formularza). Funkcja zwrotna wywoływana, jeśli żądanie zostanie prawidłowo obsłużone. Funkcja zwrotna wywoływana, jeśli nie uda się prawidłowo obsłużyć żądania. W powyższym przykładzie zdefiniowana została funkcja processForm(), która pobiera dane z formularza, zapisuje je w formie obiektu JSON, następnie przesyła do naszego Pi w żądaniu typu POST i w końcu wyświetla wyniki prawidłowo obsłużonego żądania (w przy- padku wystąpienia błędu stosowny komunikat jest wyświetlany na konsoli). Parametr url określa adres URL punktu końcowego (ekranu podłączonego do naszego Pi), para- metr method określa metodę HTTP używaną do przesyłania żądania, a parametr contentType — format danych przesyłanych na serwer (w tym przypadku jest to application/json). Ostatni wiersz kodu określa, że kliknięcia przycisku Prześlij do Pi, umieszczonego w for- mularzu #message-form, mają być obsługiwane przez funkcję processForm(). W pliku ex-3.2b-actuator-ajax-form.html została umieszczona zmodyfikowana wersja tego samego przykładu, w której dane przesyłane do naszego Pi nie są zapisywane w for- macie JSON, lecz w formacie application/x-www-form-urlencoded, czyli tym samym, który jest domyślnie używany przez formularze i został zastosowany w części 1. ćwiczenia 3. Poleć książkęKup książkę 2.5. Ćwiczenie 4. Informujemy świat o naszym urządzeniu 79 2.4.3. Wnioski W tym podrozdziale czytelnik poznał podstawowe sposoby wysyłania poleceń do urzą- dzenia — przy wykorzystaniu formularza na stronie WWW, jak również przy użyciu API. Dodatkowo zamieszczone tu zostały informacje o ograniczeniach, wyzwaniach oraz pro- blemach związanych z korzystaniem z nowoczesnej WWW
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Internet rzeczy. Budowa sieci z wykorzystaniem technologii webowych i Raspberry Pi
Autor:
,

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: