Avatar billede syswatch Novice
25. marts 2015 - 15:28 Der er 3 kommentarer

Omskrive function til Unifi / cURL

Hejsa,
Jeg sidder og roder med en portal løsning til en Unifi controller.
Den kan man kommunikere med via curl, og det jeg har fået stykket sammen virker sådan set også fint med basis funktionerne.

Nu har jeg fundet en function fra en Class som jeg vil prøve at implementere, men kan ikke rigtig finde ud af hvordan jeg skal omskrive koden så den virker med den måde jeg sender kommandoer afsted.
Nogen som kan sige mig hvordan det gøres... er det expert i PHP, men kan lidt til "husbehov" :)

Her er den function jeg har fundet:
public function list_guests() {
      $return=array();
      if (!$this->is_loggedin) return $return;
      $return=array();
      $content=$this->exec_curl($this->baseurl."/api/s/".$this->site."/stat/sta","json={}");
      $content_decoded=json_decode($content);
      if (isset($content_decoded->meta->rc)) {
        if ($content_decoded->meta->rc == "ok") {
            if (is_array($content_decoded->data)) {
              foreach ($content_decoded->data as $guest) {
                  $return[]=$guest;
                  }
              }
        }     
      }
      return $return; 
  } 

Og her er hvordan jeg laver kald nu:

function sendLogout($id)
                    {
                    global $unifiServer;
                    global $unifiUser;
                    global $unifiPass;
                    global $sitename;
                   
                    $ch = curl_init();   
                   
                    curl_setopt($ch, CURLOPT_POST, TRUE);
                    $cookie_file = "/tmp/unifi_cookie";
                    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
                    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
                    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
                    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
                    curl_setopt($ch, CURLOPT_SSLVERSION, 1);
                    curl_setopt($ch, CURLOPT_URL, "$unifiServer/api/login");
                    $data = json_encode(array("username" => $unifiUser, "password" => $unifiPass));
                    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
                    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
                    curl_exec ($ch);
                   
                    // Send user to deauthorize
                    $data = json_encode(array(
                        'cmd'=>'unauthorize-guest',
                        'mac'=>$id));

                    curl_setopt($ch, CURLOPT_URL, $unifiServer . "/api/s/$sitename/cmd/stamgr");
                    curl_setopt($ch, CURLOPT_POSTFIELDS, 'json='.$data);
                    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
                    curl_exec ($ch);                   
                   
                    curl_setopt($ch, CURLOPT_URL, $unifiServer.'/logout');
                    curl_exec ($ch);
                    curl_close ($ch);
                    unset($ch);
                    }
Avatar billede moddi100 Seniormester
25. marts 2015 - 17:46 #1
Du skal kalde det som forskellige forespørgsler. Cookies binder dem sammen. Se derfor herunder, hvor jeg har samlet det lidt:

[div]function sendRequest($url, $data)
{
                    $ch = curl_init();   
                   
                    curl_setopt($ch, CURLOPT_POST, TRUE);
                    $cookie_file = "/tmp/unifi_cookie";
                    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
                    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
                    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
                    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
                    curl_setopt($ch, CURLOPT_SSLVERSION, 1);
                    curl_setopt($ch, CURLOPT_URL, $url);
                    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
                    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
                    curl_exec ($ch);                   
                    curl_close ($ch);
}


function sendLogout($id)
                    {
                    global $unifiServer;
                    global $unifiUser;
                    global $unifiPass;
                    global $sitename;
                   
                    $url_1  = "$unifiServer/api/login";
                    $data_1 = array("username" => $unifiUser, "password" => $unifiPass);

                    $url_2  = "$unifiServer/api/s/$sitename/cmd/stamgr";
                    $data_2  = array(
                        'cmd'=>'unauthorize-guest',
                        'mac'=>$id);
);

                    $url_3  = $unifiServer.'/logout';
                    $data_3  = array();

                    sendRequest($url_1, $data_1);
                    sendRequest($url_2, $data_2);
                    sendRequest($url_3, $data_3);
}
Avatar billede syswatch Novice
25. marts 2015 - 18:01 #2
Moddi100:
Den del med login og logud har jeg styr på, det virker fint...
Den funktion jeg gerne vil have til at virke er den jeg beskrev øverst:

public function list_guests() {
      $return=array();
      if (!$this->is_loggedin) return $return;
      $return=array();
      $content=$this->exec_curl($this->baseurl."/api/s/".$this->site."/stat/sta","json={}");
      $content_decoded=json_decode($content);
      if (isset($content_decoded->meta->rc)) {
        if ($content_decoded->meta->rc == "ok") {
            if (is_array($content_decoded->data)) {
              foreach ($content_decoded->data as $guest) {
                  $return[]=$guest;
                  }
              }
        }     
      }
      return $return; 
  } 

Der er dokumentation til API'en her:
http://dl.ubnt.com/unifi/4.6.0/unifi_sh_api
Funktionen er beskrevet nederst på siden.
Avatar billede moddi100 Seniormester
25. marts 2015 - 19:26 #3
så bliver du nødt til at uddybe lidt mere, da vi ikke kender til funktionen $this->exec_curl. Virker den efter hensigten, hvad får du retur derfra?

Benyt følgende:

public function list_guests() {
      $return=array();
      if (!$this->is_loggedin) return $return;

      $content=$this->exec_curl($this->baseurl."/api/s/".$this->site."/stat/sta","json={}");

      echo "<pre>";
      var_dump($content);

      $content_decoded=json_decode($content);
      if (isset($content_decoded->meta->rc)) {
        if ($content_decoded->meta->rc == "ok") {
            if (is_array($content_decoded->data)) {
              foreach ($content_decoded->data as $guest) {
                  $return[]=$guest;
                  }
              }
        }     
      }
      var_dump($return);
      echo "</pre>";
      return $return; 
  } 
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester