LinkOS Http 客户端
parent
80ca23c2ed
commit
3d1d58ac61
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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')
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,4 +31,9 @@ return [
|
|||
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
|
||||
],
|
||||
|
||||
'linkos' => [
|
||||
'key' => env('LINKOS_API_KEY'),
|
||||
'secret' => env('LINKOS_API_SECRET'),
|
||||
],
|
||||
|
||||
];
|
||||
|
|
|
|||
Loading…
Reference in New Issue