Академический Документы
Профессиональный Документы
Культура Документы
УМНЫЕ ВЕЩИ
Arduino, датчики и сети
для связи устройств
3-е издание
Санкт-Петербург
«БХВ-Петербург»
2019
УДК 004.4
ББК 32.973.26
И26
Иго Т.
И26 Умные вещи: Arduino, датчики и сети для связи устройств: Пер. с англ. — 3-е изд. — СПб.:
БХВ-Петербург, 2019. — 608 с.: ил. — (Электроника)
ISBN 978-5-9775-3970-8
УДК 004.4
ББК 32.973.26
© 2019 BHV
Authorized russian translation of the English edition of Making Things Talk, 3rd Edition, ISBN 978-1-68045-215-0 © 2017 Maker Media, Inc.
This translation is published and sold by permission of O'Reilly Media, Inc., which owns or controls all rights to publish and sell the same.
Авторизованный русский перевод английской редакции книги Making Things Talk, 3rd Edition, ISBN 978-1-68045-215-0 © 2017 Maker
Media, Inc.
Перевод опубликован и продается с разрешения O'Reilly Media, Inc., собственника всех прав на публикацию и продажу издания.
&
- $
:
,
-
-
,
,
,
(
-
)
% . . '
-
,
-
$
,
.
,
- ,
,
"
-
— ,
,
" -
.
- % . * . +
— ,
"
$
.
-
.
,
-
,
.
-
. /
,
-
—
,
1. 0
-
-
"
( ,
- ,
"
-
, —
-
). #
,
,
,
,
$
-
,
, —
, %
.
- &
,
.
$ -
,
-
,
" "
. /
-
%
-
,
,
.
"
" .
1
&
: «object-oriented hardware».
0
,
- 2
"
,
%
,
-
"
-
, -
—
,
-
%
,
. #
,
-
"
.
,
Предисловие 13
"
"
%. +
$
-
,
-
$
-
(
, $
. 0
)
%
-
-
,
-
,
- "
-
-
.
.
&
,
,
-
3
,
"
-
, $
,
- , , , " -
% $
- . &
" Bluetooth
TCP/IP,
,
"
Ethernet.
,
- 9
. 4
-
, -
-,
, BASIC Stamp2
. 0
"
LEGO Mindstorms3, , %
-
,
%
2
7
%
. ;
BASIC (PBASIC),
ROM.
,
3
(
$
-
— " -
)
"
—
(
. http://ru.wikipedia.org/wili/LEGO_Mindstorm).
.
and Controlling the Physical World»4 ( - $
,
-
Thomson),
=
Processing,
0’# (Dan O’Sullivan). &
-
$
,
-
: www.processing.org. ; -
-
" -
. + - $
. #
-
" - Processing
,
,
"
, -
-
.
% $
,
&
",
Содержание книги
В книге представлены основные принципы создания объектов сетевой структуры, а также при-
водятся примеры, их иллюстрирующие. Каждая глава содержит инструкции по созданию рабо-
тающих проектов, основанных на изложенных в ней концепциях.
? 1. 2
- • 3.
-
,
— +
. 2
-
,
,
«Hello World!» («2
,
!»)
,
-
.
$
. 9
-
" , "
-
? 2.
-
,
,
- +
,
"
. 2
" . 0
-
,
-
-
, ,
+
-
$ -
.
. &
,
? 4. 2
-
,
-
,
- # .
#
"
-
, -
Bluetooth.
-
,
#
,
-
.
.
Предисловие 15
? 5. # " % -
$
-
# —
-
,
—
" -
. 2
-
.
%
,
? 8. 2
,
-
"
# .
-
$
"
( ),
,
-
-
, —
-
,
.
. ? 9. 2
? 6.
. +
. 0
, -
. 2
. *
-
%
, -
"
$
«Hello World!»
.
(«2
,
!»)
. ? 10. 2
-
,
? 7. 2
-
"
,
"
" -
(
)
,
-
.
5. /
"
— &
-
UDP ( +
)
-
802.15.4 (
). ,
, -
& -
, -
+
"
" , -
.
.
. 3
", 4
- ,
SparkFun (www.sparkfun.com), Adafruit (www.
%
, $
adafruit.com) Seeed Studio (www.seeedstudio. .
16 Предисловие
*
,
- ,
, ISBN -
$
- . *
: «Making Things Talk: Practical
%
,
- Methods for Connecting Physical Objects, by Tom
CD-ROM
Igoe. Copyright 2011 Maker Media, 978-14493-
OYReilly
%
. 9243-7»5. 4
,
-
Z
$ , ,
%
, -
-
% ,
% . $
$
permissions@oreilly.com.
7
- 5
&
"
$
$ . [
- .
&
,
-
,
.
-
* ,
.
$
. ;
,
-
—
"
,
,
. $
-
0
,
,
,
Предисловие 17
$
-
- " ,
,
, $
-
$ -
. 4
.
-
Arduino, -
" ,
, Arduino
- -
"
. _ -
,
$
-
-
, ,
$
-
,
. = 2005
-
. ` ,
%
,
,
$
,
,
-
«
».
Arduino
&
"
,
,
. /
Wii Kinect — $
, "
-
%
-
, %,
-
,
,
. #
-
$
, % -
. '
,
# .
$
, -
,
%
$ $
, $
-
%
, "
.
" , $
-
%
%
. _
- Arduino
,
Kinect
,
, "
-
. 0
-
Wii,
- , —
" -
-
% . 0
. _
,
$
-
-
, $. , $
18 Предисловие
, "
-
$
-
,
$ -
. &
,
"
,
,
% ,
,
,
. >
"
. # - ,
$
%
, -
%
%
-
-
,
«
-
%
. `
,
"». ;
, $
-
.
&
, "
!
RFID
! -
$ ,
(
##
-
%
), +
,
!
-
" . + , "
$ , #
! ,
#
,
,
».
$ -
0
, -
. q
,
«+
" »
,
1999 3%
%
,
(Kevin Ashton),
Auto-ID
%
% , ,
7
.
,
&
«That “Internet of Thins” Thing»6
,
-
(www.rfidjournal.com/articles/view?4986) -
.
+
- +
, 3%
. =
,
% ,
"- ,
-
,
-
, $
.
$ . 0
,
+
-
$ «
% -
,
,
, % — -
,
- " ,
,
!
.
% , —
6
'
: «' % $
% %
“+
" ”».
.
Предисловие 19
/ ,
,
. # 2016 —
,
, Mirai
,
%
—
%
$ .
, +
% -
,
"
,
,
. *
-
$
% % .
,
%
,
7
Nest ,
. &
"
,
,
+
, -
,
" Hue
-
" , -
, "
"
,
-
. ~
" Alexa #
$ ,
-
,
%.
-
7
,
$ "
.
,
«
».
* «» — $ , ' +
. '
, $
%- ", $
-
,
" -
,
,
-
% . `
,
,
,
.
$ % ,
=
%-
% ,
$
%
-
,
-
,
%
.
. ~ -
-
` , ,
$ ,
,
%
$
,
-
,
$
-
"
.
, $
. 3%
: «$
#
$
%
- !
,
». /
%
«»
,
%
. +
(&
- %
, #
.
,
# )
-
,
IP7 HTTP8. &
- О программном обеспечении
$
,
#
« »
, "-
-
.
"
.
2 ,
% %
*
,
$ , +
, -
, . =
— Arduino
7
Processing —
,
Internet Protocol —
+
.
8
Hypertext Transfer [Transport] Protocol —
- "
.
". &
,
20 Предисловие
-
,
$
Arduino 101
-
- MKR1000. >%
/ %
.
Arduino
Uno,
+
. =
-
" gitHub
https://github.com/
% ,
-
tigoe/MakingThingsTalk2
Arduino,
-
. + " -
ARM
www.makingthingstalk.com. Cortex-M0 ESP8266.
-
Об используемом оборудовании
Linux. = $
'
-
Raspberry Pi,
,
%
-
BeagleBone.
Благодарности
Эта книга является продуктом обсуждения и сотрудничества со многими людьми. Ее создание
было бы невозможным без поддержки и ободрения со стороны круга моих соратников, который
продолжает увеличиваться.
`
%
,
"
9
.
Tisch10 *-
—
,
- 7 = 0Y#,
-
%
,
"
.
, -
+
%
%
-
«# »,
$
. `
, -
-
$ - . 0
,
-
.
. >%
$
-
=. +
-
0
9 >
(Red Burns)
,
% .
$
. 0
,
, *
$
%
"
- %
" -
. 0
,
,
,
.
,
9
&
: «Interactive Telecommunications Program». &
, 7
(Marianne Petit),
10
&
: «Tisch School of the Arts». $
(Clay Shirky), =$$ 9
Предисловие 21
(Daniel Rozin), = (Dan Shiffman), Hebron), _ % ~
(Liesje Hodgson), ;
&$ /
(Shawn Van Every), > q (Todd Holoubek), =
=
(Benedetta Piantella), 7 (Mimi (Jeremiah Johnson),
(Craig Kapp),
Yin), /
$
% (Allison Parrish), q
(Peter Kerlin), $
>
- (Gabriel Barcia-Colombo), _ (Kacie Kinzer), 9
(Raffi Krikorian),
= (Luke Dubois),
= (Katherine = _ (Jihyun Lee), 9 7
(Rune
Dillon), *$
~$
(Nancy Hechinger), Madsen), 3 7
(Adi Marom), 2 7
%
7
2
(Marina Zurkow), -7
(Zannah Marsh), #
7 (Surya Mattu),
q (Jean-Marc Gauthier), =
3
7 (Carlyn Maw),
7 %
(Corey
(George Agudow), /
q
(Edward Menscher), 3
$ *
(Ariel Nevarez),
Gordon), 7
`
(Midori Yasuda), /
=$ * (David Nolen), 9
* (Rory
9 (Eric Rosenthal), 7 =
Nugent), 7 0
(Michael Olson), 7$
(Megan Demarest), *$
_
(Nancy Lewis),
(Matt Parker), =
9
(Dustyn
9
9 (Robert Ryan), = =$ (John Roberts), 7$ 9
(Matt Richardson),
Duane), > _ (Ben Light), 7
/
9 (Paul Rothman), 7
(Marlon Evans), ; Z (Tony Tseng), >
# (Maria Paula Saba), = (John
(Brian Kim), q
# (Gloria Sed), Schimmel), 7
(Michael Schneider),
7$ >
(Matthew Berger), -3 ' q
$
(Greg Shakar), (Yining
(Yen-An Chen), 3 3
% (Ahmad Arshad), Shi), / 2
(Andy Sigler), $ # (Peiqi
= = = (Dante DelGiacco) 3 Su), = # (Deqing Sun), =
; (James
q
(Anna Gallagher)
Tu), ; ; (Tymm Twillman),
&
- (Karl Ward), 3
&
(Antonius
- Wiriadjaja), 9 (Rosalie Yu) Z
, ' (Jingwen Zhu).
-
,
. =
$
-
,
7
-
-
-
,
-
. $
9 (Casey Reas) > [
(Ben
$ . Fry)
-
#
% -
,
Processing
: = 3 (Jamie Allen), 7
"
Processing (processingfoundation.
> (Mustafa Bagdatli), 7$ >
org).
p5.js,
-
(Matthew Belanger), + > (Ithai _
7
(Lauren McCarthy),
Benjamin), =$ > (David Boyhan),
$ -
$
>
(Caroline Brown),
,
#
(Gabriela Gutierrez), 7
~$
$ ,
(Meredith Hasson),
~
(Patrick
22 Предисловие
, %
+
13 +
Arduino
14. #
7
~
(Mark
. Hansen) 7
% (Michael Krisch)
Z
>
#7+
`
-
15
-
",
.
*
,
, $ .
, — $ * 2
(Nathan Seidle) Spark Fun, _
[
(Limor +
$ -
Fried) [ ;
/».
(Jonathan Cohen)
- #
(Sarah Johansson), >
. #
(Benedetta Piantella) =
=
=
0
(Giorgio Olivero) = (Justin Downs) Groundlab; 7
~$
(Jody Culkin)
, (Meredith Hasson), 3
$ *
(Ariel
$ . Nevarez) * (Nahana Schelling),
; 3
(Timo Arnall), /
#
7
- 7
(Elnar Sneve Martinussen), =
,
- (Jrn Knutsen), 7
>
«+
» (Mustafa Bagdatli), [
q
(Frances
11, Gilbert) and = (Jake),
0
«Z
#7+
» (Pedro Oliveira) # ' (Xuedi Chen). 3
_
-3- ' ,
,
12,
«+
- ; (Tali Padan)
.
»
0
, +
13
&
: «Interaction Design Institute Ivrea».
14
&
: «Copenhagen Institute of Interaction Design».
11 15
&
: «Royal College of Arts». &
: «Brown Center for Media Innovation at Co-
12
&
: «University of California in Los Angeles». lumbia University».
Предисловие 23
#
= q
(Giana Gonzalez), 0
MAKE, =$ =
(Younghui Kim), =
(Dale Dougherty),
,
7 (Jennifer Magnolfi), =- 7
% -
(Jin-Yo Mok), 7$
(Matt Parker),
,
/
(Andrew Schneider), q
- . 9
-
_ (Gilad Lotan), 3 (Angela
>
=
(Brian Jepson) -
Pablo), =
>
(James Barnett),
= ~
(Patrick Di Justo)
$
7
*$ (Morgan Noel), _% 16
. # [ -
7
%
-
(Scott Fitzgerald)
.
,
" "
-
#
,
%
. 3 *$
- (Nancy Kotary), X
(Katie Wilson)
: 7 (Michael Shiloh), 7 ; _
(Lillis)
~
(Mikal Hart), 7 7
(Michael
. >
~
Margolis), #
(Paul Stoffregen), (Sherry Huss) Maker Faire $
3
7 (Adrian McEwen), 3
-
%
-
>
(Alexander Brevig), 9 7- . & " ,
-
(Ryan Mulligan),
(Keith MAKE. ;
Casey), > (Bonifaz Kaufmann), «# >».
3
q
(Andreas Goransson), ~ -
>
(Helena Bisby), 7 3
#
,
-
(Michael Adams), =$ q
(Joel
, -
Gahwiler). 9
[ (Robert Faludi)
-
,
,
,
$ ,
". =
«Digi International»
- ~$ (Denise Hand), > _ (Ben Light),
XBee and Digi. ` ;
(Clive Thompson), = ~
Lantronix: (Joe Hobaica), 7
X (Max Whitney)
q
7
(Garry Morris), q$
7
=
7 (Jennifer Magnolfi)
-
(Gary Marrs) = / $
(Jenny $ .
Eisenhauer).
#
,
-
= # (Geoff Smith),
~
%
-
(Chris Heathcote), =
0
-
$
: bookquestions@oreilly.
com.
Глава 1
СРЕДСТВА
Happy Feedback Machine1, созданная Туаном Анхом Т. Нгуеном (Tuan Anh T. Nguyen)
0
,
$
,
"
"
. 0 ,
$
, —
, %
,
",
"" , .
1
/
: «7%
».
28 Глава 1
+
-
.
—
!
-
,
. *
. / ,
:
,
-
, , - "
,
%
. ,
. 7 -
,
-
. [
>... ;
— -
. +
-
-
,
,
.
. /
% ,
- %
. +
-
, % $
,
-
,
,
, %
-
. &
- $ ,
-
,
"
,
$ -
.
,
,
%
,
* ,
— %
"
. # , - -
,
"
$
$
,
-
.
"
-
. 4
# "
—
-
: ,
,
,
. &
$
. *
-
"
, ,
,
—
-
%
-
"
" . *%
- $
,
-
,
.
,
.
,
-
,
, $
$
-
,
, % .
-
Средства 29
—
"
-
USB, MIDI
USB-
% %
HID (Human Interface Device,
-
. =
-
) —
, $
. =
-
,
, %
-
. #
— Ethernet
-
-
TCP/IP —
,
-
. 3
(
),
(
%
-
-
)
. ,
-
"
-
-
"
-
" ,
-
.
"
.
$ ,
-
$
" $
,
.
,
, —
-
-
, -
,
. X,
—
"
-
-
( -
,
. *
,
"
$ -
, — $
),
-
- %
%
.
,
.
;
,
-
% ,
" -
,
,
-
,
"
—
$
:
, -
$
(
)
"
. ;,
-
" $
"
-
30 Глава 1
- 3. #
,
-
,
- ", -
, —
%
.
. ~
,
" -
%
%
- 7
-
,
-
,
-
,
"
%
. +
, -
:
"
-
-
%
-
.
,
&
,
. + $
-
Arduino Uno,
"
, "
-
Arduino
-
,
-
$ .
,
% , " %
2
-
.
, -
-
;
,
, —
, Raspberry Pi.
$ , —
, - ~ % $
"
,
, ,
" ,
. /
% $
-
,
.
$
. &
-
-
"
"
,
-
%
:
,
$ , —
. /,
1.
-
,
-
,
"
-
:
,
,
, $
%. 9
,
— $
-
,
$
.
,
-
"
2.
-
. _
,
-
. = $ %
,
" $
$
-
-
.
.
Средства 31
>%
,
"
,
-
,
,
-
, %
.
.
$
~
,
-
,
%
-
. ; ,
$
.
,
, -
# "
— $ ,
—
:
,
- —
-
,
. .
.
*
; ,
,
- #% —
,
.
"
%
, - q
, -
,
,
- ,
, %
-
" $
"
% -
,
% , .
%.
$,
- % $ ,
(
,
%
-
%
),
-
" ,
-
"
:
" % ,
$ . 0
" -
?
% % ,
;
, ,
? ,
, $
% ,
;
. 0
"
,
?
.
;
?
" .
Никогда не предполагайте
#%
% , , -
Слушайте больше, чем говорите ,
. +
$
# %
%,
% — $
%
% .
$
32 Глава 1
. 4
, % . 3
,
"
.
,
$
,
-
. *
-
Установите правила обмена
%,
- информацией
" ,
- &
% %
-
.
" ,
" -
#
, . 7
$
% . , %
,
-
,
" ,
,
- ,
.
% %. >%
%
-
. &
, - "
,
" «2
,
. +
-
!»,
. =
-
,
-
$
"
-
"
"
.
-
—
,
-
"
"
,
.
,
" -
*
" - . 4
— %
,
-
,
%. = %
$
,
-
,
$
- . *
,
%
-
. +
,
%,
%
- -
,
,
,
. *
, -
. ` -
,
,
%
" -
-
,
,
- ,
"
-
.
" .
* ,
$
,
Попросите разъяснений
%
.
,
"
-
$ ,
-
.
Инструментарий
Учитывая, что в дальнейшем вы будете иметь дело с физическими, программными и электриче-
скими интерфейсами объектов, вам потребуются «физические» инструменты, программное обе-
спечение и компьютерное оборудование.
. 1.1
-
. X
,
- . 1.1
"
-
$ . ; —
,
-
—
". *
" ( - -
$
.
. 1.1). 0
-
" —
-
. 4
,
-
,
$
-
$ .
. 0
-
. 1.1
&
-
"
". ,
$ .
7
,
" ;, ,
,
-
$
- ".
-
-
"
$
".
.
34 Глава 1
8 10
7 9
6
18
11
16
1
12
34 15
5 13
19
3 33
4 31
25
2 32
24
27
29 28
30
14
17 26 20 21 22
23
Рис. 1.1. Инструменты и детали, используемые в проектах этой книги. Их краткое описание дается далее (обратите внимание:
после указания поставщика приводится номер детали по его каталогу)
1.
. = %
3.
. +
, -
,
. Jameco: 2214889;
Hakko FX-888D, Adafruit: 148; Farnell: 1792724.
Weller WLC-100 SP
-
4.
, -
$
-
,
. *
%
. *
-
«
»,
.
. /
,
,
%
-
$ -
$
,
.
$.
": Digi-key (www.digikey.com): 1691-
1083-ND; Adafruit (www.adafruit.com): 1204; ?
: Jameco:
Farnell (www.farnell.com): 2320747. 159291; Farnell: 609195; SparkFun (www.
sparkfun.com): TOL-12630;
2.
. _%
21.23 AWG2. 4
, - ?
: Jameco: 161411; Farnell: 3125397;
,
SparkFun: TOL-10447;
. Jameco (www.jameco.com): ? !
: Jameco: 217891; Farnell:
2210116; Farnell: 419266. 3127199; SparkFun: TOL-08793.
2
AWG, American Wire Gauge System —
- 5. "
-.
-
(
). -
—
-
.
: http://ru.wikipedia.org/wiki/
- . 0
.
_
_
. Jameco: 127271; Farnell: 4431212.
Средства 35
6. #$
. 9
Adafruit: 80; Digi-Key: 1568-1237-ND; Jameco:
,
- 2207056; Farnell: 1650675 1737256.
. SparkFun: SWG-11046;
13. <
-
(LiPo) . =
Farnell: 1696193.
$
-
7. «% ». /
(
-
- )
LiPo —
-
. Jameco: 681002; Farnell: 1367049;
SparkFun TOL-11784. . 0
%
,
, -
8. "
. *
-
. ~ ,
-
3,7 &
800–2000 3.
, ,
SparkFun: PRT-13813 PRT-08483; Adafruit: 258
$
. Jameco: 220759; Farnell:
2011.
7430566; SparkFun: TOL-12966.
14. USB-
. =
$ -
9.
&.
-
USB- 3--B (
-
, DSO Nano
USB- ), A---B
% $100 —
-
(USB- ,
-
. SparkFun: TOL-11702 (v2); Seeed
Studio (www.seeedstudio.com): 109990013;
). SparkFun: CAB-00512, CAB-13244; Farnell:
Adafruit: 468. 1838798, 2444222.
10.
9–12 '. 0 15. %
)
. * «
». X
—
-
- $
. — $
-
&
- . Jameco: 10444; RS (www.rs-online.com):
,
- 161.6511; SparkFun: PRT-12978.
- 16.
. >%
, "
«
-
, ». Jameco: 135299; SparkFun: CAB-00501.
%
17. =
USB/TTL-Serial.
2,1 % — 5,5 (
. -
USB-
TTL. /
-
11), $ %
-
-
"
.
. SparkFun: DEV-14050 DEV-12935; Adafruit:
Jameco: 170245 (12 V, 1000 mA); Farnell: 1176248
3309 284; SeeedStudio: 317990026.
(12 V, 1000 mA); SparkFun: TOL-00298.
18. "
. *
. 1.1 -
11. () (+)
-
Arduino Uno,
2,1 % — 5,5 .
Arduino 101 Arduino MKR100. SparkFun: DEV-
/
-
13787; Digi-Key 1660-1003-ND 1659-1005-ND;
RS: 913-9999 124-0657. ;
. https://store.
. 9
arduino.cc.
,
,
19.
>. *
. 1.1
$ .
%
Raspberry Pi Zero W,
- Pi 3 BeagleBone Green. SparkFun DEV-13825;
"
. SparkFun PRT-10288; Adafruit: 3055 3400; Seeed Studio: 102010048
Jameco: 159611; Digi-Key: CP-024A-ND; Farnell: 114990584 RS: 896-8660; Farnell: 2525225.
3648102. ;
. www.raspberrypi.org.
12. ()
« ». / 20. (
A
. 9
-
,
-
. SparkFun: PRT-09518;
,
36 Глава 1
Программные средства
,
"
:
-
=
, %
, $
,
-
,
—
%
- Processing.
, -
.
,
Processing
Java,
Processing
Среда Processing Java. #
-
0
,
macOS, Windows Linux. #"
$ ,
Processing Android. 4
, -
Processing. /
-
Processing,
-
,
- $
-
-
www.processing.org. #
-
Processing
Java
-
,
,
-
.
-
. 2
Processing
; , Processing —
,
. 0-
-
,
. 1.2.
``Окно редактирования.
Сюда вводится код скетчей
``Панель консоли.
Здесь выводятся предупреждения
и сообщения об ошибках
Пишем код
;
%
- println("
, !");
Processing. & -
"
, Run
(+
) —
Processing.
40 Глава 1
*
, $
-
. &
,
-
. 9
. +
$
- Processing
-
: #,
! - «
», " .
.
,
.
,
"
"
,
-
Processing
$
(sketch),
Java.
,
$
-
-
.
Processing
Пишем код
9
- /*
,
-
: Processing
.
.
Processing. */
void draw() {
// '- #:
redValue = random(255);
greenValue = random(255);
blueValue = random(255);
// $ # :
stroke(redValue, greenValue, blueValue);
//
// ( ):
if (mousePressed == false) {
//
triangle(mouseX, mouseY, width/2, height/2, pmouseX, pmouseY);
}
Средства 41
_
Processing
(
): setup()
. +
, $
draw(). 7 setup()
,
-
,
- ,
, —
-
.
$ -
,
. .
3 draw() —
, . *
,
"
, - byte
, int —
.
. . ,
$ ,
-
=
Processing
,
. &
-
, $
redValue, greenValue
blueValue — " (float), . .
.
" -
. =
Java JavaScript,
,
-
Processing
, $:
#.
,
(
? int —
; void — . .
? char —
"
-
ASCII; ). &
-
, -
? boolean — true (
)
false ();
. X
(if-then),
(for-next), -
? string —
;
#.
? byte — . 2
for-next,
$ -
`
Java,
,
.
Processing -
3
for-next for (int myCounter = 0; myCounter <=10; myCounter++) {
" println(myCounter);
:
$ .
=
-
New
File
Processing.
42 Глава 1
for myCounter = 0 to 10
Print myCounter
next
'
-
,
:
ssh _$@_-.com
9
,
_$-
_-.com
(_$)
-
(_-.com)
.
&
,
-
-
, -
.
Средства 45
В Windows
2
PuTTY (
. 1.3). &
-
-
(_-.com)
ssh. /
Host Name,
Connection
,
% -
type
SSH
%
-
Open. 2
, " . $
"
%
$ .
.
,
" :
. &
$ -
:
Last login: Wed Feb 22 08:50:04 2016
from 216.157.45.215 total 44
[userid@myhost ~]$ drwxr-xr-x 13 igoe users 4096 Apr 14
11:42 public_html
/ ,
- drwxr-xr-x 3 igoe users 4096 Nov 25
2005 share
,
$
. /
,
= , -
"
" ,
. = $
" :
:
?
$
(
:
$ pwd drwxr-xr-x)
%
$ : ,
/
;
print working directory,
?
$ (13)
«
». 0
$
"
;
. (7 POSIX
- ?
$ (igoe)
— . #
,
(users) —
,
-
;
.) &
? $ (4096)
& %
-
-
,
(d —
%- directory),
% (-
,
html pub-
)
-
lic_html, —
" HTML
(r — read),
-
"
. 4
% -
(w — write),
,
" (x — execute). 9
-
mkdir:
% :
% . &
-
nano — $
,
%
(-w)
(g —
, $
group)
(o —
%
-
others),
. 3
"
" -
,
- ,
,
-
:
. * %
nano .
$ chmod go+wx _%
'
" nano ,
" :
,
chmod u (user), g — $ nano _%
.txt
(group), o —
(others). 7
, r
% 0
(
. 1.4).
(read), w —
(write), x —
2
" node.js
Платформа node.js
https://nodejs.org/en/
>%
-
$
. 2
-
(
-
,
"
) node.js, "
, :
JavaScript.
$ node –v
JavaScript
-
-
, - & $
-
"
" :
-
,
v6.9.5
HTML6. &
/
"
-
-
. & 2009
node.js,
.
9 = (Ryan Dahl)
-
$
Joyent
%
node.js 6.9.5, $
-
JavaScript
- %
$
,
node.js.
node.js. &
$
%
, % Установка набора
.
средств разработки
&
,
- =
node.js
-
node.js
,
"
-
-
. ;
,
,
$
-
-
7. /
8 (
-
). = -
,
-
Windows %
$
-
.
node.js
-
-
-
Microsoft Visual Studio, macOS —
%
XCode.
+
. '
Visual Studio ,
"
-
$ , %-
Community Edition.
- 2
,
-
. ,
: www.visualstudio.com/
downloads/.
&
Processing,
XCode
-
node.js
"
-
Mac App Store.
$
. 9
"
. XCode
. / -
6
HTML, HyperText Markup Language —
-
,
" :
. $ xcode-select --install
7
2
$
,
,
node.js.
— PHP,
-
8
-
—
, Apache. 0 . toolchain.
Средства 51
Пишем код
+,
node.js
console.log("Hello world!");
. 2
-
,
" :
hello.js
.
2
- $ node hello.js
,
-
. 2
-
, :
&
$ Hello world!
$
"
:
" , %
- -
HTTP10.
Processing9, ? & $
-
HTML,
,
-
$ -
. *
, % -
Веб-сервер на node.js
, "
,
-
node.js
-
%
-
,
-
. #
" %
-
. (. .
) ,
" $
-
.
& — $
,
-
, -
HTTP,
-
.
-
3,
-
node.js.
9
,
10
node.js
, $
HTTP, Hypertext Transfer [Transport] Protocol —
«2
,
!»
.
.
Пишем код
#
% -
simpleServer. 2
-
,
-
server.
js simpleServer.
9
,
, -
"
node.js:
52 Глава 1
2. 0
var server = express(); // $ " server,
: // $ express
3. 0
// % #', $
: // $ :
function respondToClient(request, response) {
console.log("got a request"); //
//
// :
response.writeHead(200, {"Content-Type": "text/html"});
response.write("Hello, client!");
response.end();
}
$
'
%
-
,
,
,
hello.js,
- % <Ctrl>+<C>.
Средства 53
$
. ;
,
JavaScript
. / ,
, JavaScript (,
,
node.js)
" ,
%
-
. / ,
- .
-
!,
-
—
"
, -
var. 3 JavaScript
-
.
-
-
.
server.js — server.
get()
&
, JavaScript
respondToClient(),
. ;
-
, . >
-
. &
,
JavaScript,
$
-
, -
.
-
% ,
"
. &
-
.
(
%!-
) node.js express,
& JavaScript
express. [
# Java. &
,
$
- (
)
,
#
node.js &
$
:
server.js.
JavaScript
HTML5 и веб-приложения $
,
#
-
. 7
-
— HTML5 —
, -
, $
-
. 0 %
%
-
,
- ,
,
"
$
-
-
. * ,
HTML5 - ,
,
,
—
,
-
.
JavaScript
CSS3.
,
"
-
,
-
HTML5, JavaScript CSS3
,
"? X
",
,
. 9
HTML
"
,
%
-
CSS —
, JavaScript — +
,
,
,
. ` HTML
.
$ :
, &
-
! ,
,
$ ,
. 0
-
"
,
+
, $
%
-
-
:
, ,
%. ~
. ., — HTML
,
"
" DOM11.
-
CSS
-
.
$ : , %
, &
,
%
"
. & " ,
,
,
,
,
%
,
-
,
-
" : HTML-
-
index.html
%
,
. libraries
p5.js
%
(addons): p5.dom.js (
-
Библиотека p5.js DOM HTML-
)
-
p5.sound.js (
-
"
node.js, - ). &
-
, sketch.js — ,
"
-
.
. =
$
-
HTML '
p5.js
" JavaScript. #"
- (
JavaScript)
-
JavaScript
HTML-
,
-
.
-
<script>,
,
-
. /
. ; , URL-
-
Processing,
% ,
,
" -
p5.js,
. =
"
-
Processing. #
, <script>. 0
index.html
$
example-project, ,
-
.
p5.js,
12
Global Positioning System — (
)
-
.
sketch.js:
56 Глава 1
Пишем код
#
p5.js, - /*
sketch.js
M'
context: p5.js
-
,
'
" : */
function setup() {
createCanvas(windowWidth, windowHeight); // Z$ -
myButton = createButton('click me'); // Z$ :
Средства 57
#
, - myButton.touchEnded(changeButton); // % #'
//
index.html
myButton.position(10, 10); //
. responseDiv = createDiv('catch me'); // C$
//
$ div
responseDiv.position(10, 40); //
}
> p5.js
%
% (
-
,
$
).
$.
" %
(
,
)
"-
p5.js -
$
,
-
-
: https://p5js.org/reference.
. & ,
,
, $
- 7 "
p5.js -
draw(),
" .
-
+
,
USB
$
.
. '
-
"
-
-
,
. #
%
-
.
+
"
- %
, &
$
-
"
-
,
-
. 3
- . #"
%
— ,
.
- 0
-
(bulletin boards, BBS)
"
CoolTerm,
58 Глава 1
9
7
(Roger Meier),
PuTTY (
. 1.6),
,
-
-
http://freeware. ssh,
the-meiers.org.
-
. &
macOS, Windows, —
—
-
$
.
Screen (
4
%
,
GNU),
"
. /
,
-
.
OS, %
= Windows
%
-
,
CoolTerm.
-
&
, $
-
"
,
- ,
,
- $ ,
-
,
,
.
.
$
$
&
"
,
,
. 0
% -
,
,
-
$
ASCII.
'
, -
-
% <Ctrl>+<A>, —
. / (13)
<Ctrl>+<\>.
/ #
!
. &
&
"
, -
GPIO (
- . General-Purpose Input and Output)
"
-
I/O. 7
-
"
.
()
GPIO,
-
Оборудование
,
$
&
,
-
"
, "
"
,
-
. &
"
:
"
?
-
-
—
. 1.1; . 7
-
? $
,
- ,
,
"
-
:
,
(RAM14 ROM15),
-
; —
,
?
—
,
.
;
?
. =
-
8-
-
,
, -
Микроконтроллеры
"
.
8 (
). 0
4
-
$
-
,
, ,
,
"
- %
"
, — -
. &% $
,
-
" ,
,
,
$
.
—
13
%
- 0 . pin — .
14
Random Access Memory —
-
. 7
, 02X.
- 15
Read-Only Memory —
-
,
" , 2X.
Средства 61
*
32-
Arduino, Wiring и подобные
(
микроконтроллерные модули
32
)
, -
8-
. & - =
$
-
%
,
,
Arduino.
64-
, - 7 Arduino (www.arduino.cc),
-
— 32-
.
— Wiring
(www.wiring.com),
+
*
. &
- +
(Ivrea) 2005 . 0
-
PIC Microchip
ATmega Atmel (www.atmel.com),
(www.microchip.com), AVR Atmel
(www.atmel.com) MSP430 Texas
« » C/C++. / « »
Instruments (www.ti.com),
%
Processing, , -
%
IDE ( .
. #
Integrated Development Environments),
-
32-
"
"
$
"
-
%
-
" . &
,
IDE
ARM (www.arm.com). Arduino Wiring
/
$ Processing —
, - setup() loop()16, map()
.
. ,
, Intel (www.intel.
$ ,
com),
,
"
Wiring, -
$
Arduino -
,
- . &
"
"
%
Arduino
,
- %
. &
-
$
.
Basic Stamp 2
, $ . =
(BS-2) Parallax, PICAXE, Wiring,
API17,
"
Arduino ,
- Arduino Wiring, $
"
-
$ ,
" -
, Arduino Wiring,
, 16
7 draw() Processing
-
loop().
. 17
API, Application Programming Interface —
.
62 Глава 1
2
3
1
4
15
16 14
11
13
12
10
5
9
7
6
8
Рис. 1.8. Несколько как уже устаревших, так и актуальных сейчас моделей плат Arduino и ее клонов, Wiring и прочих:
1. Arduino Uno. 2. ATtiny85. 3. LilyPad Arduino. 4. Wiring. 5. Arduino Due. 6. Arduino Pro. 7. Arduino c.2005. 8. Arduino c.2006.
9. Arduino Fio. 10. Arduino Micro. 11. Arduino MKR1000. 12. Adafruit Feather Huzzah! 8266. 13. SparkFun 8266 Thing. 14. Arduino
Leonardo. 15. Red Bear BLE Nano. 16. Arduino 101
,
,
$
. ; , $
. *,
" , $
Arduino, - ,
-
. =
,
%
$
-
.
,
.
&
$ -
-
%
,
" -
Arduino IDE 1.8.2 -
32-
,
-
www.arduino.cc.
.
Arduino Uno,
- 3
" ,
- Arduino, Wiring
Wiring S
" 8-
,
-
Средства 63
",
,
,
-
"
-
. 3 ,
,
( #) "
. *
%
-
. 0 "
-
%
,
-
%
,
— Python JavaScript,
-
"
-
. '
. 32-
-
$ ,
2
(
-
Arduino-
ARM)
,
-
.
% $ . 7
ARM
-
0
%
Arduino
, MicroPython, BBC Micro Bit,
Wiring — $ ,
- Espruino NodeMCU. +
Python
Windows, macOS JavaScript,
Linux, —
- $
.
. =
$
- 0
-
%
. ; ,
"
-
Processing
. ;
Java,
,
,
IDE Wiring Arduino,
-
%
-
C/C++,
"
C — AVR-C. =
-
. MKR1000,
$
Arduino 101
"
$ .
—
Ethernet (Wi-Fi)
Bluetooth LE18
. #
3
Arduino
-
"
-
-
—
,
«Getting Started with Arduino» ESP8266 Espressif
(
O’Reilly),
7
Wi-Fi, BLE Micro BLE Nano
> (Massimo Banzi). RedBear Labs — Bluetooth LE. 4
-
,
-
Другие микроконтроллеры
-
&
-
.
$
.
$
- Функциональные возможности
" $
микроконтроллеров
:
- 7
— $
% -
- %
. + -
%
,
"
,
,
. 18
LE, Low Energy —
$
.
64 Глава 1
а Arduino 101 б
Рис. 1.9. Функциональные части плат Arduino 101 (а) и MKR1000 (б). Обратите внимание, что номера функциональных
выводов — т. е. аналоговый А1, цифровой 2 и т. п. — не соответствуют номерам физических выводов платы. В технической
документации обычно имеются в виду номера функциональных выводов, а не физических
*
, Adafruit
Huzzah! ESP8266 breakout
Feather Huzzah! ESP8266 % board ESP8266 Thing
Huzzah! ESP8266 breakout
USB/TTL-Serial. 4
-
board. 3 SparkFun
,
, Feather
ESP8266 Thing ESP8266 Thing Dev Board Huzzah! 8266 8266 Thing Dev Board.
. # Feather Huzzah!
ESP8266 ESP8266 Thing Dev Board
&
"
,
-
, $
-
USB. 3
-
.
Шилды Arduino
0
Arduino,
#
$
,
-
-
%
,
(shield),
-
. &
$
-
Arduino
. &
%,
Arduino %
. *
. 1.10
-
,
%.
% . & %-
* $ ,
$
%,
-
Arduino Uno rev3
, -
. = %
-
,
%
Arduino $
— Arduino 101,
,
"
%,
MKR1000.
-
. + "
% 0
! * %
-
-
. 0
Arduino.
,
, " " -
5 & 3,3 &. $,
$
. +
%
,
-
%
%
-
www.arduino.cc. ,
,
.
``Панель инструментов.
Самая правая дальняя кнопка —
Монитор порта (Serial Monitor)
``Окно редактирования.
Рекомендуется установить
флажок Показать номера
строк (Numbering) в меню
Настройки (Preferences)
``Панель консоли.
Здесь выводятся предупреждения
и сообщения об ошибках
Пишем код
Processing, /* &
: Arduino
Arduino
'
.
. = */
%
: void setup() {
pinMode(LED_BUILTIN, OUTPUT); // %
// -
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // '
//
delay(500); //
digitalWrite(LED_BUILTIN, LOW); // '
//
delay(500); //
— }
Менеджер плат 2
-
7
,
- .
$
-
%
Arduino IDE.
%
,
'
,
. =
$
-
(
"
" A
Arduino IDE, - L25)
( Arduino 1.6.6
. &
-
)
$
«2
,
!».
| | " A
.
&
%
Программа не работает
. 4
, - 4
-
-
: N . &
-
,
"
". 7
N .
Learning -
Arduino (www.arduino.cc/en/Tutorial).
=
-
,
Arduino (www.arduino.cc/forum)
%, -
,
—
(URL)
"
-
".
Arduino IDE. *
,
ESP8266,
~
-
\ | ]
/
, $
-
!
" A
.
,
-
= ESP8266
: http:// ,
LED_BUILTIN,
arduino.esp8266.com/stable/package_esp8266com_
,
index.json. 2 OK
-
-
.
$ . *
, Arduino 101
Uno
-
. ;
-
13,
.
MKR1000 6. 0
&
LED_BUILTIN
,
,
-
,
.
%
"
%
" -
. &
-
"
+ . ;
—
, , $ ,
#,
"
.
-
2
.
-
.
%
" 25
0 . L, LED —
.
70 Глава 1
Пишем код
&
"
- /*
:
: Arduino
&
;
-
# . '
, -
.
,
" */
,
-
- int inByte = 0; // - -
// -
$
long blinkTimer = 0; // ,
—
// '
- int blinkInterval = 1000; // '/' —
. //
). +
.
),
-
(10 0
).
. *
. 1.13
- /
#
!
-
. 7 « »
Arduino $
. ,
,
-
, —
.
Базовые схемы ввода/вывода & $
-
&
$
- #
. %" "
-
. 4
-
,
.
$
. 7
-
,
$
, -
. 1.14,
-
,
. =
(
-
- ) . 3
, $
: " ,
—
,
-
- —
,
"
.
.
К общему
5 5
Входное напряжение
К цифровому вводу 10 10
микроконтроллера Кнопка
К цифровому вводу
микроконтроллера
15 15
Понижающий
резистор
20 20
25 25
A B C D E F G H I J
К плюсу 1 1 Входное напряжение
К общему Переменное
сопротивление
5 5
(светочувствительный К аналоговому
резистор) вводу
микро-
К аналоговому вводу Постоянное
10 10 контроллера
микроконтроллера сопротивление
15 15
Входное напряжение
К аналоговому вводу
20 20
микроконтроллера
К аналоговому
Потенциометр вводу
25 25
микроконтроллера
30 30
A B C D E F G H I J
Рис. 1.15. Ввод в микроконтроллер аналогового сигнала: общий вид макетной платы (слева); справа показаны принципиаль-
ные схемы двух способов получения входного аналогового сигнала: с использованием в делителе напряжения светочувстви-
тельного резистора (вверху) и с использованием потенциометра (внизу). Эти сигналы можно подавать на два разных контакта
аналоговых вводов микроконтроллера
Аналоговый ввод
# ,
. 1.15, - . *
-
. & $
-
% -
, $
. *
,
-
,
—
-
74 Глава 1
- &
. 1.15 (
!) -
.
,
-
3
-
.
,
,
1 2 0 (
,
"
-
),
-
.
$
2/3 .
"
4
-
-
-
. &
, -
,
"
"
— $
,
- . 4
-
,
— " ,
" -
. +
.
:
,
-
, , . . &
"
-
, $
, -
.
%
$
-
-
,
-
,
$
. 0 ,
,
-
/,
. 0
-
, -
— Wi-Fi,
,
,
. . + $
-
,
-
,
. & -
%
. & $ -
-
-
Raspberry Pi
%
.
Linux,
Windows 10,
-
? -
=
USB/TTL-Serial. /
- Внимание!
- '
%
-
, "
. *
,
Raspbian, " -
,
1
2017 ,
"
. =
, -
USB/ $
,
-
TTL-Serial Raspberry Pi (ID: 954) - MicroSD
,
FTDI Friend (ID: 284) -
"
Adafruit; config.txt
" :
USB 2x
GPIO
-
,
—
-
%
. 4
%
%-
DSI (DISPLAY)
USB 2x
DHCP ( %
-
%
$
CSI (CAMERA)
. '
-
:
Wi-Fi,
"
:
$ sudo wpa_cli
$ sudo iwlist wlan0 scan
* $
" О команде sudo
Wi-Fi
"
. &
POSIX sudo
-
&
"
%
$
,
"
,
scan less,
-
(
:
!). *
-
,
sudo,
$ sudo iwlist wlan0 scan | less
. & %
, -
wpa_cli
-
=
"
,
%
,
%
-
%
. *
Raspberry Pi %
— % <q>.
sudo.
X
— ifconfig iwcon-
fig —
. *
,
ifconfig
- * $
(
- wpa_cli,
"
:
: InterFace CONFIGuration). 3
Selected interface 'wlan0' //
$
: eth0 wlan0 — - // %
'wlan0'
:
Interactive mode // \
//
Ethernet
>
29. /
-
, # >
% -
, - . &
" :
Wi-Fi. = $
%
add_network
"
Raspbian
, "
&
,
-
wpa_cli.
:
29
WLAN — Wireless Local Area Network. 0 >
80 Глава 1
/
,
- Проверка сетевого подключения
. = : с помощью curl
> set_network 0 ssid "_SSID" _
-
> set_network 0 psk " "
—
Wi-Fi — -
&
_SSID
.
Wi-Fi
. 4
-
-
,
-
-
, %
-
" :
> set_network 0 key_mgmt NONE
curl. /
-
-
2 :
. 2
,
-
> enable_network 0 // " :
//
> save_config // Z- $ curl http://www.example.com
// % #
;
,
% Raspberry & $
Pi
- HTML,
-
$ "
:
. '
%
wpa_cli, quit. <body>
,
<div>
,
" <h1>Example Domain</h1> (
)
ifconfig wlan0 iwconfig wlan0, - nts. You may use this domain in
. * $
ifconfig - examples without prior
Pi, coordination or asking for
permission.</p>
iwconfig —
.
( $
- $
$.)
Подключение к одно- <p><a href="http://www.iana.org/
платному компьютеру по ssh domains/example">More
information...</a></p>
, -
(( %#...)
-
ssh. = $
, </div>
- </body>
" ifconfig. 0
</html>
ssh _
$@xx.xx.xx.xx. 2
;
,
-
_$
, -
. = Raspberry Pi $ pi,
, % Raspberry Pi
— root. 3
xx.xx.
xx.xx
- +
. curl
" -
. *
, Pi
-
,
192.168.0.23 $ , -
,
— . .
: ssh pi@192.168.0.23.
-
HTML-. '
-
%
,
, URL-
,
-
.
.
Средства 81
+
- #
node
"
-
node (npm)
node.js. =
-
:
,
Raspberry Pi. $ sudo ln -s /home/pi/.nvm/versions/
node/v6.9.5/bin/node/usr/bin/node
$ sudo ln -s /home/pi/.nvm/versions/
# "
apt (
- node/v6.9.5/bin/npm/usr/bin/npm
Raspbian)
- * ,
Processing:
:
$ curl https://processing.org/download/
$ sudo apt-get update install-arm.sh | sudo sh
X
node.js:
. ;
,
Pi,
$ sudo apt-get remove --purge node* npm*
,
-
# "
curl
.
node (nvm):
$ sudo curl -o- https://raw.githubusercontent. * $ $
:
com/creationix/nvm/v0.33.1/install.sh | bash $ sudo poweroff
&
,
" -
:
, ,
-
$ sudo logout raspberrypi login: pi
.
Операционные системы
,
. &
, $ -
и «реальное время»
,
,
&
- - , -
,
, $
. / ,
100%
. '
$
-
,
-
. /,
, , $
-
,
, ,
:
,
-
—
(0#9&)31.
%
$
. ;
/,
%
-
% "
-
. 0,
,
,
/,
. 0
-
% . &
— $
,
-
0#9&
-
. ; -
-
#
!, .
:
-
- Arduino 101
,
-
-
%
—
. 0#9& ,
-
SD-
, !
/
-
(>#&&)30,
- ,
,
,
$
.
.
2
! !-
,
% >%
0#9&
%
,
"
"
. 0#9&
"
Arduino 101
-
.
% , -
, Bluetooth
,
-
-
, %
- .
-
-
$
,
/. ;
«
-
/.
».
4
- Сетевое время
, $
- 7
0#9&
%
-
,
,
, -
,
-
30 31
0 . BIOS, Basic Input-Output System. 0 . RTOS, Real-Time Operating System.
Средства 83
-
. .? >%
,
"
-
%
. *
,
,
"
%
.
:
,
,
-
" ,
,
+
, % -
%
. &
-
. =
" .
%
, 2% ,
,
- %
0#9&. =
%
,
% -
-
,
-
-
,
. 2
,
,
-
.
"
- & +
"
?
"
-
,
,
&
-
"
-
. X
-
,
-
.
-
,
,
0
"
-
. =
% -
%
,
-
- %
-
. *
%
. /
-
,
$
. &%
%,
"
,
-
. 0
Работа с осциллографом
Большинство проектов этой книги содержат схемы, которые отслеживают меняющееся во вре-
мени напряжение. Независимо от выполняемой микроконтроллером операции: будь то отсле-
живание состояния цифрового или аналогового входа, управление скоростью электродвигателя
или отправление данных на персональный компьютер — он или считывает или генерирует из-
меняющееся во времени напряжение. Частота событий, с которыми работает микроконтроллер,
настолько высокая, что она находится вне диапазона человеческого восприятия. Например, при
последовательном обмене, который мы недавно рассматривали, импульсы электрического тока
подаются со скоростью 10 тыс. раз в секунду. Эти колебания тока невозможно определить с по-
мощью мультиметра. Для этого требуется осциллограф.
0
— $
-
$
,
-
. =
,
$
. 0
-
1 7q,
(
%
-
%)
(
- . *
. 1.18
,
-
Nano «2
,
»
%). ;
Arduino.
—
.
-
,
,
,
—
-
,
- . &
%
-
%
200
(
). %,
— 1
%. 0 "
-
4"
" (« »)
%
, - Arduino,
—
1,
"
"
. +
.
DSO Nano, -
Seed Studio (
. 1.18).
,
$100 $
Logic -
%
- Saleae (www.saleae.com) -
$
$
. ~ -
-
- . *
,
,
"
" -
Средства 85
*
*
" —
,
/
-
. * , -
.
,
" %
, ,
,
,
,
,
,
%
. &
, . # , -
-
$
,
-
.
. $
, -
-
,
-
,
" -
-
. +
$
. &
, - , %
,
%
,
, , -
.
$
-
. + ,
*
,
,
% "
,
. *
,
$
, -
-
,
- «% ». *
-
. =,
,
" $
, %
. &
-
-
,
" %
.
. +
,
- X
-
%
,
- ,
% -
" , -
,
%
, %
, -
. /
",
. &
,
,
,
.
" "
"
, — $ % " -
-
.
— $ %
% ,
- -
.
Глава 2
ПРОСТЕЙШАЯ СЕТЬ
Рис. 2.1. Новые компоненты для проектов этой главы: 1. Компоновочный корпус. 2. Литиево-полимерная батарейка.
3. Батарейка типа «Крона», 9 В. 4. Контактный разъем для батарейки «Крона» 9 В с разъемом питания. 5. Небольшая мягкая
игрушка по имени Мартышкин. 6. Мячик для настольного тенниса. 7. Трехцветный светодиод. 8. Датчики изгиба. 9. Шилды
для прототипов. 10. Кнопки. 11. Микроконтроллер ATtiny85. 12. Адаптерная плата микросхемы CH340G. 13. Адаптерная
плата FTDI Friend. 14. Адаптерная плата микросхемы CP2104 Friend. 15. Штыревые разъемы. 16. Модуль Bluetooth Mate.
17. Модуль Bluefruit EZ-Link
1
3
4
17
9
14
8
16 6
7
13
10
11
12
15
Простейшая сеть 91
, 2 +. +
-
RS: 715-4081, SS: ARD132D2P
. &
,
%
.
%=
$
,
1 +. /,
,
! 0 D: GH1344-ND SW400-ND, J: 2231822
,
- 119011, SF: COM-09337, F: 1634684, RS: 718-2213
.
(
10 , 4 +.
D: 754-1492.ND, J: 2125181, SF: COM-00105, J: 29082, SF: COM-09939, F: 350072, RS: 249-
F: 2290374, RS: 861-4290 9294
(
220 , 1 +.
C
, 1 +.
D: 220QBK-ND, J: 690700, F: 9339299, R: 707-
D: 438-1045-ND, J: 20723 20601, SF: PRT-
7612
12615 PRT-12002, F: 4692810, AF: 64,
C
, 1 +. SS: 319030002 319030001
D: 438-1045-ND, J: 20723 20601, SF: PRT-
>.
12615 PRT-12002, F: 4692810, AF: 64,
]=
=
-
SS: 319030002 319030001
-
>.
. ; ,
"
.
]=
=
-
]+
+
"-
- +
, 1 +. ( —
. &
$ -
).
Arduino — $ % USB.
*
,
% . ПРОЕКТ 3. Беспроводной
"
, 1 +. 7 мартышкин пинг-понг
.
#+
«"+
-
»
2.
ПРОЕКТ 2. Мартышкин пинг-понг
C 9 '
)
(Monski Pong) )
, 1 +.
"
, 1 +. = $ D: 1568-1237-ND, J: 2207056, SF: PRT-09518,
- A: 80, F: 1650675
92 Глава 2
"
Arduino, 1 +. _%
-
Arduino Uno, MKR1000 Arduino Для всех проектов
101.
USB/TTL-Serial. /
MKR1000 — AF: 3156, RS: 124-0657, A: ABX00004,
GBX00011 (3
4#), D: 1659-1005-ND
. * -
Arduino 101 — D: 1660-1003-ND, J: 2239331,
-
USB-A
SF: DEV-13787, AF: 3033, F: 2520713, RS: 913- USB-Mini-B USB-Micro-B. 0
9999, SS: 114990575, A: ABX00005, GBX00005
,
,
(3
4#)
USB/TTL-Serial,
.
Arduino Uno — D: 1050-1024-ND, J: 2151486,
SF: DEV-11021, A: A000099, AF: 50, F 1848687, D: 36-84-4-ND, J: 216452, SF: DEV-09716
RS: 715-4081, SS: ARD132D2P DEV-14050, A: 3309 284, SS: 317990026.
"
ATtiny84, 1 +. 4
-
$
,
.
Уровни согласования
Прежде чем мы предоставим устройствам возможность общаться друг с другом, нам нужно
определиться с основными вопросами такого общения. Эти вопросы можно разбить на пять
уровней, каждый из которых основывается на предыдущем.
? \
.
-
,
$
.
? #
-
-
,
" ? ,
$
-
? {
.
-
— $
% $
-
. X
,
"
-
? 5 &? 3,3 &? -
- "
? ,
$
.
? <
.
-
"
-
—
-
"
-
? # ,
,
-
.
1, —
0,
'
0 1
,
,
,
:
-
0, —
:
.
1, —
.
? N =.
"
0
-
? #
-
: 8, 9, 10 % ? (
. 2.3). #
-
0
?
-
? N
A
.
-
(
:
)
-
" -
.
?
" 3
-
, -
?
, -
/
"
, "
OSI1. (
) (
. 2.3
&
-
,
- :
SPI
- I2C). #
-
. %
-
(
,
). & $
-
1
OSI, Open System Interconnect,
- , $
(&0#). #
,
ISO (
ISO-7498)
,
"
1984 .
$ : Ethernet-
.
.
94 Глава 2
Направление данных
TX (Передача) RX (Прием)
Общий Общий
(«земля») («земля»)
Асинхронный обмен данными: каждое устройство использует свой собственный генератор тактовых (синхронизирую-
щих) сигналов, обмен данными осуществляется с заранее согласованной скоростью.
3,3 В
Тактовые импульсы
0В
Синхронный обмен данными (интерфейс SPI, Serial Peripheral Interface): ведущее устройство подает сигнал тактиро-
вания на ведомое устройство и инициирует обмен, подавая сигнал выбора схемы. Обмен данными происходит по смене
уровня напряжения сигнала тактирования на обратное.
3,3 В
Тактовые импульсы
0В
Синхронный обмен данными (интерфейс I2C): ведущее устройство подает сигнал тактирования на ведомое устройство, вы-
бирая ведомое по его адресу. Обмен данными происходит по смене уровня напряжения сигнала тактирования на обратное.
— $
, Arduino Uno,
USB
,
-
;;_
778 (TTL2 Serial). /
. *
—
,
" - MKR1000 Arduino 101, $
:
.
? \
. 0
,
- 0
USB
-
-
"
-
. & Arduino
-
"
USB3,
-
, RX (
Receive,
),
,
TTL. 0
" -
TX ( Transmit,
).
:
? {
. 0
. & - ? \
. USB
-
: Data+
3,3 &,
— 5 &. Data–
(+5 &
? <
. &
" ).
(3,3 5 &)
- ? {
. # Data–
1, (0 &) —
-
0. Data+,
? N =. 0 $
. /
"
9600
. =
%
,
$
— $
8 ,
-
$ .
(
4
,
).
.
? N
A
. * $
? <
. _
1
-
-
+5 & (
,
Data+) –5 & ( Data–),
" .
0 —
-
0 &.
* $ "
. +
? N =. X
-
. #
USB
,
TTL/USB-
,
-
"
TTL-
;;_. & USB
USB-
. * -
—
, 480
. 0
2 3
TTL, Transistor-Transistor Logic —
- USB, Universal Serial Bus (protocol) —
-
(;;_).
%.
96 Глава 2
,
- ? N
A
. *
-
8 ,
USB/TTL-Serial
. *
USB Arduino
-
,
. 0
-
(
$
).
,
-
%
,
-
,
-
$
$
.
&
$
-
%
" ,
USB
-
. ,
" -
,
-
. 3
USB
,
" -
,
USB-
(). TTL,
FTDI (Future Technology
Devices International),
*
,
-
www.ftdichip.com. /
Arduino
USB-,
-
-
. *
Maker SHED, SparkFun, Adafruit
% Mac OS
-
. =
: 5 &
: 3,3 & —
/dev/cu.usbmodem1441
$ . -
USB/
/dev/cu.usbmodem1461
TTL-Serial FTDI
. 2.4,
-
TTL —
. 2.5.
/dev/cu.usbmodem1471
Рис. 2.5. Распиновка разъема TTL кабеля USB/TTL-Serial компании FTDI. Кроме линий передачи, приема и питания он также
имеет линии для аппаратного управления обменом данных: RTS (Request-to-send, запрос на передачу) и CTS (Clear-to-send,
готовность к передаче). Некоторые устройства используют эти линии для управления потоком последовательных данных
4
"
—
- ? \
. =
RS-232
BASIC Stamp
2,
-
3. 5 —
, USB, ,
, « ».
" 9-
- ? {
. =
RS-
USB/RS-232 232
-
(
USB RS-232 : +3 & +25 & –3 & –25 &.
. 2.6). /
DB-9 ? <
. &
-
D-sub-9
( +3 & +25 &)
-
: RS-232.
0, ( –3 &
RS-232
- –25 &) —
1.
- , $
-
USB
"
(
) .
- ? N =. ; ,
-
. /
" TTL, — 8-
-
:
.
98 Глава 2
1 2 3 4 2 1 1 2 3 4 5
1 — +5 В 2 — Прием на ПК
2 — Данные – 3 — Передача с ПК
3 — Данные + 5 — «Земля» ПК
3 4 4 — «Земля»
USB тип A USB тип B 6 7 8 9
RS-232 (штекерный разъем)
1 2 3 4 5 5 4 3 2 1
1 — +5 В
2 — Данные –
3 — Данные +
4 — ID
USB тип Mini-B USB тип Micro-B 5 — «Земля» Рис. 2.6. Распиновка разъемов USB и RS-232
#
%
,
(
8)
—
, BASIC Stamp,
"
TTL-Serial. = -
,
RS-232?
$
,
USB/
, TTL-Serial
;;_
.
RS-232
-
. *
-
RS-232
" ,
USB/Serial. 0 -
USB, ,
, , %
,
FT232RL,
. >%
-
-
"
- FTDI. *
$
-
- PL2303), Silicon Labs (
CP2102), Jiangsu
.
, $ - Heng Qin (
CP340)
. =
-
$
RS-232. =
RS-232
-
" -
Parallax,
:
"
DB-9.
? www.ftdichip.com/FTDrivers.htm (FTDI);
+
USB/TTL-Serial ? www.silabs.com/products/mcu/Pages/
. USBtoUARTBridgeVCPDrivers.aspx
(TX) $
(Silicon Labs);
(RX)
. ? www.prolific.com.tw/US/Show-Product.
0" (« ») - aspx?pcid=41 (Prolific);
"
,
- ? www.wch.cn/download/CH341SER_ZIP.
VCC
html (Jiangsu Heng Qin).
.
- & Arduino Uno
USB/
, TTL-Serial
-
,
" Atmel 16U2,
-
,
. $ . = $
*
%
macOS Linux,
-
USB/TTL-Serial
5 &, -
USB Windows
-
3,3 &. & 1
" Windows. +
,
"
USB/TTL-
USB/TTL-Serial Arduino Uno
Serial FTDI
-
hardware/ardu-
Raspberry Pi (
.
. 1.17). ino/avr/firmwares/ATmegaxxu2
*
- https://github.com/arduino,
.
USB
-
www.usb.org/develop-
'
ers/usbfaq.
USB/Serial,
$ -
USB/TTL-Serial
.
USB/TTL-Serial
,
.
,
-
=
%
- CTS (clear-to-send,
-
. ) RTS (request-to-send,
).
$
, >%
, -
, - "
USB/TTL-Serial, — ,
-
Huzzah!
Проект 1
Управление яркостью трехцветного светодиода с клавиатуры
В этом примере мы будем управлять микроконтроллером нажатием клавиш клавиатуры ком-
пьютера. Это очень простой проект — в нем используется минимальное количество деталей, что
даст нам возможность сосредоточиться непосредственно на обмене данными.
=
,
,
- Требуемые компоненты
. =
,
;
(RGB)
" -
,
,
, , 1 %.
,
9
220 0, 1 %.
«
».
#
Arduino (
. 2.8, -
, MKR1000,
! —
/
- Arduino 101), 1 %.
Arduino —
,
"
- +
: X3
(UART), +7 (PWM).
,
analogWrite(). ;
>
, 1 %.
:"* 7,
-
.
7
, 1 %.
(
-
),
,
,
"
.
= $
220 0 « »
,
-
,
. `
$ — +7,
.
. 2.7 ( MKR1000 — $ 3,
;
5 4, Arduino 101 — 3, 5 6).
,
-
:
, -
,
, "
. %
—
$
%
,
-
( - ,
,
), (
)
. 2.8. 7
" .
-
"
. 4
-
($
%-
"
)
,
,
7
+7, %
-
.
.
102 Глава 2
A B C D E F G H I J
1 1
5 5
15 15
Модуль
25 25
микроконтроллера
ШИМ
30 30
ШИМ
A B C D E F G H I J ШИМ 220½ Ом
Общий («земля»)
Макетная плата
Макетная платассмодулем
модулемArduino 101/Uno
Arduino 101/Uno
A B C D E F G H I J
1 1
5 5
10 10
15 15
20 20
25 25
30 30
A B C D E F G H I J
Рис. 2.7. Подключение анодов трехцветного светодиода к выводам ШИМ микроконтроллерной платы:
для платы MKR1000 (вверху) — это контакты 3, 5 и 4, а для платы Arduino 101 (внизу) — 3, 5 и 6.
Общий катод светодиода подключается через последовательный резистор номиналом 220 Ом к контакту «земля» платы
Простейшая сеть 103
,
. = $- r5g3b7
,
%
&
—
. *
: "
-
?
,
,
,
% , —
: r, g b;
.
?
,
: 0 9.
Пишем код
, - /*
,
- M -#
: Arduino
, -
-
-# , r
($
- (
), g ($
) b (
)
). 3, 5 4 .
;
: /*
"
- // - :
//
' $ MKR1000.
:
// ^ Arduino 101 $
// -.
const int redPin = 3; // Arduino 101 $ 3
const int greenPin = 5; // Arduino 101 $ 6
const int bluePin = 4; // Arduino 101 $ 5
+, , " if (inByte >= '0' && inByte <= '9') {
(
) // $ -
// $ analogRead():
-
brightness = map(inByte, '0', '9', 0, 255);
" analogWrite(): // $ '
// :
analogWrite (currentPin, brihtness);
}
}
}
2
$
, -
,
, "
- . = :
"
g0r0b8
(
. 2.9).
7
. &! 7
&
-
-
"
.
:
r9 4
-
,
, ,
,
;
-
, -
. ;
:
,
r2g7
. /
%
-
,
-
.
Рис. 2.9. Значок монитора порта в панели инструментов
среды разработки Arduino
=
Arduino
IDE. _
,
,
Arduino
. ;
,
"
,
Processing.
Простейшая сеть 105
Усложняем задачу
В предыдущем проекте мы управляли микроконтроллером с компьютера, используя для этого
очень простой протокол. На этот раз уже микроконтроллер будет управлять анимацией на ком-
пьютере. Коммуникационный протокол для этого проекта будет более сложным.
Проект 2
Мартышкин пинг-понг (Monski Pong)
В этом проекте мы, по сути, создадим аналог компьютерной мыши. Ведь если рассматривать
мышь в качестве объекта данных, она будет выглядеть, как показано на рис. 2.10: есть сигналы
на входе, есть реакция на выходе.
Требуемые компоненты Рис. 2.10. Представление мыши в виде объекта данных
9
, 2 %. Вывод: 4 значения:
, 2 %. — координата Х, 10 битов
— координата Y, 10 битов
9
4 0, 4 %. — кнопка 1, 1 бит
1 2 — кнопка 2, 1 бит
>
, 1 %. Ввод:
движение Кнопки ввода
#
Arduino (
. 2.11 по оси X
MKR1000,
! —
Arduino 101), 1 %.
+
:
, , X3 (UART).
.
Ввод:
* %
%
%, 1 %. движение по оси Y
106 Глава 2
10
15
20
25
30
1
5
J
J
I
I
G H
G H
F
F
C D E
C D E
A B
A B
10
15
20
25
30
1
5
Принципиальная схема
+3,3 В +3,3 В
Показаны только задействованные выводы
+3,3 В
Резистивный датчик изгиба
сброс подача
сопротивлением 15 кОм
Модуль
микроконтроллера 10 кОм
10 кОм Analog0 4
Резистивный датчик изгиба 5
сопротивлением 15 кОм 10 кОм
A1
15
20
25
30
1
5
J
J
I
I
G H
G H
F
F
C D E
C D E
A B
A B
10
15
20
25
30
1
Рис. 2.11. Монтажные (вверху и внизу) и принципиальная (в центре) схемы проекта «Мартышкин пинг-понг». Датчики здесь —
для удобства вычерчивания — показаны с короткими проводами, но для реального проекта датчики нужно подсоединять
проводами значительно большей длины
Простейшая сеть 107
'
%
" -
,
. & %
-
(
. 2.12). 9 "
%
-
%
,
. 0
-
, -
. +
-
.
-
,
-
, —
,
%
-
%
% - . X
, -
"
.
-
+
-
,
.
—
. ~
% -
,
. —
%
-
$
,
2
. = $ -
—
-
.
. : «#
» «».
, & " ,
. 2.11.
,
-
$
%
%
. 9
-
%,
$
. &
,
-
.
%,
Пишем код
;
/*
Arduino
" , - Z $
: Arduino
. Z $ - - - -
#%- - - $.
&
Arduino —
-
':
— A0 A1
— #% 4 5
- */
9600
,
1 — - const int leftSensor = A0; //
" - const int rightSensor = A1; //
: const int resetButton = 4; // #%
const int serveButton = 5; // #%
void setup() {
- // :
,
- Serial.begin(9600);
,
// configure the digital inputs:
pinMode(resetButton, INPUT);
. pinMode(serveButton, INPUT);
}
void loop() {
// $ - :
leftReading = analogRead(leftSensor);
rightReading = analogRead(rightSensor);
;
Serial.write(leftReading);
,
Serial.write(44);
$
,
" Serial.write(rightReading);
: Serial.write(44);
Serial.write(resetReading);
Serial.write(44);
9
$
/* R $ '
% # printlin(),
$ - $
:
:
.,P,, /*
(,F,, Serial.write(serveReading);
(,A,, Serial.write(10);
),I,, Serial.write(13);
'
? &
65.
ASCII
Serial.print(),
www.
$
asciitable.com.
ASCII,
-
" Serial.write()
,
$
«
» .
-
7
(
- —
(«
») -
)
, ASCII? /
-
, " ,
ASCII, $
,
-
ASCII
.
«
» . *
,
13 10
-
ASCII «
» «
», . *
,
44 —
. /
$ ,
ASCII.
-
,
ASCII
. +
,
" $ .
(leftValue, rightValue, =
«7
% -»
-
reset serve). &
,
ASCII (
-
- ) , , , -
,
, 65,
«A», $
.
$
ASCII
-
110 Глава 2
ANSI9)
,
-
32
" ASCII (ASCII 0–32).
,
-
. /
=
128 ASCII
-
,
-
,
-
. &
-
,
"
. *
,
- $
, $
-
, "
.
-
,
, ASCII
-
-
. $
"
,
"
-
ASCII
—
"
(
), -
,
Unicode
8
3
.
ASCII. Unicode
9
ANSI, American National Standards Institute — 3
-
, "
-
.
.
Пишем код
#
Processing /*
" :
: Processing
*/
void setup() {
size(480, 130); // $
printArray(Serial.list()); // + R
//
//
%,
// (ASCII 10):
myPort.bufferUntil('\n');
}
void draw() {
// $ # % $ :
background(#044f6f);
fill(#ffffff);
// :
if (resultString != null) {
text(resultString, 10, height/2);
}
}
Unicode
$
.
,
, -
Символ 1 - 2 - 3 , g o !
Код ASCII 49 45 50 45 51 44 32 103 111 33
Двоичный
00110001 00101101 00110010 00101101 00110011 00101100 01000000 01100111 01101111 01000001
код
102,198,255,127,127,212,255,155,127, •
%
,
(
-
7 ,
"
-
)
;
(
0 255
256 , 28, 8 ), $- •
ASCII Unicode;
%
•
%
. *
, ,
, -
.
Простейшая сеть 113
Датчик левой руки Датчик правой руки Кнопка сброса Кнопка подачи Символ возврата каретки,
(0-1023) (0-1023) (0 или 1) (0 или 1) символ перевода строки
1–4 1–4 1 1 2
;
- float leftPaddle, rightPaddle; //
$ ,
//
int resetButton, serveButton; //
-.
, -
int leftPaddleX, rightPaddleX; //
//
Processing — int paddleHeight = 50; //
setup() — - int paddleWidth = 10; //
$ float leftMinimum = 120; //
- //
float rightMinimum = 100; //
//
( - float leftMaximum = 530; //
%
): //
float rightMaximum = 500; //
//
Числа
с плавающей запятой void setup() {
size(640, 480); //
&
-
$
String portName = Serial.list()[0];
//
:
" (floats),
myPort = new Serial(this, portName, 9600);
-
//
%,
. *
,
// (ASCII 10):
-
myPort.bufferUntil('\n');
: 480 400 —
1,
1,2. ;
//
:
: leftPaddle = height/2;
400 480 — 0, 0,833. rightPaddle = height/2;
#
, resetButton = 0;
- serveButton = 0;
. + $ //
:
- leftPaddleX = 50;
%
- rightPaddleX = width - 50;
map().
//
:
noStroke();
}
116 Глава 2
;
void serialEvent(Serial myPort) {
serialEvent()
"
- //
:
,
" - String inputString = myPort.readStringUntil('\n');
: //
// :
inputString = trim(inputString);
//
resultString:
resultString = "";
//
//
:
int sensors[] = int(split(inputString, ','));
//
,
:
if (sensors.length == 4) {
//
//
:
leftPaddle = map(sensors[0], leftMinimum,
leftMaximum, 0, height);
rightPaddle = map(sensors[1], rightMinimum,
rightMaximum, 0, height);
//
//
:
resetButton = sensors[2];
serveButton = sensors[3];
//
:
resultString += "left: "+ leftPaddle + "\tright: " +
rightPaddle;
resultString += "\treset: "+ resetButton + "\tserve: "
+ serveButton;
}
}
* ,
void draw() {
draw(), // $ # % $ :
(- background(#044f6f);
fill(#ffffff);
%
).
//
:
rect(leftPaddleX, leftPaddle, paddleWidth, paddleHeight);
//
:
rect(rightPaddleX, rightPaddle, paddleWidth, paddleHeight);
}
Простейшая сеть 117
-
9
,
,
-
,
. 2
. .
,
. & -
%,
,
,
-
%,
- . 2%
-
,
. 2
-
. [ map()
$
leftMinimum,
leftMaximum, rightMinimum leftMaximum -
, - setup(). $
"
.
,
%-
= $ ,
%,
$
.
* ,
- int ballSize = 10; //
- int xDirection = 1; //
!
. 0
"
//
.
- //
: –1, : 1
int yDirection = 1; //
!
$
//
- //
: –1, : 1
.
int xPos, yPos; //
$
// !
"
.
-
.
=
$
,
setup():
;
- void animateBall() {
: animateBall() //
!
:
resetBall(). / - if (xDirection < 0) {
//
draw():
if ((xPos <= leftPaddleX)) {
//
!
:
if((leftPaddle - (paddleHeight/2) <= yPos) &&
(yPos <= leftPaddle + (paddleHeight /2))) {
//
!
:
xDirection =-xDirection;
}
}
}
118 Глава 2
//
!
:
else {
//
if ((xPos >= ( rightPaddleX + ballSize/2))) {
//
!
//
:
if((rightPaddle - (paddleHeight/2) <=yPos) &&
(yPos <= rightPaddle + (paddleHeight /2))) {
//
// !
:
xDirection =-xDirection;
}
}
}
//
:
if (xPos < 0) {
resetBaVL();
}
//
:
if (xPos > width) {
resetBall();
}
//
!
if ((yPos - ballSize/2 <= 0) || (yPos +ballSize/2 >=height)) {
//
!
//
:
yDirection = -yDirection;
}
//
!
:
xPos = xPos + xDirection;
yPos = yPos + yDirection;
//
:
rect(xPos, yPos, ballSize, ballSize);
}
void resetBall() {
//
:
xPos = width/2;
yPos = height/2;
}
if()
"
" , , //
! ,
if()
"- // !
:
if (resetButton == 1) {
leftScore = 0;
- rightScore = 0;
: ballInMotion = true;
}
7
ani- // - $ :
mateBall(), if (xPos < 0) {
, rightScore++;
resetBall();
}
( - // - $ :
%
): if (xPos > width) {
leftScore++;
resetBall();
}
=
int fontSize = 36; //
!
setup()
:
= //
,
:
setup()
, - PFont myFont = createFont(PFont.list()[2], fontSize);
" %
: textFont(myFont);
&
! ;
«7
%
-» (
. 2.14). '
-
,
%
,
-
.
.
,
$ ,
(Processing %
),
-
, —
.
=
$
while (Serial.available() <= 0) {
" Serial.println("hello"); //
—
// :
int inByte = Serial.read();
// # '
// ...
}
}
Простейшая сеть 121
%
"
:
-
,
, ,
"hello"
,
,
- ,
. ;
,
. /
Processing -
,
-
, - .
,
. 4
2
,
.
"
. /
%
Processing, ""
;
Processing
,
, " . . *
"
"
, - "hello",
, -
"
,
%
Processing
-
serialEvent(), $
.
,
"
-
,
- , $ Processing
,
, . ;
, —
$ -
. 4
!
. / -
(
,
$
"hello"),
-
Processing
.
.
Проект 3
Беспроводной мартышкин пинг-понг
Игра «Мартышкин пинг-понг» могла бы быть еще более занимательной, если бы сам Мартышкин
не был привязан к компьютеру кабелем USB. Этот проект ликвидирует проводное соединение
между микроконтроллером и персональным компьютером и вводит новые сетевые понятия:
«модем» и «адрес».
"
,
.
-
,
7
Bluetooth
. & $
-
Bluetooth
RS-232
.
$ USB,
-
—
%
$
-
—
"
-
. #
Bluetooth — $
- .
,
-
$
,
"
- +,
Bluetooth
Bluetooth Serial Port Profile, SPP10. =
«7
% -», -
Bluetooth
. 2.15 (
! —
:
— -
, —
). &
HSP11,
% -
Bluefruit EZ-Link -
—
HID12.
Adafruit,
Bluetooth
- Bluetooth Mate SparkFun.
$
,
"
-
"
13,
" -
: VCC
— +5 & , " -
10
SPP, Serial Port Profile —
(GND) — " (–). #
.
11
TX RX Arduino
-
HSP, Headset Profile —
%.
12
HID, Human Interface Device —
« - RX TX Bluetooth
-
%». .
,
13
Service Discovery Protocol.
.
Простейшая сеть 123
3
Serial Port
Ubuntu,
Bluetooth 2.2,
BlueMan
$
. X
Bluefruit EZ-Link BlueMan,
D
.
Bluetooth Mate, ,
- & ,
Bluetooth,
"
-
TTL-Serial,
-
Bluetooth Manager. 0
—
-
. & $
-
. +
Bluetooth
Bluetooth,
%
-
.
3Vout
STS
3Vo
V
GND
DSR
>RXX
<TXX
DTR
Vin
10
15
20
25
30
1
5
J
J
I
I
G H
G H
F
F
C D E
C D E
A B
A B
10
15
20
25
30
1
Принципиальная схема
Показаны только задействованные выводы
+3,3 В +3,3 В
+3,3 В
Резистивный датчик изгиба
сопротивлением 15 кОм
Модуль сброс подача
микроконтроллера
10 кОм
10 кОм Analog0 4
5
Резистивный датчик изгиба
сопротивлением 15 кОм TX 10 кОм
A1 RX
Общий («земля»)
10 кОм
RTS
Модуль RX
Bluetooth Bluefruit TX
Vin +3,3 В
CTS
Общий («земля»)
Макетная плата
с модулем Arduino 101/Uno
3Vout
STS
3Vo
V
GND
DSR
10 X
>RX
<TXX
DTR
Vin
15
20
25
30
1
5
J
J
I
I
G H
G H
F
F
C D E
C D E
A B
A B
10
15
20
25
30
1
Рис. 2.15. Монтажные (вверху и внизу) и принципиальная (в центре) схемы проекта «Беспроводной мартышкин пинг-понг»
с подсоединенным модулем Bluetooth
126 Глава 2
#
,
$
-
, -
(
. 2.17).
" ,
Проект 4
Arduino-совместимая плата своими руками
Иногда в проекте требуется задействовать больше одного микроконтроллера, или — наобо-
рот — для работы проекта достаточно только одного или двух выводов общего назначения
микроконтроллера, что делает излишним включение в такой проект микроконтроллера с ши-
рокими возможностями. Бывают также ситуации, когда вместо использования одного микро-
контроллера для выполнения ряда задач проще задействовать несколько микроконтроллеров,
возложив на каждый из них ответственность только за одну задачу. Для таких случаев прекрасно
подойдут микроконтроллеры Atmel семейства ATtiny. Эти небольшие микроконтроллеры ценой
всего лишь несколько долларов можно программировать с помощью платы Arduino или ее кло-
на по синхронному последовательному протоколу SPI.
,
-
, MKR1000, Требуемые компоненты
Arduino 101 Arduino Uno,
#
Arduino (Arduino 101/
%
- Uno MKR1000), 1 %.
. >%
$ +
: X3
! (UART), SPI.
-
7
ATtiny84, 1 %.
. 7
"
>
, 1 %.
,
-
.
,
;
(RGB)
" -
,
" , 1 %.
. *
-
9
220 0, 1 %.
USB/TTL-Serial,
-
— MKR1000 Arduino 101 —
. ,
,
ATtiny84
ATtiny85. 0 $
' % -
/ " -
,
, (GPIO),
% — % .
,
,
%
+7 (
. 2.18). + -
%
. ; ,
"
-
,
8-
AVR-
-
-
Atmel
- ,
-
DIP15,
-
+7. ~
" . 0
X3,
-
ATmega328T,
Arduino Uno. *
-
SoftwareSerial.
-
15
DIP, Dual-in-Line Package —
,
(
)
( -
"
-
).
"
.
128 Глава 2
& $
,
"
, — ,
$
1.
"
9 1 (аналоговый ввод 1)
*Здесь:
• SCK — тактирование;
• PWM — ШИМ;
• MISO — вход ведомого, выход ведущего;
• ARef — опорное напряжение; Рис. 2.18. Распиновка микроконтроллеров ATtiny84
• MOSI — выход ведомого, вход ведущего. (вверху) и ATtiny85 (внизу)
SPI.
"
— ,
,
- AVR
-
"
AVRISP mkII Atmel USBTinyISP
.
- Adafruit.
,
-
,
#
Arduino
.
-
, -
"
-
— ArduinoISP —
"
Рис. 2.19. Монтажные (вверху) и принципиальная (внизу) схемы программирования микроконтроллера ATtiny84 с помощью
платы Arduino (вверху слева) и MKR1000 (вверху справа). Полукруглый неглубокий вырез на одном конце микросхемы ATtiny
обозначает ее верх, а круглое очень мелкое углубление с одной стороны этого выреза — физический вывод 1 микросхемы (это
стандартная маркировка микросхем в корпусе DIP)
5 5
A B C D E F G H I J
1 1
10 10
5 5
15 15
10 10
20 20
15 15
25 25
20 20
30 30
A B C D E F G H I J
25 25
Принципиальная схема +3,3 В
Показаны только задействованные выводы
30 30
Vin A B C D E F G H I J
. 2.19.
*
ATtiny84
-
,
Arduino as ISP —
-
Arduino.
%
; , $ 1 (
. ! Arduino
-
«*
»),
ATtiny.
\ | ]
!
" A 2
#
"
: http://www.leonardo-
(Burn Bootloader),
-
miliani.com/repository/package_leonardomil-
.
%
-
iani.com_index.json.
-
" #
+
2 OK
(Done Burning Bootloader). ;
. &
ATtiny84.
|
-
ATtiny. =
- 4
,
-
:
13- 6-
? : ATtiny; D | #
-
. &
? Processor: ATtiny84; Arduino
% Arduino -
? : 8 7q (
).
-
ATtiny. 4
? :
,
,
-
.
6
ATtiny
, ,
20
0 . fuse —
.
.
132 Глава 2
Пишем код
=
- #include <SoftwareSerial.h> //
'
— SoftwareSerail:
SoftwareSerial
SoftwareSerial swSerial(0, 1); // RX, TX
$
$ -
-
"
/ (GPIO). 7 -
0 1:
;
// -
: :
const int redPin = 8;
const int greenPin = 7;
const int bluePin = 6;
A B C D E F G H I J
1 BLACK 1
GND
CTS
VCC
5 TX 5
RX
RTS TX RX
GREEN
10 10
15 15
20 20
25 25
30 30
A B C D E F G H I J
Принципиальная схема
Общий («земля»)
Показаны только задействованные выводы
CTS
Vcc*
Адаптер USB/TTL-Serial
TX
10 кОм RX
RTS
Напряжение
Сброс 0
питания
микроконтроллера 1
ATtiny84
ATtiny84
8
7
6
220 Ом
Общий («земля»)
Рис. 2.20. Монтажная (вверху) и принципиальная (внизу) схемы реализации проекта управления яркостью светодиода с кла-
виатуры на микроконтроллере ATtiny84. Питание на микроконтроллер и сопутствующую схему подается через адаптер USB/
TTL-Serial из порта USB компьютера. Поскольку микроконтроллер ATtiny84 и светодиоды могут работать на напряжении ве-
личиной как 3,3 В, так и 5 В, величина подаваемого адаптером напряжения не имеет значения. Подключенный к выводу
сброса микроконтроллера повышающий резистор номиналом 10 кОм не допускает произвольного сброса микроконтролле-
ра, удерживая на этом выводе высокий уровень напряжения. Сброс микроконтроллера осуществляется кратковременным
замыканием вывода сброса на землю
134 Глава 2
% ,
"
.
78xxl
10
15
20
25
30
1
BLACK 5
GREEN
VCC
CTS
RTS
Принципиальная схема
GND
J
J
RX
TX
I
G H
F
C D E
CTS
A B
A B
Vcc
Адаптер USB/TTL-Serial
10
15
20
25
30
1
TX
RX
RTS
Стабилизатор
напряжения
7805
In* Out** +5 В
+9-12V
10 кОм
Напряжение
Сброс питания
0 (RX)
*Входное напряжение
**Выходное напряжение 1 (TX) ATmega328P
22 пФ
Кварц
Кварц
22 пФ
Общий («земля»)
Рис. 2.21. Монтажная (вверху) и принципиальная (внизу) схемы для сборки на макетной плате совместимого с Arduino Uno
микроконтроллерного устройства на основе микроконтроллера ATmega328P и адаптера USB/TTL-Serial
136 Глава 2
2
, - 5 &
, -
,
%
-
USB/TTL-Serial, —
9–12 &. 9
-
$
-
ATmega328P
: www.
.
. 2.21 arduino.cc/en/Hacking/PinMapping168.
-
Заключение
Проекты, рассмотренные в этой главе, поясняют несколько понятий, являющихся базовыми для
всех типов сетевого обмена данными. Прежде всего запомните, что обмен данными основан на по-
следовательности уровней соглашений: первым идет физический уровень, затем электрический,
логический, уровень данных и, наконец, уровень приложений. Имейте эти уровни в виду при разра-
ботке и диагностировании своих проектов, так как это облегчит вам задачу локализации проблем.
? ': ,
? :
,
"
%
-
ASCII,
- ,
(«
») .
USB/TTL-Serial
-
$
,
Bluefruit. & -
,
-
-
. *
,
,
,
,
,
",
%
-
% .
? ] ,
-
ASCII.
-
? %:
,
" ,
,
. #
,
,
-
-
%
-
,
-
. / % .
ATtiny,
-
: ,
-
-
«
»,
. /
.
"
? J:
-
.
"
-
%
- * ,
-
.
-
«- »
. & $
-
.
" "
.
Сетевые цветы Дории Фэн (Doria Fan), Маурисио Мело (Mauricio Melo) и Джейсона
Кауфмана (Jason Kaufman)
# "
«# »
-
" . X
-
,
" .
140 Глава 3
Рис. 3.1. Новые компоненты для проекта этой главы: 1. Резистивные датчики давления серии 402 компании Interlink. 2. Провод
для монтажа накруткой диаметром 30 AWG. 3. Инструмент для монтажа накруткой (в ручку инструмента вставлено приспосо-
бление для снятия изоляции с провода). 4. Веб-камера. 5. Резиновые подкладки. 6. Листы толстого картона или фанеры для
основания под датчики давления
1
2
400 -
SF: DEV-13787, AF: 3033, F: 2520713, RS: 913-
Рис. 3.2. Три типа сетевой топологии: полносвязная (слева), звездообразная (в центре) и кольцевая (справа)
,
"
(
. 3.3). &
.
( *
%
,
)
( -
,
-
%
). 3
-
. ,
%
,
-
%
, $
-
, ,
Рис. 3.3. Сложная многоуровневая звездообразная сеть
, -
%
.
"
+
. $
Bluetooth,
-
, "
-
2,
,
$
.
, $
%
. 7
%
= (
)
,
IP-
,
(
)
" ,
-
"
%
. *
. = - % +
—
,
" - , DSL- -
, —
- , — %
$ -
. &
%
.
-
Адреса аппаратные и сетевые
Bluetooth. 3
*
:
-
+
-
,
- IEEE1, ,
,
-
—
IEEE 802.x. *
, %
%
-
,
.
-
,
Ethernet,
.
IEEE 802.3. 3
*
$ -
Ethernet — Wi-Fi —
"
"
1
IEEE, Institute of Electrical and Electronics Engineers —
$ - +
$
$
-
. ;,
Bluetooth 2 (#3).
144 Глава 3
- Ethernet-
Wi-Fi. 0
IEEE 802.11: 802.11a, b, g n. #
$
%
$
- IP-
,
,
. ;
. *
Bluetooth
IEEE Advanced
, -
Hardware,
802.15.1. &
802.
MAC-
,
TCP/IP,
MAC- 2. MAC-
,
-
IP-
,
-
,
;
6- ,
? % Window 10
-
(
, -
$
|
),
Ethernet . =
"
MAC-
D
. 0
-
IEEE -
Wi-Fi,
, -
MAC-
. MAC-
%
.
-
" -
. !
. 0
—
=
Ethernet Wi-Fi D,
"
+
- IP-
;
IP3. IP- - ? % Ubuntu Linux
#
!
, D
,
, . . MAC- ,
]
| D
, !
>
. 0
,
-
. 4
- "
. & -
MAC-
( . Media Access Control) —
-
. , MAC-
,
3
IP, Internet Protocol —
-
.
IP-
. $,
Более сложная сеть 145
а б
Рис. 3.4. Диалоговые окна параметров сетевого подключения для машин под macOS (а) и Windows (б)
,
XXX.XXX.XXX.1.
$
%
-
,
-
%
.
217.123.152.XXX. +
%
-
%
Улица, город, область, страна:
,
%
. ; -
структура IP-адресов
217.123.1.1.
% ,
-
%
" (
)
-
-
(
).
.
, IP-
-
,
%
-
. *
IP-
,
-
—
,
. ;
:
.
%
" 255.255.255.0.
IP-
, -
. 7
%
, -
. 9
, IP-
$ ,
,
. . '
( )
-
q
IP-
, - 32 . ,
-
,
-
. & ,
,
IP-
$
.
,
217.123.152.20. 7
%
,
$
, ,
,
, -
217.123.152.1.
255.255.255.255. *
,
2
255.255.255.255
0–255,
- —
%
. 4
%
.
0 (
. . 3.1),
*
,
%
$
—
146 Глава 3
%
—
255 (
,
-
.255
%
"
" ).
255.255.255.192
%. & . 3.1
-
62
%
-
"
(255 – 192 – 1 = 62) . *
"
-
-
.
IP-
-
, $
. .
- *
-
" . 0
IP-
$
-
,
:
-
%
.
. + - 192.168.1.45,
% -
-
%
,
%- -
. /
-
%
%
. =
,
"
"
%
%
-
, $
"
192.168.1.1,
%
. &
IP-
-
+
" -
66.187.145.75. 7
%
Протокол ARP
ARP,
-
3
"
-
"
ARP5. &
-
73#-
-
, POSIX arp
" IP-
. ;
,
"
arp IP-
5
ARP, Address Resolution Protocol —
%
% %
,
.
.
, $
,
ARP %
—
.
%
. &
IP-
, Команда ping: вы там?
(
at) — MAC-
. & arp ,
-
arp -a,
$
,
-
IP-
-
,
-
. ,
73#-
$
%
IP-
.
. # "
-
— ping —
# (incomplete) ,
IP-
.
— ,
/
$
, -
" «& ?», .
Ограничения p i n g и a r p
0
—
, %,
,
-
ping. *
,
-
$ ,
— arp —
. 4
,
$
,
%
. &
-
— $
%
.
148 Глава 3
0
- $ ping -c 3 127.0.0.1
" (
% Windows
- –n. +, ,
$ —
$
%
):
192.168.0.255,
ping,
% -
73#-
. . 4
%
"
7
%
"
- ping
,
,
192.168.0.255
- , %
, -
6. $
%
5-
$
—
, 7-
,
.
,
-
ping. ;
,
%
- Примечание
" ping, $ *
"
,
IP-
%
"
,
$
-
6
3
$
. = -
% %
-
.
.
150 Глава 3
, IP-
,
%
,
ping
-
.
$ . /,
, %
-
%
,
"
—
(
%
)
.
. #
- $
,
-
"
%
-
,
-
" .
. +
%
0
" -
%
( )
%-
.
.
$
$
-
.
Поставщик сетевых
услуг веб-сайта
Интернет
,
-
. #
- -
(
,
(
) - ,
. .)
,
" -
,
-
$ , -
% .
.
,
-
#
IP-
-
"
-
.
,
. *
,
- &
,
-
80,
(
-
$
),
-
-
. 3
$
-
. X $
25,
,
$
.
. 0
,
_
- $
,
-
,
ping. * % Windows
-
. & $
PuTTY.
%
. 7 %
— ,
$ - Версия telnet для Windows
,
(FTP), telnet &
telnet, "
Windows,
-
. #
%
. *-
,
localecho,
,
$
,
(
"
). >
-
Trying... Connected. $
-
-
PuTTY.
"
:
Более сложная сеть 153
Обращаемся к серверу
&
- $ telnet www.example.com 80
" %
<Enter>.
#
-
"
:
Trying 64.233.161.147...
Connected to www.example.com.
Escape character is '^]'.
.
% <Enter>
):
* $
-
:
HTTP/1.1 200 OK Выход из telnet
Cache-Control: max-age=604800
4
telnet
-
Content-Type: text/html
, % <Ctrl>+<]>,
Date: Hon, 11 Apr 2016 15:51:58 GMT
% telnet
Etag: "359670651+gzip+ident"
quit.
Expires: Hon, 18 Apr 2016 15:51:58 GMT
Last-Modified: Fri, 09 Aug 2013 23:54:35 GMT
Server: ECS (lga/1384)
Vary: Accept-Encoding
X-Cache: HIT
x-ec-custom-error: 1
Content-Length: 1270
Connection: close
Создаем веб-сервер
-
,
- #
"
-
" node.js 1? ~ - % —
, , $
" -
" -
,
"
-
. & $
-
HTTP. $
,
,
-
,
-
-
-
.
.
Пишем код
&
- /*
"
- Z
: node.js
server.js
*/
dateServer.js.
var express = require('express'); //
'
2 , // express:
var server = express(); // $ " server,
1,
-
// $ express
$
-
: // % #', $
// $ :
$ node dateServer.js
function respondToClient(request, response) {
;
" // :
,
tel- response.writeHead(200, {"Content-Type": "text/html"});
net localhost ( 127.0.0.1) response.write("< " + new Date() + ">"); response.end();
}
8080
$
. & // :
$
server.listen (8080);
" ,
- //
$ :
" HTTP " server.get('/*', respondToClient);
:
Примечание
HTTP/1.1 200 OK &
dateServer.js -
X-Powered-By: Express , server.js,
,
Content-Type: text/html
express.js :
Date: Tue, 11 Apr 2017 16:43:39 GMT
Connection: keep-alive npm install express
Transfer-Encoding: chunked
< Tue Apr 11 2017 12:43:39 GMT-0400 (EDT)>
~ -
,
,
,
HTTP
,
"
—
, ,
%
Processing
,
. =
. =
$
-
< >. %
.
: name age,
tom
,
,
14
.
,
. 7
,
-
"
$
,
"
(&).
response (
-
HTTP
res),
"
-
«-!
».
"
.
Пишем код
# "
node.js /*
Z
: node.js
*/
$
:
var express = require('express'); //
'
// express:
var server = express(); // $ " server,
// $ express
#
$
http://localhost:8080/?name=tom&age=14
getParameters.js,
,
:
/
- HTTP/1.1 200 OK
-
" X-Powered-By: Express
Content-Type: text/html
telnet
Date: Mon, 11 Apr 2016 17:16:48 GMT
PutTTY, $
- Connection: keep-alive
, — - Transfer-Encoding: chunked
GET
: request: {"name":"tom","age":"14"}
?name=tom&age=14
;
.:
GET /get-parameters.php?name=tom&age=14
& $
-
( HTTP), -
" :
. *
, *
,
,
PUT DELETE,
,
, GET POST.
" $
,
" . & node.js
GET -
= $
$
"
(URL)
,
- request.query.
"
-
" node.js,
-
$
" JSON,
"
-
"
,
-
$
.
.
Пишем код
- /*
%
,
$
: node.js
Z#
$ HTTP :
,
- name ( )
$
- age (# )
. &
" +$ $ ,
-
$ $ ($ age).
*/
ageCheck.js.
var express = require('express'); //
'
// express:
var server = express(); // $ " server,
// $ express
Более сложная сеть 157
age
% , + ", + ,
.</p>\n";
21. } else {
responseString = "<p>
, " + name
/
- + ". + $
,
' , ";
responseString += "
R
- $ .</p>\n";
. #
- }
,
// :
, . .: response.writeHead(200, {"Content-Type": "text/html"});
http://localhost:8080/, response.write(responseString);
, response.end();
. .: http://localhost:8080/check. }
&
$ // :
!- server.listen (8080);
. ,
- //
$ :
(/),
server.get('/', respondToClient); //
// /?
server.get('/'check', checkAge); //
. // /check/?
> express.js
"
- +
,
: http://localhost:8080/
GET POST
- http://localhost:8080/check —
-
.
$ -
-
GET
"
. /
,
server.get(), POST — c "
.
server.post(). >
$ 9
4,
"
- ,
-
.
(REST)14.
14
#
REST, REpresentational State Transfer (
:
-
) —
- . * $
.
,
158 Глава 3
. =
-
—
URL,
POST. &
URL
(URL), . &
GET
$ GET, POST -
,
POST
HTTP.
"
:
,
POST http://www.example.com/check
-
—
. 3
-
,
POST
- POST. =
, -
%
,
"
,
Пишем код
'
var express = require('express');//
'
// express:
POST,
var server = express(); // $ " server,
// $ express
( - var bodyParser = require('body-parser'); //
%
). # - //
//
URL:
server.use(bodyParser.urlencoded({ extended: true }));
:
// ... - $
% # checkAge
=
function checkAge(request, response) {
checkAge —
- var name, age;
if (request.method === "GET") {
, -
name = request.query.name;
%
: age = request.query.age;
} else if (request.method === "POST") {
name = request.body.name;
age = request.body.age;
}
var responseString = "";
* ,
- server.get('/check', checkAge); //
,
- // /check/?
server.post('/check', checkAge); // !
" POST // POST
/check. /
,
GET. [ .get()
.post() "
-
,
"
GET
POST.
Более сложная сеть 159
*
$
, - ; ,
express,
"
npm
-
-
body-parser. = $ ,
"
" ,
,
-
,
- %
. ;
" : body-parser
node_mod-
ules,
$ npm install body-parser
.
Тестируем код
-
- POST /check HTTP/1.0
" telnet Host: example.com
127.0.0.1
8080 Connection: Close
Content-Type: application/x-www-form-urlencoded
Content-length: 16
" -
. * $
$ name=tom&age=14
" POST:
Примечание
& , 9
( $ Content-
GET, length:)
-
. $,
-
—
,
,
% % ,
.
,
-
"
.
Пишем код
# ,
<html>
- <body>
<form action="/check" method="post"
+,
index.
html public. :
form action="/check" method="post"
,
-
ageCheck,
POST. ;
,
Submit
-
%
POST
/check,
%
.
=
checkAge.js // use the parser for data that's URL-encoded:
" , - server.use(bodyParser.urlencoded({ extended: true }));
// serve static pages from public/ directory:
%
:
server.use('/',express.static('public'));
;
re-
spondToClient() "
server.get(). / % ,
Рис. 3.6. Форма для проверки возраста
.
#
-
. &
: http://localhost:8080/index.html —
, -
. 3.6. #
-
GET,
-
POST.
Более сложная сеть 161
&
%
- 4
,
-
$
. 7
-
, —
, /
-
- check,
$ ,
-
,
,
,
-
,
- "
.
, "
public.
1,
Net). 2
POST %
-
. +
$
" curl
"
.
:
?
(
-
$ curl -v -d "name=tom&age=14" ):
localhost:8080/check
curl -v http://www.example.com
3
: ? 2
POST
:
* Trying ::1... curl -d "key=value&key2=value2"
http://www.example.com
* Connected to localhost (::1) port 8080 (#0)
> POST /check HTTP/1.1 ? 2
GET
:
> Host: localhost:8080
curl -G -d "key=value&key2=value2"
> User-Agent: curl/7.46.0 http://www.example.com
> Accept: */*
> Content-Length: 15
? 0
:
> Content-Type: application/x-www-form-urlencoded curl -L http://www.example.com
>
* upload completely sent off: 15 out of 15 bytes
< HTTP/1.1 200 OK
162 Глава 3
&
"
// ' $ :
var account = {
%
- host: 'smtp.gmail.com',
Измените на действи-
- тельный SMTP-сервер, если вы
port: 465,
secure: true, не используете Gmail
%
auth: {
.
465
user: '_
_@gmail.com'
- Измените на свой
SSL- 18. pass: '_ ' действительный адрес
/
%
- } электронной почты
};
" ,
-
.
18
SSL, Secure Socket Layer — (
-
)
.
Более сложная сеть 163
&
"
- // :
Измените на действительный
var message = {
адрес электронной почты адресата
" . from: account.auth.user,
to: '
@gmail.com',
=
- subject: '
',
$
- text: '
, ',
. 0 : to };
(), from (), subject ( )
text (
). &
-
" :
*
"
- // $ % #' $
// $' :
,
"
function confirm(error, info){
% . $ if(error){
- console.log(error);
$
: } else {
console.log('Message sent: ' + info.response);
}
}
0
%
" // $ $
$ ,
" // :
var client = nodemailer.createTransport(account); client.
createTransport
- sendMail(message, confirm);
,
-
" . [ sendMail
-
" -
- Авторизация в Gmail
%
Gmail
" :
%
. =
-
-
OAuth2. '
%
~
$
- %
, %
Gmail, -
$
-
My Account (3 Google), " -
nodemailer,
"
-
Sign-in and Security (>
)
-
% Apps with account access (
,
-
node.js
"
) $
Allow less secure apps (9
%
)
$
.
ON (& ).
%
-
node.js
-
$
-
- OFF. > , %
—
Gmail
,
. =
-
$
Processing, "" $
-
OAuth2
http://nodemailer.com/
,
smtp/oauth2/ ( $
).
.
164 Глава 3
Шифрование паролей
&
"
%
%
-
-
.
,
". = ' %
,
%
, %
%
-
, %
,
,
%
. &
-
$
. =
- "
, ,
" %
"
%
" %
,
-
-
.
, %
"
-
#"
-
. /
, -
-
,
- "
—
, -
.
.
node.js
crypt,
"
#
"
- // $
:
process. var key = process.argv[3]; //
R
//
argv[]
var message = process.argv[2]; //
R
( - //
)
node.
js
. & %
" %
,
.
write- // # $ % # writeFile():
File()
- function success(data) {
, $
console.log('I wrote to the file: ' + fileName);
}
19:
* , // $% %
:
writeFile(),
- fs.writeFile(fileName, encryptedMsg, success);
%
:
19
, node.js
. 4
-
"
,
#
-
" -
" :
info.txt,
$ node encrypt.js '
%
. #
$
# '
,
-
%
. #"
"
"
-
. "
.
%
:
// fs
readFile() // # $ % # readFile():
- function success(error, data) {
if (data){
, $
data = data.toString();
. & $ var decryptedMsg = decipher.update(data, 'hex', 'utf8');
%
decryptedMsg += decipher.final('utf8');
" %
: console.log('I read this from the file: ' + decryptedMsg);
} else if (error) {
console.log(error);
}
}
%
,
,
%
"
%
,
. 2%
$
-
"
: ,
%
" -
$ node decrypt.js _%
'
$
,
-
%
. /
* $
: _%
-
-
' —
,
,
" %
%
,
%
.
.
;
,
9
HTTP
$
-
":
" ,
%
-
I read this from the file: ,
-
(
$ %
:) "
.
Более сложная сеть 167
Проект 5
Сетевой кот
Людям очень просто выполнять такие задачи, как просмотр веб-страниц или работа с электрон-
ной почтой, потому что для нас созданы компьютерные интерфейсы, очень хорошо взаимодей-
ствующие с нашими руками: клавиатура отлично подходит для работы с ней пальцами, а мышь
удобно помещается в ладонь. Но, например, для кота отправить сообщение электронной поч-
ты — задача не из легких. В этом проекте мы попытаемся исправить такую дискриминацию
котов, одновременно демонстрируя создание нашего первого физического интерфейса для
Интернета.
?
-
"
$
,
-
;
" , - ,
-
?
%
-
-
-
,
,
-
; "
?
%
Processing
. +
. 3.7
-
,
#
$
HTTP POST.
.
> SMTP
> 250 OK
> HTTP/1.1
> 200 OK
Микроконтроллер отправляет
показания датчиков
программе Processing
по последовательному каналу Когда кот ложится на подстилку,
программа Processing посылает запрос HTTP GET
на отправку сообщения электронной почты
Более сложная сеть 169
*
. 3.8
-
- Установка датчиков в подстилку
#
(
),
-
для кота
"
(
)
,
"
(
-
,
-
). ;
-
. = $
"
— " ,
-
-
, — ,
"
. &
.
(9==)
400 Interlink (
. 3.9).
; ,
,
.
Почтовый сервер
Программа
Персональный компьютер почтового сервера
Протокол SMTP
Почтовый клиент
Протокол SMTP
Веб-клиент
HTTP GET Веб-сервер
/index.html
Серверная программа
на node.js
Персональный компьютер
Sensor
Программа загрузчика
Входное аналоговое
напряжение
Камера
Программа
считывания
показаний датчиков Данные TTL-Serial по USB Видео по USB
Микроконтроллер
170 Глава 3
,
,
). ;
-
-
-
. &
$
"
, %
.
,
. 2
-
-
- "
,
Модуль
микроконтроллера
Аналоговый ввод 0
1 кОм
Общий («земля»)
10 10
RX
15 15
TX
A B C D E F G H I J
1 1
GREEN
BLACK
VCC
20 20
CTS
RTS
GND
RX
TX
5 5
25 25
10 10
30 30
A B C D E F G H I J
15 15
20 20
25 25
30 30
A B C D E F G H I J
1 1
5 5
10 10
15 15
20 20
25 25
30 30
A B C D E F G H I J
Рис. 3.10. Принципиальная (вверху) и монтажные (внизу) схемы подключения датчиков давления к микроконтроллерам.
Поскольку все резистивные датчики давления соединены между собой параллельно, от них отходят всего два контакта
172 Глава 3
Рис. 3.11. Сборка панели датчиков: размещение датчиков по углам нижней пластины (вверху); резиновая накладка, пере-
дающая давление верхней пластины на датчик (внизу слева); датчик давления, смонтированный на нижней пластине (вни-
зу справа). Все четыре датчика давления подключаются параллельно. Обратите внимание на резиновые накладки, которые
передают на датчики давление верхней пластины. Обязательно изолируйте все соединения перед тем, как скреплять панели.
Выводы датчиков соединяются с проводом, ведущим к микроконтроллеру, обычными разъемами типа «мама»
Более сложная сеть 173
- 7
,
%
,
" -
, -
. $,
-
.
ATtiny84
-
7
,
USB/TTL-Serial,
$
-
% ",
, (
.
. 3.10,
!). Arduino Uno/101
, MKR1000
$ —
. = $ -
USB
, $
.
,
,
- #
,
. 3.10, -
,
, — $
Arduino
" ,
-
. .
Датчики и события
*%
"
—
"
.
$
,
- 7 $
. = $
% -
- ,
. ;
-
,
-
. ' $
,
% ,
. ,
,
-
%
,
%. +
-
. +
:
,
"
, ,
.
,
'
-
,
,
$
,
, . . 3
"
,
- .
,
,
.
,
%
.
3
& -
, $
"
- ,
,
>
%
.
Arduino IDE. 2
$
,
-
" *
-
,
%
,
-
-
. 7 -
.
,
,
,
, $
. 3.12.
$
.
;
-
+,
, ,
-
,
.
Пишем псевдокод
*%
Processing /*
}
. 3 draw()
void draw() {
$
. // + $ R
// , R
// - ,
// $
}
=
,
- void sendMail() {
,
- //
// $ R. :
. =
// - $ HTTP GET
, // R.
, , // -
: }
void uploadPicture() {
//
// $ $:
// -
// - $ HTTP POST $ $
// -
}
' ,
"
,
-
.
176 Глава 3
Пишем код
= %
- /*
" - $
: Processing
- */
. /
,
// \
- import processing.serial.*;
«7
% -» Serial myPort; //
2:
void setup() {
// \#$ ' $
&
$ // \$ 0 ,
// ' :
String portName = Serial. list()[0];
myPort = new Serial(this, portName, 9600);
— // Z$ serialEvent()
,
//
:
myPort.bufferUntil('\n');
-
}
«7
% -
». *
void draw() {
, - }
. void serialEvent(Serial myPort) {
//
- -
String inString = myPort.readStringUntil('\n');
int sensorValue = 0;
if (inString != null) {
// M :
inString = trim(inString);
//
$ $ int:
sensorValue = int(inString);
println(sensorValue);
}
}
. +
,
.
$
- +
, %
,
. 3
.
-
, ,
.
Более сложная сеть 177
'
, - Serial myPort; //
, int threshold = 400; // $
int lastSensorValue = 0; // $
" //
". =
- boolean catOnMat - false; //
?
$
,
-
,
: lastSensorRead-
ing, threshold catOnMat (-
-
%
):
.
// *
"
"
if (sensorValue > threshold ) {
Избавляемся от проводов //
>
с помощью Bluetooth if (lastSensorValue <= threshold) {
//
<
*
-
catOnMat - true; // #
,
//
,
println("7
");
-
// %!
,
:
lastSensorValue = sensorValue;
}
178 Глава 3
-
, % -
" ,
,
%
, ,
, ,
" $
-
-
. ,
. /
%
-
4
-
,
,
-
%
%
" $
.
, %
'
,
. =
,
%
,
"
-
"
%
-
%" , , ,
. / -
. *
$
,
sendMail()
% ,
,
,
-
.
" . 2
-
uploadPicture().
= , $
.
Дорабатываем код
0
" $
- int currentTime = 0; //
,
- int lastMailTime = 0; //
. = //
int mailInterval = 60; //
!
//
$ , " int lastUploadTime = 0; //
- int uploadInterval = 120; //
!
: //
currentTime = hour() * 3600 + minute() * 60 + second();
}
currentTime ( -
%
):
Более сложная сеть 179
;
void sendMail() {
sendMail() uploadImage() //
,
"
( - //
#.
:
int timeDifference = currentTime - lastMailTime;
if ( timeDifference > mailInterval) {
%
):
println(" R. ");
, $ // 9
#.
// :
"
-
lastMailTime = currentTime;
" —
}
}
serialEvent().
mailInterval uploadInterval
void uploadPicture() {
" - //
,
$
//
-
. 2
int timeDifference = currentTime - lastUploadTime;
- if (timeDifference > uploadInterval) {
%
:
% println(" $ .");
% ,
. & % // 9
:
lastUploadTime = currentTime;
" , }
. }
$,
*
$
-
-
$
-
— multer. ,
-
. = $ %
"
#
%
,
catServer, —
%
info.txt
catServer.js.
catServer.
,
- // :
: // - $ - %
// - $ - %
- -
// - %
, $- $ $
//
:
// - $
// -
2
- // % # $
:
2
- //
$
' % %
// :
var key = process.argv[3];
%
- // Z %
- #:
— var fileName =__dirname + "/info.txt";
, $
// Z$ %:
encrypt.js decrypt.js: var decipher = crypto.createDecipher('aes-256-cbc', key);
= ,
- // Z$ ' express $
express // - - %
:
var server = express();
, -
serve r.use('/',express.static( 'public'));
-
HTML, —
, $
checkAge.js:
0
// # $ $
//
R. :
,
-
function sendMail(request, response) {
.
- // # $
// % :
"
GET / function confirmMail(error, info) {
mail,
" $ - if(error){ console.log(error);
. response.end("- .
$ .");
} else {
#
response.send("Z : " + message.to);
%
}
node.js. #
}
,
182 Глава 3
=
// # $ % $ %
:
%- function decryptFile(error, data) {
// $ %
,
. /, // % :
, ,
if (data){
var content = data.toString();
decrypt.js. 9
%
, var decryptedPassword = decipher.update(content,
'hex', 'utf8');
decryptedPassword += decipher.final('utf8');
account.auth.pass
account.auth.pass = decryptedPassword;
nodemailer: // $ , R:
} else if (error) {
console.log(error);
}
}
// Z $ %
:
fs. readFile(fileName, decryptFile);
console.log("M " + account.auth.user + "
.");
* ,
// :
,
%- server.listen(8080);
, server.get('/mail', sendMail);
console.log("' -.");
:
#
,
- X
,
-
,
-
:
. 2
$ node catServer.js __
,
" :
@_
_.com
Модифицируем скетч
=
" /*
Processing $
"
: Processing */
// ... ' ' ...
( -
int uploadlnterval = 120; // & .
%
). // $ $
String serverAddress = "localhost";
int port = 8080;
String mailRoute = "/mail";
2
println() void sendMail() {
sendMail() , - // % # $ $ HTTP GET
"
- // R.
// +,
%
. / // $ R. :
URL int timeDifference = currentTime - lastMailTime;
serverAddress, if ( timeDifference > maillnterval) {
port mailRoute,
- String mailUrl = "http://" + serverAddress + ":" +
" loadStrings() port + mailRoute;
HTTP GET String[] response = loadStrings(mailUrl);
$
.
println("K
:");
$
printArray(response);
. [ load- // Z- R. '
// -:
Strings()
"
lastMailTime = currentTime;
— }
: }
184 Глава 3
,
-
" Processing
"
-
.
" :
# ,
"
-
Рис. 3.13. Страница сетевого кота в браузере
-
catServer.js, public.
#
,
catcam.jpg
$ pub-
lic. 2
:
http://localhost:8080/catcam.jpg
Создаем веб-страницу
#
index.html <!DOCTYPE html>
public
" : <html>
<head>
<script type="text/javascript">
JavaScript
- // # $
up- // #:
date(),
function update() {
//
' :
$ -
:
-
var now = new Date();
(img)
// R #: $
(div). //
$:
var timeLabel = document.getElementById('timeLabel');
var catPic = document.getElementById('catPic');
// $ $
URL, $
// , $
2 // #:
setInterval(),
- catPic.src= "/catcam.jpg?" + now;
update()
// $:
. timeLabel.innerHTML = now;
}
;
,
// $ $ % #
- // ' :
- setInterval(update, 60000);
. &
</script>
-
<title>CatCam!</title>
,
$
</head>
JavaScript $ - <body align=center> <h1>CatCam!</h1>
img
div , <img src="/catcam.jpg" id="catPic">
. <div id="timeLabel"></div>
</body>
</html>
%
-
,
(middleware)
,
, " multer. X
$
"
( %
-
:
: application/x-www-form-urlencoded)
"
% $
$ npm install multer
request.body.
-
,
- ;
0,
,
.
186 Глава 3
require
catServ- cat server
er.js
"
(
context: node.js
*/
-
// ... ' ' ...
%
):
var nodemailer = require('nodemailer'); //
var multer = require('multer'); //
!
$N
//
:
multer, - var upload = multer({storage: imgStore});
,
server //
: "image"
$
// (
!
!
!
):
express.
- var type = upload.single('image');
.
,
-
Processing:
;
// % # $ $ $ $ %
:
save- function saveUpload(request, file, save) {
Upload(),
// $ % # multer, - %
:
imgStore. 9
save(null, file.originalname);
$
}
sendMail(). ;
,
-
,
-
— destination — -
imgStore,
,
.
* ,
// Q
// :
function getUpload(request, response) {
$ . 9
-
//
#
:
$
- var fileInfo = JSON.stringify(request.file);
sendMail(): console.log(fileInfo);
response.end( fileInfo + '\n');
}
;
%
-
$ . 2
. *
"
" curl
"
-
. * , -
"
:
curl,
$ curl -F image=@path/to/catcam.jpg 'http://localhost:8080/upload'
------H4rkNrF
Content-Disposition: form-data; name="submit"
Значение для этой части. При загрузке посред-
Upload ством формы это будет вывод кнопки Submit формы
------H4rkNrF
Content-Disposition: form-data; name="image"; filename-"catcam.jpg"
Content-Type: image/jpeg
Content-Disposition — заголовок, определяющий эту
часть. Для файлов также содержит локальный путь к файлу
[$ '
$ %
]
=
- void draw() {
- // +
$-
R
image(myCam, 0, 0);
image().
}
— myCam —
-
.
3
-
"
:
// R -,
//
:
,
void captureEvent(Capture MyCam) {
$
cap- myCam.read();
tureEvent(). +
- }
"
myCam.read():
#
$
Camera
-
. &
-
.
#
-
"
-
.
uploadInterval. &
-
,
- $
" % % , upload- 120
( ). 4
-
Picture()
,
catCam.jpg
. 0
- uploadInterval. *
%-
$ . —
-
0
uploadPicture()
.
2
// Q
:
. /
, - String boundaryHeader = "--" + boundary + "\r\n";
boundaryHeader +="Content-Disposition: form-data;
name=\"image\"; ";
boundaryHeader += "filename=\"" + fileName + "\"\r\n";
: Content- boundaryHeader +="Content-Type: image/jpeg\r\n\r\n";
Type:
$
// Q
:
: String boundaryTail ="\r\n--" + boundary + "--\r\n";
;
$ // $
,
// , boundaryTail:
,
int contentLength = boundaryHeader.length()
- + thisFile.length + boundaryTail.length();
. = $
, - request += "Content-Length: " + contentLength + "\r\n";
// 9
, POST
,
- //
,
// -
#
:
%
: request += "Content-Type: multipart/form-data; boundary=";
request += boundary + "\r\n\r\n";
Более сложная сеть 193
* ,
, // N
, boundaryHeader,
//
boundaryTail:
,
thisClient.write(request);
" thisCli- thisClient.write(boundaryHeader);
ent.write(): thisClient.write(thisFile);
thisClient.write(boundaryTail);
}
. *
, - uploadPicture();
, }
}
uploadPicture(), " -
,
. =
$
draw():
194 Глава 3
%
-
— $
22
=
— .
Более сложная сеть 195
*
,
- Подключение к общедоступному
catServer.js,
$
,
серверу
$ . 2 , %
"
-
$
,
-
,
, ,
: IP-
$
. *
—
-
$ npm install crypto express nodemailer
—
-
serverAddress
Processing
,
, %
-
,
.
,
-
,
.
-
,
:
http://server.address:8080
server.address
%
-
.
&
,
=
node.js,
npm
- $ ,
"
package.json, -
package.json,
"
. [
:
,
,
(
- www.github.com/tigoe/MakingThingsTalk2/tree/
node_modules). ;
,
master/3rd_edition.
,
#
" forever
"
:
$ forever start catServer.js
&
$
:
warn: --minUptime not set. Defaulting to: 1000ms
(+ minUptime $.
' 1000 )
warn: --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms
(+ spinSleepTime the $. \ # ,
1000 )
info: Forever processing file: catServer.js
(Forever %
: catServer.js)
%
-
,
. '
forever
, :
$forever list
n
,
.
forever
,
$
-
.
" "
" :
$ forever logs
[
" less, tail, head
"
.
>
%
-
%
,
-
(
)
. /
%
—
-
"
.
Более сложная сеть 197
Завершающие штрихи
>
,
-
. &
%
-
%
node.
,
js,
Processing
+
. ;
-
"-
+
-
(
. 3.15).
. &
% -
Заключение
Полагаю, что прочитав эту главу, вы лучше поняли организационную структуру Интернета
и принципы работы сетевых приложений.
+
,
, — $
,
"
" . 7 -
. =
-
"
,
,
,
-
%
+
- " $ ,
.
- «# ». ;
, , -
" -
" ,
,
,
$
"
-
. =
, —
"
-
.
+
"
$
, -
Ethernet
-
" -
.
telnet, -
Глава 4
«ГЛЯНЬ, МАМА,
ЗДЕСЬ НЕТ КОМПЬЮТЕРА!»
МИКРОКОНТРОЛЛЕРЫ
В ИНТЕРНЕТЕ
Первая мысль, которая приходит многим людям в голову после
создания проекта наподобие подключенного к Сети места отдыха
для кота из главы 3, — Замечательно! А как бы вообще обойтись
без компьютера? Подключать к настольному компьютеру или даже
к ноутбуку микроконтроллер лишь для того, чтобы он мог получить
доступ в Интернет… В конце концов, как мы видели в той же главе 3,
протоколы управления связью в Интернете — это всего лишь
текстовые строки, а микроконтроллеры могут обмениваться
короткими текстовыми сообщениями без каких бы то ни было
проблем. Использование микроконтроллеров совместно
с периферийными модулями, которые могут подключаться к Сети,
придаст и им эту полезную способность. В этой главе мы узнаем,
как подключить микроконтроллер к Интернету с помощью
периферийного устройства беспроводной связи Wi-Fi.
Необычные проекты
X
YBox (http://uncommonprojects.com/site/play/ybox-2)
-
RSS-
%
,
$ Ethernet-
XPort
Propeller. 0
-
!
Uncommon Projects.
202 Глава 4
Рис. 4.1. Новые компоненты для проектов этой главы: 1. Микроконтроллер с возможностями Wi-Fi. Слева направо показаны
платы Arduino MKR1000, SparkFun ESP8266 Thing и Adafruit Feather Huzzah! ESP8266. 2. Фотодатчики. 3. Красный, зеленый и си-
ний светофильтры. 4. Вольтметр. В принципе подойдет любой, но для лучшего эффекта желательно найти вольтметр как можно
более «антикварного» вида
(3
4#), D: 1659-1005-ND
0–5 & $.
&
SF: TOL-10285, F: 1015878, RS: 244.890
ESP8266.
SF: WRL-13231, AF: 2471
D
, 1 +.
N
>
- D: 160-1144-ND 160-1665-ND, J: 34761
Wi-Fi, 1 +. 4
94511, F: 1855510, RS: 228-5972 826-830, SF:
+
Wi-Fi, $
COM- 09592 COM-09590
. 0
(
220 , 1 +.
Wi-Fi
.
D: 220QBK-ND, J: 690700, F: 9339299, R: 707-
C
, 1 +. 7612
D: 438-1045-ND, J: 20723 20601, SF: PRT-
>.
12615 PRT-12002, F: 4692810, AF: 64, SS:
]=
=
-
319030002 319030001
-
.
"
.
=
-
. &
"
,
$ $ %
:
Ethernet,
-
Ethernet — ,
, Wi-Fi, —
-
SMTP HTTP. / - , Wi-Fi ,
,
Wi-Fi
-
,
-
.
,
.
0
- Сравниваем два модуля Wi-Fi
. *
- 7 Wi-Fi
-
,
. %
, $
Arduino. & $
"
-
,
-
: Wi-Fi
- WINC1500 Atmel ESP8266
,
- Espressif,
—
1. 7 WINC1500
-
— % MKR1000, % Arduino WiFi101
. [
, $
Feather M0 WiFi WIN1500
,
- Adafruit. 3 ESP8266
"
- Huzzah! ESP8266 Adafruit,
Wi-Fi Thing SparkFun
-
Ethernet. ;
- . Thing Dev SparkFun,
Bluetooth,
MKR1000 Feather Huzzah! ESP8266
2,
Adafruit
. 4.2.
Рис. 4.2. Оснащенные модулями Wi-Fi микроконтроллерные платы: Thing Dev компании SparkFun (слева), MKR1000 (в центре)
и Feather Huzzah! ESP8266 компании Adafruit (справа). Для проектов этой книги, использующих беспроводной канал Wi-Fi,
можно взять любую из них, так же как и плату Feather Huzzah! WINC1500. Плата MKR1000 имеет большее количество контак-
тов ввода/вывода общего назначения и аналогового ввода. Платы MKR1000 и Feather оснащены встроенными зарядными
устройствами
Off
D0
RESET
On
3.3V
Pwr
TX
RX
D5
NC
-
,
-
.
, # ,
ESP8266
Arduino. * $
-
, -
%
/
. ;
" , MKR1000 , , -
Feather M0 c WINC1500.
,
/ " -
7
ESP8266
- ESP8266
USB-Serial,
TTL-
. 0 ESP8266 Thing MRK1000.
Dev SparkFun
"
-
USB/Serial
FTDI, Feather 0
,
-
ESP8266 Huzzah! Adafruit —
-
USB/Serial Silicon Labs, -
802.11n (
5 qq)
$
$
-
API-
"
,
.
$
!. «4 !
USB/
Serial» 2.
,
-
ESP8266 Thing ESP8266 Thing Dev
% , Feather ESP8266
Huzzah!, $
$
-
% .
SparkFun
%
ESP8266 —
: https://learn.sparkfun.com/tutorials/
esp8266-thing-hookup-guide/installing-the-
esp8266-arduino-addon.
206 Глава 4
Проект 6
Привет, Интернет!
Из предыдущей главы мы узнали, что сетевые устройства могут работать как клиент или как
сервер. В этом проекте мы на основе Arduino-совместимого микроконтроллера создадим очень
простой веб-сервер, предоставляющий веб-страницу, чей фон меняется в соответствии с цветом,
освещающим подключенные к микроконтроллеру датчики.
!
" A
Требуемые компоненты
$
http://arduino.esp8266.
#
Arduino
, com/stable/package_esp8266com_index.json.
"
Wi-Fi, 2
" A
-
1 %., — MKR1000
esp8266 by ESP Community.
ESP8266.
/
-
+
: Wi-Fi, SparkFun, Adafruit.
, X3 (UART).
X
+
=
"
Wi-Fi, 1 %.
,
9
10 0, 3 %.
:
,
. /
-
[ (
-
), 3 %.
-
>
, 1 %.
. * -
#
, 3 %.:
,
—
.
-
" . & $
.
-
Установка соединения MKR1000
. 4.3.
$
,
,
Arduino IDE
.
Как работает библиотека WiFi101?
,
MKR1000
-
| ,
,
,
"
1.
WiFi101 Arduino
2
,
-
(
$
D | >
-
-
WiFi101. 4
,
ESP8266 WiFi). > WiFi101
"
2
WINC1500 -
D | >
| N
, ,
. =
-
-
ESP8266
\ | ]
. 7
]
$ : Server Client. -
,
1
MKR1000
Ar-
, "
-
duino SAMD Boards.
2
+
,
-
' $ , -
"
%
- Wi-Fi. 3
Arduino,
% — Wi-Fi 101.
,
-
«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 207
$
-
.
,
,
: read(), write(), print()
A B C D E F G H I J
println() Stream,
1 1
—
. 0 Красный
светофильтр
% ,
- 20 20 Зеленый
светофильтр
. > ESP8266 WiFi, -
$ - 25 25
Синий
светофильтр
Stream,
$
.
0
- 30 30
A B C D E F G H I J
,
% Wi-Fi
+
. &
,
% - Фотосопротивление 200 кОм
Wi-Fi (
, %
%
-
) —
(SSID)3,
-
%
.
,
MAC-
% Wi-Fi, -
10 кОм 3,3 В
$
-
- Фото- Модуль
сопротивление микроконтроллера
%
. 4
%
%
200 кОм
MAC-
, Analog 0
MAC-
% Analog 1
% MAC-
-
%
. = Analog 2
10 кОм
$
%
,
Фото- Общий
сопротивление
. X MAC-
200 кОм
"
,
, !. «&
».
. =
$
-
scanNetwork()
, -
WiFi101. /
%
,
MAC- $. #
,
!. «&
» — -
%
$
MAC-
% (SSID)
,
-
Wi-Fi,
.
.
Сканируем адреса
=
% /*
Wi-Fi
- Z
6 . if (mac[i] < 0x10) { //
,
MAC-
- // 1 # #%,
$
- Serial.print("0"); //
printMacAddress() }
Serial.print(mac[i], HEX); // + R
( ESP8266WiFi - // '
MAC-
" MAC-
- Serial.print(":"); // R $
, $ }
0 5 - Serial.println(mac[0], HEX); // R
5 0): //
MAC-
}
*%
.
*,
" ,
$
-
. #
%
% $
— $
,
#include. = $ "
,
-
(
. 4.4, ), -
New Tab (* ). 2
(
. 4.4,
-
!) —
, config.h. &
$ -
$ . #
"
$
Рис. 4.4. Создание новой вкладки в среде разработки Arduino (вверху) и присвоение ей имени (внизу)
«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 211
, ;
-
#include "config.h"
. "
,
%
%
. *
# ,
-
$
" ,
ssid
config.h.
SSID
%
:
char ssid[] = "ssid"; // \ (SSID)
& %
" -
//
Wi-Fi
— config.h —
char password[] = " "; //
Arduino.
// -
& - server.begin(); //
', $
// R IP-
,
- Serial.print(" - -%
R
$
IP-
,
: http://");
,
IPAddress ip = WiFi.localIP();
: Serial.println(ip);
}
// ((\n \r\n)
if (request.length() <= 2) {
, : client.println("HTTP 200 OK\n"); //
// HTTP
delay(10); // ,
//
if (client.connected()) { //
// ',
client.stop(); // ' .
}
}
}
}
}
0
:
. 2
-
,
,
%
IP-
,
, -
,
.
,
%
.
&
2
, -
$
HTTP,
%
-
,
%
. /
,
,
,
GET/. & %
-
HTTP 3. ;
"
,
-
($
-
,
-
" curl): $
—
-
GET / HTTP/1.1
—
.
Host: 192.168.43.184
User-Agent: curl/7.46.0 '
Accept: */* -
, ,
-
" - HTML.
>%
HTTP = , $
.
,
«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 213
& HTML - // + $ :
$
- for (int analogChannel = 0; analogChannel < 6;
analogChannel++) {
result += " ";
MKR1000. =
- result += analogChannel;
%
result += " ";
- result += analogRead(analogChannel);
result += "<br />\n";
analogChannel: }
&
-
,
,
Wi-Fi
.
214 Глава 4
*%
Arduino
;
.
, -
$
,
—
" -
-
, -
+
. *
- result += "
Arduino</title></head>"; // #
,
- // $ HTML
result += "<meta http-equiv=\"refresh\" content=\"3\">";
. *
,
$
-
? = $ -
makeResponse()
,
-
" </head>,
"
( -
%
),
:
;
-
.
&
- result += "\n<body>\n"; // ^
. // %
:
&
$ - result += "<body bgcolor=#";
// 9
:
,
% int red = analogRead(A0) / 4;
,
- int green = analogRead(A1) / 4;
- int blue = analogRead(A2) / 4;
. = $ // N!
//
:
makeResponse() for
result += String(red, HEX);
$
result += String(green, HEX);
" (- result += String(blue, HEX);
%
). // %
:
*
"
, result += ">";
- // %
HTML-
:
result += " Arduino
#";
- result += String(red, HEX);
%
: result += String(green, HEX);
result += String( blue, HEX);
2
%
%
-
result += "</body></html>\n\n"; // #
" ,
- //
,
" - return result;
. }
«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 215
Рис. 4.5. Настройки перенаправления портов маршрутиза- Рис. 4.6. Настройки перенаправления портов беспровод-
тора Apple AirPort Express ного маршрутизатора Linksys
216 Глава 4
Проект 7
Сетевой измеритель качества воздуха
Кроме вывода на веб-страницы, всевозможные данные могут отображаться многими иными спо-
собами. В наших домах, например, имеются часы, барометры и термометры, служащие в качестве
как информационных, так и декоративных устройств. Но чтобы физическое устройство могло
показывать нам полученные из Интернета данные, оно должно уметь подключаться к серверу,
запрашивать эти данные и преобразовывать их в цифровой ряд, управляющий устройством их
отображения.
& $
.
Требуемые компоненты
= $
-
- %
#
Arduino
,
:
-
"
Wi-Fi, 1 %.:
. `
, • MKR1000;
% • Arduino Uno-
$
% WiFi101;
%
. 7 ,
- •
,
, , ESP8266.
, +
: Wi-Fi,
,
% . +7 (PWM), X3 (UART), /
" (GPIO).
7
-
,
X
+
#
" Wi-Fi. Wi-Fi, 1 %.
2 -
>
, 1 %.
,
,
&
, 1 %.
" analogWrite()
-
# , 1 %.
-
9
220 0, 1 %.
,
%
-
(+7) $ .
"
%
7
,
-
,
HTML CSS. ;
HTML
-
API7.
( -
-
!
6), ,
, -
-
"
%
" AirNow — 3
"
-
"
,
7
API, Application Programming Interface —
6
0 . web-scraping.
.
«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 217
#3 (www.airnow.gov). * $ - Для жителей других стран
= , #3, -
-
#3. C "
AirNow — Sonoma Technologies —
-
%
%
-
. 4
AirNow-I
$
,
(
, #3) -
;
7
. = -
,
$
-
. www.sonomatech.com/project.cfm?uprojectid=1102
.
"
. " , 30
. 3 -
7
-
"
-
, -
, $
%
-
,
- +7.
. ' % -
, -
%
-
— " , , -
,
+7-
%
. / -
%
-
-
(+7)8.
.
'
+7
,
- *
. 4.7
-
, "
, -
$
.
,
,
-
: —
-
. *
,
+7 MKR1000,
— % ,
,
,
, 4. /
-
8
.
0 . Pulse-Width Modulation (PWM).
void setup() {
Serial.begin(9600);
}
void loop() {
//
// - :
218 Глава 4
A B C D E F G H I J
1 1
5 5
10 10
15 15
20 20
25 25
30 30
A B C D E F G H I J
3,3 В
D6 Рис. 4.7. Монтажная (вверху) и принципи-
альная (внизу) схемы подключения вольтме-
тра к микроконтроллерной плате MKR1000.
Встроенный
Встроенный светодиод подключен к цифро-
светодиод
вому выводу платы 6 (D6)
Модуль
микроконтроллера
Цифровой вывод 4
Светодиод
V Вольтметр
«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 219
=
pwmValue -
0–3 &,
- $
%
. &
,
pwmValue 230,
-
$
,
. 3 &,
-
=
,
- . 0
-
,
0–5 &,
$
"
pwmValue
$
-
,
- . /
-
-
MKR1000
3,3 &. * «
» % %
.
http://www.airnowapi.org/aq/observation/latLong/historical/?format=application/
json&latitude=40.7496&longitude=-73.9836&date=2016-05-10T00-0000&distance=10&API_
KEY=0000AAAA-0A0A-1111-A123-11223344AA55
$
,
$
.
HTML. & - &
PM2.5 $
-
PM2.5 —
:
-
,
PM2.5,
. > , $ -
"
-
,
,
(AQI). /
%
10
%
"
Arduino.
. = ,
-
«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 221
%
" $
- #"
HttpClient.
* ,
,
ArduinoHttpClient.
,
>
/*
"
- +- AirNow
,
-
: Arduino WINC1500
-
*/
Arduino. 0
// ' % # %
D,
// / "
>
| //
N
, -
void setup() {
%
" A
- // \#$ ' $
// \#$
(
//
' Wi-Fi,
%)
ArduinoHttpClient, // '
- // & # '
//
' , R
N- //
. }
void loop() {
: // HTTP-$
// M HTTP-$
}
void connectToServer() {
// $ HTTP, '
// , "PM2.5",
// $ $ PM2.5
//
222 Глава 4
API -
,
-
. 4
.
,
, ,
" $
-
,
. &
—
.
-
- *
-
-
( char),
. 7
$ - ( string). &
-
%
"
,
-
HTTP,
"
"
$
. &
- toCharArray(). =
:
$ , API, -
String myString = "/some/server/route";
, %
,
char stringArray[myString.length() + 1];
. 9 $
myString.toCharArray(stringArray, myString.
Arduino
length() + 1);
String. # "
,
. 3
-
$ ,
-
-
"
,
0, $
$
-
String(),
. > % ,
$
. #
-
%
,
"
"
$
BIN HEX. .c_str() String.
«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 223
Пытаемся подключиться
к серверу
Подключились
Да к серверу?
Нет
Отправляем
запрос HTTP
Сопоставляем результат
диапазону показаний
вольтметра
), const int connectedLED = 4; // '
const int meterPin = 5; //
const int meterMin = 0; //
(
- const int meterMax = 255; //
) - const int AQIMax = 200; //
: // $ -
const long requestInterval = 120000; // $
//
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
- // ' :
,
while (http.connected()) {
setLeds();
,
// :
setLeds(),
- if (http.available()) {
,
.
- http.findUntil("PM2.5", "\n"); //
// "PM2.5"
findUntil()
- AQI = http.parseInt(); // $
// $ PM2.5
$
"PM2.5",
http.flush(); //
" }
parseInt()
- }
"
if (AQI > -1) { // $
- // $ - AQI (\+),
.
Serial.print("PM2.5: ");
Serial.println(AQI);
+&
setMeter(AQI); // $
(AQI) set- }
Meter() -
:
2
http.stop(); // $ $
, http. lastRequestTime = millis(); // - R
// $ HTTP
stop(),
"
- }
lastRequest-
Time:
Non-authoritative answer:
Команда nslookup также возвращает адрес сервера
Name: makezine.com
DNS, который она использовала
Address: 104.25.45.28
IP-
, $
.
Форматы данных
Разбираясь с проектами этой книги, мы уже познакомились с рядом существующих протоколов,
основанных на передаче текстовых данных, и даже создали несколько своих. По сути, прото-
кол — это средство для структурирования данных при организации связи. Некоторые протоко-
лы просто передают информацию, а другие отдают команды — явно или неявно — посредством
запросов. Далее нам придется часто работать с разными протоколами, поэтому сейчас было бы
полезно подытожить наши знания о рассмотренных к этому моменту форматах данных.
NMEA-0183,
-
,
GPS.
$
-
,
10
—
. *
,
"
-
CSV, Comma-separated values — ,
.
-
11
TSV, Tab-separated values — ,
- ,
— :
.
230 Глава 4
"DateObserved":"2016-05-10 ","HourObserved":0,"LocalTimeZone":"
EST","ReportingArea":"Newark","StateCode":"NJ","Latitude":40.7267
,"Longitude":-74.1442
3
"
- &
-
(=),
— -
:
,
(&). ,
,
. 3
-
?name=tom&age=14
:
.
3 "
«- '
-
»,
. 2
,
$ $
—
:
,
$ .
Host: localhost
Content-Length: 19006
Content-Type: multipart/form-data Примечание
7
&
Java, JavaScript C
+
—
-
,
,
HTTP12 SMTP13. 0 "
,
-
:
GET
#
-
"
:
POST,
,
- •
— \n
. 2 -
•
— \r
"
,
" • — \t
*
$
-
. _
" -
,
" % " . &
-
«- »,
-
"
, $
-
.
(&).
& ,
,
"
HTTP
POST 2:
name=tom&age=14
12
HTTP, HyperText Transfer Protocol —
.
13
SMTP, Simple Mail Transfer Protocol —
-
[$
] .
«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 231
,
- «- »
-
% (. 4.1). (
,
, :3, $:23).
&
Таблица 4.1. Массив датчиков, расположенных
. =
-
в разных местах дома
$
-
Последнее
Адрес Размещение Значение
чтение JSON14.
1 12:30:00 60
2 q
05:40:00 54 14
JSON, JavaScript Object Notation —
3 & 01:15:00 23 JavaScript.
4 # 09:25:00 18
5
06:20:00 3
Формат JSON
[
JSON
,
«- ».
-
,
. = ,
-
. 4.1,
"
:
/
- "$":"",
. /
"
":"05:40:00",
"":54
,
},
, - {
$
" . "":3,
$
, - "$":"",
, %. # "
":"01:15:00",
"":23
,
- },
JSON, $
{
"":4,
"
: "$":"",
"
":"09:25:00",
[ "":18
{ },
"":1, {
"$":" -", "":5,
"
":"12:30:00", "$":"",
"":60 "
":"06:20:00",
}, "":3
{ }
"":2, ]
232 Глава 4
"
-
,
$
, JSON,
— $
,
, - . =
JSON
-
,
-
HTTP,
. ;
(
)
,
.
%
,
JSON и JavaScript
,
7 -
JSON
JSON
JavaScript, $
API-
,
JSON
-
"
-
,
" $ .
,
> ,
JavaScript
- $ JavaScript. & -
AirNow, -
" JSON. *
7, -
.
"
JSON. =
&
,
node.js
-
$ .
,
JSON.
[
function handleResponse(response) {
,
var result = ''; // Z -
han-
response.on('data', function (data) { // ,
dleRespons(),
-
result += data; // $
,
- });
.
"
- response.on('end', function () { // $'
result. // ,
3 response.on('end') var response = JSON.parse(result); //
// $
- console.log(response); // R
JSON ,
- });
, $
: }
* ,
- var request = http.request(options, handleResponse); // ^
http.re- // $
request.end(); // $
quest()
%
request.end():
#
$
aqiClient.js
:
$ node aqiClient.js
- /
,
-
,
-
JSON $
- $
-
. 0
,
API-
-
$
$
,
"
$ response [0], — $ JSON. # "
response[0].AQI response[0].Longitude.
HTTPS,
&
require('https');
, .
%
443.
15
0 . REpresentational State Transfer —
.
234 Глава 4
"
request.params.
age,
21. _ ,
-
«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 237
. ;
responseString = "<p> Hi " + name
+ ". + $
, ' , , ";
responseString += "
R $ ..</p>\n";
—
, }
$ }
: // :
response.writeHead(200, {"Content-Type": "text/html"});
response.write(responseString);
response.end();
}
2
// start the server:
, - server.listen(8080);
//
$ :
server.get('/check/name/:name', checkAge);
$
: server.get('/check/age/:age', checkAge);
server.get('/check/name/:name/age/:age', checkAge);
&,
,
- 2
,
-
GET. 9
" :
REST ,
http://www.myserver.com:8080/check/
POST PUT? #
- name/tom/age/42
$ ,
GET
-
,
3
,
-
. X %
,
" curl:
,
- $ curl http://www.myserver.com:8080/
check/name/tom/age/42
server.get() server.post().
&
www.myserver.com
#
-
localhost,
"
:
"
.
$ node RestAgeCheck.js
238 Глава 4
$
(
-
.
=
// / :
while String lastToken = ""; //
while (!lastToken.endsWith("HTTP")) {
,
String currentToken = client.readStringUntil('/');
$% (/). 4
- if (lastToken == "age") {
"
int age = currentToken.toInt(); //
, Serial.print("age: ");
"
Serial.println(age);
: }
для диагностирования
-
,
-
последовательного обмена
$ .
-
-
,
",
. 4
Wi-Fi,
-
,
" $ $ ,
-
,
"
. , "
. *
,
,
Физические методы
-
диагностирования
, ,
#
-
. * $ -
" ,
-
,
,
"
,
. ' $
"
. =
,
$ -
, " -
-
. ;
" ,
, %
.
. &
$
,
$ ,
,
%-
.
-
, $
.
"
- 7
. &
— $
,
-
,
. ~ $
. /
" , -
,
" . $
-
, ,
. $
,
%
-
. +
- , %
.
.
-
}
,
"
. 4
void loop() {
%
if (DEBUG) Serial.println(" ");
if (DEBUG),
- }
,
-
DEBUG -
false:
«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 241
Serial.print() - void setLeds(int thisLevel) {
"
" , if (DEBUG) Serial.print("\ % # setLeds()...");
" : // Z'
% #
}
% %, // "PM2.5"
AQI = http.parseInt(); // $ $
- // PM2.5
. $
http.flush(); //
,
- }
, }
" " -
,
"
:
// $:
"
Serial.println("
'");
. * - }
else {
. *
,
" // ' :
Serial.println("
' ");
}
client.connect(),
-
-
:
Просто наблюдайте
+ % // ', - -
:
- if (client.connected()) {
if (client.available()) {
char inChar = client.read();
, Serial.write(inChar);
. 0 , }
}
-
,
-
$
,
. /
. 0"" ,
%
,
, . $
, -
, — -
, , -
.
«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 243
void setup() {
Serial.begin(9600);
Serial.println("^ ");
//
' Wi-Fi,
while ( WiFi.status() != WL_CONNECTED) {
Serial.print("
' : ");
Serial.println(ssid); // R (SSID)
WiFi.begin(ssid, password); // '
delay(2000); // $ 2
// '
}
}
void loop() {
printWiFiStatus();
delay(10000);
}
// ':
IPAddress ip = WiFi.gatewayIP();
Serial.print("IP- '$: ");
Serial.println(ip);
Serial.println(subnet);
// ':
byte apMac[6];
WiFi.BSSID(apMac);
Serial.print("BSSID (MAC- ): ");
for (int i = 0; i < 5; i++) { // # 0 4
if (apMac[i] < 0x10) { //
, 16
// (0-0 # %)
Serial.print("0"); // + R 0:
}
Serial.print(apMac[i], HEX);// + R
// MAC-
Serial.print(":"); //
}
Serial.println(apMac[5], HEX); // R
//
MAC-
$
// + R MAC- Wi-Fi:
byte mac[6];
-
WiFi.macAddress(mac);
Wi-Fi ( Serial.print("MAC-
: ");
ESP8266WiFi
" for (int i = 5; i > 0; i--) { // # 5 1
MAC-
- if (mac[i] < 0x10) { //
, 16
// (0-0 # %)
, $
Serial.print("0"); // + R 0:
0 5
}
5 0): Serial.print(mac[i], HEX); // + R
// MAC-
Serial.print(":"); //
Внимание! }
Serial.println(mac[0], HEX); // R
Разные библиотеки //
MAC-
#
-
ESP8266WiFi - // + R IP- Wi-Fi:
IPAddress gateway = WiFi.localIP();
.
Serial.print("IP- ");
=
Serial.println(gateway);
macAddress() BSSID()
-
$ // + Wi-Fi:
"- long rssi = WiFi.RSSI();
,
Serial.print("M : (RSSI):");
# . Serial.print(rssi);
Serial.println(" ");
Serial.println();
}
. 4
- */
, ,
,
, // ' % # %
#include <SPI.h>
%
#include <WiFi101.h>
.
#include <ArduinoHttpClient.h>
#include "config.h"
$
,
WiFiClient netSocket; //
$
-
const char server[] = "myserver.com"; //
config.h,
-
String route = "/foo"; // API
" SSID
-
. void setup() {
Serial.begin(9600); // #$ '
$
while ( WiFi.status() != WL_CONNECTED) { //
',
Serial.print("
' : ");
Serial.println(ssid); // R (SSID)
WiFi.begin(ssid, password); // '
delay(2000);
}
//
' , R
:
IPAddress ip = WiFi.localIP();
Serial.print("IP-: ");
Serial.println(ip);
}
void loop() {
HttpClient http(netSocket, server, 8080); // $
HTTP
http.get(route); // $ HTTP
while (http.connected()) { // ' ,
if (http.available()) { //
:
String result = http.readString(); //
Serial.print(result); // R
}
}
// #
http.stop(); // $ $
delay(10000); // 10
}
246 Глава 4
=
- /*
node.js, - test web server
-
-
: node.js
. */
-
" // ' " :
$
" ,
var express = require('express'); //
'
- // express:
var server = express(); // C$ " server,
. ;
- // $
HTTP.
- // express
,
node.js, // % #' $, $
// $ :
$
function respondToClient(request, response) {
. 9 % , console.log(request.connection.remoteAddress);
,
- console.log(request.headers);
,
- console.log(request.query);
.
% - // write back to the client:
$
- response.write("
, !\n");
response.end();
}
,
-
: // :
server.listen(8080);
//
$ :
server.get('/', respondToClient);
«Глянь, мама, здесь нет компьютера!» Микроконтроллеры в Интернете 247
Заключение
В этой главе вам был продемонстрирован подход, позволяющий создавать очень гибкие и по-
лезные сетевые объекты. По сути, сетевой объект представляет собой браузер, запрашивающий
содержимое из Сети и извлекающий требуемую информацию, или сервер, который доставляет
информацию клиенту. Такой подход можно использовать во многих разных проектах.
"
$
, 0
$
,
,
"
"
" -
,
"
-
. # % — . *
-
node.js, -
,
"
"
,
"
" -
. ;
- $ . #
-
-
-
,
% % .
-
,
-
, ;
-
. /
,
,
,
" $ ,
,
,
.
.
Глава 5
-
"-
%
. 0
-
'
-1 * (Jin-Yo Mok).
250 Глава 5
Рис. 5.1. Новые компоненты для проектов этой главы: 1. Матовый картон для корпуса. 2. Датчик угла поворота (энкодер).
3. Гнездовые разъемы. 4. Светодиоды. 5. Плата MKR1000. 6. Кнопка со встроенным светодиодом. 7. Перфорированная печатная
плата
3
4
1
"
,
-
,
. =
-
%
,
.
( , $
HTTP), & %
,
-
$ .
,
"
. #
,
-
. * - "
-
, $
.
Skype Google
,
- Hangout. #
,
-
"
. 2
$
"
,
,
? +
,
$
,
- -
( . chat servers). & $
? 3, ,
%
,
-
« --»,
"
-
-
. #
? $ -
-
-
"
"-
. &
.
-
" +
,
,
-
,
"
"
$ ,
. &
. *
-
-
,
" ,
,
-
-
,
. 3
.
#
TCP
. *
,
-
" $
—
$
.
,
" ,
-
. *
% 2
UDP, User Datagram Protocol —
-
TCP
-
.
254 Глава 5
Проект 8
Управление воспроизведением видео на основе сокетов TCP
Разработка приложений для управления мультимедиа предоставляет хорошую возможность
изучить подключения, осуществляемые в режиме реального времени. Следующий проект пред-
ставляет собой сетевое видеоприложение, которым можно управлять с помощью физического
устройства (пульта). Сервером будет программа Processing, а клиентом — пульт, оснащенный
микроконтроллером, подключенным к Сети по Wi-Fi. Экраны клиента и сервера должны быть
расположены вблизи друг от друга, чтобы пользователь мог их видеть. Здесь мы используем се-
тевую связь потому, что она предоставляет гибкость в работе с множественными подключения-
ми, а не ради ее возможности подключаться к удаленным устройствам.
_
"
- ,
,
-
$
:
"
/,
- %
-
, , , -
( $
). 4
. -
%
" :
,
" -
/,
, % -
,
" .
.
*
3
" :
$
" ,
.
1. &
.
«- »,
2.
$ ,
TCP. . /
-
3.
-
. #" -
.
"
:
4.
" -
: ?
— connect: n
2
n
•
;
;
•
N-
?
— play-
; ing: n
• . 2
n 1, 0 (
);
5. 2
,
- ?
— position: n
" .
2
n
0
,
. -
-
, -
.
— ;
,
? — exit: n
TCP-
- 2 n=1
" ;
"
ASCII. ?
"
(\n).
Связь в режиме реального (почти) времени 255
Тестовый чат-сервер
,
. #
$
.
- 0
,
%
, ,
" ,
,
" . =
.
Processing,
"
"
- // Z ' '
// R:
" . 0
String message = thisClient.readStringUntil('\n');
" (
,
, // ,
% #:
"
- if (message == null) return;
) $
// + R IP- :
" , println(thisClient.ip() + ": " + message);
IP-
. 4
if (message.contains("exit")) { //
// ',
" , myServer.disconnect(thisClient); // '
"
"exit", clients.remove(thisClient); // $
// .
: }
}
2
, -
telnet ( -
telnet,
% Windows 10 telnet
-
,
,
$ -
,
). 4
IP-
%
,
.
-
, 192.168.1.45, (
" : playing, position
8080) - exit. exit:1
: .
telnet 192.168.1.45 8080
;
,
,
-
-
,
,
"
-
.
:
telnet localhost 8080
telnet 127.0.0.1 8080.
Связь в режиме реального (почти) времени 257
Требуемые компоненты
Arduino-
,
-
>
, 1 %.
"
Wi-Fi, 1 %.:
9
220 0, 5 %.
• MKR1000;
, 1 %.
• ,
Arduino Uno,
% WiFi101;
# , 3–5 %. (
.
).
•
WINC1500.
, 1 %.
+
: Wi-Fi, -
=
($
)
, 1 %.
/, X3 (UART).
, 1 %. (
.
X
+
).
Wi-Fi, 1 %.
258 Глава 5
#
MKR1000. *
/
. 0
"
$
,
- Adafruit,
-
.
-
"
.
ESP8266 $
/, =
-
$,
,
. /
-
, -
-
$
. ;
. &
-
/
,
-
.
%
.
&
,
,
%
.
,
% . = «" »
, «
». &
-
"
,
"
360°.
-
"
(LOW)
.
. /
;
(
, ,
)
-
,
- ,
,
"
.
-
$
"
. &
-
(gray code).
,
-
$
,
. pinMode(pinNumber, INPUT_PULLUP).
9 $
>%
. ;, $-
/ " -
,
$ (GPIO)
" (pullup)
,
24
,
-
24
/.
-
,
«
» -
$
- .
,
— $
,
-
«" »
$
. ; ,
.
= $ —
-
/
-
.
,
-
/
SparkFun,
,
,
""
-
" "
. # $
,
-
.
Связь в режиме реального (почти) времени 259
*
. 5.2 +
-
-
,
. 5.3 —
$
% -
. 7
,
. 0
-
,
%
10
15
20
25
C30
35
40
45
50
55
60
B1
B2
1
A
J
J
I
I
G H
G H
F
F
C D E
C D E
A B
A B
10
15
20
25
30
35
40
45
50
55
60
1
Рис. 5.2. Монтаж компонентов пульта управления видео на беспаечной макетной плате. Хотя здесь использована полнораз-
мерная макетная плата, схема поместится на макетную плату вдвое меньшего размера
220 Ом 220 Ом
Энкодер 3,3 В
Digital 0
220 Ом
Digital 1
Digital 2 Модуль
микроконтроллера
Digital 3
Кнопка подключения Digital 4
к серверу
Digital 5
Светодиод индикации
состояния воспроизведения Светодиод индикации
подключения к серверу
260 Глава 5
. *
. *
. 5.6 5.7
,
-
- ,
. 5.8 — %
-
,
% -
%
$ .
% -
-
$
- ,
.
,
,
!
-
3
,
-
.
Рис. 5.4. Монтаж схемы пульта управления видео на перфо- Рис. 5.5. Монтаж схемы пульта управления видео на перфо-
рированной печатной плате (вид сверху). За исключением рированной печатной плате (вид снизу). Здесь хорошо видны
резисторов, все компоненты схемы подключены вставкой их соединения пайкой монтажных проводов, резисторов и гнез-
штыревых контактов в гнездовые разъемы платы, чтобы их довых разъемов на обратной стороне плат
можно было легко извлечь
B1
B2
A
C
Связь в режиме реального (почти) времени 261
Рис. 5.6. Пульт управления видео, смонтированный в корпусе из твердого картона. Высота расположения деталей схемы
рассчитана таким образом, чтобы светодиоды и ручка энкодера слегка выступали над верхней панелью корпуса. Прежде
чем приступать к изготовлению корпуса для пульта, соберите и смонтируйте его схему, чтобы знать, какого размера корпус
делать
Рис. 5.7. Cхема пульта управления видео, собранная на перфорированной печатной плате и подготовленная для упаков-
ки в корпус. Монтаж на эту плату светодиодов, энкодера и светодиодов осуществляется с помощью гнездовых разъемов.
Использование дополнительных удлиняющих разъемов намного облегчает задачу подгонки высоты компонентов под кор-
пус. Откусывайте выводы светодиодов понемногу, пока не будет достигнута требуемая высота, а затем вставьте их в разъемы.
Шестигранные стойки позволяют приподнять плату над днищем корпуса, создавая пространство для LiPo-батареи, которая
удобно подключается к специальному разъему в плате MKR1000. Для проекта необходимо использовать батарею емкостью
минимум 1000 мА
262 Глава 5
83,8 мм
8,9 мм 101,6 мм
Ø 5,2 мм
Ø 3,2 мм
34,9 мм
24,3 мм
Ø 3 мм
73 мм
Ø 8,3 мм
Ø 5 мм Ø 7 мм
33,5 мм
55,6 мм
61,2 мм
68 мм
74,9 мм
52 мм
8,9 мм
5 мм
76,2 мм
73 мм
7,6 мм 12,6 мм
Диаметр всех нижних
отверстий 3,2 мм
5,8 мм
8,9 мм
52 мм
Ø 3,2 мм
5,2 мм
Рис. 5.8. Шаблон для выкройки корпуса пульта управления видео. Заготовку можно вырезать из плотного картона,
а затем согнуть по линиям разметки и склеить. Размеры шаблона будут зависеть от вашей сборки схемы пульта, поэтому под-
гоните их по месту, как потребуется. Несмотря на то, что на рисунке все размеры выглядят рассчитанными точно, в действитель-
ности они взяты с готового корпуса
Связь в режиме реального (почти) времени 263
0
- const char serverAddress[] = "192.168.0.12"; // IP-
IP-
(IP-
, - int port = 8080; //
WiFiClient tcpSocket; //
-
)
, Замените указанное здесь значение
$
на IP-адрес своего сервера
WiFiClient. / $
-
-
TCP
:
$
- Button connectButton(3);
const int playLED = 4; // ^ '
. 0
//
,
const int connectLED = 5;
, boolean playing = false; //
. * , // $
long lastPosition = 0; // $#
// R
-
-
$
:
О прерываниях
=
Encoder
. 3
"
"
. 4
%
MKR1000 -
Wi-Fi, ,
:
#define ENCODER_DO_NOT_USE_ INTERRUPTS
.
. // :
digitalWrite(connectLED, tcpSocket.connected());
* ,
- digitalWrite(playLED, playing);
. #
- }
, $
,
" -
tcpSocket.connected(), -
1 (
)
0 (). 3
-
,
-
playing, -
1
(
) 0 ():
266 Глава 5
$
. if (difference != 0) { // $# $
" - if (tcpSocket.connected()) { // ',
tcpSocket.print("position:"); // '
$
,
tcpSocket.println(difference); // $
—
. #
-
}
"
-
lastPosition = position; // $
, ,
//
$#
}
,
}
. 2
"
$
-
"
:
&
if (playButton.toggled()) { //
readButtons()
- // $ $,
Play. if (playButton.read() == LOW) { // ,
; , - playing = !playing; // $ $
* ,
- void connectToServer() {
connectToServer(),
Serial.println("
'...");
//
' $ :
- if (tcpSocket.connect(serverAddress, port)) {
readButtons(). / Serial.println("
'");
- } else {
.connect() Serial.println("^ '");
WiFiClient,
}
- }
. /
" —
,
-
. #
-
,
-
:
2
$
, % <Enter>, $
Arduino.
Processing -
,
4
,
, -
. 0
,
.
" .
- 0
" , -
,
$
-
- ,
. *
,
.
$- X %
,
$
,
Processing - ,
-
" . 4
-
-
Processing
-
.
Аппаратные прерывания
G
Uno,
(0 1),
"
-
2 3
"
. * Arduino 101
-
. &
-
-
Encoder
- . 3 MKR1000
-
$
. > 0, 1, 4, 5, 6, 7, 8, 9, A1 A2. [
- digitalPinToInterrupt(
)
-
Arduino
www.
-
arduino.cc/en/Reference/AttachInterrupt. &
. *
, Arduino Uno
- digitalPinToInterrupt(3)
" -
. ;,
- 1. * $
Arduino
ATmega328,
Arduino 101,
$
.
268 Глава 5
Доработка видеосервера
0
+
" :
-
, - ? movieEvent()—
, -
"
;
-
. ? scrub() —
-
.
"
, -
, > video
$,
,
, 3.
"
Processing 0
%
" .
,
Processing
-
$
" -
H.264.
: 9
-
%
—
?
— -
640×480
. 4
;
,
,
-
? setup() — . &
data.
;
? draw() — -
;
? serverEvent() — ;
? readMessage() — -
«- »
-
"
"
.
Связь в режиме реального (почти) времени 269
:
, $ :
fill(15); // C
-
text(lastMessage, 11, height-19); //
fill(255); //
text(lastMessage, 10, height-20); //
}
,
" - message = message.trim(); // `
trim()
String[] decodedMsg = split(message, ":"); // K
//
«
»: %
String property = decodedMsg[0]; // $
—
,
- int value = int(decodedMsg[1]); // —
. /
-
. *
(
,
Arduino printlin() -
-
\r\n —
),
%
-
-
.
2
"
split()
-
:
— $
" , -
— :
+
// *
!
,
,
//
if (property.equals("playing")) {
(
-
playing = boolean(value); // $
if),
- //
"
. if (playing) { // * ,
myVideo.loop(); //
#
playing (
- } else { //
" //
#:
, - lastMessage = thisClient.ip() + ": " + message;
draw() - }
$
:
#
$
, -
. ,
" -
2
,
. *
" - $ , "
%
-
telnet, -
$. *
"
. /
-
%,
. *
. 5.9
-
%
"
-
—
,
,
.
"
. $ -
" .
,
.
Проект 9
Управление воспроизведением видео на основе протокола
WebSocket
При работе скетча видеосервера из предыдущего проекта вы, наверное, заметили некоторую
задержку между моментом воздействия на элементы управления пульта и моментом, когда в
Processing начиналось воспроизведение видео. Объясняется это тем, что для воспроизведения
видео требуются значительные вычислительные ресурсы. Так что было бы предпочтительней от-
делить серверную часть скетча, которая обрабатывает сетевые транзакции, от части, которая ра-
ботает с видео, чтобы серверу не приходилось выполнять объемные вычисления. Здесь мы это
и сделаем, создав веб-сервер в node.js — вместо сервера Processing, и веб-страницу — вместо
клиента дисплея на Processing. Клиент пульта будет управлять видео на клиенте дисплея, а сер-
вер станет управлять сетевым обменом. Постоянное подключение между клиентами и сервером
будет поддерживаться с помощью веб-сокетов (webSockets).
&
: HTTP
%
-
HTTP-
, $
-
,
4? & -
,
-
, ? & -
"
,
, ,
. &
-
"
TCP
HTTP
. *
,
. $
webSocket
-
HTTP
-
,
"
, $
.
— %
, *
. 5.10
-
-
. #
. —
,
. 4
HTTP
-
,
"
-
%
.
webSocket. /
%
-
Связь в режиме реального (почти) времени 273
0
-
,
-
TCP-
. #
.
HTTP, - *
, %-
" :
" ,
,
Upgrade: websocket
webSocket. =
Connection: Upgrade\r\n %
"
-
Sec-WebSocket-Key: webSocket,
dGhlIHNhbXBsZSBub25jZQ==
. &
"
Sec-WebSocket-Version: 13 -
HTML5
2 Upgrade Connection
JavaScript,
-
,
-
HTML. ;
"
,
Sec-WebSocket-Key
webSocket
, node.js. &
, $
-
Sec-WebSocket-Version
—
webSocket,
ws. > Arduino,
-
. 0
-
,
webSocket
" : ArduinoHttpClient,
-
"
.
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade О взаимодействии библиотек webSocket
Sec-WebSocket-Accept: 7 webSocket
-
s3pPLMBiTxaQ9kYGzzhZRbK+x0o=
-
Sec-WebSocket-Accept
,
, %
-
. * -
webSocket, -
$ ws node.js -
.
%
Arduino HTML5. 4
-
Рис. 5.10. Блок-схема видеосервера на веб-сокетах. Сервер %
,
предоставляет видеостраницу HTML и видеоресурс для брау-
,
-
зера посредством HTTP, затем посредством заголовка HTTP
.
Upgrade подключает веб-сокеты клиентов пульта управле-
ния и дисплея. Этот сервер может одновременно поддержи-
вать несколько клиентов обоих типов Устройство
видеоклиента
Устройство
Программа видеоклиента
Веб-клиент
клиента
webSocket Веб-клиент
Микроконтроллер
position: n 2
HTTP GET
2 playing: n /movie.mov
exit: n
3
HTTP GET/
Upgrade: websocket
274 Глава 5
~
,
,
,
.
* -
,
. '
$ -
,
p5.js.
Пишем код
- <!DOCTYPE html>
index.html - <html>
%
p5.js, <head>
<meta charset="utf-8">
-
<script type="text/javascript" src="p5.js"></script>
"
: <script type="text/javascript" src="libraries/p5.dom.js">
<script type="text/javascript" src="sketch.js">
<title></title>
</head>
function setup() {
myVideo = createVideo("movie.mov"); // \#$
// R$ " Movie. R %
// %
,
// $ , -
( '
// %)
myVideo.size(640, 360); // $
// $
myVideo.position(10, 30); //
myVideo.loop(); // +$
}
276 Глава 5
#
2
-
public,
.
"
:
http://localhost:8080
;
%
-
. 2
&
-
: .
$ node wsExpressServer.js
.
%
? — exit: n
3. # %
- 2 n=1
% $ —
;
webSocket, ?
"
-
(\n).
. * $
,
,
JavaScript,
" -
$
-
JSON,
*
- /*
Z webSocket express
: node.js
, $
*/
.
, var express = require('express'); // '
server,
$
// express
Связь в режиме реального (почти) времени 277
express.js,
- var http = require("http"); // ' http
- var WebSocketServer = require('ws').Server; // Server
//
ws
. &
, var server = express(); // express
httpServer,
- var httpServer = http.createServer(server); // http
,
- var wss = new WebSocketServer({ server: httpServer }); //
HTTP. +
, // websocket
wss,
,
-
webSocket:
&
// :
- httpServer.listen(8080); // ' http
wss.on('connection', connectClient); // N!
// webSocket:
HTTP. ;
webSocket
%
-
"
webSocket:
=
express
- webSocket
"
:
" ,
-
public, newCli-
%.
$
-
ent()
"
webSocket. /
,
%
%
,
connect-
.
- Client(). ;
%
: readMessage(), readError()
$ . disconnect().
+
.size, }
.length
, // if there's a webSocket error:
wss.clients - function readError(error){
console.log(error);
set. & JavaScript }
$ set
-
// $
webSocket:
, $ function disconnect() {
. & console.log('Client ' + newClient.clientName + ' ');
ws
$ - }
set, "
wss. // 9
clients: newClient.on('message', readMessage);
newClient.on('error', readError);
newClient.on('close', disconnect);
// 7
,
//
:
var greeting = {"
": wss.clients.size};
newClient.send(JSON.stringify(greeting));
}
278 Глава 5
+
// 7
webSocket:
readMessage() function readMessage(data) {
var result = JSON.parse(data); //
,
//
JSON
"
" - if (result.hasOwnProperty('clientName')) { //
,
%, // clientName,
. 2 «%- newClient.clientName = result.clientName; //
//
»
$ ,
}
, $ . if (result.hasOwnProperty('playing') || //
// playing,
"
"
- result.hasOwnProperty('position')) { //
playing po- broadcast(newClient, result); //
sition,
//
, - }
if (result.exit === 1) { //
exit,
console.log("
" + result.clientName + "
");
. [ broadcast()
newClient.close(); //
webSocket
$
- }
. 4
" console.log(result); //
#
"
}
exit,
1,
webSocket $ :
[ broadcast()
- // $
connectCli- //
webSocket:
function broadcast(thisClient, data) {
ent(). 0
function sendToAll(client) {
web- if (client !== thisClient) {
Socket —
console.log('
:' +
$
" . 4
, client.clientName);
%
" client.send(JSON.stringify(data));
}
" . =
}
sendToAll() $ - //
sendToAll() ! #
// wss.clients:
wss.clients
- wss.clients.forEach(sendToAll);
.forEach(): }
#
webSocket
% "
"
Processing
readMessage()
Processing,
% . &-
,
webSocket
-
. *
-
clients,
Processing, %
- ,
Processing -
ArrayList. &-
, $
,
,
,
.
"
"
—
+,
,
-
webSockets.
. -
-
,
ws,
Связь в режиме реального (почти) времени 279
$
. *
-
-
. =
-
,
$
.
sketch.js $
"
message
client var host = document.location.host; //
browser,
var message = {"client": "browser"}; // 9
!
,
//
,
. ~ $
-
, -
:
;
socket = new WebSocket('ws://' + host); // $
%
: //
—
% socket.onopen = sendIntro; // $
//
,
—
socket.onmessage = readMessage; // $
" : //
}
:
draw(),
$
socket.send(JSON.stringify(message));
}
,
web-
Socket. [ sendIntro()
"
-
:
280 Глава 5
JSON
$
// *
!
,
- //
,
- //
. &
myVideo.time(videoTime); // `
}
"
-
// 9
(
. 5.11). //
#:
3
- lastMessage.html(JSON.stringify(message));
}
"
{ client: 'browser' }. ;
.
connectButton
//
TCP-
- connectToServer(); // '
} else { // '
- sendJsonMessage("exit", 1); //
-
, }
}
connectTo- } // # % # connectButton.toggled
Server(). 3
-
if (playButton.toggled()) { //
// $ $,
" exit, - if (playButton.read() == LOW) { // ,
. playing = !playing; // $ $
//
playing
if (webSocket.connected()) { //
//
,
- sendJsonMessage("playing", playing);
-
, //
- }
"
}
} // # % # playButton.toggled()
: } // # % # readButtons()
" }
. = }
$
sendJsonMessage(),
:
Связь в режиме реального (почти) времени 283
}
webSocket (
- webSocket.print("}");
: text, binary, ping webSocket.endMessage();
.). 2
}
"
print() println().
* , webSocket.
endMessage()
-
" :
2
- /
-
-
. 2
-
.
(
. 5.12). 0
&
$
" :
-
. *
,
{ clientName: 'MKR1000' }
"
#
-
,
,
-
$
.
"
:
{"client":1}
4
-
,
$
— -
.
Заключение
Базовую структуру клиентов и сервера из проектов этой главы можно использовать всегда, ког-
да вы хотите создать систему, которая управляет одновременными подключениями нескольких
сетевых объектов. Основные задачи сервера состоят в ожидании подключения новых клиентов,
отслеживании уже подключенных клиентов, а также в обеспечении передачи сообщений без
ошибок соответствующим клиентам. Из них первостепенной задачей сервера должно быть ожи-
дание попыток подключения клиентов.
2
"
,
-
"
-
.
- &
-
.
"
TCP,
$-
-
(webSockets).
.
,
— ,
—
-
,
TCP-
. #
% , -
,
-
%
" -
,
,
"
HTTP,
-
- -
.
" . 0
, $
, —
,
" $
-
client exit,
-
-
$
. #"
-
,
,
(
HTTP 4)
. 9
-
(
$ ).
,
" %
$
,
-
, ,
-
-
$
JSON.
. &
"
+
.
Связь в режиме реального (почти) времени 285
БЕСПРОВОДНАЯ СВЯЗЬ
Полагаю, что вас, как и многих людей, интересует эта область, и вы
приобрели мою книгу, потому что мечтаете создать устройства,
взаимодействующие друг с другом по беспроводной связи.
Возможно, вам так не терпелось разобраться с этим вопросом, что
вы «перепрыгнули» через весь предыдущий материал прямо сюда.
Если вы действительно это сделали, возвратитесь к началу
и прочитайте все, что пропустили! В предыдущих главах мы
познакомились с такими распространенными видами
беспроводной связи, как Wi-Fi и Bluetooth, но, что более важно,
в них мы также рассмотрели некоторые принципы цифрового
взаимодействия, на которых основана беспроводная связь.
В частности, если вы не знакомы с последовательным обменом
данными между компьютерами и микроконтроллерами, вам надо
обязательно изучить материал главы 2. А в этой главе беспроводная
связь рассматривается более подробно — в ней мы встретимся еще
с двумя типами беспроводной связи, а также создадим несколько
работающих проектов.
Рис. 6.1. Новые компоненты для проектов этой главы: 1. Инфракрасный пульт дистанционного управления. 2. Логический
пробник компании Saleae (по желанию). 3. Плата Arduino 101. 4. Радиомодули RFM95W, поддерживающие технологию LoRa1.
5. Осциллограф DSO Nano. 6. Инфракрасный светодиод. 7. Инфракрасный фототранзистор
1
LoRa ( . Long Range) —
,
" %
/
$
.
4
Беспроводная связь 289
, . =
-
-
Рис. 6.2. Сигнал от инфракрасного светодиода распростра-
. & %
няется в виде направленного луча (слева), а сигнал радио-
. +
,
-
антенны — во всех направлениях (справа)
.
$,
"
,
-
%
,
. #
,
%
-
,
—
.
9
-
. 6.2.
: 12-, 15- 20- . 3 %-
. 3
EPanorama (www.epan-
4
- 4
,
,
, +
%
—
%
,
"
%
,
. +-
-
- "
,
,
-
" -
$
, SparkFun, Adafruit,
. *
-
Seeed Studio
. SparkFun
"
Adafruit
-
.
Рис. 6.3. Вид инфракрасного светодиода через веб-камеру: слева — светодиод выключен, справа — включен
Беспроводная связь 295
Проект 10
Инфракрасное управление цифровой фотокамерой
В этом проекте мы будем управлять цифровой фотокамерой с помощью инфракрасного свето-
диода и микроконтроллера. Этот простой проект позволит вам получить общее представление
о работе инфракрасных устройств дистанционного управления.
Nikon Canon,
- лографа DSO Nano
%
,
$
%
. *
,
"
-
%
-
"
.
2
SLR, Single Lens Reflex —
.
296 Глава 6
, Canon
32,7 q,
%
( $
, Nikon —
38 q. '
-
%
%
.
). >%
& . 6.1
-
-
,
Canon Nikon. /
$
. X
-
,
-
,
,
.
,
%
,
.
-
"
. /
&
-
,
.
Требуемые компоненты
Arduino-
, 1 %.
+
, 1 %.
+
:
, 1 %.
/.
9
220 0, 1 %.
+
, 1 %.
9
10 0, 1 %.
+
-
, 1 %.
>
%
-
, 1 %.
0
, 1 %.
Беспроводная связь 297
A B C D E F G H I J
1 1
5 5
3,3 В
10 10
Модуль
микроконтроллера
Кнопка
15 15
Цифровой вывод 7
20 20
Цифровой вывод 4
25 25
220 Ом
Общий
30
A B C D E F G H I J
30
10 кОм
: Arduino
- pinMode(pushButtonPin, INPUT); //
//
CAM_CANON. 2
- // Z- ' :
"
- lastButtonState = buttonState;
"
: }
'
- //
\- $
:
void IRPulse(unsigned long interval, unsigned long
, shutterClick() frequency) {
IRPulse(). unsigned long now = micros(); //
/
"
- // -
Arduino tone() tone(IRPin, frequency); // IRPin
// $
- while (micros() - now < interval);//
+-
- // $
"
, noTone(IRPin); // '
% }
-
,
.
tone()
delayMicroseconds(),
$ $
-
:
Рис. 6.6. Это устройство создано с использованием только что описанного подхода. Микроконтроллер Arduino в корпусе,
стоящем рядом с камерой, улавливает изменение показаний пассивного инфракрасного датчика А и посылает камере инфра-
красный сигнал с командой сделать снимок
А
300 Глава 6
9
,
;
,
-
5% , ,
"
. = -
$
-
,
,
. +
,
3,0×108 /
.
4
*
"
-
3
#
.
.
Беспроводная связь 301
$
%
$ - +
,
. ;
, $
, $ ,
. ;
"
,
- %
-
" -
. +
,
-
. ; $
-
-
. 9
-
,
-
. +
-
,
- "
,
-
"
-
,
$ .
. +
,
&
-
.
Беспроводная связь 303
. * %
- *
-
$
,
. #
-
%
-
.
-
. &
-
7
$- ,
,
,
,
,
,
,
.
. ;
-
/
.
,
-
; ,
,
. 4
-
.
- ,
"
. 3 -
.
*
, Bluetooth, ZigBee Wi-Fi — $ "
-
,
"
-
,
. . ,
&
$
,
(
Wi-Fi —
. *
$
Ethernet). 0
.
$
-
,
- &
"
%
-
,
-
. 0
,
.
*
, Bluetooth
-
,
2
Bluetooth,
,
. 3
—
%. 9
,
%
"
,
. 0 -
. =
"
.
%
-
,
%
-
Радио: передатчики, приемники %
.
и приемопередатчики
,
- # %
-
%,
,
-
-
?
"
-
,
,
,
. /
,
, ,
%,
"
-
. & -
-
-
%
. > ,
,
"
-
,
(,
-
.
,
)
-
,
-
.
304 Глава 6
Радиосети
Расстояние, на которое сообщение может передаваться по радио, в основном зависит от мощ-
ности передатчика и чувствительности приемника. Повышение мощности передатчика означает
повышение расхода электроэнергии. Но дальность передачи сообщения можно повысить, ис-
пользуя радиосеть. В таком случае сообщения можно передавать по цепочке от одного радио-
устройства к другому или сохранять, пока требуемый приемник не окажется в радиусе действия
передатчика. Технические характеристики радиосети определяются методом ее управления ба-
лансировкой энергопотребления, радиуса действия и доставки сообщений.
Топологии радиосетей
9
3
.
. =
-
,
-
!! !
. ;
. &
-
"
. &
,
"
-
$
(
. 6.7, ),
—
,
%
" .
%
" -
(
. 6.7, X
(
.
. 6.7, )
). &
,
-
"
. 0
,
-
%
"
%
"
(
. 6.7,
). , ,
-
% .
#
%-
Рис. 6.7. Три типа топологии радиосетей: полносвязная (слева), звездообразная (в центре) и ячеистая (справа). В первом типе
все узлы соединены друг с другом напрямую, во втором — обмен между периферийными узлами реализуется через один цен-
тральный узел, а в третьем — сообщения могут передаваться от одного узла другому через цепочки промежуточных узлов
. 6.7, )
-
.
$
%
"
,
,
. /
" . 3
,
(
Wi-Fi,
" ),
"
-
%
(
).
.
$
-
"
&
(
.
. 6.7,
-
)
%
"
— .
" ,
-
,
% . * 3
-
"
,
,
, -
% ,
, $
-
%
"
,
"
. # Bluetooth,
-
%
.
-
2,
-
"
%
,
-
. *
,
-
: Wi-Fi, Bluetooth ZigBee — -
.
-
"
. &
$
, $
,
IEEE 802,
" -
Ethernet. #
Ethernet
-
,
802.3, Wi-Fi —
. / 802.15.1, ZigBee —
802.15.4. 0
,
-
"
-
-
- . *
Wi-Fi Bluetooth
,
,
8. $
" -
$
" .
Физические радиоинтерфейсы
Z
-
,
-
-
.
- 9
-
,
,
,
:
,
X3, SPI I2C
,
,
- "
.
, USB
-
, -
,
-
%
, $
.
. ;
-
, ,
? \
&
,
-
%
.
" ,
- « »,
%
%
-
% ,
:
- $
, SPI I2C. ;
,
-
. 4
-
,
, -
.
. 3
,
-
? \
. > , ,
%
-
?
.
308 Глава 6
? (
,
. . 7 ,
*
$
,
" ? $
-
,
,
$ . =
-
? # %
,
$
-
-
? X ,
,
.
"
-
,
- ? , ,
-
, -
,
%
%
% . +
-
,
.
, "
-
%
,
?
,
$
.
,
,
$
,
. *
,
.
%
,
& . 6.2
-
Wi-Fi -
-
%
. =
,
-
%
. &
-
, ,
-
,
" %
"
.
$
3
%
. %
- $ ,
XBee
Digi
%
-
%
-
,
. -
-
. *
?
. =
,
-
-
+
,
"
Wi-Fi Bluetooth. 0
(
" ), ,
Bluetooth
,
, Wi-Fi,
,
"
Bluetooth SIG5
.
? D
,
-
, Wi-Fi Alliance6
, , ,
-
.
,
. &
- HopeRF
-
.
,
0
5
Bluetooth Special Interest Group —
-
-
Bluetooth.
— $ 6
Wi-Fi Alliance —
, -
"
Wi-Fi-
-
- "
Wi-Fi.
Беспроводная связь 309
Таблица 6.2. Технические характеристики нескольких наиболее популярных радиоустройств,
используемых в микроконтроллерных проектах. Из них мы уже знакомы с устройствами Wi-Fi
% , $
-
"
-
%
. +
-
-
,
LoRa, .
-
-
Curie Intel
LoRa Alliance7,
" -
Bluetooth
,
$
- Nordic Semiconductor, "
,
Arduino 101. 3
ESP8266, -
.
,
-
Wi-Fi. X
$,
SparkFun Seeed Studio
-
-
, $
-
,
X3. * $
-
" %
.
&
"
-
,
-
-
,
,
-
. =
LoRa,
%
"
.
,
-
7
,
-
LoRa Alliance (3
LoRa) —
-
, "
Bluetooth LE.
LoRa-
.
310 Глава 6
Проект 11
Дуплексная радиосвязь
В этом проекте мы подключим радиоприемопередатчик и кнопку к микроконтроллеру. Для соз-
дания канала связи потребуются два таких устройства. Каждый микроконтроллер при нажатии
его кнопки будет посылать сигнал другому. Когда один из микроконтроллеров получает сообще-
ние, он реагирует на это событие, зажигая светодиод, а также отправляет сообщение по каналу
последовательной связи.
Bluetooth Wi-Fi
- 0 %
,
-
,
-
"
"
-
, ,
"
# .
-
- #" ,
,
"
-
%
" -
%
. /
,
.
%
- /
-
.
.
-
$
-
LoRa -
,
HopeRF
,
Semtech. & $
- LoRa
!
(sync
" %
. word),
" ,
$
.
9
RFM9x
HopeRF
SX127x Semtech
- &
,
-
LoRa. /
-
" ,
,
-
. [
%
,
"
-
"
$
-
-
. 0
%
-
,
%
.
!
, *
,
-
125 q,
, -
— 915 7q. [
-
LoRa
, $
,
.
-
/
-
.
. 0
LoRa
LoRaWAN.
Беспроводная связь 311
A B C D E F G H I J
1 1
Антенна
5 5
10 10
VIN G1
GND G2
15 EN G3 15
G0 G4
SCK G5
MISO
MOSI
20 CS 20
RST
RFM95 Radio
25 25
30 30
A B C D E F G H I J
Рис. 6.8. Монтажная схема подключения адаптерной платы с радиомодулем RFM95W к плате Arduino 101 или Arduino Uno
(для обеих этих плат задействуются одни и те же выводы). Обратите внимание на подключение антенны, длина которой должна
быть около 7,8 см для частотного диапазона 915 МГц и 16,5 см для 433 МГц. Обе антенны четвертьволновые
+3,3 В
Напряжение
G0 питания
Напряжение
питания D13 SCK
D12 MISO Модуль
7,8 см
D11 MOSI RFM95W
CS
Микроконтроллерный модуль
Arduino 101 или Arduino Uno RST ANT
D7
Общий
D6
D5
D4
D3
D2
220 Ом
Общий
Беспроводная связь 313
Антенна
G1
G2
G3
G4
G5
RFM95 Radio
10
15
20
25
30
SCK 35
40
45
50
55
60
1
MISO
MOSI
GND
RST
VIN
J
J
G0
EN
CS
I
I
G H
G H
F
F
C D E
C D E
A B
A B
10
15
20
25
30
35
40
45
50
55
60
1
Рис. 6.10. Монтажная схема подключения адаптерной платы c радиомодулем RFM95W к плате MKR1000. Обратите внимание
на подключение антенны, длина которой должна быть около 7,8 см для частотного диапазона 915 МГц и 16,5 см для 433 МГц. Обе
антенны четвертьволновые
+3,3 В
Напряжение
G0 питания
Напряжение
питания SCK
MISO Модуль
D10 MOSI RFM95W 7,8 см
D9 CS
D8 RST ANT
Микроконтроллерный
D7
модуль Общий
MKR1000 D6
D5
D4
D3
D2
D1
220 Ом
Общий
314 Глава 6
Пишем код
,
- /*
$ LoRa
- : Arduino
. */
2
(
irqPin) #include <SPI.h> //
'' :
,
- #include <LoRa.h>
%
. *
const int buttonPin = 4;
-
const int receiveLED = 5;
5 const int csPin = 7; // + - LoRa
(
. ! «G
const int resetPin = 6; // Z LoRa
»). &
, const int irqPin = 1; //
Arduino Uno 101 $ 2,
int lastButtonState = HIGH; // \-
Cortex-M0 ARM ( byte msgCount = 0; //
--
=
byte syncWord = 0xB4; // Z-$ ' ( )
- byte spreadingFactor = 8; // % (6-12);
. + -
:
- //
- Stream
Serial.println("\#$# LoRa .");
. * ,
- // :
- pinMode(buttonPin, INPUT_PULLUP);
,
pinMode(receiveLED, OUTPUT);
: }
Беспроводная связь 315
// ,
. 0
- String message = "HeLoRa!"; //
, $
- sendMessage(message);
- Serial.println(message); // + R
"
. 2
- //
- }
lastButtonState = buttonState; // Z-
//
- }
. 4
, - // + $ % #' onReceive:
" ,
onReceive(LoRa.parsePacket());
$ sendMessage(), }
-
. 2
lastButtonState
" .
& -
onReceive(), -
. / -
"
"
$
. *
"
LoRa.parsePacket(),
Stream,
-
4. /
-
" -
. 7
7
" -
UDP:
* ,
- void onReceive(int packetSize) {
onReceive().
- if (packetSize == 0) return; // ,
,
" // $ #
" " ,
. 4
$ digitalWrite(receiveLED, HIGH); // +'
//
0,
" % // Z
$ :
- int recipient = LoRa.read(); //
"
loop(). byte sender = LoRa.read(); //
4
"
, - byte incomingMsgId = LoRa.read(); // %
$,
. // -
2
byte msgLength = LoRa.read(); // -
: ,
- //
,
" String incoming = LoRa.readString();//
" (
= $
$ - // R
" .
$ - ,
,
- // :
, LoRa
- Serial.print(": ");
Serial.println(sender, HEX);
Serial.print("
: ");
$ :
-
Serial.println(recipient, HEX);
%
Serial.print("ID : ");
/%.
Беспроводная связь 317
2
$
-
. &
(
"
.
)
. =
- +
$
-
.
, %
-
*
-
,
,
, $
. 2
CoolTerm, -
$
. 0
-
-
,
( CoolTerm
$
)
-
.
Широковещательные сообщения
. / ,
-
onReceive(),
4
,
-
,
$
-
" . &
$
- -
,
%
(
localAddress),
" ,
,
0xFF.
!
9. /
onRecieve()
,
"
" ,
.
$
.
*
- Слова синхронизации
,
- и фактор распределения
%
"
,
,
. 0
&
"
"
,
%
-
,
"
-
"
,
-
.
"
"
/
,
. &
$
" ,
9
0 . promiscuous mode.
318 Глава 6
LoRa
. = , Отношение сигнал/шум
-
=
,
,
.
/11. /
,
, $ $ .
-
, —
,
&
"
%. ' % $ -
- % ,
. 0
. 9
%
/%
"
,
-
.
%
"
" . * -
%
,
, —
,
-
% .
.
~
%
-
$ ,
- Циклический контроль
. избыточности
0
- &
-
:
-
— -
!
12,
LoRa
. /
. 7
!-
-
-
#
!#-
HopeRF Semtech,
!
. 4
!
-
PDF
: www.hoperf.
#
-
com/upload/rf/RFM95_96_97_98W.pdf (
-
!
.
RFM95W HopeRF) www. &
#
!
!,
semtech.com/images/datasheet/sx1276.pdf (
-
,
SX1276 Semtech). 0 $
-
. . 4
#
,
, -
!
.
Уровень принимаемого сигнала ! !-
0
,
-
%
,
,
! LoRa.crc(). /
-
(+X#)10, -
,
-
.
"
. >
$
-
* * *
8.
$ -
9
LoRa
$
, "
-
%
-
. +
$
.
% , -
$
,
%
, -
$,
"
" .
.
11
0 . SNR, Signal-to-Noise Ratio.
10 12
0 . RSSI, Received Signal Strength Indicator. 0 . CRC, Cyclic Redundancy Check.
Беспроводная связь 319
Проект 12
Управление фотокамерой с помощью Bluetooth LE
В главе 2 мы научились подключать микроконтроллер к персональному компьютеру с помощью
радиомодуля Bluetooth (см. проект 3). Там мы использовали профиль последовательного порта
(Serial Port Profile) Bluetooth из спецификации Bluetooth 2.0. Здесь же мы возьмем устройство
спецификации Bluetooth 4.0 (называемой также Bluetooth LE) и задействуем его для управления
инфракрасным пультом фотокамеры из проекта 10 этой главы.
/
%
- Bluetooth
GAP (General
,
%
, Access Profile,
"
),
. &
-
-
,
,
,
$ GATT (Generic Attribute Profile,
"
-
). & «Make: Bluetooth» ( -
—
,
% -
«Maker Media»),
3
. /
- 3 (Alasdair Allan), = (Don
Bluetooth. Coleman) # 7
(Sandeep Mistry),
# Bluetooth 4.0 (Bluetooth LE)
" -
Bluetooth LE.
.
Bluetooth LE: центральные
Arduino 101
"
Bluetooth LE,
и периферийные устройства
$
. *
X
Bluetooth LE
. > Bluetooth, "
:
.
,
-
-
Bluetooth
-
,
nRF8001 nRF58122 GAP (General Access Profile,
"
Nordic Semiconductor. /
). Z
%-
%
,
-
,
.
, — ,
,
,
BLE Nano RedBear Lab. 4
!
. =
-
-
,
- GATT (Generic Attribute Profile,
Bluetooth LE,
"
). ;,
" Bluetooth
. LE
—
, Z, "
-
&
4.0
Bluetooth
-
: . *
%
. Z $ -
—
— "
,
$
$
$ , . 3
-
-
,
Bluetooth. ;
-
—
, +.
SPP (Serial Port Profile,
- $
\,
)
,
320 Глава 6
,
,
-
.
. -
,
$ ,
SPP
-
*
GATT
. &
SPP
?
SPP
«
% —
% »,
Bluetooth
,
. 2
. &
-
, -
$,
GATT
Рис. 6.12. Устройство Bluetooth 2.0 (схема вверху) — в нашем случае светильник — предоставляет профиль SPP. При подклю-
чении к устройству весь обмен данными происходит через поток данных последовательного порта. Центральное устройство
(планшет, смартфон, ноутбук) считывает все три элемента данных и выбирает требуемые.
Светильник на Bluetooth 4.0 (Bluetooth LE), показанный на схеме внизу, предоставляет сервис Z, имеющий три характери-
стики. В зависимости от свойств этих характеристик центральное устройство может выполнять операции чтения, записи или
подписки с любой из них
Сопряжение
Поток данных
Планшет, смартфон, ПК
Светильник
Сопряжение
Свет
Вкл
Яркость
Оттенок
Планшет, смартфон, ПК
(центральное устройство)
Светильник
(периферийное устройство)
Беспроводная связь 321
.
%). &
$,
(
- Bluetooth 4.0 (LE)
-
),
.
, %
-
,
Bluetooth LE
-
. /
, ,
,
-
-
.
, ,
-
,
,
.
. &
,
,
0
"
Bluetooth
. 6.12.
.
~
-
X
Bluetooth 2.0
-
, -
. *
,
-
,
Bluefruit,
2,
" -
SPP, % Blue-
,
tooth —
(Audio Profile),
-
,
. 7 ,
%
—
HID
"
-
(Human Interface Device,
--
" $
.
A B C D E F G H I J
1 1
5 5
10 10
SCK
15 MISO 15
MOSI
REQ
Bluetooth LE
nRF8001
RDY
UNO
ACT
20 RST 20
3Vo
GND
VIN
25 25
ON
30 30
A B C D E F G H I J
Рис. 6.13. Монтажная схема проекта управления фотокамерой посредством Bluetooth LE на основе платы Arduino Uno и радио-
модуля nRF8001 компании Nordic Semiconductor. Для платы Arduino 101 можно использовать схему из проекта 10, поскольку эта
плата содержит встроенный радиомодуль Bluetooth
Рис. 6.14. Принципиальная схема проекта управления фотокамерой посредством Bluetooth LE на основе платы Arduino Uno
и радиомодуля nRF8001 компании Nordic Semiconductor
+3,3 В +3,3 В
Общий 220 Ом
Инфракрасный светодиод
Беспроводная связь 323
+
-
,
-
-
UUID,
-
,
"
,
$
, —
.
. =
* $
cameraService. #
128- -
—
-
UUID,
-
,
shutter
"
"
. 0
,
" $
-
.
16-
.
$
1,
- Код для управления камерой
.
%
по Bluetooth LE
shutter -
0. & $
BLEPeripheral,
# 7
X
Bluetooth LE,
- (Sandeep Mistry). =
,
Ardui-
128- no 101,
" -
UUID13 —
-
. &
: 2f45c1ee-5048-11e6-beb8-9e71128cae77 Arduino 101
CurieBLE
-
( %
). *
—
,
-
. = -
—
CurieBLE
: www.
, 16-
arduino.cc/en/Reference/CurieBLE, -
UUID,
Bluetooth SIG ( BLEPeripheral —
: https://
UUID
- github.com/sandeepmistry/arduino-BLEPeri-
: https:// pheral. 0
-
www.bluetooth.com/specifications/gatt/services). ,
#
(
,
0-180F,
,
Arduino 101,
13
%
).
UUID, Universally Unique Identifiers —
.
Пишем код
,
- /*
- M
' Bluetooth LE
. !
Arduino 101
- : Arduino 101
/*
>
CurieBLE:
#include <CurieBLE.h>
Внимание!
' $
Arduino 101,
2.0.1
( )
Arduino 101.
"
.
324 Глава 6
!
=
/*
>
- Bluetooth LE IR Camera Control
SPI
BLEPeripheral. context: Arduino Other
/*
2
- #include <SPI.h> //
"
- // SPI BLEPeripheral
Request (2
), Ready #include <BLEPeripheral.h>
(q
) Reset (#
). // N
,
//
Bluetooth Request, Ready Reset
=
$
- // (
,
Arduino 101)
,
- const int BLE_REQ = 10;
$
: const int BLE_RDY = 2;
const int BLE_RST = 9;
// 9
#
:
BLEPeripheral blePeripheral = BLEPeripheral(BLE_REQ, BLE_
RDY, BLE_RST);
- //
% UUID :
UUID
- BLEService cameraService("F01A");
. 9 //
% UUID - $
- BLEIntCharacteristic shutter("F01B", BLERead | BLEWrite);
: BLEInt- const int IRPin = 7; // ,
Characteristic ( $ // ' \-
) —
- const int CAM_NIKON = 1; // #%-
, BLEFLoat- const int CAM_CANON = 2;
Characteristic —
- int buttonState = 0; //
int lastButtonState = 0; //
" ,
BLECharCharacteristic —
ASCII . .
$
-
.
$ -
-
10:
!
=
,
>- void setup() {
$
=
BLEPeripheral, Serial.begin(9600);
$ - // %
// " :
blePeripheral, -
blePeripheral.setLocalName("irRemote");
blePeripheral.setAdvertisedServiceUuid(cameraService.uuid());
// -
.addAttribute().
// %
:
& $
blePeripheral.addAttribute(cameraService);
blePeripheral.begin()
blePeripheral.addAttribute(shutter);
blePeripheral.begin(); //
: //
shutter.setValue(0); // $
// - $
Serial.println("^ ");
}
,
%
.
$
"
$
0,
-
$ .
а б в г
* * *
*
,
Bluetooth
"
. & %
LE
$
Bluetooth LE
-
,
%
.
Bluetooth LE.
Windows. =
-
Linux, Raspberry Pi, -
" :
"
-
$ sudo apt-get install bluetooth :
$
-
bluez libbluetooth-dev libudev-dev
,
,
=
Windows
-
USB
, ,
-
Bluetooth, noble
-
. /
,
$
-
node.js
. #
$ -
, $ -
Zadig,
,
http://zadig.akeo.ie,
.
Создаем псевдокод
=
- //
'' :
// '
,
-
% node.js: //
',
- // %
// %
,
. //
,
, // '
// -
, -
// ' -
: // %
:
// -
// - -
// - $ shutter
// -
Пишем код
&
/*
— noble Z Bluetooth LE noble
express. 2
$ - : node.js
express: */
- //
UUID
- var shutterUuid = 'f01b'; // \% UUID
// - $
%
-
var shutter = null; // - $
,
var clickCount = 0; // $
. 4" var device; // %
-
. // %
$ - /public:
server.use('/',express.static('public'));
2 public
,
-
" express.
use(). #
:
&
// Z %
-
%
. // % UUID
noble.on('stateChange', scanForPeripherals);
noble,
noble.on('discover', readPeripheral);
(.on('stateChange')),
—
- server.listen(8080); // express
- server.get('/click', click); //
$ GET
(.on('discover')).
-
,
-
.
$
ex-
press
%
GET
/click:
-
-
,
stateChange.
,
-
- // # $ discover:
,
function readPeripheral (peripheral) {
,
console.log(' ' + peripheral.advertisement.
localName);
read- console.log('M : ' + peripheral.rssi);
Peripheral(). /
- function readServices() {
"
device = peripheral; // Z- %
//
% - console.log('
: ' +
- peripheral.advertisement.localName);
#
- // # explore -.
,
// -, %.
,
- //
, R ,
//
' % # readPeripheral().
explore()
function explore(error, services, characteristics) {
.discoverAllServicesAnd-
// Z - -
Characteristics(). / -
console.log('Z: ' + services);
"
console.log(': ' + characteristics);
//
% UUID
-
UUID
- // UUID - shutter
shut- for (c in characteristics) {
ter. *
, if (characteristics[c].uuid === shutterUuid) {
- // -,
$
, shutter = characteristics[c];
$
}
-
. $ }
- }
,
:
332 Глава 6
* ,
- // # HTTP $ GET
// $:
- function click(request, response) {
GET HTTP. & $ var result = "^ %
"; // Z,
,
//
// '
' - :
"
- if (device.state === 'connected' && shutter != null ) {
,
- // $ -:
var output = new Buffer([0x01]);
shutter.write(output, true);
shutter,
- clickCount++; // M $
. // $
&
result = "Click count: " + clickCount; // \$
}
HTTP
- response.end(result); // HTTP
% % : }
[
// # $ % # $
getShutter()
- function getShutter() {
GET HTTP,
httpGet('/click', 'text', clickDone);
$ p5.js httpGet(). }
&
// # $ $ httpGet()
, function clickDone(data) {
messageDiv.html(" : " + data);
. }
=
-
— clickDone() —
-
:
&
. #
,
, Рис. 6.18. Страница веб-интерфейса для сервера централь-
%
, ного устройства Bluetooth
-
. 6.18.
*%
%
-
node.js
-
,
- ,
-
$ :
,
%
,
-
-
, -
,
" .
IP-
#
- %
. /
Bluetooth LE
"
.
. *
Заключение
Беспроводная связь в некотором роде значительно отличается от проводной. Вследствие ослож-
нений, связанных с природой беспроводной связи, нельзя рассчитывать на бесспорное прохож-
дение сообщений, как в случае с проводной связью, поэтому нужно определиться со способами
решения подобных проблем.
4
%
,
-
% ,
% -
"
" %,
"
,
-
, Bluetooth
"
-
,
Wi-Fi,
-
"
,
,
$,
,
-
. $
,
-
& %
,
-
%.
,
%
; ,
,
. &
-
— —
2,
"
- $
-
—
.
-
%- 7
-
"
$
.
,
*
-
%
,
, , "
$
. &
,
-
" ( ),
,
, -
TCP -
$
:
. &
"
-
$
" .
. =
-
Городской сонар. Авторы Кэйт Хартман (Kate Hartman), Кэти Лондон (Kati London) и Саи Срискандараджа
(Sai Sriskandarajah)
&
%
. 7
Bluetooth
(
% ). &
,
,
,
"
$
,
"
,
+
.
Беспроводная связь 335
Глава 7
БЕССЕАНСОВЫЕ СЕТИ
И ДВОИЧНЫЕ ПРОТОКОЛЫ
Сетевые подключения, с которыми мы до сих пор имели дело,
были в основном выделенными соединениями между двумя
объектами. Для последовательной связи требуется управление
последовательным портом, а для подключений почты, браузера
и telnet — сетевой порт. Во всех этих случаях присутствует
устройство, которое предоставляет порт (обычно это сервер),
и устройство, запрашивающее доступ к порту (так называемый
клиент). Классическими примерами этого подхода были проекты
главы 5. В этой главе мы рассмотрим, как организовать прямое
взаимодействие любого сетевого устройства с другим сетевым
устройством или одновременно с несколькими другими
сетевыми устройствами.
Рис. 7.1. Новые компоненты для проектов этой главы: 1. Датчик газа Hanwei на адаптерной плате. 2. Держатель для трех батареек
типа ААА. 3. Подстроечные потенциометры номиналом 47 кОм. 4. Модуль XBee S2C компании Digi. 5. Адаптерная плата XBee-to-
Serial. 6. Одноплатный мини-компьютер Raspberry Pi. 7. Конденсаторы. 8. Стабилизаторы напряжения на 3,3 и 5 В. 9. Транзистор
TIP120. 10. Инфракрасный дальномер Sharp GP2Y0A21YK. 11. Гнездовые разъемы. 12. Программируемые светодиоды WS2812.
13. Матовая пластиковая трубка диаметром 10 см. 14. Жестянка из-под леденцов. 15. Игрушка шимпанзе Чарли
15
14
4 5
13
3
11
12
6
2
1
10
9 8
Бессеансовые сети и двоичные протоколы 339
XBee-to-USB
, 1 +.
9–12 ',
1 +.
,
-
J: 32400, SF: WRL-11812, AF: 247, PX: 32400.
$
.
4
-
SF: TOL-00298, AF: 798, J: 170245, F: 1176248
XBee,
XStick 802.15.4 Digi.
XBee, 1 +.
D: 602-1200-ND SS: 113100001, SF: BOB- 08276
Hanwei, 1 +.
438-4885 SF: SEN-09405, P: 1481, PX: 605-00009
340 Глава 7
, 1 +. 9
- Компоненты для схемы
Hanwei «
»
-
, $
-
исполнительного устройства
«
». (шимпанзе Чарли с ударными
SF: BOB-08891, P: 1479 1639 тарелками)
D
, 1 +.
C
, 1 +.
D: 160-1144-ND 160-1665-ND, J: 34761 D: 438-1045-ND, J: 20723 20601, SF: PRT-
94511, F: 1855510, RS: 228-5972 826-830, SF: 12615 PRT-12002, F: 4692810, AF: 64, SS:
COM-09592 COM-09590 319030002 319030001
(
220 , 1 +.
(
XBee
XBee Pro S2C 802.15.4.
D: 220QBK-ND, J: 690700, F: 9339299, R: 707-7612 AF: 128, D: 602-1892-ND, SF: WRL-08665, J:
47 , 2253722, PX: 32416
1 +.
+ +
J
-
, 1 +.
D: A105657-ND, J: 254028, RS: 186-205
D
A
3,3 ', 1 +.
Компоненты для схемы сервера
> Raspberry Pi, 1 +. D: 497.1491-5-ND, J: 242115, F: 1703357, RS: 438-
BeagleBone Green 4885
Linux.
XBee, 1 +.
SF: DEV-13825, AF: 3055 3400, SS: 102010048 SS: 113100001, SF: BOB- 08276
114990584, RS: 896-8660, F: 2525225
!= +
, 2 +.
(
XBee
XBee Pro S2C 802.15.4.
D: A26509-20-ND, J: 103377, SF: PRT-00116, F:
AF: 128, D: 602-1892-ND, SF: WRL-08665, J: 1593411
2253722, PX: 32416
!= ), 2 +.
XBee-to-USB-
, 1 +. 0
J: 32400, SF: WRL-11812, AF: 247, PX: 32400. D: 160-1144-ND 160-1665-ND, J: 34761
94511, F: 1855510, RS: 228-5972 826-830, SF:
COM-09592 COM-09590
Об источнике питания для игрушки
(
220 , 1 +.
4
%
%
D: 220QBK-ND, J: 690700, F: 9339299, R: 707-7612
3 & (
, -
!
NPN-
TIP120,
D),
1 +.
3,3 &
. *
$ D: TIP120-ND, J: 32993, F: 9804005, RS: 808-0502
. 4
-
(
1 , 1 +.
D: 1.0KQBK-ND, J: 690865, F: 9339051, R: 707-
,
«» 7666
$
%. & -
-
100 \, 1 +.
. D: P10269-ND, J: 158394, F: 1144642, RS: 762-
1746
Бессеансовые сети и двоичные протоколы 341
#
TCP
UDP
- Широковещательные UDP-сообщения
(SPP) Bluetooth,
в офисных сетях
2,
-
&
"
%-
LoRa,
6.
" UDP-
" . 4
9 LoRa
-
%
%
-
"
,
,
$
.
TCP,
. *
-
Bluetooth ,
-
-
,
%
"
UDP-
,
,
" . $,
-
,
LoRa.
,
& $
$
%
"
UDP-
" ,
-
" ,
"
-
802.15.4,
. &
,
UDP, %
Digi.
+
-
, %
-
, %-
"
" .
#
%
- // .
"
"
//
=.=.=.255,
//
" -
function udpBegin() {
. ' %
" udpServer.setBroadcast(true);
"
- console.log('Z UDP $ ');
%
,
- }
$
"
function readMessage(message, sender) {
. *
,
console.log(sender.address + ':' + sender.port +' sent:
IP-
%
%
' + message);
192.168.0.1, %
" }
"
udpServer.bind(UDP_PORT); // UDP
192.168.0.255.
udpServer.on('listening', udpBegin); // UDP
&
" - udpServer.on('message', readMessage); // \
// ' UDP
,
, $ // :
- var data = "
";
,
udpServer.send(data, 0, data.length, UDP_PORT,
,
" broadcastAddress);
UDP
-
" : udp.send(),
,
-
" ,
:
9 - WiFiUDP Udp; // Z$ R$ WiFiUDP
const int port = 8888; //
,
//
,
setup(), - void setup() {
, —
- Serial.begin(9600);
- //
' Wi-Fi,
Wi-Fi. *
while ( WiFi.status() != WL_CONNECTED) {
Wi-Fi Serial.print("
' : ");
,
" Serial.println(ssid); // R (SSID)
. 0
WiFi.begin(ssid, password); // '
,
delay(2000);
}
//
' , R
config.h (
$ //
:
-
"
- IPAddress ip = WiFi.localIP();
). 0
$ Serial.print("IP-: ");
- Serial.println(ip); Udp.begin(port);
"
,
- }
UDP,
" -
" UDP,
WiFiUdp:
Программа netcat
=
UDP-
" *
netcat
% ,
-
%
" .
POSIX
- &
,
"
netcat. /
" ,
"
TCP-, :
UDP- ,
- $ nc -u 192.168.0.4 8888
,
. /
-
$
-
. " % <Enter>.
,
'
$
" ,
" ,
%
-
.
" node.js,
" -
(
0
,
" -
, , -
Arduino
" netcat,
,
"
$
8888):
, 8888. /
,
$ nc -u -l 8888 netcat
"
8888
,
* Raspberry Pi $ ,
, -
,
.
sudo:
$ sudo nc -u -l 8888
*
netcat
-
. *
,
, $
- Linux %
"
"
-
,
-
-b, macOS
,
,
%
"
-
%
8888 "
.
-
"
" . 0 -u ,
$
UDP, - , :
-l —
% $ man nc
"
" ,
" -
. & $
netcat
Windows,
(Raspberry Pi, BeagleBone . .),
"
-
-
Windows,
-
.
,
. Net
%
"
"
- Cygwin bash Windows 10,
-
$ -
"
:
-
,
netcat.
4
,
,
. 9
"
-
% <Ctrl>+<C>.
Бессеансовые сети и двоичные протоколы 347
Проект 13
Сетевые светильники
Протокол UDP удобно использовать для реализации сетевых проектов, в которых большое коли-
чество устройств выполняют обмен данными между собой или с сервером, причем такой обмен
осуществляется нерегулярно и в течение короткого времени. В этом проекте мы создадим набор
мерцающих сетевых светильников, которые обмениваются сигналами друг с другом, когда над
каким-либо из них проводят рукой.
*
Wi-Fi
-
. #
—
-
"
%
" UDP:
%
-
. &
%
"
" UDP,
$
,
-
-
$
,
- . #"
-
. 2
-
. >
$
.
UDP,
,
#
-
".
"
,
, +
UDP
-
(
. 7.2). 4
-
$ :
,
%
"-
,
" . &
,
. &
,
- UDP
.
, / ,
,
348 Глава 7
, +
,
.
. 7.3–7.5,
&
MKR1000 (
. 7.3) " 10 80
,
"
, $
Wi-Fi
$
-
ESP8266 (
. 7.4 7.5).
"
&
0 5 &.
. *
$ ESP8266
.
,
%" 1 &,
ESP8266
-
( ADC
, % $
SparkFun,
.
Adafruit),
-
. 7.4,
,
-
-
2
,
.
,
%
Рис. 7.3. Монтажная схема проекта сетевых светильников (версия для платы MKR1000). Слева здесь показана LiPo-батарея,
обеспечивающая электропитание всех устройств проекта. Емкость батареи должна быть не менее 800 мА, а еще лучше —
1200–2000 мА. Это необходимо для питания как электронной части проекта, так и самих светодиодов, потребляющих значи-
тельный ток
A B C D E F G H I J
1 1
5 5
10 10
15 15
2000mAh
20 20
25 25
30 30
A B C D E F G H I J
350 Глава 7
$ 1 &. *
$ 470 0. 0
,
,
-
$
,
-
"
,
, -
,
. ,
,
,
%
.
=
,
-
NeoPixels,
=
5 &,
,
%
,
4,5 &,
. =
33, 3,7 &,
-
$
LiPo. NeoPixel Jewel Adafruit, -
3,3 &
,
-
. &
"
,
-
,
,
,
-
"
"
. . 0 ,
NeoPixel
60
5 & - , $
, %
-
Adafruit
-
-
,
NeoPixels
.
Рис. 7.4. Принципиальная схема проекта сетевых светильников. Максимальное рабочее напряжение аналогового ввода плат
на микросхеме ESP8266 (обозначен ADC на платах компаний SparkFun и Adafruit) составляет 1 В, поэтому используйте делитель
напряжения (см. его схему справа), чтобы уменьшить напряжение, подаваемое на него с выхода инфракрасного датчика рас-
стояния, до допустимого уровня
+3,3 В
Напряжение Для плат на микросхеме ESP8266
питания (Vin) +3,3 В используйте делитель напряжения,
чтобы уменьшить максимальное
выходное напряжение
Вывод Напряжение питания (Vin)
A0 инфракрасного дальномера
до величины, не превышающей 1 В
+3,3 В
микроконтроллера ADC
Вывод
Программируемые Напряжение
светодиоды питания (Vin) 220 Ом
(NewPixels) Общий
Выходные Входные
данные данные
D5
Общий
Общий
Бессеансовые сети и двоичные протоколы 351
OFF
ON
- +
A B C D E F G H I J
1 GND GND 1
3V3 VIN
SDA 5
SCL 0
5 DTR 4 5
TX 13
OFF-ON RX 12
5V XPD
NC ADC
10 GND EN 10
3 x AAA 15 15
20 20
25 25
30 30
A B C D E F G H I J
Рис. 7.5. Монтажная схема проекта сетевых светильников (версия для платы ESP8266). В качестве источника питания для этого
проекта можно использовать три батарейки типа ААА. Но питание от батареек подключайте не через схему питания платы, а
непосредственно к выводу Vin. Плата Feather Huzzah! ESP8266 компании Adafruit имеет иную распиновку, но вывод от датчика
расстояния так же можно подавать на вывод ADC платы, а светодиоды подключать к ее выводу 5
,
?
-
. &
-
-
(NEO_KHZ800)
- %
— -
,
,
HTML:
. & %
candle.setPixelColor((, #));
&
-
800 q.
. *
, 0xFFFF0000
X
-
:
. 4
-
?
:
",
,
,
:
.
candle.setPixelColor(, &
"
-
, $
,
);
%
-
=
$
.
:
candle.setPixelColor(,
, $
,
,
);
/*
-
-
: Arduino
, -
*/
, . &
.show()
- #include <Adafruit_NeoPixel.h>
-
, $ const int neoPixelPin = 5; // +
const int numPixels = 7; // $ -
Adafruit_NeoPixel candle = Adafruit_NeoPixel(
numPixels, numPixels, NEO_GRB + NEO_KHZ800);
. .clear()
0x000000
void setup() {
: Serial.begin(9600); // \#$ '
// $
Бессеансовые сети и двоичные протоколы 353
void loop() {
for (int pixel = 0; pixel < numPixels; pixel++) {
candle.setPixelColor(pixel, 0xFF0000);
}
candle.show(); // -
delay(1000);
candle.clear(); // +'
candle.show(); //
delay(1000);
}
. *
~
(
-
- , ,
,
-
" -
) 4-
. $ ,
,
-
9
"
" $
.
.
"
,
- ,
0xCB500F,
-
,
-
,
0x853E0B,
%
%
,
"
"
- (. 7.1). +
-
,
$
. +
,
$ $ ,
-
"
(
,
-
) % - "
"
$
%
.
.
$
—
Таблица 7.1. Составляющие текущего
. 2
- и целевого цветов
Красный Зеленый Синий
.
-
Текущий 0xCB 0x50 0x0F
" -
. 4
Целевой 0x85 0x3E 0x0B
354 Глава 7
9
, (
). 2
"
"
-
-
" ,
.
,
-
/
"
% .
, -
-
,
-
"
.
% . / -
-
" . '
,
%
,
4-
.
.
;
byte
0
, // # -$
- unsigned long green = 0;
, $
$
. //
$ $
:
green = myColor & 0x00FF00; // $
_
+ (AND), +_+ (OR)
- // 0x003C00
" +_+ (XOR)
-
. ;
-
: &
$
3
0 . Setting the bit.
-
4
0 . Clearing the bit. .
356 Глава 7
-
%
—
:
. / -
,
-
,
,
%
"
-
,
. X
$
%
-
, -
" UDP-
" .
$
-
triggered
-
triggered -
false (). &
"
true (
),
, $
,
%
.
+
- . #
$ ,
!
. & -
, ,
$
-
%
" triggered
%
.
"
%
"
target
- unsigned long target = keyColors[1]; // ,
// -
, currentColor —
- long lastFadeTime = millis(); //
$
// #
" , lastFa- long interval = 30; // - (30 )
deTime —
- int threshold = 500; //
$
. boolean triggered = false; // $ #
,
-
interval
-
%
(30 -
%
),
threshold —
-
-
, triggered —
-
:
" - // UDP- $:
currentColor
Udp.beginPacket(destination, port);
UDP- ,
- Udp.print("ping");
triggered - Udp.endPacket();
true (
). triggered = true; // ,
//
}
-
}
-
,
,
%
-
"
$
:
loop(), // # 30 :
%
" if (millis() - lastFadeTime >= interval) {
. = triggered = false; // M $ #
// false
"
millis()
- if (currentColor != target) {
% 30
- // + - # # # :
. 4
" currentColor = compare(currentColor, target);
, - } else {
compare(),
- // + $ keyColors $
// #:
(
- int next = random(4);
loop()). 4
target = keyColors[next];
" - }
,
keyColors:
loop(), // M # - :
for for (int pixel = 0; pixel < numPixels; pixel++) {
, candle.setPixelColor(pixel, currentColor);
,
- }
candle.show(); // -
.show().
$ //
lastFa- lastFadeTime = millis(); // Z- -
deTime "
,
- //
" millis(), }
" :
2
% loop() // ,
" if (Udp.parsePacket() > 0) {
String line = "";
UDP-
" .
// UDP-, :
while (Udp.available()) {
line = Udp.readStringUntil('\n'); // Z
.parsePacket(), " //
- }
IPAddress sender = Udp.remoteIP(); //
, ,
" // IP-
.available(),
" . Serial.print(": "); // + R IP-
&
,
//
Бессеансовые сети и двоичные протоколы 359
// #
IP-
. }
4
"
}
ping,
} // # % # loop()
.
// % # compare()
2
%
com-
pare(),
-
. #
loop()
-
-
:
2
-
%
,
,
,
-
. *
. 7.6
-
node.js,
" %
- "
-
"
" ,
.
$
. '
-
,
" $ +
$
-
"ping".
- ,
-
—
. +
—
"
- ,
-
,
.
. &
,
#
node.js
" -
33 333
. . 3
%
,
&
-
-
— -
,
-
,
-
. &
. =
$
"
-
- -
candle.show() -
10
,
- setup(), loop():
10 см +
%
-
UDP-
" . +
%
"-
"
-
" $ ,
,
%
"
" -
. >%
%
-
IP-
, $
30
-
,
,
192.168.0.2 192.168.0.31.
" -
,
"
Udp.beginPacket():
3
" ,
$ $
.
*
,
-
" IP-
,
% % -
.
-
"
"
-
,
,
"
-
. / -
,
!
#
(TTL5), %
.
#
,
Рис. 7.6. Версия схемы светильника для платы MKR1000, со- IP
TTL, "
бранная на макетной плате уменьшенного размера. При та- "
%
,
кой компоновке вся схема помещается в жестяную коробку
% .
$
из-под леденцов диаметром 10 см. Светодиодная сборка, изо-
лированная от микроконтроллера резиновой прокладкой, %
%
-
размещена достаточно близко к центру трубки для создания
TTL
,
хорошего светового эффекта, а датчик — достаточно близко % ,
0
к ней, чтобы край трубки не вызывал ложных срабатываний.
Батарейка находится под платой. На нижнем рисунке показа-
%
.
на только сама монтажная разводка без микроконтроллерной
платы и светодиодной сборки
5
TTL — Time-To-Live.
Бессеансовые сети и двоичные протоколы 361
$ traceroute -a makezine.com
traceroute: Warning: makezine.com has multiple addresses; using 104.25.44.28 traceroute to
makezine.com (104.25.44.28), 64 hops max, 52 byte packets
1 [AS0] 192.168.0.1 (192.168.0.1) 5.359 ms 7.537 ms 10.090 ms
2 * * *
3 [AS12271] tge-0-10-0-10.nymanyfo01h.nyc.rr.com (68.173.209.1) 30.503 ms 32.057 ms 34.002 ms
4 [AS12271] agg115.nyclnyrg01r.nyc.rr.com (68.173.198.64) 30.132 ms 38.111 ms 39.582 ms
5 [AS19548] bu-ether19.nwrknjmd67w-bcr00.tbone.rr.com (66.109.6.78) 41.176 ms 34.952 ms 24.525 ms
6 [AS19548] bu-ether12.nycmny837aw-bcr00.tbone.rr.com (66.109.6.27) 34.226 ms 40.067 ms 34.095 ms
7 [AS7843] 0.ae2.pr0.nyc20.tbone.rr.com (107.14.19.147) 35.052 ms [AS19548] 0.ae0.pr0.nyc20.
tbone.rr.com (66.109.6.157) 29.482 ms [AS19548] 0.ae1.pr0.nyc20.tbone.rr.com (66.109.6.163)
27.959 ms
8 [AS1299] nyk-b5-link.telia.net (62.115.34.145) 20.895 ms 43.579 ms 47.807 ms
9 [AS1299] nyk-bb2-link.telia.net (80.91.254.15) 40.781 ms 29.687 ms 29.712 ms
10 [AS1299] nyk-b2-link.telia.net (62.115.134.108) 31.577 ms 29.079 ms 30.539 ms
11 [AS1299] cloudflare-ic-301663-nyk-b2.c.telia.net (213.248.77.162) 30.656 ms 35.082 ms 25.414 ms
12 [AS13335] 104.25.44.28 (104.25.44.28) 29.912 ms 30.884 ms 27.869 ms
=
,
$ .
-
%
traceroute
, .
UDP- ( %
-
$ makezine.com,
- ~ traceroute
-
IP-
104.25.44.28).
-
UDP,
-
,
IP-
TCP
UDP-
TTL,
1. / +
. &
,
%
"
%
-
-
-
,
,
. 7
%
,
,
traceroute,
-
%
. 2
UDP-
-
ICMP6,
TTL,
2. /
- ping.
%
" ,
$
- traceroute
%
TTL,
UDP-
" ,
"
"
-
%
,
- , —
%
. /
"
" .
, traceroute -
. ;
,
6
ICMP, Internet Control Messaging Protocol —
traceroute
-
"
" [
] +
.
362 Глава 7
&
* -
www.yougetsignal.com/tools/visual-
traceroute
-a, - tracert
traceroute,
%
(
AS7). X
. ~ $ - -
,
AS
,
-
https://apps.db.ripe.net/search. ,
,
,
*
%
%
"
(
. 2
traceroute)?
+
.
7
%
, %
" , - >
$
9.
. X
$ -
, $
traceroute - Traceroute для Windows
: * * *.
& Windows
traceroute —
tracert
7
AS, Autonomous Systems —
.
-a.
XBee — ,
,
XBee Pro S2C 802.15.4. +
%
"
" -
Digi . 0
LoRa,
$ ,
6, —
XBee.
,
, "
8 (
!
,
LoRa). #
XBee -
ZigBee и XBee
:
,
-
;
ZigBee
.
ZigBee,
XBee — Digi,
"
Inc. /
. =
-
XBee. 8
0 . Personal Area Network (PAN) ID.
Бессеансовые сети и двоичные протоколы 363
/,
/.
. &
,
$ -
/,
-
" «»
-
($
-
Bluetooth,
-
9),
(-
-
),
"
, . /
. 3
XCTN,
" -
XBee
" X3 (UART), -
XBee
"
-
, " -
. =
Digi
. 9
-
XCNU,
-
Write -
: www.digi.com/support/
,
product-support. &
Select Your Product
Hayes AT,
for Support XCTU,
-
-
. .
*
Digi
"
=
XBee
-
) ,
ASCII AT,
-
, Настройка радиомодулей XBee
"
,
XBee
-
—
(
), "
XCTU
Рис. 7.7. Вспомогательные платы XBee: а — адаптер XBee-to-USB производства компаний Adafruit и Parallax (слева) и плата
SparkFun XBee Explorer (справа); б — адаптерная плата SparkFun Fio; в — адаптерная плата SparkFun XBee LilyPad; г — адап-
терная плата XBee Breakout
а б
в г
Бессеансовые сети и двоичные протоколы 365
0
XCTU - &
,
-
3;
-
-
,
-
XCTU. = $
"
CoolTerm
(
. 7.9).
.
> , 3;
-
Примечание
,
,
-
4
XCTU -
.
,
. = $
( 5)
" . *
Digi
-
-
, -
,
,
XCTU. &
5,
"
.
.
&
" ),
-
XCTU
(
+++), :
: ATDL\r
+++
#
,
0,
-
+ % <Enter> $
%
- . *
$ . 7 XBee
,
" :
,
-
OK %
. 9
16-
. 3
= , +++
-
%
,
,
-
$
0 FFFF.
!#
(guard time). 4
,
10
+
PAN ID (
Проект 14
Предупреждение о наличии в мастерской токсичных
испарений
Если у вас есть мастерская, вы оцените этот проект. Подключив датчик летучих испарений
к радиомодулю Digi 802.15.4, вы сможете обнаруживать повышенную концентрацию паров рас-
творителей в атмосфере своей мастерской. При работе с химикатами легко привыкнуть к их
испарениям, что может повлечь нежелательные последствия, вплоть до летальных. Этот проект
демонстрирует, как предотвратить такое развитие событий.
2
-
. 0 Рис. 7.10. Проект, выявляющий наличие токсичных газов,
в сборе: датчик газа, шимпанзе Чарли и сервер на одноплат-
ном компьютере. В качестве альтернативы радиомодулю
на сервере можно использовать модуль Digi XStick (показан
Raspberry Pi,
"
справа)
-
. &
-
% — % '
-
—
-
-
,
-
. /
-
,
%
,
,
. 4
-
, $
,
.
*
. 7.10
$
. 3
7.11
-
.
Требуемые компоненты
9
220 0, 1 %.
= $
-
47 0, 1 %.
. *
,
- Компоненты для схемы
исполнительного устройства
:
>
, 1 %.
3
XBee-to-USB, 1 %.
9 XBee XBee Pro S2C
802.15.4, 1 %.
Компоненты для схемы датчика
+
% % '
-
>
, 1 %. , 1 %.
9 XBee XBee Pro S2C
802.15.4, 1 %. Об источнике питания для игрушки
#
5 &, 1 %. 4
%
%
-
#
3,3 &, 1 %.
3 & (
,
D),
3,3 &
+
9–12 &,
. *
$
-
1 %.
,
-
.
$
. 4
3
XBee, 1 %.
,
=
%
, 2 %.
«»
$
-
=
, 2 %.
%. &
1 [, 2 %.
.
10 [, 2 %.
#
3,3 &, 1 %.
= MQ-6
Hanwei, 1 %.
3
XBee, 1 %.
3
, 1 %.
=
%
, 2 %.
# , 1 %.
=
, 2 %.
# , 1 %.
Рис. 7.11. Блок-схема системы выявления токсических газов
9
220 0, 1 %.
=
NPN-
TIP120,
Радиомодуль 1 %.
XBee датчика
9
1 0, 1 %.
100 [, 1 %.
Радиомодуль Радиомодуль XBee Компоненты для схемы сервера
XBee сервера исполнительного
устройства
0
Raspberry Pi, 1 %. -
BeagleBone Green
-
Raspberry Pi
Linux.
в качестве
веб-сервера
9 XBee XBee Pro S2C
802.15.4, 1 %.
XBee-to-USB-
, 1 %. 7
-
Локальная
,
-
сеть
,
(
802.15.4)
XStick
-
Веб-браузер
Digi,
USB
.
Бессеансовые сети и двоичные протоколы 369
Настройка радиомодулей
- ? ATID1111 — PAN ID;
: , % ;
(
-
? ATIT1 —
-
,
-
%
)
. ;
,
. 9
,
"
100 -
,
-
: 1
× 100
PAN ID (
= 100
;
). & $
-
? ATIAFFFF —
/. *
,
.
, - 9
-
.
,
"
, ,
- -
" -
+7-. ,
" -
[
D0,
,
D0
. +
-
. *
D0
-
" : ;
? ATIU1 —
-
? ATMY01 —
/
;
. /
-
? ATDLFFFF —
—
%
" ;
370 Глава 7
$
- ? ATDL01 —
-
;
"
(
01). * $,
,
? ATIA01 ATIAFFFF —
-
, $
" ;
,
01 (
? ATID1111 — PAN ID;
). 4
$
? ATIU1 —
-
FFFF,
/
, -
. / -
$
.
-
;
,
.
-
. Сброс настроек радиомодуля
9
"
- '
XBee -
-
(
"
. *- ,
-
$
,
),
%
, ATRE\r.
" :
& . 7.2
-
? ATMY03 —
-
;
.
0
1. & +++.
Совет
>
XBee,
,
,
-
"
- Рис. 7.12. Рекомендуемая разметка радиомодулей, позво-
. ~ , ляющая их не перепутать
. 7.12.
5 & — ,
- & $
-
3,3 & LD1117-33V. 9
3,3 & —
,
-
$
9 & -
5 &. $
-
. = $
-
-
9 &,
,
-
$
9–12 &.
.
*
. 7.13
( - ~
,
) (
!)
.
,
&
MQ-6, $
- % , $
-
-
. #
Hanwei.
-
,
47 0
—
,
. /
372 Глава 7
Вход Выход
H A
10 мФ 1 мФ
Датчик газа MQ-6
компании Hanwei
H B
Радиомодуль XBee
LD1117-33V
Voltage Reg
Вход Выход
Vcc AD0 / DIO0
TX AD1 / DIO1
47 кОм
10 мФ 1 мФ RX AD2 / DIO2
15
20
25
30
10
15
20
25
30
1
5
J
J
I
I
G H
G H
G H
G H
F
F
C D E
C D E
C D E
C D E
A B
A B
A B
A B
10
15
20
25
30
10
15
20
25
30
1
Рис. 7.13. Принципиальная (вверху) и монтажная (внизу) схемы подсоединения радиомодуля XBee к датчику газа
Бессеансовые сети и двоичные протоколы 373
Схема исполнительного
$ . +
(сигнального) устройства
« ». #
=
-
(%
% -
-
)
(_0#).
-
,
_0# ( -
. 7.14. >
-
.
3
,
MQ-6), $
XBee,
47 0,
"
.
.
. &
,
%
_0#
-
1,4–1,7 &. /
,
,
%
%
,
-
3 &. *
. 7.15 -
(
%. 3
-
).
-
. 7.13
-
%
.
(
#
-
22 0),
-
"
,
,
-
"
/ -
(
. & +7
XBee
,
TIP120,
,
).
,
$
-
:
-
2,3 &.
,
-
, — .
,
-
1,6 &. =
$
,
&%
-
,
, $
-
.
, , -
.
_0#,
&
-
,
,
-
,
-
(D0). ;
. *
-
"
-
XBee ( 14)
-
. #
-
3,3 &.
, -
,
.
Проветрите помещение & $
,
-
2
,
-
" . &
-
.
-
-
,
" "
.
. 4
,
,
374 Глава 7
Рис. 7.14. Принципиальная (вверху) и монтажная (внизу) схемы подсоединения сигнального устройства (обезьянки с ударными
тарелками) к радиомодулю XBee
Электродвигатель
Радиомодуль XBee
постоянного тока M
1 кОм
Транзистор
Vcc AD0 / DIO0 TIP120
100 мФ TX AD1 / DIO1
RX AD2 / DIO2
PWM1 Vref
NC SLP + 3,3 В
220 Ом
DTR/DI8 CTS / DIO7
TIP120
Darlington
10
15
20
25
30
1
5
J
J
I
I
G H
G H
F
F
C D E
C D E
A B
A B
10
15
20
25
30
1
5
Бессеансовые сети и двоичные протоколы 375
Рис. 7.15. Внутреннее устройство игрушки с изменениями подсоединения проводов двигателя. Припаяйте провода питания
для макетной платы к «плюсу» батареи, а общий провод — к ее «минусу» (поз. А). Обрежьте провода, шедшие на двигатель
(поз. Б — «плюс», поз. В — общий), и припаяйте взамен новые, подсоединенные к макетной плате
=
macOS, Windows Li- /
-
nux
: open (
), close
%
. * Raspberry Pi (
), error (%) data ( ).
- 2
. $ . '
-
,
" — data —
-
! «$
-
Raspian». .
-
, $
> node-serialport
-
—
,
.
,
. &
, - #
"
-
"
-
-
"
: "
:
var myPort = new SerialPort(portName);
,
"
. [
-
XCTU
-
"
-
. & -
XBee 802.15.4 Digi. =
"
" :
$
-
. 4
, $
7E 00 0A 83 00 01 1F 00 01 00 05 00 01 59
:
7E 00 0A 83 00 01 1F 00 01 00 05 00 01 59
7E 00 0A 83 00 01 1F 00 01 00 05 00 01 59
378 Глава 7
? 1 (7E) —
? 12–13 — ,
-
(
-
"
(1) (0)
). /
. $ -
;
-
? 2–3 (00 0) —
. -
. & %
- 00 01 ,
; D0. 3 ,
,
00 02 (0000 0010
-
? 4 (83) —
API )
(,
" ); D1.
? 5–6 (00 01) —
"
;
-
? 7 (1F) —
— 0x7E (
-
(+X#, RSSI10); 126),
? 8 (00) — %
"
$ -
(
%
); .
? 9 (05) —
.
7 $
# $
" IT
;
node-serialport,
$
npm,
? 10–11 (00 01) — /-
,
"
.
. 2
-
& %
$
— D0,
- serialServer.js.
;
10
RSSI, Received Signal Strength Indicator.
Читаем пакет
/
- /*
"
, serialServer.js
: node.js
0-7, "
- */
" . ;
-
- var SerialPort = require('serialport'); //
'
// serialport
, var portName = ' /dev/tty.usbserial-xxx'; //
. //
var incoming = []; // & - -- -
-
node-serialport. //
:
2
var myPort = new SerialPort(portName);
USB/
TTL-Serial. + $
-
"
-
-
. 2
-
"
,
:
Бессеансовые сети и двоичные протоколы 379
- // +$ :
: myPort.on('open', portOpen);
// +$ - -- -:
myPort.on('data', readData);
-
// +$ :
. #
myPort.on('error', portError);
:
$ node serialServer.js
+
$
port /dev/tty.usbserial-00001414 open
$
- baud rate: 9600
[]
"
" :
[[ 0, 10, 131, 0, 1, 35, 0, 1, 0, 1, 0, 1, 85 ]
[ 0, 10, 131, 0, 1, 35, 0, 1, 0, 1, 0, 1, 85 ]
[ 0, 10, 131, 0, 1, 42, 0, 1, 0, 1, 0, 1, 78 ]
[ 0, 10, 131, 0, 1, 41, 0, 1, 0, 1, 0, 1, 79 ]
[ 0, 10, 131, 0, 1, 34, 0, 1, 0, 1, 0, 1, 86 ]
[ 0, 10, 131, 0, 1, 36, 0, 1, 0, 1, 0, 1, 84 ]
$ , -
126
(0x7Eh %
-
),
"
XBee.
380 Глава 7
>%
var message = { //
XBee
13 ,
- // " JSON:
. & packetLength: -1, // $
, - apiId: 0, // \% API
- address: -1, // ' XBee
rssi: 0, // M
.
channels: 0, // /, $
$
—
, - //
XBee - sampleData: 0, // -
,
node. pinStates = [] // &,
-
js
// #%-
. &
,
- };
,
"
-
.
0
, -
-
" ,
message. /
-
JSON
-
$ -
"
XBee:
Разбираем пакет
& readData() - if (value === 0x7E) { // $ 0x7E $
console.log() -
parseData(). parseData(incoming); //
2
$ output = []; // - - -
} else { // $
0x7E,
incoming.push(value); // --
readData(). / - //
- }
" ,
. 0
-
" :
, // -
$.
for, - // %,
// R $ ' :
message.channels = ((thisPacket[8] * 256) +
.
thisPacket[9]).toString(2);
// Z #%-
:
(
D0 D8), - message.sampleData = (thisPacket[10] * 256) +
thisPacket[11];
-
,
- //
$
,
- //
#%-
:
$ : for (var pin = 0; pin < 9; pin++) {
// +
- :
var thisPinState = message.sampleData & (1 << pin);
// Z-
#%
:
message.pinStates.push(thisPinState);
}
console.log(message); // + R R
}
}
Добавляем сервер
;
,
- var express = require('express'); // $
"
- // express:
var server = express(); // C
server,
XBee,
//
express
,
" server.use('/',express.static('public')); //
-
. //
public
0
$
- // \#$
var SerialPort = require('serialport'); //
'
// serialport
-
node.js. 2
-
%
.
0
-
express
-
. &
express
$
,
:
&
server.listen(8080); // %
- server.get('/json', respondToClient); // N
//
GET
GET:
//
,
parseData()
- //
:
function respondToClient(request, response) {
-
// N
:
GET, response.end(JSON.stringify(message));
% $
- }
:
382 Глава 7
«
»
XBee ?
$
" ?
JSON:
?
XBee-to-USB
-
{ packetLength: 10,
XCTU -
-
apiId: '0x83',
;
address: 1,
rssi: -33, ?
"
channels: ‘1’,
"
?
sampleData: 1,
"
-
pinStates: [ 1, 0, 0, 0, 0, 0, 0, 0, 0 ] } 1 10.
Создаем веб-страницу
,
/*
p5.js Z -# $
public $
. = $ : P5.js
- */
p5.js, -
var sensorState = 'UNKOWN'; //
: var bgColor = 0; // # % #
$ p5 g -b public
2
sketch.js
setup()
-
:
[ setup()
function setup() {
createCanvas(windowWidth, windowHeight); //
// $
,
textSize(24); // $ %
%
. 2 fill(255); // # %
GET HTTP httpGet('/json','json',getResponse); //
// $
: }
Бессеансовые сети и двоичные протоколы 383
- // # $ % # httpGet():
function getResponse(message) {
// $ 0:
getResponse(),
-
if (message.pinStates[0] === 1){ //
sensorState = 'HIGH'; //
,
bgColor = '#FF0000'; // # %
GET HTTP. [ } else { // $
sensorState = 'low'; //
,
- bgColor = 0; // # %
: }
httpGet('/json','json',getResponse); //
// ' $
}
[ draw()
- function draw() {
$
" : // % $ ' #:
background(bgColor);
&
. *
. 7.16 - // + R
text('
$ : ' + sensorState, 30, 30);
-
}
.
;
,
-
, %
- Рис. 7.16. Снимки с экрана веб-страницы радиомодуля сер-
вера датчика газа. Как сам текст, так и цвет фона окна позво-
%
, - ляют с первого взгляда понять текущее состояние качества
%
воздуха в мастерской: состояние атмосферы в мастерской
:
%, нормальное (вверху — фон окна черный) или опасное (вни-
зу — фон окна красный)
,
-
.
%
.
384 Глава 7
API XBee
-
«XBee/ Digi —
,
XBee-PRO S2C 802.15.4 RF Module User Wi-Fi
,
-
Guide»,
:
10. /
http://cms.digi.com/resources/documentation/
Digidocs/90001500. 9
$
.
Заключение
>
,
14 —
API XBee),
" ,
-
"
. & $
-
. =
"
" %
"
,
%
— $
- %
. ;
. 0 , %
%
-
" — $ %
,
,
"
. +
" .
" ,
- ;
,
-
,
-
,
" .
,
,
"
#
$ , -
,
(
-
:
-
13
" - .
Свадебные свечи Тома Иго, Пейки Сю (Peiqi Su), Декинга Суна (Deqing Sun), Бена Лайта (Ben Light)
и Энди Зиглера (Andy Sigler)
/
Wi-Fi,
" UDP
" .
Глава 8
«Адрес 2007» от Моуны Андраос (Mouna Andraos) и Сонали Сридхар (Sonali Sridhar)
& $
GPS.
, -
. 0
'. (J. Nordberg).
388 Глава 8
Коды поставщиков
? A — Arduino Store, http://store.arduino.cc ? P — Pololu, www.pololu.com
? AF — Adafruit, http://adafruit.com ? PX — Parallax, www.parallax.com
? D — Digi-Key, www.digikey.com ? RS — RS, www.rs-online.com
? F — Farnell, www.farnell.com ? SF — SparkFun, www.sparkfun.com
? J — Jameco, http://jameco.com ? SS — Seeed Studio, www.seeedstudio.com
Рис. 8.1. Новые компоненты для проектов этой главы: 1. Приемник Bad Elf GPS Pro+. 2. Приемник GPS Garmin GLO. 3. Модуль
GPS на адаптерной плате компании Adafruit Ultimate GPS Breakout. 4. Ультразвуковой дальномер HC-SR04. 5. Адаптерная пла-
та 9DOF IMU компании Adafruit. 6. Цифровой компас LMS303DLH. 7. Инфракрасный дальномер GP20Y0A21 компании Sharp.
8. Плата Arduino 101
1 2
7
8
6
Как узнать местонахождение (почти) чего угодно? 389
Bluetooth Serial, 1 +.
> Bluetooth, 1 +. 4
%
"
AF: 1588, SF: WRL-12580 WRL-12576
Bluetooth,
% Bluetooth-
.
7
- AF: 1327, RS: 807-7742, SS: 113990026
USB-to-Serial.
C
, 1 +.
-
SF: DEV-09716 DEV-14050, AF: 3309
284, SS: 317990026
GPS.
ST Microelectronics, 1 +.
"
, 1 +. = $
- AF: 1120, SF: B0B-13303, P: 1250, SS: 101020081
Arduino .
H
, 4 +. # -
MKR1000 — AF: 3156, RS: 124-0657, A:
.
ABX00004, GBX00011 (3
4#), D: 1659- D: A26509-20-ND, J: 103377, SF: PRT-00116, F:
1005-ND 1593411
Arduino 101 — D: 1660-1003-ND, J: 2239331,
>.
SF: DEV-13787, AF: 3033, F: 2520713, RS: 913-
9999, SS: 114990575, A: ABX00005, GBX00005
]=
=
-
(3
4#)
-
.
"
.
)
-
)
, ,
Wi-Fi. ; -
,
-
, $
,
. 0
-
"
. 4
-
$ ,
-
%
.
,
,
-
2
,
,
-
,
-
. ;
,
. 0"
-
,
, -
,
"
:
.
IP-
-
% $
, , - ,
.
"
-
,
-
. 3
. 4
%,
- ,
-
,
, —
, "
-
.
. &
-
$
, $
"
%
:
% % , ,
,
392 Глава 8
, " , "- ;,
, ,
,
-
,
, — -
,
-
. *
.
, - /
% ,
,
,
. ;
, ,
-
"
-
. &
,
% ,
,
%
-
, — $
$-
,
. #
,
-
,
-
"
,
-
" .
, -
, " , - ,
,
- $ ,
-
,
" ,
. & $
,
-
"
"
-
. . 2 " -
% $
% ,
, -
-
,
"
. ;
*
,
,
9
. # , -
,
-
-
"
. ;
-
,
—
,
-
—
-
« -
"
-
»,
. '
,
, "
. '
? &,
-
$
-
— , $ ,
,
$
, —
, " -
"
.
. ;
$
,
-
*
-
,
"
,
-
" . $,
%
. &
,
,
,
,
-
,
,
,
-
%
,
,
" .
", $
% .
Как узнать местонахождение (почти) чего угодно? 393
#3
"
,
,
,
-
Virtual Terrain Project2.
, -
+
.
2
«&
%». ,
IP-
394 Глава 8
IP-
. &
"
,
-
-
,
.
. * % , $
,
"
-
7, ,
"
,
-
.
•
?
~ (Chris Heathcote) -
- • =
?
%
- • *
" ?
: «35
»4. 0
•
.
,
,
• * .
% . +,
-
• X/
.
,
, %
-
- -
- • *
.
%
• * .
-
. 4
—
• 7
-
,
"
%
.
- • ;
-
. =
-
— ,
$
. "
Wi-Fi.
•
, 2 . + • GPS, A-GPS5, WAAS6
% GPS.
,
$ % • >% %
/
-
,
-
.
.
• #
7.
• 0
.
• #
-.
• +
:
? 5
A-GPS (. Assisted GPS) — ,
-
• +
-,
- " «
» GPS-
. X
-
-
"
.
. 6
WAAS (Wide Area Augmentation System) —
-
-
•
.
. 9
#3 %
• +
- GPS
.
. 7
#
(
) —
( "
) (
,
3
Emerging Technology Conference —
,
,
"
. )
-
4
&
: «35 Ways to Find Your Location».
.
396 Глава 8
Определение расстояния
Электронные системы определения местонахождения — такие как GPS, сонар или локация мо-
бильных телефонов — сначала кажутся каким-то волшебством, поскольку нет никаких видимых
индикаторов принципа их действия. Но если разбить этот процесс на составляющие компонен-
ты, то ничего волшебного в нем не останется, и все станет сравнительно просто для понимания.
Большинство систем определения физического местоположения объекта основаны на одном из
двух принципов: измерении времени, затрачиваемого сигналом для прохождения от известно-
го места до этого объекта, или измерении уровня сигнала в точке приема. В обоих методах для
определения местоположения объекта в двух- или трехмерном пространстве с помощью трила-
терации комбинируются измерения от нескольких источников.
7
,
-
,
, . 9
.
-
$
-
,
-
$ -
,
. #
-
. / ,
,
% %
-
Проект 15
Инфракрасный дальномер
Инфракрасные дальномеры серии GP2Yx компании Sharp достаточно точно определяют корот-
кие расстояния, измеряя яркость отраженного от цели инфракрасного луча. На рис. 8.2 показаны
монтажная (вверху) и принципиальная (внизу) схемы подключения инфракрасного дальномера
GP2Y0A21YK к модулю Arduino. Эта связка может определять объекты, находящиеся от нее на
расстоянии от 10 до 80 см.
Напряжение питания
=
,
-
,
Uno ON
,
-
,
5 &. *,
-
13 7, $
3,3 &.
+5 В
Напряжение питания
+5 В
Напряжение
питания Модуль
микроконтроллера
10 мФ Выход
A0
Общий
Общий
Рис. 8.2. Монтажная (вверху) и принципиальная (внизу) схемы подключения инфракрасного дальномера GP2Y0A21YK компании
Sharp к модулю Arduino. Конденсатор, подсоединенный параллельно линиям питания дальномера, сглаживает колебания на-
пряжения и тока, вызываемые его нагрузкой
Как узнать местонахождение (почти) чего угодно? 399
%
- # "
-
-
,
. 2 $
-
,
.
&
,
% " -
-
,
.
.
+ $
-
~
- ,
-
GP2Y0A21YK
4,5–5,5 &,
,
-
,
, —
. &
,
-
%
,
-
3,3 & MKR1000 Arduino 101
-
.
,
-
.
,
,
-
.
Пишем код
/*
\- Sharp GP2xx
: Arduino
*/
void setup() {
Serial.begin(9600); // \#$
// ' $
}
void loop() {
int sensorValue = analogRead(A0); // Z
// $
//
$
float voltage = sensorValue * (5.0 / 1024.0);
// +
float distance = 21.7 / voltage;
Serial.print(voltage);
Serial.print(" V\t");
Serial.print(distance);
Serial.println(" ");
// 39 ,
// $ .
delay(39);
}
400 Глава 8
Проект 16
Ультразвуковой дальномер
Ультразвуковые дальномеры измеряют расстояние примерно так же, как это делают инфракрас-
ные, но обладают большим радиусом действия. Разумеется, вместо инфракрасного света они
излучают ультразвуковой сигнал и принимают возвращенное эхо. Показания датчика отражают
время возвращения эха, которое соответствует расстоянию до отражателя. На рынке предлага-
ется широкий диапазон модулей ультразвуковых дальномеров, большинство из которых осно-
ваны на керамических преобразователях компании ProWave (www.prowave.com.tw). Самые
первые модули для электронщиков-любителей выпускались компанией Devantech (www.robot-
electronics.co.uk), но, благодаря открытой конструкции этих модулей, сейчас их предлагают
практически все розничные поставщики электронных компонентов.
5В 5В
Напряжение
Модуль питания (Vcc)
микроконтроллера
Вывод активации подачи
выходного сигнала (Trigger)
Цифровой вывод 4
Вывод приема отраженного
сигнала (Echo)
Цифровой вывод 3
Общий
GND.
Echo
Trig.
Общий
Vcc
Uno ON
Рис. 8.4. Измерение расстояния в двух координатах с использованием ультразвуковых дальномеров. Квадрат на каждой
схеме представляет комнату размером 4×4 метра. Для того чтобы обеспечить покрытие всего пространства комнаты, нужно
расположить несколько датчиков по ее сторонам
Датчик 4 Датчик 5
Датчик 3 Датчик 2
402 Глава 8
Пишем код
# "
- /*
,
- M$
: Arduino
void loop() {
digitalWrite(triggerPin, HIGH); //
"
,
-
,
$
-
.
. #
GPS
- *
-
(
. 8.5). /
-
, -
(
. =
GPS)
(
$
-
GPS).
,
$
,
. 0
. ;
-
GPS
%
%
GPS
. *
-
,
"
-
. =
.
Основное
Base устройство
unit (sensor) sends out
Ответный сигнал, излучаемый (дальномер) излучает сигнал,
Response signal generated by signal,
мобильным устройством затем принимает сигнал,from
reads reflection
mobile unit
(например, (e.g., cell
сотовым phone).
телефоном) отраженный от объекта
mobile object or person
Исходный сигнал,
Initial signal излучаемый
generated by
основным устройством
base unit (e.g., cell tower)
(например, базовой станцией)
Пассивное определение
Активное определение Passive distance ranging
расстояния
Active distance ranging
расстояния
404 Глава 8
Проект 17
Определение уровня принимаемого сигнала
В проектах с устройствами Wi-Fi главы 4, в проектах с устройствами LoRa и Bluetooth главы 6
и в проекте с использованием устройств Digi 802.15.4 главы 7 мы познакомились со свойством
этих радиоустройств, заключающемся в индикации уровня принимаемого сигнала8 (ИУПС). Эта
характеристика предоставляет нам информацию о том, какой силы был последний принятый
устройством сигнал. При отсутствии преград сила принятого сигнала обратно пропорциональна
квадрату расстояния от приемника до передатчика. Таким образом, если мы знаем силу прини-
маемого сигнала, то можем приблизительно установить расстояние до передатчика.
*
«
», 4
-
- ,
, 0 > — $ -
" +X#
. &
"
,
-
-
0 > ,
,
%
. 3 > . '
,
3
-
,
%,
- %
. & -
,
.
,
, -
,
%
,
.
-
"
-
. ; , +X# &
,
,
"
,
, -
— "
% —
-
. &
Wi-Fi 4
.
,
MKR1000 ESP8266,
#
"
:
(>). &, -
long rssi = WiFi.RSSI();
–65 >.
$
? 0 3
LoRa 6 -
- $
-
% "
>.
:
' >,
int rssi = LoRa.packetRssi();
. *
,
1 "
- = ,
Bluetooth LE
log 1 >.
log 1 = 0, 1 & = "
"
-
0 >. "
"
-
1 &,
>
0. *
- "
node.js:
, 0,5 & = (log 0,0005) > –3,01 >.
=
: 0,25 & = (log 0,00025) > console.log('signal strength: ' +
peripheral.rssi);
–6,02 >.
#
Bluetooth
8
0 . Received Signal Strength Indicator, RSSI.
-
Как узнать местонахождение (почти) чего угодно? 405
,
+
- node.js,
$
-
-
.
p5.js.
-
* ,
-
POST:
Digi 802.15.4 7 POST /rssi/value
" Digi
API
"
"
: value
.
#
-
message.rssi = -thisPacket[5];
,
& $
-
"
GET:
- GET /rssi
.
rssi
-
,
:
2
- function postRssi(request, response) {
: rssi = request.params.rssi; //
$ $
// $
getRssi() postRssi(). / response.send("
$ \M
Z: " + rssi); //
- //
.
— response.end(); // '
}
postRssi() —
POST,
function getRssi(request, response) {
// Z$
URL-
. // meta
3
— getRssi() —
var message = "<meta http-equiv=\"refresh\"
content=\"3\">\n";
var message = "
$ \M
Z: " +
- rssi + " <br>";
message += "
- ";
if (rssi <= -60 ) { // Z
:
message += " ";
}
406 Глава 8
*
//
- server.listen(8080);
GET POST. &
//
$ :
: server.get('/rssi', getRssi); // GET /rssi
server.post('/rssi/:rssi', postRssi); // POST /rssi/value
= $
Рис. 8.6. Вывод в окне браузера результатов работы скет-
,
ча, получающего сведения об уровне силы радиосигнала
от только что созданного нами сценария сервера ИУПС.
Сервер может выводить значения уровня принятого сигна- %
"
.
,
ла не только устройств Wi-Fi. С таким же успехом можно соз- ,
"
GET
дать клиента, который будет получать от сервера значения
уровня принимаемого сигнала радиоустройств LoRa, или
"
,
Bluetooth, или любого другого радиоустройства, обладаю- ,
щего возможностью измерять величину уровня принимае- $ . 7
-
мого им радиосигнала. Если такой клиент может осущест-
влять вызовы HTTP POST, он будет работать
.
void setup() {
Serial.begin(9600); // \#$ ' $
//
' Wi-Fi,
while ( WiFi.status() != WL_CONNECTED) {
Serial.print("
' : ");
Serial.println(ssid); // R (SSID)
WiFi.begin(ssid, password); // '
delay(2000);
}
Serial.print("
' : "); // + ',
Serial.println(ssid); // R
}
2
$
- "
(
%
Wi-Fi),
-
$
. 2
. =
-
: http://
localhost:8080/rssi,
-
-
GET. =
"
-
%
Wi-Fi,
-
-
.
408 Глава 8
Рис. 8.7. Эффект множественного отражения сигнала. Отраженные радиоволны создают эффект наличия фантомных радио-
маяков, которые приемник не может отличить от настоящего радиомаяка. Это вызывает ошибки в вычислениях, основанных на
уровне мощности сигнала
Actual
Настоящий
Beacon
радиомаяк
Фантомный
Phantom Фантомный
Phantom
радиомаяк радиомаяк
Beacon Отраженный
Beacon
Reflected Отраженный
сигнал
Signal Reflected
сигнал
Signal
Основной
Primary
сигнал
Signal
Здание Здание
Building
Building
Приемник
Receiver
Как узнать местонахождение (почти) чего угодно? 409
;
-
,
"
,
- %
,
,
%
.
%. $,
- &
GPS
$ -
,
%
, —
, , %
% % -
,
%
, $
. 0
,
,
-
" . &
$-
"
-
$
.
Рис. 8.8. Трилатерация на плоскости: расстояние от точки до объекта определяет круг возможных местонахождений объекта
(слева), расстояние до объекта от двух точек сужает возможное местонахождение объекта до двух точек (в центре), а расстоя-
ние до объекта от трех точек определяет точное его местонахождение в одной точке плоскости (справа)
410 Глава 8
. &
GPS.
-
, "
-
, -
,
,
. 7
Проект 18
Геолокационные службы и протокол NMEA
Хорошей новостью для пользователей системы GPS является то, что им не нужно самостоятель-
но выполнять вычисления трилатерации или триангуляции, поскольку это делает сам приемник
GPS, который выдает пользователю его местоположение в виде географических координат (ши-
роты и долготы). В системе GPS используется несколько протоколов для приемников, но самым
распространенным из них является протокол NMEA 0183, разработанный ассоциацией NMEA9
США. Практически все приемники GPS, имеющиеся на рынке, предоставляют данные по этому
протоколу, а также обычно еще по одному или двум другим протоколам.
,
-
Требуемые компоненты GPS. *
% ,
-
GPS-
(
.
-
GPS.
), 1 %. *
,
Bluetooth- Bluefruit (
,
, -,
-
GPS), 1 %.
NMEA. $
$
-
>
Bluetooth
Bluefruit (
GPS), ,
,
-
1 %. GPS
.
&
"
-
NMEA 0183 — $
-
GPS-
, -
. >%
-
%
,
%
" -
RS-232 TTL. #
GPS-
. *
-
NMEA 0183
4800 GPS-
,
-
,
.
$
-
NMEA 0183
GPS
9
NMEA, National Marine Electronics Association — *
$
.
Как узнать местонахождение (почти) чего угодно? 411
Рис. 8.9. Модуль Ultimate GPS Breakout компании Adafruit (справа), подключенный
к ее же Bluetooth-модулю Bluefruit (слева). Чтобы получить качественный сигнал GPS,
нужно находиться на открытой местности, для чего более чем удобно использовать
беспроводную передачу данных и батарейный источник питания. Комплект радио-
устройств Bluefruit содержит разъем для подключения батареи, который можно при-
паять к радиоустройству, что позволит питать от аккумулятора LiPo как само радио-
устройство, так и подключенный к нему приемник GPS
FIX
3.3V
EN
3Vout
STS
3Vo
V
VBAT
GND
DSR
>RX
DTR
<TX
Vin
FIX
TX
RX
GND
VIN
PPS
% . ;
- Разбор предложений NMEA
Garmin, Trimble, Bad Elf
. 0
-
NMEA 0183 %
GLO Garmin
,
GPS
-
GPS Pro GPS Pro+ Bad Elf. ~
-
GPS
.
GPS Adafruit
"
, SparkFun
-
Bluetooth
"
Bluetooth
Bluefruit (
. 8.9)
-
,
"
USB/TTL-
. Serial. 3
GPS Garmin Bad Elf
-
*
GPS,
-
"
Bluetooth.
. *
. 8.9 Ultimate
GPS Breakout Adafruit,
-
Bluetooth- Blue-
.
$-
fruit,
2.
(
&
$
9600
)
-
,
-
GPS GLO Garmin GPS-
":
Bad Elf.
412 Глава 8
$GPGGA,180226.000,4040.6559,N,07358.1789,W,1,04,6.6,75.4,M,-34.3,M,,0000*5B
$GPGSA,A,3,12,25,09,18,,,,,,,,,6.7,6.6,1.0*36
$GPGSV,3,1,10,22,72,171,,14,67,338,,25,39,126,39,18,39,146,35*70
$GPGSV,3,2,10,31,35,228,20,12,35,073,37,09,15,047,29,11,09,302,20*7D
$GPGSV,3,3,10,32,04,314,17,27,02,049,15*73
$GPRMC,180226.000,A,4040.6559,N,07358.1789,W,0.29,290.90,220411,,*12
$GPGGA,180227.000,4040.6559,N,07358.1789,W,1,04,6.6,75.4,M,-34.3,M,,0000*5A
$GPGSA,A,3,12,25,09,18,,,,,,,,,6.7,6.6,1.0*36
$GPRMC,180227.000,A,4040.6559,N,07358.1789,W,0.30,289.06,220411,,*1C
&
NMEA
« »
,
-
, 10–15
. *
.
-
,
—
NMEA -
,
—
,
. .
"
($),
$
-
. 2 " . /
-
,
"
,
.
- «7
% -» 2.
(*),
-
,
- *
-
.
NMEA,
-
9
$GPRMC,
.
& %
-
(
%
- GPS
-
). #
" RMC10
,
, $
-
-
- % ,
. &
HTML5
. /
-
,
-
,
:
. +
,
-
GPS-
,
-
"
,
"
. 8.1.
,
Wi-Fi
- $
3
$GPGSV (GPS Satellites in View11)
. 4
. ;
$ GPS,
— -
-
,
p5.js
-
GPS
. 4
% ,
,
NMEA
,
GPS
,
$
. *
API
"
, $
HTML5.
10
RMC, Recommended Minimum specific —
% GPS-
"
- X
Android
-
iOS Android.
-
GPS-
%
GPS,
Garmin Bad Elf
"
"
iOS, $
-
Bluetooth GPS, -
,
https://play.google.com/
$ %
GPS, store/apps/details?id=googoo.android.btgps.
GPS.
12
GMT, Greenwich Mean Time —
q
.
414 Глава 8
а б в г
Рис. 8.10. Приемники GPS разных производителей: а — GPS-приемник EM-506 компании SparkFun. 48 каналов, хороший при-
ем, и не такой дорогой, как другие варианты; б — модуль Ultimate GPS Breakout компании Adafruit. 22 канала (66 для поиска),
оснащен также памятью для хранения данных; в — приемник GPS GLO компании Garmin. Оснащен интерфейсом Bluetooth и
смонтирован в компактном корпусе; г — приемник GPS Pro+ компании Bad Elf. Компактный, имеет экран пользовательского
интерфейса, оснащен интерфейсом Bluetooth
Геолокация в браузере
& HTML5
API $ , .
navigator,
%
&
-
. = "
-
GeolocationServer, — -
$
- public
getCurrentPosition(),
-
p5.js: index.html, sketch.js,
— p5.js. &
watchPosition(). &
$ p5-manager $
"
-
- " :
success failure options
. +
$ $ p5 g -b public
- $ cd public
"
p5.js. $ p5 u
&
,
#
index.html
— $
-
API
-
p5.js, $ -
,
,
-
HTML,
" $
.
%
. -
7
%
- ,
sketch.js,
,
" .
HTTP,
$
HTTPS,
%
.
Как узнать местонахождение (почти) чего угодно? 415
Определяем местонахождение
*
- /*
- #
"
Context: p5.js
label, */
JSON options
- var label = "
$ #...";
. var options = {
enableHighAccuracy: true,
& setup()
, timeout: 10000,
%
maximumAge: 0
. };
>%
%
-
,
- function setup() {
// - '
- //
% - createCanvas(windowWidth, windowHeight);
. * ,
fill('#A3B5CF'); // Z-
watchPosition() - textSize(36); // $ %
. textAlign(CENTER); // + #
&
- // #
navigator.geolocation.watchPosition(success, failure,
:
% - options);
,
%- }
,
, ,
JSON
:
[ draw()
% function draw () {
background('#0D1133');
: text(label, width/2, 100);
}
[
function success(position) {
success() var coordinates = position.coords;
,
var now = new Date(position.timestamp);
"
label = '+ :'
label. & JSON options + '\n : ' + coordinates.latitude.toFixed(5)
+ '\n: ' + coordinates.longitude.toFixed(5)
(HighAccuracy)
- + '\n+ - ' + coordinates.accuracy + ' .
: '
, $ - + '\n' + new Date(position.timestamp);
%
- }
.toFixed() " function failure(error) {
.
label = ' ' + error.code + ': \n' + error.message;
% % - }
"
.
[
fail-
ure()
"
%
label:
&
. #
.
416 Глава 8
,
"
$
.
%
. 3
-
2 %
- "
.
%
-
.
0
HTTPS,
-
,
%
-
,
# "
- # ,
GeolocationServer
.
, ,
"
node
npm
express.js:
https-server.js. # -
keys
. ' $ npm install express
-
,
2
https-server.js
" :
" .
&
%
=
HTTPS var options = { //
HTTPS
, -
key: fs.readFileSync('./keys/domain.key'), // '
" ,
-
cert: fs.readFileSync('./keys/domain.crt') // %
, - };
" server.use('/', httpRedirect); // % #'
fs.readFileSync(). // $ http
server.use('/',express.static('public')); // ,
// ' %
=
express.static(),
$
HTTP
HTTPS,
httpRedirect:
2
function httpRedirect(request,response, next) {
redirect. / if (!request.secure) {
,
console.log("
$ http $
$ https");
"
response.redirect('https://' + request.hostname + request.url);
HTTPS,
, - } else {
- next(); //
$ % # express.static()
HTTPS. 3 " }
HTTPS
- }
express.static():
* ,
. // :
$
http.createServer(server).listen(8080); // $
HTTP,
// HTTP
HTTPS. #
HTTPS https.createServer(options, server).listen(443); //
// $ HTTPS
443:
418 Глава 8
7
"
GPS ,
,
-
,
-
: %
-
? #
,
GPS,
.
$,
, ,
,
-
%
-
$
,
.
Как узнать местонахождение (почти) чего угодно? 419
. ;
, $
,
, -
. 4
,
$
-
,
%
-
,
HTTP,
HTTPS.
"
-
>
HTTPS
. &
-
TLS13.
-
,
, —
, "
" ,
,
-
%
-
,
! (
.
. 8.11).
HTTPS.
~
"
-
>
# ,
!- , %
-
#
HTTPS,
%
$
,
, #
- , Symantec, Comodo,
. >
- GoDaddy GlobalSign. +
. Z
-
-
,
- $ .
. &
,
, -
, Internet Security Research
IP-
,
Group14
-
. #
- Let’s Encrypt,
-
,
. 0
Electronic Frontier
%
" - Foundation
-
,
.
(certbot.eff.org)
-
,
-
Let’s Encrypt. 4
%
-
HTTPS, $
. #" , %
,
,
%
,
.
"
,
.
13 14
TLS, Transport Layer Security —
" q
+
.
.
420 Глава 8
Крен (roll)
Продольное
смещение
(surge)
Рыскание (yaw)
Тангаж (pitch)
Вертикальное смещение
(heave) Боковое смещение
(sway)
Как узнать местонахождение (почти) чего угодно? 421
2 ,
" ,
,
-
—
,
. /
,
. \
"
-
"
. &
,
"
-
%
" -
. 3
. +
,
Arduino 101
-
,
-
,
.
"
, $
-
I2C. &
$ ,
, -
"
,
2 g,
$
-
-
15
0 . Inertial Measurement Unit, IMU.
% .
,
16
0 . Attitude and Heading Reference System, AHRS —
.
"
-
17
0 . Magnetism, Angular Rate and Gravity, MARG.
-
18
0 . 6-Degree Of Freedom sensor, 6-DOF. 250
,
422 Глава 8
%
-
- X,
-
.
.
3
"
X
*
, (
)
%
Y.
.
"
$ - [
,
" -
%
,
—
. ,
-
. = $
-
%
. *
,
-
-
-
"
— -
2 g
% 16
216,
-
, $ - –32 768 32 767. 2,
,
.
–2 g +2 g,
"
:
;,
$_/32,768 = /2.0
,
,
, — $
- :
. ;
-
= $_ * 2.0 / 32,768
% -
2
-
(
. 8.13).
-
.
(),
% -
Z, *
$
-
X Y
, -
. 4
-
,
, —
,
Z
,
.
- : .
"
Y ( )
Рис. 8.13. Оси трехмерного датчика. Показания его акселерометра будут такими, как здесь показано
Проект 19
Определение направления с помощью цифрового компаса
Магнитометры, которые также называются цифровыми компасами, измеряют изменения в маг-
нитном поле Земли, точно так же, как это делают обычные компасы. При этом, как и обычные
компасы, цифровые компасы подвержены помехам от внешних магнитных полей, включая поля,
генерируемые мощной электрической индукцией. Поэтому направление с помощью цифрового
компаса можно определить, если вы находитесь в пространстве, в котором нет слишком силь-
ных магнитных помех.
& $
ST Microelectronics LSM303. Требуемые компоненты
7
-
>
, 1 %.
Adafruit, SparkFun Polulu. *
. 8.13
7 Arduino, 1 %.
9-DOF Adafruit,
- +
: % I2C.
. 7 -
Z
LSM303DLH -
- ST Microelectronics, 1 %.
, 4 %.
I2C. = LSM303 $
"
–32,768
,
"
- 32,767,
-
.
+/– 1,3
.
5 5
10 10
20 20
SDA SCL
Модуль Модуль компаса
X Y Z
LRDY
LIN2
LIN1 микроконтроллера GND LSM303DLH
GRDY
25 GINT 25 3Vo
SDA
SCL
+Vcc Vin
9 DOF
GND
3Vo Общий
30 VIN 30
A B C D E F G H I J
424 Глава 8
5 &
- = LSM303
-
. *
" : ,
-
Polulu —
.
? Vin — "
5 &. # - =
$
5 &
- I2C
Wire. '
-
;
$ ,
-
? GND — " (« »). # $
D | >
GND
-
| N
, -
;
%
" A
? SCL —
-
LSM303,
. # $
LSM303 by Polulu
SCL
; N . X
,
-
.
(
),
• <
(SCL) — , -
(SDA)22,
. *
"
-
;
.
• <
= (SDA) — ,
-
(
.
,
-
)
&
,
"
I2C, -
I2C. 3
"
% ,
"
(
$ .
!
,
)
I2C
- > Wire
-
. &
SPI,
-
% I2C
Arduino
I2C
.
. >%
-
,
,
I2C,
,
-
Wire.
,
. & I2C
,
Arduino %
-
;
,
I2C
Arduino SCL
% (%)
- SDA.
( "
)
( )
:
22
SDA, Serial Data —
.
Проект 20
Определение положения в пространстве
Курс по компасу — это прекрасный способ определить направление, если вы находитесь на зем-
ной поверхности. Но направление представляет собой лишь одно из условий нахождения пра-
вильного положения объекта в пространстве. Кроме направления, надо также знать, где верх,
а где низ, — чтобы определить тангаж и крен. И здесь нам помогут акселерометры — устрой-
ства, измеряющие линейное ускорение, и гироскопы, измеряющие угловую скорость вращения.
Таким образом, в этом проекте мы научимся определять положение объекта в пространстве,
используя акселерометры и гироскопы.
3
-
Требуемые компоненты
. &
-
>
%
-
%
,
-
, 1 %.
"
.
7 Arduino, 1 %.
-
,
/-
$
, 1 %. .
& $
2
,
-
LSM303 L3Gxx ST Microelectronics
. #
, -
Arduino 101,
"
,
,
.
. +
-
$
, 6–8 %. ("
,
-
% ).
. 0,
Как узнать местонахождение (почти) чего угодно? 427
,
, & $
-
,
-
. 3
-
/
$
-
"
-
,
- . 7
,
, . .
,
,
" -
.
,
# -
7 (Sebastian Madgwick),
3
%
, $
Processing
-
-
$
.
. =
- &
"
2 g —
-
$ . >%
. &
$ -
,
"
-
/
LSM303
, —
- (
"
-
,
)
L3G ST
3–6 g. *
Microelectronics. 7 LSM303
% — - $
Arduino, -
, (
)
. 8.14. 3
Arduino 101
100 g!
/
-
Bosch BM160 ( $
).
#include "CurieIMU.h"
#
-
, void setup() {
Arduino 101. Serial.begin(9600); // ' $
> CurieIMU
CurieIMU.begin(); // \#$ #-
,
" // $
- // $ $
+/-2 g
CurieIMU.setAccelerometerRange(2);
,
-
// $ $
+/- 250 /
g,
, CurieIMU.setGyroRange(250);
- }
(/
). =
- void loop() {
( | float x, y, z; //
-
// $
$
428 Глава 8
| " A
) - float gx, gy, gz; //
-
// $
$
Intel Curie Boards by Intel, // Z $
CurieIMU.readAccelerometerScaled(x, y, z);
(D | >
CurieIMU.readGyroScaled(gx, gy, gz);
| N
- Serial.print("x: "); // + R $
) CurieIMU. // X
Serial.print(x);
,
,
Serial.print(",\ty: "); // + R $ ',
/
// #' $ Y
, Serial.print(y);
Serial.print(",\tz: "); // + R $ ',
%
- // #' $ Z
Serial.print(z);
:
Serial.print("\tgx: "); // + R $ ',
// #' $ X
Serial.print(gx);
Serial.print(",\tgy: "); // + R $ ',
// #' $ Y
Serial.print(gy);
Serial.print(",\tgz: "); // + R $ ',
// #' $ Z
Serial.println(gz);
}
,
' , "
. = $ -
- */
%
// Z' ' $ -
loop()
" // ' , " - -
// % # setup().
:
void loop() {
// Z' -
% #
int orientation = readOrientation(x, y, z);
Serial.println(orientation);
}
;
int result = -1; // $
-
int absX = abs(x); //
. /
int absY = abs(y);
x, y z
- int absZ = abs(z);
g,
" // N
,
int bigger = max(absX, absY);
int biggest = max(bigger, absZ);
. =
if (biggest == absX) { // *
, -
g. if (x > 0) { //
!
result = 1;
2
} else { //
" ,
result = 2;
}
-
}
:
, , ,
,
. & , if (biggest == absY) { // * Y
- if (y > 0) { //
!
y
- result = 3;
. } else {
result = 4; //
// y
/
- }
- }
-
, %
if (biggest == absZ) { // * Z
- if (z > 0) {
result = 5; //
!
z
. 0
-
} else {
"
result = 6; //
z
: }
}
int readOrientation(float x, return result;
float y, float z) { }
Как узнать местонахождение (почти) чего угодно? 431
,
. ; , Z
,
X
. 0
-
.
$ Y
Сила тяжести
-
Freescale Θ
Semiconductor,
-
PDF
: http://cache.freescale.com/
Рис. 8.15. Вычисление составляющих силы тяжести на основе
files/sensors/doc/app_note/AN3461.pdf. &
угла
,
" .
" 0 2ª
translate(position, position, position);
"
-
Рис. 8.16. Вывод скетча Processing для отображения положе-
, $
"
ния акселерометра методом Мадгвика
$
"
(
. 8.16).
~
-
" ,
. 8.16,
%
,
. +,
"
,
$
" .
" -
Madgwick
$
.
"
, $
%
-
,
%
Как узнать местонахождение (почти) чего угодно? 435
$
-
Processing. &
$
Processing
2 ,
,
-
%
.
"
.
7
, 7-
;
"
.
"
Z.
7
% , &
,
-
, —
LSM303,
" -
,
-
,
Заключение
Начиная разрабатывать проекты, которые используют системы определения местоположения,
мы обычно обнаруживаем, что меньше означает больше. Довольно часто бывает так, что мы на-
чинаем разработку проекта, полагая, будто нам нужно знать местоположение, расстояние и на-
правление, а потом — по мере углубления в проект — выясняется, что физические ограничения
создаваемых объектов и пространства, в которых они создаются, решают за нас многие пробле-
мы и дают возможность проект упростить.
&
$
. *
ИДЕНТИФИКАЦИЯ
В предыдущих главах мы предположили, что идентичность равнознач-
на адресу. Зная адрес устройства в сети, мы уже могли с ним взаимо-
действовать. Но представьте себе, какими непредсказуемыми были бы
последствия, если бы мы использовали этот подход в повседневной
жизни, — например, сняли трубку телефона, набрали номер и просто
начали говорить. А что, если мы набрали неправильный номер? А если
ответит кто-либо другой, а не тот, кого мы ожидаем услышать?
«Нюхач» — игрушка для детей с проблемами зрения от Сары Йогансон (Sara Johansson)
&
RFID.
RFID,
, .
9
#
,
«0"
»
-
0
,
; 3
(Timo Arnal)
7
#
(Mosse Sjaastad). 0
& 1.
438 Глава 9
Коды поставщиков
? A — Arduino Store, http://store.arduino.cc ? J — Jameco, http://jameco.com
? AF — Adafruit, http://adafruit.com ? P — Pololu, www.pololu.com
? AMZ — Amazon, www.amazon.com ? PX — Parallax, www.parallax.com
? B — Belkin, www.belkin.com ? RS — RS, www.rs-online.com
? D — Digi-Key, www.digikey.com ? SF — SparkFun, www.sparkfun.com
? F — Farnell, www.farnell.com ? SS — Seeed Studio, www.seeedstudio.com
? ID — Identiv, www.identiveusa.com
Рис. 9.1. Новые компоненты для проектов этой главы: 1. Шилд NFC PN532 компании Seeed Studio. 2. Адаптерная плата PN532
компании Adafruit. 3. Считыватель NFC-меток SCL3711 USB компании Identiv. 4. USB-камера (если ваш компьютер не осна-
щен встроенной веб-камерой). 5. Розетка WeMo компании Belkin. 6. Объекты разных цветов. 7. Соленоидный замок. 8. Набор
QR-кодов. 9. Метки RFID Classic компании Mifare
1
2
4
7
Идентификация 439
'
"3
6 , $
-
12 +. =
. NFC-
DFRobot,
"
X3
D: 36-9300-ND
%
-
, 1 +. 7
AVR.
-
8 9 5. AF: 364, D: 1528-1781-ND, SS: 113030001
"
RFID Classic
Mifare, 2 +.
Arduino MKR1000, 1 +.
AF: 359 360, SF: SEN-10128 SEN-11319,
AF: 3156, RS: 124-0657, A ABX00004, GBX00011
SS: 113990013
(3
4#), D: 1659-1005-ND.
( WeMo
Belkin, 2 +.
&
ESP8266. B: P-F7C027
SF: WRL-13231, AF: 2471
>.
" NFC-
PN532, 1 +. X
-
]=
=
-
%
-
SPI, I2C UART (X3). * -
.
"
.
Физическая идентификация
Процесс идентификации физических объектов является столь существенной частью нашего жиз-
ненного опыта, что мы редко отдаем себе отчет в том, как мы это делаем. Конечно же, мы полага-
емся в этом на наши органы чувств: смотрим на объекты, ощупываем, поднимаем и встряхиваем
их, прислушиваемся к ним, нюхаем и пробуем их на вкус и так до тех пор, пока мы не сориентиру-
емся в том, что они собой представляют, после чего навешиваем на них соответствующие ярлы-
ки. Весь этот процесс опирается на очень сложные функциональные способности наших мозга
и тела, и любой, кто когда-либо пробовал заниматься компьютерным зрением или искусствен-
ным интеллектом вообще, может сказать вам, что научить компьютер распознавать физические
объекты — задача далеко не из легких. Так же, как сужение человеком поля поиска какого-либо
предмета облегчает задачу определения его местоположения, задача распознавания объектов
посредством компьютеров облегчается, если мы можем ограничить область активного поиска,
а также тем или иным способом пометить важные объекты.
7
,
- ,
$
,
%
. & ,
-
, — $ -
. 0
,
, - , $
. = - ,
- . #
-
!
,
(RFID1).
%
#"
- "
,
:
. +
,
"
%
. 9
-
,
"
. RFID
—
.
#
, -
,
. 0
%
.
%
*
, , ;,
-
. 2
. & $ %
-
, $
-
RFID. *
%
-
RFID
. ;, #3
,
-
; + (Tom Igoe),
,
. & *-
,
,
. $,
-
,
,
,
—
,
"
-
, -
—
, :
; +,
[
$. '
,
1
RFID, Radio Frequency Identification.
%
442 Глава 9
.
, %
,
- $
. 3 CMYK4
, ,
-
. .
,
,
,
-
,
. 9
. *
. 9.2
-
RFID
:
-
% —
.
, - #
"
-
-
"
% . 3
, % $ ,
.
$
"
, #
" $
-
-
,
RFID $ -
,
-
. +
, ,
-
.
. &
"
-
#
,
,
"
.
$
: «+ , !», -
,
,
% ?
-
" . &
—
-
.
—
-
,
,
— , ,
"
—
%
QR5.
. ;,
, RGB2 HSV3
2 4
RGB, Red-Green-Blue —
, ,
. CMYK, Cyan-Magenta-Yellow-blacK — ,
-
3
HSV, Hue-Saturation-Value — ,
"
, , ,
.
5
. QR, Quick Response —
.
Идентификация 443
#
= $
,
— , -
p5.js.
$
-
-
,
HTTPS.
. 2
$ -
&
-
,
"
https-
"
.
server.js
18 (
. !. «&!
HTTPS» 8). * , 9
$
(
) $
. $
.
-
,
-
.
,
" ,
-
Распознавание цветов . *
9
—
-
" -
,
, $
"
,
. # " $
-
"
.
.
Рис. 9.2. Пример распознавания цветов. Простое отслеживание цветов дает наилучшие результаты, когда распознаются
цвета, резко отличающиеся от фона, на котором они представлены
444 Глава 9
Проект 21
Распознавание цветов с помощью веб-камеры
Скетч p5.js из этого проекта захватывает изображение с подключенной к компьютеру видеока-
меры, ищет в нем пикселы определенного цвета и помечает их на копии изображения, которую
выводит на экран.
0
- HTML
$
-
%
.
$
. =
- =
,
p5.js,
" - -
. # -
, ,
Требуемые компоненты
%
$
,
"
-
-
. . &
-
0
. % — % $-
.
Пишем код
*%
CameraProjects.
p5.js: index.html, sketch.js,
=
libraries,
" p5.js.
public,
18. 2
- & $
public
p5.js
- sketch.js,
"
colorTracking. & colorTracking
public
, .
0
sketch.js - /*
- # ' % # HTML5
setup()
- : p5.js
.
^ R %.
*/
video
$
API var video; // " $-
, trackColor —
- var trackColor = [255,0,0]; //
#
var differenceThreshold = 10; //
$
, differenceThreshold — // $ #
var dSlider; //
$ $
, dSlider —
-
:
& setup()
- function setup() {
, - video = createCapture(VIDEO); // M
video //
=
//
% #' dist() $#
$ . 9
- // #
, var difference = dist(r1, g1, b1, r2, g2, b2);
" // $ # -
,
// $ $# #
,
if (difference < differenceThreshold) {
stroke(0); //
#
, -
point(x, y); // Z $#
.
}
&
,
}
- }
differenceThreshold. 4
% ,
-
. #
,
,
:
446 Глава 9
2 $
// + %# $ R
- fill(255);
text("
#: " + trackColor, 10, height-60);
text("
$ $#: " + differenceThreshold,
. /
% - 10, height-40);
draw(): } // # % # draw()
Рис. 9.3. Распознавание цвета скетчем на p5.js. Пороговое значение равно (слева направо): 10, 32 и 47. Чем выше пороговое
значение, тем больше он показывает совпадений пикселов нецелевого цвета
?
,
DayGlo6,
- TAOS TCS34725,
-
"
Adafruit.
,
/
,
$
, -
$ ;
, ,
-
?
,
.
, —
, -
" . Распознавание форм и образов
*
,
%
2
-
35--
(
"
-
),
,
,
. /
. '
,
,
-
. ;
.
%
,
« »
;
. &
, «» -
?
% - , — $
$.
,
,
. `
-
,
-
.
.
«» -
—
,
-
-
— $
% -
. 0
. Texas Advanced
"
,
-
Optoelectronic Solutions (www.taosinc.com) ,
6
,
#
. . Day + Glow —
(
,
,
),
"
"
" .
, $ .
448 Глава 9
%
" , " %
Interval Research,
!
-
. %
"
-
!
Dallas
"
,
" Semiconductor.
"
,
' Z
,
.
" , & %
,
, -
,
.
,
"
. 0
>%
,
. '
-
%
, >%
-
,
"
- , $
" :
,
,
.
,
& !
%
. 4
,
,
(
!
-
-
)
- ,
"
, ! ,
-
!
. 4
-
" .
,
#
-
,
#
,
-
.
. ] ,
Обнаружение лиц
4
,
-
, -
Проект 22
Обнаружение лиц с помощью веб-камеры
Теперь, когда мы располагаем основными сведениями в области оптического обнаружения объ-
ектов, настало время попробовать определение простых образов. В этом проекте мы воспользу-
емся методами обнаружения лиц для нахождения лица в захваченном камерой изображении.
=
JavaScript
"
,
$ Требуемые компоненты
%
"
-
. *
-
.
,
"
, -
_.
"
. &
,
-
,
,
build
. 0
libraries
faceRecogntion. /
,
"
tracking.
,
- js tracking-min.js, data,
-
,
- "
,
. > tracking.js
.
"
-
: 2
index.html
face-
Recognition
<script>
?
;
" :
? ;
?
. <script src="libraries/tracking-min.
js"></script>
# "
<script src="libraries/data/face-min.
.
,
js"></script>
.
=
=
public
eye-min.js mouth-
CameraProjects
min.js. #
$ ,
, -
faceRecognition. #
$ -
sketch.js
,
p5.js.
" .
2
-
https://trackingjs.
com
tracking.js,
-
Пишем код
,
setup()
- $
ObjectTracker tracking
.
" setInitialScale(),
2
- setStepSize() setEdgesDensity()
canvas
tracker $ -
. &
$
-
. 7 -
. setup()
$
, -
"
. =
$ .
450 Глава 9
- /*
$ # ' tracking.js
,
- : P5.js
- */
-
var canvas; //
-
.
var tracker; //
R$ tracking
- var video = createCapture(VIDEO); // M
: //
а б
в г
- Распознавание штрихкодов
. 3
% — " , _%
, —
" :
— $
-
(
. 9.4, ), , ,
- ,
-
.
-
.
%
,
> tracking.js
-
-
,
%
,
.
-
. #
"
452 Глава 9
,
%
-
,
. 9.5,
.
,
-
%
.
,
%
" ,
- #"
%
,
"
. # -
,
-
,
,
-
,
.
-
,
"
,
. *
. 9.6
.
%
—
QR. /
`
*
-
%
UPC7
,
%
. &
,
. &
,
,
"
-
%
-
— ,
-
,
%
-
,
. *
,
#3 WeChat. &
"
POSTNET p5.js
QR
-
. #
" JavaScript.
EAN8 JAN9
%
UPC
- Рис. 9.5. Одномерный штрихкод (здесь приведен штрихкод
"
. ISBN10 этой книги11)
-
%
,
, -
$
%
%
, 9 789781 680458
, POSTNET
"
EAN. / ,
%
- Рис. 9.6. Двумерная метка штрихкода (QR-кода, если быть
,
- более точным) с ограничивающими пометками по углам. Эти
пометки игнорируются обработчиками изображения, но по-
, - могают пользователям центрировать метку для более каче-
7
UPS, Universal Product Code —
-
.
8
EAN, European Article Numbering —
-
10
. ISBN, International Standard Book Number — -
9
JAN, Japanese Article Numbering —
.
11
. +
.
Идентификация 453
Проект «Backslash»12 от Педро Оливейра (Pedro Oliveira) и Суеди Чен (Xuedi Chen)
9
«Backslash»
-
. *
,
-
,
QR-,
"
"
, —
. =
www.backslah.cc.
0
+ +
(Roy Rochlin)
Проект 23
Распознавание двумерных штрихкодов с помощью
веб-камеры
В этом проекте мы с помощью онлайнового генератора QR-кодов сгенерируем несколько дву-
мерных штрихкодов, а затем расшифруем их, используя камеру и браузер. Когда наш скетч за-
работает должным образом, в качестве домашнего задания вы можете расшифровать рисунки
этой книги, содержащие коды QR.
QR-
Требуемые компоненты
"
, -
. #
"
-
.
-
QR.
"
%
"
-
, $
12
Backslash —
«
».
454 Глава 9
Пишем код
q
$- /*
$
QR $ $
HTML5
: p5.js
qrReader -
*/
JSON
. *
- var video; // " $-
var message; // Z QR
%
% - var qrReader; // $ QR
QR, var config = { // % #
" QR
: sucessCallback: getMessage, // +$
// QR
errorCallback: onError, // +$
// QR
videoSelector: ‘video’, // \ -
stopOnRead: false //
//
}
$
-
. ; -
,
%
.
, -
/
,
-
%
"
, - .
,
%. / %
0
"
, -
— %
. & -
"
"
%
-
. &
, $ %
%
,
%
,
,
-
. * $
-
"- $
. 4
-
%
,
QR. %
, ,
*
%
% - $
.
,
X%
%
-
,
,
-
-
,
. *
-
$,
-
%,
" . & $ %
-
,
. 2
RFID NFC
-
-
—
"
- QR
%
.
(
.
. 9.6).
$
-
,
-
456 Глава 9
,
"
RFID:
. #
, %
-
. 4
RFID
RFID
-
$
(
. 9.7).
% . >
>
%
,
,
-
,
.
-
/ $
-
%
—
- $
.
Рис. 9.7. Фотография электромагнитного поля считывателя RFID, снятая Тимо Арналом (Timo Arnall), демонстрирует радиус
действия и форму электромагнитного поля типичного пассивного считывателя RFID. Как можно видеть, это всего лишь не-
сколько сантиметров
Идентификация 457
&
RFID
-
, $ . 0
-
,
- ,
RFID
-
-
. 3
-
,
. 3 $
%
,
,
RFID
%. *
-
. 4
. &
,
, — $ , -
$
.
, ,
, -
RFID. X
. 9.8, RFID -
E-ZPass13
: -
RFID,
, ,
,
,
.
,
.
,
7
, -
%-
RFID
,
,
13
-
E-ZPass —
$
,
%
.
-
,
-
#3,
,
RFID
% #
%
,
-
+
.
$
"
, —
Рис. 9.8. Все эти предметы различных цветов и форм оснащены метками RFID. Фотография Тимо Арнала. Дополнительную инфор-
мацию по исследованиям Тимо Арнала и его коллег в области дизайна RFID можно найти на веб-сайте www.elasticspace.com
458 Глава 9
,
" -
. >
. / ,
,
, RFID
,
, "
. '
-
%
,
.
-
,
. *
Имплантация капсул RFID
.
>%
RFID
*
. 9.9
NFC,
-
( )
-
.
.
,
. $ - Пояснение
-
• NDEF (NFC Data Exchange Format) —
-
RFID. * $
-
% ,
.
$
. 3
RFID,
• SNEP (Simple NDEF Exchange Protocol) —
RFID- .
NDEF.
"
. *
, ID Innovations
RFID. 0 $
-
,
—
125 q
. . /
- ,
-
EM Microelectronics
EM4001.
—
: I-Code, Mifare Mifare # $
-
UL Philips, Tag-IT HF Picotag Parallax. #
Texas Instruments, SR176 ID Innovations
"
ST Microelectronics
. #
, -
-
, -
SparkFun. ~ $
14
ISO, International Standards Organization.
,
Идентификация 459
"
-
(
. ;
%
" ) — -
% ,
,
NFC. 134,2 q,
.
$,
,
,
-
, $
Ближняя бесконтактная связь (NFC)
,
. #
ISO 14443
>
? +
, "
? 2
-
"
, -
%
. *
-
.
,
? 4
%,
,
$
-
"
-
. 0
-
.
ISO 14443
,
,
-
"
-
,
" ,
, -
NFC,
Рис. 9.9. Стек протоколов NFC. Эта схема должна дать вам представление о множестве разных протоколов, лежащих в основе
типичного приложения RFID или NFC. Стеки протоколов позволяют достичь определенного уровня взаимодействия продук-
тов разных производителей, а разработчикам приложений нужно беспокоиться только о работе своих приложений с верх-
ними уровнями стека. Схема выполнена на основе материала из книги «Beginning NFC» («NFC для начинающих») Тома Иго,
Дона Коулмана (Don Coleman) и Брайана Джепсона (Brian Jepson), издательство O’Reilly, 2014 г.
%
"
RFID. /
- NFC -
,
-
$
.
RFID,
-
&
"
,
NFC. *
,
RFID.
$
—
" , Identiv, Adafruit Seeed Studio. 0 %
NFC
% ,
.
NFC
NFC. >
-
NDEF
,
NFC -
,
-
«Beginning NFC» («NFC
(URL)
. *
, - "») ; +, = (Don
NFC
URL, - Coleman) >
=
(Brian Jepson),
,
,
"
-
O’Reilly, 2014 .
Проект 24
Чтение меток RFID
В этом проекте мы установим программные средства для управления считывателями NFC и про-
читаем несколько меток RFID, чтобы получить представление о работе считывателей. Кроме того,
мы считаем с метки уникальный идентификационный номер и посмотрим, с какого расстояния
он может быть считан. Это хорошая отправная точка для любого проекта, оснащаемого возмож-
ностями RFID и NFC.
~
NFC, -
, $
Требуемые компоненты
RFID. $
-
#
-
SCL3711 USB Smart
NFC, Card Reader Identiv.
%
-
7 RFID Classic Mifare.
0
Raspberry Pi.
. +
,
-
RFID, "
NFC.
NFC,
-
RFID-
Mifare Classic Mifare
USB. 0
-
Ultralight Philips, %
-
,
" -
"
,
-
USB, —
-
ISO 14443.
Philips
, Raspberry Pi. '
NFC,
-
Raspberry Pi,
" -
Mifare
-
,
-
. $
NFC. %
$
"
-
Raspberry Pi
#
-
SCL3711
RFID NFC. &
,
$
Identiv
RFID
-
,
Mifare Classic,
,
"
.
Идентификация 461
GPIO
USB 2x
USB 2x
SCL3711 NFC reader
DSI (DISPLAY)
http://www.raspberrypi.org
CSI (CAMERA)
Audio
HDMI
ETHERNET
Power Рис. 9.10. Подключение считывателя NFC SCL3711
компании Identiv к Raspberry Pi
libnfc libfreefare - ? mifare-desfire-access;
? mifare-desfire-create-ndef;
,
-
,
? mifare-desfire-ev1-configure-ats;
. =
$
? mifare-desfire-ev1-configure-default-key;
: ? mifare-desfire-ev1-configure-random-uid;
? nfc-anticol; ? mifare-desfire-format;
? nfc-dep-initiator; ? mifare-desfire-info;
? nfc-dep-target; ? mifare-desfire-read-ndef;
? nfc-emulate-forum-tag2; ? mifare-desfire-write-ndef;
? nfc-emulate-forum-tag4; ? mifare-ultralight-info.
? nfc-emulate-tag; '
- $
,
? nfc-emulate-uid;
,
"
? nfc-list; -h. *
:
? nfc-mfclassic;
$ nfc-mfclassic -h
? nfc-mfsetuid;
? nfc-mfultralight;
Чтение меток
? nfc-poll;
+
,
-
? nfc-read-forum-tag3;
libnfc libfreefare,
-
? nfc-relay;
RFID
? nfc-relay-picc; NFC
Mifare. =
,
$
-
? nfc-scan-device; nfc-poll:
? mifare-classic-format; $ nfc-poll
? mifare-classic-read-ndef; #
-
? mifare-classic-write-ndef; " :
Идентификация 463
nfc-poll uses libnfc libnfc-1.7.1-150- Формат NDEF
gbf31594
NFC reader: SCM Micro / SCL3711-NFC&RW *
RFID,
opened
NFC device will poll during 30000 ms $
—
(20 pollings of 300 ms for 5 modulations)
. *
NFC
%
2
,
-
.
-
UID. / -
"
" :
" %
NFC —
NDEF. #
NDEF
RFID NFC -
ISO/IEC 14443A (106 kbps) target:
"
:
ATQA (SENS_RES): 00 44
UID (NFCID1): 04 8e 41 62 b7 20 80 ? RFID —
SAK (SEL_RES): 08 UID;
nfc_initiator_target_is_present:
Target Released ? NFC —
-
(#_#_nfc__: % ;
$ #' ) ? NDEF —
"
Waiting for card removing...done. NFC
.
....
[
NDEF -
*
UID — $
"
,
(Unique ID)
SD
RFID %
. =
- %
. ~
RFID — $
,
-
. ,
&
RFID UID - %
Проект 25
Чтение и запись сообщений NDEF
Здесь мы познакомимся с ближней бесконтактной связью (NFC) и форматом NDEF обмена дан-
ными для нее и станем с помощью сценариев на node.js записывать и считывать данные с меток.
Для этого нам понадобятся сценарии для записи и считывания меток, которые будут работать
с интерфейсом командной строки.
#
-
Требуемые компоненты Raspberry Pi
#
-
SCL3711 USB Smart ndefReadWrite. # $ -
Card Reader Identiv.
writeNdef.js. * ,
7 RFID Classic Mifare.
npm
-
ndef mifare-classic:
0
Raspberry Pi.
$ npm install ndef mifare-classic
,
node.
js
- &
"
%
NDEF Mifare Classis,
" NDEF,
"
-
Записываем метку
&
/*
ndef mifare-classic
NDEF
: node.js
*/
" NDEF. /
var ndef = require('ndef'); // \ ndef
" : var mifare = require('mifare-classic'); // \
// mifare-classic
var ndefMsg = new Array(); // & -
// NDEF
=
var textRecord = ndef.textRecord("+ R ");
URI " var uriRecord = ndef.uriRecord("http://www.example.com");
" . 2 ndefMsg.push(textRecord); // ' $
- ndefMsg.push(uriRecord); // $ URI
,
- var bytes = ndef.encodeMessage(ndefMsg);
//
$
" ndef.
encodeMessage():
#
function writeResponse(error){ // #
Response() // - # $
mifare.write(),
if (error) { // $,
console.log(": " + error); // $
" . /
-
} else { // + -
-
// #
%
% console.log("Z $ ");
" . }
}
* ,
"
mifare.write()
- //
" : mifare.write(bytes, writeResponse);
&
NDEF
NDEF file is 38 bytes long.
" . #
(
NDEF 38
.)
Found Mifare Classic 1k with UID 0a64ef28.
,
( Mifare Classic UID 0a64ef28.
- Tag written successfully
;
.
= $
ndefRead.js -
ndefReadWrite
" .
466 Глава 9
Считываем метку
/
, /*
" ,
NDEF
: : node.js
*/
#
,
-
, : ( 232–1 ). +
"
-
" -
$ node readNdef.js
-
$ IP-
.
"
" : &
-
,
Here's a string
. *
,
(+ R )
-
-
http://www.example.com
Android,
-
Mifare Classic,
Использование записей NDEF
-
,
"
-
. 7 -
,
-
-
# ,
. &
NDEF - %
.
Идентификация 467
;
,
"
, -
node.js
$
,
-
" NDEF, %
Arduino.
Проект 26
NFC и бытовая автоматизация
В нашем с напарником офисе находятся десятки потребляющих электроэнергию устройств: не-
сколько компьютеров, два монитора, четыре или пять ламп освещения, несколько жестких дис-
ков, паяльник, хабы сети Ethernet, динамики и т. п. Даже в наше отсутствие эти устройства по-
требляют много электроэнергии. Какие устройства включены в определенный момент времени,
зависит от того, кто из нас находится в офисе, и что мы делаем. Этот проект представляет собой
систему, направленную на уменьшение энергопотребления нашего офиса, особенно когда нас
в нем нет. Когда мы заходим в офис, нам достаточно дотронуться брелком с NFC-меткой на коль-
це для ключей до панели возле двери, и система включит устройства, которые мы обычно ис-
пользуем. Каждый из нас имеет соответствующий брелок, а под панелью смонтирован модуль со
считывателем NFC, который считывает поднесенные к нему метки.
# NFC
-
,
Wi- Требуемые компоненты
Fi
$
-
>
, 1 %.
.
Arduino MKR1000 WINC1500, 1 %.
WeMo (
) &
Belkin,
$
-
ESP8266.
. &
+
:
-
,
, -
SPI I2C, Wi-Fi.
$ .
7 NFC-
PN532, 1 %.
q
-
7 RFID Mifare Classic, 2 %.
Микроконтроллер
Модуль WeMo
Беспроводной
канал Wi-Fi передачи
сообщений HTTP
Модуль WeMo
468 Глава 9
. 9.12
Adafruit *
,
,
SPI. ;
"
-
- SOAP,
%
.
: ,
*
. HTTP,
" SOAP -
,
-
Протоколы связи ArduinoHttpClient. $
*
" - 4.
NDEF,
"
:
15
&
,
? ;
, "
?
WeMo,
$ .
16
; uPnP, Universal Plug & Play —
-
PnP,
-
? IP-
WeMo. $
$
$
" -
,
(
, , , "
,
HTTP -
),
.
" 17
SOAP, Simple Object Access Protocol —
-
WeMo.
.
Идентификация 469
Vcc
Общий («земля») К +U 5V
Общий («земля»)
220 Ом 220 Ом
Примечание
& $
NFC
SPI. 7
SPI
-
Wi-Fi. % SPI
-
,
-
. MKR1000 -
7
Wi-Fi, $ A B C D E F G H I J
1 1
NFC 11. 0
, $
10 —
Arduino Uno.
- 5 5
,
-
I2C. +
$
.
$
- 10 10
"
.
15 15
POWER
GND
P35
P34
P33
P32
P31
P30
AUX2
AUX1
SIGIN
SIGOUT
RSTPD_N
20 20
SCK
MISO
MOSI/SDA/TX
25 25
SSEL/SCL/RX
RSTOUT_N
SPI OFF ON R1 30
5.0V 30
I2C ON OFF C15 OFF OFF A B C D E F G H I J
GND
5.0V
RXD
TXD
NC
NC
SEL0 SEL1
ON ON
FTDICABLE
Рис. 9.12. Принципиальная (вверху) и монтажная (внизу) схемы подключения микроконтроллера к модулю считывателя NFC.
Здесь показана микроконтроллерная плата MKR1000. Для других микроконтроллерных плат, возможно, потребуется исполь-
зовать другие выводы. При этом необходимо, чтобы подключения интерфейса SPI совпадали. Также следует обеспечить под-
ключение шины «земли» на левой стороне макетной платы к общему выводу питания под модулем считывателя NFC
470 Глава 9
0
"
"
:
, HTML, "
NDEF
-
XML
, PN532
-
$ XML
. *
$
(Envelope) (Body)
" . &
-
" BinaryState
- 7
Arduino, $ -
1 0,
.
"
. 2
-
,
,
#"
POST, -
Arduino,
-
HTTP
:
D | >
-
| !
.ZIP
-
Content-type: text/xml; charset=utf-8
.
SOAPACTION: "urn:Belkin:service:basic = NDEF
event:1#SetBinaryState"
,
.
Connection: keep-alive 3 PN532
-
Content-Length: 230
: PN532_I2C,
PN532_SPI PN532_HSU (
-
=
HTTP
-
SPI).
-
%
\ |
ArduinoHttpClient.
. &
, $
-
=
WeMo
%
NDEF.
URL-
: /upnp/control/basiceventl.
7
$
%
=
Arduino
HTTP. X
WeMo
" NDEF RFID, -
49153.
.
Установка библиотек
= $
-
: NDEF Arduino
-
Считываем метку
#
- /*
,
, -
NDEF Arduino
: Arduino
*/
" NDEF. ;
,
, - #include <SPI.h> //
' SPI
472 Глава 9
*
- PN532_SPI pn532spi(SPI, 11); // \#$
- NfcAdapter nfc = NfcAdapter(pn532spi);
:
, const int tagLed = 5; // +
// #
,
const int wifiLed = 4; //
" //
Wi-Fi
Wi-Fi, $
WiFiClient netSocket; // C
Wi-Fi,
,
- const int port = 49153; //
,
- String route = "/upnp/control/basicevent1"; // $ API
WeMo, boolean wemoStates[] = {0, 0}; // 9
WeMo
, IP-
String username = ""; //
" WeMo. String wemoAddress = ""; //
WeMo
, int wemoNumber = -1; //
WeMo
SOAP // 9 SOAP
. =
String soap = "<?xml version=\"1.0\" encoding=\"utf-8\"?> \
,
<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\" \
, s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\"> \
<s:Body> \
<u:SetBinaryState xmlns:u=\"urn:Belkin:service:basicevent:1\"> \
(\)
:
<BinaryState>1</BinaryState></u:SetBinaryState></s:Body> \
</s:Envelope>";
474 Глава 9
//
:
"
- IPAddress ip = WiFi.localIP();
: Serial.print("IP-
: ");
Serial.println(ip);
}
=
%
void loop() {
loop() // ... %
setup()
, % Serial.println(payloadString); // +
// payloadString R
. &
% -
copyRecords(r, payloadString);
- } // # # for $
copyRecords() (
- } // # if tag.hasMessage()
) } // # if tag.Present()
digitalWrite(tagLed, LOW); // M$,
"
//
" - if (WiFi.status() == WL_CONNECTED) { // `
. 4"
- //
Wi-Fi
digitalWrite(wifiLed, HIGH);
} else {
Wi-Fi digitalWrite(wifiLed, HIGH);
"
- }
- delay(3000); // $'
}
Wi-Fi:
=
void copyRecords(int recordNum, String recordString) {
copyRecords(), switch (recordNum) { // N
!
// -
setup(). [
- case 0: // %
;
- break;
- case 1: // %
WeMo; $
"
//
" wemoNumber = recordString.toInt();
break;
.
- case 2: // % IP-
; N
,
wemoAddress = recordString; // *
IP-
,
IP-
,
wemoRequest(wemoNumber, wemoAddress); //
wemoRequest()(
- //
), break;
POST: } // 7
case
}
Идентификация 475
0
wemoRe- void wemoRequest( int thisWemo, String wemo) {
quest(),
if (wemoStates[thisWemo] == 0) { // * WeMo
,
soap.replace(">0<", ">1<"); //
case 2. [
-
} else { //
soap.replace(">1<", ">0<"); //
WeMo,
}
SOAP
- wemoStates[thisWemo] = !wemoStates[thisWemo]; //
"
,
//
wemoState !
, —
- & , WeMo
.
,
HTTP. /
,
#
% $
— - WeMo
,
, —
-
— " ,
,
. + -
(
. 9.13). /
% %
- loop()
"
.
%
. &
-
,
"
,
,
-
Рис. 9.13. При установке считывателя на двери пользова-
тель вынужден убрать метку после того, как он проведет ее
-
по считывателю. Таким образом решается проблема невоз-
,
.
можности считывания больше чем одной метки за раз
Конструкция
$
- -
5. > ,
%-
, %
%
.
,
—
,
$ -
. 9
Adafruit,
"
-
, ,
-
, $
,
-
. 9.12. *
. 9.14 9.15
,
. 9.13
.
Рис. 9.14. Корпус проекта считывателя NFC в процессе
сборки. Требуется, чтобы антенна считывателя находилась
в верхней части корпуса, что вызывает необходимость двух- Рис. 9.15. Корпус проекта считывателя NFC в развернутом
уровневой конструкции с размещением микроконтроллера виде. Модуль считывателя и светодиоды подключены к ми-
на нижнем уровне. Этого можно достичь, используя стойки кроконтроллерной плате с помощью монтажных проводов
разной высоты и прямоугольных штыревых разъемов
Идентификация 477
% . 4
HTTPS
,
"
,
-
$ ,
%
(
)
? 4
, %
"
%
,
-
. ;
.
-
.
Применяйте двухфакторную
9 $
"
.
аутентификацию #
:
=
,
. =
HTTPS $ $ -
,
478 Глава 9
(
,
). 4
%
"
"
%
" , — -
,
%
. 4
-
,
"
" , , —
"
-
, %
" - ,
,
-
. _ %
-
. #
"
%
- -
,
"
HTTPS,
-
"
, -
,
%
,
,
. *
,
%
"
%
- ,
$
"
, "
-
.
. #
-
,
, 3
" $
,
-
% %
" , ,
"
-
%
%
. %
,
%
" .
7
%
-
'
!. «:
» 3,
,
-
%
aes-256-cbc
,
-
— %
. 0
"
%
. #
%-
%
"
-
,
-
" , ,
. /
%
%
.
Проект 27
Двухфакторная идентификация с использованием NFC
В этом проекте мы создадим систему двухфакторной аутентификации на основе Raspberry Pi
и метки NFC. Эту систему можно использовать в любом случае, когда требуется двухфакторная
аутентификация, но в здесь мы применим ее для открытия замка.
9
— -
)
, -
—
$
(%
NFC,
-
),
%
%
—
. 9
-
.
"
. '
, -
-
,
-
,
-
node.js,
NFC %
,
-
,
$
.
— "
#
-
%
. =
%
%
.
.
&
0 %
"
,
-
,
,
(%
%
.
Идентификация 479
3
,
%
Требуемые компоненты
"
-
#
-
SCL3711 USB Smart
. /
- Card Reader Identiv.
-
7 RFID Classic Mifare.
,
%
,
0
Raspberry Pi.
. /
;
TIP120.
, -
-
9
1 0.
.
# .
,
+
HTTPS,
- 12 &.
18 (
. !. «&! -
9
HTTPS» 8)
-
5,5 % — 2,1 .
$ ,
-
* % .
. 3
"
%
.
Особенности кода
$
- +,
$ -
NFC NDEF,
-
https-server.js
-
26,
https-server-
Raspberry Pi. #
- writer.js,
— https-server-reader.js. ;
,
,
-
SSL. =
"
node.
NDEF,
-
js. +
JavaScript —
NDEF,
-
express ndef
— GPIO.
,
,
. -
,
p5.js.
,
,
public
-
ndefSignature. 9 %
-
p5.js
: reader
,
- writer. 2
"
,
—
- npm
" :
. /
,
$ npm install express body-parser
. *
ndef mifare-classic onoff
,
$
. # "
: writeNdefSigna-
ture.js, readNdefSignature.js gpioControl.js.
, , ,
-
,
-
.
%
-
480 Глава 9
. 7
-
. *
-
$
SSL
keys
"
, %
- openssl
"
:
;
.
Рис. 9.16. Монтажная (внизу) и принципиальная (вверху) схемы подключения считывателя NFC SCL3711 компании Identiv
к Raspberry Pi через транзистор TIP120. Рабочее напряжение соленоида 12 В при токе 1 А, поэтому ему требуется отдельный
источник питания постоянного тока напряжением 12 В и достаточной мощности. «Минус» (контакт «земля») этого источника пи-
тания нужно подключить к контакту «земля» платы Raspberry Pi. Но ни в коем случае не подключайте к Raspberry Pi напряжение
+12 В, поскольку это безвозвратно повредит компьютер
К плюсу
источника питания 12 В
Контакты
ввода/вывода (GPIO)
платы Raspberry Pi Соленоидный
замок
TIP120
1 кОм
GPIO 18 1N4004
1 5 10 15 20
A
B
C
D
E
TIP120
F
G
H
I
J
1 5 10 15 20
GPIO
USB 2x
USB 2x
http://www.raspberrypi.org
CSI (CAMERA)
Audio
HDMI
ETHERNET
Power
Идентификация 481
-
,
gpio-
Control.js
Raspberry Pi. /
- 3.3V Power Питание 5 В
/ " GPIO 2 (SDA) Питание 5 В
(GPIO),
$ onoff GPIO 3 (SCL) «Земля»
node.js. GPIO 4 (GPCLK0) GPIO 14 (TX)
Ground GPIO 15 (RX)
GPIO Raspberry Pi (
. 9.17) GPIO 17 GPIO 18 (PWM0)
"
- GPIO 27 «Земля»
Arduino —
- GPIO 22 GPIO 23
,
: 3.3V Power GPIO 24
(
- GPIO 10 (MOSI) «Земля»
X3),
SPI I2C, GPIO 9 (MISO) GPIO 25
+7.
, Raspberry Pi GPIO 11 (SCLK) GPIO 8 (CE0)
" . Ground GPIO 7 (CE1)
9
- GPIO 0 (ID_SD) GPIO 1 (ID_SC)
3,3 &,
5- GPIO 5 «Земля»
. > onoff,
GPIO 6 GPIO 12 (PWM0)
"
(
- GPIO 13 (PWM1) «Земля»
: https://github.com/
GPIO 19 (MISO) GPIO 16
fivdi/onoff),
-
GPIO 26 GPIO 20 (MOSI)
$
Ground GPIO 21 (SCLK)
,
$ ,
(
).
,
var lock = new Gpio(18, 'out'); // %
- //
lock. +
$
,
-
:
&
, function close() {
, lock.writeSync(0); //
$
lock
//
}
1,
-
— 0. / - function open() {
open() lock.writeSync(1); //
close()
. & - //
open() setTimeout(close, 2000); // + $ 2
close()
// $ $
2
, - }
:
0
if
- // , -
-o
- if (process.argv[2] === '-o') {
open();
}
-
open(). /
-
%
:
— // % # R #
. 2
// $ #
$
- module.exports = {
$
close: close,
. +
$ open: open
, };
HTTPS:
X %
;
,
gpio-
18,
- Control.js,
-
$ , %
-
NDEF.
Модули Node.js
node.js
- '
,
. 7 $
"
node.js
require(), $ , -
$ ,
node.js .
$ -
. 9
- ,
-
, $ ,
,
requrie(). *
,
-
-
GPIO
-
.
,
$
"
7
- :
.
var lockControl = require('./gpioControl.js');
%, -
,
node-modules,
-
$ ,
%
-
. [
,
$
-
module.exports,
,
-
$
GPIO. &
. *
:
"
module.exports $ -
lockControl.open();
"
.
&
, - &
"
-
module.exports,
-
$
.
.
=
var privKey = fs.readFileSync('keys/private.key'); // Z
//
'
var privateKey = privKey.toString(); //
$
, " %
- //
: var secret = null; //
%$,
//
%'
=
- // # $
%$
. ~ $ function setSecret(data) {
- secret = data;
var ndefRecord; // Z $ NDEF
%
var ndefMsg = new Array(); // & NDEF
NDEF
- if (signed === true) { // $ $%,
NFC. / // $%
NDEF var signer = crypto.createSign('RSA-SHA256'); // Z$
// %
25
signer.update(record); // $
%
. var signature = signer.sign(privateKey, 'hex');
[
"
- // %
,
ndefRecord = ndef.textRecord(signature); // Z$
" mi- // $ NDEF
else { // $ %
fare.write():
ndefRecord = ndef.textRecord(record); // Z$
// $% ' $ NDEF
}
# "
// , -
, " if (process.argv[2] != null) {
writeNdefSig- if (process.argv[2] === '-f') { //
// % -f,
nature.js,
" -
mifare.format(showResponse); // %
- } else { // +
. &
setSecret(process.argv[2]); // $
"
// ' %$
process.argv[]. 4
var response = setMessage(secret, true); // +
- // $% ' ' %$ NDEF
-f,
mifare.write(response, showResponse); //
// $
. 3
}
,
- }
%
,
-
" ,
" -
%
,
% :
$
- // % # R #
// $ #
"
module.exports = {
- format: mifare.format,
. 9
-
Mifare Classic
" :
$ node writeNdefSignature.js -f
#
" :
Found Mifare Classic 1k with UID 1e6f5ba5.
( Mifare Classic 1k UID 1e6f5ba5.)
Formatting 16 sectors [...4...8...12...16] done.
( 16 [...4...8...12...16] .)
success
M
,
. ;
%
.
= $
" :
$ node writeNdefSignature.js 'this is my secret phrase'
#
" :
NDEF file is 522 bytes long.
(
NDEF 522
.)
Found Mifare Classic 1k with UID 1e6f5ba5.
( Mifare Classic 1k UID 1e6f5ba5.)
success
M
#
%
(
) %
. 2 ,
" % , %
,
"
.
486 Глава 9
. // fs
var pubKey = fs.readFileSync('keys/public.key'); // Z
0 $
- //
'
, var publicKey = pubKey.toString(); //
$ '
//
.
, $
- var secret = null; // '
%$
-
%
" ,
-
-
:
// " JSON
data,
}
} else {
result = false; // Z
data ,
// $ $ false
}
return result;
}
%
-
,
,
,
%
:
'
,
NFC ,
-
"
"
,
" :
$ node readNdefSignature.js 'this is my secret phrase'
#
" :
Found Mifare Classic 1k with UID 1e6f5ba5.
( Mifare Classic 1k UID 1e6f5ba5.)
NFC Forum application contains a "NDEF Message TLV".
(
NFC Forum "Z TLV NDEF".)
true
()
,
- }
- }
.
, function processTag(request, response) {
, var command = request.path; // $
:
command = command.slice(1); // N
, % - //
, var data = JSON.stringify(request.body);// $
//
,
-
// $
. ' - response.writeHead(200, {"Content-Type": "text/html"});
-
, $ response.write('N
...<br>');
-
:
2
% pro- //
,
:
cessTag() : if (command === 'formatTag') {
.format() .write() — - tagWriter.format(finishResponse); // $
//
.
}
,
if (command === 'writeTag') {
— finish-
var message = tagWriter.setMessage(data, true);
Response() —
,
tagWriter.write(message, finishResponse);
. // $
}
2
}
"
NDEF, $
-
.setMessage()
" NDEF:
* ,
//
HTTP HTTPS, $ - http.createServer(server).listen(8080); // $ HTTP
"
, https.createServer(options, server).listen(443); //
// $ HTTPS
. server.post('/writeTag', processTag); // N
0
: writeTag //
writeTag
formatTag —
- server.post('/formatTag', processTag); // N
— //
formatTag
processTag(),
-
:
&
.
function setup() {
noCanvas(); // ^ , R -
formatButton, $ // Z$
$
- responseDiv = createDiv('+ $
. &
' %$ $ .');
- responseDiv.position(10, 130);
submit(), - var userLabel = createSpan('\ $'); // Z$
// $
" . userLabel.position(10, 10);
userField = createInput('','text'); // Z$
&
- // $
- userField.position(100, 10);
var challengeLabel = createSpan('
%$'); // Z$
, $ - //
%$
draw(): challengeLabel.position(10, 40);
challengeField = createInput('','password'); // Z$
//
%$
challengeField.position(100, 40);
var writeButton = createButton(' '); // Z$
// $
writeButton.position(10, 70);
writeButton.id('writeTag');
writeButton.touchEnded(submit);
var formatButton = createButton(' ') // Z$
// %
formatButton.position(10, 100);
formatButton.id('formatTag');
formatButton.touchEnded(submit);
}
&
. #
,
-
.
492 Глава 9
=
2
-
Raspberry Pi
:
- https://..raspberry.pi/writer.
:
$
..
$ sudo https-server-writer.js raspberry.pi
IP-
-
% Raspberry Pi. 0
,
-
https://
. &
Рис. 9.18. Веб-страница для приложения записи меток NDEF.
Сообщения сервера выводятся в текстовом разделе внизу
, -
страницы
. 9.18.
,
-
*/
writeNdefSignature.
js readNdef-
Signature.js gpioControl.js:
if (verified) {
response.write('
.<br>');
lockControl.open();
} else {
response.write('
#
.<br>');
}
}
response.end();
}
//
,
:
tagReader.setSecret(data);
tagReader.read(finishResponse); // $
}
&
.
. // $
%$
var responseDiv; //
$
,
- //
,
-
-
. 9 $
-
%
. q
:
[ setup()
function setup() {
, -
noCanvas(); // ^ , R -
//
,
%
,
// Z$
$
responseDiv responseDiv = createDiv('
..');
- responseDiv.position(10, 130);
/*
: Z' $ $ $
userfiled $ challengeField
%$
*/
Идентификация 495
0
- /*
-
Z' % #
submit() getResponse() $
-# $
*/
submit()
getResponse():
&
.
Сетевая идентификация
До сих пор мы идентифицировали сетевые устройства по их адресам. Для устройств Интернета
в качестве идентификаторов используются как IP-, так и MAC-адреса. Беспроводным устрой-
ствам, работающим по протоколам Bluetooth и 802.15.4, также присваиваются стандартные адре-
са. Но адрес устройства не предоставляет нам никакой информации о самом устройстве или его
функциях.
&
- . /
-
4. ;
,
-
HTTP,
" "
-
.
. &
,
API
,
, ,
.
- 3
-
,
$ -
, ,
.
$,
"
$ . =
-
HTTP
-
. * ,
,
-
.
, "
?
—
,
-
node.js,
HTTP, -
>%
+
%
-
, $
.
&
$
. &,
%
" :
" -
-
,
-
{ host: '114.226.112.201:8080',
"
,
connection: 'keep-alive', %
.
'cache-control': 'max-age=0',
'upgrade-insecure-requests': '1',
4
$
, -
'user-agent': 'Mozilla/5.0 (Macintosh;
Intel Mac OS X 10_12_3) "
%
,
AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/56.0.2924.87
, IP-
$
-
Safari/537.36', ,
, IP-
%
-
accept: 'text/html,application/
. /
,
%
xhtml+xml,application/
"
IP-
xml;q=0.9,image/webp,*/*;q=0.8', (
. 3),
%
-
'accept-encoding': 'gzip, deflate, sdch',
,
%
-
'accept-language': 'en-US,en;q=0.8' }
,
,
\ - : 114.226.112.201
%
-
IP- : ::ffff:206.175.85.178
%
.
, $
-
%
: IP-
-
,
,
"
, ,
,
-
. &,
- , ,
, ,
HTTP,
- . ~
%
! ;
,
-
-
, -
,
-
-
. / ,
. % +
%
, -
*
,
user-agent
-
.
-
%
. *
$ -
Анонимность в Интернете
: ,
- 2
-
—
"
( Chrome $
. =
: accept-language — "
, Firefox Safari —
,
, Microsoft Edge —
InPrivate).
. &
,
% -
3 IP-
,
"
IP-
,
IP-
,
. &
-
,
… 3
. …
*
$
- *
%
-
,
- . ~
"
+
Идентификация 499
,
-
clientHeaders.js
,
IP-
%
Tor. &
,
+
. %
"
+
+
$
4 Tor *-
Tor q,
(www.torproject.org) —
-
Tor [
,
, "
" Tor *
.
+
+ $ Tor *
. # Tor
-
. 3
-
+
-
nslookup (
. 4),
,
IP-
,
-
-
,
% %
,
.
Tor - .
-
-
0
" -
Tor,
"
Tor
. &
-
Tor, -
,
,
-
$ .
-
%
( !)
- Tor,
% -
-
,
-
. ; ,
-
Tor,
-
. ;
,
% %
%-
-
(
IP-
-
-
%
),
(
) "
Tor. *
,
- +
.
Проект 28
Геолокация по IP-адресу
В этом проекте IP-адрес клиента используется для определения географических широты и дол-
готы его местонахождения. Необходимая информация берется с сайта www.freegeoip.net, ко-
торый представляет собой общественный проект геолокации по IP-адресу. Полученные от этого
сайта результаты дадут вам определенное представление о том, насколько точным или неточ-
ным является геолокация по IP-адресу. Наш сценарий также использует параметр user-agent
запроса HTTP для соответствующего форматирования ответа для разных клиентов.
& -
www.freegeoip.net
-
. `
API,
"
- $
,
IP-
IP-
. =
-
"
:
:
http://freegeoip.net/ <%>/<ip->. {"ip":"91.200.12.34","country_
code":"UA","country_
&
%
CSV, JSON
name":"Ukraine","region_
XML. =
ip- - code":"","region_name":"","city":"","zip_
IP-
" code":"","time_zone":"","latitude":50.
. &
45,"longitude":30.5233,"met
IP-
,
ro_code":0}
500 Глава 9
# "
Mozilla
,
IP-
, Foundation. /
. 4
Netscape —
-
-
,
&
. 4 "
-
,
Mozilla —
-
Google Maps,
,
"
.
NCSA Mosaic.
>
Firefox
Mozilla,
-
"
user-agent
$ Foundation
,
Mozilla/5.0. *
,
"
-
"
&
user-agent +
. #
,
Chrome
macOS:
"
-
:
, CSS
Mozilla/5.0 (Macintosh; U; Intel Mac
JavaScript —
OS X 10_5_8; en-US)
AppleWebKit/532.5 (KHTML, like Gecko) Mozilla/5.0
user-agent. +
Chrome/4.0.249.0
$
Safari/532.5
.
Пишем код
#
- /*
geoIP. Z, '
$#' IP-
X
express, : node.js
*/
"
-
. &
- var http = require('http'); //
' http
server.js
var express = require('express'); //
'
" . // express
var server = new express(); // Z$ R$
&
, , // express
server
express // Google Maps
node.js - var mapsAddress = 'https://www.google.com/maps/place/';
http,
//
freegeoip
var geoOptions = {
www.freegeoip.net. = host: 'freegeoip.net',
$
path: '/json/'
};
express
server,
www.freegeoip.
net , ,
Google Maps:
Идентификация 501
, $ // # $ GET
"
, function respond(request, response) {
$
- console.log("IP- : " + request.ip);
GET,
"
respond(). & $ -
IP-
-
HTTP
www.freegeoip.net,
:
& respond() function getIPAddress(geoResponse) {
http.request() var result = ''; // Z -
HTTP
- //
//
freegeoip
,
" -
geoResponse.on('data', collectData); //
,
server.listen(8080); //
// 8080
server.get('/', respond); // $ GET
-
:
" $
-
example.com IP-
:
Google Maps, IP-
$ curl example.com:8080
. *
"
—
, curl, #
-
(
. 3), " :
"
JSON.
- {"ip":"208.113.160.6","country_
, code":"US","country_name":"United
States","region_code":"CA","region_
name":"California","city":"Bre
a","zip_code":"92821","time_
zone":"America/Los_Angeles","latitud
e":33.9269,"longitude":-
117.8612,"metro_code":803}
*
,
Google Maps
-
% IP-
(
. 9.21).
"
"
-
,
Tor,
"
Tor,
-
%
.
-
, ,
-
%
.
IP-
. q HttpClient http(netSocket, server, 8080);
IP-
http.beginRequest(); // ^ $
- http.get(route); // $ GET
"
IP-
. * // $ user-agent
http.sendHeader("user-agent","arduino");
$
,
,
-
http.endRequest(); // $
" %
%
-
%
"
+
,
%
. > , 2
us-
,
- er-agent
-
,
- curl
. =
-
-
% . $
"
- Mozilla
user-agent:
,
: «7
IP-
. 0 $ curl -L -A 'Mozilla/5.0' example.
com:8080
-
»,
$ - [ -L curl
-
: «* , ! ; %
, - ,
-
" +
». "
user-
agent.
=
"
$
user-agent. +
user-agent
'
,
%
user-agent - ,
,
$ -
HTTP,
-
-
,
"
,
, -
,
,
-
user-agent. *
,
.
, %
-
Arduino
,
"
:
504 Глава 9
Заключение
В этой главе мы рассмотрели несколько примеров
сопоставления физической и сетевой идентифика-
ции. Граница между физической и сетевой иденти-
фикацией всегда порождает возможность путаницы
и недоразумений. Никакая система для перемеще-
ния информации через эту границу не обеспечивает
стопроцентной надежности. Определение идентич-
ности, возможностей и действий — это сложные за-
дачи, результаты решения которых предрасположе-
ны к ошибочной интерпретации. Так что, чем боль-
ше информации от людей вы включите в ситуацию
и чем больше прозрачности и помощи предостави-
те вовлеченным людям, тем лучшие результаты вы
получите.
0
-
"
, $ -
,
%
,
. & +
-
" -
"
,
$
% . & ,
,
-
$ -
,
.
,
. " ,
%
$
, -
,
. *
,
"
-
. *
,
- -
, -
" — $
. 9 % $
-
,
%
.
*
,
,
,
% % . $
-
,
.
Идентификация 505
Глава 10
ohai lion, how r u??? txt me l8r!!!1 (привет, лев, ты там как??? кинь мне потом смс-ку!!!)
/
SMS-. Groundlabs
-
«
» «2" »
$
" %
GPS/GSM
"
SMS
. Z $
-
—
"
"
, " ,
,
"
.
0
Groundlabs.
1
l8r — $
,
%
«later»
(
. — « , »). Z
—
«eight» [¬t]
«later». $
"
,
$
(
https://thequestion.ru/).
508 Глава 10
Коды поставщиков
? A — Arduino Store, http://store.arduino.cc ? J — Jameco, http://jameco.com
? AF — Adafruit, http://adafruit.com ? L — Less EMF, www.lessemf.com
? D — Digi-Key, www.digikey.com ? RS — RS, www.rs-online.com
? DL — D-Link, www.dlink.com ? SF — SparkFun, www.sparkfun.com
? F — Farnell, www.farnell.com ? SS — Seeed Studio, www.seeedstudio.com
Рис. 10.1. Новые компоненты для проектов этой главы: 1. Raspberry Pi Zero с камерой Pi в Pi-корпусе. 2. Блок розеток для быто-
вой электросети со шнуром достаточной длины. 3. Толстовка с капюшоном. 4. Переключатель PowerSwitch Tail. 5. Проводящая
ткань. 6. Сотовые модемы. 7. Пришиваемые к ткани кнопки. 8. Держатель батареек. 9. Оптоизолятор. 10. Датчик температуры
и влажности DHT11. 11. Реле переменного тока. 12. Адаптер USB MK20. 13. Плата Bluethooth BLE Nano. 14. Штыревые разъ-
емы. 15. Токопроводящие нитки. 16. Нитки для вышивания
5
4
15
11 12
13
16 6
14
8
7
1
10 9
Сети мобильной телефонной связи и физический мир 509
H ) +
-
%
>+ , 1 +.
2,5 A +
.
]
+
. =
AF: 400, SF: PRT-12693.
.
&
D
-
-
(IC-hook with pigtail). • Adafruit Fona 800.
SF: CAB-09741 CAB-00501 AF: 3147 (#3), AF: 2691 (4
)
!A
. • Adafruit Fona Feather
SF: DEV-10730 DEV-13883
PRT- AF: 3027
00338, AF: 1870 1871
654. 4
%
, • Seeed Studio Xadow GSM+BLE
— SF: DEV-11893 PRT-13851. SS: 102040005
(
270 , 1 +. • XBee Cellular
J: 691446, D: CF14JT270KCT-ND, RS: 845-7577 D: 602-1976-ND,
%
$
.
• Particle Electron Kit
AF: 603, SF: DEV-11791, L: 304
SF: WRL-14211 (#. . 3
/3
),
%
$ . SF: WRL-14212 (3
/3/4
)
AF: 1168, L: 1220
+
A
5 .
AF: 1126, SF: DEV-11347
- — -
,
«»
- . 0
Asterisk (www.asterisk.org),
-
,
-
%
-
Twilio (www.twilio.com), Google Voice
,
(www.voice.google.com), Skype (www.skype.
,
com)
.,
-
,
,
" -
+
. /
IP- .
Сети мобильной телефонной связи и физический мир 511
X
+
- " ,
-
%
%
,
-
. .,
,
"
-
-
. *
,
. $
$
SMS-%, "
" $
, - %
"
.
SMS,
" SMS,
" $
- 9
-
. # Google Voice
—
-
,
. +
$
-
"
-
,
, %
,
—
- :
"
,
-
. 0
- ?
;
,
"
, ?
$
;
,
-
?
;
. ? Bluetooth;
?
USB;
Компьютер у вас в кармане ?
;
#
—
- ?
;
—
?
GPS.
,
-
. ;
— *
$
-
iPhone 0# Android — $ ,
,
"
,
"
-
-
.
:
Wi-Fi
&
—
- Bluetooth — . &
" -
IP- ,
-
,
-
-
— $
%
+
: HTTP, $
, SSH,
,
- FTP . .
, -
% . >%
*
. 10.2
"
,
: -
,
,
,
"
+
.
GPS. +, ,
- +
. * , %.
$
-
— -
512 Глава 10
Контроллер Контроллер
базовой станции (КБС) базовой станции (КБС)
Телефонная
коммутируемая сеть
общего пользования
(ТКСОП)
Домашний
маршрутизатор
Поставщик услуг
Персональный компьютер
веб-хостинга
? +
,
" - 4
-
-
,
,
-
—
, %
-
,
-
? ,
,
. "
-
*
Bluetooth,
, USB
-
,
5,
- " SMS. 7
$ .
"
? X
—
—
-
- " . *
—
-
Bluetooth
,
USB? 4
$ ,
$
,
.
? 7
,
?
"
,
SMS $
, ""
-
?
, $
-
.
,
"
- Интерфейс на основе сообщений
. X ,
SMS или электронной почты
,
&
-
. 4
Wi-Fi?
-
?
Ethernet?
. 4
&
%
-
-
" Bluetooth
Wi-Fi?
,
-
, —
,
Интерфейсы на основе браузера
%-
4
" , —
-
,
-
" SMS $
. ;
$
$
+
,
" SMS
. ;
GPRS,
,
-
"
-
—
,
, $
"
" $
-
HTTP -
"
"
514 Глава 10
+
. Телефон как шлюз
"
$
, *
-
-
.
"
,
- +
-
, —
"
SMS $
.
. &
-
Голосовые интерфейсы
—
"
*
Bluetooth USB,
—
-
. =
. q
- $ ,
,
-
,
% -
,
-
.
% —
Asterisk Twilio.
Проект 29
Возвращение сетевого кота
Если в состав программного обеспечения вашего смартфона входит браузер, вам нет надобно-
сти знать, как его программировать, чтобы создать мобильное приложение. В этом проекте мы
создадим вариант проекта сетевого кота из главы 3. Но на этот раз мы воспользуемся новым про-
токолом — MQTT — и IP-камерой, для подключения которой к Интернету компьютер не нужен.
# , 1 %.
-
" ,
.
-
. . 2
"
-
,
-
2
(
).
,
-
.
Сети мобильной телефонной связи и физический мир 515
4
%
, #
,
%
— -
— $
.
. 9
_ Wi-Fi MKR1000
-
.
SPI.
=
%
- ,
220 &
,
-
—
-
- . > IP-
$
" -
,
%
,
Wi-FI, $
,
,
. *
, — $
Интернет
Подключение DSL
или кабельное
Wi-Fi Домашний
Камера
маршрутизатор
Wi-Fi
Цифровой Интерфейс
Датчик ввод SPI Радиомодуль
температуры Wi-Fi
Микроконтроллер
Цифровой
вывод
Реле
516 Глава 10
GET
index.html
Веб-клиент image.jpg
OK Поставщик услуг
index.html, веб-хостинга
image.jpg
Сервер HTTP
Публикация MQTT:
setPoint,
Подписка MQTT: все mode, update
Брокер MQTT
Публикация MQTT:
все
Микроконтроллер
Рис. 10.4. Блок-схема взаимодействия системы наблюдения за котом и управления кондиционером и собственно контрол-
лера управления кондиционером
= -
-
- Протокол MQTT
p5.js —
-
7
-
-
%
,
-
FTP
"-
(
-
-
. =
-
3),
"
-
IP-
. 0
,
"
. &
$
MKR1000
-
-
ESP8266. *
-
,
- 2
MQTT, Message Queue Telemetry Transport —
.
"
.
Сети мобильной телефонной связи и физический мир 517
X
"
" *
,
,
MQTT (http://mqtt.org)
-
" ,
-
,
$
-
,
. $
. #
MQTT
- " :
. =
- ? airConditioner/connected —
3,
#
4.
X
;
" ,
? airConditioner/update —
-
" . 0
-
"
-
" . /
, -
MQTT
.
5.
Схема системы
*
, $
%
(airConditioner)
, ;
,
"
-
airCondi-
,
tioner/
" :
.
-
? airConditioner/on —
:
. 10.5, —
. 10.6. &
,
;
, —
? airConditioner/mode —
: $
,
.
, ,
;
? airConditioner/temperature — " 9
% $
, -
;
.
%
, -
? airConditioner/setPoint —
,
-
,
-
,
. .
- (
. 10.7). 0"
-
"
. 10.8.
/temperature, -
" /setPoint, 0
$
-
, -
,
.
" /mode, - 0
.
,
"
, $
.
$
,
-
,
. 0
-
,
$
. ;
-
"
""
-
. *
-
MQTT
. $
. X
3
0 . topics.
" % ,
4
0 . messages.
-
5
0 . Publish & Subscribe, PubSub.
5 &.
518 Глава 10
«Плюс»
питающего тока
Модуль
«Плюс» микроконтроллера
питающего тока 10 КОм
Выходной
сигнал D4
Датчик
температуры N.C. D5
DHT11 Общий
Общий
100 Ом
Управляющий В электросеть
сигнал Э Реле
Общий (Эмиттер)
К
(Коллектор)
Оптоизолятор
Розетка
для кондиционера
Рис. 10.5. Принципиальная схема системы удаленного управления кондиционером
A B C D E F G H I J
1 1
5 5
LOAD
Gnd Cntl. 5V
10 10
15 15
20 20
25 25
30 30
A B C D E F G H I J
Сети мобильной телефонной связи и физический мир 519
9
$
, $ —
$
—
,
-
. 4
,
,
PowerSwitch Tail
-
240 & (www.powerswitchtail.com),
Adafruit
SparkFun.
, $
WeMo, -
9.
*
,
-
SparkFun
-
%
-
PowerSwitch Tail. &
, ,
-
- Рис. 10.7. Контакты платы реле подключены к разрыву в
'
-
$
,
-
%
-
"
. 0
%
-
(
)
. 3
(
,
)
. ;
,
-
+5 &, $
-
. 3
-
« »
-
$
.
520 Глава 10
,
-
. _%
-
. = $
$
-
.
$
D1
-
,
«7» (Blink) 1 —
-
Управляем реле
X %
,
- /*
MQTT #
, : Arduino
*/
(
, #include <DHT.h> //
' DHT
,
boolean deviceIsOn = false; // 9
%
). &
, int temperature = 0; // C
int lastTemperature = 0; // $
. ; //
, int setPoint = 18; // $
"
, int mode = 3; //
!
—
,
,
//
(1, 2, 3)
setup()
boolean deviceConnected = false; //
: //
const int sensorPin = 4; // ^
//
const int relayPin = 5; //
//
: pinMode(relayPin, OUTPUT); // 7
//
//
!
& loop()
, }
, void loop() {
"
temperature = dht.readTemperature(); // Z
". 4
, // $
$
" - if (abs(temperature - lastTemperature) > 0) { // $
,
//
,
-
Serial.print("C
. C
: ");
"
Serial.println(temperature);
"
. }
lastTemperature = temperature; // 9
" //
: , - if (mode == 3) { //
!
,
. & - checkThermostat();
}
digitalWrite(relayPin, deviceIsOn); //
//
. delay(2000);
*
, }
-
deviceIsOn.
9
" ,
,
loop() -
2000
:
522 Глава 10
}
}
- if (setPoint > temperature) {
. 4
% , if (deviceIsOn) {
- deviceIsOn = false; //
$
- —
. X
%
,
,
,
,
-
-
.
MQTT.
$ $
- = -
(
)
- MQTT Arduino. 7
Подключаемся к сети
, - /*
MQTT MQTT #
Arduino. 7
- : Arduino
*/
Arduino
-
,
-
#include <DHT.h> //
' DHT
MQTT #include <SPI.h> // $
SPI
=$ q
#include <WiFi101.h> // $
WiFi101
(MQTT by Joel Gaehwiler). X
- //#include <ESP8266WiFi.h> //
ESP8266
$
//
#
Arduino
- #include <MQTTClient.h> // $
MQTT
" 7
. Client
4
#include "config.h" // $
$ , - WiFiClient netSocket; //
MQTTClient client; //
MQTT
: https://
char serverAddress[] = "192.168.0.15"; //
MQTT.
github.com/256dpi/arduino-mqtt. // `!
# IP-
,
//
+,
- boolean deviceIsOn = false;
// ... ' $ $
(
-
%
):
//
:
IPAddress ip = WiFi.localIP();
Serial.print("IP-
: ");
Serial.println(ip);
//
// $
dht.begin();
temperature = dht.readTemperature();
;
// $
$
- if (property == "update" && payload == "all") {
/ " , publishAll();
4
//
— ,
,
on setPoint,
- //
!
// (
)
-
deviceIsOn = true;
-
client.publish("airConditioner/on", String(deviceIsOn));
"
. [ loop() break;
mode case 3: //
!
, - checkThermostat(); // $
checkThermo- break;
stat(). }
}
/
%
mes- } // 7
messageReceived()
sageReceived()
:
526 Глава 10
$PATH. = $
»)
:
.
$sudo nano /etc/paths
4
, "
-
%
,
-
: /usr/local/sbin/
,
,
, -
.
Сети мобильной телефонной связи и физический мир 527
Mosquitto,
- port 1883
"
" : listener 8888
protocol websockets
New client connected from 192.168.0.14 password_file mq-pwds
as airConditioner (c1, k60, usomeone)
log_type all
(
'
192.168.0.14
airConditioner (c1, k60, usomeone) allow_anonymous false
2
%
"
: ,
. *
-
—
Mosquitto
%
$ kill _#
1883,
, -
_#
netstat:
,
%.
$ sudo netstat -atnp
&
"
"
Mosquitto
2
" :
-
1461.
"
(-a),
TCP (-t), IP-
(-n)
0
(-p). &
-
,
-
" :
Создаем веб-сервер
*% -
/*
Z - %
. X
, - : node.js
*/
,
" npm -
express,
var express = require('express'); //
'
httpServer.js
// express
" : var server = express(); // Z$ " server,
// $ express
Сети мобильной телефонной связи и физический мир 529
#
- server.listen(8080); // $ HTTP
"
- server.use('/',express.static('public')); // ,
// ' %
-
,
-
MQTT.
Выполняем разметку
= -
- <script src="libraries/p5.js"></script>
— mqqt.js, - <script src="libraries/p5.dom.js"></script>
: <script src="libraries/p5.sound.js"></script>
<script src="libraries/mqtt.min.js"></script>
https://unpkg.com/mqtt@2.5.0/
<script src="sketch.js"></script>
dist/mqtt.min.js. #
-
libraries
p5.js, -
index.html, -
<head> -
%
-
. 0
:
Создаем веб-клиент
&
- /*
+-%
mqtt #
-
: p5.js
, */
Arduino.
clientOptions
- var clientOptions = { //
MQTT
port: 8888,
host: self.location.hostname, // IP- -
MQTT. +
// '
,
username: 'webClient', // \ $ MQTT
: password: '_mqtt', //
MQTT
};
device
var device = { // Z
- on: false,
temperature: 24,
,
- setPoint: 18,
: mode: 1,
connected: false,
name: 'airConditioner'
;
};
$
-
- var client; // mqtt
. var webConnected = false; // Z '
2
- var img; // \$ $ -
$
var timeStamp; // $
timeStamp
var deviceStatus; // R #
HTML: img —
var connectButton, modeControl; // + "
, timeStamp —
// #
, deviceStatus —
,
connectButton —
,
:
530 Глава 10
- //
deviceStatus.position(10, 10);
%
connectButton = createButton('Connect'); // '
touchEnded(), - connectButton.position(10, 100);
- connectButton.touchEnded(connectMe);
setPointSlider = createSlider(10, 40, 21, 1); //
$
- // $ setPoint
. 3
setPointSlider.position(180, 100);
setPointSlider.touchEnded(changeSetpoint);
changed(),
- var sliderLabel = createSpan('Setpoint: ');
: sliderLabel.position(100,100);
modeControl = createRadio(); //
// '/'
modeControl.option('off', 1);
modeControl.option('on', 2);
modeControl.option('auto', 3);
modeControl.style('width', '65px');
modeControl.value(device.mode);
modeControl.position(220, 10);
modeControl.changed(changeMode);
timeStamp = createSpan(new Date()); //
// $
timeStamp.position(10, 160);
img = createImg('./image.jpg?');
img.position(10, 180);
}
&
//
$
// $
function changeSetpoint() {
-
update('setPoint', setPointSlider.value()); //
// $
update(),
}
, -
MQTT - //
'
function changeMode() {
:
update('mode', modeControl.value()); //
// $
}
Сети мобильной телефонной связи и физический мир 531
&
// connect button event handler:
connectMe() function connectMe() {
- if (!webConnected) { // '
-
MQTT. client = mqtt.connect(clientOptions); //
'
client.on('connect', announce); //
4
(
// '
if),
, client.on('message', readMessages); //
$ // -
mqtt.connect()
} else {
,
- client.end(quit); // '
. [ mqtt.connect() }
- }
announce(),
-
.
-
"
-
.
(
else)
-
client.end():
&
//
' "
announce() mqtt. function announce() {
connect()
connectButton.html(‘Disconnect’); //
// '
- webConnected = client.connected; //
-
- // '
updateInter- //
- #
face(),
for (property in device) {
. ; - client.subscribe(device.name + '/' + property); //
update() //
-
/update,
- }
updateInterface(); // %
$
-
update('update', 'all');
: }
[ update()
- //
--
- function update(property, value) {
device[property] = value; //
- var topic = String(property); //
$
" : // $ % # .publish()
var message = String(value);
if (webConnected) { //
'
client.publish(device.name + '/' + topic, message);
}
}
532 Глава 10
- // Z - MQTT
" ,
- function readMessages(topic, message) {
topic = topic.toString(); //
$
" ,
-
var strings = topic.split('/'); // $
" readMes- //
sages(). /
var origin = strings[0]; // \
, //
+, ,
- // # R $ %
updateInterface() function updateInterface() {
var onState; // Z ' #
if (device.on) { // ' (on === true)
$
,
onState = 'on'; // $ true 'on'
: } else {
onState = 'off'; //
$ false 'off'
&
. }
// , ' $
//
:
deviceStatus.html(device.name
+ '<br>' + onState
+ '<br>temperature: ' + device.temperature
+ '<br> thermostat setpoint: ' + device.setPoint);
setPointSlider.value(device.setPoint); //
// $ $
modeControl.value(device.mode); //
// '
}
;
-
mq-local.conf,
:
,
.
HTTP - . '
* %,
"
,
Mosquitto
,
:
HTTP:
#
- * $
"
-
,
-
%
"
-
.
,
Mosquitto. 2
%
Сети мобильной телефонной связи и физический мир 533
, , - 1490449948: airConditioner/on (QoS 0)
% <Ctrl>+<C>. 3
%
1490449948: airConditioner 0 airConditioner/on
Mosquitto
kill,
! «| - / , -
».
" . +
-
2
, - - , -
-
,
$
-
-
-
.
: http://.:8080 —
-
,
Mosquitto
"
-
Рис. 10.9. Фрагмент снимка с экрана результатов исполне-
Connect (
- ния скетча удаленного управления кондиционером, сделан-
,
. 10.9 - ный на смартфоне с ОС Android
Disconnect
).
&
-
"
":
Сетевые камеры
;
- "
,
-
, ,
-
"
. /
% -
. &
:
IP-
SFTP,
,
$
-
.
%
$
.
+-
- *
,
public -
. 2
%
,
-
$60
%
HTML
JavaScript
Wi-Fi,
- p5.js. &
.
$
$
— D-Link DCS-930L — -
.
%
$70. 0
, $
- IP-
,
Pi Cam Raspberry Pi. Raspberry
D-Link
.
Pi Zero W Pi Cam
,
,
%
,
$
FTP6 SFTP7. %
.
&
, $
- +
DCS-5222L DCS-960L
: www.rasp-
D-Link. berrypi.org/products. Adafruit
-
$
Pi Zero
*
- Camera Pack (www.adafruit.com/product/3414)
" .
Raspberry Pi Zero W,
,
,
Pi Cam
.
Ethernet
Raspberry Pi
. *
Pi Cam
$
Wi-Fi,
.
,
-
,
-
. IP-камера на Raspberry Pi
# IP-
Raspberry Pi
,
- $:
$
-
,
%
HTTP
-
FTP SFTP. # " — , $
$
3. 3
" - $
Raspberry
. ~
- Pi,
-
, -
.
,
6
FTP, File Transfer Protocol —
. 7
httpServer.js,
-
7
SFTP, Secure FTP —
FTP. "
% -
,
Сети мобильной телефонной связи и физический мир 535
" . /
- &
Interface Options | Camera
, $
.
$
3. Raspberry Pi piCam.sh
. #
, $ ,
2
Pi Cam Rasp-
-
berry Pi
, :
.
$ sudo raspi-config
$ %
,
- Z - public.
: node.js
multer,
- */
3:
var express = require('express'); //
'
$ npm install multer // express
var server = express(); // Z$ " server,
;
- // $ express
.
var multer = require('multer'); // $
!
$N
multer, //
// %
!
catServer.js 3. var imgStore = multer.diskStorage({
destination: __dirname + '/public/', // $
2
//
%
. filename: saveUpload // Q
//
=
});
" diskStor-
age() multer. &
-
, public
:
=
$ - //
,
multer
-
//
var upload = multer({storage: imgStore});
image (
- // %
:
image
).
- // (7
!
!
!
):
POST
var type = upload.single('image');
,
im-
age
:
&
// Q
//
POST -
function getUpload(request, response) {
,
//
#
- var fileInfo = JSON.stringify(request.file);
getUpload(): console.log(fileInfo);
response.end( fileInfo + '\n');
}
536 Глава 10
;
// Q
saveUpload(), function saveUpload(request, file, save) {
//
multer,
save(null,file.originalname);
- }
:
#
,
- +
" chmod
-
,
%
:
. 7 -
$ chmod u+x piCam.sh
-
-
7
" -
(
Raspberry Pi)
"
-
. [
-
HTML5.
"
:
$ ./piCam.sh
, $
+
"
- . +
-
30
.
"
,
-
-
, , , -
-
,
HTTP. 7
$
. 10.9. %
"
.
Сети мобильной телефонной связи и физический мир 537
Проект 30
Звоним термостату
Мы вложили в только что созданный проект много труда. К счастью, он не пропадет даром, и мы
воспользуемся его результатами в этом проекте. Оборудование для него будет то же самое, что и
для предыдущего, но мы внесем в программное обеспечение некоторые изменения, чтобы соз-
дать интерфейс, позволяющий нам позвонить термостату по телефону, прослушать голосовое
сообщение о температуре в квартире и статусе кондиционера, а также задать пороговое значе-
ние термостата с кнопочной панели телефона.
7
_
—
-
,
- Требуемые компоненты
, — ,
2
%
29.
-
.
X
Twilio.
«* $ ! —
. — *
-,
; .
%
-
?» & $
-
21-
.
—
,
,
" - $
-
.
SIP,
"
&
IP- -
%, :
"
- .
-
.
#
— Google 4
-
Voice Asterisk —
,
:
-
,
"
"
SIP. 0
-
(;#0)
+
. /
-
,
SIP8
,
- -
,
$ ,
,
-
. ;, SIP
"
.
,
- —
-
" ,
%
" - —
HTTP
. . +
SIP GET POST,
-
,
, - .
-
. 3
,
" ,
. 4
SIP
,
,
(,
,
.
: «= %! = %! `
, $
!» — $
),
-
8
SIP, Session Initiation Protocol —
%
,
.
.
538 Глава 10
& $
- &
-
SIP Twilio
,
"
,
-
: ,
" SMS
"
. Twilio
—
VoIP9 —
. *
,
$
, -
Twilio (
-
.
$
)
-
— Tropo, Google Voice -
. * $
-
,
"
,
- $
.
,
,
$
. #
-
* $
-
-
Twilio
"
:
SMS
-
. X,
- ?
-
?
%
,
: https://support.
twilio.com/hc/en-us/articles/223183068-Twilio- ?
?
international-phone-number-availability-and- ?
?
their-capabilities.
,
, ?
, -
?
;#0
"
-
+
, —
,
-
. / `
Twilio $
- -
TwiML,
$
,
Twilio
,
-
,
. 4
-
, — -
VoIP SIP,
, node.js:
"
«Asterisk: The Future of Telephony»10 - GET POST. # Twilio
-
O’Reilly,
: = & 7
node.js,
(Jim Van Meggelen), =
# (Jared Smith)
% ,
-
_ 7
(Leif Madsen).
$
.
Twilio -
%
. +
Каким стандартом пользоваться?
,
, —
-
,
SIP VoIP -
,
-
"
,
.
, , ,
-
0
$
" "
%
"
.
"
.
9
VoIP, Voice over IP —
IP-
,
,
,
- .
= $
-
10
«Asterisk. >" », https://www.ozon.ru/
-
www.twilio.com.
context/detail/id/4878006/.
,
Сети мобильной телефонной связи и физический мир 539
Twilio. - /
,
- %
% Twilio,
-
,
,
HTTP
IP-
"
.
, -
. ;
-
"
. ¥
. $
Phone Numbers, —
Verified Caller ID
,
*
(URL)
-
Twilio.
Arduino
"
.
*
,
IP-
%
= CONFIGURE WITH
-
63.118.45.189,
$
— Webhooks/TwiML.
http://63.118.45.189:8080/voice.xml. ;
,
"
Twilio
POST
Рис. 10.10. Панель управления Twilio. Введите адрес (URL) вашего сервера Arduino в поле A CALL COMES IN
540 Глава 10
Выполняем разметку
= $
- <?xml version="1.0" encoding="UTF-8"?>
<Response>
TwiML.
- <Gather numDigits="2" timeout="5" action="set-temp.xml"
, method="POST">
. <Say>
The current temperature is
#temperature
,
-
degrees Celsius.
,
[C
:
. #
#temperature
voice.xml public
.]
"
(
The thermostat is set to #setPoint degrees Celsius.
[C
#setPoint
.]
, - The air conditioner is set to #on.
%
- [K
!
—
.]
,
. / If you would like to change the thermostat,
%
, please enter a new setting.
%): [*
,
.]
, $
If you are satisfied, please hang up.
,
[*
,
.]
"
:
</Say>
#temperature, #setPoint #on.
</Gather>
#
, <Say>
$ HTML. You didn't give a new setting,
~ % (#) so the thermostat will remain at #setPoint degrees. Goodbye!
[
, #
&
TwiML — <?xml version="1.0" encoding="UTF-8"?>
set-temp.xml —
- <Response>
public ( <Say>
,
- The thermostat is now set to #setPoint degrees.
,
- [C
#setPoint .]
, The temperature is #temperature degrees.
[C
: #temperature .]
%
,
Thank you. Goodbye.
-
[ !]
). &, -
</Say>
, $
<Pause length="2"/>
,
<Hangup/>
<Gather>
. </Response>
+
, $
,
, -
:
542 Глава 10
3
-
-
" :
- . +
, -
Twilio,
% . & %
POST voice.xml. #
-
,
Twilio. # $
TwiML,
,
%
,
.
%
. 4
-
,
- =
,
"
-
<Gather>.
Twilio. &
,
:
&
-
POST XML, $
POST, $
,
set-temp.xml. #
,
MQTT,
MQTT
"
-
Twilio
XML, .
Модифицируем сервер
0
http- /*
Server.js
"
- Z - %
TwiML MQTT
, : node.js
*/
var express = require('express'); //
'
%
. &
// express
var server = express(); // Z$ " server,
fs (
- // $ express
) mqtt. 2 - var multer = require('multer'); //
// $ $ %
clientOpi-
var fs = require(‘fs’); // $
tons device,
//
- . *
- var mqtt = require('mqtt'); // $
, // MQTT Client
-
var clientOptions = { // $
MQTT
port: 1883,
localhost. /
- host: 'localhost',
,
node.js username: 'xmlClient',
MQTT
- password: 'something',
, keepalive: 10000
Mosquitto: };
&
function postFile(request, response) {
POST - var fileName = __dirname + '/public/' + request.path;
XML.
save- var data = fs.readFileSync(fileName);
Upload()
output = String(data);
POST for (property in device) {
var searchTerm = new RegExp('#'+ property, 'g');
var value = String(device[property]);
postFile()
-
output = output.replace(searchTerm, value);
$
. / }
- response.writeHead(200, {'Content-Type': 'text/xml'});
response.end(output);
output. 2
" - }
JavaScript
% (#)
device. 0
-
-
Twilio:
,
- function announce() {
for (property in device) {
client.subscribe(device.name + '/' + property);
MQTT
- // $
" . = $ }
- }
"
function readMessages(topic, message) {
announce() readMes- topic = topic.toString(); // $
sages() - : var strings = topic.split('/'); // K
//
&
server.listen(8080); // $ HTTP
POST server.use('/',express.static('public')); // ,
XML,
"
- // ' %
- server.post('/upload', type, getUpload); // %
//
/
%
.
544 Глава 10
&
,
-
,
-
, -
! ,
$
%
-
Twilio. #
, ,
. &
,
-
% . 4
-
, — $
,
% - TwiML
-
,
HTTP
-
.
POST
MQTT, -
2 ,
% . 2
.
,
"
%
-
API node.js,
MQTT - , - TwiML,
" -
.
%
,
-
.
? Sprint: phonenumber@messaging.sprintpcs.com;
phonenumber),
.
? Verizon: phonenumber@vtext.com;
,
$
? Bell Canada: phonenumber@txt.bellmobility.ca;
-
? Telenor Norway: phonenumber@mobilpost.no;
. [
-
? Telia Denmark: phonenumber@gsm1800.telia.dk;
E.164 +nnnnnnnnnnnnnnn. >
? Swisscom: phonenumber@bluewin.ch; n
,
12 15,
,
? T-Mobile Austria: phonenumber@sms.t-mobile.at; — $
. ; ,
? T-Mobile Germany: phonenumber@t-d1-sms.de;
, -
#3
-
? T-Mobile UK: phonenumber@t-mobile.uk.net.
$
.
$
-
%
.
number: '+15555555555' // ^ % Twilio
Twilio
- }
" SMS. /
% SMS
-
. # Защитите этот сценарий
TwilioSms, — : &
" $
%-
"
-
smsClient.js twilioCreds.js. [
%
. 4
twilioCreds.js
- -
-
,
"
,
-
API Twilio, .
-
. &
$
-
Twilio. #
"
(
-
%
):
546 Глава 10
[
" SMS
var message = { // SMS
—
"
- To: recipient,
: To (), From: creds.number,
From (0) Body (; ,
Body:'
!'
}
" ). ;
"
% //
$ $ HTTP
1600
. *
var postData = querystring.stringify(message);
-
E.164.
postData
"
:
HTTPS //
$ HTTPS
var options = {
HTTP,
. host: 'api.twilio.com',
# Twilio
auth: creds.apiKey + ':' + creds.auth,
port: 443,
-
path: '/2010-04-01/Accounts/' + creds.apiKey + '/
API Messages',
- method: 'POST',
headers: {
. ;
" 'Content-Type': 'application/x-www-form-urlencoded',
‘Content-Length’: postData.length
,
- }
querystring: };
,
HTTPS
- // # $ $
function confirm(response) {
"
var result = ''; // Z -
- function gather (data) { // response 'data' callback
confirm()
- // function
. / result += data;
% - }
: data function printResult () { // # $
end. 0
// end
, $ gath- console.log(result);
er()
$
}
Сети мобильной телефонной связи и физический мир 547
$
: // $ R
}
* ,
// $ HTTPS
HTTPS. ;
- var request = https.request(options, confirm); // ^
// $
, end() - request.write(postData); //
%
: request.end(); // $
#
Получение SMS через Twilio
" :
&
" SMS, -
$ node smsClient.js +15555555555 , . &
-
2 $
, -
-
%
,
, "
Twilio. ' , %
-
"
SMS. & Twilio
" . # smsServer.js
XML,
" SMS. =
-
«
!». ; , express body-parser. 0 $
,
:
Twilio
%
- $ npm install express body-parser
,
" SMS
2
Twilio,
Twilio - " All Products and Services
- (
. %
),
%
Programmable SMS
-
= XML
"
Create
" :
- New Messaging Service (#
,
,
(
-
" ).
,
. .)
.
Create. &
%
-
TwiML,
Twilio
-
PROCESS INBOUND
API REST,
- MESSAGES (
"
" -
%
" - ), REQUEST URL
,
(URL)
-
,
-
%
.
,
: http://.-
..
:8080/sms. * -
~ %
Save. 2
Numbers
, $
,
-
-
Twilio.
node.js,
-
%
. ;
;
-
SMS-
"
-
, -
Twilio. /
-
express
node.js
-
-
POST /sms
" SMS. TwiML.
548 Глава 10
HTTP, -
server.listen(8080); // $ HTTP
- server.use(bodyParser.urlencoded({extended: true}));
"
// $ $
POST
" SMS: server.post('/sms', getText); // $ /sms
0
,
-
-
"
"
,
. ;
,
$
,
$
"-
$
.
"
2G
GPRS
-
HTTP
"
. &
- $
. /
-
(2G)
,
" SMS.
"
2G
0
2G
-
. *
-
GSM13. ~
GSM
,
3G
LTE,
% .
. *
$
-
,
-
%
-
GPRS14,
" SMS,
-
2G.
(
-
* ,
-
3). &
-
, $
-
(3G)
UMTS15, ,
GSM.
$ -
.
$,
-
,
- , ,
,
-
, %
. /
. &
, %
-
EDGE16. &
«
»
(4G)
,
-
-
, IP- ,
-
% .
. &
,
, -
% -
"
,
"
+
,
2G,
13
GSM, Global System for Mobile Communications — -
, $
.
$
14
GPRS, General Packet Radio Service — "
SMS,
.
15
UMTS, Universal Mobile Telecommunications System —
-
. .
16
EDGE, Enhanced Data Rates for GSM Evolution — -
17
% GSM
. LTE, Long-Term Evolution —
.
550 Глава 10
Рис. 10.11. Сотовые модемы (слева направо): Fona 800 и Fona Feather компании Adafruit, Xadow GSM+BLE компании Seeed
Studio, Cellular компании XBee, Electron компании Particle. Обратите внимание на антенны на модулях Fona, Xadow и Electron,
которые нужны, чтобы обеспечить уверенный прием радиосигнала
.
20
7 Adafruit
-
IMEI, International Mobile Equipment Identifier — -
- Fona,
SIM80x
-
.
2G SIMTech,
Сети мобильной телефонной связи и физический мир 551
SIM5320
3G. &
Electron
"
SIM-
- «»
, Feather Fona -
MQTT,
"
M0.
$ .
Seeed Studion
GSM RePhone,
- +
%
SIM80x SIMTech. 7 Core
%
-
2G-AtmelSAMD21 RePhone,
Fona RePhone. &
-
Feather Fona,
- "
-
M0,
-
. AT SIM800,
0
%
Xadow
$ .
GSM + BLE
-
AT, SIMTech. * +
$
-
$
,
:
"-
"
.
$
. *
,
Libelium (www.libelium.com)
- SIM800
Cooking
. -
Hacks (www.cooking-hacks.com),
$
$
,
$ -
,
,
-
SIMTech. 7 Cooking
. =
Hacks
$ %
-
.
— ,
"
Digi
XBee
- -
(LiPo)
.
-
-
Рис. 10.12. Принципиальная (вверху) и монтажная (внизу) схемы подключения модуля сотового модема Fona800 к микро-
контроллерной плате Arduino 101
+3,3 В
Общий («земля»)
Reset
9 TX Модуль
8 RX SIM800
15 кОм Модуль
Светочувствительный микроконтроллера +3,3 В «Плюс» питающего тока
резистор
5
A4 4
Кнопка
10 кОм
Общий («земля»)
A B C D E F G H I J
1 1
5 5
Bat
GND
10 10
Key
+
5V
SPKR
-
ADC
PWR
Ant
Rst
PS
15 15
Key
+ -
Mic
2000mAh
RI Net
TX Buzzer
RX
PWM
NS
20 Vio
2.8V
20
25 25
30 30
A B C D E F G H I J
554 Глава 10
,
- 4
-
- ,
"
%
. SMS. '
" SMS, -
:
7
-
AT+CMGF-1 OK
:
AT+CMGS-"+15555556666" ( R
AT+CSQ %)
> .
0
:
*
" ,
+CSQ: 18, 99
% <Ctrl>+<Z> (ASCII 0x1A). 4
-
"
-
, ,
"
-
" .
" .
" SoftwareSerial sim800 = SoftwareSerial(sim800Tx, sim800Rx);
.
&
, - digitalWrite(sim800Reset, LOW); // +
delay(200);
digitalWrite(sim800Reset, HIGH);
,
delay(5000); // $
. 2
- while (!sim800.find("OK")) { // '
" OK OK, sim800.println("AT");
.find()
}
Stream. 4
- Serial.println("& GSM .");
}
"
,
"
,
"
false ():
=
- // SMS
" SMS
- int sendSMS(String phoneNumber, String message) {
sim800.println("AT+CMGF=1"); // %
sendSMS(). & $
if (!sim800.find("OK")) { // OK,
, return -2; // $
- }
. #
- sim800.print("AT+CMGS=\""); // ^
AT+CGMF=1 - //
OK. 2
sim800.print(phoneNumber); // %
sim800.println("\",145"); // %
AT+CGMS=
- // ($ # )
- if (!sim800.find(">")) { // >,
%
return -1; // $
>. ,
- }
, - sim800.print(message); //
"
sim800.write(0x1A); //
<Ctrl>+<Z>
// $ %
<Ctrl>+<Z>, - return 1; // +$ $ -
Отладочная программа
" /*
-
: Arduino
, -
*/
-
,
#include <SoftwareSerial.h>
, const int sim800Tx = 8; //
// TX RX SIM800
- const int sim800Rx = 9;
// Z$
-
// TX RX:
SoftwareSerial sim800 = SoftwareSerial(sim800Tx, sim800Rx);
,
. /
,
void setup() {
«"
!
Serial.begin(9600); // '
// ' $
Arduino
sim800.begin(9600); // '
USB/TTL-Serial» 2. ; // ' $
- }
Arduino
void loop() {
if (Serial.available()) { // Z
,
- //
sim800.write(Serial.read()); // -
. =
- //
$ - }
%
if (sim800.available()) { // Z
//
Feather Fona Serial.write(sim800.read()); // -
SIM800. ~
- //
, }
}
setup()
-
"
:
558 Глава 10
&
. &
, $ , —
,
$
,
,
% -
.
. *
-
Android Google iOS
Apple,
% - Платформа PhoneGap
. + Gartner 4
-
Group (www. gartner.com/newsroom/id/3609817)
,
,
JavaScript,
-
2016 Android
- PhoneGap (www.phonegap.
, com).
PhoneGap
-
81,6
,
-
iOS %
-
,
$
%
. 9 Android
HTML5 JavaScript. 9
$
35
,
2010 . ;
,
(
HTML5), -
-
,
-
(,
)
Android iOS.
,
-
%
-
=
. 9
iOS , , -
Apple ID
-
https://developer.apple.com.
: Java — Android, Swift —
>
iOS. / -
USB ($ ,
-
sideloading21), . 2
App Store. HTML, CSS JavaScript,
-
=
-
.
Android
$
-
21
.
> «
». =
iOS
USB, Bluetooth, Wi-Fi &
"
PhoneGap
-
,
- Adobe, Adobe
. =
0# Android $
Apache
APK
Android. Foundation
Open Source
Сети мобильной телефонной связи и физический мир 559
Cordova (http://cordova.apache.org). *
Apple, , ,
$
-
-
.
PhoneGap
-
iOS,
Cordova
Android. &
"
,
%
.
PhoneGap
-
PhoneGap p5.js. 3 -
,
PhoneGap
.
,
-
%
-
. &
, -
PhoneGap Build
Проект будет сложным!
(https://build.phonegap.com)
—
- /
,
HTML, -
. /
,
,
. ;
,
-
PhoneGap Build
-
:
$
-
PhoneGap,
SDK22 iOS
. 3
- Android, p5.js, —
,
PhoneGap Bluetooth LE
-
Desktop
$
.
- /
-
HTTP. &
- ,
,
-
-
— , $
.
node.js p5.js. 2
X
!
PhoneGap Desktop
"
"
-
PhoneGap Developer. &
%,
,
Build,
Установка набора средств
- разработки PhoneGap
"
Adobe,
-
*
PhoneGap
,
" PhoneGap
PhoneGap, -
Desktop PhoneGap Developer,
SDK Android iOS,
-
. '
-
.
,
"
PhoneGap
"
-
" -
npm
" :
. X
-
. $ npm install -g phonegap
X
PhoneGap,
SDK
p5.js
PhoneGap
-
(Android
- iOS),
-
Android iOS.
.
,
22
SDK, Software Development Kit —
iOS
-
0.
560 Глава 10
Набор средств разработки для iOS
Android Studio,
iOS
-
: https://developer.android.
iOS http://dl-ssl.google.com/android/repository /
Apple, tools_r25.2.3-linux.zip
-
https://
developer.apple.com. #
http://dl-ssl.google.com/android/repository/
Apple
tools_r25.2.3-macosx.zip
XCode.
X
Android Studio,
;
" : "
Configure
SDK Manager. &
%
SDK
$ npm install -g ios-deploy Manager
System Settings " -
Android SDK. 0
ADK. &
Примечание
"
Android
-
4
5.1 Lollipop,
-
node nvm n,
-
. X
Android
" :
, -
]
|
$sudo npm install -g ios- D
| D
(
)
deploy --unsafe-perm-true --allow-root ]
|
+ ( % ).
*
. 10.13 $
0
% .
=
Cordova/PhoneGap iOS
X
Android SDK,
-
cordova.apache.org/docs/en/
-
latest/guide/platforms/ios.
PATH,
-
, PhoneGap, ,
Набор средств разработки
. 0
$
-
для Android
Android .bash_profile — $ %
macOS, Windows Linux,
- (
bash):
"
SDK Android. *
SDK
$ nano .bash_profile
Сети мобильной телефонной связи и физический мир 561
= $
"
:
'
, -
% <Ctrl>+<X>, % <Y>
, , % <Enter>. '
,
,
.
* ,
(
) -
tools. =
macOS
$ : ~/Library/Android/sdk/,
Linux — ~/Android/sdk/, Windows —
C:\Users\_
\AppData\Local\
Android\Sdk. 4
- Рис. 10.13. Пример экрана About tablet (О планшете) с ин-
tools, . +
формацией о версии Android
,
PhoneGap Cordova. ;
Android $ $
,
PhoneGap.
D
. =
$
,
-
Подготовка устройства Android
Android 5.1 .
'
Android -
$
'
%
,
, (A
- Build number (*
)
,
,
" ,
-
USB. = $
Android
" ,
.
]
.
- ;
]
.
D
(
: & , * $
" $
-
+ . .). 0
%
(
- USB (USB Debugging).
. 10.13)
- ;
%
. &
.
562 Глава 10
,
. 3 hooks
-
$
"
-
. &
-
PhoneGap
$
hooks
.
Сети мобильной телефонной связи и физический мир 563
#
HTML, CSS ;
.
JavaScript
"
www.
index.
= $ PhoneGap html
p5.js
,
%,
. /
p5.js. * $
-
HTML. X www
p5.js ,
p5.js
, -
www. #
,
p5.js. +
%
.
p5-manager,
www
p5.js
"
:
$ rm -rf www
$ p5 g -b www
$ cd www
$ p5 update
,
<meta http-equiv="Content-Security-Policy"
- content="default-src 'self' data:
,
- gap: 'unsafe-inline' https://ssl.gstatic.com; style-src
'self' 'unsafe-inline';
JavaScript
media-src *" />
<title>ButtonApp</title>
</head>
. <body>
<script type="text/javascript" src="cordova.js"></
;
script>
cordova.js,
<script src="libraries/p5.js"></script>
PhoneGap
<script src="libraries/p5.dom.js"></script>
. 2 <script src="sketch.js"></script>
</body>
</html>
p5.js
JavaScript.
0
, $
body
,
head.
#
PhoneGap
$ ,
-
-
:
564 Глава 10
=
sketch.js
- var myButton, responseDiv; // DOM
"
1. # " function setup() {
- createCanvas(windowWidth, windowHeight); // Z$ -
myButton = createButton('click me'); // Z$
$ -
myButton.touchEnded(changeButton); // % #'
:
//
$ (),
- myButton.position(10, 10); //
responseDiv = createDiv('catch me'); // C$
— touchEnded (
" - //
$ div
responseDiv.position(10, 40); //
)
}
$ (
responseDiv).
=
- // \ ' R:
: function changeButton() {
var x = random(windowWidth) - myButton.width; // ^
;
- // -
" $
- var y = random(windowHeight) - myButton.height; // ^
// y
.
myButton.position(x, y); //
responseDiv.html(x + ',' + y); // $ responseDiv
. }
"
,
%
%
.
%
PhoneGap
-
%
.
4
,
-
Android
. 10.14.
XCode iOS,
Android
%
Studio
$
,
-
,
"
"
- "
:
. '
$
% $
, 7. *%
.
"
iOS Android
- 8. &
.
- 9. 2
.
.
-
/
%
"
.
%
.
566 Глава 10
Проект 31
Мобильный регистратор личных биометрических данных
Одной из причин популярности разработки собственных приложений для смартфонов является
возможность использования беспроводного канала Bluetooth для организации связи смартфона
с другими устройствами. Это позволяет использовать смартфон в качестве шлюза для отправки
данных на какой-либо веб-сайт в Интернете. В этом проекте мы будем с помощью микроконтрол-
лера замерять гальваническую реакцию кожи, отправлять полученные данные по Bluetooth на
смартфон, а затем сохранять их в файле в Интернете.
&
"
$
-
Требуемые компоненты
X
0# Android iOS, 1 %. :
7 RedBear BLE Nano, 1 %.
-
+
:
,
%
. 2
/,
Bluetooth LE.
USB- MK20 RedBear BLE Quantified Self23 (http://quantifiedself.
Nano, 1 %.
com),
%
- , $ ,
-
2,5 %
.
FitBit (www.fitbit.com)
=
.
Apple Watch, "
-
.
.
. *
" -
9
270 0, 1 %.
-
% .
.
;
" %. /
,
,
0
" Shieldit Super,
13 .
.
2
«».
;
%, 1 %.
* %.
23
*
: «[ -
]
». &
-
: «
`».
24
Poker Face (*
) —
-
,
, -
%
.
Сети мобильной телефонной связи и физический мир 567
*%
-
7
> (
. 10.15). 7
-
%
-
Сервер
на node.js
Веб-сервер
Канал Bluetooth LE
Аналоговый Микро-
сигнал 0–3 В контроллер
Датчик КГР
568 Глава 10
Схема системы
7
$
- -
GND
D3/RTS
D0/RX
D1/TX
D2/CTS
Vdd
LFT
SWCLK
SWDIO
GND
Vin
A4
A3
+ +
+3,3 В
+3,3 В
Держатель
для таблеточной батарейки Модуль микроконтроллера
с возможностью связи Bluetooth LE Контактные площадки
из токопроводящей ткани
A4
Общий
(«земля») 270 КОм
Общий («земля»)
Сети мобильной телефонной связи и физический мир 569
&
,
-- & $
-
, — $
- BLE Nano RedBear Labs,
% . '
$,
"
ARM M0,
-
"
. & ,
Arduino IDE,
Bluetooth LE
51822 Nordic Labs —
-
— . Bluetooth,
Arduino
& -
- 101. $
,
,
Arduino 101,
"
.
BLEPeripheral
& ,
CurieBLE. *
.
-
,
, - Arduino 101
% % -
. & $ . ; ,
$
-
BLEPeripheral,
%
. ,
-
Arduino
, %
Bluetooth nRF51822
%
,
nRF8001 Nordic Labs —
-
Bluetooth LE
, , , 6. =
-
BLEPeripheral CurieBLE
-
.
$
.
,
&
-
, %
-
,
-
,
LilyPad Coin Cell Battery Holder -
270 0 SparkFun. 4
(
.
. 10.18 10.19). 9
, %
,
LilyPad Simple Power
,
% % $ ,
"
. *
$
,
LiPo
-
% 10 0
USB.
.
#
Bluetooth &
BLE Nano
%-
LE $
-
"
,
- , $
q9,
%
-
%
- . = $
%
-
%
-
(
. 10.21), -
. "
, $ «
».
=
BLE Nano *,
,
-
%
, %
-
" -
.
USB/Serial MK20 USB. *
%
-
,
Начинаем разработку кода
. #
- & $
,
,
,
%
$
. 2
, -
MK20 USB. /
, -
%
%
"
-
-
,
.
(
. 10.20). &
-
Рис. 10.20. Подключение платы Bluetooth BLE Nano к адап- Рис. 10.21. Сборка проекта для тестирования с помощью
теру MK20 USB без припаивания штыревых разъемов может крючков-клипс
быть сопряжено с трудностями. Эти трудности можно пре-
одолеть, используя длинные штыревые разъемы и устанав-
ливая плату на адаптер с некоторым перекосом, обеспечи-
вающим надежный контакт
Сети мобильной телефонной связи и физический мир 571
Носимые микроконтроллеры
4
$ -
,
,
- BLE Nano,
"
. _ /,
-
LilyPad,
_ > (Leah Buechley) -
. & %
$
SparkFun,
-
-
,
,
$
. Adafruit Flora. ; ,
-
Flora
-
" BLE
. X
LilyPad
- Nano, %
%
-
,
%
-
" /
,
%
" ,
-
.
, $
Flora
$ %
$
, -
I2C
WS2812
LilyPad Flora.
. 0
-
, =
" -
,
_ > «Sew Electric»
. Seeed Studio
- (
HLT Press), # (Syuzi
$
% Pakhchyan) «Fashioning Technology: A DIY Intro to
,
,
, - Smart Crafting» (
O’Reilly) -
Pebble.
~
-X
(Hannah Perner-Wilson)
http://www.plusea.
0
$ at.
, -
>
(Becky
Bluetooth LE Stern)
https://beckystern.com
Flora Bluefruit LE,
-
-
Adafruit.
, $
.
# 7
,
//
2
%
- BLEPeripheral blePeripheral = BLEPeripheral(BLE_REQ, BLE_
=
// Z$ - $
// $:
BLEIntCharacteristic sensorCharacteristic( \
,
- "0927ADA8-3588-11E7-A919-92EBCB67FE33", BLERead | BLENotify);
, BLEIntCharacteristic thresholdCharacteristic( \
- "0927AF9C-3588-11E7-A919-92EBCB67FE33", BLERead | BLEWrite);
-
-
.
= $
-
-
UUID25 (
-
),
Android 7
-
UUID:
, - // add service and characteristics to device
blePeripheral.addAttribute(sensorService);
blePeripheral.addAttribute(sensorCharacteristic);
:
blePeripheral.addAttribute(thresholdCharacteristic);
// set initial value for threshold, and begin:
thresholdCharacteristic.setValue(threshold);
blePeripheral.begin();
Serial.println("BLE LED Peripheral active");
}
25
UUID, Universally Unique Identifier —
-
.
Сети мобильной телефонной связи и физический мир 573
lastInput —
-
-
"
"
:
* ,
//
'
, - Serial.print("Disconnected from central: ");
- // ' #
:
Serial.println(central.address());
"
" : }
}
. %
-
,
.
"
" . 2
,
,
$ -
. 4
, %- ,
-
"
LightBlue
. &
,
-
nRF Connect
"
-
,
,
"
. ;
- .
-
—
%- 7
%
-
. *
,
$ "
% ,
.
574 Глава 10
Рис. 10.22. Размещение компонентов на внутренней стороне толстовки: микро- Рис. 10.23. Контактные площадки из
контроллер и держатель батарейки пристегиваются кнопками. Пайка кнопок токопроводящей ткани внутри карма-
не представляет никаких сложностей, но ее следует выполнять на защелкнутых на толстовки
кнопках, чтобы припаиваемые части не деформировались от тепла паяльника.
Постарайтесь не пришить кнопки питания к контактам датчика на внутренней сто-
роне толстовки, что может создать короткое замыкание
Сети мобильной телефонной связи и физический мир 575
$ cd BleDatalogger
2
config.xml,
<icon> <splash> $ -
<platform name="ios"> <platform
name="android">,
. #
, -
,
"
(
iOS
android ios):
- connect-src
: http://192.168.0.10:8080; style-src 'self' 'unsafe-inline';
media-src *" />
Вставьте IP-адрес своего <title>ButtonApp</title>
веб-хоста </head>
<body>
Замените выделенный полужир- <script type="text/javascript" src="cordova.js"></script>
ным шрифтом IP-адрес на IP-адрес <script src="libraries/p5.js"></script>
своего веб-хоста. Наше приложение <script src="libraries/p5.dom.js"></script>
будет подключаться к нему, чтобы <script src="sketch.js"></script>
сохранить полученные от датчика </body>
данные.
</html>
,
(URL)
-
JSON
-
:
Сети мобильной телефонной связи и физический мир 577
disconnectButton = createButton('disconnect');
[ draw() $
disconnectButton.touchEnded(disconnectFromDevice);
,
- disconnectButton.position(190, 60);
- disconnectButton.size(80,40);
$ - uploadButton = createButton('Send to Server');
- uploadButton.touchEnded(sendToServer);
,
uploadButton.position(10, 250);
$ . uploadButton.size(80,40);
dataDiv = createDiv('');
dataDiv.position(10, 200);
dataDiv.style("font-size", "14px");
[
// \#
BLE
Scan for Devices
- function scanForDevices() {
. responseDiv.html('scanning for devices.');
#
$ - //
$, ,
// :
deviceList if (deviceList) deviceList.remove();
deviceList = createSelect(); // Z$
R
, deviceList.position(10, 110);
. 2
deviceList.size(150, 30)
$ - deviceList.option('Pick a device', ''); //
,
//
'
" , - deviceList.changed(selectDevice);
// + 5 serviceUUID
:
578 Глава 10
[
function scanFinished() {
scanFinished()
responseDiv.html('scan complete. Pick a device.');
-
- // Z $. +
.
}
-
responseDiv:
[
// # $ $
selectDevice()
//
$
function selectDevice() {
myDevice.id = deviceList.value();
$
responseDiv.html('Selected: ' + deviceList.value());
deviceList. 0
}
"
-
,
-
MAC-
-
:
Сети мобильной телефонной связи и физический мир 579
[
// # $ ' connect
connectToDevice()
- function connectToDevice() {
$ - dataDiv.html('latest: ' + JSON.stringify(reading));
$
. # - }
JSON,
"
, "
readings,
-
dataDiv:
[
function sendToServer() {
sendToServer() - responseDiv.html('uploading data...');
Send to // + ...
Server
while while(readings.length > 0) { //
$
// $,
var reading = readings.pop(); // $
readings,
// $ readings
GET HTTP
- // $ GET
. [
var path = '/data/' + reading.timestamp + '/' + reading.
" GET: http://exam- value;
ple.com:8080/data/timestamp/ //
sensorValue.
- httpGet(dataServer + path, serverReply);
}
,
}
%
:
580 Глава 10
[
function setAutoUpload() {
setAutoUpload()
if (!autoUpload.checked()) {
responseDiv.html('Auto-upload off');
-
// $ $ '
//
, clearInterval(autoUploadTimer);
sendToServer() } else {
,
- responseDiv.html('Auto-upload on');
$ : // $ $ '
// set timer to upload every 2 minutes
// M
$ $ 2
autoUploadTimer = setInterval(sendToServer, 2*60000);
}
}
[ serverReply()
function serverReply(data) {
HTTP GET
- dataDiv.html('');
responseDiv.html('Server said: ' + data);
// :
data-
}
Div:
Рис. 10.25. Толстовка регистратора личных биометрических Рис. 10.26. Приложение регистратора личных биометриче-
данных в действии. Сколько радости и какой уровень воз- ских данных в действии
буждения приносит его создателю такая возможность? Это
можно узнать по его данным КГР в файле data.csv
582 Глава 10
0
/*
,
-
: node.js
$ GET HTTP % /data/
timestamp/reading
data.csv (
*/
).
2
, var express = require('express'); //
'
// express
- var fs = require('fs'); //
' %
: // fs
var server = express(); // Z$ " server, $
// express
[
con- function confirmSave(error) {
firmSave()
var now = new Date(); // Z$
if (error) { // + $,
fs.appendFile()
console.log(now + ': ' + error); //
- //
"
} else { // -,
: // '
console.log(now + ': ' + 'Saved to file');
// Z- %
}
}
Диагностика
0
-
data.csv -
"
,
" :
Send to Server,
—
,
Upload Sat Apr 15 2017 14:59:47 GMT-0400 (EDT),20
every two minutes. *
- Sat Apr 15 2017 16:48:41 GMT-0400 (EDT),20
,
"
Sat Apr 15 2017 16:48:41 GMT-0400 (EDT),22
. #
Sat Apr 15 2017 16:48:40 GMT-0400 (EDT),18
Сети мобильной телефонной связи и физический мир 583
4
,
- Удаленная отладка
" :
4
, -
? D
A
A-
, ,
-
? 4
,
PhoneGap
- %
,
-
,
.
JavaScript
Chrome
Windows Safari macOS,
-
? A>
A
-
"
. =
&? 4
,
, $
.
sketch.js %.
-
$ -
USB
-
,
,
index.html
.
$
Chrome
-
Bluetooth
: chrome://inspect. 0
-
,
$
,
.
. 10.27.
? C
A
? 4
,
, &
, -
%
. 0
. ,
7
-
HTML JavaScript.
scanForDevices()
myDe-
vice.serviceUUID
- 0
-
" ,
$
,
Bluetooth. " ,
,
?
? JavaScript
-
.
4
,
URL Content Security Policy in-
dex.html
dataServer
Safari iOS. =
sketch.js.
-
Заключение
По определению, сетевые устройства не болтаются в безвоздушном пространстве сами по себе.
Поэтому, если устройство уже подключено к Интернету, следует воспользоваться предоставляе-
мой им мощностью. Чем больше протоколов и инструментов вы знаете, тем легче и приятнее
будет ваша работа. Обратите внимание на преимущества, предоставляемые серверами с обще-
доступными адресами и излишком вычислительных мощностей. Предусмотрите совместное ис-
пользование проводных и беспроводных протоколов, чтобы оснастить разрабатываемые вами
проекты максимальными возможностями реагирования на окружающую их физическую среду.
,
? ' $ -
$ " %
%
%
- %
.
$ ?
Проект SIMbaLink. Разработчики Мередит Хэссон (Meredith Hasson), Ариэль Неварес (Ariel Nevarez) и Нахана
Шеллинг (Nahana Schelling)
SIMbaLink
%
$
,
"
,
-
SIMbaLink
GPRS. 9
$
/,
SIMbaLink
"
%
$
-
Awassa /. #
"
10 ,
. /
, $
. 0
*
=%.
Приложение
? компоненты;
? поставщики аппаратных компонентов;
? поставщики программного обеспечения.
588 Приложение
Компоненты
В этом разделе приводится список всех компонентов, используемых в книге. Для каждого ком-
понента указываются проекты, в которых он задействован. Со времени предыдущего издания
этой книги ситуация с поставщиками претерпела некоторые изменения, поскольку одни компа-
нии получили новых собственников, а другие прекратили свою деятельность. Но, к счастью, на
рынке все еще достаточно небольших поставщиков электронных компонентов, предлагающих
интересные решения.
Поскольку возможны обновления этого списка, посетите веб-страницу http://oreilly.com/
catalog/0636920010920, чтобы ознакомиться с ними.
Коды поставщиков
? A — Arduino Store, https://store.arduino.cc ? L — LessEMF, www.lessemf.com
? AF — Adafruit, www.adafruit.com ? MS — Maker SHED, www.makershed.com
? AMZ — Amazon, www.amazon.com ? P — Pololu, www.pololu.com
? B — Belkin, www.belkin.com ? PS — PowerSwitch Tail, www.powerswitch-
? D — Digi-Key, www.digikey.com tail.com
? DL — D-Link, www.dlink.com ? PX — Parallax, www.parallax.com
? F — Farnell, www.farnell.com ? RS — RS, www.rs-online.com
? ID — Identive, www.identiveusa.com ? SF — SparkFun, www.sparkfun.com
? J — Jameco, https://jameco.com ? SS — Seeed Studio, www.seeedstudio.com
Mifare.
J: 20723 20601, SF: PRT-12615 PRT- +
24–27. AF: 359
12002, F: 4692810, AF: 64, SS: 319030002 360, SF: SEN-10128 SEN-11319, SS:
319030001 113990013
H
Arduino. ;
A > IP-
-
-
D-Link (
-
,
$
- Raspberry Pi
Pi Cam). +
% .
29 30. DL: DCS-930L, DCS-
AF: 2077, A: TSX00083, SF: DEV-07914 5222L DCS-960L.
• "
+
. SF: PRT-
&
,
IP-
12044, AF: 65, D: 923273-ND
Raspberry Pi
Pi Cam:
&
. +
- • Pi Cam. SF: DEV-14028, AF: 3099,
8, 9 27. AF: 1609, D: V2018- SS: 113990214, RS: 913-2664
ND, J: 616673, F: 4903213, RS: 159-5420 • ] Raspberry Pi Zero
W. A: 3414
Модули связи
D
USB/TTL-Serial. +
- • Adafruit Fona 800. #3 — AF: 3147,
. SF: DEV-09716 DEV- 4
— AF: 2691
14050, AF: 3309 284, SS: 317990026
• Adafruit Fona Feather. AF: 3027
" Bluetooth Serial. +
-
3 18. AF: 1588, SF: WRL-12580 • SeeedStudio Xadow GSM+BLE. SS:
WRL-12576 102040005
(
XBee
XBee Pro S2C • XBee Cellular. D: 602-1976-ND
802.15.4. +
14. AF: 128, • Particle Electron Kit. #. . 3
/
D: 602-1892-ND, SF: WRL-08665, J: 2253722, 3
— SF: WRL-14211, 3
/
PX 32416 3/4
— SF: WRL-14212
(
SX1276
HopeRF
RFM95W
RedBear
USB-
()
« » 9 '.
MK20. + . +
+
3 13. D: 1568-
31 (
1237-ND, J: 2207056, SF: PRT-09518, A: 80,
12). MS: MKRBL5, SF: WRL-14071 F: 1650675
590 Приложение
)
2,1 -
D
. +
7–9,
, 5,5 + . +
- 11, 14 26. D: 160-1144-ND 160-1665-ND,
3 27. D: CP3-1000-ND , J: 34761 94511, F: 1855510, RS: 228-5972
J: 28760, SF: PRT-10287, A: 369, F: 1737256 826-830, SF: COM-09592 COM-09590
A . +
-
%=
$
.
5 31. D: K386-ND, J: +
1 4. D: 754-1492-
22577, F: 09WX4670 ND, J: 2125181, SF: COM-00105, F: 2290374,
A . +
- RS: 861-4290
5. D: K445-ND
WSU-30M, J: 2150361, F: 441089
&
. +
10 12. J: 106526, A: 387, SF:
H
+ 2,5 . C0M-09469, F: 1716710, RS: 577-538, SS:
+
%
. D: MTR102A2B
A26509-20-ND, J: 103377, SF: PRT-00116, F:
1593411
D
A
5 '. +
-
) + 2,5 . D:
14. J: 51262, D: LM7805CT-
ED7102-ND, F: 1122344, SF: PRT-00115 ND, F: 9756078, RS: 918-1971
XBee.
D
A
3,3 '. +
-
+
14. SS: 113100001,
14. D: 497-1491-5-ND, J:
SF: BOB-08276 242115, F: 1703357, RS: 438-4885
H ) +
+-
, 1 \. +
-
2,5 . +
- 14. D: 1189-1324-ND, J: 94161, F: 8126933,
. AF: 400, SF: PRT-12693 RS: 475-9009
) + 2 . +
-
10 \. +
-
14. SF: PRT-08272, D: 14 15. D: P11212-ND, J: 29891, F:
3M9406-ND 1144605, RS: 762-1736
Общие компоненты
100 \. +
-
14. D: P10269-ND, J: 158394, F: 1144642,
D
100 . +
- RS: 762-1746
8, 9, 29 30. D: 100QBK-ND, J: 690620,
F: 9337660, RS: 755-0707
!
NPN TIP120. +
-
D
220 . +
-
14 27. D: TIP120-ND, J:
. D: 220QBK-ND, J: 690700, 32993, F: 9804005, RS: 808-0502
F: 9339299, RS: 707-7612
C
« », 9 '. +
-
D
1 . +
-
3.
. D: 1.0KQBK-ND, J:
690865, F: 9339051, RS: 707-7666 9–12 '. +
14. SF: T0L-
D
10 . +
00298, AF: 798, J: 170245, F: 1176248
2, 6 10. D: 10KQBK-ND, J: 691104,
F: 9339060, RS: 707-7745
C
3,5-5 '.
+
13. AF: 771, D:
47 . +
- BC4AAW-ND, SS: 320180002
14. D: A105657-ND, J:
254028, RS: 186205
<
-
. +
-
10 . +
-
3 13. SF: PRT-13813
. J: 29082, SF: C0M-09939, PRT-08483; AF: 258 2011
F: 350072, RS: 249-9294
!A
(CR2032)
D
270 . +
. +
13.
31. J: 691446, D: CF14JT270KCT- SF: DEV-10730 DEV-13883
ND, RS: 845-7577 PRT-00338, AF: 1870 1871
654.
Где брать компоненты и прочее? 591
Специальные компоненты
'- ) USB. +
5, 21, 22 23.
'. +
13. SF:
T0L-10285, F: 1015878, RS: 244-890
\
(
-
). +
6. D:
&. +
13. PDV-P9200-ND, J: 202403, SF: SEN-09088,
SS: 109990013, SF: T0L-11702, AF: 468 F: 7482280
-&
. +
-
!
Hanwei. +
-
10 12. D: 365-1068-ND, RS: 654-8542
14. SF: SEN-09405, P: 1481,
WS2812 PX: 60500009
(NeoPixels). +
13. AF:
& GP2Y0A21YK
2226, 2858 2859, D: 1528-1610-ND, J:
2247947, SF: BOB-13282, SS: 104990139
Sharp. +
12 14. J: 2150256, D: 425-2063-ND, AF:
"
WeMo
LSM303DLH
, 4N35. +
-
ST Microelectronics. +
-
29 30. J: 41056, F: 1244500, D: 160-
19 20. AF: 1120, SF: BOB-
1304-5-ND, RS: 597-302. 3
13303, P: 1250, SS: 101020081
-
SparkFun S: B0B-09118
D
. +
-
8 9. SF: COM-10443
BOB-10467
Датчики
!
A
DTH11.
!
. +
+
29 30. AF: 386,
2 3. D: 905-1000-ND, J: 150551, SF: SEN- J: 2245415, SS: 101020011
10264, AF: 182, RS: 708-1277
>
&
- Разное
A
. +
(
. D: 3M156065-ND,
2, 8, 9 10. D: GH1344-ND SW400-ND,
RS: 120-6041, J: 2119718, A: 550 , SF: C0M-
J: 2231822 119011, SF: C0M-09337, F:
10594, F: 1165068
1634684, RS: 718-2213
H
18
!
( )
-
"3 =. +
-
. +
8 9. AF: 377,
8, 26 27. = % -
SF: C0M-10982
BOB-11722, SS: 311130001
(
400
,
,
Interlink. +
-
,
5. D: 1027-1001-ND, J: 2128260, SF: SEN-
. D: 36-
09375, A: 166 2204-ND, RS: 123-6835, F: 2301244
592 Приложение
'
"3 . D: 36-9300-
K
-
&
-
ND, RS: 274-5086, F: 2500400 10 . +
13.
"
. +
-
+ +
J
1.
. +
14.
]+
+
"-
>
-
-
+
. +
2 3.
(IC-hook with pigtail). +
-
31. SF: CAB-09741 CAB-
+
. +
5, 00501
29 30.
+
A
-
. +
- 5 . +
31. AF:
5. 1126, SF: DEV-11347
&
-
%
$ . +
31. AF: 116, L: 1220
. +
5.
%
$
. +
-
D&
. +
6.
31. AF: 603, SF: DEV-11791,
-
- L: 304
. +
10 12.
%. +
31.
"
]
+
. +
10 . +
13.
31.
TTL-Serial.
AVR, MP3-
www.abacom-tech.com
.
abacom@abacom-tech.com www.adafruit.com
sales@adafruit.com
Acroname Robotics Arduino Store
Acroname
%
7 Arduino
- % Arduino,
$
. 2
-
Arduino.
— store.arduino.cc
,
,
- Atmel
. *
-
Atmel
"
%
-
AVR,
Arduino, Wiring,
. BX-24
. &
"
-
www.acroname.com Atmel
Microchip.
info@acroname.com www.atmel.com
Где брать компоненты и прочее? 593
CoreRFID Farnell/Element14
CoreRFID
%
- Farnell
$
-
RFID
-
4
. *
RFID. ,
-
Newark #3, $,
www.rfidshop.com
3,
-
info@corerfid.com Farnell
.
D-Link
uk.farnell.com
D-Link
USB,
sales@farnell.co.uk
Ethernet Wi-Fi,
Wi-Fi,
-
10. Figaro USA, Inc.
www.dlink.com Figaro
-
sales@dlink.com ,
,
,
Devantech/Robot Electronics
.
Devantech
-
www.figarosensor.com
, $
, -
figarousa@figarosensor.com
,
-
,
- Future Technology Devices
. International, Ltd. (FTDI)
www.robot-electronics.co.uk
FTDI
sales@robot-electronics.co.uk
USB/TTL-Serial,
-
FT232RL,
"
Digi
$ .
Digi
XBee,
Ethernet.
www.ftdichip.com
www.digi.com
sales1@ftdichip.com
$
-
,
-
. X
%
-
-
,
-
:
,
.
,
,
, -
,
,
.
www.glolab.com
www.digikey.com
lab@glolab.com
594 Приложение
Gridconnect
international@jameco.com
custservice@jameco.com
Gridconnect
,
-
Lantronix Digi.
Lantronix
www.gridconnect.com Lantronix
Ethernet/
TTL-Serial: XPort, WiPort, WiMicro,
sales@gridconnect.com
Micro
.
Images SI, Inc.
www.lantronix.com
sales@lantronix.com
Images SI
$
. 2
%
RFID,
-
Libelium
,
, Libelium
,
$
-
XBee
.
,
-
www.libelium.com
,
$
-
,
. Linx Technologies
www.imagesco.com Linx
, -
imagesco@verizon.net
.
www.linxtechnologies.com
Interlink Electronics
info@linxtechnologies.com
Intelkink
-
,
Low Power Radio Solutions
.
LPRS
-
www.interlinkelectronics.com ,
.
specialty@interlink electronics.com
www.lprs.co.uk
info@lprs.co.uk
IOGear
IOGear
Maker SHED
. &
,
Maker SHED
%
USB/TTL-Serial,
Powerline Ethernet.
MAKE
% . &
"
-
www.iogear.com
sales@iogear.com
-
, -
Jameco Electronics .
,
. X ,
",
-
, -
USB/TTL-Serial FTDI.
"
,
$ -
.
www.mouser.com
help@mouser.com
www.parallax.com
sales@parallax.com
NetMedia
Phidgets
NetMedia
-
BX-24 Ethernet Phidgets
SitePlayer.
-
.
www.basicx.com
siteplayer.com
www.phidgets.com
sales@phidgets.com
sales@netmedia.com
Pololu
Newark/Element14
Pololu
$ -
Newark
$
-
#3. *
.
,
-
Farnell/Element14 4
, $,
-
www.pololu.com
3,
www@pololu.com
596 Приложение
Smarthome
Smarthome
% ,
%
-
—
~10, INSTEON.
www.smarthome.com
custsvc@smarthome.com
Где брать компоненты и прочее? 597
Программное обеспечение
Большинство используемого в проектах этой книги программного обеспечения распространя-
ется с открытым исходным кодом. Многие из включенных в список программных платформ в
этих проектах не задействованы, но, в целом, весьма полезны.
Arduino CoolTerm
Arduino — $
>
(
)
AVR,
Processing. 7
- Windows macOS. 3
9
7
Asterisk Cygwin
PBX1
. +
POSIX
+
Linux UNIX. Windows.
Windows
Linux.
www.asterisk.org
www.cygwin.com
AVRlib and avr-gcc
Dave's Telnet
> C
-
telnet Windows.
AVR. 7
Windows,
dtelnet.sourceforge.net
Linux macOS
avr-gcc. Eclipse
www.nongnu.org/avr-libc #
IDE2
. 9
-
GNU avr-gcc — $
C
-
%
,
AVR. 0
-
-
Windows, Linux macOS. %
.
Windows
"
- +
Windows, Linux macOS.
AVR Studio (www.
www.eclipse.org
atmel.com/tools/atmelstudio.aspx).*
Linux
:
www.atmel.com/tools/atmelavrtoolchainforlinux.
Express.js
aspx, CrossPack AVR macOS — > JavaScript
node.js
: www.obdev.at/products/crosspack.
-
.
*
avr-gcc
-
expressjs.com
Arduino, $,
$
,
avr-gcc. GitHub
~
git —
-
ble-central
.
+
git github
7
Bluetooth LE
"
.
PhoneGap Cordova.
git-scm.com
github.com/don/cordova-plugin-ble-central/
github.com
1 2
PBX, Private branch exchange —
- IDE, Integrated Development Environment —
-
.
.
598 Приложение
Java noble
`
. 7
+
API
Blue-
Windows, Linux macOS, - tooth node.js. =
API
.
-
Bluetooth LE.
PEAR
-
. 9
9
%
Max — 7
PHP. #
%
(Miller Puckette). 7
PHP. Windows, Linux macOS.
http://pear.php.net
http://puredata.info
PHP
PuTTY SSH
`
,
-
. #
telnet, SSH
HTML.7
Windows.
Windows, Linux macOS.
www.puttyssh.org
www.php.net
QRCode.js
PicBasic Pro > node.js QR.
BASIC
-
https://github.com/IagoLast/qrcodejs
PIC. +
Windows.
melabs.com Dan Shiffman's Libraries
PhoneGap/Cordova = (Dan Shiffman)
-
Processing
PhoneGap
- p5.js. 0
-
"
.
HTML, CSS JavaScript.
Cordova
$
-
https://github.com/shiffman
PhoneGap.
www.shiffman.net
Adobe.
https://phonegap.com
Tor
https://cordova.apache.org >
, " -
" -
,
-
Processing
.
`
,
-
www.torproject.org
, " -
%
, Tracking.js
"
- > node.js
.
,
.
0
Java,
www.trackingjs.com
Windows, Linux macOS.
www.processing.org
Twilio
"
IP- .
Puredata (PD)
API, -
"
-
q
.
-
. -
,
www.twilio.com
600 Приложение
Visual Studio ws
0
IDE > WebSocket node.js.
Microsoft
Windows.
https://github.com/websockets/ws
&
"
Comm-
unity Edition
—
,
XCode
- 0
IDE
,
Microsoft
macOS
. iOS.
, -
www.visualstudio.com ,
,
Wiring
-
.
#
-
AVR,
-
https://developer.apple.com/xcode/
145
libfreefare 461 NCSA Mosaic 500
144
461
localhost 148 Tor 499
libnfc
MAC 144 >
MQTT 517
461
144 >
MQTT
libnfc-dev 461
144 Mosquitto 526
LSM303
144
424
148
148
mqqt.js 529 '
%
" 148 MQTT 522, 523 &
3
MulitCameraIR 295
51, 152
416 multer 185, 535
dateServer.js 154
3 NDEF Arduino 470
& -
RFID 457 net 191
DCS-960L 534
3 38 noble 329
DCS-5222L 534
36 node.js
multer 180 & -
36 If This Then That 468
3
- nodemailer 162
onoff 481 &
73
311
3
p5.js 55, 274
PN532 470 &
267
Processing -
43
3
net 188 &
" 293
144
video 188 &
" 420
3
477
3
93 querystring 546 &
" 360
SoftwareSerial 127, 132, 134, 170 &
69
Stream 208 &
363
C 208 &
64
>
391 TextFinder 208
64
>
38 tracking.js 451 +7 64, 101
602 Предметный указатель
2
258
305
148
q
421
q
393 arp 147
q
421 arp -a 147
q
54 +
ifconfig 79
q
38 SSID 207 iwconfig 79
q
334 Bluetooth LE 323 iwlist 79
323 LoRa.crc() 318
! + ping 147
441 Processing
=
+
35 image() 189
=
+
258 ssh 44
36, 38
+
sudo 79
36
404 traceroute 361
36
+ 300 49
+
" 366
169
42, 43
+
TAOS TCS34725 447
143
API
151
-
220
LSM303 423
API REST 547
Groundlabs 507
I2C 64
DHT11 520 navigator 414 Twilio 538
=
112 SPI 64, 129
423
=
%
452
28
=
341
28 Pi Zero Camera 534
=
73 $
28
= 122 +
30
= 527
53 30, 35, 75, 76
=
301 Raspberry Pi 76
= 38
=
node 52
Raspberry Pi B3 76
Raspberry Pi Zero W 76
30
# Ethernet 36
% 30
USB 35
2
31
USB/TTL-Serial 98
Connection 273
SIM 550
30
HTTP 153
37
Upgrade 273
258
. &.
114, 150
157
$
163 Stream 556, 557
420
2
82 .find() 556
2
426 .findUntil() 556
477
2
.timeout() 556
477
NDEF 463
478
463 [
301
420, 426
2
152
421
HTTP
156 51
155 36, 38
<
157
36 _
421
HTTPS 416
_
2"
366 36
369
Предметный указатель 603
_ 7
*
82
258 Arduino 61 *
419
258 % 66 *
317
_
84 Arduino 101 63, 65 *
270
Arduino MKR1000 63, 65 *
" 293
" BLE Micro 63 *
IP-
145
30
" 150 7
75
7
145 7
0
7
ESP8266 99, 205
93
381 FT232RL 98
32
355 7
93
7
ArrayList 255
408 0
7
7 OSI bash 560
206
93 49
Ethernet 150 0
Homebrew 526 IP 150 module.exports 483
7 150 0
POST 158
150
31–33
request.query 156 7 143 0
30,
sendPacket() 345 75, 76
Serial1.print( 124 SM5100B 550 0
Serial1.println( 124 7 Processing
Serial1.read( 124 BLE Central 575 Contribution Manager 188
Serial1.write() 124 BLE Nano 569
583
Bluetooth 122 0
serialEvent() 111, 116, 121
WiFi IP-
145
Serial.print() 109
ESP8266 204 0
Serial.write() 109
WINC1500 204
355
server.get() 157
WINC1500 205
355
server.post() 157
7 122 0
7 432
%
-
217
82
121 0
441
7 " 249
7 0
7
35
396
517
7
302
396 0
302
396 Electronic Frontier Foundation 419
302
7
301 0
420
7
0
35, 84
ATmega 328T 127 ] DSO Nano 84
Atmel 16U2 99 *%
%
253 0 420
ATtiny84 127 *
" 420
BASIC Stamp 98 421
" 420
604 Предметный указатель
" 420
Cygwin 44
420
304 forever 195
" 420
426 GNU screen 58
420 "
72 less 47, 48
420
48
0%
$. 152 nano 47
/% 318
48
0
258
152 netcat 346
0
426 152 OpenSSH 44
0
355
57, 59, 71 Photo Booth 188
0 " 35
, Mac Os 71 Processing 39
, Windows 71 PuTTY 44, 45, 58
134 wpa_cli 79
152
159, 274
HTTP 155
64
64
134
RFID 456
292
" 230
42
369
OpenSSH 44
426
120 PuTTY 44, 45
57, 59, 71
42, 43
request 155
, Mac Os 71
response 155
, Windows 71 ANT 307
134 ASCII 105
Processing
36, 38, 74 Bluetooth 122, 307
41
DHCP 150
54
NMEA 412 DNS 150
267 EDGE 549
426
292 GSM 549
426
Hayes AT 363
,
HTTP 153
USB/TTL-Serial 35 64 I2C 421
" 115
29, 292 IMAP 162
LoRa 307, 310
BLE Nano 570 apt 81 LoRaWAN 310
Bluetooth GPS 413 MQTT 514, 516
ESP8266 Thing Dev 205 PhoneGage Desktop 559
517
Feather ESP8266 Huzzah! 205 PhoneGap Developer 559
517
MKR1000 204
NFC 459
404 NMEA
node.js 50
REST 234
412
36,
84 NMEA 0183 410
38
38 OneWire 520
355 37 POP 162
%" 37 RFID
72
35 Mifare Classic 460
Mifare Ultralight 460
- Camera 188 RS-232 97
478 Cheese 188
97
CoolTerm 57, 59 SIP 537
145 curl 80 SMTP 162
Предметный указатель 605
SOAP 468 9
# 89
TCP 150, 252, 341 81
TLS 419 9
35, 37
142
UDP 150, 253, 341 9
317 142
webSocket 272 9
304
webSockets 253 169
305
WiFi 307 9
#
XBee 362 %" 72
408
ZigBee 307 " 72
129
112 9
36, 37
#
32 9
. &.
%
270
USB 9
420
95, 96
110
;;_ #
95
D OAuth2 163
29 # UMTS 549
29
157 Wireless E91 391
29 #
112
69 OAuth2 163
101
" -
Bluetooth 101 , Hue 477
GAP 319 # Arduino
GATT 319
341 & - AirNow 223
SPP 319 # Bluetooth Central PhoneGap
174 354 576
HTTP 157 C
253 Camera 189
341 Processing
C
93 &
268
( C
TCP/IP 253 q 415
9
#
151 2
" NDEF
441 #
Arduino 471
9 DNS 150 +-
399
node.js
HTTP NFC
TwiML 540
,
54
WeMo 473
9
% 152
MQTT 520, 523
46 dateServer.js 154
0
47
252
-
9
30
557
DB-9 97 51
D-sub-9 97 #
0
-
ICSP 129 SMS 544
430
«
» 35, 38 #
35
419
110, 111
9
416
38 #
108
%
36, 38
416
9
# & - AirNow 221
Arduino Uno rev3 66
30 #
HTTP/HTTPS 417
9
204 #
396 # TwML
396 31, 32 MQTT 542
396
32, 33 #
"
208
606 Предметный указатель
H P
`
HTML5 54 PhoneGap 558
TwiML 538 HTTP PHP
`
153
$
162
53
Processing 39, 40, 41
`
156 42
CSS 54 157
JavaScript 50, 54
153 draw() 41
53 setup() 41
`
305 I
41
`" 249 41
IP-
143, 144
41
144
A
%
145 if-then 41
ASCII 110 145
144 for-next 41
144
B IP- 510
Bluetooth 89, 121 R
Smart J Raspbian 77
LE. &. Bluetooth 78
LE 123 JitterBox 136
raspi-config 78
BlueMan 123
78
L RFID 441
Serial Port 123 localhost 148 457
Bluetooth LE
456
323
323
M
Mifare Classic 460
MAC-
144
Mifare Ultralight 460
144
C
144
RS-232 97, 98
Chip Select. # SS MISO 129
CS. &. SS MOSI 129 S
MQTT
SCK
. &.
D
Sideloading 558
Mosquitto 526
DHCP Slave Select. &. SS
150 SMS
DNS
N
544
150 NDEF % 511
150
463 SS 129
463
E
" 463 T
NFC
Ethernet SCL3711 460 TCP
36
PN532 468
150
G O U
UDP
GPS 395 OpenSSH 44
150
Unicode 110