post('/api/deviceFlow/v1/list', [ 'device_id' => $deviceId, 'start_time' => $start->unix() * 1000, 'end_time' => $end->unix() * 1000, 'pageable' => [ 'page' => $page - 1, 'size' => $perPage, ], ]); if (data_get($result, 'success') !== true) { throw new RuntimeException(data_get($result, 'msg', '出错啦!')); } return $result['data']; } /** * 设备数据下行 * * @param string $deviceId * @param string $service * @param array $data * @param boolean $confirm * @param boolean $clear * @param boolean $schedule * @return array */ public function deviceDataDownlink(string $deviceId, string $service, array $data = [], bool $confirm = true, bool $clear = true, bool $schedule = false): array { return $this->post('/api/down', [ 'device_id' => $deviceId, 'service_id' => $service, 'parameter' => $data, 'clear' => (int) $clear, 'schedule' => (int) $schedule, 'confirm' => (int) $confirm, ]); } /** * 获取设备最新属性数据 */ public function getDeviceStatus(string $deviceId, array $props): array { $result = $this->get('/api/deviceStatus/v1/getDeviceStatus', [ 'deviceCode' => $deviceId, 'prop' => implode(",", $props), ]); if (data_get($result, 'success') !== true) { throw new RuntimeException(data_get($result, 'msg', '出错啦!')); } return $result['data']; } public function get(string $url, array $query = []): array { return $this->request('GET', $url, [ 'query' => $query, ]); } /** * @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); return $response->throw()->json(); } /** * @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; } }