Pan z Pogodna – aplikacja iOS

Jedyn z elementów składowych projektu Pan z Pogodna jest aplikacja mobilna, z której można odczytywać dane i sterować tym wszytkim co można – swiatło, bramy, alarm po WIFI. I powstała taka apka, jakiś rok temu napisałem na platformę iOS, bo Androida nigdy nie znałem, nie znam i nie chcę znać.

Kiedyś na topie był objective-c i tym języku powstała apka, której nie można pobrać na App Store, bo po co ona komu innemu niż mnie, a poza tym nie wiem czy by przeszła weryfikację po stronie Apple ale to inna historia. Oprócz sterowania światłem i ruszaniem bram wjazdowych widac aktualny ich stan, temperatury w domu. Oprócz tego, gdy jeszcze wierzyłem w ibeacony to apka miała byc kluczem do zdalnego otwierania bramy garazowej i automatycznym namierzaczem pozycji GPS gdy byłbym w zasięgu beacona, np w samochodze. Automatycznie do tego ekran z mapą, gdzie mógłbym zobaczyć swoje trasy na mapie filtrując dane po czasie.

aplikacja mobilna

Jednakże znowu…superby było, gdy wszytsko było tak jak człowiek sobie wymyśli. Na pierwszy rzut oka mozliwości są ogromne, biorąc pod uwage fakt, że sterowanie np. oświetleniem w domu lub ogrodzie ze smartfona jest wygodne. Jednak czasami jest tak, że będąc juz w zasięgu swojego domowego wifi, a tylko tak mogę strować czymkolwiek (będąć zalogowanym do sieci lokalnej) powiedzmy 40 % zapytań do esp8266 przy jednostce głównej arduino nie kończy się odpowiedzią, co powoduje nieskończone zapytania http co zawiesza apkę na jakis czas. Skutki sa takie, że chcąc coś zrobić przez apkę nie mogę tego uczynić. Nie wiem czy jest to może wina słabej sieci w domu, jakiś zakłóceń, może ogległości do esp8266 które jest w garażu… a może po prostu moduł za 16.99 po prostu nie zawsze działa poprawnie.

Przykład objective-c kodu z zapytaniem http z parametrem odpowiedziałem za konkretny pin w arduino:

-(void)sendRequestLight:(NSString*)p{

    Singleton *sharedManager = [Singleton sharedManager];
    //ustal p ja jakas wartosc i przenies ja do arduino
    NSURL * url = [NSURL URLWithString:@"http://192.168.0.44/?p=1"];

    NSMutableURLRequest * request =[NSMutableURLRequest requestWithURL:url];
    request.HTTPMethod=@"POST";
   
    int userId =3;
    NSString * params = [NSString stringWithFormat:@"userId=%d", userId];
   
    NSData * data =[params dataUsingEncoding:NSUTF8StringEncoding];
    [request addValue: @"8bit" forHTTPHeaderField:@"Content-Transfer-Encoding"];
    [request addValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    [request addValue:[NSString stringWithFormat:@"%lu", [data length]]  forHTTPHeaderField:@"Content-Length"];
    [request setHTTPBody:data];
   
    NSHTTPURLResponse * response = nil;
    NSData *data1 = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
   
    if([response statusCode]==200){
       
        NSString * str = [[NSString alloc] initWithData:data1 encoding:NSUTF8StringEncoding];
        NSLog(@"res = %@", str);
        self.scroller.hidden=true;
        [self.scroller stopAnimating];
    }
   
}

To po stronie aplikacji, pozostaje jeszcze kwestiakody po stronie arduino, który odbierze request i go dalej przetworzy na konkretną czynność, np:

Na pewno pewniejszym rozwiązaniem jest strowanie arduino poprzez SMSy. Zawsze dochodzi do skutku i działa z każdego miejsca na świecie ale niestety każdy jeden kosztuje… O SMSach na arduiono z modułem sim800L w kolejnej odsłonie.

#define TIMEOUT     5000
char bufor [60];

void setup() {
  // put your setup code here, to run once:
      Serial.begin(9600);
      Serial1.begin(115200);
    
      Serial1.setTimeout(TIMEOUT);
      delay(2000);
}

void loop() {

   while (Serial1.available() > 0){
      
          if (Serial1.find("+IPD,")) {
    
            delay(1000);
            Serial1.find("p=");
            int connectionId = 0;
            int pinNumber = (Serial1.read() - 48) * 10; 
            pinNumber += (Serial1.read() - 48);
    
            String webpage ;
            webpage += "HTTP/1.1 200 OK\r\n";
            webpage += "Content-Type: text/html\r\n";
            webpage += "Access-Control-Allow-Origin: *\r\n\r\n";
            webpage += "<!DOCTYPE HTML>\r\n<html>\r\n";
    
            if (pinNumber == 1) { //flash na podejzdzie
    
              //wykonaj jakąs fukcję na p = 0
              webpage += "ok";
    
            }
            webpage += "</html>\n";
    
            sprintf(bufor, "AT+CIPSEND=%d,%d", connectionId, webpage.length());
            if (wyslij(bufor, ">", 200))
              Serial.println("Wysylanie");
            if (wyslij(webpage, "OK", 200))
              //Serial.println("Wyslano");
    
              //sprintf(bufor,"AT+CIPCLOSE=%d",connectionId);
              if (wyslij("AT+CIPCLOSE=0", "OK", 200))
                Serial.println("Zamknieto");
    
          }
        }

}

  boolean wyslij(String Komenda_AT, char *Odpowiedz_AT, int czas_czekania) {
    Serial1.println(Komenda_AT);
    delay(czas_czekania);
    while (Serial1.available() > 0) {
      if (Serial1.find(Odpowiedz_AT)) {
        // Serial.println(Serial1.read()-48);
        return 1;
      }
    }
    return 0;
  }

W gruncie rzeczy to wykonaliśmy zapytanie z apki do arduino z parametrem p z odpowiedzią „ok” wraz z naglowkami w stringu „webpage”. Kod działa, miłej zabawy


Opublikowano: 6 kwietnia, 2017 przez Pan z Pogodna

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *