Avatar billede syswatch Novice
11. februar 2015 - 15:19 Der er 9 kommentarer og
1 løsning

cURL og json_encode til php kode

Hejsa,
Jeg har kastet mig ud i et lidt projekt, hvor jeg er stødt i lidt udfordringer med cURL og json, som jeg ikke har ret godt styr på.

Jeg prøver at kommunikere med et API, og dokumentation herfor ser sådan her ud:
# cmd/stamgr
# authorize-guest(mac, minutes, [up=kbps, down=kbps, bytes=MB])
unifi_authorize_guest() {
    if [ $# -lt 2 ] ; then
        echo "Usage: $0 <mac> <minutes> [up=kbps] [down=kbps] [bytes=MB] [ap_mac=mac]"
        return
    fi

    mac=$1
    minutes=$2
    other_payload=`named_args_to_payload "$@"`

    ${curl_cmd} --data "json={'cmd':'authorize-guest', 'mac':'${mac}', 'minutes':${minutes}${other_payload}}" $baseurl/api/s/$site/cmd/stamgr
}


Jeg har dette i mit script, som virker med de 2 første variabler, men kan ikke få upload, download osv til at virke.

$data = json_encode(array(
                        'cmd'=>'authorize-guest',
                        'mac'=>$id,
                        'minutes'=>$minutes));

Troede jeg så bare kunne gøre sådan her, men det fungere ikke:
$data = json_encode(array(
                    'cmd'=>'authorize-guest',
                    'mac'=>$id,
                    'minutes'=>$minutes,
                    'up'=>$upload,
                    'down'=>$download));

Hvordan skal det se ud hvis jeg skal ha de sidste variabler med ???
Avatar billede moddi100 Seniormester
11. februar 2015 - 20:25 #1
er det fra PHP til dit C eller omvendt?
Avatar billede syswatch Novice
11. februar 2015 - 20:38 #2
Jeg prøver fra en PHP fil at sende en kommando afsted til controlleren, men aner ikke hvordan $data skal se ud for at få de sidste argumenter med, som styrer uplaod, download og quota.
Kan du gennemskue det ? :-)
Avatar billede moddi100 Seniormester
11. februar 2015 - 21:01 #3
Du kan også bruge curl direkte fra php - det gør det i hvert fald nemmere :)

Er der tale om at parametrene skal sendes som GET variabler til den angivne url eller skal det være json-encoded ?
Avatar billede moddi100 Seniormester
11. februar 2015 - 21:04 #4


$data = json_encode(array(
                    'cmd'=>'authorize-guest',
                    'mac'=>$id,
                    'minutes'=>$minutes,
                    'up'=>$upload,
                    'down'=>$download));

$ch = curl_init("http://www.domain.dk/api");

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

// Send post data (ikke nødvendig hvis der anvendes GET parametre i stedet for
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

// Output
$output = curl_exec($ch);

curl_close($ch);

var_dump($output);
Avatar billede syswatch Novice
11. februar 2015 - 21:25 #5
Moddi100: Undskyld, men jeg er lidt grøn i det her...

Hvordan skal jeg flette det ind i min function ?

function sendAuthorization($id, $minutes, $upload, $download)
                    {
                    $unifiServer = "https://127.0.0.1:8443";
                    $unifiUser = "admin";
                    $unifiPass = "password";

                    $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);
                   
                    $data = json_encode(array(
                    'cmd'=>'authorize-guest',
                    'mac'=>$id,
                    'minutes'=>$minutes,
                    'up'=>$upload,
                    'down'=>$download));

                    curl_setopt($ch, CURLOPT_URL, $unifiServer . "/api/s/default/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);
                    }
// Kode til at auth bruger.
SendAuthorization($_SESSION['id'], $allowtime, $row['upload'], $row['download']);
Avatar billede moddi100 Seniormester
11. februar 2015 - 22:05 #6
Så er nedenstående din controller eller hvordan?

# cmd/stamgr
# authorize-guest(mac, minutes, [up=kbps, down=kbps, bytes=MB])
unifi_authorize_guest() {
    if [ $# -lt 2 ] ; then
        echo "Usage: $0 <mac> <minutes> [up=kbps] [down=kbps] [bytes=MB] [ap_mac=mac]"
        return
    fi

    mac=$1
    minutes=$2
    other_payload=`named_args_to_payload "$@"`

    ${curl_cmd} --data "json={'cmd':'authorize-guest', 'mac':'${mac}', 'minutes':${minutes}${other_payload}}" $baseurl/api/s/$site/cmd/stamgr
}
Avatar billede syswatch Novice
11. februar 2015 - 22:17 #7
Ja, det er et uddrag af dokumentationen til controlleren... du kan se den komplette her: http://dl.ubnt.com/unifi/4.6.0/unifi_sh_api

Så jeg skal bare finde ud af hvordan jeg får upload, download og evt quota med i min kommando i php til kontrolleren.

Har fundet dette på en anden side:
# authorize a client for 30 minutes, limit down/up speed to 2048/1024kbps, quota is 500MB
unifi_authorize_guest "e8:17:22:10:5d:4d" 30 down=2048 up=1024 bytes=500
Avatar billede moddi100 Seniormester
11. februar 2015 - 22:47 #8
Jamen i så fald er jeg imponeret over at du får noget igennem ved denne fremgangsmåde overhovedet. Normalt når du skal kalde en kommando fra PHP:

// Kald kommando ligesom i en alm shell:
exec("kommando her");

// Eller i dit tilfælde
exec('unifi_authorize_guest "e8:17:22:10:5d:4d" 30 down=2048 up=1024 bytes=500');


Alternativt kan man kalde hjemmesiden direkte (og skippe din controller):
function call($url, $data = array())
{
                    $cookie_file = "/tmp/unifi_cookie";

                    $ch = curl_init();   
                   
                    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);

                    if($data)
                    {
                      curl_setopt($ch, CURLOPT_POST, TRUE);
                      curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
                      curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
                    }

                    $output = curl_exec ($ch);
                    curl_close($ch); // HUSK ALTID AT AFSLUTTE
                    return $output;
}



function sendAuthorization($id, $minutes, $upload, $download)
{
                    // Login, forespørgsel 1
                    $unifiServer = "https://127.0.0.1:8443";
                    $unifiUser = "admin";
                    $unifiPass = "password";
                    $url_login  = "$unifiServer/api/login";

                    $data = json_encode(array("username" => $unifiUser, "password" => $unifiPass));

                    call($url_login, $data);



                    // Forespørgsel 2
                    $url_cmd = $unifiServer . "/api/s/default/cmd/stamgr";
                    $data = json_encode(array(
                    'cmd'=>'authorize-guest',
                    'mac'=>$id,
                    'minutes'=>$minutes,
                    'up'=>$upload,
                    'down'=>$download));

                    call($url_cmd, $data);



                    // Log ud
                    $url_logout = $unifiServer.'/logout';
                    call($url_logout);
                    }
// Kode til at auth bruger.
SendAuthorization($_SESSION['id'], $allowtime, $row['upload'], $row['download']);

Avatar billede syswatch Novice
12. februar 2015 - 11:57 #9
Hej Moddi100:
Tak for dit svar... Man kan ikke gå uden om controlleren, da det er den der styre hele det trådlåse WIFI netværk.
MEN... fik et svar fra producenten i nat, og det viste sig at den firmware (3.2.7) jeg havde i mine APs havde en bug, så derfor virkede det ikke, så har fået den nyetse ny, og det spiller som det skal :-)

Anyway, tak for hjælpen... smider du et svar så jeg kan lukke ? Du hjalp jo mig på rette vej for at fejlfinde.
Avatar billede moddi100 Seniormester
12. februar 2015 - 21:01 #10
Følgende citat er vidst meget rammende:
Når enden er god, er alting godt :)
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