ç«ã®äžã§èå³ããã人ã«èããŠã¿ãŠãã ããã
å°å ¥ãã代ããã«
æè¿ãçåœã®èªååãªã©ã®æ å ±æè¡ã®åéã«é¢å¿ãé«ãŸã£ãŠãããšããé¡èãªåŸåããããŸãã èªååèªäœã¯æ°ããçŸè±¡ãšã¯ã»ã©é ããã®ã§ãããäœå幎ãã®éãã»ãšãã©ã®ç£æ¥äŒæ¥ã«ãšã£ãŠããã¯æ°ãŸããã§ã¯ãªããå¿ èŠã§ããããããªãã§ã¯æ¿ãã競äºã«çŽé¢ããããžãã¹ã®åç¶ã¯èããããŸããã ããã§ã¯ããªãä»ãã¢ãã®ã€ã³ã¿ãŒããããM2MïŒMachine-to-MachineïŒã³ãã¥ãã±ãŒã·ã§ã³ãããã³ãã®ä»ã®ãã¹ããŒãããã¯ãããžãŒã«ã€ããŠããã»ã©ãŸã§ã«è³ã«ããã®ã§ããããã ãããããã®çç±ã¯ãå€ãã®åæ§ã®å Žåãšåæ§ã«ãç¹å®ã®ãã¯ãªãã£ã«ã«ãã¹ãã®ã€ãããŒã·ã§ã³ãåŸãããäžè¬å€§è¡åãã®èŠçŽ ããŒã¹ãå©çšå¯èœã«ãªã£ãããã§ãã ã€ã³ã¿ãŒãããã®éçºãšã€ã³ã¿ãŒãããæè¡ã®å©çšãããããŸã§äžçãå€ããŠããæ å ±ãããžã§ã¯ãã®æ³¢ãåŒãèµ·ãããããã«ãä»ãããã°ã©ãã³ã°ããã€ã¯ããšã¬ã¯ãããã¯ã¹ãã€ã³ã¿ãŒããããªã©ã®å€ãã®ãã¬ã³ã¬ããäœæãããŠããã®ãç®æããŠããŸãèå³æ·±ã家åºçšãœãªã¥ãŒã·ã§ã³ã ãããã®ãã¹ãŠããé¢éžãããããã§ã¯ãªããããã¯çµ¶å¯Ÿã«æ£åžžã§ããããããã®å€ãã¯æ¬åœã«çŽ æŽããããã®ã®åºç€ïŒãŸãã¯ã€ã³ã¹ãã¬ãŒã·ã§ã³ïŒã«ãªããŸãã
å人çã«ãç§ã¯ããæ°å¹Žããã«éåžžã«ç©æ¥µçã«èå³ãæã£ãŠããŠãMajorDoMo Smart HomeãªãŒãã³ãããžã§ã¯ãã«ã€ããŠèãã人ããããããããŸããã ããããä»ã¯åœŒã®ããšã§ã¯ãªããããã€ãã®äžŠè¡ãããžã§ã¯ããå¥ã®å®éšãããããªãã奜ããªããããã¯å°ãåã«ç§ãé©ããããã®çµæããã®èšäºã§å ±æããŸãã
ã¹ããŒãããŒã ãã©ãããã©ãŒã ã®ãããžã§ã¯ãã§ãããè·ç©ãã®äžã§ã¯ãéåžžã«æè»ã«äœ¿çšã§ããŸãããå€ãã®å¯èœæ§ã«ã¯é©åãªæ©åšãå¿ èŠã§ãããåžžã«äŸ¿å©ã§å®çšçã§ã¯ãªããšããäºå®ãèããŸããã ãå°ããªãèªååã®äžéšã®ã¿ã¹ã¯ã«ã€ããŠã¯ã1ã€ã®ãã€ã¯ãã³ã³ãããŒã©ãŒã§å¯Ÿå¿ã§ããŸãããããã§ã¯æ¢ã«æè»æ§ã倱ãããŠãŒã¶ãŒã¹ãã«ã®èŠä»¶ãé«ããŠããŸãã ããçš®ã®äžéãªãã·ã§ã³ã®å¿ èŠæ§ãããããšã¯ç§ã«ã¯æããã§ãããéåžžã«ã³ã³ãã¯ãã§ãšãã«ã®ãŒå¹çããããåæã«æ§æãšäœ¿çšã«æè»æ§ããããŸãã ãã®ãªãã·ã§ã³ãSmart PointããŸãã¯SmartPointã«æå¹ãªååãä»ããŸãããã éäžã§ããã®ããã€ã¹ã§åãåãããšãã§ããå¯èœæ§ã«ã€ããŠã®é¡ãã®å šãªã¹ãã圢æãããŸããã
ææŠãã
æè©ããç·Žç¿ãŸã§ã SmartPointããã€ã¹ã®åºæ¬èŠä»¶ã¯æ¬¡ã®ãšããã§ãã
- ã»ã³ãµãŒããã®ã€ãã³ãã«å¿çããããã®æè»ãªã«ãŒã«ã·ã¹ãã
- æåå¶åŸ¡çšã®Webã€ã³ã¿ãŒãã§ã€ã¹
- ããè€éãªè€åäœã«çµ±åããããã®HTTP API
- ãªã³ã©ã€ã³æäœ-ã«ãŒã¿ãŒã§éçIPããã³ããŒã転éãè¡ããã«ãã€ã³ã¿ãŒãããçµç±ã§ããã€ã¹ã®Webã€ã³ã¿ãŒãã§ãŒã¹ã«ã¢ã¯ã»ã¹ããŸã
- ãªãã©ã€ã³æäœ-æ§æãããããã€ã¹ã®æ©èœã¯ãã€ã³ã¿ãŒãããã¢ã¯ã»ã¹ã®å¯çšæ§ã«äŸåããŠã¯ãªããŸããã
ããã€ã¹ã«å¯Ÿããè¿œå ã®ïŒå®çšçãªïŒèŠæïŒ
- WiFiã®ä»äº
- çµã¿èŸŒã¿ã»ã³ãµãŒãšã¢ã¯ãã¥ãšãŒã¿ã¢ãžã¥ãŒã«ã®ååšïŒããã€ã¹ã¯ãçè«äžãã§ã¯ãªãããç®±ããåºããŠãããã«å®çšçã§ããå¿ èŠããããŸãïŒ
- ããã·ã³ãã«ãªã»ã³ãµãŒ/ã¢ã¯ãã¥ãšãŒã¿ãŒãšã®çžäºäœçšã®ããã®ã¯ã€ã€ã¬ã¹ãããŒã«ã«ãã€ã³ã¿ãŒãã§ãŒã¹
- ããã€ã¹ã®æäœãèšå®ããã³ç£èŠããããã®ã€ã³ã¿ãŒããããµãŒãã¹ïŒå人ã¢ã«ãŠã³ãïŒ
ã³ã³ãããŒã©ãŒããã¹ããåšèŸºæ©åš
äœåºŠãäœåºŠããã®æŠå¿µãšããŠã£ãã·ã¥ãªã¹ããã®ããªãã®ã»ãããçèããŠã1ã€ã®ãã€ã¯ãã³ã³ãããŒã©ãŒã§ç®¡çããããšã¯äžå¯èœã§ãããšããçµè«ã«éããŸããã 第äžã«ãäœã¬ãã«ã§ãã¹ãŠã®èšç»ãå®è¡ã§ããã»ã©ããããããã°ã©ãã³ã°ããæ¹æ³ããŸã ããããããã第äºã«ããã¹ãŠã®ã³ã³ãããŒã©ãŒããã®ãããªæ¬²æãããããã§ã¯ãããŸããã æãæµæã®å°ãªãçµè·¯ããšãããšã決å®ãããŸãã-ããã€ã¹ã2ã€ã®è«çéšåã«åå²ããŸãïŒ1ã€ïŒãã³ã³ãããŒã©ãŒãïŒã¯ãã€ã¯ãã³ã³ãããŒã©ãŒã«åºã¥ããããŒããŠã§ã¢ãšã®åºæ¬çãªå¯Ÿè©±ãæ åœãã2ã€ç®ïŒããã¹ããïŒã¯çµã¿èŸŒã¿Linuxã«åºã¥ããŠãããå€ãã®åœ¹å²ãæãããŸãé«ã¬ãã«ïŒã€ã³ã¿ãŒãã§ãŒã¹ãã«ãŒã«ã®ã·ã¹ãã ãAPIïŒã Arduinoãã€ã¯ãã³ã³ãããŒã©ãŒãæåã®ãããã¯ãšããŠéžæããïŒæšæž¬ïŒïŒãOpenWRTãã¡ãŒã ãŠã§ã¢ãåããTP-Link WR703Nã«ãŒã¿ãŒã2çªç®ã®ãããã¯ãšããŠäœ¿çšãããŸããïŒæ³šïŒDLink Dir-320ã«ãŒã¿ãŒäžã®åæ§ã®ããã€ã¹ã®ãã¢ãæ£åžžã«çµã¿ç«ãŠãããŸããïŒã æ£ããæããäºæ³ããŠãç§ã¯ããªããã¿ã¹ã¯ãæåã«ãããã¿ã€ãã®æŠå¿µã®å®è¡å¯èœæ§ããã¹ãããããšã§ãããåçšããã€ã¹ãèšèšããŠçµã¿ç«ãŠãããšã§ã¯ãªãããšãæãåºããããã§ãã ããã«ããããã®ã³ã³ããŒãã³ãã䜿çšãããšãããã€ã¹ã®ç¹°ãè¿ãã容æã«ãªããŸã-é·ãã©ã€ããªãŒãã³ãœãŒã¹ïŒ Arduinoã䜿çšãããšãç¡æ°ã®ã»ã³ãµãŒãšã¢ã¯ãã¥ãšãŒã¿ãŒãããã€ã¹ã«æ¥ç¶ããçµéšãé©çšã§ããŸãã
TP-Link WR703Nã«ãŒã¿ãŒïŒ
ãã€ã¯ãã³ã³ãããŒã©ãŒArduino NanoïŒ
次ã®èŠçŽ ãåšèŸºæ©åšã®åæã»ãããšããŠéžæãããŸããã
- ãã¿ã³
- ã¢ãŒã·ã§ã³ã»ã³ãµãŒ
- DS18B20枩床ã»ã³ãµãŒ
- 433Mhzã¬ã·ãŒããŒ
- ããŒã©ã€ãã©ã€ãã³ã³ãããŒã«ãã©ã³ã¹ããã¿ãŒ
ãåç¥ã®ããã«ãåšèŸºæ©åšã®ã»ããã¯ç°ãªãå ŽåããããŸããããã®äŸã§ã¯ãäžèšã®ãå®çšçãªãŠãŒãã£ãªãã£ãã®åçã«åºã¥ããŠãããåãäžããŸããã ãããã£ãŠãç§ãã¡ã®ããã€ã¹ã¯ããã¿ã³ã®æŒäžãåãã枩床å€åã«å¿çããå€éšã»ã³ãµãŒããããŒã¿ãåä¿¡ãïŒãã®å Žåã ããã§åè¿°ãããããã³ã«ã䜿çšããŸãã ïŒãNooliteã·ã¹ãã ã®é»æºã¢ãžã¥ãŒã«ãå¶åŸ¡ã§ããŸãïŒå¶åŸ¡ã¢ãžã¥ãŒã«ã«ã€ããŠã¯å¥ã®è©±ããããŸãïŒãŸããåçã¯ã¢ãžã¥ãŒã«ã®åçšã³ããŒã§ã¯ãªããã¡ãŒã«ãŒããã®æãåæã®ãããã¿ã€ãã®1ã€ã§ããããã¹ãã®ããã«ç§ã®ãšããã«æ¥ãŸããã
å®è£ ãã©ãããšåæèŠä»¶ãçµã¿åããããšãããã€ã¹ã®æ¬¡ã®ãããã¯å³ãåŸãããŸãã
ã¹ããŒã ã®èª¬æïŒ
- ãã®ããã€ã¹ã¯ãæç·/ç¡ç·åšèŸºæ©åšãšçžäºäœçšãããã€ã¯ãã³ã³ãããŒã©ãŒãšãå ¥ååŠçããžãã¯ãšã€ã³ã¿ãŒãã§ãŒã¹ãæ åœããã³ã¢ã§æ§æãããŠããŸã
- å€éšã®ã端æ«ãïŒã³ã³ãã¥ãŒã¿ãŒãé»è©±ãªã©ïŒããã³ãã³ããåä¿¡ããããã®APIãšWebã€ã³ã¿ãŒãã§ã€ã¹ããããŸã
- ã«ãŒã«ã®ããŠã³ããŒããéç¥ã®éä¿¡ãã³ãã³ãã®åä¿¡ã®ããã«å€éšãµãŒãã¹ãšéä¿¡ããããã€ã¹
ãã€ã¯ãã³ã³ãããŒã©ãŒã®æºå
ãã€ã¯ãã³ã³ãããŒã©ãŒã«ã¯2ã€ã®äž»ãªã¿ã¹ã¯ããããŸãã1ã€ç®ã¯ãå€éšããã€ã¹ããã³ã³ãœãŒã«ã«ã€ãã³ããåºåããããšã2ã€ç®ã¯ãæ¥ç¶ãããåšèŸºæ©åšã«éä¿¡ããã³ãã³ããã³ã³ãœãŒã«ããåä¿¡ããããšã§ãã
以äžã¯ãäžèšã®åšèŸºæ©åšã®è©³çŽ°ãèæ ®ããã¹ã±ããã®ããã¹ãã§ãã ãã®å Žåããã¿ã³ã¯PIN4ã«ãã¢ãŒã·ã§ã³ã»ã³ãµãŒã¯PIN3ã«ã枩床ã»ã³ãµãŒã¯PIN9ã«ãã©ãžãªã¯PIN8ã«ãNooliteã¢ãžã¥ãŒã«ã¯PIN 10ã11ã«æ¥ç¶ãããŸãã
ã³ã³ãããŒã©ãŒã®ã¹ã±ãã
#include <OneWire.h> #include <DallasTemperature.h> #include <VirtualWire.h> #include <EasyTransferVirtualWire.h> #include <EEPROM.h> //Needed to access the eeprom read write functions #include <SoftwareSerial.h> #define PIN_LED (13) // INDICATOR #define PIN_PIR (3) // BUTTON #define PIN_BUTTON (4) // BUTTON #define PIN_LED_R (6) // INDICATOR RED #define PIN_LED_G (5) // INDICATOR GREEN #define PIN_LED_B (7) // INDICATOR BLUE #define PIN_RF_RECEIVE (8) // EASYRF RECEIVER #define PIN_TEMP (9) // TEMPERATURE SENSOR #define PIN_NOO_RX (10) // RX PIN (connect to TX on noolite controller) #define PIN_NOO_TX (11) // TX PIN (connect to RX on noolite controller) #define TEMP_ACC (0.3) // temperature accuracy #define PERIOD_READ_TEMP (20) // seconds #define PERIOD_SEND_TEMP (600) // seconds (10 minutes) #define PERIOD_SEND_UPTIME (300) // seconds (5 minutes) #define NOO_BUF_LEN (12) unsigned int unique_device_id = 0; long int uptime = 0; long int old_uptime = 0; float sent_temperature=0; int sent_pir=0; int sent_button=0; int sent_button_longlick=0; long int timeCheckedTemp=0; long int timeSentTemp=0; long int timeSentUptime=0; long int timeButtonPressed=0; String inData; //create objects SoftwareSerial mySerial(PIN_NOO_RX, PIN_NOO_TX); // RX, TX OneWire oneWire(PIN_TEMP); DallasTemperature sensors(&oneWire); EasyTransferVirtualWire ET; unsigned int last_packet_id = 0; struct SEND_DATA_STRUCTURE{ //put your variable definitions here for the data you want to send //THIS MUST BE EXACTLY THE SAME ON THE OTHER ARDUINO //Struct can'e be bigger then 26 bytes for VirtualWire version unsigned int device_id; unsigned int destination_id; unsigned int packet_id; byte command; int data; }; //give a name to the group of data SEND_DATA_STRUCTURE mydata; //This function will write a 2 byte integer to the eeprom at the specified address and address + 1 void EEPROMWriteInt(int p_address, unsigned int p_value) { byte lowByte = ((p_value >> 0) & 0xFF); byte highByte = ((p_value >> 8) & 0xFF); EEPROM.write(p_address, lowByte); EEPROM.write(p_address + 1, highByte); } //This function will read a 2 byte integer from the eeprom at the specified address and address + 1 unsigned int EEPROMReadInt(int p_address) { byte lowByte = EEPROM.read(p_address); byte highByte = EEPROM.read(p_address + 1); return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00); } void nooSend(byte channel, byte buf[NOO_BUF_LEN]) { buf[0]=85; buf[1]=B01010000; // buf[4]=0; buf[5]=channel; buf[9]=0; int checkSum; for(byte i=0;i<(NOO_BUF_LEN-2);i++) { checkSum+=buf[i]; } buf[10]=lowByte(checkSum); buf[11]=170; Serial.print("Sending: "); for(byte i=0;i<(NOO_BUF_LEN);i++) { Serial.print(buf[i]); if (i!=(NOO_BUF_LEN-1)) { Serial.print('-'); } } Serial.println(""); for(byte i=0;i<(NOO_BUF_LEN);i++) { mySerial.write(buf[i]); } } void noolitePair(byte channel) { byte buf[NOO_BUF_LEN]; for(byte i=0;i<(NOO_BUF_LEN);i++) { buf[i]=0; } buf[2]=15; buf[3]=0; nooSend(channel,buf); } void nooliteUnPair(byte channel) { byte buf[NOO_BUF_LEN]; for(byte i=0;i<(NOO_BUF_LEN);i++) { buf[i]=0; } buf[2]=9; buf[3]=0; nooSend(channel,buf); } void nooliteTurnOn(byte channel) { byte buf[NOO_BUF_LEN]; for(byte i=0;i<(NOO_BUF_LEN);i++) { buf[i]=0; } buf[2]=2; buf[3]=0; nooSend(channel,buf); } void nooliteTurnOff(byte channel) { byte buf[NOO_BUF_LEN]; for(byte i=0;i<(NOO_BUF_LEN);i++) { buf[i]=0; } buf[2]=0; buf[3]=0; nooSend(channel,buf); } void nooliteSwitch(byte channel) { byte buf[NOO_BUF_LEN]; for(byte i=0;i<(NOO_BUF_LEN);i++) { buf[i]=0; } buf[2]=4; buf[3]=0; nooSend(channel,buf); } void nooliteLevel(byte channel,byte level) { byte buf[NOO_BUF_LEN]; for(byte i=0;i<(NOO_BUF_LEN);i++) { buf[i]=0; } buf[2]=6; buf[3]=1; buf[6]=level; nooSend(channel,buf); } void blinking(int count) { for(int i=0;i<count;i++) { digitalWrite(PIN_LED, HIGH); delay(200); digitalWrite(PIN_LED, LOW); delay(200); } } void setColor(int r,int g, int b) { digitalWrite(PIN_LED_R, r); digitalWrite(PIN_LED_G, g); digitalWrite(PIN_LED_B, b); } void setup() { randomSeed(analogRead(0)); pinMode(PIN_LED, OUTPUT); pinMode(PIN_LED_R, OUTPUT); pinMode(PIN_LED_G, OUTPUT); pinMode(PIN_LED_B, OUTPUT); pinMode(PIN_PIR, INPUT); pinMode(PIN_BUTTON, INPUT); Serial.begin(9600); // Debugging only ET.begin(details(mydata)); // Initialise the IO and ISR vw_set_rx_pin(PIN_RF_RECEIVE); vw_setup(2000); // Bits per sec vw_rx_start(); // Start the receiver PLL running // Device ID Serial.print("Getting Device ID... "); unique_device_id=EEPROMReadInt(0); if (unique_device_id<10000 || unique_device_id>60000 || unique_device_id==26807) { Serial.print("N/A, updating... "); unique_device_id=random(10000, 60000); EEPROMWriteInt(0, unique_device_id); } Serial.println(unique_device_id); pinMode(PIN_NOO_RX, INPUT); pinMode(PIN_NOO_TX, OUTPUT); mySerial.begin(9600); } void loop() { uptime=round(millis()/1000); if (uptime!=old_uptime) { Serial.print("Up: "); Serial.println(uptime); old_uptime=uptime; if (((uptime-timeSentUptime)>PERIOD_SEND_UPTIME) || (timeSentUptime>uptime)) { timeSentUptime=uptime; Serial.print("P:"); Serial.print(random(65535)); Serial.print(";F:"); Serial.print("0"); Serial.print(";T:0;C:"); Serial.print("24"); Serial.print(";D:"); Serial.print(uptime); Serial.println(";"); } } int current_pir=digitalRead(PIN_PIR); if (current_pir!=sent_pir) { Serial.print(millis()/1000); Serial.print(" Motion sensor: "); Serial.println(current_pir); Serial.print("P:"); Serial.print(random(65535)); Serial.print(";F:"); Serial.print("0"); Serial.print(";T:0;C:"); Serial.print("12"); Serial.print(";D:"); Serial.print("1"); Serial.println(";"); sent_pir=(int)current_pir; } int current_button=digitalRead(PIN_BUTTON); if (current_button!=sent_button) { delay(50); int confirm_current_button=digitalRead(PIN_BUTTON); if (confirm_current_button==current_button) { if (current_button==1) { timeButtonPressed=millis(); sent_button_longlick=0; } if (current_button==0) { if (sent_button_longlick!=1) { Serial.print(millis()/1000); Serial.print(" Button press: "); Serial.println(current_button); Serial.print("P:"); Serial.print(random(65535)); Serial.print(";F:"); Serial.print("0"); Serial.print(";T:0;C:"); Serial.print("23"); Serial.print(";D:"); Serial.print("3"); Serial.println(";"); } } sent_button=(int)current_button; } } else { if (current_button==1) { int passed=millis()-timeButtonPressed; if ((passed>3000) && (sent_button_longlick!=1)) { sent_button_longlick=1; Serial.print(millis()/1000); Serial.print(" Button long press: "); Serial.println(current_button); Serial.print("P:"); Serial.print(random(65535)); Serial.print(";F:"); Serial.print("0"); Serial.print(";T:0;C:"); Serial.print("23"); Serial.print(";D:"); Serial.print("4"); Serial.println(";"); } } else { sent_button_longlick=0; } } if (((uptime-timeCheckedTemp)>PERIOD_READ_TEMP) || (timeCheckedTemp>uptime)) { // TEMP SENSOR 1 float current_temp=0; sensors.requestTemperatures(); current_temp=sensors.getTempCByIndex(0); if (current_temp>-100 && current_temp<50) { timeCheckedTemp=uptime; Serial.print("Temp sensor: "); Serial.println(current_temp); float diff=(float)sent_temperature-(float)current_temp; if ((abs(diff)>=TEMP_ACC) || ((uptime-timeSentTemp)>PERIOD_SEND_TEMP)) { // timeSentTemp=uptime; sent_temperature=(float)current_temp; Serial.print("P:"); Serial.print(random(65535)); Serial.print(";F:"); Serial.print("0"); Serial.print(";T:0;C:"); Serial.print("10"); Serial.print(";D:"); Serial.print((int)(current_temp*100)); Serial.println(";"); } } else { //Serial.print("Incorrect T: "); //Serial.println(current_temp); } } if (Serial.available()) { char c=Serial.read(); if (c == '\n' || c == ';') { Serial.println(inData); int commandProcessed=0; if (inData.equals("blink")) { Serial.println("BLINKING!"); blinking(3); commandProcessed=1; } if (inData.startsWith("pair")) { commandProcessed=1; inData.replace("pair",""); noolitePair(inData.toInt()); } if (inData.startsWith("on")) { commandProcessed=1; inData.replace("on",""); nooliteTurnOn(inData.toInt()); } if (inData.startsWith("off")) { commandProcessed=1; inData.replace("off",""); nooliteTurnOff(inData.toInt()); } if (inData.startsWith("switch")) { commandProcessed=1; inData.replace("switch",""); nooliteSwitch(inData.toInt()); } if (inData.startsWith("level")) { commandProcessed=1; inData.replace("level",""); int splitPosition; splitPosition=inData.indexOf('-'); if(splitPosition != -1) { String paramString=inData.substring(0,splitPosition); int channel=paramString.toInt(); inData=inData.substring(splitPosition+1,inData.length()); nooliteLevel(channel,inData.toInt()); } } if (inData.startsWith("unpair")) { commandProcessed=1; inData.replace("unpair",""); nooliteUnPair(inData.toInt()); } if (inData.startsWith("color-")) { commandProcessed=1; inData.replace("color-",""); if (inData.equalsIgnoreCase("r")) { setColor(255,0,0); } if (inData.equalsIgnoreCase("g")) { setColor(0,255,0); } if (inData.equalsIgnoreCase("b")) { setColor(0,0,255); } if (inData.equalsIgnoreCase("w")) { setColor(255,255,255); } if (inData.equalsIgnoreCase("off")) { setColor(0,0,0); } } if (commandProcessed==0) { Serial.print("Unknown command: "); Serial.println(inData); } inData=""; Serial.flush(); } else { inData += (c); } } if(ET.receiveData()) { digitalWrite(PIN_LED, HIGH); if (last_packet_id!=(int)mydata.packet_id) { Serial.print("P:"); Serial.print(mydata.packet_id); Serial.print(";F:"); Serial.print(mydata.device_id); Serial.print(";T:"); Serial.print(mydata.destination_id); Serial.print(";C:"); Serial.print(mydata.command); Serial.print(";D:"); Serial.print(mydata.data); Serial.println(";"); last_packet_id=(int)mydata.packet_id; } digitalWrite(PIN_LED, LOW); } if (mySerial.available()) Serial.write(mySerial.read()); }
åšèŸºæ©åšã䜿çšããã³ã³ãããŒã©ãŒã®åäœã¯ããã¹ãã¢ãžã¥ãŒã«ã«æ¥ç¶ããã«ç¢ºèªã§ããŸããããã¡ãŒã ãŠã§ã¢ãèµ·åããåŸãããŒãã¢ãã¿ãŒãèµ·åããŠãã³ã³ãœãŒã«ã«è¡šç€ºãããå 容ã確èªããŠãã ããã ãã¹ãã¢ãžã¥ãŒã«ãåä¿¡ããã®ã¯ãã®ããŒã¿ã¹ããªãŒã ã§ããã確ç«ãããã«ãŒã«ã«åŸã£ãŠå¿çã§ããã®ã¯ãã¹ãã¢ãžã¥ãŒã«ã®ã¿ã§ãã
ãã¹ãã¢ãžã¥ãŒã«ïŒã«ãŒã¿ãŒïŒã®æºå
OpenWRTã·ã¹ãã ãæèŒããã«ãŒã¿ãŒã®ãã¡ãŒã ãŠã§ã¢ãšããã®èšäºã®ãã¬ãŒã ã¯ãŒã¯å ã§ã®ãã®åŸã®æ§æã«ã€ããŠã¯è§ŠããŸãããããã«é¢ããæ å ±ã¯ãWebã§ç°¡åã«èŠã€ããããšãã§ããŸãã ãã®çµæãã€ã³ã¿ãŒãããã¢ã¯ã»ã¹ãåããããŒã«ã«WiFiãããã¯ãŒã¯ã®ã¯ã©ã€ã¢ã³ãã¢ãŒãã§ã«ãŒã¿ãŒã䜿çšããæ¥ç¶ããããã€ã¯ãã³ã³ãããŒã©ãŒãCOMããŒããšããŠæ£ããèå¥ããå¿ èŠããããŸãã
次ã®ã¹ãããã¯ãã«ãŒã¿ãŒããã¹ãã¢ãžã¥ãŒã«ã«å€æããããšã§ãã Bashã€ã³ã¿ãŒããªã¿ãŒã䜿çšããŠããã¹ãã¢ãžã¥ãŒã«ã¹ã¯ãªãããèšè¿°ããŸããã ããã¯ç§ã«ãšã£ãŠéåžžã«äŸ¿å©ã§æ®éçãã€ãŸã ãã¹ãã¢ãžã¥ãŒã«ãã©ãããã©ãŒã ãç¹å®ã®ãéãå®è£ ã«ãã€ã³ãããŸãããOpenWRTãåããã«ãŒã¿ãŒã®ä»£ããã«ãçµã¿èŸŒã¿ã®Linuxãåããããã€ã¹ã䜿çšã§ããŸãïŒãã€ã¯ãã³ã³ãããŒã©ãŒãæ¥ç¶ããããã®Bashãšãã©ã€ããŒã®ã¿ãå¿ èŠãªå ŽåïŒã
ãã¹ãã¢ãžã¥ãŒã«ã®åäœã¢ã«ãŽãªãºã ã¯ã次ã®ç¹ã§è¡šãããšãã§ããŸãã
- åæå-å€éšWebãµãŒãã¹ïŒäœ¿çšå¯èœãªå ŽåïŒãããã®ããã€ã¹ã®æäœã«ãŒã«ãããŠã³ããŒããããã€ã¯ãã³ã³ãããŒã©ãŒãšã®éä¿¡ãã£ãã«ãã»ããã¢ããããŸã
- ã³ã³ãããŒã©ããããŒã¿ãåä¿¡ããããŒããããã«ãŒã«ã«åŸã£ãŠåŠçããŸã
ãœãŒã¹ã³ãŒãã¬ãã«ã§ã¯ã次ã®ããã«ãªããŸãã
èšå®ãã¡ã€ã«ïŒ/ect/master/settings.shïŒ
MASTER_ID="AAAA-BBBB-CCCC-DDDD" ARDUINO_PORT=/dev/ttyACM0 ARDUINO_PORT_SPEED=9600 UPDATES_URL="http://connect.smartliving.ru/rules/" DATA_PATH="/etc/master/data" WEB_PATH="/www" ONLINE_CHECK_HOST="8.8.8.8" LOCAL_BASE_URL="http://connect.dev"
ã¡ã€ã³åŠçã¹ã¯ãªãããã¡ã€ã«ïŒ/etc/master/cycle.shïŒ
#!/bin/bash # settings . /etc/master/settings.sh # STEP 0 # wait to be online COUNTER=0 while [ $COUNTER -lt 5 ]; do ping -c 1 $ONLINE_CHECK_HOST if [[ $? = 0 ]]; then echo Network available. break; else echo Network not available. Waiting... sleep 5 fi let COUNTER=COUNTER+1 done #--------------------------------------------------------------------------- # START if [ ! -d "$DATA_PATH" ]; then mkdir $DATA_PATH chmod 0666 $DATA_PATH fi while : do #--------------------------------------------------------------------------- # Downloading the latest rules from the web echo Getting rules from $UPDATES_URL?id=$MASTER_ID wget -O $DATA_PATH/rules_set.tmp $UPDATES_URL?id=$MASTER_ID if grep -Fq "Rules set" $DATA_PATH/rules_set.tmp then mv $DATA_PATH/rules_set.tmp $DATA_PATH/rules_set.sh else echo Incorrect rules file fi #--------------------------------------------------------------------------- # Reading all data and sending to the web ALL_DATA_FILE=$DATA_PATH/all_data.txt rm -f $ALL_DATA_FILE echo -n id=$MASTER_ID>>$ALL_DATA_FILE echo -n "&data=">>$ALL_DATA_FILE FILES=$DATA_PATH/*.dat for f in $FILES do #echo "Processing $f file..." OLD_DATA=`cat $f` fname=${f##*/} PARAM=${fname/.dat/} echo -n "$PARAM|$OLD_DATA;">>$ALL_DATA_FILE done ALL_DATA=`cat $ALL_DATA_FILE` echo Posting: $UPDATES_URL?$ALL_DATA wget -O $DATA_PATH/data_post.tmp $UPDATES_URL?$ALL_DATA rm -f $DATA_PATH/*.dat #--------------------------------------------------------------------------- # Downloading the latest menu from the web echo Getting menu from $UPDATES_URL/menu2.php?download=1\&id=$MASTER_ID wget -O $DATA_PATH/menu.tmp $UPDATES_URL/menu2.php?download=1\&id=$MASTER_ID if grep -Fq "stylesheet" $DATA_PATH/menu.tmp then mv $DATA_PATH/menu.tmp $WEB_PATH/menu.html else echo Incorrect menu file fi #--------------------------------------------------------------------------- START_TIME="$(date +%s)" # main cycle stty -F $ARDUINO_PORT ispeed $ARDUINO_PORT_SPEED ospeed $ARDUINO_PORT_SPEED cs8 ignbrk -brkint -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts #--------------------------------------------------------------------------- while read LINE; do echo $LINE PASSED_TIME="$(($(date +%s)-START_TIME))" # Processing incoming URLs from controller REGEX='^GET (.+)$' if [[ $LINE =~ $REGEX ]] then URL=$LOCAL_BASE_URL${BASH_REMATCH[1]} #-URL=$LOCAL_BASE_URL wget -O $DATA_PATH/http.tmp $URL echo Getting URL echo $URL fi PACKET_ID="" DATA_FROM="" DATA_TO="" DATA_COMMAND="" DATA_VALUE="" REGEX='^P:([0-9]+);F:([0-9]+);T:([0-9]+);C:([0-9]+);D:([0-9]+);$' if [[ $LINE =~ $REGEX ]] then PACKET_ID=${BASH_REMATCH[1]} DATA_FROM=${BASH_REMATCH[2]} DATA_TO=${BASH_REMATCH[3]} DATA_COMMAND=${BASH_REMATCH[4]} DATA_VALUE=${BASH_REMATCH[5]} DATA_FILE=$DATA_PATH/$DATA_FROM-$DATA_COMMAND.dat echo -n $DATA_VALUE>$DATA_FILE fi if [ -f $DATA_PATH/incoming_data.txt ]; then echo "New incoming data:"; echo `cat $DATA_PATH/incoming_data.txt` cat $DATA_PATH/incoming_data.txt>$ARDUINO_PORT rm -f $DATA_PATH/incoming_data.txt fi ACTION_RECEIVED="" if [ -f $DATA_PATH/incoming_action.txt ]; then ACTION_RECEIVED=`cat $DATA_PATH/incoming_action.txt` echo "New incoming action: $ACTION_RECEIVED" rm -f $DATA_PATH/incoming_action.txt fi . $DATA_PATH/rules_set.sh if [ -f $DATA_PATH/reboot ]; then echo "REBOOT FLAG" rm -f $DATA_PATH/reboot break; fi done < $ARDUINO_PORT done #--------------------------------------------------------------------------- echo Cycle stopped.
èšå®ã§ã¯ãããã€ã¹ã«äžæã®èå¥åïŒMASTER_IDïŒãããããšãããããŸããããã¯ãWebãµãŒãã¹ãšã®ããåãã«äœ¿çšãããŸãïŒæ°žç¶çãªæ¥ç¶ã¯å¿ èŠãªãããšãæãåºããŸãïŒã
ã¡ã€ã³ã¹ã¯ãªããã®äœæ¥äžããã£ã¬ã¯ããª/ etc / master / data /ã䜿çšããŠãããŒããããã«ãŒã«ã³ãŒããææ°ã®ã»ã³ãµãŒæž¬å®å€ã®ä¿åãããã³ã«ãŒã«ã·ã¹ãã ã®äžéšã®æ§æïŒã¿ã€ããŒãªã©ïŒã®äœæ¥ãè¡ããŸãã
ãã®ãªã³ã¯ãããã¡ã€ã«ã®å®å šãªã»ãããããŠã³ããŒãã§ããŸãã
ã«ãŒã«ã·ã¹ãã
ã«ãŒã«ã·ã¹ãã ã®æŠèŠã¯äžèšã®ãšããã§ãã®ã§ãããã§ããå°ã詳ãã説æããŸãã å®éãåã«ãŒã«ã¯bashåœä»€ã®ã»ããã§ãã ãã®ã»ããã®æåã®éšåã§ããActivatorãåŒã³åºããŠãåä¿¡ããŒã¿ããã®ã«ãŒã«ã«æºæ ããŠãããã©ããã確èªãã2çªç®ã®éšåïŒContractorïŒã§ããã€ãã®ã¢ã¯ã·ã§ã³ãçŽæ¥å®è¡ããŸãã
ã«ãŒã«ãã¢ã¯ãã£ãã«ããããã®å¯èœãªæ¡ä»¶ïŒ
- ãã€ã¯ãã³ã³ãããŒã©ãŒããç¹å®ã®åœ¢åŒã®æååãååŸãã
- å éšïŒãã¿ã³ãã¢ãŒã·ã§ã³ã枩床ïŒãŸãã¯å€éšïŒã¯ã€ã€ã¬ã¹ïŒã»ã³ãµãŒããç¹å®ã®åœ¢åŒã®ã³ãã³ããåä¿¡ãã
- APIãŸãã¯å¥ã®ã«ãŒã«ã«ãããæåãã¢ã¯ãã£ããŒã·ã§ã³ïŒã¹ã¯ãªããã®å®è¡ïŒ
å¯èœãªã¢ã¯ã·ã§ã³ïŒ
- å€æ°å€ãèšå®ãã
- ã»ã³ãµãŒã³ã³ãããŒã©ãŒãžã®è¡/ã³ãã³ãã®éä¿¡ïŒå éšåŠçãŸãã¯å€éšããã€ã¹çšïŒ
- å€éšWebã·ã¹ãã ãžã®HTTPãªã¯ãšã¹ã
- ã·ã§ã«ã³ãã³ãã®å®è¡ïŒLinuxïŒ
- ã¹ã¯ãªããå®è¡
- é 延ã¿ã€ããŒã¢ã¯ã·ã§ã³
ã«ãŒã«ãœãŒã¹ã³ãŒãã®äŸ
# RULE 2 Forwarder RCSwitch (regex) MATCHED_RULE2='0' REGEX='^RCSwitch:(.+)$' if [[ $LINE =~ $REGEX ]] then MATCHED_RULE2="1" fi # RULE 2 ACTIONS if [[ "$MATCHED_RULE2" == "1" ]] then #Action 2.1 (http) echo "HTTP request: http://192.168.0.17/objects/?script=RCSwitch&rcswitch=${BASH_REMATCH[1]}" wget -O $DATA_PATH/http.tmp http://192.168.0.17/objects/?script=RCSwitch\&rcswitch=${BASH_REMATCH[1]} fi
ããã€ã¹ãWebã·ã¹ãã ã«ç»é²ããåŸããŠãŒã¶ãŒã®å人ã¢ã«ãŠã³ããä»ããŠã«ãŒã«ãæ§æãããŸãïŒçŸåšããµãŒããŒã³ã³ããŒãã³ãå šäœãconnect.smartliving.ruãããžã§ã¯ãã®äžéšãšããŠå®è£ ãããŠããŸãïŒã ãã®å Žåãããã°ã©ãã³ã°ããå¿ èŠã¯ãããŸãããWebã·ã¹ãã èªäœããŠãŒã¶ãŒå®çŸ©ã®ã«ãŒã«ãbashã³ãã³ãã«å€æããŸãã ãŠãŒã¶ãŒåŽã§ã¯ãæ§æã€ã³ã¿ãŒãã§ã€ã¹ã¯æ¬¡ã®ããã«ãªããŸãã
ã€ã³ã¿ãŒãã§ãŒã¹ãšAPI
ååãšããŠãäžèšã¯èªåŸã¢ãžã¥ãŒã«ãäœæããã®ã«ååã§ããããŠã£ãã·ã¥ãªã¹ãã¯é·ããå®è£ ãžã®éããããŸããã 次ã®ã¹ãããã¯ãWebã€ã³ã¿ãŒãã§ãŒã¹ãšAPIãäœæããããšã§ããã ãã®æé ã¯ãåã®æé ãšæ¯èŒããŠããã»ã©è€éã§ã¯ãªããåæ§ã®ååã«åŸã£ãŠå®è£ ãããŸããã ãã¹ãããã€ã¹ã«ã¯æ¢ã«WebãµãŒããŒãååšãããããAPIãå®è£ ããããã«å¥ã®bashã¹ã¯ãªãããäœæããã/ www / cgi-bin / masterã«é 眮ãããŸãã
ã¹ã¯ãªãããœãŒã¹ã³ãŒã/ www / cgi-bin / master
#!/bin/bash DATA_PATH="/etc/master/data" echo "Content-type: text/plain" echo "" # Save the old internal field separator. OIFS="$IFS" # Set the field separator to & and parse the QUERY_STRING at the ampersand. IFS="${IFS}&" set $QUERY_STRING Args="$*" IFS="$OIFS" # Next parse the individual "name=value" tokens. ARG_VALUE="" ARG_VAR="" ARG_OP="" ARG_LINE="" for i in $Args ;do # Set the field separator to = IFS="${OIFS}=" set $i IFS="${OIFS}" case $1 in # Don't allow "/" changed to " ". Prevent hacker problems. var) ARG_VAR="`echo -n $2 | sed 's|[\]||g' | sed 's|%20| |g'`" ;; # value) ARG_VALUE=$2 ;; line) ARG_LINE=$2 ;; op) ARG_OP=$2 ;; *) echo "<hr>Warning:"\ "<br>Unrecognized variable \'$1\' passed.<hr>" ;; esac done # Set value #ARG_OP="set" #echo $ARG_OP if [[ "$ARG_OP" == "set" ]] then # echo "Set operation<br>" echo -n "$ARG_VALUE">$DATA_PATH/$ARG_VAR.dat echo "OK" fi if [[ "$ARG_OP" == "get" ]] then # echo "Get operation<br>" cat $DATA_PATH/$ARG_VAR.dat fi if [[ "$ARG_OP" == "send" ]] then # echo "Send<br>" echo -n $ARG_LINE>>$DATA_PATH/incoming_data.txt echo "OK" fi if [[ "$ARG_OP" == "action" ]] then # echo "Action<br>" echo -n $ARG_LINE>>$DATA_PATH/incoming_action.txt echo "OK" fi if [[ "$ARG_OP" == "refresh" ]] then # echo "Send<br>" echo "Web">$DATA_PATH/reboot echo "OK" fi if [[ "$ARG_OP" == "run" ]] then # echo "Run<br>" echo `$ARG_LINE` fi
ãã®ã¹ã¯ãªããã¯ã次ã®APIã³ãã³ããæäŸããŸãã
å€æ°å€ãèšå®ãã
_/cgi-bin/master?op=set&var=Variable1&value=Value1
Variable1ã®å€ãValue1ã«èšå®ããŸã
å€æ°ã®å€ãååŸãã
_/cgi-bin/master?op=get&var=Variable1
Variable1ã®å€ãè¿ããŸã
ã³ã³ãããŒã©ãŒãžã®ããŒã¿éä¿¡
_/cgi-bin/master?op=send&line=SomeData
æ¥ç¶ãããã³ã³ãããŒã©ãŒã«SomeDataæååãéä¿¡ããŸã
ã¢ã¯ã·ã§ã³ã®ã¢ã¯ãã£ããŒã·ã§ã³
_/cgi-bin/master?op=action&line=SomeAction
ã«ãŒã«ã«èšè¿°ãããŠããSomeActionã¢ã¯ã·ã§ã³ãåæåããŸãïŒã¿ã€ããã¢ã¯ãã£ãã¢ã¯ã·ã§ã³ãïŒ
ã«ãŒã«ã®åŒ·å¶æŽæ°
_/cgi-bin/master?op=refresh
ããã€ã¹ãåèµ·åããã«ãã«ãŒã«ãšWebã€ã³ã¿ãŒãã§ã€ã¹ã®åŒ·å¶æŽæ°ïŒããŠã³ããŒãïŒãåæåããŸã
ã·ã¹ãã ããŒã
_/cgi-bin/master?op=run&line=SomeCommand
ã·ã¹ãã ã·ã§ã«ã§SomeCommandã®å®è¡ãåæåããŸãïŒããšãã°ããrebootãã䜿çšãããšããã€ã¹ãåèµ·åãããŸãïŒ
APIãWebã€ã³ã¿ãŒãã§ãŒã¹ã«ãªã£ãåŸã 圌ã¯ã«ãŒã«ãšåãããã«æ±ãããŸãããWebãµãŒãã¹ã§èšå®ããåãåæå段éã§ããã€ã¹ã§æŽæ°ããŸããã ããã€ã¹ã®ã³ã³ãããŒã«ã¡ãã¥ãŒãäœæããããã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯æ¬¡ã®ãšããã§ãã
è»èŒªãåçºæããªãããã«ã軜éã®Krakenããã³ããšã³ããã¬ãŒã ã¯ãŒã¯ãæ¡çšããã/ www / kraken-masterãã©ã«ããŒã«ãããããããŸããã åæååŸãmenu.htmlãã¡ã€ã«ã/ www /ãã©ã«ããŒã«è¡šç€ºãããããã«å¿ããŠãæ§ææžã¿ã®Webã€ã³ã¿ãŒãã§ãŒã¹ã«ã¢ã¯ã»ã¹ã§ããŸãã
_/menu.html
_/menu.html
ãã®ã¿ã€ãã®ã¢ãã¬ã¹ã¯å¶ç¶ã«éžã°ããããã§ã¯ãããŸããããMajorDroidã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ïŒAndroidãã©ãããã©ãŒã çšïŒãšã®äºææ§ã®ããã«å°ã詳ãã説æããŠããŸãããç§ã¯ãããããã®ã®æ®éæ§ãšäºææ§ã®ããã§ãã
ãªã³ã©ã€ã³ã¯ãŒã¯
ããããšãã·ã¹ãã ãå€æããŸããããããã ãã§ã¯ãããŸãããïŒã-ããªãã¯å°ããŸãã ãŸããã»ãšãã©ãã»ãã®å°ãã ãæ®ã£ãã ããæ£ç¢ºã«ã¯ããŠãŒã¶ãŒã«ãšã£ãŠã¯ãå°ããªããã®ã§ãããéçºè ã«ãšã£ãŠã¯å€§ããªèå°ã§ãïŒããããããšã§ãïŒã ããªãã¡-ã€ã³ã¿ãŒãããçµç±ã§ããã€ã¹ãæäœããŸãã Webã€ã³ã¿ãŒãã§ãŒã¹ããããã«ãŒã¿ãŒã®ããŒãã転éããŠãå¥åº·ã楜ããã§ããããã«èŠããŸãã ãããããããã¯ç§ãã¡ã®æ¹æ³ã§ã¯ãªããç§ãã¡ã®æ¹æ³ã¯ä»è ã®ç掻ãåçŽåããããšã«ãããŸãïŒãããŠç§ãã¡èªèº«ãè€éã«ããŸãïŒã ææªã®å Žå-ã«ãŒã¿ã®èšå®ãå€æŽããŠè»¢éããŒããäœæããæ¹æ³ã¯ãããŸããã ãŸãã¯ãåããããã¯ãŒã¯äžã§å€ãã®åæ§ã®ããã€ã¹ã䜿çšãããããããïŒä»®ã«ïŒå€éšããã¢ã¯ã»ã¹ã§ããããã«ããããšèããããŠããŸãã 解決çã¯æ¬¡ã®ãšããã§ããããã€ã¹èªäœã¯ãããŒã¿ãšã³ãã³ãã亀æããããã«å€éšãµãŒããŒãšã®ãã£ãã«ãéå§ããã³ç¶æããå¿ èŠããããŸãããå€éšãµãŒããŒã¯ç¹å®ã®ããã€ã¹ã«æå®ãããWebã€ã³ã¿ãŒãã§ã€ã¹ãè€è£œãããã®ãã£ãã«ãä»ãããŠãŒã¶ãŒããã®ã³ãã³ãã®è»¢éãç·šæããŸããã ãã£ãã«ã¯ãœã±ããæ¥ç¶ã§ãããäžæ¹ã§ïŒããã€ã¹äžã§ïŒå¥ã®bashã¹ã¯ãªãããäœæããä»æ¹ã§ïŒãµãŒããŒäžã§ïŒãœã±ãããµãŒããŒãäœæããŸãã
ããã€ã¹ã§ã¯ãã¹ã¯ãªããã¯/ etc / master / socket_clientã«ãããŸã
ã¹ã¯ãªãããœãŒã¹ã³ãŒã/ etc / master / socket_client
#!/bin/bash # settings . /etc/master/settings.sh # STEP 0 # wait to be online COUNTER=0 while [ $COUNTER -lt 5 ]; do ping -c 1 $ONLINE_CHECK_HOST if [[ $? = 0 ]]; then echo Network available. break; else echo Network not available. Waiting... sleep 5 fi let COUNTER=COUNTER+1 done #--------------------------------------------------------------------------- # START if [ ! -d "$DATA_PATH" ]; then mkdir $DATA_PATH chmod 0666 $DATA_PATH fi while : do TEST_FILE=$DATA_PATH/data_sent.txt touch $TEST_FILE SOCKET_HOST=connect.smartliving.ru SOCKET_PORT=11444 exec 3<>/dev/tcp/$SOCKET_HOST/$SOCKET_PORT NOW=$(date +"%H:%M:%S") echo -n $NOW echo " Sending: Hello!" echo "Hello!">&3 read -t 60 ok <&3 NOW=$(date +"%H:%M:%S") echo -n $NOW echo -n " Received: " echo "$ok"; REGEX='^Please' if [[ ! $ok =~ $REGEX ]] then NOW=$(date +"%H:%M:%S") echo -n $NOW echo " Connection failed!" continue fi NOW=$(date +"%H:%M:%S") echo -n $NOW echo " Sending: auth:$MASTER_ID" echo "auth:$MASTER_ID">&3 read -t 60 ok <&3 NOW=$(date +"%H:%M:%S") echo -n $NOW echo -n " Received: " echo "$ok"; REGEX='^Authorized' if [[ ! $ok =~ $REGEX ]] then NOW=$(date +"%H:%M:%S") echo -n $NOW echo " Authorization failed!" exit 0 fi NOW=$(date +"%H:%M:%S") echo -n $NOW echo " Sending: Hello again!" echo "Hello again!">&3 read -t 60 ok <&3 NOW=$(date +"%H:%M:%S") echo -n $NOW echo -n " Received: " echo "$ok"; while read -t 120 LINE; do NOW=$(date +"%H:%M:%S") echo -n $NOW echo -n " Got line: " echo $LINE # Ping reply REGEX='^PING' if [[ $LINE =~ $REGEX ]] then echo -n $NOW echo " Sending: PONG!" echo PONG!>&3 fi # Run action REGEX='^ACTION:(.+)$' if [[ $LINE =~ $REGEX ]] then DATA_RECEIVED=${BASH_REMATCH[1]} NOW=$(date +"%H:%M:%S") echo -n $NOW echo -n " Action received: " echo $DATA_RECEIVED echo -n $DATA_RECEIVED>>$DATA_PATH/incoming_action.txt fi # Pass data REGEX='^DATA:(.+)$' if [[ $LINE =~ $REGEX ]] then DATA_RECEIVED=${BASH_REMATCH[1]} echo -n $NOW echo -n " Data received: " echo $DATA_RECEIVED echo -n $DATA_RECEIVED>>$DATA_PATH/incoming_data.txt fi # Pass data REGEX='^URL:(.+)$' if [[ $LINE =~ $REGEX ]] then DATA_RECEIVED=${BASH_REMATCH[1]} echo -n $NOW echo -n " URL received: " echo wget -O $DATA_PATH/data_post.tmp http://localhost$DATA_RECEIVED fi # Check files modified FILES=$DATA_PATH/*.dat for f in $FILES do if [ $f -nt $TEST_FILE ]; then echo "Processing $f ..." FNAME=${f##*/} PARAM=${FNAME/.dat/} CONTENT=`cat $f` echo -n $NOW echo " Sending: DATA:$PARAM|$CONTENT;" echo "data:$PARAM|$CONTENT;">&3 fi done touch $TEST_FILE done <&3 done #--------------------------------------------------------------------------- echo Cycle stopped.
ããã€ã¹ãæäœããããã®ãªã³ã¯ãšQRã³ãŒãã¯ããŠãŒã¶ãŒãã¢ã«ãŠã³ãããå©çšã§ããŸãã 以äžã®1ã€ã®ãã¹ãã±ãŒã¹ïŒ
ä»åŸã®èª²é¡
説æãããæ§é å šäœã¯éåžžã«å®å®ããŠåäœããŸãããããããçºå£²ããæ°ãæãçµéããèšäºãæžãããšã«æ±ºããææã§ãããããã€ã¹ã¯ãã®äžã«å®ããããæ©èœãæ£ããå®è¡ããŸããã ãããã圌ããèšãããã«ããã¹ãŠãããªã«ãªãã§å®è£ ãããŠããŸãã æŠå¿µãæ€èšŒããã«ã¯ããã§ååã§ããããã®ïŒãŸãã¯åæ§ã®ïŒãã©ãããã©ãŒã ã§ããã€ã¹ã倧éã«å°å ¥ããã«ã¯ã次ã®é åã§äœæ¥ããŸãã
- ã»ãã¥ãªãã£ïŒæå·åãã€ã³ã¿ãŒãã§ã€ã¹ã«ã¢ã¯ã»ã¹ããããã®ãã¹ã¯ãŒããªã©ïŒ
- ãµãŒããŒåŽã®ããã©ãŒãã³ã¹ïŒãããŸã§ã®ãšããåé¡ã¯ãããŸããã§ããããèªå®¶è£œãœã±ãããµãŒããŒã¯æé©ãªå®è£ ãªãã·ã§ã³ããã¯ã»ã©é ãã§ãïŒ
- UI / UXïŒããã€ã¹ãšå人ã¢ã«ãŠã³ãã®äž¡æ¹ïŒ
- ã¢ã€ãã³ïŒãArduinoïŒã«ãŒã¿ãŒïŒïŒãé¡ãããŸã...ãïŒ
ãããã«
ãã®èšäºã§ã¯ããã¹ãŠã®æ§æã®è©³çŽ°ãšèªåå®è¡ã¹ã¯ãªããèšå®ãªã©ã®ããã€ãã®ããšã«ã€ããŠã¯èª¬æããŠããŸãããäž»ãªæ©èœãšæŠå¿µã®æ¬è³ªãäŒããããã«ãæå³çã«çç¥ããŸããã
ç¹ã«ããã®ããã€ã¹ãšãã®äœæããã»ã¹å šäœã¯ãåã ã®ã³ã³ããŒãã³ããšãã¯ãããžãŒã®åäœããã¹ãããããã®å®éšã§ããã ãã®éçšã§ã¢ã€ãã¢ãçãŸããä»ã®ããã€ã¹ãã·ã¹ãã ã«å ·çŸåãããäœããå€éšãããã®ãããžã§ã¯ãã«ç§»è¡ãããããäžè¬çã«æéã¯ãŒãããããé¢ããŠããŸããã å®è£ ã®çµéšã圹ã«ç«ãŠã°å¹žãã§ãã
ã³ã³ã»ããã®åçšã¢ããªã±ãŒã·ã§ã³ã®ãããã¯ãéçºããå ŽåãããŸãäžè¬çã§ã¯ãªããããããé©çšãããå®è£ ã«ã€ããŠè©±ãããšãã§ããŸãã äŸïŒ
- èªå® èŠåå¡-誰ãã家ã«åž°ã£ãããšãšå®€æž©ãææè ã«éç¥ããŸã
- ç §æã³ã³ãããŒã©ãŒ-ã¹ã±ãžã¥ãŒã«/ã€ãã³ãç §æå¶åŸ¡
- æ°åå¶åŸ¡-å€éšã®æž©åºŠ/湿床ã»ã³ãµãŒããã®æ å ±ã®åä¿¡ãšã¢ã¯ãã¥ãšãŒã¿ãŒã®å¶åŸ¡
- å¥åº·ç®¡ç-ãã¢ã©ãŒã ããã¿ã³ãæŒãããšãããŸãã¯é·æéåããªããšãã«éç¥ãéä¿¡ãã
ãããã£ãŠãåãããŒã¹ã䜿çšããŠãå€ãã®é©çšããããããã¯ã¹åããœãªã¥ãŒã·ã§ã³ãäœæããåæ§ã®ãã€ã³ã¿ãŒãããã®ã¢ãããããé«ãã¬ãã«ã®æ å ±ã·ã¹ãã ã«çµ±åã§ããŸãã
PSçµæã®ããã€ã¹ã®ãã©ã€ããåçãã¢ããããŒããããã©ããé·ãéèããŠããŸããããäºæ¥å šäœã®å®éšçãªæ§è³ªã«ã€ããŠãã§ã«èŠåããŠããã®ã§ã段ããŒã«ã±ãŒã¹ïŒãŸãã¯å¿ èŠã«å¿ããŠãã®ã¬ã€ã¢ãŠãïŒã¯éåžžã«äžè²«ããŠããŸãïŒ
PPSç§ã¯ã»ãšãã©å¿ããŠããŸããããªã¹ããããã³ã³ããŒãã³ãã®ãã¹ãŠãåãããã®ããã€ã¹ã®ã³ã¹ãã¯çŽ60ãã«ã«ãªããè²»ããããæéã¯è²Žéã§ãã