Re: Mercedes SoC
Verfasst: Mi Sep 23, 2020 12:18 pm
So, bei mir schaut das so aus:
"authorize.php"
Dann die "refresh.php":
Und hier noch die "abfrage.php":
Alles quick'n'dirty, aber funktioniert soweit und reicht für mich aus. Hab die scripte auch auf https://github.com/riogrande75/mercedes_soc gepostet.
PS: Kann man sicher schöner programmieren (aber nicht ich)
"authorize.php"
Code: Alles auswählen
#!/usr/bin/php
<?php
$debug=0;
$authorize_url = "https://id.mercedes-benz.com/as/authorization.oauth2";
$token_url = "https://id.mercedes-benz.com/as/token.oauth2";
$FIN = "WDD242xxxx";
$acc_token = "";
// callback URL specified when the application was defined--has to match what the application says
$callback_uri = "https://localhost";
$api_url_soc = "https://api.mercedes-benz.com/vehicledata/v2/vehicles/".$FIN."/resources/soc"; //StateOfCharge only
$api_url_range = "https://api.mercedes-benz.com/vehicledata/v2/vehicles/".$FIN."/resources/rangeelectric"; //range only
// client (application) credentials - located at apim.byu.edu
$client_id = "<your-client-id>";
$client_secret = "<your-client-secret>";
//Main calls
getAuthorizationCode();
getAccessToken($autho_code);
//Needed functions
function getAuthorizationCode() {
global $authorize_url, $client_id, $callback_uri, $autho_code;
$authorization_redirect_url = $authorize_url . "?response_type=code&client_id=" . $client_id . "&redirect_uri=" . $callback_uri . "&scope=mb:vehicle:mbdata:evstatus offline_access";
header("Location: " . $authorization_redirect_url);
// if you don't want to redirect
echo "Geh in einem Browser zu\n--- \033[1m$authorization_redirect_url\033[0m ---\nkopiere den code aus dem link und fuege ihn hier ein:\n";
$autho_code = fgets(STDIN);
}
function getAccessToken($authorization_code) {
global $debug, $token_url, $client_id, $client_secret, $callback_uri, $acc_token;
$authorization = base64_encode("$client_id:$client_secret");
$header = array("Authorization: Basic {$authorization}","Content-Type: application/x-www-form-urlencoded");
$content = "grant_type=authorization_code&code=$authorization_code&redirect_uri=$callback_uri";
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $token_url,
CURLOPT_HTTPHEADER => $header,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $content
));
$response = curl_exec($curl);
curl_close($curl);
if ($response === false) {
echo "Failed";
echo curl_error($curl);
echo "Failed";
} elseif (json_decode($response)) {
if($debug){
echo "Code:";
echo $authorization_code;
echo $response;
}
}
$acc_token = json_decode($response)->access_token;
$ref_token = json_decode($response)->refresh_token;
$expires = json_decode($response)->expires_in;
$token_type = json_decode($response)->token_type;
if($debug)
{
echo "\n*** AccessToken:".$acc_token."\n";
echo "*** RefreshToken:".$ref_token."\n";
echo "*** TokenType:".$token_type ."\n";
$ablauf = time() + $expires;
echo "*** Expires in:".$expires." Sekunden, also um ".date('H:i:s', $ablauf)."\n";
}
//Schreibe Access Token in file
$fp1 = fopen ("/etc/eauto/access_token", "w");
fwrite ($fp1, $acc_token);
fclose ($fp1);
//Schreibe Refresh Token in file
$fp2 = fopen ("/etc/eauto/refresh_token", "w");
fwrite ($fp2, $ref_token);
fclose ($fp2);
}
Code: Alles auswählen
#!/usr/bin/php
<?php
$debug=0;
$token_url = "https://id.mercedes-benz.com/as/token.oauth2";
// client (application) credentials - located at apim.byu.edu
$client_id = "<your-client-id>";
$client_secret = "<your-client-secret>";
//Main calls
refreshTokens();
//Needed function
function refreshTokens()
{
global $debug, $token_url, $client_id, $client_secret;
$refresh_token = file_get_contents('/etc/eauto/refresh_token',true);
if(!$refresh_token) echo "ACHTUNG: Kein Refresh Token vorhanden!\n";
$authorization = base64_encode("$client_id:$client_secret");
$header = array("Authorization: Basic {$authorization}","Content-Type: application/x-www-form-urlencoded");
$content = "grant_type=refresh_token&refresh_token=$refresh_token";
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => $token_url,
CURLOPT_HTTPHEADER => $header,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $content
));
$response = curl_exec($curl);
curl_close($curl);
if($debug) echo "JSON:json_decode($response)\n";
$acc_token = json_decode($response)->access_token;
$ref_token = json_decode($response)->refresh_token;
$expires = json_decode($response)->expires_in;
if($debug)
{
echo "\n*** AccessToken:".$acc_token."\n";
echo "*** RefreshToken:".$ref_token."\n";
$ablauf = time() + $expires;
echo "*** Expires in:".$expires." Sekunden, also um ".date('H:i:s', $ablauf)."\n";
}
//Schreibe neues Access Token in file
$fp1 = fopen ("/etc/eauto/access_token", "w");
fwrite ($fp1, $acc_token);
fclose ($fp1);
//Schreibe neues Refresh Token in file
$fp2 = fopen ("/etc/eauto/refresh_token", "w");
fwrite ($fp2, $ref_token);
fclose ($fp2);
}
?>
Code: Alles auswählen
#!/usr/bin/php
<?php
$debug=0;
$FIN = "WDD242xxx";
$api_url_soc = "https://api.mercedes-benz.com/vehicledata/v2/vehicles/".$FIN."/resources/soc"; //StateOfCharge only
$api_url_range = "https://api.mercedes-benz.com/vehicledata/v2/vehicles/".$FIN."/resources/rangeelectric"; //range only
// client (application) credentials - located at apim.byu.edu
$client_id = "<your-client-id>";
$client_secret = "<your-client-secret>";
//Main calls
//getAuthorizationCode();
//getAccessToken($autho_code);
$acc_token = file_get_contents('/etc/eauto/access_token', true);
//if($debug) echo "ACCESS_TOKEN:$acc_token\n";
getResource($acc_token);
// we can now use the access_token as much as we want to access protected resources
function getResource($access_token) {
global $debug, $api_url_soc, $api_url_range;
$header = array("Authorization: Bearer {$access_token}");
$curls = curl_init();
curl_setopt_array($curls, array(
CURLOPT_URL => $api_url_soc,
CURLOPT_HTTPHEADER => $header,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_RETURNTRANSFER => true
));
$responseS = curl_exec($curls);
curl_close($curls);
sleep(3);
$curlr = curl_init();
curl_setopt_array($curlr, array(
CURLOPT_URL => $api_url_range,
CURLOPT_HTTPHEADER => $header,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_RETURNTRANSFER => true
));
$responseR = curl_exec($curlr);
curl_close($curlr);
// debugging
$soc = json_decode($responseS,true)['soc']['value'];
$range = json_decode($responseR,true)['rangeelectric']['value'];
if($debug)
{
echo "SocReso:$responseS\n";
print_r(json_decode($responseS, true));
echo "RangeResp:$responseR\n";
print_r(json_decode($responseR, true));
echo "SOC:$soc\n";
echo "RANGE:$range\n";
}
$fp = fopen ("/tmp/eauto.txt", "w");
fwrite ($fp, $soc);
fclose ($fp);
}
?>
PS: Kann man sicher schöner programmieren (aber nicht ich)