1
0
Fork 0

LinkOS Http 客户端

develop
李静 2023-04-28 11:16:23 +08:00
parent 80ca23c2ed
commit 3d1d58ac61
3 changed files with 134 additions and 2 deletions

View File

@ -0,0 +1,114 @@
<?php
namespace App\Iot\Linkos;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Http;
use RuntimeException;
class HttpClient
{
public const ENDPOINT_URL = 'http://service.easylinkin.com';
public function __construct(
protected readonly string $apiKey,
protected readonly string $apiSecret,
) {
}
/**
* 获取设备的历史数据
*
* @param string $deviceId
* @param \Illuminate\Support\Carbon $start
* @param \Illuminate\Support\Carbon $end
* @param array $pageable
* @return array
*/
public function getDeviceFlowList(string $deviceId, Carbon $start, Carbon $end, array $pageable = []): array
{
$result = $this->post('/api/deviceFlow/v1/list', [
'device_id' => $deviceId,
'start_time' => $start->unix() * 1000,
'end_time' => $end->unix() * 1000,
'pageable' => array_merge([
'page' => 0,
'size' => 20,
], $pageable),
]);
return $result['data'];
}
/**
* @param string $url
* @param array $data
* @return array
*/
public function post(string $url, array $data = []): array
{
return $this->request('POST', $url, [
'json' => $data,
]);
}
/**
* @param string $method
* @param string $url
* @param array $options
* @return array
*
* @throws \Illuminate\Http\Client\RequestException
* @throws \RuntimeException
*/
public function request(string $method, string $url, array $options = []): array
{
$nonce = $this->nonce();
$timestamp = now()->getTimestampMs();
/** @var \Illuminate\Http\Client\Response */
$response = Http::withHeaders([
'Content-Type' => 'application/json',
'api-key' => $this->apiKey,
'Nonce' => $nonce,
'Timestamp' => $timestamp,
'Signature' => $this->sign(compact('nonce', 'timestamp')),
])->baseUrl(self::ENDPOINT_URL)->send($method, $url, $options);
$result = $response->throw()->json();
if (data_get($result, 'success') !== true) {
throw new RuntimeException(data_get($result, 'msg', '出错啦!'));
}
return $result;
}
/**
* @param array $data
* @return string
*/
protected function sign(array $data): string
{
return sha1(
sprintf(
'%s%s%s',
$data['nonce'] ?? '',
$data['timestamp'] ?? '',
$this->apiSecret
)
);
}
protected function nonce(): string
{
$nonce = '';
for ($i = 0; $i < 8; $i++) {
$nonce .= mt_rand(0, 9);
}
return $nonce;
}
}

View File

@ -2,6 +2,7 @@
namespace App\Providers;
use App\Iot\Linkos\HttpClient as LinkosHttpClient;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
@ -13,7 +14,7 @@ class AppServiceProvider extends ServiceProvider
*/
public function register()
{
//
$this->registerLinkos();
}
/**
@ -23,7 +24,19 @@ class AppServiceProvider extends ServiceProvider
*/
public function boot()
{
//
\Schema::defaultStringLength(191);
}
/**
* 注册 Linkos 服务
*/
protected function registerLinkos(): void
{
$this->app->singleton(LinkosHttpClient::class, function ($app) {
return new LinkosHttpClient(
(string) $app['config']->get('services.linkos.key'),
(string) $app['config']->get('services.linkos.secret')
);
});
}
}

View File

@ -31,4 +31,9 @@ return [
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
],
'linkos' => [
'key' => env('LINKOS_API_KEY'),
'secret' => env('LINKOS_API_SECRET'),
],
];