接入电压和移动设备
parent
efbbcb78c1
commit
96195debda
|
|
@ -0,0 +1,126 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Console\Commands;
|
||||||
|
|
||||||
|
use App\Enums\DeviceStatus;
|
||||||
|
use App\Enums\DeviceType;
|
||||||
|
use App\Models\Device;
|
||||||
|
use App\Iot\MoJing\HttpClient as MoJingHttpClient;
|
||||||
|
use App\Iot\Qly\HttpClient as QlyHttpClient;
|
||||||
|
use Illuminate\Console\Command;
|
||||||
|
|
||||||
|
class MonitorDeviceHealthCommand extends Command
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The name and signature of the console command.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $signature = 'monitor-device-health {supplier}';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The console command description.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $description = '监控设备心跳检查';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the console command.
|
||||||
|
*/
|
||||||
|
public function handle()
|
||||||
|
{
|
||||||
|
switch ($this->argument('supplier')) {
|
||||||
|
// 移动千里眼
|
||||||
|
case 'yidong':
|
||||||
|
$this->checkHealthBySupplierYidong();
|
||||||
|
break;
|
||||||
|
|
||||||
|
// 电信魔镜
|
||||||
|
case 'dianxin':
|
||||||
|
$this->checkHealthBySupplierDianxin();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function checkHealthBySupplierYidong()
|
||||||
|
{
|
||||||
|
$client = new QlyHttpClient(
|
||||||
|
config('services.ydqly.appid'),
|
||||||
|
config('services.ydqly.secret'),
|
||||||
|
config('services.ydqly.rsa'),
|
||||||
|
);
|
||||||
|
|
||||||
|
$page = 1;
|
||||||
|
$pageSize = 100;
|
||||||
|
|
||||||
|
do {
|
||||||
|
$result = $client->post(
|
||||||
|
'/v3/open/api/device/list',
|
||||||
|
[
|
||||||
|
'page' => $page,
|
||||||
|
'pageSize' => $pageSize,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
|
foreach ($result['data'] as $item) {
|
||||||
|
$device = Device::supplierBy('device-supplier-yidong')
|
||||||
|
->where('type', DeviceType::Monitor)
|
||||||
|
->where('sn', $item['deviceId'])
|
||||||
|
->first();
|
||||||
|
|
||||||
|
if (! in_array($device?->status, [DeviceStatus::Online, DeviceStatus::Offline])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$device->update([
|
||||||
|
'status' => $item['deviceStatus'] === 1 ? DeviceStatus::Online : DeviceStatus::Offline,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$page++;
|
||||||
|
} while (count($result['data']) === $pageSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function checkHealthBySupplierDianxin(): void
|
||||||
|
{
|
||||||
|
$client = new MoJingHttpClient(
|
||||||
|
config('services.dxmj.app_id'),
|
||||||
|
config('services.dxmj.app_secret'),
|
||||||
|
);
|
||||||
|
|
||||||
|
$result = $client->get(
|
||||||
|
"/api/v3/channel/listByOrgId",
|
||||||
|
[
|
||||||
|
'id' => '1736649747126530049',
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
|
$devices = Device::supplierBy('device-supplier-dianxin')
|
||||||
|
->where('type', DeviceType::Monitor)
|
||||||
|
->whereIn('status', [DeviceStatus::Online, DeviceStatus::Offline])
|
||||||
|
->get();
|
||||||
|
|
||||||
|
foreach ($devices as $device) {
|
||||||
|
foreach ($result['data'] as $item) {
|
||||||
|
if ($device->sn !== $item['channelcode']) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$device->update([
|
||||||
|
'extends' => [
|
||||||
|
'ip' => '',
|
||||||
|
'port' => '',
|
||||||
|
'username' => '',
|
||||||
|
'password' => '',
|
||||||
|
'passage' => $item['citId'],
|
||||||
|
'rtsp_url' => '',
|
||||||
|
],
|
||||||
|
'status' => $item['channelstatus'] === 1 ? DeviceStatus::Online : DeviceStatus::Offline,
|
||||||
|
]);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -22,6 +22,14 @@ class Kernel extends ConsoleKernel
|
||||||
$schedule->command(Commands\Linkos\WormReportCommand::class)
|
$schedule->command(Commands\Linkos\WormReportCommand::class)
|
||||||
->hourlyAt(15)
|
->hourlyAt(15)
|
||||||
->runInBackground();
|
->runInBackground();
|
||||||
|
|
||||||
|
$schedule->command(Commands\MonitorDeviceHealthCommand::class, ['yidong'])
|
||||||
|
->everyFiveMinutes()
|
||||||
|
->runInBackground();
|
||||||
|
|
||||||
|
$schedule->command(Commands\MonitorDeviceHealthCommand::class, ['dianxin'])
|
||||||
|
->everyFiveMinutes()
|
||||||
|
->runInBackground();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -771,21 +771,26 @@ class DeviceController extends Controller
|
||||||
|
|
||||||
// 中国电信魔镜
|
// 中国电信魔镜
|
||||||
case 'device-supplier-dianxin':
|
case 'device-supplier-dianxin':
|
||||||
$client = new MoJingHttpClient(
|
$address = '';
|
||||||
config('services.dxmj.app_id'),
|
|
||||||
config('services.dxmj.app_secret'),
|
if ($channelId = data_get($device->extends, 'passage')) {
|
||||||
);
|
$client = new MoJingHttpClient(
|
||||||
$result = $client->get(
|
config('services.dxmj.app_id'),
|
||||||
"/api/v3/channel/RealTimeVideo/{$device->sn}",
|
config('services.dxmj.app_secret'),
|
||||||
[
|
);
|
||||||
'transType' => 4,
|
$result = $client->get(
|
||||||
'natType' => 1,
|
"/api/v3/channel/RealTimeVideo/{$channelId}",
|
||||||
],
|
[
|
||||||
);
|
'transType' => 4,
|
||||||
|
'natType' => 1,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
$address = data_get($result, 'data.playUrl');
|
||||||
|
}
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'type' => 'flv',
|
'type' => 'flv',
|
||||||
'address' => (string) data_get($result, 'data.playUrl'),
|
'address' => (string) $address,
|
||||||
// 有效期 29 分钟
|
// 有效期 29 分钟
|
||||||
'expires' => 1740,
|
'expires' => 1740,
|
||||||
];
|
];
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ class Device extends Model
|
||||||
protected $casts = [
|
protected $casts = [
|
||||||
'type' => DeviceType::class,
|
'type' => DeviceType::class,
|
||||||
'status' => DeviceStatus::class,
|
'status' => DeviceStatus::class,
|
||||||
'extends' => 'array',
|
'extends' => 'json',
|
||||||
];
|
];
|
||||||
|
|
||||||
protected $fillable = [
|
protected $fillable = [
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue