ä»æ¥ããã€ã¯ããšã¬ã¯ãããã¯ã¹ãéä¿¡ãã£ãã«ãã€ã³ã¿ãŒãããæè¡ã人工ç¥èœã®æ¥éãªçºå±ã®ãããã§ãã¹ããŒãããŒã ã®è©±é¡ã¯ãŸããŸãé¢é£æ§ãé«ãŸã£ãŠããŸãã 人éã®äœå±
ã¯ç³åšæ代ãã倧ããªå€åãéããç£æ¥é©åœ 4.0 ãšã¢ãã®ã€ã³ã¿ãŒãããã®æ代ã«ã¯ãå¿«é©ã§æ©èœçãã€å®å
šã«ãªããŸããã ã¢ããŒããã«ã³ããªãŒããŠã¹ããã¹ããŒããã©ã³ã䜿çšããŠäžçäžã®ã©ãããã§ãå¶åŸ¡ã§ããè€éãªæ
å ±ã·ã¹ãã ã«å€ãããœãªã¥ãŒã·ã§ã³ãåžå Žã«åºãŠããŠããŸãã ããã«ã人éãšæ©æ¢°ã®å¯Ÿè©±ã«ã¯ããã°ã©ãã³ã°èšèªã®ç¥èã¯å¿
èŠãªããªããŸãããé³å£°èªèããã³åæã¢ã«ãŽãªãºã ã®ãããã§ã人ã¯æ¯åœèªã§ã¹ããŒã ããŒã ã«è©±ããããããšãã§ããŸãã
çŸåšåžå Žã«åºåã£ãŠããäžéšã®ã¹ããŒã ããŒã ã·ã¹ãã ã¯ãã¯ã©ãŠã ãããªç£èŠã·ã¹ãã ãè«ççã«çºå±ããããã®ã§ããã®éçºè ã¯ç£èŠã ãã§ãªãããªã¢ãŒã ãªããžã§ã¯ãã®ç®¡çã®ããã®å æ¬çãªãœãªã¥ãŒã·ã§ã³ã®å¿ èŠæ§ãèªèããŠããŸããã
ç§ãã¡ã¯ãèè
ãå人çã«éçºããéçšããŠããã¯ã©ãŠã ã¹ããŒã ããŒã ã·ã¹ãã ã®ãã¹ãŠã®äž»èŠã³ã³ããŒãã³ãã«ã€ããŠèª¬æãã XNUMX ã€ã®ã·ãªãŒãºã®èšäºãçããã«çŽ¹ä»ããŸãã æåã®èšäºã§ã¯ã¹ããŒã ããŒã å
ã«èšçœ®ããã端æ«ã¯ã©ã€ã¢ã³ãæ©åšã«ã€ããŠãXNUMX åç®ã§ã¯ã¯ã©ãŠã ã¹ãã¬ãŒãžããã³ããŒã¿åŠçã·ã¹ãã ã®ã¢ãŒããã¯ãã£ã«ã€ããŠãæåŸã« XNUMX åç®ã§ã¯ã¢ãã€ã«ããã³åºå®ããã€ã¹äžã®ã·ã¹ãã ã管çããããã®ã¯ã©ã€ã¢ã³ã ã¢ããªã±ãŒã·ã§ã³ã«ã€ããŠèª¬æããŸãã
ã¹ããŒãããŒã æ©åš
ãŸããæ®éã®ã¢ããŒããããŒãã£ãã³ããŒãžããã¹ããŒãããŒã ãäœãæ¹æ³ã«ã€ããŠè©±ããŸãããã ãããè¡ãã«ã¯ãååãšããŠã次ã®æ©åšã家ã«èšçœ®ããå¿ èŠããããŸãã
- ããŸããŸãªç°å¢ãã©ã¡ãŒã¿ã枬å®ããã»ã³ãµãŒã
- å€éšãªããžã§ã¯ãã«äœçšããã¢ã¯ãã¥ãšãŒã¿ã
- ã»ã³ãµãŒã®æž¬å®å€ãšçµã¿èŸŒã¿ããžãã¯ã«åŸã£ãŠèšç®ãå®è¡ããã¢ã¯ãã¥ãšãŒã¿ãŒã«ã³ãã³ããçºè¡ããã³ã³ãããŒã©ãŒã
次ã®å³ã¯ã¹ããŒã ããŒã ã®å³ã瀺ããŠããŸãã济宀ã«ã¯æ°ŽæŒãã®ã»ã³ãµãŒ (1)ãå¯å®€ã«ã¯æž©åºŠ (2) ãšç §æ (3)ããããã³ã«ã¯ã¹ããŒã ãœã±ãã (4) ããããå»äžã«ãããããªç£èŠã«ã¡ã© (5)ã
çŸåšãRF433ãZ-WaveãZigBeeãBluetoothãWiFi ãããã³ã«ã䜿çšããŠåäœããã¯ã€ã€ã¬ã¹ ã»ã³ãµãŒãåºã䜿çšãããŠããŸãã ãã®äž»ãªå©ç¹ã¯ãèšçœ®ãšäœ¿çšã®å®¹æããããã³äœã³ã¹ããšä¿¡é Œæ§ã§ãã ã¡ãŒã«ãŒã¯èªç€Ÿã®ããã€ã¹ã倧è¡åžå Žã«æå
¥ããå¹³åçãªãŠãŒã¶ãŒãã¢ã¯ã»ã¹ã§ããããã«ããããšåªããŠããŸãã
ã»ã³ãµãŒãšã¢ã¯ãã¥ãšãŒã¿ãŒã¯ãéåžžãã¯ã€ã€ã¬ã¹ ã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠã¹ããŒã ããŒã ã³ã³ãããŒã©ãŒ (6) ã«æ¥ç¶ãããŸããã¹ããŒã ããŒã ã³ã³ãããŒã©ãŒã¯ãããããã¹ãŠã®ããã€ã¹ã XNUMX ã€ã®ãããã¯ãŒã¯ã«çµåããŠå¶åŸ¡ããç¹æ®ãªãã€ã¯ãã³ã³ãã¥ãŒã¿ãŒã§ãã
ãã ããäžéšã®ãœãªã¥ãŒã·ã§ã³ã§ã¯ãã»ã³ãµãŒãã¢ã¯ãã¥ãšãŒã¿ãŒãã³ã³ãããŒã©ãŒãåæã«çµã¿åãããããšãã§ããŸãã ããšãã°ãã¹ããŒã ãã©ã°ã¯ã¹ã±ãžã¥ãŒã«ã«åŸã£ãŠãªã³ãŸãã¯ãªãã«ãªãããã«ããã°ã©ã ã§ããã¯ã©ãŠã ãããªç£èŠã«ã¡ã©ã¯åäœæ€ç¥ä¿¡å·ã«åºã¥ããŠãããªãé²ç»ã§ããŸãã æãåçŽãªã±ãŒã¹ã§ã¯ãå¥åã®ã³ã³ãããŒã©ãŒãªãã§æžã¿ãŸãããå€ãã®ã·ããªãªã«å¯Ÿå¿ããæè»ãªã·ã¹ãã ãäœæããã«ã¯ãã³ã³ãããŒã©ãŒãå¿ èŠã§ãã
ã¹ããŒã ããŒã ã³ã³ãããŒã©ãŒãã°ããŒãã« ãããã¯ãŒã¯ã«æ¥ç¶ããã«ã¯ãéåžžã®ã€ã³ã¿ãŒããã ã«ãŒã¿ãŒ (7) ã䜿çšã§ããŸããããã¯ãé·ãéã©ã®å®¶åºã§ãäžè¬çãªå®¶é»è£œåã«ãªã£ãŠããŸãã ããã§ãã¹ããŒã ããŒã ã³ã³ãããŒã©ãŒãæ¯æããå¥ã®è°è«ããããŸããã€ã³ã¿ãŒããããžã®æ¥ç¶ã倱ãããå Žåã§ããã¯ã©ãŠã ãµãŒãã¹ã§ã¯ãªãã³ã³ãããŒã©ãŒå ã«ä¿åãããããžã㯠ãããã¯ã®ãããã§ãã¹ããŒã ããŒã ã¯éåžžã©ããåäœãç¶ããŸãã
ã¹ããŒãããŒã ã³ã³ãããŒã©ãŒ
ãã®èšäºã§èª¬æããã¯ã©ãŠãã¹ããŒãããŒã ã·ã¹ãã ã®ã³ã³ãããŒã©ãŒã¯ãã·ã³ã°ã«ããŒããã€ã³ã³ãããŒã¹ã«éçºãããŠããŸãã
ã³ã³ãããŒã©ã®çµã¿ç«ãŠã¯éåžžã«ç°¡åã§ãããã€ã¯ãã³ã³ãã¥ãŒã¿ (1) ããã©ã¹ãã㯠ã±ãŒã¹ (2) ã«åãä»ãã次ã«ãœãããŠã§ã¢ãå«ã microSD ãã©ãŒãããã® 8 GB ã¡ã¢ãª ã«ãŒã (3) ãš USB Z-Wave ãããã¯ãŒã¯ ã³ã³ãããŒã© (4) ãåãä»ããŸãã察å¿ããã¹ãããã ã¹ããŒã ããŒã ã³ã³ãããŒã©ãŒã¯ã5Vã2.1A é»æºã¢ããã¿ãŒ (5) ããã³ USB - ãã€ã¯ã USB ã±ãŒãã« (6) ãä»ããŠé»æºã«æ¥ç¶ãããŸãã åã³ã³ãããŒã©ãŒã«ã¯åºæã®èå¥çªå·ããããæåã®èµ·åæã«æ§æãã¡ã€ã«ã«æžã蟌ãŸããã¯ã©ãŠã ã¹ããŒã ããŒã ãµãŒãã¹ãšå¯Ÿè©±ããããã«å¿
èŠã§ãã
ã¹ããŒã ããŒã ã³ã³ãããŒã©ãŒ ãœãããŠã§ã¢ã¯ããªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã«åºã¥ããŠãã®èšäºã®èè ã«ãã£ãŠéçºãããŸããã Linux Raspbian ã¹ãã¬ããã ããã¯ã次ã®äž»èŠãªãµãã·ã¹ãã ã§æ§æãããŸãã
- ã¹ããŒãããŒã æ©åšããã³ã¯ã©ãŠããšå¯Ÿè©±ããããã®ãµãŒããŒããã»ã¹ã
- ã³ã³ãããŒã©ã®æ§æããã³åäœãã©ã¡ãŒã¿ãèšå®ããããã®ã°ã©ãã£ã«ã« ãŠãŒã¶ãŒ ã€ã³ã¿ãŒãã§ã€ã¹ã
- ã³ã³ãããŒã©èšå®ãä¿åããããã®ããŒã¿ããŒã¹ã
ããŒã¿ããŒã¹ ã¹ããŒã ããŒã ã³ã³ãããŒã©ãŒã¯çµã¿èŸŒã¿ DBMS ã«åºã¥ããŠå®è£
ãããŸã
GUI ãã€ã¯ããã¬ãŒã ã¯ãŒã¯ã䜿çšã㊠PHP 7 ã§éçºãããã¹ããŒã ããŒã ã³ã³ãããŒã©ãŒ
(ç»åãã¯ãªãã¯ãããšé«è§£å床ã§éããŸã)
ã°ã©ãã£ã«ã« ã€ã³ã¿ãŒãã§ã€ã¹ã®äž»ãªæ©èœã¯ãã¹ããŒã ããŒã æ©åš (IP ç£èŠã«ã¡ã©ãã»ã³ãµãŒ) ãã³ã³ãããŒã©ãŒã«æ¥ç¶ããããšã§ãã Web ã¢ããªã±ãŒã·ã§ã³ã¯ãã³ã³ãããŒã©ãŒãšããã«æ¥ç¶ãããŠããããã€ã¹ã®æ§æãšçŸåšã®ç¶æ ã SQLite ããŒã¿ããŒã¹ããèªã¿åããŸãã ã³ã³ãããŒã©ãŒã®æ§æãå€æŽããã«ã¯ããµãŒã㌠ããã»ã¹ã® RESTful API ã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠãJSON 圢åŒã§å¶åŸ¡ã³ãã³ããéä¿¡ããŸãã
ãµãŒããŒããã»ã¹
ãµãŒããŒããã»ã¹ - ã¹ããŒã ããŒã ã®åºç€ã圢æããæ å ±ããã»ã¹ã®èªååã«é¢ããäž»èŠãªäœæ¥ããã¹ãŠå®è¡ããäž»èŠã³ã³ããŒãã³ããã»ã³ãµãŒ ããŒã¿ã®åä¿¡ãšåŠçãçµã¿èŸŒã¿ããžãã¯ã«å¿ããå¶åŸ¡ã¢ã¯ã·ã§ã³ã®çºè¡ãªã©ã§ãã ãµãŒã㌠ããã»ã¹ã®ç®çã¯ãã¹ããŒã ããŒã æ©åšãšå¯Ÿè©±ããéçšè«çã«ãŒã«ãå®è¡ããã°ã©ãã£ã«ã« ã€ã³ã¿ãŒãã§ã€ã¹ãšã¯ã©ãŠãããã³ãã³ããåä¿¡ããŠââåŠçããããšã§ãã æ€èšäžã®ã¹ããŒã ããŒã ã³ã³ãããŒã©ãŒã®ãµãŒã㌠ããã»ã¹ã¯ãC++ ã§éçºããããã«ãã¹ã¬ãã ã¢ããªã±ãŒã·ã§ã³ãšããŠå®è£ ãããå¥ã®ãµãŒãã¹ãšããŠèµ·åãããŸãã systemd ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã Linux ã©ãºãã¢ã³.
ãµãŒã㌠ããã»ã¹ã®äž»ãªãããã¯ã¯æ¬¡ã®ãšããã§ãã
- ã¡ãã»ãŒãžãããŒãžã£ãŒã
- IPã«ã¡ã©ãµãŒããŒ;
- Z-Wave ããã€ã¹ãµãŒããŒã
- æ¬çªãµãŒããŒã®è«çã«ãŒã«ã
- ã³ã³ãããŒã©ãŒã®æ§æã®ããŒã¿ããŒã¹ãšè«çã«ãŒã«ã®ãããã¯ã
- ã°ã©ãã£ã«ã« ã€ã³ã¿ãŒãã§ã€ã¹ãšå¯Ÿè©±ããããã® RESTful API ãµãŒããŒã
- ã¯ã©ãŠããšå¯Ÿè©±ããããã® MQTT ã¯ã©ã€ã¢ã³ãã
ãµãŒã㌠ããã»ã¹ ãããã¯ã¯åå¥ã®ã¹ã¬ãããšããŠå®è£ ãããæ å ±ã¯ JSON åœ¢åŒ (ãŸãã¯ããã»ã¹ ã¡ã¢ãªå ã§ãã®åœ¢åŒãè¡šãããŒã¿æ§é ) ã®ã¡ãã»ãŒãžã®åœ¢åŒã§è»¢éãããŸãã
ãµãŒããŒããã»ã¹ã®äž»ãªã³ã³ããŒãã³ãã¯æ¬¡ã®ãšããã§ãã ã¡ãã»ãŒãžãããŒãžã£ãŒãJSON ã¡ãã»ãŒãžããã¹ãŠã®ãµãŒã㌠ããã»ã¹ ãããã¯ã«ã«ãŒãã£ã³ã°ããŸãã JSON ã¡ãã»ãŒãžæ
å ±ãã£ãŒã«ãã®çš®é¡ãšåãå
¥ãå¯èœãªå€ãè¡šã«ç€ºããŸãã
ããã€ã¹ã¿ã€ã
ã¡ãã»ãŒãžã¿ã€ã
ããã€ã¹ã®ç¶æ
command
ã«ã¡ã©
onvif
ã»ã³ãµãŒããŒã¿
on
ã¹ããªãŒãã³ã°(ãªã³/ãªã)
ã»ã³ãµãŒ
ãºãŠã§ãŒã
command
ãªã
é²é³(ãªã³/ãªã)
ãšãã§ã¯ã¿ãŒ
MQTT
ããžãã¹ããžãã¯ã«ãŒã«
ã¹ããªãŒãã³ã°(ãªã³/ãªã)
evice(è¿œå /åé€)
ããžãã¹ã®è«ç
èšå®ããŒã¿
é²é³(ãªã³/ãªã)
ãã«ãŒãã¥ãŒã¹
ããã€ã¹ã®ç¶æ
ãšã©ãŒ
ç¡ç·LAN
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"
}
}
ã§æå®ãããæ¡ä»¶ãæºããããå Žåã å äŸ (å·ŠåŽ) ã«ãŒã«ã true ã§ããã°æºããããŸã çµæãšããŠã® (å³åŽ) ã«ãŒã«ãé©çšããããã³ãã©ãŒã¯ JSON ã¡ãã»ãŒãžã®æ¬æã«ã¢ã¯ã»ã¹ã§ããããã«ãªããŸãã å件ã¯ãJSON ããŒãšå€ã®ãã¢ãæ¯èŒããè«çæŒç®åããµããŒãããŠããŸãã
- ãçãããã«çããã
- ãnot_equalããšçãããªã;
- å°ãªããå°ãªããã
- ããã倧ãããã
- ãless_or_equalã以äž;
- ãgreater_or_equalã以äžã
æ¯èŒçµæã¯ãããŒã«ä»£æ°æŒç®åã䜿çšããŠçžäºã«é¢é£ä»ããããšãã§ããŸãã
- ãããŠããããŠã
- ãŸãã¯ããŸãã¯ã;
- ããªããã§ã¯ãããŸããã
ãããã£ãŠãæŒç®åãšãªãã©ã³ããããŒã©ã³ãèªè¡šèšã§èšè¿°ããããšã«ãããå€æ°ã®ãã©ã¡ãŒã¿ã䜿çšããŠéåžžã«è€éãªæ¡ä»¶ãäœæã§ããŸãã
JSON ã¡ãã»ãŒãžãš JSON 圢åŒã®ãããã¯ã·ã§ã³ ã«ãŒã«ã«åºã¥ããŸã£ããåãã¡ã«ããºã ãããããã¯ã·ã§ã³ ããžã㯠ãµãŒã㌠ãããã¯ã§äœ¿çšããããã¬ããžãè¡šããã¹ããŒã ããŒã ã»ã³ãµãŒããã®ã»ã³ãµãŒ ããŒã¿ã䜿çšããŠè«çæšè«ãå®è¡ããŸãã
ãŠãŒã¶ãŒã¯ã¢ãã€ã« ã¢ããªã±ãŒã·ã§ã³ã䜿çšããŠãã¹ããŒã ããŒã ãæ©èœããå¿ èŠãããã·ããªãªãäœæããŸãã äŸãã°ïŒ ãçé¢ãã¢ãéããã»ã³ãµãŒãäœåããããå»äžã®é»æ°ãã€ããŠãã ãããã ã¢ããªã±ãŒã·ã§ã³ã¯ãã»ã³ãµãŒ (éå£ã»ã³ãµãŒ) ãšã¢ã¯ãã¥ãšãŒã¿ãŒ (ã¹ããŒã ãœã±ãããŸãã¯ã¹ããŒã ã©ã³ã) ã®èå¥åãããŒã¿ããŒã¹ããèªã¿åããJSON 圢åŒã§è«çã«ãŒã«ãçæããã¹ããŒã ããŒã ã³ã³ãããŒã©ãŒã«éä¿¡ããŸãã ãã®ã¡ã«ããºã ã«ã€ããŠã¯ãã·ãªãŒãºã® XNUMX åç®ã®èšäºã§è©³ãã説æããŸããããã§ã¯ãã¹ããŒã ããŒã ã管çããããã®ã¯ã©ã€ã¢ã³ã ã¢ããªã±ãŒã·ã§ã³ã«ã€ããŠèª¬æããŸãã
äžã§èª¬æãããããã¯ã·ã§ã³ ããžã㯠ã¡ã«ããºã ã¯ãã©ã€ãã©ãªã䜿çšããŠå®è£
ãããŸãã
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 ãããã¯ãŒã¯ ã³ã³ãããŒã©ãŒãã»ã³ãµãŒãæ¥ç¶ãããŸãã
ããã€ã¹ãšã³ã³ãããŒã©ãŒãåãåšæ³¢æ°ã§åäœããããšãéåžžã«éèŠã§ããããããªããšãæ¥ç¶æã«çžäºã«èªèã§ããªããªããŸãã æ倧 232 å°ã®ããã€ã¹ã XNUMX ã€ã® Z-Wave ãããã¯ãŒã¯ ã³ã³ãããŒã©ãŒã«æ¥ç¶ã§ããŸããããã¯ãã¢ããŒããã«ã³ããªãŒ ããŠã¹ã«ã¯ååã§ãã å±å ã®ãããã¯ãŒã¯ ã«ãã¬ããž ãšãªã¢ãæ¡å€§ããã«ã¯ãã¹ããŒã ãœã±ãããä¿¡å·ãªããŒã¿ãŒãšããŠäœ¿çšã§ããŸãã
åã®æ®µèœã§èª¬æããã¹ããŒã ããŒã ã³ã³ãããŒã©ãŒ ãµãŒã㌠ããã»ã¹ã§ã¯ã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ã«ã¡ã©ã®æ¥ç¶
ãã®èšäºã§èª¬æããã¯ã©ãŠã ã¹ããŒã ããŒã ã·ã¹ãã ã¯ãåããèè ãéçºããã¯ã©ãŠã ãããªç£èŠã·ã¹ãã ã®ã¢ããã°ã¬ãŒãã§ãããã®ã·ã¹ãã ã¯æ°å¹Žåããåžå Žã«åºãããŠããããã·ã¢ã§å€ãã®èšçœ®å®çžŸããããŸãã
ã¯ã©ãŠããããªç£èŠã·ã¹ãã ã®å Žåãæ·±å»ãªåé¡ã® XNUMX ã€ã¯ãçµ±åãå®è¡ã§ããæ©åšã®éžæè¢ãéãããŠããããšã§ãã ã¯ã©ãŠããžã®æ¥ç¶ãæ åœãããœãããŠã§ã¢ã¯ãã㪠ã«ã¡ã©å ã«ã€ã³ã¹ããŒã«ãããŠããããããã®ããŒããŠã§ã¢ãã€ãŸãããã»ããµãšç©ºãã¡ã¢ãªã®éã«ããã«å€§ããªèŠæ±ãçããŸãã ããã¯äž»ã«ãéåžžã® 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 ã¡ãã»ãŒãžãä»ã㊠Web ãµãŒãã¹ãšå¯Ÿè©±ãããšãã«éåžžã«äŸ¿å©ã§ãã ã¡ãã¥ãŒé ç®ãéžæãããšã ããã€ã¹ > 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ããããã¬ãŒã - 1 Mb/sããµãŠã³ã G.711 mu-Law);
- Microdigital MDC-M6290FTD-1 (解å床 - 1080pãå§çž®åœ¢åŒ - H.264ããããã¬ãŒã - 1 Mb/sãé³å£°ãªã);
- Dahua DH-IPC-HDW4231EMP-AS-0360B (解å床 - 1080pãå§çž®åœ¢åŒ - H.264ããããã¬ãŒã - 1.5 Mb/sãAAC ãªãŒãã£ãª)ã
5 ã€ã®ã¹ããªãŒã ãã¹ãŠãåæã«ã¯ã©ãŠãã«åºåããããªãŒãã£ãªã®ãã©ã³ã¹ã³ãŒãã£ã³ã°ã¯ 32 å°ã®ã«ã¡ã©ã®ã¿ããå®è¡ãããããŒã«ã« ã¢ãŒã«ã€ãé²ç»ã¯ç¡å¹ã«ãªããŸããã CPU è² è·ã¯çŽ 56%ãRAM 䜿çšé㯠XNUMX MB (ããã»ã¹ããš)ãXNUMX MB (OS ãå«ãåèš) ã§ããã
ãããã£ãŠãçŽ 20 ïœ 30 å°ã®ã«ã¡ã©ãã¹ããŒã ããŒã ã³ã³ãããŒã©ãŒã«æ¥ç¶ã§ããŸã (解å床ãšãããã¬ãŒãã«å¿ããŠ)ãããã¯ãXNUMX é建ãŠã®ã³ããŒãžãå°ããªå庫ã®ãããªç£èŠã·ã¹ãã ãšããŠã¯ååã§ãã ããé«ãããã©ãŒãã³ã¹ãå¿ èŠãªã¿ã¹ã¯ã«ã¯ããã«ãã³ã¢ Intel ããã»ããµãš Linux Debian Sarge OS ãæèŒããããããããã䜿çšã§ããŸãã ã³ã³ãããŒã©ãŒã¯çŸåšè©Šé転äžã§ãããæ§èœããŒã¿ã¯éææŽæ°ããŠãããŸãã
ã¯ã©ãŠããšã®ã€ã³ã¿ã©ã¯ã·ã§ã³
ã¯ã©ãŠãããŒã¹ã®ã¹ããŒã ããŒã ã¯ããŠãŒã¶ãŒ ããŒã¿ (ãããªãšã»ã³ãµãŒã®æž¬å®å€) ãã¯ã©ãŠãã«ä¿åããŸãã ã¯ã©ãŠã ã¹ãã¬ãŒãžã®ã¢ãŒããã¯ãã£ã«ã€ããŠã¯ããã®ã·ãªãŒãºã®æ¬¡ã®èšäºã§è©³ãã説æããŸãã 次ã«ãã¹ããŒã ããŒã ã³ã³ãããŒã©ãŒããã¯ã©ãŠãã«æ å ±ã¡ãã»ãŒãžãéä¿¡ããããã®ã€ã³ã¿ãŒãã§ã€ã¹ã«ã€ããŠèª¬æããŸãã
æ¥ç¶ãããããã€ã¹ã®ç¶æ
ãšã»ã³ãµãŒã®æž¬å®å€ã¯ãããã³ã«çµç±ã§éä¿¡ãããŸãã
- QoS 0 - æ倧 XNUMX å (é ä¿¡ä¿èšŒãªã)ã
- QoS 1 - å°ãªããšã XNUMX å (é 信確èªãã)ã
- QoS 2 - XNUMX åã®ã¿ (è¿œå ã®é 信確èªãã)ã
ç§ãã¡ã®å Žåã䜿çšããã®ã¯ã
ã¹ããŒã ããŒã ã³ã³ãããŒã©ãŒã®ã¹ããŒã¿ã¹ã«é¢ããã¡ãã»ãŒãžãéä¿¡ããã«ã¯ãä¿åãããã¡ãã»ãŒãžã®ã¡ã«ããºã ã䜿çšãããŸã
MQTT ã¯ã©ã€ã¢ã³ãã¯ã©ã€ãã©ãªå®è£
ã«åºã¥ããŠéçºãããŸãã
H.264 + AAC ã¡ãã£ã¢ ã¹ããªãŒã 㯠RTMP ãããã³ã«çµç±ã§ã¯ã©ãŠãã«éä¿¡ãããã¡ãã£ã¢ ãµãŒããŒã®ã¯ã©ã¹ã¿ãŒããããã®åŠçãšä¿åãæ åœããŸãã ã¯ã©ã¹ã¿ãŒå ã®è² è·ãæé©ã«åæ£ããæãè² è·ã®å°ãªãã¡ãã£ã¢ ãµãŒããŒãéžæããããã«ãã¹ããŒã ããŒã ã³ã³ãããŒã©ãŒã¯ã¯ã©ãŠã ããŒã ãã©ã³ãµãŒã«äºåãªã¯ãšã¹ããäœæãããã®åŸã§ã¡ãã£ã¢ ã¹ããªãŒã ãéä¿¡ããŸãã
ãŸãšã
ãã®èšäºã§ã¯ãRaspberry Pi 3 B+ ãã€ã¯ãã³ã³ãã¥ãŒã¿ãŒãããŒã¹ã«ããã¹ããŒã ããŒã ã³ã³ãããŒã©ãŒã®å ·äœçãªå®è£ ã«ã€ããŠæ€èšããŸããããã®ã³ã³ãããŒã©ãŒã¯ãZ-Wave ãããã³ã«ãä»ããŠæ å ±ãåä¿¡ãåŠçããæ©åšãå¶åŸ¡ããONVIF ãããã³ã«ãä»ã㊠IP ã«ã¡ã©ãšå¯Ÿè©±ããããŒã¿ãããŒã¿ã亀æããããšãã§ããŸãã MQTT ããã³ RTMP ãããã³ã«ãä»ããã¯ã©ãŠã ãµãŒãã¹ã§ã®ã³ãã³ãã æ¬çªããžã㯠ãšã³ãžã³ã¯ãJSON 圢åŒã§æ瀺ãããè«çã«ãŒã«ãšäºå®ã®æ¯èŒã«åºã¥ããŠéçºãããŸããã
ã¹ããŒã ããŒã ã³ã³ãããŒã©ãŒã¯çŸåšãã¢ã¹ã¯ã¯ããã³ã¢ã¹ã¯ã¯å°åã®ããã€ãã®æ ç¹ã§è©Šéšéçšäžã§ãã
ã³ã³ãããŒã©ãŒã®æ¬¡ã®ããŒãžã§ã³ã§ã¯ãä»ã®ã¿ã€ãã®ããã€ã¹ (RFãBluetoothãWiFiãæç·) ãæ¥ç¶ããäºå®ã§ãã ãŠãŒã¶ãŒã®å©äŸ¿æ§ã®ããã«ãã»ã³ãµãŒãšIPã«ã¡ã©ãæ¥ç¶ããæé ã¯ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã«è»¢éãããŸãã ãµãŒããŒã®ããã»ã¹ ã³ãŒããæé©åãããœãããŠã§ã¢ããªãã¬ãŒãã£ã³ã° ã·ã¹ãã ã«ç§»æ€ããããã®ã¢ã€ãã¢ããããŸãã
åºæïŒ habr.com