116 lines
2.8 KiB
PHP
116 lines
2.8 KiB
PHP
<?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 int $page
|
|
* @param int $perPage
|
|
* @return array
|
|
*/
|
|
public function getDeviceFlowList(string $deviceId, Carbon $start, Carbon $end, int $page = 1, int $perPage = 50): array
|
|
{
|
|
$result = $this->post('/api/deviceFlow/v1/list', [
|
|
'device_id' => $deviceId,
|
|
'start_time' => $start->unix() * 1000,
|
|
'end_time' => $end->unix() * 1000,
|
|
'pageable' => [
|
|
'page' => $page - 1,
|
|
'size' => $perPage,
|
|
],
|
|
]);
|
|
|
|
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;
|
|
}
|
|
}
|