์ค๋๋ ๋ง์ดํฌ๋ก ์ ์ ๊ณตํ, ํต์ ์ฑ๋, ์ธํฐ๋ท ๊ธฐ์ ๋ฐ ์ธ๊ณต ์ง๋ฅ์ ๊ธ์ํ ๋ฐ์ ์ผ๋ก ์ธํด ์ค๋งํธ ํ์ ๋ํ ์ฃผ์ ๊ฐ ์ ์ ๋ ์ค์ํด์ง๊ณ ์์ต๋๋ค. ์ธ๊ฐ์ ์ฃผ๊ฑฐ๋ ์๊ธฐ์๋ ์ดํ ํฐ ๋ณํ๋ฅผ ๊ฒช์๊ณ , 4.0์ฐจ ์ฐ์
ํ๋ช
๊ณผ ์ฌ๋ฌผ์ธํฐ๋ท ์๋๋ฅผ ๋ง์ ํธ์ํ๊ณ ๊ธฐ๋ฅ์ ์ด๋ฉฐ ์์ ํด์ก์ต๋๋ค. ์ค๋งํธํฐ์ ์ฌ์ฉํด ์ํํธ๋ ์๊ณจ์ง์ ์ธ๊ณ ์ด๋์์๋ ์ ์ดํ ์ ์๋ ๋ณต์กํ ์ ๋ณด ์์คํ
์ผ๋ก ๋ฐ๊พธ๋ ์๋ฃจ์
์ด ์์ฅ์ ์ถ์๋๊ณ ์์ต๋๋ค. ๋ํ ์ธ๊ฐ๊ณผ ๊ธฐ๊ณ์ ์ํธ ์์ฉ์๋ ๋ ์ด์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ํ ์ง์์ด ํ์ํ์ง ์์ต๋๋ค. ์์ฑ ์ธ์ ๋ฐ ํฉ์ฑ ์๊ณ ๋ฆฌ์ฆ ๋๋ถ์ ์ฌ๋์ ๋ชจ๊ตญ์ด๋ก ์ค๋งํธ ํ์ ๋งํ ์ ์์ต๋๋ค.
ํ์ฌ ์์ฅ์ ๋์ ์๋ ์ผ๋ถ ์ค๋งํธ ํ ์์คํ ์ ํด๋ผ์ฐ๋ ๋น๋์ค ๊ฐ์ ์์คํ ์ ๋ ผ๋ฆฌ์ ๊ฐ๋ฐ์ด๋ฉฐ, ๊ฐ๋ฐ์๋ ๋ชจ๋ํฐ๋ง๋ฟ๋ง ์๋๋ผ ์๊ฒฉ ๊ฐ์ฒด ๊ด๋ฆฌ๋ฅผ ์ํ ํฌ๊ด์ ์ธ ์๋ฃจ์ ์ ํ์์ฑ์ ๊นจ๋ฌ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ์ ์๊ฐ ๊ฐ์ธ์ ์ผ๋ก ๊ฐ๋ฐํ๊ณ ์ด์ํ๋ ํด๋ผ์ฐ๋ ์ค๋งํธ ํ ์์คํ
์ ๋ชจ๋ ์ฃผ์ ๊ตฌ์ฑ ์์์ ๋ํด ์ค๋ช
ํ๋ ์ธ ๊ฐ์ง ๊ธฐ์ฌ ์๋ฆฌ์ฆ๋ฅผ ์ฌ๋ฌ๋ถ์ ๊ด์ฌ์ ๋ ๊ฒ์
๋๋ค. ์ฒซ ๋ฒ์งธ ๊ธฐ์ฌ๋ ์ค๋งํธ ํ ๋ด๋ถ์ ์ค์น๋ ํฐ๋ฏธ๋ ํด๋ผ์ด์ธํธ ์ฅ๋น์ ๋ํด ๋ค๋ฃจ๊ณ , ๋ ๋ฒ์งธ ๊ธฐ์ฌ๋ ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง ๋ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์์คํ
์ ์ํคํ
์ฒ์ ๋ํด, ๋ง์ง๋ง์ผ๋ก ์ธ ๋ฒ์งธ ๊ธฐ์ฌ๋ ๋ชจ๋ฐ์ผ ๋ฐ ๊ณ ์ ์ฅ์น์์ ์์คํ
์ ๊ด๋ฆฌํ๊ธฐ ์ํ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ํด ์ค๋ช
ํฉ๋๋ค.
์ค๋งํธ ํ ์ฅ๋น
๋จผ์ ์ผ๋ฐ ์ํํธ, ๋ค์ฐจ ๋๋ ๋ณ์ฅ์์ ์ค๋งํธ ํ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํด ์ด์ผ๊ธฐํ๊ฒ ์ต๋๋ค. ์ด๋ฅผ ์ํด์๋ ์์น์ ์ผ๋ก ๋ค์ ์ฅ๋น๋ฅผ ์ง์ ๋ฐฐ์นํด์ผ ํฉ๋๋ค.
- ๋ค์ํ ํ๊ฒฝ ๋งค๊ฐ๋ณ์๋ฅผ ์ธก์ ํ๋ ์ผ์;
- ์ธ๋ถ ๋ฌผ์ฒด์ ์์ฉํ๋ ์ก์ถ์์ดํฐ;
- ์ผ์ ์ธก์ ๋ฐ ๋ด์ฅ๋ ๋ก์ง์ ๋ฐ๋ผ ๊ณ์ฐ์ ์ํํ๊ณ ์ก์ถ์์ดํฐ์ ๋ช ๋ น์ ๋ด๋ฆฌ๋ ์ปจํธ๋กค๋ฌ์ ๋๋ค.
๋ค์ ๊ทธ๋ฆผ์ ์์ค์ ๋์ ์ผ์(1), ์นจ์ค์ ์จ๋(2) ๋ฐ ์กฐ๋ช (3), ์ฃผ๋ฐฉ์ ์ค๋งํธ ์์ผ(4) ๋ฐ ๋ณต๋์ ์๋ ๋น๋์ค ๊ฐ์ ์นด๋ฉ๋ผ(5).
ํ์ฌ RF433, Z-Wave, ZigBee, Bluetooth ๋ฐ WiFi ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ์๋ํ๋ ๋ฌด์ ์ผ์๊ฐ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค. ์ฃผ์ ์ฅ์ ์ ์ค์น ๋ฐ ์ฌ์ฉ์ด ๊ฐํธํ ๋ฟ๋ง ์๋๋ผ ๋น์ฉ์ด ์ ๋ ดํ๊ณ ์ ๋ขฐ์ฑ์ด ๋๋ค๋ ๊ฒ์
๋๋ค. ์ ์กฐ์
์ฒด๋ ์์ฌ ์ฅ์น๋ฅผ ๋์ค ์์ฅ์ ์ถ์ํ๊ณ ์ผ๋ฐ ์ฌ์ฉ์๊ฐ ์ก์ธ์คํ ์ ์๋๋ก ํ๊ธฐ ์ํด ๋
ธ๋ ฅํ๊ณ ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ผ์์ ์ก์ถ์์ดํฐ๋ ๋ฌด์ ์ธํฐํ์ด์ค๋ฅผ ํตํด ์ค๋งํธ ํ ์ปจํธ๋กค๋ฌ(6)์ ์ฐ๊ฒฐ๋ฉ๋๋ค. ์ค๋งํธ ํ ์ปจํธ๋กค๋ฌ๋ ์ด๋ฌํ ๋ชจ๋ ์ฅ์น๋ฅผ ๋จ์ผ ๋คํธ์ํฌ๋ก ๊ฒฐํฉํ๊ณ ์ ์ดํ๋ โโํน์ ๋ง์ดํฌ๋ก์ปดํจํฐ์ ๋๋ค.
๊ทธ๋ฌ๋ ์ผ๋ถ ์๋ฃจ์ ์ ์ผ์, ์ก์ถ์์ดํฐ ๋ฐ ์ปจํธ๋กค๋ฌ๋ฅผ ๋์์ ๊ฒฐํฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ค๋งํธ ํ๋ฌ๊ทธ๋ ์ผ์ ์ ๋ฐ๋ผ ์ผ์ง๊ฑฐ๋ ๊บผ์ง๋๋ก ํ๋ก๊ทธ๋๋ฐํ ์ ์์ผ๋ฉฐ, ํด๋ผ์ฐ๋ ๋น๋์ค ๊ฐ์ ์นด๋ฉ๋ผ๋ ๋์ ๊ฐ์ง๊ธฐ ์ ํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋น๋์ค๋ฅผ ๋ นํํ ์ ์์ต๋๋ค. ๊ฐ์ฅ ๊ฐ๋จํ ๊ฒฝ์ฐ์๋ ๋ณ๋์ ์ปจํธ๋กค๋ฌ ์์ด๋ ๊ฐ๋ฅํ์ง๋ง, ๋ค์ํ ์๋๋ฆฌ์ค๋ฅผ ๊ฐ์ถ ์ ์ฐํ ์์คํ ์ ๋ง๋ค๊ธฐ ์ํด์๋ ์ด๊ฒ์ด ํ์ํฉ๋๋ค.
์ค๋งํธ ํ ์ปจํธ๋กค๋ฌ๋ฅผ ๊ธ๋ก๋ฒ ๋คํธ์ํฌ์ ์ฐ๊ฒฐํ๋ ค๋ฉด ์ค๋ซ๋์ ๋ชจ๋ ๊ฐ์ ์์ ์ผ๋ฐ์ ์ธ ๊ฐ์ ์ ํ์ด ๋์ด์จ ์ผ๋ฐ ์ธํฐ๋ท ๋ผ์ฐํฐ(7)๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ์ค๋งํธ ํ ์ปจํธ๋กค๋ฌ๋ฅผ ์ ํธํ๋ ๋ ๋ค๋ฅธ ์ฃผ์ฅ์ด ์์ต๋๋ค. ์ธํฐ๋ท ์ฐ๊ฒฐ์ด ๋์ด์ง๋ฉด ํด๋ผ์ฐ๋ ์๋น์ค๊ฐ ์๋ ์ปจํธ๋กค๋ฌ ๋ด๋ถ์ ์ ์ฅ๋ ๋ ผ๋ฆฌ ๋ธ๋ก ๋๋ถ์ ์ค๋งํธ ํ์ด ๊ณ์ํด์ ์ ์์ ์ผ๋ก ์๋ํฉ๋๋ค.
์ค๋งํธ ํ ์ปจํธ๋กค๋ฌ
๋ณธ ๊ธ์์ ๋
ผ์ํ๋ ํด๋ผ์ฐ๋ ์ค๋งํธ ํ ์์คํ
์ฉ ์ปจํธ๋กค๋ฌ๋ ์ฑ๊ธ๋ณด๋ ๋ง์ดํฌ๋ก์ปดํจํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐ๋์๋ค.
์ปจํธ๋กค๋ฌ ์กฐ๋ฆฝ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ๋ง์ดํฌ๋ก์ปดํจํฐ(1)๊ฐ ํ๋ผ์คํฑ ์ผ์ด์ค(2)์ ์ค์น๋ ๋ค์ ์ํํธ์จ์ด๊ฐ ํฌํจ๋ microSD ํ์์ 8GB ๋ฉ๋ชจ๋ฆฌ ์นด๋(3)์ USB Z-Wave ๋คํธ์ํฌ ์ปจํธ๋กค๋ฌ(4)๊ฐ ํ๋ผ์คํฑ ์ผ์ด์ค์ ์ค์น๋ฉ๋๋ค. ํด๋น ์ฌ๋กฏ. ์ค๋งํธ ํ ์ปจํธ๋กค๋ฌ๋ 5V, 2.1A ์ ์ ์ด๋ํฐ(5) ๋ฐ USB - ๋ง์ดํฌ๋ก USB ์ผ์ด๋ธ(6)์ ํตํด ์ ์ ๊ณต๊ธ ์ฅ์น์ ์ฐ๊ฒฐ๋ฉ๋๋ค. ๊ฐ ์ปจํธ๋กค๋ฌ์๋ ๊ณ ์ ํ ์๋ณ ๋ฒํธ๊ฐ ์์ผ๋ฉฐ, ์ด๋ ์ฒ์ ์์ํ ๋ ๊ตฌ์ฑ ํ์ผ์ ๊ธฐ๋ก๋๋ฉฐ ํด๋ผ์ฐ๋ ์ค๋งํธ ํ ์๋น์ค์ ์ํธ ์์ฉํ๋ ๋ฐ ํ์ํฉ๋๋ค.
์ค๋งํธ ํ ์ปจํธ๋กค๋ฌ ์ํํธ์จ์ด๋ ์ด ๊ธฐ์ฌ์ ์ ์๊ฐ ์ด์ ์ฒด์ ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐํ์ต๋๋ค. ๋ฆฌ๋ ์ค ๋ผ์ฆ๋น์ ์คํธ๋ ์น. ์ด๋ ๋ค์๊ณผ ๊ฐ์ ์ฃผ์ ํ์ ์์คํ ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค.
- ์ค๋งํธ ํ ์ฅ๋น ๋ฐ ํด๋ผ์ฐ๋์์ ์ํธ ์์ฉ์ ์ํ ์๋ฒ ํ๋ก์ธ์ค;
- ์ปจํธ๋กค๋ฌ์ ๊ตฌ์ฑ ๋ฐ ์๋ ๋งค๊ฐ๋ณ์๋ฅผ ์ค์ ํ๊ธฐ ์ํ ๊ทธ๋ํฝ ์ฌ์ฉ์ ์ธํฐํ์ด์ค;
- ์ปจํธ๋กค๋ฌ ๊ตฌ์ฑ์ ์ ์ฅํ๊ธฐ ์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๋งํธ ํ ์ปจํธ๋กค๋ฌ๋ ์๋ฒ ๋๋ DBMS๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ๋ฉ๋๋ค.
๊ทธ๋ํฝ ์ธํฐํ์ด์ค ๋ง์ดํฌ๋กํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ PHP 7๋ก ๊ฐ๋ฐ๋ ์ค๋งํธ ํ ์ปจํธ๋กค๋ฌ
(์ฌ์ง์ ํด๋ฆญํ์๋ฉด ๋ ๋์ ํด์๋๋ก ๋ณด์ค ์ ์์ต๋๋ค)
๊ทธ๋ํฝ ์ธํฐํ์ด์ค์ ์ฃผ์ ๊ธฐ๋ฅ์ ์ค๋งํธ ํ ์ฅ๋น(IP ๊ฐ์ ์นด๋ฉ๋ผ ๋ฐ ์ผ์)๋ฅผ ์ปจํธ๋กค๋ฌ์ ์ฐ๊ฒฐํ๋ ๊ฒ์ ๋๋ค. ์น ์ ํ๋ฆฌ์ผ์ด์ ์ SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ปจํธ๋กค๋ฌ์ ์ฐ๊ฒฐ๋ ์ฅ์น์ ๊ตฌ์ฑ๊ณผ ํ์ฌ ์ํ๋ฅผ ์ฝ์ต๋๋ค. ์ปจํธ๋กค๋ฌ ๊ตฌ์ฑ์ ๋ณ๊ฒฝํ๊ธฐ ์ํด ์๋ฒ ํ๋ก์ธ์ค์ RESTful API ์ธํฐํ์ด์ค๋ฅผ ํตํด JSON ํ์์ ์ ์ด ๋ช ๋ น์ ๋ณด๋ ๋๋ค.
์๋ฒ ํ๋ก์ธ์ค
์๋ฒ ํ๋ก์ธ์ค - ์ค๋งํธ ํ์ ๊ธฐ์ด๋ฅผ ํ์ฑํ๋ ์ ๋ณด ํ๋ก์ธ์ค ์๋ํ์ ๋ํ ๋ชจ๋ ์ฃผ์ ์์ ์ ์ํํ๋ ํต์ฌ ๊ตฌ์ฑ ์์: ๊ฐ๊ฐ ๋ฐ์ดํฐ ์์ ๋ฐ ์ฒ๋ฆฌ, ๋ด์ฅ๋ ๋ก์ง์ ๋ฐ๋ผ ์ ์ด ์กฐ์น ์คํ. ์๋ฒ ํ๋ก์ธ์ค์ ๋ชฉ์ ์ ์ค๋งํธ ํ ์ฅ๋น์ ์ํธ ์์ฉํ๊ณ , ์์ฐ ๋ ผ๋ฆฌ ๊ท์น์ ์คํํ๊ณ , ๊ทธ๋ํฝ ์ธํฐํ์ด์ค์ ํด๋ผ์ฐ๋๋ก๋ถํฐ ๋ช ๋ น์ ์์ ๋ฐ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋๋ค. ๊ณ ๋ ค ์ค์ธ ์ค๋งํธ ํ ์ปจํธ๋กค๋ฌ์ ์๋ฒ ํ๋ก์ธ์ค๋ C++๋ก ๊ฐ๋ฐ๋ ๋ฉํฐ์ค๋ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ๊ตฌํ๋์ด ๋ณ๋์ ์๋น์ค๋ก ์ถ์๋๋ค. ์์คํ ์ด์ ์ฒด์ ๋ฆฌ๋ ์ค ๋ผ์ฆ๋น์.
์๋ฒ ํ๋ก์ธ์ค์ ์ฃผ์ ๋ธ๋ก์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ฉ์์ง ๊ด๋ฆฌ์;
- IP ์นด๋ฉ๋ผ ์๋ฒ;
- Z-Wave ์ฅ์น ์๋ฒ;
- ์์ฐ ๋ ผ๋ฆฌ ๊ท์น์ ์๋ฒ;
- ์ปจํธ๋กค๋ฌ ๊ตฌ์ฑ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ ๋ ผ๋ฆฌ์ ๊ท์น ๋ธ๋ก
- ๊ทธ๋ํฝ ์ธํฐํ์ด์ค์์ ์ํธ ์์ฉ์ ์ํ RESTful API ์๋ฒ
- ํด๋ผ์ฐ๋์ ์ํธ์์ฉํ๊ธฐ ์ํ MQTT ํด๋ผ์ด์ธํธ์ ๋๋ค.
์๋ฒ ํ๋ก์ธ์ค ๋ธ๋ก์ ๋ณ๋์ ์ค๋ ๋๋ก ๊ตฌํ๋๋ฉฐ, ๊ทธ ์ฌ์ด์ ์ ๋ณด๋ JSON ํ์(๋๋ ํ๋ก์ธ์ค ๋ฉ๋ชจ๋ฆฌ์์ ์ด ํ์์ ๋ํ๋ด๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ)์ ๋ฉ์์ง ํ์์ผ๋ก ์ ์ก๋ฉ๋๋ค.
์๋ฒ ํ๋ก์ธ์ค์ ์ฃผ์ ๊ตฌ์ฑ ์์๋ ๋ฉ์์ง ๊ด๋ฆฌ์, JSON ๋ฉ์์ง๋ฅผ ๋ชจ๋ ์๋ฒ ํ๋ก์ธ์ค ๋ธ๋ก์ผ๋ก ๋ผ์ฐํ
ํฉ๋๋ค. JSON ๋ฉ์์ง ์ ๋ณด ํ๋์ ์ ํ๊ณผ ํ์ฉํ ์ ์๋ ๊ฐ์ ๋ค์ ํ์ ๋์ด๋์ด ์์ต๋๋ค.
๊ธฐ๊ธฐ ์ข
๋ฅ
ํ๋กํ ์ฝ
๋ฉ์์ง ์ ํ
์ฅ์น์ํ
๋ช
๋ น
์นด๋ฉ๋ผ
์จ๋นํ
์ผ์๋ฐ์ดํฐ
on
์คํธ๋ฆฌ๋ฐ(์ผ๊ธฐ/๋๊ธฐ)
๊ฐ์ง๊ธฐ
์ฆ์จ์ด๋ธ
๋ช
๋ น
์คํ
๋
น์(์ผ๊ธฐ/๋๊ธฐ)
์ดํํฐ
MQTT
๋น์ฆ๋์ค๋
ผ๋ฆฌ๊ท์น
์คํธ๋ฆฌ๋ฐ(์ผ๊ธฐ/๋๊ธฐ)
์ฅ์น(์ถ๊ฐ/์ ๊ฑฐ)
๋น์ฆ๋์ค๋ก์ง
๊ตฌ์ฑ๋ฐ์ดํฐ
๋
น์(์ผ๊ธฐ/๋๊ธฐ)
๋ธ๋ฃจํฌ์ค
์ฅ์น์ํ
์ค๋ฅ
์์ดํ์ด
rf
์๋ฅผ ๋ค์ด ์นด๋ฉ๋ผ ๋์ ๊ฐ์ง๊ธฐ์ ๋ฉ์์ง๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
{
"vendor": "*****",
"version": "3.0.0",
"timestampMs": "1566293475475",
"clientType": "gateway",
"deviceId": "1616453d-30cd-44b7-9bf0-************",
"deviceType": "camera",
"protocol": "onvif",
"messageType": "sensorData",
"sensorType": "camera",
"label": "motionDetector",
"sensorData": "on"
}
์์ฐ ๋ ผ๋ฆฌ
๋์คํจ์ฒ๋ก๋ถํฐ ๋ฉ์์ง๋ฅผ ๋ฐ๊ฑฐ๋ ๋ณด๋ด๊ธฐ ์ํด ์๋ฒ ํ๋ก์ธ์ค ๋ธ๋ก์ ํน์ ์ ํ์ ๋ฉ์์ง๋ฅผ ๊ตฌ๋ ํฉ๋๋ค. ๊ตฌ๋ ์ ๋ค์ ์ ํ์ ์์ฐ ๋ ผ๋ฆฌ ๊ท์น์ ๋๋ค. โ๊ทธ๋ ๋ค๋ฉดโฆ๊ทธ๋ผโฆโ, JSON ํ์์ผ๋ก ํ์๋จ, ์๋ฒ ํ๋ก์ธ์ค ๋ธ๋ก ๋ด๋ถ์ ๋ฉ์์ง ํธ๋ค๋ฌ์ ๋ํ ๋งํฌ. ์๋ฅผ ๋ค์ด, IP ์นด๋ฉ๋ผ ์๋ฒ๊ฐ GUI ๋ฐ ํด๋ผ์ฐ๋๋ก๋ถํฐ ๋ช ๋ น์ ์์ ํ๋๋ก ํ์ฉํ๋ ค๋ฉด ๋ค์ ๊ท์น์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
{
"if": {
"and": [{
"equal": {
"deviceId": "1616453d-30cd-44b7-9bf0-************"
}
},
{
"equal": {
"messageType": "command"
}
}
]
},
"then": {
"result": "true"
}
}
์ ๋ช ์๋ ์กฐ๊ฑด์ ํด๋นํ๋ ๊ฒฝ์ฐ ์ ๋ก (์ผ์ชฝ) ๊ท์น์ด ์ฐธ์ด๋ฉด ๋ง์กฑ๋ฉ๋๋ค. ๋น์ฐํ ๊ฒฐ๊ณผ (์ค๋ฅธ์ชฝ) ๊ท์น์ ์ฌ์ฉํ๋ฉฐ ํธ๋ค๋ฌ๋ JSON ๋ฉ์์ง ๋ณธ๋ฌธ์ ์ก์ธ์คํฉ๋๋ค. ์ ํ ํญ๋ชฉ์ JSON ํค-๊ฐ ์์ ๋น๊ตํ๋ ๋ ผ๋ฆฌ ์ฐ์ฐ์๋ฅผ ์ง์ํฉ๋๋ค.
- "๊ฐ์"๊ณผ ๊ฐ์;
- "not_equal"๊ณผ ๊ฐ์ง ์์;
- ๋ "์ ๋ค";
- ๋ "๋";
- "less_or_equal"๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์;
- "greater_or_equal"๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ต๋๋ค.
๋น๊ต ๊ฒฐ๊ณผ๋ ๋ถ์ธ ๋์ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋ก ์ฐ๊ด๋ ์ ์์ต๋๋ค.
- ๊ทธ๋ฆฌ๊ณ "๊ทธ๋ฆฌ๊ณ "
- ๋๋ "๋๋";
- "์๋์"๊ฐ ์๋๋๋ค.
๋ฐ๋ผ์ ์ฐ์ฐ์์ ํผ์ฐ์ฐ์๋ฅผ ํด๋๋ ํ๊ธฐ๋ฒ์ผ๋ก ์์ฑํ๋ฉด ๋ง์ ์์ ๋งค๊ฐ๋ณ์๊ฐ ํฌํจ๋ ๋งค์ฐ ๋ณต์กํ ์กฐ๊ฑด์ ๋ง๋ค ์ ์์ต๋๋ค.
JSON ๋ฉ์์ง์ JSON ํ์์ ์์ฐ ๊ท์น์ โโ๊ธฐ๋ฐ์ผ๋ก ํ๋ ์ ํํ ๋์ผํ ๋ฉ์ปค๋์ฆ์ด ์์ฐ ๋ ผ๋ฆฌ ์๋ฒ ๋ธ๋ก์์ ์ฌ์ฉ๋์ด ์ค๋งํธ ํ ์ผ์์ ๊ฐ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ง์์ ํํํ๊ณ ๋ ผ๋ฆฌ์ ์ถ๋ก ์ ์ํํฉ๋๋ค.
๋ชจ๋ฐ์ผ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์๋ ์ค๋งํธ ํ์ด ์๋ํด์ผ ํ๋ ์๋๋ฆฌ์ค๋ฅผ ๋ง๋ญ๋๋ค. ์๋ฅผ ๋ค์ด: โํ๊ด๋ฌธ ์ด๋ฆผ ์ผ์๊ฐ ์๋ํ๋ฉด ๋ณต๋์ ๋ถ์ ์ผ์ฃผ์ธ์โ. ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ผ์(์ด๋ฆผ ์ผ์)์ ์ก์ถ์์ดํฐ(์ค๋งํธ ์์ผ ๋๋ ์ค๋งํธ ๋จํ)์ ์๋ณ์๋ฅผ ์ฝ๊ณ JSON ํ์์ ๋ ผ๋ฆฌ ๊ท์น์ ์์ฑํ์ฌ ์ค๋งํธ ํ ์ปจํธ๋กค๋ฌ๋ก ์ ์กํฉ๋๋ค. ์ด ๋ฉ์ปค๋์ฆ์ ์๋ฆฌ์ฆ์ ์ธ ๋ฒ์งธ ๊ธฐ์ฌ์์ ๋ ์์ธํ ๋ ผ์ํ ์์ ์ด๋ฉฐ, ์ฌ๊ธฐ์๋ ์ค๋งํธ ํ ๊ด๋ฆฌ๋ฅผ ์ํ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํด ์ด์ผ๊ธฐํ ๊ฒ์ ๋๋ค.
์์์ ์ค๋ช
ํ ์์ฐ ๋
ผ๋ฆฌ ๋ฉ์ปค๋์ฆ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋ฉ๋๋ค.
void CRuleEngine::Process(PProperties pFact)
{
m_pActions->clear();
rapidjson::Reader reader;
for(TStringMap::value_type& rRule : m_Rules)
{
std::string sRuleId = rRule.first;
std::string sRuleBody = rRule.second;
CRuleHandler ruleHandler(pFact);
rapidjson::StringStream ruleStream(sRuleBody.c_str());
rapidjson::ParseResult parseResult = reader.Parse(ruleStream, ruleHandler);
if(!parseResult)
{
m_Logger.LogMessage(
NLogger2::ePriorityLevelError,
std::string("JSON parse error"),
"CRuleEngine::Process()",
std::string("RuleId: ") + sRuleId);
}
PProperties pAction = ruleHandler.GetAction();
if(pAction)
{
pAction->Set("ruleId", sRuleId);
m_pActions->push_back(pAction);
}
}
}
์ฌ๊ธฐ์ ํฉํธ โ JSON ๋ฉ์์ง์ ํค-๊ฐ ์์ ํฌํจํ๋ ๊ตฌ์กฐ, m_๊ท์น โ ์์ฑ ๊ท์น์ ๋ฌธ์์ด ๋ฐฐ์ด์ ๋๋ค. ์์ ๋ฉ์์ง์ ์์ฑ ๊ท์น์ ๋น๊ต๋ ๋ค์ ๊ธฐ๋ฅ์์ ์ํ๋ฉ๋๋ค. reader.Parse(ruleStream, ruleHandler)์ด๋์์ ๊ท์น ์ฒ๋ฆฌ๊ธฐ ๋ถ์ธ ๋ฐ ๋น๊ต ์ฐ์ฐ์์ ๋ ผ๋ฆฌ๋ฅผ ํฌํจํ๋ ๊ฐ์ฒด์ ๋๋ค. sRuleId โ ์ค๋งํธ ํ ์ปจํธ๋กค๋ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ด์ ๊ท์น์ ์ ์ฅํ๊ณ ํธ์งํ ์ ์๋ ๊ณ ์ ํ ๊ท์น ์๋ณ์์ ๋๋ค. m_p์ก์ โ ๋ ผ๋ฆฌ์ ์ถ๋ก ๊ฒฐ๊ณผ๊ฐ ํฌํจ๋ ๋ฐฐ์ด: ๊ท์น ๋ฒ ์ด์ค์ ๊ฒฐ๊ณผ๋ฅผ ํฌํจํ๊ณ ๊ตฌ๋ ์ ์ค๋ ๋๊ฐ ์ด๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋ฉ์์ง ๊ด๋ฆฌ์๋ก ์ถ๊ฐ๋ก ์ ์ก๋๋ JSON ๋ฉ์์ง์ ๋๋ค.
RapidJSON ์ฑ๋ฅ์ ๋ค์ ๊ธฐ๋ฅ๊ณผ ์ ์ฌํฉ๋๋ค. strlen (), ์ต์ ์์คํ ๋ฆฌ์์ค ์๊ตฌ ์ฌํญ์ ์ถฉ์กฑํ๋ฉด ์๋ฒ ๋๋ ์ฅ์น์์ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. JSON ํ์์ ๋ฉ์์ง์ ๋ ผ๋ฆฌ ๊ท์น์ ์ฌ์ฉํ๋ฉด ์ค๋งํธ ํ ์ปจํธ๋กค๋ฌ์ ๋ชจ๋ ๊ตฌ์ฑ ์์ ๊ฐ์ ์ ์ฐํ ์ ๋ณด ๊ตํ ์์คํ ์ ๊ตฌํํ ์ ์์ต๋๋ค.
Z-Wave ์ผ์ ๋ฐ ์ก์ถ์์ดํฐ
์ค๋งํธ ํ์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ ์ธ๋ถ ํ๊ฒฝ์ ๋ค์ํ ๋ณ์๋ฅผ ๋
๋ฆฝ์ ์ผ๋ก ์ธก์ ํ๊ณ ์ํฉ์ ๋ฐ๋ผ ์ ์ฉํ ๊ธฐ๋ฅ์ ์ํํ ์ ์๋ค๋ ์ ์ด๋ค. ์ด๋ฅผ ์ํด ์ผ์์ ์ก์ถ์์ดํฐ๊ฐ ์ค๋งํธ ํ ์ปจํธ๋กค๋ฌ์ ์ฐ๊ฒฐ๋ฉ๋๋ค. ํ์ฌ ๋ฒ์ ์์๋ ํ๋กํ ์ฝ์ ์ฌ์ฉํ์ฌ ์๋ํ๋ ๋ฌด์ ์ฅ์น์
๋๋ค.
์ด์ ์์ฅ์์ ์๋นํ ๋ค์ํ Z-Wave ์ฅ์น๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. ๋ช ๊ฐ์ง ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
- Zipato PAN16 ์ค๋งํธ ์์ผ์ ์ ๊ธฐ ๋คํธ์ํฌ์ ์ ๊ธฐ ์๋น(kWh), ์ ๋ ฅ(W), ์ ์(V) ๋ฐ ์ ๋ฅ(A) ๋งค๊ฐ๋ณ์๋ฅผ ์ธก์ ํ ์ ์์ต๋๋ค. ๋ํ ์ฐ๊ฒฐ๋ ์ ๊ธฐ ์ ํ์ ์ ์ดํ ์ ์๋ ์ค์์น๊ฐ ๋ด์ฅ๋์ด ์์ต๋๋ค.
- Neo Coolcam ๋์ถ ์ผ์๋ ์๊ฒฉ ํ๋ก๋ธ์ ์ ์ ์ ๋ซ์ ์ ์ถ๋ ์ก์ฒด์ ์กด์ฌ๋ฅผ ๊ฐ์งํฉ๋๋ค.
- Zipato PH-PSG01 ์ฐ๊ธฐ ์ผ์๋ ์ฐ๊ธฐ ์ ์๊ฐ ๊ฐ์ค ๋ถ์๊ธฐ ์ฑ๋ฒ์ ๋ค์ด๊ฐ ๋ ํธ๋ฆฌ๊ฑฐ๋ฉ๋๋ค.
- Neo Coolcam ๋ชจ์ ์ผ์๋ ์ธ์ฒด์ ์ ์ธ์ ๋ฐฉ์ฌ๋ฅผ ๋ถ์ํฉ๋๋ค. ์ถ๊ฐ์ ์ผ๋ก ๊ด ์ผ์(Lx)๊ฐ ์์ต๋๋ค.
- ๋ฉํฐ์ผ์ Philio PST02-A๋ ์จ๋(ยฐC), ์กฐ๋ช (%), ๋ฌธ ์ด๋ฆผ, ์ค๋ด ์ฌ๋ ์ ๋ฌด๋ฅผ ์ธก์ ํฉ๋๋ค.
- ์ผ์๊ฐ ์ฐ๊ฒฐ๋๋ Z-Wave USB ์คํฑ ZME E UZB1 ๋คํธ์ํฌ ์ปจํธ๋กค๋ฌ์ ๋๋ค.
์ฅ์น์ ์ปจํธ๋กค๋ฌ๊ฐ ๋์ผํ ์ฃผํ์์์ ์๋ํ๋ ๊ฒ์ด ๋งค์ฐ ์ค์ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฐ๊ฒฐ ์ ์๋ก๋ฅผ ๋ณผ ์ ์์ต๋๋ค. ํ๋์ Z-Wave ๋คํธ์ํฌ ์ปจํธ๋กค๋ฌ์ ์ต๋ 232๊ฐ์ ์ฅ์น๋ฅผ ์ฐ๊ฒฐํ ์ ์์ผ๋ฉฐ ์ด๋ ์ํํธ๋ ์๊ณจ์ง์ ์ถฉ๋ถํฉ๋๋ค. ์ค๋ด์์ ๋คํธ์ํฌ ์ ์ฉ ๋ฒ์๋ฅผ ํ์ฅํ๋ ค๋ฉด ์ค๋งํธ ์์ผ์ ์ ํธ ์ค๊ณ๊ธฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด์ ๋จ๋ฝ์์ ์ค๋ช
ํ ์ค๋งํธ ํ ์ปจํธ๋กค๋ฌ ์๋ฒ ํ๋ก์ธ์ค์์ Z-Wave ์๋ฒ๋ Z-Wave ์ฅ์น์์ ์ํธ ์์ฉ์ ๋ด๋นํฉ๋๋ค. ์ผ์๋ก๋ถํฐ ์ ๋ณด๋ฅผ ์์ ํ๊ธฐ ์ํด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
{
"vendor": "*****",
"version": "3.0.0",
"timestampMs": "1566479791290",
"clientType": "gateway",
"deviceId": "20873eb0-dd5e-4213-a175-************",
"deviceType": "sensor",
"protocol": "zwave",
"messageType": "sensorData",
"homeId": "0xefa0cfa7",
"nodeId": "20",
"sensorType": "METER",
"label": "Voltage",
"sensorData": "229.3",
"units": "V"
}
๊ทธ๋ฐ ๋ค์ ๊ตฌ๋ ์ ์ค๋ ๋๊ฐ ์ด๋ฅผ ์์ ํ ์ ์๋๋ก ์๋ฒ ํ๋ก์ธ์ค์ ๋ฉ์์ง ๊ด๋ฆฌ์๋ก ์ ๋ฌ๋ฉ๋๋ค. ๊ธฐ๋ณธ ๊ตฌ๋ ์๋ ๋ ผ๋ฆฌ ๊ท์น์ ์ ํ ํญ๋ชฉ์ ์๋ ๋ฉ์์ง ํ๋ ๊ฐ๊ณผ ์ผ์นํ๋ ํ๋ก๋์ ๋ ผ๋ฆฌ ์๋ฒ์ ๋๋ค. ์ ์ด ๋ช ๋ น์ด ํฌํจ๋ ์ถ๋ก ๊ฒฐ๊ณผ๋ ๋ฉ์์ง ๊ด๋ฆฌ์๋ก ๋ค์ ์ ์ก๋๊ณ ๊ฑฐ๊ธฐ์์ Z-Wave ์๋ฒ๋ก ์ด๋ํ์ฌ ์ด๋ฅผ ๋์ฝ๋ฉํ์ฌ Z-Wave ๋คํธ์ํฌ USB ์ปจํธ๋กค๋ฌ๋ก ๋ณด๋ ๋๋ค. ๊ทธ๋ฐ ๋ค์ ํ๊ฒฝ ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ์ก์ถ์์ดํฐ์ ๋ค์ด๊ฐ ์ค๋งํธ ํ์ด ์ ์ฉํ ์์ ์ ์ํํฉ๋๋ค.
(์ฌ์ง์ ํด๋ฆญํ์๋ฉด ๋ ๋์ ํด์๋๋ก ๋ณด์ค ์ ์์ต๋๋ค)
Z-Wave ์ฅ์น ์ฐ๊ฒฐ์ ์ค๋งํธ ํ ์ปจํธ๋กค๋ฌ์ ๊ทธ๋ํฝ ์ธํฐํ์ด์ค์์ ์ํ๋ฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด ์ฅ์น ๋ชฉ๋ก์ด ์๋ ํ์ด์ง๋ก ์ด๋ํ์ฌ "์ถ๊ฐ" ๋ฒํผ์ ํด๋ฆญํ์ธ์. RESTful API ์ธํฐํ์ด์ค๋ฅผ ํตํ ์ถ๊ฐ ๋ช ๋ น์ ์๋ฒ ํ๋ก์ธ์ค์ ๋ค์ด๊ฐ ๋ค์ ๋ฉ์์ง ๊ด๋ฆฌ์์ ์ํด Z-Wave ์๋ฒ๋ก ์ ์ก๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฉด Z-Wave ๋คํธ์ํฌ USB ์ปจํธ๋กค๋ฌ๊ฐ ์ฅ์น ์ถ๊ฐ๋ฅผ ์ํ ํน์ ๋ชจ๋๋ก ์ ํ๋ฉ๋๋ค. ๋ค์์ผ๋ก, Z-Wave ์ฅ์น์์ ์๋น์ค ๋ฒํผ์ ์ฌ๋ฌ ๋ฒ ๋น ๋ฅด๊ฒ ๋๋ฌ์ผ ํฉ๋๋ค(3์ด ๋ด์ 1,5ํ ๋๋ฆ). USB ์ปจํธ๋กค๋ฌ๋ ์ฅ์น๋ฅผ ๋คํธ์ํฌ์ ์ฐ๊ฒฐํ๊ณ ์ฅ์น์ ๋ํ ์ ๋ณด๋ฅผ Z-Wave ์๋ฒ๋ก ๋ณด๋ ๋๋ค. ๊ทธ๋ฌ๋ฉด ์ ์ฅ์น์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ํญ๋ชฉ์ด ์์ฑ๋ฉ๋๋ค. ์ง์ ๋ ์๊ฐ ๊ฐ๊ฒฉ์ด ์ง๋๋ฉด ๊ทธ๋ํฝ ์ธํฐํ์ด์ค๊ฐ Z-Wave ์ฅ์น ๋ชฉ๋ก ํ์ด์ง๋ก ๋์๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ ๋ณด๋ฅผ ์ฝ๊ณ ๋ชฉ๋ก์ ์ ์ฅ์น๋ฅผ ํ์ํฉ๋๋ค. ๊ฐ ์ฅ์น๋ ํ๋ก๋์ ์ถ๋ก ๊ท์น๊ณผ ํด๋ผ์ฐ๋์์ ์์ ํ ๋ ์ฌ์ฉ๋๋ ๊ณ ์ ํ ์๋ณ์๋ฅผ ๋ฐ์ต๋๋ค. ์ด ์๊ณ ๋ฆฌ์ฆ์ ์๋์ UML ๋ค์ด์ด๊ทธ๋จ์ ํ์๋ฉ๋๋ค.
(์ฌ์ง์ ํด๋ฆญํ์๋ฉด ๋ ๋์ ํด์๋๋ก ๋ณด์ค ์ ์์ต๋๋ค)
IP ์นด๋ฉ๋ผ ์ฐ๊ฒฐ
์ด ๊ธฐ์ฌ์์ ๋ ผ์๋ ํด๋ผ์ฐ๋ ์ค๋งํธ ํ ์์คํ ์ ์ ์๊ฐ ๊ฐ๋ฐํ ํด๋ผ์ฐ๋ ์์ ๊ฐ์ ์์คํ ์ ์ ๊ทธ๋ ์ด๋๋ก ์๋ ๋์ ์์ฅ์ ์ถ์๋์์ผ๋ฉฐ ๋ฌ์์์ ๋ง์ด ์ค์น๋์์ต๋๋ค.
ํด๋ผ์ฐ๋ ์์ ๊ฐ์ ์์คํ ์ ๊ฒฝ์ฐ ๊ฐ์ฅ ์ฌ๊ฐํ ๋ฌธ์ ์ค ํ๋๋ ํตํฉ์ ์ํํ ์ ์๋ ์ฅ๋น์ ์ ํ์ด ์ ํ๋์ด ์๋ค๋ ๊ฒ์ ๋๋ค. ํด๋ผ์ฐ๋ ์ฐ๊ฒฐ์ ๋ด๋นํ๋ ์ํํธ์จ์ด๋ ๋น๋์ค ์นด๋ฉ๋ผ ๋ด๋ถ์ ์ค์น๋์ด ํ๋์จ์ด(ํ๋ก์ธ์ ๋ฐ ์ฌ์ ๋ฉ๋ชจ๋ฆฌ ์)์ ์ฆ์ ์ฌ๊ฐํ ์๊ตฌ ์ฌํญ์ ๋ถ๊ณผํฉ๋๋ค. ์ด๋ ์ฃผ๋ก ์ผ๋ฐ IP ์นด๋ฉ๋ผ์ ๋นํด ํด๋ผ์ฐ๋ CCTV ์นด๋ฉ๋ผ์ ๊ฐ๊ฒฉ์ด ๋ ๋์ ์ด์ ๋ฅผ ์ค๋ช ํฉ๋๋ค. ๋ํ ์นด๋ฉ๋ผ ํ์ผ ์์คํ ๊ณผ ํ์ํ ๋ชจ๋ ๊ฐ๋ฐ ๋๊ตฌ์ ๋ํ ์ก์ธ์ค ๊ถํ์ ์ป์ผ๋ ค๋ฉด CCTV ์นด๋ฉ๋ผ ์ ์กฐ์ ์ฒด์์ ๊ธด ํ์ ๋จ๊ณ๊ฐ ํ์ํฉ๋๋ค.
๋ฐ๋ฉด, ๋ชจ๋ ์ต์ IP ์นด๋ฉ๋ผ์๋ ๋ค๋ฅธ ์ฅ๋น(ํนํ ๋น๋์ค ๋ ์ฝ๋)์์ ์ํธ ์์ฉ์ ์ํ ํ์ค ํ๋กํ ์ฝ์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ํ์ค ํ๋กํ ์ฝ์ ํตํด ์ฐ๊ฒฐํ๊ณ IP ์นด๋ฉ๋ผ์์ ํด๋ผ์ฐ๋๋ก ๋น๋์ค ์คํธ๋ฆผ์ ๋ธ๋ก๋์บ์คํธํ๋ ๋ณ๋์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋ผ์ฐ๋ ๋น๋์ค ๊ฐ์ ์์คํ
์ ์๋นํ ๊ฒฝ์ ์ฐ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ํ, ํด๋ผ์ด์ธํธ๊ฐ ์ด๋ฏธ ๋จ์ IP ์นด๋ฉ๋ผ ๊ธฐ๋ฐ์ ์์๊ฐ์ ์์คํ
์ ์ค์นํ๋ค๋ฉด ์ด๋ฅผ ํ์ฅํด ๋ณธ๊ฒฉ์ ์ธ ํด๋ผ์ฐ๋ ์ค๋งํธํ์ผ๋ก ์ ํํ๋ ๊ฒ๋ ๊ฐ๋ฅํด์ง๋ค.
ํ์ฌ ๋ชจ๋ IP ์นด๋ฉ๋ผ ์ ์กฐ์
์ฒด์์ ์์ธ ์์ด ์ง์๋๋ IP ๋น๋์ค ๊ฐ์ ์์คํ
์ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ํ๋กํ ์ฝ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
$ wsdl2h -o onvif.h
https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl
https://www.onvif.org/ver10/events/wsdl/event.wsdl
https://www.onvif.org/ver10/media/wsdl/media.wsdl
https://www.onvif.org/ver20/ptz/wsdl/ptz.wsdl
$ soapcpp2 -Cwvbj -c++11 -d cpp_files/onvif -i onvif.h
๊ฒฐ๊ณผ์ ์ผ๋ก ์ฐ๋ฆฌ๋ C++๋ก ๋ ํค๋ "*.h"์ ์์ค "*.cpp" ํ์ผ ์ธํธ๋ฅผ ์ป์ต๋๋ค. ์ด ํ์ผ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ง์ ๋ฐฐ์นํ๊ณ GCC ์ปดํ์ผ๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํ์ผํ ์ ์์ต๋๋ค. ๊ธฐ๋ฅ์ด ๋ง๊ธฐ ๋๋ฌธ์ ์ฝ๋๊ฐ ํฌ๊ณ ์ถ๊ฐ์ ์ธ ์ต์ ํ๊ฐ ํ์ํฉ๋๋ค. Raspberry Pi 3 ๋ชจ๋ธ B+ ๋ง์ดํฌ๋ก์ปดํจํฐ๋ ์ด ์ฝ๋๋ฅผ ์คํํ๊ธฐ์ ์ถฉ๋ถํ ์ฑ๋ฅ์ ๊ฐ์ถ๊ณ ์์ง๋ง ์ฝ๋๋ฅผ ๋ค๋ฅธ ํ๋ซํผ์ผ๋ก ํฌํ ํด์ผ ํ๋ ๊ฒฝ์ฐ ์ฌ๋ฐ๋ฅธ ํ๋ก์ธ์ ์ํคํ ์ฒ์ ์์คํ ๋ฆฌ์์ค๋ฅผ ์ ํํด์ผ ํฉ๋๋ค.
ONVIF ํ์ค์ ์ง์ํ๋ IP ์นด๋ฉ๋ผ๋ ๋ก์ปฌ ๋คํธ์ํฌ์์ ์๋ํ ๋ ์ฃผ์๊ฐ ์๋ ํน์ ๋ฉํฐ์บ์คํธ ๊ทธ๋ฃน์ ์ฐ๊ฒฐ๋ฉ๋๋ค. 239.255.255.250. ํ๋กํ ์ฝ์ด ์์ต๋๋ค
์ค๋งํธ ํ ์ปจํธ๋กค๋ฌ์ ๊ทธ๋ํฝ ์ธํฐํ์ด์ค๋ PHP์์ IP ์นด๋ฉ๋ผ ๊ฒ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋๋ฐ, ์ด๋ XML ๋ฉ์์ง๋ฅผ ํตํด ์น ์๋น์ค์ ์ํธ ์์ฉํ ๋ ๋งค์ฐ ํธ๋ฆฌํฉ๋๋ค. ๋ฉ๋ด ํญ๋ชฉ์ ์ ํํ ๋ ์ฅ์น > IP ์นด๋ฉ๋ผ > ๊ฒ์ ์ค IP ์นด๋ฉ๋ผ ๊ฒ์ ์๊ณ ๋ฆฌ์ฆ์ด ์คํ๋์ด ๊ฒฐ๊ณผ๊ฐ ํ ํ์์ผ๋ก ํ์๋ฉ๋๋ค.
(์ฌ์ง์ ํด๋ฆญํ์๋ฉด ๋ ๋์ ํด์๋๋ก ๋ณด์ค ์ ์์ต๋๋ค)
์ปจํธ๋กค๋ฌ์ ์นด๋ฉ๋ผ๋ฅผ ์ถ๊ฐํ๋ฉด ํด๋ผ์ฐ๋์ ์ํธ ์์ฉํ๋ ์ค์ ์ ์ง์ ํ ์ ์์ต๋๋ค. ๋ํ ์ด ๋จ๊ณ์์๋ ๋์ค์ ํด๋ผ์ฐ๋ ๋ด์์ ์ฝ๊ฒ ์๋ณํ ์ ์๋ ๊ณ ์ ํ ์ฅ์น ์๋ณ์๊ฐ ์๋์ผ๋ก ํ ๋น๋ฉ๋๋ค.
๋ค์์ผ๋ก, ์ถ๊ฐ๋ ์นด๋ฉ๋ผ์ ๋ชจ๋ ๋งค๊ฐ๋ณ์๋ฅผ ํฌํจํ๋ JSON ํ์์ ๋ฉ์์ง๊ฐ ์์ฑ๋์ด RESTful API ๋ช
๋ น์ ํตํด ์ค๋งํธ ํ ์ปจํธ๋กค๋ฌ์ ์๋ฒ ํ๋ก์ธ์ค๋ก ์ ์ก๋ฉ๋๋ค. ์ฌ๊ธฐ์ ์นด๋ฉ๋ผ ๋งค๊ฐ๋ณ์๋ ๋์ฝ๋ฉ๋์ด ๋ด๋ถ SQLite ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ๋๊ณ , ๋ค์ ์ฒ๋ฆฌ ์ค๋ ๋๋ฅผ ์์ํ๋ ๋ฐ์๋ ์ฌ์ฉ๋ฉ๋๋ค.
- ๋น๋์ค ๋ฐ ์ค๋์ค ์คํธ๋ฆผ์ ์์ ํ๊ธฐ ์ํด RTSP ์ฐ๊ฒฐ์ ์ค์ ํฉ๋๋ค.
- G.711 mu-Law, G.711 A-Law, G.723 ๋ฑ ํ์์ ์ค๋์ค๋ฅผ ํธ๋์ค์ฝ๋ฉํฉ๋๋ค. AAC ํ์์ผ๋ก;
- H.264 ํ์์ ๋น๋์ค ์คํธ๋ฆผ๊ณผ AAC ํ์์ ์ค๋์ค๋ฅผ FLV ์ปจํ ์ด๋๋ก ํธ๋์ค์ฝ๋ฉํ๊ณ ์ด๋ฅผ RTMP ํ๋กํ ์ฝ์ ํตํด ํด๋ผ์ฐ๋๋ก ์ ์กํฉ๋๋ค.
- ONVIF ํ๋กํ ์ฝ์ ํตํด IP ์นด๋ฉ๋ผ ๋์ ๊ฐ์ง๊ธฐ์ ์๋ํฌ์ธํธ์ ์ฐ๊ฒฐ์ ์ค์ ํ๊ณ ์ด๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ํด๋งํ๋ ๋จ๊ณ;
- ์ฃผ๊ธฐ์ ์ผ๋ก ์ธ๋ค์ผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ์ฌ MQTT ํ๋กํ ์ฝ์ ํตํด ํด๋ผ์ฐ๋๋ก ์ ์กํ๋ ๋จ๊ณ;
- ์ค๋งํธ ํ ์ปจํธ๋กค๋ฌ์ SD ๋๋ ํ๋์ ์นด๋์ MP4 ํ์์ ๋ณ๋ ํ์ผ ํํ๋ก ๋น๋์ค ๋ฐ ์ค๋์ค ์คํธ๋ฆผ์ ๋ก์ปฌ๋ก ๋ นํํฉ๋๋ค.
์นด๋ฉ๋ผ์์ ์ฐ๊ฒฐ์ ์ค์ ํ๊ณ , ์๋ฒ ํ๋ก์ธ์ค์์ ๋น๋์ค ์คํธ๋ฆผ์ ํธ๋์ค์ฝ๋ฉ, ์ฒ๋ฆฌ ๋ฐ ๋
นํํ๊ธฐ ์ํด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ๋ฅ์ด ์ฌ์ฉ๋ฉ๋๋ค.
์ฑ๋ฅ ํ ์คํธ ์คํ์์๋ 3๋์ ์นด๋ฉ๋ผ๊ฐ ์ปจํธ๋กค๋ฌ์ ์ฐ๊ฒฐ๋์์ต๋๋ค.
- HiWatch DS-I114W(ํด์๋ - 720p, ์์ถ ํ์ - H.264, ๋นํธ ์ ์ก๋ฅ - 1Mb/s, ์ฌ์ด๋ G.711 mu-Law);
- Microdigital MDC-M6290FTD-1(ํด์๋ - 1080p, ์์ถ ํ์ - H.264, ๋นํธ ์ ์ก๋ฅ - 1Mb/s, ์๋ฆฌ ์์);
- Dahua DH-IPC-HDW4231EMP-AS-0360B(ํด์๋ - 1080p, ์์ถ ํ์ - H.264, ๋นํธ ์ ์ก๋ฅ - 1.5Mb/s, AAC ์ค๋์ค).
์ธ ๊ฐ์ง ์คํธ๋ฆผ์ด ๋ชจ๋ ๋์์ ํด๋ผ์ฐ๋๋ก ์ถ๋ ฅ๋์๊ณ ์ค๋์ค ํธ๋์ค์ฝ๋ฉ์ ํ ๋์ ์นด๋ฉ๋ผ์์๋ง ์ํ๋์์ผ๋ฉฐ ๋ก์ปฌ ์์นด์ด๋ธ ๋
นํ๋ ๋นํ์ฑํ๋์์ต๋๋ค. CPU ๋ก๋๋ ์ฝ 5%, RAM ์ฌ์ฉ๋์ 32MB(ํ๋ก์ธ์ค๋น), 56MB(OS ํฌํจ ์ด๊ณ)์์ต๋๋ค.
๋ฐ๋ผ์ ์ฝ 20~30๋์ ์นด๋ฉ๋ผ๋ฅผ ์ค๋งํธ ํ ์ปจํธ๋กค๋ฌ(ํด์๋ ๋ฐ ๋นํธ ์ ์ก๋ฅ ์ ๋ฐ๋ผ ๋ค๋ฆ)์ ์ฐ๊ฒฐํ ์ ์์ผ๋ฉฐ ์ด๋ XNUMX์ธต์ง๋ฆฌ ๋ณ์ฅ์ด๋ ์์ ์ฐฝ๊ณ ์ ์์ ๊ฐ์ ์์คํ ์ ์ถฉ๋ถํฉ๋๋ค. ๋ ๋์ ์ฑ๋ฅ์ด ํ์ํ ์์ ์ ๊ฒฝ์ฐ ๋ฉํฐ ์ฝ์ด Intel ํ๋ก์ธ์ ๋ฐ Linux Debian Sarge OS๊ฐ ํ์ฌ๋ ๋ทํ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ปจํธ๋กค๋ฌ๋ ํ์ฌ ์๋ฒ ์ด์ ์ค์ด๋ฉฐ, ์ฑ๋ฅ ๋ฐ์ดํฐ๋ ์ ๋ฐ์ดํธ๋ ์์ ์ด๋ค.
ํด๋ผ์ฐ๋์์ ์ํธ์์ฉ
ํด๋ผ์ฐ๋ ๊ธฐ๋ฐ ์ค๋งํธ ํ์ ์ฌ์ฉ์ ๋ฐ์ดํฐ(๋น๋์ค ๋ฐ ์ผ์ ์ธก์ ๊ฐ)๋ฅผ ํด๋ผ์ฐ๋์ ์ ์ฅํฉ๋๋ค. ํด๋ผ์ฐ๋ ์คํ ๋ฆฌ์ง์ ์ํคํ ์ฒ๋ ์ฐ๋ฆฌ ์๋ฆฌ์ฆ์ ๋ค์ ๊ธฐ์ฌ์์ ๋ ์์ธํ ๋ ผ์๋ ๊ฒ์ ๋๋ค. ์ด์ ์ค๋งํธ ํ ์ปจํธ๋กค๋ฌ์์ ํด๋ผ์ฐ๋๋ก ์ ๋ณด ๋ฉ์์ง๋ฅผ ์ ์กํ๋ ์ธํฐํ์ด์ค์ ๋ํด ์ด์ผ๊ธฐํด ๋ณด๊ฒ ์ต๋๋ค.
์ฐ๊ฒฐ๋ ์ฅ์น์ ์ํ์ ์ผ์ ์ธก์ ๊ฐ์ ํ๋กํ ์ฝ์ ํตํด ์ ์ก๋ฉ๋๋ค.
- QoS 0 - ์ต๋ XNUMXํ(๋ฐฐ๋ฌ ๋ณด์ฅ ์์)
- QoS 1 - ์ต์ ํ ๋ฒ(๋ฐฐ์ก ํ์ธ ํฌํจ)
- QoS 2 - ์ ํํ ํ ๋ฒ(์ถ๊ฐ ๋ฐฐ์ก ํ์ธ ํฌํจ)
์ฐ๋ฆฌ์ ๊ฒฝ์ฐ์๋
์ค๋งํธ ํ ์ปจํธ๋กค๋ฌ์ ์ํ์ ๋ํ ๋ฉ์์ง๋ฅผ ์ ์กํ๊ธฐ ์ํด ์ ์ฅ๋ ๋ฉ์์ง ๋ฉ์ปค๋์ฆ์ด ์ฌ์ฉ๋ฉ๋๋ค.
MQTT ํด๋ผ์ด์ธํธ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ตฌํ์ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐ๋์์ต๋๋ค.
H.264 + AAC ๋ฏธ๋์ด ์คํธ๋ฆผ์ RTMP ํ๋กํ ์ฝ์ ํตํด ํด๋ผ์ฐ๋๋ก ์ ์ก๋๋ฉฐ, ์ฌ๊ธฐ์ ๋ฏธ๋์ด ์๋ฒ ํด๋ฌ์คํฐ๊ฐ ์ด๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ ์ฅํฉ๋๋ค. ํด๋ฌ์คํฐ์ ๋ก๋๋ฅผ ์ต์ ์ผ๋ก ๋ถ์ฐํ๊ณ ๋ก๋๊ฐ ๊ฐ์ฅ ์ ์ ๋ฏธ๋์ด ์๋ฒ๋ฅผ ์ ํํ๊ธฐ ์ํด ์ค๋งํธ ํ ์ปจํธ๋กค๋ฌ๋ ํด๋ผ์ฐ๋ ๋ก๋ ๋ฐธ๋ฐ์์ ์ฌ์ ์์ฒญ์ ํ ํ ๋ฏธ๋์ด ์คํธ๋ฆผ์ ๋ณด๋ ๋๋ค.
๊ฒฐ๋ก
์ด ๊ธฐ์ฌ์์๋ Z-Wave ํ๋กํ ์ฝ์ ํตํด ์ ๋ณด๋ฅผ ์์ ํ๊ณ , ์ ๋ณด๋ฅผ ์ฒ๋ฆฌํ๊ณ , ์ฅ๋น๋ฅผ ์ ์ดํ๊ณ , ONVIF ํ๋กํ ์ฝ์ ํตํด IP ์นด๋ฉ๋ผ์ ์ํธ ์์ฉํ๊ณ , ๋ฐ์ดํฐ ๋ฐ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ ์ ์๋ Raspberry Pi 3 B+ ๋ง์ดํฌ๋ก์ปดํจํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ์ค๋งํธ ํ ์ปจํธ๋กค๋ฌ์ ํน์ ๊ตฌํ์ ์กฐ์ฌํ์ต๋๋ค. MQTT ๋ฐ RTMP ํ๋กํ ์ฝ์ ํตํด ํด๋ผ์ฐ๋ ์๋น์ค์ ๋ํ ๋ช ๋ น์ ์ํํฉ๋๋ค. JSON ํ์์ผ๋ก ์ ์๋ ๋ ผ๋ฆฌ์ ๊ท์น๊ณผ ์ฌ์ค์ ๋น๊ต๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์ฐ ๋ ผ๋ฆฌ ์์ง์ด ๊ฐ๋ฐ๋์์ต๋๋ค.
์ค๋งํธ ํ ์ปจํธ๋กค๋ฌ๋ ํ์ฌ ๋ชจ์คํฌ๋ฐ์ ๋ชจ์คํฌ๋ฐ ์ง์ญ์ ์ฌ๋ฌ ํ์ฅ์์ ์๋ฒ ์ด์๋๊ณ ์์ต๋๋ค.
์ปจํธ๋กค๋ฌ์ ๋ค์ ๋ฒ์ ์์๋ ๋ค๋ฅธ ์ ํ์ ์ฅ์น(RF, Bluetooth, WiFi, ์ ์ )๋ฅผ ์ฐ๊ฒฐํ ๊ณํ์
๋๋ค. ์ฌ์ฉ์์ ํธ์๋ฅผ ์ํด ์ผ์ ๋ฐ IP ์นด๋ฉ๋ผ ์ฐ๊ฒฐ ์ ์ฐจ๋ฅผ ๋ชจ๋ฐ์ผ ์ ํ๋ฆฌ์ผ์ด์
์ผ๋ก ์ด์ ํฉ๋๋ค. ์๋ฒ ํ๋ก์ธ์ค ์ฝ๋๋ฅผ ์ต์ ํํ๊ณ ์ํํธ์จ์ด๋ฅผ ์ด์ ์ฒด์ ๋ก ํฌํ
ํ๋ ์์ด๋์ด๋ ์์ต๋๋ค.
์ถ์ฒ : habr.com