-
Notifications
You must be signed in to change notification settings - Fork 6
/
hackathon.md~
1431 lines (1036 loc) · 143 KB
/
hackathon.md~
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
# Открытый студенческий конкурс (хакатон) по быстрому прототипированию решений Интернета вещей
## Содержание
- [Аннотация](#0)
- [Введение](#1)
- [Инфраструктура типового решения IoT](#2)
- [Протокол MQTT](#3)
- [Облачная платформа *Bluemix*](#4)
- [Краткое описание концепций *Bluemix*](#5)
- [Развертывание и управление приложением](#6)
- [Сервисы DevOps Services для *Bluemix*](#7)
- [Среда визуальной разработки JavaScript приложений Node-RED](#8)
- [Терминология Node-RED](#9)
- [Пример использования Node-RED](#10)
- [Arduino](#12)
- [Аппаратная часть платформы Arduino](#13)
- [Подключение периферии](#14)
- [Сенсоры](#15)
- [Преимущества и недостатки аналогового сигнала](#16)
- [Преимущества и недостатки цифрового сигнала](#17)
- [Радиоканал](#18)
- [Технические характеристики модуля:](#19)
- [Сборка примера](#20)
- [Программирование](#21)
- [Arduino IDE](#22)
- [Структура программы на языке C++ для Arduino](#23)
- [Написание программы для отправки данных сенсоров по радиоканалу](#24)
- [Синтаксис](#25)
- [Параметры](#26)
- [Возвращаемое значение](#27)
- [Замечание](#28)
- [Raspberry Pi](#29)
- [Получение данных с Arduino](#30)
- [Создание приложения в *Bluemix*](#31)
- [Отправка данных в *Bluemix*](#32)
- [Получение данных из *Bluemix*](#33)
- [Визуализация](#34)
- [Сервер](#35)
- [Клиент](#36)
- [График температуры](#37)
- [Угол поворота](#38)
- [Кнопка](#39)
- [Аналитическая обработка данных](#40)
- [Работа с сервисом dashDB](#41)
- [Добавление сервиса в проект](#42)
- [Создание таблицы](#43)
- [Запуск потоковой записи первичных данных](#44)
- [Удаление данных из таблиц](#45)
- [Создание скрипта в RStudio](#46)
- [Запись скрипта в файловую систему окружения dashDB](#47)
- [Запуск скрипта по расписанию из node-red](#48)
- [Визуализация предиктивных данных](#49)
- [Описание оборудования лаборатории Интернета вещей](#50)
## Аннотация <a name="0"></a>
> Всем участникам соревнования предоставляется необходимое оборудование для реализации прототипа решения Интернета вещей: датчики, микрокомпьютеры, актуаторы, радиомодули. Подробное описание оборудование приведено в приложении.
> В ходе соревнования типовой проект может быть использован для построения широкого спектра решений:
> - в агропромышленном комплексе;
> - в городском хозяйстве;
> - на производстве;
> - в медицине;
> - транспорте и других областях.
> Задача для участников соревнования ставится следующим образом: **используя имеющийся набор датчиков, микрокомпьютеры, облачные сервисы и приложения, разработать прототип распределенной системы Интернета вещей.**
> Допускается применение иных облачных платформ и аппаратно-программных решений. Прототип системы будет собран на специальном стенде в лаборатории IoT МГТУ им. Баумана, где он может быть продемонстрирован жюри.
## Введение <a name="1"></a>
Воплощение потенциала идей, заложенных в концепцию Интернета вещей, способно существенно изменить уклад современной экономики. Благодаря внедрению масштабируемых облачных решений, использованию большого количества датчиков и распределенных микропроцессорных систем уже в ближайшее время могут быть созданы прорывные решения в таких областях, как: транспорт, сельское хозяйство, промышленное производство, здравоохранение, социальная сфера, быт и других. Все большее количество компаний обращает внимание на применение идей и технологий Интернета вещей для внедрения аналитики их деятельности и поиска новых возможностей для продуктов и услуг.
> *Интернет вещей (англ. Internet of Things, IoT) — это концепция вычислительной сети физических объектов («вещей»), оснащённых встроенными технологиями для взаимодействия друг с другом или с внешней средой.*
>
Перечислим некоторые интересные факты:
- По оценкам специалистов, к 2020 году к сети Интернет будет подключено до 50 млрд устройств, 20 млрд из них будут задействованы в инфраструктуре IoT.
![Прогноз количества устройств, подключенных к сети Интернет](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/intro01.jpg)
- До 90% данных, анализируемых устройствами Интернета вещей ранее не подвергались обработке.
- До 60% данных, получаемых устройствами Интернета вещей, остаются актуальными лишь несколько миллисекунд.
- В настоящее время только 0,1% устройств, способных выполнять полезную вычислительную нагрузку, подключены к сети.
****
### Инфраструктура типового решения IoT <a name="2"></a>
Под типовым решением Интернета вещей в данном конкурсе понимается распределенная кибер-физическая система, интегрирующая вычислительные ресурсы в физические процессы. В такой системе должны быть реализованы следующие основные функции:
- Сбор первичных данных с помощью сенсоров, расположенных в непосредственной близости от реальных объектов.
- Управление объектами через актуаторы, подключенные к микрокомпьютерам.
- Передача первичных данных от микрокомпьютеров в вычислительный хаб и в обратном направлении.
- Первичная обработка данных в вычислительном хабе, формирование пакетов данных для передачи их в облако.
- Получение и хранение данных в облаке.
- Аналитическая обработка в облаке и формирование ключевых показателей эффективности (KPI) на основе данных об объектах, данных от сторонних источников, исторических данных.
- Визуализация данных и результатов анализа на различных платформах: мобильных устройствах, носимой электронике, планшетах, компьютерах, мониторах и пр.
- Прием команд от внешних управляющих консолей.
- Принятие решений на основе KPI и команд, выработка управляющих и информационных сообщений для актуаторов.
- Передача управляющих сообщений в вычислительные хабы.
Примером подобной системы является структура, представленная на следующем рисунке.
![Пример решения Интернета вещей](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/intro03.png)
**Пример решения Интернета вещей**
В примере использовано оборудование:
- Светодиоды в качестве имитации актуаторов.
- Датчики для регистрации необходимых параметров объекта (например,
датчики температуры и влажности).
- Микрокомпьютеры Arduino Uno для управления актуаторами и получения
данных от датчиков.
- Беспроводные радиочастотные модули RF 433 МГц для коммутации
микрокомпьютеров с вычислительным хабом.
- Плата расширения Gove для подключения датчиков, актуаторов и RF
модулей к микрокомпьютеру.
- Микрокомпьютер RaspberryPi 2 в качестве вычислительного хаба.
- Облачная платформа IBM Bluemix для реализации сервисов хранения,
аналитической обработки и визуализации данных.
Система работает следующим образом. Информация от датчиков через соединительные разъемы на платах Grove передается в микрокомпьютер Arduino. Прием информации осуществляется под управлением программы на языке C с заданной разработчиком периодичностью. Собранные данные собираются в пакеты и снабжаются идентификаторами номера датчика.
![Функциональная схема проекта](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/Intro031.png)
**Функциональная схема проекта**
Через радиомодуль `RF433` данные от многих микрокомпьютеров передаются в вычислительный хаб (`RaspberryPi`). Хаб формирует пакеты `MQTT` и передает их в облако Bluemix для хранения и обработки. Обратно из облака хаб получает команды управления актуаторами, в качестве которых используются светодиоды. Таким образом, по команде выполняется включение и выключение светодиодов.
Данные из MQTT пакета поступают в брокер в составе сервиса IoT Foundation. Настроечные параметры подключенных устройств сохраняются в базе данных Cloudant. Подписчиком данных является приложение Node-Red, которое позволяет манипулировать ими с помощью простых визуальных средств. Множество примитивных обрабатывающих блоков (нодов) представляют собой JavaScript приложения, связанные между собой потоками данных.
Таким образом JavaScript приложения в Node-Red выполняют сохранение полученных данных в базе dashDB. Другое приложение JavaScript запускает скрипт на языке R, который выполняет регрессионный анализ данных от датчиков и определяет предиктивное значение для некоторого предстоящего момента времени.
Полученные результаты предиктивного анализа также сохраняются в базе dashDB. По полученным первичным данным и предиктивным данным строятся графики, которые визуализируются на html странице, доступной для просмотра в броузере.
На странице воспроизводится кнопка оператора, при нажатии на которую формируется MQTT пакет, который через брокер поступает в хаб RaspberryPi и приводит к переключению состояния первого светодиода. В случае превышения предиктивных показаний установленного предела автоматически формируется другой MQTT пакет, который приводит к переключению второго светодиода.
****
### Протокол MQTT <a name="3"></a>
MQTT (*Message Queue Telemetry Transport*) - упрощенный протокол сетевого уровня для обмена сообщениями между устройствами. Этот протокол работает поверх стека TCP/IP и разработан для преодоления проблем, связанных с подключением быстро растущего числа датчиков, микрокомпьютеров, приводов, телефонов, планшетов. В настоящее время MQTT является наиболее распространенным протоколом для организации IoT инфраструктуры.
MQTT организован по принципу издатель/подписчик(*publisher/subscriber*): издатель (устройства типа *publishers*) является отправителем сообщения, которое публикуется в централизованном сервисе (брокере сообщений), а подписчик (устройства типа *subscriber*) получает сообщение из брокера. Для использования брокера MQTT необходимо пройти процедуру подписки на определенные темы публикуемых сообщений.
![Диаграмма последовательностей для одного подписчика](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/intro02.png)
**Диаграмма последовательностей для одного подписчика**
В процессе работы издатель передает данные с указанной темой сообщения, которое сопоставляется брокером с темами подписчиков. В случае совпадения, каждый из них получает экземпляр данных.
Наиболее распространенной реализацией протокола MQTT является библиотека Paho MQTT (https://www.eclipse.org/paho). Библиотека реализована для наиболее популярных языков программирования: C/C++, Java, Javascript, Python, Lua, Go, C\#.
![Сравнение протоколов MQTT и HTTPS](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/mqtt_table.png)
**Сравнение протоколов MQTT и HTTPS**
Небольшие накладные расходы, связанные с хорошо продуманным форматом заголовков, позволяют эффективно применять этот протокол для решений Интернета вещей. В таблице показаны результаты экспериментального сравнения протоколов MQTT и HTTPS. Эксперименты [показывают](https://stephendnicholas.com/posts/power-profiling-mqtt-vs-https), что данный протокол обладает небольшими накладными расходами на стороне устроства, что позволяет сократить расход энергии аккумуляторной батареи и увеличивает количество передаваемых в единицу времени сообщений. В связи с этим протокол MQTT будет использован в данном проекте для транспортировки пакетов данных и команд между распределенными устройствами Интернета вещей и аналитическими средствами облачной платформы IBM Bliemix.
****
### Облачная платформа *Bluemix* <a name="4"></a>
***Bluemix*** — это открытое облачное предложение типа PaaS
(*Platform-as-a-Service*) на базе проекта с открытым исходным кодом Cloud Foundry. Эта платформа предназначена для разработки и хостинга приложений, а также упрощения задач по управлению инфраструктурой. Она позволяет быстро создавать и развертывать приложения, а также управлять ими.
***Bluemix*** обеспечивает следующие возможности:
- быстрое и инкрементное составление приложений из сервисов;
- непрерывное внесение изменений в приложения и обеспечение постоянной доступности;
- поддержка высокоспециализированных моделей программирования и сервисов для конкретных рабочих нагрузок;
- встраивание высокой степени управляемости в сервисы и приложения;
- оптимизация и эластичная адаптация к рабочей нагрузке.
![Каталог компонентов Bluemix](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/intro04.jpg)
**Каталог компонентов Bluemix**
Платформа *BlueMix* достигает этих целей посредством абстрагирования и скрытия большинства сложностей, традиционно сопутствующих хостингу приложений в облаке и управлению ими в облачной среде. *Bluemix* может быть использована разработчиками для создания и применения самых разных приложений, включая веб-приложения, мобильные приложения, приложения для работы с большими данными, приложения для разумных устройств и т.д. *Bluemix* поддерживает разработку на популярных языках программирования и средах разработки. Java-технологии, средства создания серверных частей для мобильных приложений, мониторинг приложений, технологии с открытым исходным кодом и т. д. — все эти возможности
доступны в облаке как сервисы.
Каталог *Bluemix* содержит большую часть из того, что необходимо для быстрого начала работы, большое количество шаблонов, заранее сконфигурированны наборов сервисов, сред исполнения и примеров кода, готовых к использованию:
- сред исполнения, в том числе: Liberty for Java, Node.js, Ruby on Rails;
- веб-сервисов и сервисов приложений, в том числе: Data/Session Cache, ElasticMQ, Decision, SSO, Log Analysis, Redis, RabbitMQ, Twilio;
- мобильных сервисов, в том числе: push-уведомлений, Cloud Code, Mobile Application Management, Mobile Quality Assurance;
- сервисов управления данными, в том числе: MongoDB, реляционной базы данных от IBM, JSON-базы данных от IBM, MySQL, PostgreSQL, MobileData, Mobile Sync, BLU Data Warehouse, MapReduce;
- сервисов мониторинга и анализа;
- сервисов DevOps Services (прежнее название: JazzHub).
****
### Краткое описание концепций *Bluemix* <a name="5"></a>
В терминологии *Bluemix* приложение (*application*) — это созданный вами артефакт, т. е. весь программный код (исходный код или исполняемые двоичные файлы), который необходимо запустить или на который необходимо сослаться в процессе исполнения. Мобильные приложения выполняются за пределами среды *Bluemix* и используют сервисы *Bluemix*, представленные приложениями. В случае веб-приложений приложение — это код, загруженный на платформу *Bluemix* с целью хостинга. Кроме того, платформа *Bluemix* способна осуществлять хостинг программного кода приложения, который вы хотите выполнять на внутреннем сервере в среде на базе контейнера.
На рисунке показаны принципы взаимодействия *Bluemix* с клинтскими приложениями.
![Принципы взаимодействия *Bluemix* с клинтскими приложениями](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/intro05.jpg)
**Принципы взаимодействия *Bluemix* с клинтскими приложениями**
***Сервис (service)*** — это код, работающий на платформе *Bluemix* и предлагающий некоторую функциональность, которую могут использовать приложения. Это может быть готовый сервис, используемый непосредственно — например, push-уведомления для мобильных приложений или эластичное кэширование для веб-приложения. Вы также можете создавать собственные сервисы в диапазоне от простых служебных функций до сложной
бизнес-логики.
***Организация (organization) и пространство (space)*** — это организационные единицы инфраструктуры, способные хранить и отслеживать ресурсы приложения. Организация содержит домены (domain), пространства и пользователей. Пространство содержит приложения и сервисы. По умолчанию используется три пространства: Development (разработка), Production (производство) и Staging (подготовка). Для приложений, которым требуется среда типа PaaS, предоставляются buildpack-пакеты, каждый из которых представляет собой набор скриптов для подготовки кода к исполнению на целевой PaaS-платформе. Buildpack-пакеты, которые включают необходимую вашим приложениям среду исполнения и могут также содержать специализированные инфраструктуры, упрощают развертывание приложения в облаке по сравнению с самостоятельной установкой и конфигурированием среды исполнения.
Использование сервисов в *Bluemix* включает три этапа:
1. Сообщите платформе *Bluemix*, что вам требуется новый экземпляр сервиса и какое конкретное приложение будет использовать этот новый экземпляр.
2. *Bluemix* автоматически инициализирует новый экземпляр этого сервиса и свяжет его с приложением.
3. Приложение взаимодействует с сервисом.
***Пакеты сервисов (Service bundles)*** — это коллекции API-интерфейсов, используемых в конкретных областях. Например, пакет Mobile Services включает сервисы MobileData, Cloud Code, Push и Mobile Application Management. Доступные сервисы и среды исполнения представлены в каталоге Bluemix. Кроме того, вы можете зарегистрировать собственные сервисы.
#### Развертывание и управление приложением <a name="6"></a>
Чтобы развернуть свое приложение, необходимо загрузить его в среду *Bluemix* и указать, сколько экземпляров этого приложения должно исполняться, а затем сконфигурировать *Bluemix*, введя необходимую информацию для поддержки этого приложения.
В случае мобильного приложения среда *Bluemix* содержит артефакт, который представляет серверную часть мобильного приложения — набор сервисов, который использует приложение для взаимодействия с сервером. *Bluemix* поддерживает серверные компоненты мобильного приложения, взаимодействующие с сервисами PushWorks, Cloud Code и Mobile Data, непосредственно из пользовательского интерфейса *Bluemix*.
В случае веб-приложения необходимо предоставить в *Bluemix* соответствующую информацию о среде исполнения и среде разработки, чтобы платформа смогла сформировать надлежащую инфраструктуру для исполнения этого приложения.
При развертывании приложений и управлении ими можно использовать инструмент командной строки cf, веб-интерфейс *Bluemix* или сервисы DevOps Services.
Браузерные и мобильные клиенты — а также другие приложения, развернутые на платформе *Bluemix* и выполняющиеся за ее пределами — взаимодействуют с приложениями, работающими на платформе *Bluemix*, через API-интерфейсы типа REST/HTTP. Каждый клиентский запрос маршрутизируется к одному из экземпляров приложения или составляющих его сервисов. Среды исполнения приложений в *Bluemix* изолированы друг от друга даже тогда, когда они находятся на одной и той же физической машине.
В ходе управления приложениями можно запускать, останавливать, перезапускать экземпляры приложения (или, в случае веб-приложения, изменять их количество), а также изменять объем памяти, используемый приложением. Ключевая конструктивная особенность *Bluemix* — отличные показатели при хостинге масштабируемых приложений и артефактов приложений. На данный момент эта платформа не масштабирует приложение автоматически в соответствии с нагрузкой, поэтому этим процессом необходимо управлять самостоятельно посредством создания или удаления экземпляров при изменении рабочей нагрузки. По этой причине ваши приложения должны сохранять все персистентные данные за пределами приложения в одном из сервисов хранения данных, предоставляемых платформой *Bluemix*. При повторном развертывании приложения после обновления используется тот же процесс, что и при начальном развертывании. *Bluemix* останавливает все исполняющиеся экземпляры и переводит новые экземпляры в рабочее состояние автоматически.
#### Сервисы DevOps Services для *Bluemix* <a name="7"></a>
При использовании DevOps Services требуется лишь несколько простых шагов для организации взаимодействия с другими специалистами с целью планирования, отслеживания и создания программного обеспечения в облаке. Вы можете воспользоваться встроенным в браузер редактором программного кода, который DevOps Services предоставляет для разработки приложений, или использовать DevOps Services с Eclipse, с VisualStudio или с инструментом командной строки Git для написания кода приложения и развертывания его на платформе BlueMix.
При работе с пользовательским интерфейсом, который помогает разработчику быстро добавлять сведения "кто", "что" и "когда" для своего рабочего проекта, требуется потратить всего несколько минут на задание дат, документирование первого сценария применения, назначение одной-двух задач и переход непосредственно к написанию программного кода.
DevOps Services включает встроенные средства управления исходным кодом — Jazz SCM и хостинговый Git. Каждый проект получает свой собственный репозиторий DevOps Services и рабочее пространство, в котором участники этого проекта могут регистрироваться свои изменения, ассоциировать изменения программного кода и просматривать историю недавних изменений. Кроме того, вы можете создать проект DevOps Services и указать на свой репозиторий GitHub.
Вы также можете с легкостью связать элементы работы с изменениями кода в GitHub. Кроме того, для написания кода в Git вы можете использовать имеющиеся у вас инструменты.
Типичными сценариями использования ресурса DevOps Services являются:
- Создание приложения для анализа данных социальных сетей с использованием Node.js, Node-RED, Express, sentiment и ntwitter.
- Создание приложения для создания интерактивных опросов в реальном времени с использованием Node.js, Node-RED, Express, AngularJS и MongoDB.
- Построение сервисов уведомления с использованием Node.js, Node-RED и MongoDB.
- Создание приложений для управления аппаратными устройствами c использованием Node-RED и IoT компонент.
#### Среда визуальной разработки JavaScript приложений Node-RED <a name="8"></a>
**Node-RED** - это визуальная drag-and-drop среда разработки JavaScript рантаймов для IoT (неблокирующих приложений, управляемых событиями). Благодаря большому количеству примитивов и возможности быстрой визуальной настройки и созданию новых компонентов, в том числе непосредственно на языке JavaScript, Node-RED может быть использована как непрофессиональными пользователями, так и профессиональными разработчиками для ускорения создания веб-приложений в облаке. Это позволяет использовать Node-RED для взаимодействия с недорогими аппаратными платформами в рамках подхода IoT, перенося основную часть вычислительной нагрузки на облачную платформу. Помимо этого все созданные рантаймы могут быть объединены в библиотеки решений и впоследствии перенесены в другие проекты благодаря функциям экспорта и
импорта.
#### Терминология Node-RED <a name="9"></a>
*Нод (node)* - функционально законченный блок.
*Поток обработки (flow)* - цепь соединенных нодов и соответствующий им конфигурационный нод.
*Входной нод (input node)* - нод, принимающий внешние данные и задающий начало потоку обработки (flow). Входной нод имеет один или несколько выходных портов (output ports).
*Выходной нод (output node)* - нод, завершающий поток обработки и передающий результаты во внешнюю среду.
*Функциональный нод (function node or query node)* - нод, находящийся внутри потока обработки и имеющий один входной порт и один или несколько выходных портов.
*Конифигурационный нод (config node)* - нод, содержащий конфигурационную информацию, используемую в других нодах. Конфигурационный нод не связан портами с другими типами нодов.
*Набор нодов (node set)* - ноды, включенные в связанные js/html файлы (пары соответствующих друг другу файлов, содержащих связанный код JavaScript и HTML). Ошибка в js/html паре приводит к неработоспособности всех нодов набора.
*Модуль нодов (node module)* - множество связанных js/html файлов (и, соответственно, наборов нодов), где каждая пара описана в package.json файле.
*Пакет нодов (node pack)* - коллекция связанных по функциональности нодов, которые могут быть использованы разработчиком в рамках одного проекта.
![Основное окно проекта в Node-RED](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/intro06.jpg)
**Основное окно проекта в Node-RED**
#### Пример использования Node-RED <a name="10"></a>
Примером эффективного применения технологии Node-RED может служить проект, на разработку которого требуется около 15 минут. Приложение позволяет автоматически отслеживать текущее местоположение мобильного устройства, определяет прогноз погоды и сообщает о нем через твиттер самому пользователю.
![Поток обработки для информирования о прогнозе погоды](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/intro07.jpg)
**Поток обработки для информирования о прогнозе погоды**
Решение работает следующим образом:
- Приложение на мобильном телефоне передает телеметрическую информацию о положении устройства в обрабатывающий поток Node-RED.
- Телеметрическая информация о местоположении преобразуется в twitter сообщение.
- Сообщение используется для доступа к прогнозу погоды в ноде Forecast.io.
- Полученный прогноз форматируется в сообщение twitter.
- Сообщение посылается на твиттер аккаунт пользователя и отображается на мобильной платформе.
Приведенный пример позволяет реализовать логику взаимодействия с использованием протоколов MQTT, HTTP и Twitters API без глубокого погружения в их технические особенности.
# Arduino <a name="12"></a>
Arduino — это электронный конструктор и удобная платформа быстрой разработки электронных устройств для новичков и профессионалов. Платформа пользуется огромной популярностью во всем мире благодаря удобству и простоте языка программирования, а также открытой архитектуре и программному коду. Устройство программируется через USB без использования программаторов.
![Плата Arduino](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/arduino01.jpg)
**Плата Arduino**
Arduino позволяет компьютеру выйти за рамки виртуального мира в физический и взаимодействовать с ним. Устройства на базе Arduino могут получать информацию об окружающей среде посредством различных датчиков, а также могут управлять различными исполнительными устройствами.
****
## Аппаратная часть платформы Arduino <a name="13"></a>
Существует несколько версий платформ Arduino. Uno, как и предыдущая версия Duemilanove построены на микроконтроллере Atmel ATmega328. Старые версии платформы Diecimila и первая рабочая Duemilanoves были разработаны на основе Atmel ATmega168, более ранние версии использовали ATmega8.
Arduino Mega2560, в свою очередь, построена на микроконтроллере ATmega2560.
****
## Подключение периферии <a name="14"></a>
Отличительной особенностью Arduino является наличие плат расширения, так называемых shields или просто «шилдов». Это дополнительные платы, которые ставятся подобно слоям бутерброда поверх Arduino, чтобы дать ему новые возможности. Так например, существуют платы расширения для подключения к локальной сети и интернету (Ethernet Shield), для управления мощными моторами (Motor Shield), для получения координат и времени со спутников GPS (модуль GPS) и многие другие.
![Принцип бутерброда](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/arduino02.jpg)
**Принцип бутерброда**
Для Arduino существует огромное количество различных датчиков, позволяющих проводить различные эксперименты и собирать информацию об окружающей среде. Чтобы удобно
**Плата расширения GROVE**
****
## Сенсоры <a name="15"></a>
GROVE - это не только плата расширения, но и целая линейка датчиков и переферии.
Для примера предлагается осуществить подключение двух датчиков.
Датчик угла поворота подключается к контакту A0 на плате GROVE.
A - означает аналоговый вход микроконтроллера, а 0 - номер.
![Подключение датчика угла поворота](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/arduino04.jpg)
**Подключение датчика угла поворота**
При использовании аналогового сигнала, показания датчика передаются в виде переменного напряжения на сигнальном проводе. Сигнальное напряжение может принимать значение от 0 В до напряжения питания.
### Преимущества и недостатки аналогового сигнала <a name="16"></a>
Преимуществом сенсоров с аналоговым сигналом является крайняя простота их использования с Arduino. Кроме того, поскольку показания датчика можно считывать «из коробки» всего одной командой, драгоценные килобайты памяти на микроконтроллере не расходуются на хранение алгоритма расшифровки протокола, присущего цифровым сенсорам.
Главным недостатком аналогового сигнала является неустойчивость к внешним шумам. Если провод от сенсора до микроконтроллера будет достаточно длинным, он начнёт работать как антенна и улавливать внешние электромагнитные поля: провод сам будет влиять на выходное напряжение и тем самым искажать показания. Поэтому разумный предел длины провода для аналогового сенсора — не более 50 с.Чтобы уменьшить влияние помех на полезный сигнал можно воспользоваться усреднением. Так как помехи носят случайный характер, они будут влиять на полезный сигнал тем меньше, чем больше выборок используется для усреднения.
****
Вторым будет датчик температуры. Подключаем его к контакту A1.
![Датчик температуры](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/arduino05.jpg)
**Датчик температуры**
****
### Преимущества и недостатки цифрового сигнала <a name="17"></a>
Преимуществом сенсоров с цифровым сигналом и всего двумя состояниями является крайняя простота их использования с Arduino.
Однако, если речь идёт о цифровом сенсоре с множеством градаций измеряемой величины, их использование с Arduino не так тривиально, как бинарных или аналоговых: необходимо реализовать расшифровку данных, что требует определённых усилий, а также занимает память микроконтроллера.
Поскольку возможных значений в цифровом сигнале всего 2, а возможные отклонения в напряжении «округляются» микроконтроллером в ближайшую сторону, такие сенсоры можно подключать с помощью достаточно длинных (много метров) проводов, не опасаясь искажения сигнала из-за влияния на провод внешних электромагнитных полей.
****
## Радиоканал <a name="18"></a>
Для организации беспроводной связи в данном проекте используются радиомодули LoRa GPS Shield. Радиопередатчик подключается через интерфейс SPI платы Arduino.
Обратите внимание, что для подключения модуля LoRa необходимо использовать напряжение питания 3.3V.
![Радиоканал](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/arduino06.jpg)
**Радиоканал**
****
### Технические характеристики модуля <a name="19"></a>
Применение:
- Автоматизированное считывание показаний счетчиков
- Автоматизация зданий
- Беспроводные тревожные и охранные сигнализации
- Промышленная автоматизация
- Ирригационные системы дальнего радиуса действия
Технические характеристики
- Диапазон частот: 137 - 1020 МГц
- Полоса пропускания: 7.8 - 500 кГц
- Скорость передачи:
- LoRa: 0.018 - 37.5 kbps
- Максимальная (FSK): 300 kbps
- Чувствительность: -148 дБм
- Типы модуляции: LoRa, OOK, FSK, GFSK, MSK
- Напряжение питания: 1.8 ~ 3.7 В
- Энергопотребление:
- Режим сна: 0.2 мкА
- Ждущий режим: 1.6 мА
- Режим приема LoRa: 11 мА
- Режим передачи: 20 мА (выходная мощность +7 dBm)
- Встроенные температурный датчик и индикатор низкого заряда батареи
- Температурный диапазон: -40°С ~ +85°С
- Тип корпуса: QFN
- Размеры: 6 х 6 х 1мм
****
## Сборка примера <a name="20"></a>
Приступим к сборке демо-примера. Мы будем получать информацию с датчика и отправлять ее по радиоканалу.
Берем плату Arduino UNO и располагаем ее перед собой.
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/arduino8.png)
На нее нужно установить плату Grove.
Внимание! Убедитесь, что все ножки попали в соответствующие выводы на плате Arduino. Если соединить неправильно, то можно впоследствии сжечь микроконтроллер
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/arduino9.png)
Небольшим усилием соедининяем две платы до упора.
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/arduino10.png)
Вариант 1. Подключаем датчик праковки (на примере аналогового датчика угла поворота).
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/arduino11.png)
Он подключается в любой из аналоговых выходов на плате GROVE. Подключим его к A0.
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/arduino12.png)
Вариант 2. Подключаем датчик праковки (на примере цифрового датчика температуры).
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/arduino13.png)
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/arduino14.png)
Передатчик подключается в цифровой вывод D2.
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/arduino15.png)
На этом сборка железной части завершена.
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/arduino16.png)
Теперь необходимо подключить Arduino к компьютеру и перейти к программированию
Подключение платы к компьютеру осуществляется через USB - разъем.
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/arduino17.png)
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/arduino18.png)
****
## Программирование <a name="21"></a>
Микроконтроллер на плате программируется при помощи языка Arduino (основан на языке Wiring) и среды разработки Arduino (основана на среде Processing). Проекты устройств, основанные на Arduino, могут работать самостоятельно, либо же взаимодействовать с программным обеспечением на компьютере (напр.: Flash, Processing, MaxMSP).
### Arduino IDE <a name="22"></a>
Среда разработки Arduino состоит из встроенного текстового редактора программного кода, области сообщений, окна вывода текста(консоли), панели инструментов с кнопками часто используемых команд и нескольких меню. Для загрузки программ и связи среда разработки подключается к аппаратной части Arduino.
![Среда программирования Arduino IDE](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/arduino19.jpg)
**Среда программирования Arduino IDE**
Программа, написанная в среде Arduino, называется скетч. Скетч пишется в текстовом редакторе, имеющем инструменты вырезки/вставки, поиска/замены текста. Во время сохранения и экспорта проекта в области сообщений появляются пояснения, также могут отображаться возникшие ошибки. Окно вывода текста(консоль) показывает сообщения Arduino, включающие полные отчеты об ошибках и другую информацию. Кнопки панели инструментов позволяют проверить и записать программу, создать, открыть и сохранить скетч, открыть мониторинг последовательной шины:
| Кнопка | Действие |
|----------|:-------------:|
| ![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/arduino20.JPG) | Проверка программного кода на ошибки, компиляция. |
| ![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/arduino21.JPG) | Компилирует программный код и загружает его в устройство Arduino. |
| ![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/arduino22.JPG) | Открытие мониторинга последовательной шины (Serial monitor). |
### Структура программы на языке C++ для Arduino <a name="23"></a>
Рассмотрим простой пример мигания светодиодом:
```
void setup()
{
}
void loop()
{
}
```
В данном случае у нас 2 функции с именами setup и loop. Их присутствие обязательно в любой программе на C++ для Arduino.Они могут ничего и не делать, но должны быть написаны. Иначе на стадии компиляции вы получите ошибку.
### Написание программы для отправки данных сенсоров по радиоканалу <a name="24"></a>
В первую очередь задаем в коде константу GROUP_ID с номером вашей группы. Это ваш уникальный идентификатор в радиоканале. Так как все передатчики работают на одной частоте, то в первую очередь необходимо выделять среди прочих данные именно с ваших датчиков.
Например, для первой группы это делается следующим образом:
```
#define GROUP_ID 1
```
Для работы с радиомодулем нужно подключить библиотеку RCSwitch.
```
#include "RCSwitch.h"
RCSwitch sender = RCSwitch();
```
В setup() производим включение радиомодуля, подключенного к контакту D2 платы GROVE.
```
#define TRANSMITTER_PIN 2
void setup() {
sender.enableTransmit(TRANSMITTER_PIN);
sender.setRepeatTransmit(4);
}
```
Для считывания значений аналогового датчика температуры используется стандартная функция analogRead()
#### Синтаксис <a name="25"></a>
analogRead(pin)
#### Параметры <a name="26"></a>
pin: номер порта аналогового входа с которого будет производиться считывание (0..5 для большинства плат, 0..7 для Mini и Nano и 0..15 для Mega)
#### Возвращаемое значение <a name="27"></a>
int (0 to 1023)
#### Замечание <a name="28"></a>
Если аналоговый вход не подключен, то значения возвращаемые функцией analogRead() могут принимать случайные значения.
Код для датчика температуры:
```
#define TEMPERATURE_SENSOR A1
#define B 3975 // идентификатор используемого термистора
int getTemperature() {
int value = analogRead(TEMPERATURE_SENSOR);
float resistance = (float)(1023 - value) * 10000 / value;
float temperature = 1 / (log(resistance / 10000) / B + 1/298.15) - 273.15;
return temperature;
}
```
Код для датчика угла поворота:
```
#define ROTARY_ANGLE_SENSOR A0
#define ADC_REF 5 // значение питания платы Arduino 5V
#define FULL_ANGLE 300 // Максимальное значение угла поворота
#define GROVE_VCC 5 // значение питания платы GROVE 5V
int getAngle() {
int value = analogRead(ROTARY_ANGLE_SENSOR);
float voltage = (float)value * ADC_REF / 1023;
return voltage * FULL_ANGLE / GROVE_VCC;
}
```
Функция для кодирования сообщения, передаваемого по радиоканалу.
```
/*
Формат данных:
group - идентификатор вашей группы
n - номер датчика
data - текущее показание
*/
unsigned long encode(byte group, byte n, int data) {
return (unsigned long)group << 24 | (unsigned long)n << 16 | data & 0xffff;
}
```
Основной цикл программы:
```
#define GROUP_ID 1
void loop() {
int temp = getTemperature(); // считывание значения температуры
int degree = getAngle(); // считывание значения угла поворота
sender.send(encode(GROUP_ID, 0, temp), 32); //кодирование и отправка температуры
delay(500); // задержка 500 мс
sender.send(encode(GROUP_ID, 1, degree), 32); //кодирование и отправка угла поворота
delay(500);
}
```
Полный код тестовой программы для Arduino:
```
#include "RCSwitch.h"
#define GROUP_ID 1 // идентификатор вашей группы
#define TRANSMITTER_PIN 2 // номер контакта, к которому подключен передатчик (D2)
#define TEMPERATURE_SENSOR A1 // номер контакта, к которому подключен датчик температуры
#define ROTARY_ANGLE_SENSOR A0 // номер контакта, к которому подключен датчик угла поворота
RCSwitch sender = RCSwitch();
/*
Формат данных:
group - идентификатор вашей группы
n - номер датчика
data - текущее показание
*/
unsigned long encode(byte group, byte n, int data) {
return (unsigned long)group << 24 | (unsigned long)n << 16 | data & 0xffff;
}
#define B 3975 // идентификатор используемого термистора
int getTemperature() {
int value = analogRead(TEMPERATURE_SENSOR);
float resistance = (float)(1023 - value) * 10000 / value;
float temperature = 1 / (log(resistance / 10000) / B + 1/298.15) - 273.15;
return temperature;
}
#define ADC_REF 5 // значение питания платы Arduino 5V
#define FULL_ANGLE 300 // Максимальное значение угла поворота
#define GROVE_VCC 5 // значение питания платы GROVE 5V
int getAngle() {
int value = analogRead(ROTARY_ANGLE_SENSOR);
float voltage = (float)value * ADC_REF / 1023;
return voltage * FULL_ANGLE / GROVE_VCC;
}
void setup() {
sender.enableTransmit(TRANSMITTER_PIN);
sender.setRepeatTransmit(4);
}
void loop() {
int temp = getTemperature(); // считывание значения температуры
int degree = getAngle(); // считывание значения угла поворота
sender.send(encode(GROUP_ID, 0, temp), 32); //кодирование и отправка температуры
delay(500); // задержка 500 мс
sender.send(encode(GROUP_ID, 1, degree), 32); //кодирование и отправка угла поворота
delay(500);
}
```
## Raspberry Pi <a name="29"></a>
> Raspberry Pi — одноплатный компьютер размером с банковскую карту, изначально разработанный как бюджетная система для обучения информатике,
впоследствии получивший намного более широкое применение и популярность, чем ожидали его авторы.
>
![Raspberry PI](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/raspberry01.jpg)
**Raspberry PI**
### Описание
На плате размером с кредитную карту вы найдёте всё то, что можете найти в обычном персональном компьютере: процессор, оперативную память,
разъёмы HDMI, USB, Ethernet, аналоговые аудио- и видеовыходы. Кроме того, на плате расположены 40 контактов ввода/вывода общего назначения. К
ним вы сможете подключать периферию для взаимодействия с внешним миром: исполнительные устройства вроде реле и сервомоторов или же любые
сенсоры; в общем всё, что работает от электричества.
Штатной операционной системой для Raspberry Pi является Linux. Она устанавливается на micro-SD карту, а та в свою очередь — в специальном
слоте на плате. Если вы не знаете Linux, не стоит пугаться. Напротив: этот компьютер — прекрасная возможность во всём разобраться. Потерять
данные или сильно напортачить с настройками не так страшно, ведь образ на SD-карте можно восстановить за считанные минуты. После этого можно
продолжить эксперименты с чистого листа или с определённой контрольной точки.
#### Порты и аппаратные интерфейсы
Для подключения монитора или телевизора используются композитный видеовыход или разъём HDMI. Кроме того, заводские OEM ЖК-экраны могут быть
подключены через интерфейс DSI.
Raspberry Pi 2 Model B предоставляет 4 USB-порта, объединённых внутренним хабом. К ним, помимо всего прочего, можно подключить клавиатуру и
мышь.
В качестве низкоуровневых интерфейсов доступны:
- 40 портов ввода-вывода общего назначения
- UART (Serial)
- Шина I²C/TWI
- Шина SPI с селектором между двумя устройствами
- Пины питания: 3,3 В, 5 В и земля
Колонки или наушники могут быть подключены через стандартное гнездо для 3,5 мм джеков. Также звук может передаваться через интерфейс HDMI.
На Raspberry Pi Model B+ доступен Ethernet-адаптер на 10/100 Мбит с выходом на стандартное гнездо 8P8C (RJ45).
#### Распиновка платы
![Распиновка Raspberry](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/raspberry02.jpg)
**Распиновка Raspberry**
#### Питание
Raspberry Pi Model B+ может быть запитана через microUSB-кабель или через пины питания.
Номинальное напряжение питания — 5 В. Компьютер потребляет до 800 мА без внешних устройств.
Аппаратный выключатель питания на плате отсутствует. Для включения компьютера достаточно просто подсоединить кабель питания. Для выключения
используйте штатную функцию операционной системы.
****
### Сборка примера
Приступим к продолжению сборки нашего демо-примера. Мы уже научились отправлять значения датчиков по радиоканалу. Теперь нам необходимо
научится принимать эти данные, причем не путая их с чужими!
Нам необходимо следующее оборудование:
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/raspberry03.png)
Берем Raspberry и аккуратно достаем карту памяти из прозрачного бокса.
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/raspberry04.png)
Прежде всего нужно установить SD-карту с операционной системой Raspbian в соответствущее гнездо на плате Raspberry. В гнезде плата фиксируется
благодаря блокирующему механизму. Для надежного закрепления нужно аккуратно вдавить пальцем карту в гнездо.
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/raspberry05.png)
Raspberry должна принимать данные с Arduino по радиоканалу, поэтому нам нужно установить на нее приемник.
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/raspberry06.png)
Подключение осуществляется согласно распиновке датчика: красный провод (+) - 2-ой пин, черный (земля) - 3-ий, а желтый (сигнал) - 13-ый
(GPIO27). Белый провод не используется.
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/raspberry07.png)
Должно получиться вот так:
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/raspberry08.png)
Для нашего примера необходимо также подключить пьезоизлучатель.
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/raspberry09.png)
Подключение осуществляется по схеме: красный провод (+) - 4-ый пин, черный (земля) - 14-ый пин, а желтый (сигнал) - 15-ый (GPIO22). Белый
провод не используется.
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/raspberry10.png)
Raspberry будет требоваться доступ в интернет для связи с серверами IBM, поэтому мы должны подключить ethernet-кабель в соответствующее
гнездо.
Кроме того, мы будем подключаться к плате через SSH соединение.
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/raspberry11.png)
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/raspberry12.png)
Питание платы осуществляется через mini-usb провод.
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/raspberry13.png)
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/raspberry14.png)
***
### Настройка SSH соединения с Raspberry Pi
Используя ОС Linux выполнить подключение к RPi можно следующим образом:
```
```
где XX.XX.XX.XX - ранее определенный ip адрес устройства.
Если вы работаете в ОС Windows, то вам нужно воспользоваться программой Putty.
В поле Имя хоста указываем ip адрес Raspberry в сети, порт 22 и тип подключения SSH.
Пароль пользователя pi: raspberry
***
### Полезные команды для работы в ОС Raspbian
- "top" — запуск предустановленного в Raspbian диспетчера задач;
- "sudo raspi-config" — запуск первоначального меню настроек;
- "sudo passwd root" — создание пароля для пользователя root;
- "startx" — запуск графической оболочки;
- "sudo halt" — выключение RPi;
- "logout" — выход из системы;
- "sudo reboot" — перезагрузка RPi;
- "cd" — переход в необходимую директорию, например, для перехода в директорию /etc/network/ - "cd /etc/network/"
- "pwd" — путь до текущей директории;
- "dir" — содержимое текущей директории;
- "mkdir" — создание директории. Например, "mkdir /home/pitest/" создаст директорию "pitest";
- "rmdir" — удаление директории. Например, "mdir /home/pitest/" - удаление директории "pitest";
- "cat" — открыть файл для чтения. Например, "cat /etc/network/interfaces" покажет содержимое файла "interfaces";
- "nano" — открыть файл для редактирования. Например, "nano
- /etc/network/interfaces" откроет для редактирования файл "interfaces";
- "ifconfig" — отобразит текущую конфигурацию сети;
- "df" — выведет в консоли свободное и используемое дисковое пространство для всех разделов файловой системы;
- "clear" — очистить экран терминала;
- "Ctrl"+"Ins" — скопировать выделенное (текст);
- "Shift"+"Ins" — вставить из буфера (текст);
- "sudo" — выполнения команд c правами root пользователя. Например, это актуально, если вы зашли под пользователем "pi" и хотите из консоли
отредактировать какой-нибудь системный файл - "sudo nano путь_до_файла";
- "Ctrl"+"C" — остановка текущего действия/выход из консольного приложения;
- "sudo apt-get update" — обновление списка доступных пакетов;
- "sudo apt-get upgrade" — обновление установленных пакетов;
- "sudo apt-get install" — установка необходимого пакета. Например, для
установки консольного браузера Links вводим "sudo apt-get install links".
***
### Программирование
В качестве языка программирования выбран Python из-за своего удобства работы как с датчиками, так и с серверами Bluemix.
в консоли SSH соединения с Raspberry делаем последовательно следующее:
Переход в ваш домашний каталог
```
cd ~
```
Создание папки для Хакатона
```
mkdir iot
```
Создание файла, в который будем писать код на Python и открытие его в стандартном редакторе nano.
```
nano raspberry.py
```
Теперь можем приступать к написанию программы. Полный код расположен после этого блока.
Данный раздел посвящён коммуникации с Arduino и Bluemix со стороны Raspberry Pi, для чего мы напишем скрипт на python. К сожалению, придётся использовать python 2 из-за библиотеки `pi_switch`.
### Получение данных с Arduino <a name="30"></a>
Для начала необходимо получить данные по радиоканалу. Вспомним формат передаваемых данных:
```
+----------+-----------+---------+
| group id | sensor id | data |
| 8 bits | 8 bits | 16 bits |
+----------+-----------+---------+
|<----------- 32 bits ---------->|
```
Для работы с радиоканалом нам потребуется использовать библиотеку `pi_switch`:
```python
from pi_switch import RCSwitchReceiver
receiver = RCSwitchReceiver()
receiver.enableReceive(2)
```
Так как нас интересует далеко не вся информация, необходимо перед декодированием пакета проверять номер группы:
```python
def check_group(packet):
return (packet >> 24) == GROUP_ID
```
Так же нам потребуется функция для декодирования пакета, т.е. извлечения идентификатора датчика и данных с этого датчика. Данные с датчика хранятся в дополнительном коде, что необходимо учесть:
```python
def decode(packet):
sid = (packet >> 16) & 0xff
data = packet & 0xffff
# Преобразование отрицательного значения.
if data & 0x8000:
data = data - 0x10000
return sid, data
```
Взаимодействие с библиотекой происходит в неблокирующем стиле: данные накапливаются во внутреннем буфере, пока пакет не будет полностью получен, после чего данные могут быть обработаны:
```python
def receive_if_available():
# Проверка наличия данных в буфере.
if not receiver.available():
return
# Получение данных и сброс буфера.
packet = receiver.getReceivedValue()
receiver.resetAvailable()
# Наш ли это пакет.
if packet and check_group(packet):
return decode(packet)
```
###Создание приложения в *Bluemix* <a name="31"></a>
Перейти по ссылке: https://bluemix.net/. Введите Ваш логин и пароль. Перейдите в раздел DASHBOARD. При необходимости создайте новое рабочнее пространство (например, `dev`).
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/bluemix03.png)
Перейдите в раздел CATALOG.
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/bluemix01.png)
**Рабочее поле Bluemix.**
Добавьте в проект компонент Internet of Things Foundation Starter. ![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/bluemix02.png)
В результате буду добавлены приложение SDK for Node.js и сервис Cloudant NoSQL DB.
После этого добавьте в проект сервис IoT Foundation. ![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/bluemix04.png)
При создании в поле App укажите имя вашего приложения IoT Foundation Starter, что позволит автоматически связать SDK for Node.js с брокером MQTT.
Сервис IoT Foudation является интегрированным компонентом на основе брокера MQTT запросов.
Для его использования необходимо выполнить конфигурацию брокера на прием пакетов от RaspberriPi.
Создадим описание нового устройства. В результате ваш проект будет иметь следующий вид.
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/bluemix05.png)
**Рабочее поле Bluemix после довбавление IoT Foundation и IoT Foundation Starter.**
Перейдите в раздел DASHBOARD. Запустите конфигурирование сервиса IoT Foundation (Launch dashboard).
Далее добавьте новое устройство (Add Device).
Создайте новый тип устройства (например, с именем: RPi). Все поля за исключением поля Name можно оставить пустыми.
Для добавления устройства созданного Вами типа понадобится определить уникальный DeviceID устройства (например, его mac адрес).
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/bluemix06.png)
В следующем окне Вы можете выбрать один из двух вариантов: использовать автоматически сгенерированный токен или добавить существующий токен устройства. Выберем первый вариант (оставьте поле token пустым). В результате Вам будет выдана информация о настройках устройства, которые необходимо сохранить для последующего использования (см. следующее задание).
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/bluemix07.png)
Полезной функцией IoT Foundation консоли является возможность просмотра логов сообщений MQTT. Данная возможность может быть использована для проверки работоспособности всей инфраструктуры, поиска ошибок и пр.
### Отправка данных в *Bluemix* <a name="32"></a>
Для связи с Bluemix логично использовать протоколы, основанные на TCP или UDP. В данном примере используется MQTT.
После регистрации устройства в Bluemix мы получаем данные для авторизации, которые поместим в файл [device.cfg](src/device.cfg):
```ini
[device]
org=md8qpm
type=bmstu001
id=b827eb79051a
auth-method=token
auth-token=3BZu_drqRuAKH*K*+i
```
Bluemix предоставляет библиотеку ibmotf — небольшую обёртку над MQTT, инициализация соединения с которой выглядит как:
```python
import ibmiotf.device
def connect(config):
options = ibmiotf.device.ParseConfigFile(config)
client = ibmiotf.device.Client(options)
client.connect()
return client
client = connect('device.cfg')
```
После открытия соединения можно передавать данные, публикуя события:
```python
sid_to_topic = ['temperature', 'angle']
def send_data(sid, data):
topic = sid_to_topic[sid]
client.publishEvent(topic, 'json', data)
```
Теперь мы можем отправлять данные в облако по MQTT, получаемые с arduino по 433MHz-радиоканалу:
```python
def main():
while True:
payload = receive_if_available()
if payload:
sid, data = payload
if 0 <= sid <= 1:
send_data(sid, data)
else:
time.sleep(0.1)
```
Стоит заметить, что ждать необходимо только в отсутствии данных. Действительно, если ждать при любом исходе, то это может привести к накапливанию в буфере ненужных пакетов (полученных по ошибке) или в результате задержки на самой arduino.
### Получение данных из *Bluemix* <a name="33"></a>
В нашем случае нажатие на кнопку в веб-интерфейсе приведёт к гудку через динамик, подключённый к raspberry. Для работы с ним воспользуемся библиотекой `RPIO`.
Сконфигурируем GPIO-порт:
```python
import RPIO
BUZZER = 22
RPIO.setup(BUZZER, RPIO.OUT, initial=RPIO.LOW)
```
Теперь необходимо подписаться на получение данных из Bluemix:
```python
def connect(config):
# ...
client.commandCallback = on_message
return client
def on_message(cmd):
if cmd.command != 'button':
return
RPIO.output(BUZZER, 1)
time.sleep(.05)
RPIO.output(BUZZER, 0)
print cmd
```
При инициализации соединения библиотека создаёт отдельный поток, в котором ожидаются поступающие события, называемые командами. После получения команды вызывается наш обработчик.
Полный код доступен [здесь](src/raspberry.py).
## Визуализация <a name="34"></a>
### Сервер <a name="35"></a>
Из рабочего пространства проекта перейдите в приложение SDK for NODE.js. В левом верхнем углу нажмите на ссылку для перехода в SDK NodeRED.
Дальнейшие действия поясняют процесс создания приложений в данном SDK.
Точкой входа в веб-приложение является файл `index.html`, для получения которого браузер выполняет http-запрос к нашему серверу. Поэтому нам необходимо воспользоваться node-red узлами `input/http` и `output/http`:
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/static-server.png)
**Статический сервер.**
Теперь вход в приложение может быть осуществлён по адресу https://YOU_PROJECT_NAME.eu-gb.mybluemix.net/index.html (например, [https://example-hack.eu-gb.mybluemix.net/index.html](https://example-hack.eu-gb.mybluemix.net/index.html)).
Содержимое `index.html` и `index.js` подробно рассматривается в следующем разделе. Полный код: [index.html](src/index.html) и [index.js](src/index.js). Полный исходник всех потоков доступен [здесь](src/flows.json).
Теперь нам необходимо настроить взаимодействие с raspberry, т.е. получение и отправку данных. Для этого используется node-red узлы `input/ibmiot` и `output/ibmiot`:
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/raspi-input.png)
**Настройки узла `input/ibmiot`.**
![](https://raw.githubusercontent.com/bmstu-hackathon/example/gh-pages/assets/raspi-output.png)
**Настройки узла `output/ibmiot`.**