Lae/app/Support/EmqxSupport.php
2023-01-10 21:48:11 +08:00

77 lines
2.2 KiB
PHP

<?php
namespace App\Support;
use App\Exceptions\EmqxSupportException;
use Illuminate\Http\Client\ConnectionException;
use Illuminate\Http\Client\PendingRequest;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
class EmqxSupport
{
/**
* @throws EmqxSupportException
*/
public function kickClient($client_id = null, $username = null): void
{
// 如果都为空,直接返回
if (empty($client_id) && empty($username)) {
return;
}
if ($client_id) {
$this->api()->delete('/clients/' . $client_id);
}
if ($username) {
try {
$clients = $this->clients(['username' => $username]);
} catch (EmqxSupportException $e) {
throw new EmqxSupportException($e->getMessage());
}
if ($clients) {
// 循环翻页
for ($i = 1; $i <= $clients['meta']['count']; $i++) {
$clients = $this->clients(['username' => $username, 'page' => $i]);
foreach ($clients['data'] as $client) {
$this->api()->delete('/clients/' . $client['clientid']);
}
}
}
}
}
private function api(): PendingRequest
{
return Http::baseUrl(config('emqx.api_url'))->withBasicAuth(config('emqx.api_key'), config('emqx.api_secret'));
}
/**
* @throws EmqxSupportException
*/
public function clients($params = [])
{
// merge params
$params = array_merge([
'limit' => 100,
'isTrusted' => true,
], $params);
try {
$response = $this->api()->get('clients', $params);
} /** @noinspection PhpRedundantCatchClauseInspection */ catch (ConnectionException $e) {
Log::error('emqx connect failed.', [$e]);
throw new EmqxSupportException('EMQX API 无法连接。');
}
if ($response->successful()) {
return $response->json();
} else {
throw new EmqxSupportException('无法获取客户端列表。');
}
}
}