11. Nginx
웹 서버 소프트웨어
러시아의 개발자 이고르 시쇼브가 개발
장점
Apache보다 작은 자원으로 빠르게 서비스 할 수 있음
“동시 접속자”가 많은 서비스 일수록 좋음
단점
Apache보다 확장 모듈이 부족
한글화된 문서가 적음
12. Node JS
서버 사이드에서 동작이 가능한 JavaScript
내장 HTTP 서버 라이브러리를 포함
-> Apache등의 별도의 소프트웨어 없이 동작 가능
Node js가 빛을 발하는 분야
- 입력, 출력이 잦은 App
- 데이터 스트리밍 App
- 실시간으로 데이터를 다루는 App
- JSON API 기반 App
13. Mongo DB
JS문법을 사용하는 데이터베이스
NoSQL 중 가장 널리 사용되는 데이터 베이스
+ NoSQL : SQL이 없는 데이터 베이스
관계형 데이터 베이스처럼 스키마가 없음
-> 형식에 구애 받지 않고 자유롭게 데이터 넣기 가능
14. 설치
MongoDB는 조금 까다롭지만
Nginx와 Nodejs는 패키지 매니저를 통해 손쉽게 설치 가능
Nginx
$ sudo apt-get install nginx
(끝!) 설치후 nginx –v 명령어로 버전 확인 가능
다음과
같은 화면이
보이면 정상
설치
15. 설치
Node JS ( https://nodejs.org/ko/ )
공식 홈페이지에서 tar 받아서 사용할 수 도 있지만
$ curl -sL https://deb.nodesource.com/setup_6.x | sudo -E
bash -
$ apt-get install nodejs
설치 시 NPM( Node Package Manager) 도 함께 설치됨
Node –v, npm –v 명령어로 각각 버전 확인
공식 홈페이지의 패키지 매니저로 Node.js 설치하기 참고
https://nodejs.org/ko/download/package-manager/
20. 1. Nginx vs Apache
Apache( Thread 방식 )
하나의 스레드에서 하나의 클라이언트를 처리
클라이언트의 개수만큼 스레드 생성
클라이언트가 요청한 일 수행한 후 결과를 클라이언트에
전달할 때 까지 I/O 문제로 스레드가 대기해야 할 일이 잦음
-> 자원의 낭비
21. 1. Nginx vs Apache
Nginx( Event-driven 방식 )
1개의 프로세스가 모든 요청을 처리하는 구조
Worker 프로세스가 계속 요청을 받고,
요청이 완료되면 클라이언트가 자원을 받아가는 방식
요청이 들어올 때마다 스레드가 생기는 것이 아니므로
상대적으로 부하를 잘 견딤
23. 2. Nginx Architecture
공부 중 입니다.. 용어가 어렵고 생소함
Nginx – The Architecture of Open Source Application
http://www.looah.com/article/view/1640 (번역본)
24. 3. MQTT, Mosquitto
Message Queue Telemetry Transport
경량의 Pub/Sub 메시징 프로토콜
낮은 전력, 낮은 대역폭에서 사용가능
M2M, IoT에서 사용
MQTT 프로토콜의 원칙
메시지를 발행(Publishing)
메시지를 구독(Subscribe)
Pub, Sub : Broker의 클라이언트
Topic : 슬래시(/)를 이용해서 계층적으로 구성
25. 3. MQTT, Mosquitto
MQTT 메시지 버스 시스템
Broker : 메시지 버스를 만들고 메시지를 흘려 보냄
버스에 흐르는 다양한 메시지 구분 위해 Topic을 이름으로 하는
메시지 채널을 만듦
어플리케이션들은 버스에 연결하고 관심있는 Topic을
등록해서 sub하거나 pub함
26. 3. MQTT, Mosquitto
Mosquitto is an open source implementation of a
server for version 3.1 and 3.1.1 of the MQTT protocol.
It also includes a C and C++ client library, and the
mosquitto_pub and mosquitto_sub utilities for
publishing and subscribing.
https://github.com/eclipse/mosquitto
27. 3. MQTT, Mosquitto
저장소 업데이트 없이
$ sudo apt-get install mosquitto
-> mosquitto version 1.4.8 버전 설치됨
라즈베리파이에 설치된 mosquitto와 동일한 버전 사용위해
저장소(repositories list) 업데이트
$ sudo apt-add-repository ppa:mosquitto-dev/mosquitto-ppa
$ sudo apt-get update
$ sudo apt-get install mosquitto
28. 3. MQTT, Mosquitto
테스트 위해 mosquitto-client 설치
$ sudo apt-get install mosquitto-clients
결과 화면
로컬호스트에서 test라는 토픽으로 hello, world publishing
로컬호스트에서 test라는 토픽으로 subscribe
29. 4. Nginx with Mosquitto
참고 자료
Load Balancing MQTT
https://www.nginx.com/blog/nginx-plus-iot-load-balancing-mqtt/
MQTT Bridge with Mosquitto and Nginx
http://akeil.de/posts/mqtt-bridge-with-mosquitto-and-nginx.html
Mosquitto Nginx
Ubuntu 16.04
30. 백마 인턴십
in 아름 전자
4주차(2017.07.10 ~ 14)
Reverse Proxy, Rpi Broker Test
39. 1. Nginx와 Nodejs를 함께 쓰는 이유?
Nodejs서버의 포트에 직접적인 접속을 막고
Nginx를 거쳐가도록 하여서
Nodejs의 실제 포트를 숨기자.
장점 – 보안, 접속 분산
$ vi /etc/nginx/sites-available/default -> 아래 처럼 수정
Nginx 웹서버 IP/로 접속하면 내부적으로 Nodejs의 서버로 접속
40. 1. Nginx와 Nodejs를 함께 쓰는 이유?
결과
Node js서버가 실행중인 8081 포트 직접 접속
포트번호없이 Nginx의 default 위치(/) 에 접속 시
Nodejs의 8081포트로 연결된 것과 동일한 결과
41. 2.Rpi Broker <-> Server Test
Broker(Rpi) Web AppBoard
시나리오
1. Web App 에서 보드의 온도 정보 구독 신청(sub)
2. Board에서 온도 정보 발행(pub)
3. Web App에서 확인
48. 1. Express
설치하고 사용해보기
아래처럼 디렉토리 구조를 만들고 싶다면
다음 명령어를 사용해서 express 설치
$ npm install express-generator –g
$ express –view=[engine] [app name]
$ cd [app name]
$ npm install
$ set DEBUG=[app]:* npm start
49. 1. Express
Express 디렉토리 구조
http://webframeworks.kr/getstarted/expressjs/#tocAnchor-1-3
app.js : express 설정파일
/public : 정적파일(js파일, img, css)
포함
/routes : 라우팅 로직 구현
/view :
Express 앱을 생성 할 때 명시한 템플
릿 엔진을 사용해 HTML으로 변환
50. 1. Express
Express view 템플릿 엔진 Jade, ejs, pug등..
해당 엔진 언어의 문법에 맞게 작성하면 HTML이나 자바스
크립트로 변환됨
https://wayhome25.github.io/nodejs/2017/02/18/nodejs-10-express-
template-engine-jade/
51. 1. Express
우리는 문법을 새로 배울 필요가 없는 EJS 사용
HTML의 <% %> 태그 사용해서
서버의 데이터를 사용하거나 코드 실행 가능
<% 자바 스크립트 코드 %>
<% 출력 할 자바스크립트 객체 %>
52. 2. 통신 과정
이러한 Express 웹에서 MQTT를 사용할 방법은?
Node.js MQTT 라이브러리 사용
https://github.com/mqttjs/MQTT.js
54. 2. 통신 과정
테스트 해보기
view/index.ejs
스위치의 상태를 구독(sub)
Topic - “sw1”
보드의 온도/습도 정보를 구독(sub)
Topic – “Hygrometer”
55. 2. 통신 과정
테스트 해보기
“상태받아오기” 버튼을 누른다고 가정
view/indes.ejs
버튼 이벤트를 처리하는 부분
public/javascripts/button_click.js
56. 2. 통신 과정
테스트 해보기
public/javascripts/button_click.js
UI에 <input type="button" id="connect" value="상태받아오기"/>
$(document).on( “click”, “#버튼 id”, click 이벤트가 발생하면 실행시킬 함수
이름 )
57. 2. 통신 과정
테스트 해보기
public/javascripts/button_click.js
UI에 <input type="button" id="connect" value="상태받아오기"/>
$(document).on( “click”, “#버튼 id”, click 이벤트가 발생하면 실행시킬 함수
이름 )
63. 1. MongoDB란?
NoSQL 중 가장 널리 사용되는 데이터 베이스
+ NoSQL : SQL이 없는 데이터 베이스
관계형 데이터베이스(MySQL, Oracle .. ) 처럼
스키마가 없음
-> 형식에 구애 받지 않고 자유롭게 데이터 넣기 가능
64. 1. MongoDB란?
설치
공식 홈페이지의 Install MongoDB on Ubuntu 참고
https://docs.mongodb.com/v3.2/tutorial/install-mongodb-on-ubuntu/
65. 1. MongoDB란?
Nodejs와 연결하기 위해
MongoDB 공식 홈페이지에서 지원하는
Nodejs 드라이버 사용
$npm install mongodb
데이터 베이스 이름은 areum
사용할 테이블 이름은 facility
66. 2. 현재 진행 상황
우분투 iot/fa 디렉토리에서 UI 개발 진행중
데이터 베이스 테스트는 로컬에서 진행중
67. 2. 현재 진행 상황
첫번째 등록 버튼을 누르면
시설 등록 페이지가 팝업으로 뜸,
해당 페이지에서 정보를 입력하고
등록 버튼을 누르면 데이터 베이스에
입력이 되어야함
68. 2. 현재 진행 상황
1. 페이지에서 연결된 자바스크립트 파일 확인
public/add_facility.html
2. 버튼을 눌렀을 때 동작할 함수 작성(onclick)
public/javascripts/add_facility.js
페이지에서 값들을 가져오고, ajax를 이용해 웹 서버에 값들을 전송
3. 서버에서 수행할 로직 작성
routes/add_facility.js
데이터 베이스와 연결하고, 웹에서 받은 정보들 insert
수행 후 수행 결과(success or fail)반환
4. app.js 수정
작성한 파일들이 잘 동작할 수 있도록 연결
69. 2. 현재 진행 상황
1. 페이지에서 연결된 자바스크립트 파일 확인
public/add_facility.html
70. 2. 현재 진행 상황
1. 페이지에서 연결된 자바스크립트 파일 확인
public/add_facility.html
71. 2. 현재 진행 상황
2. 버튼을 눌렀을 때 동작할 함수 작성(onclick)
페이지에서 값들을
가져오고
json형식으로 저장
ajax를 이용해 웹서버로
신호를 보냄
POST 방식으로
success에서는
서버에서 반환한 결과를
가지고 동작 수행
72. 2. 현재 진행 상황
3. 서버에서 수행할 로직 작성 ( routes/add_facility.js )
몽고 디비와 연결
73. 2. 현재 진행 상황
3. 서버에서 수행할 로직 작성 ( routes/add_facility.js )
74. 2. 현재 진행 상황
4. app.js 수정
작성한 파일들이 잘 동작할 수 있도록 연결
http://cinema4dr12.tistory.com/entry/Web-AppNodejs-Express-4-Express-
4%EC%97%90%EC%84%9C%EC%9D%98-
%EB%9D%BC%EC%9A%B0%ED%8C%85Routing-%EB%B0%A9%EB%B2%95
참고
75. 백마 인턴십
in 아름 전자
7주차(2017.07.31 ~ 08.04)
MongoDB Insert, show List
77. 1. 현재 진행 상황
우분투 iot/fa 디렉토리에서 UI 개발 진행중
데이터 베이스 테스트는 로컬에서 진행중
78. 1. 현재 진행 상황
등록 버튼을 누르면 시설 등록 페이지가 팝업으로 뜸,
해당 페이지에서 정보를 입력하고
등록 버튼을 누르면 데이터 베이스에 입력이 되고,
부모 페이지의 테이블에 추가가 되어야함
79. 1. 현재 진행 상황
시설 등록 페이지에 접속할 때 마다
DB에서 리스트를 가져와 뿌려주는 방식으로 구현
80. 1. 현재 진행 상황
1. 페이지에서 연결된 자바스크립트 파일 확인
public/regi_facility.html
2. 페이지에 접속 했을 때 바로 수행될 함수 작성
public/javascripts/regi_facility.js
GET 방식으로 서버에 테이블에 뿌릴 데이터를 요청
3. 서버에서 수행할 로직 작성
routes/regi_facility.js
데이터 베이스와 연결하고, 테이블에 있는 모든 정보 가져옴
수행 후 결과 반환
4. app.js 수정
작성한 파일들이 잘 동작할 수 있도록 연결
81. 1. 현재 진행 상황
1. 페이지에서 연결된 자바스크립트 파일 확인
public/add_facility.html
82. 1. 현재 진행 상황
2. 페이지에 접속 했을 때 바로 수행될 함수 작성
public/javascripts/regi_facility.js
GET 방식으로 서버에 테이블에 뿌릴 데이터를 요청
서버에 GET방식으로 요청
요청에 대한 응답을 받아
서 처리 하는 부분
83. 1. 현재 진행 상황
3. 서버에서 수행할 로직 작성 ( routes/add_facility.js )
몽고 디비와 연결
GET방식으로
요청이 오면 수행할 로직
DB에서 정보들을 가져오고,
배열로 변환한 뒤 반환 함
84. 1. 현재 진행 상황
4. app.js 수정
작성한 파일들이 잘 동작할 수 있도록 연결
http://cinema4dr12.tistory.com/entry/Web-AppNodejs-Express-4-Express-
4%EC%97%90%EC%84%9C%EC%9D%98-
%EB%9D%BC%EC%9A%B0%ED%8C%85Routing-%EB%B0%A9%EB%B2%95
참고
85. 백마 인턴십
in 아름 전자
8주차(2017.08.07 ~ 08.11)
MongoDB Complete, MQTT
87. 1. 현재 진행 상황
우분투 iot/fa 디렉토리에서 작업
등록, 설정 탭 거의 완료
88. 1. 현재 진행 상황
‘등록’탭에 있는
시설 등록, 관리 항목 목록, DCS등록, 센서 등록, Actuator 등록,
외부입력항목 등록 완료
원래는 하나의 탭마다 3개의 파일이 필요하지만
비 실용적이라고 판단되어 비슷한 기능을 하는 파일들을
하나의 파일로 합침
‘등록’탭의 서브 항목들 중 ‘등록‘ 버튼을 누르면 팝업 창이 뜨는 함수
+ 팝업 창에서 ‘확인’을 눌렀을 경우 DB에 정보를 넣는 함수
-> public/javascripts/registrageAll.js
89. 1. 현재 진행 상황
public/javascripts/registrageAll.js 중 일부
팝업 창을 띄우는 함수
DB에 내용을 넣을 수 있
도록 요청하는 함수
90. 1. 현재 진행 상황
‘설정’탭은 ‘등록’탭에 있는 코드를 그대로 사용할 수 없음
실제 DB에 들어있는
각각의 내용들을
가지고 온 뒤
옵션에 세팅해야 함
91. 1. 현재 진행 상황
setting 탭을 위해 새롭게 작성한 파일들
public/javascripts/
setting.js
- setting.html에서 버튼을 눌렀을 때 팝업 창을 띄우는 함수들
setting_add_db.js
setting_sensor.html, setting_actuator.html에서 확인 버튼을 눌렀을 경우
DB에 넣을 값들을 JSON형식으로 만들고 ajax를 이용해 서버에 요청
setting_sensor.js
- DB에서 원소들을 가져와서 setting_sensor.html에 옵션 세팅
setting_actuator.js
- DB에서 원소들을 가져와서 setting_actuator.html에 옵션 세팅
getSettingList.js
- DB에서 세팅 목록들을 가져와서 뿌려 줌
routes/
setting.js
- setting과 관련된 라우팅 함수들 모아서 모듈화
92. 1. 현재 진행 상황
public/javascripts/setting_sensor.js
- DB에서 원소들을 가져와서 setting_sensor.html에 옵션 세팅
코드는 setting_actuator.js 와도 유사
html 파일이 열릴 때 마다 수행
db에 값들을 요청하고 받아와서
option으로 세팅
93. 1. 현재 진행 상황
public/javascripts/setting_add_db.js
setting_sensor.html, setting_actuator.html에서 확인 버튼을 눌렀을 경우
DB에 넣을 값들을 JSON형식으로 만들고 ajax를 이용해 서버에 요청
94. 1. 현재 진행 상황
public/javascripts/getSettingList.js
- DB에서 세팅 목록들을 가져와서 뿌려 줌
설정 탭에서 sensor와 actuator를 설정해주는 항목이 다름
가져올 때 sensor의 정보인지, actuator의 정보인지 구분해야 함
96. 1. 현재 진행 상황
actuator의 정보일 때 데이터 세팅
세팅 테이블의 정보 요청
97. 1. 현재 진행 상황
routes/
setting.js
- setting과 관련된 라우팅 함수들 모아서 모듈화
app.js에 다음과 같이 사용하면
express에서는 /setting으로 시작하는 요청이 들어오면
routes/setting.js에서 함수를 찾아서 처리함
98. 1. 현재 진행 상황
routes/setting.js 중 일부
setting/get_facility로 GET방식으로 요청이 들어오면
DB에서 facility테이블의 내용을 docs로 반환
99. 1. 현재 진행 상황
routes/setting.js 중 일부
setting/add_settingInfo로 POST방식으로 요청이 들어오면
DB의 setting table에 insert
100. 백마 인턴십
in 아름 전자
9주차(2017.08.14 ~ 08.16)
Monitor Using MQTT
102. 1. 현재 진행 상황
우분투 iot/fa 디렉토리에서 작업
등록, 설정 탭 Insert와 list에 뿌려주는 작업 완료
모니터 탭 로직 일부 수정 필요
103. 1. 현재 진행 상황
모니터 탭
- MQTT 브로커에 topic을 sub후 pub가 될 때 마다 DB에 저장됨
- 모니터 페이지에서는 DB에 저장된 내용들을 가져와서 테이블 형태
로 보여줌
고쳐야 할 것
- 후에 프로토콜에 맞게 테이블 재 구성 필요
104. 1. 현재 진행 상황
시나리오
1. 앱이 시작되면 MQTT 브로커에 연결 후 SUB
2. 보드에서 온도 정보 PUB
3. 정보를 받아서 DB에 Insert
4. 웹 페이지에 table로 출력
105. 1. 현재 진행 상황
서버가 시작되면 MQTT Broker와 연결할 수 있도록
$ vi bin/www
서버가 시작되면 onListening 함수를 수행함
bin/www의 상단에 모듈 명시
onListening 함수에
mqtt와 연결 할 수 있도록
connect_broker.js에
새로운 모듈을 작성 후 실행 시킴
106. 1. 현재 진행 상황
$ vi public/javascripts/connect_broker.js
MQTT 라이브러리 사용 명시,
DB와 연결
모듈을 정의하고 start라는 이름의 함수 작성
monitor 토픽을 Broker에 Sub
monitor 토픽이 pub가 되면
해당 내용을 DB에 저장
107. 1. 현재 진행 상황
$ vi public/javascripts/monitor.js
모니터 정보를 GET방식으로 요청 후 결과를 받아와서 테이블에 셋팅 함,
7주차의 코드와 유사
$ vi routes/monitor.js
GET 방식으로 요청이 들어오면 DB와 연결 후 monitor 테이블의 정보를 json
형식으로 반환함
108. 1. 현재 진행 상황
테스트 상황에서의 Topic과 메시지 후에 수정 필요함
현재 토픽 : monitor
센서 정보 일 때와 Actuator 정보 일 때와 구성이 다름 , 임의로 셋팅 함,
value는 보드에서 온도 정보를 가져와서 셋팅 함
센서 정보 actuator 정보
공통 : facility, management, DCS, value
센서만 : sensor
actuator만 : actuator, control_type
109. 1. 현재 진행 상황
정각마다 Broker에 시간 정보 Pub
마찬가지로 정각에 publish를 하는 모듈을 만든 후 사용
$vi bin/www
timer 모듈 가져옴
서버가 시작되면 수행하는 onListening()
함수에 timer().start()로 시작
110. 1. 현재 진행 상황
매 정각에 수행할 함수
스케쥴링 위해 node-schedule 라이브러리 사용
현재 테스트를 위해 매 시 30분에 실행되도록
해 둠