改进 保留 4 位小数
This commit is contained in:
parent
14488121bf
commit
df73ceea1b
125
app/Console/Commands/Mqtt.php
Normal file
125
app/Console/Commands/Mqtt.php
Normal file
@ -0,0 +1,125 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Console\Commands;
|
||||||
|
|
||||||
|
use Illuminate\Console\Command;
|
||||||
|
use PhpMqtt\Client\Facades\MQTT as MqttClient;
|
||||||
|
|
||||||
|
class Mqtt extends Command
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The name and signature of the console command.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $signature = 'mqtt:run';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The console command description.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $description = 'Command description';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the console command.
|
||||||
|
*
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
public function handle()
|
||||||
|
{
|
||||||
|
declare(ticks=1);
|
||||||
|
pcntl_signal(SIGINT, function () {
|
||||||
|
$this->info('Stopping...');
|
||||||
|
// 关闭子进程
|
||||||
|
posix_kill($pid, SIGKILL);
|
||||||
|
exit;
|
||||||
|
});
|
||||||
|
|
||||||
|
// MQTT::publish('some/topic', 'Hello World!');
|
||||||
|
|
||||||
|
$tasks = [
|
||||||
|
'publish' => function () {
|
||||||
|
$this->info('Publishing...');
|
||||||
|
|
||||||
|
MqttClient::publish('some/topic', 'Hello World!');
|
||||||
|
|
||||||
|
sleep(1);
|
||||||
|
|
||||||
|
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
'subscribe' => function () {
|
||||||
|
$this->info('Subscribing...');
|
||||||
|
|
||||||
|
$mqtt = MqttClient::connection();
|
||||||
|
$mqtt->subscribe('some/topic', function (string $topic, string $message) {
|
||||||
|
echo sprintf('Received QoS level 1 message on topic [%s]: %s', $topic, $message) . PHP_EOL;
|
||||||
|
}, 1);
|
||||||
|
$mqtt->loop(true);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
foreach ($tasks as $key => $task) {
|
||||||
|
$this->info('Starting task: ' . $key);
|
||||||
|
$pid = pcntl_fork();
|
||||||
|
if ($pid == -1) {
|
||||||
|
die('could not fork');
|
||||||
|
} else if ($pid) {
|
||||||
|
// we are the parent
|
||||||
|
// pcntl_wait($status); //Protect against Zombie children
|
||||||
|
|
||||||
|
|
||||||
|
// while (pcntl_waitpid(0, $status) != -1) {
|
||||||
|
// $status = pcntl_wexitstatus($status);
|
||||||
|
// echo "Child $status completed\n";
|
||||||
|
// }
|
||||||
|
} else {
|
||||||
|
// we are the child
|
||||||
|
while (true) {
|
||||||
|
if ($task() === false) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return Command::SUCCESS;
|
||||||
|
|
||||||
|
// // 开启新的进程,处理 MQTT 消息
|
||||||
|
// $running = 0; // 记录正在运行的子进程数
|
||||||
|
// for ($i = 0; $i < $task_num; $i++) {
|
||||||
|
// $pid = pcntl_fork();
|
||||||
|
// if ($pid == -1) {
|
||||||
|
// die('could not fork');
|
||||||
|
// } else if ($pid) {
|
||||||
|
// $running++; // 进程数+1
|
||||||
|
// if ($running >= $max_process) { // 子进程开启数量达到上限
|
||||||
|
// pcntl_wait($status); // 等待有子进程退出
|
||||||
|
// $running--; // 有子进程退出,进程数-1
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// // 子进程
|
||||||
|
// echo "子进程开始" . PHP_EOL;
|
||||||
|
// while (true) {
|
||||||
|
// MqttClient::publish('some/topic', 'Hello World!');
|
||||||
|
// // sleep(0.5);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// while ($running) {
|
||||||
|
// pcntl_wait($status);
|
||||||
|
// $running--;
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -316,7 +316,7 @@ public function cost($amount = null, $auto = true): bool
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
$real_price = round($real_price ?? 0, 8);
|
$real_price = round($real_price ?? 0, 4);
|
||||||
|
|
||||||
$transaction = new Transaction();
|
$transaction = new Transaction();
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
"laravel/octane": "^1.3",
|
"laravel/octane": "^1.3",
|
||||||
"laravel/sanctum": "^3.0",
|
"laravel/sanctum": "^3.0",
|
||||||
"laravel/tinker": "^2.7",
|
"laravel/tinker": "^2.7",
|
||||||
|
"php-mqtt/laravel-client": "^1.1",
|
||||||
"pusher/pusher-php-server": "^7.2",
|
"pusher/pusher-php-server": "^7.2",
|
||||||
"spiral/roadrunner": "^2.8.2",
|
"spiral/roadrunner": "^2.8.2",
|
||||||
"symfony/psr-http-message-bridge": "^2.1",
|
"symfony/psr-http-message-bridge": "^2.1",
|
||||||
|
202
composer.lock
generated
202
composer.lock
generated
@ -4,7 +4,7 @@
|
|||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "6d925a2d2bb0d0c62b8cc85675e99772",
|
"content-hash": "23878130d9df24ca7447ac251b904417",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "brick/math",
|
"name": "brick/math",
|
||||||
@ -2919,6 +2919,72 @@
|
|||||||
],
|
],
|
||||||
"time": "2022-07-24T11:55:47+00:00"
|
"time": "2022-07-24T11:55:47+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "myclabs/php-enum",
|
||||||
|
"version": "1.8.3",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/myclabs/php-enum.git",
|
||||||
|
"reference": "b942d263c641ddb5190929ff840c68f78713e937"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/myclabs/php-enum/zipball/b942d263c641ddb5190929ff840c68f78713e937",
|
||||||
|
"reference": "b942d263c641ddb5190929ff840c68f78713e937",
|
||||||
|
"shasum": "",
|
||||||
|
"mirrors": [
|
||||||
|
{
|
||||||
|
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
|
||||||
|
"preferred": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"ext-json": "*",
|
||||||
|
"php": "^7.3 || ^8.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "^9.5",
|
||||||
|
"squizlabs/php_codesniffer": "1.*",
|
||||||
|
"vimeo/psalm": "^4.6.2"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"MyCLabs\\Enum\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "PHP Enum contributors",
|
||||||
|
"homepage": "https://github.com/myclabs/php-enum/graphs/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "PHP Enum implementation",
|
||||||
|
"homepage": "http://github.com/myclabs/php-enum",
|
||||||
|
"keywords": [
|
||||||
|
"enum"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/myclabs/php-enum/issues",
|
||||||
|
"source": "https://github.com/myclabs/php-enum/tree/1.8.3"
|
||||||
|
},
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"url": "https://github.com/mnapoli",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://tidelift.com/funding/github/packagist/myclabs/php-enum",
|
||||||
|
"type": "tidelift"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"time": "2021-07-05T08:18:36+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "nesbot/carbon",
|
"name": "nesbot/carbon",
|
||||||
"version": "2.62.1",
|
"version": "2.62.1",
|
||||||
@ -3488,6 +3554,140 @@
|
|||||||
},
|
},
|
||||||
"time": "2022-09-26T03:40:35+00:00"
|
"time": "2022-09-26T03:40:35+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "php-mqtt/client",
|
||||||
|
"version": "v1.6.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/php-mqtt/client.git",
|
||||||
|
"reference": "22a207edef01d5f0ed3a6a79565cc425b678d786"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/php-mqtt/client/zipball/22a207edef01d5f0ed3a6a79565cc425b678d786",
|
||||||
|
"reference": "22a207edef01d5f0ed3a6a79565cc425b678d786",
|
||||||
|
"shasum": "",
|
||||||
|
"mirrors": [
|
||||||
|
{
|
||||||
|
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
|
||||||
|
"preferred": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"myclabs/php-enum": "^1.7",
|
||||||
|
"php": "^7.4|^8.0",
|
||||||
|
"psr/log": "^1.1|^2.0|^3.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/php-invoker": "^3.0",
|
||||||
|
"phpunit/phpunit": "^9.0",
|
||||||
|
"squizlabs/php_codesniffer": "^3.5"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-redis": "Required for the RedisRepository"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"PhpMqtt\\Client\\": "src"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Marvin Mall",
|
||||||
|
"email": "marvin-mall@msn.com",
|
||||||
|
"role": "developer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "An MQTT client written in and for PHP.",
|
||||||
|
"keywords": [
|
||||||
|
"client",
|
||||||
|
"mqtt",
|
||||||
|
"publish",
|
||||||
|
"subscribe"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/php-mqtt/client/issues",
|
||||||
|
"source": "https://github.com/php-mqtt/client/tree/v1.6.0"
|
||||||
|
},
|
||||||
|
"time": "2022-11-01T20:00:19+00:00"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "php-mqtt/laravel-client",
|
||||||
|
"version": "v1.1.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/php-mqtt/laravel-client.git",
|
||||||
|
"reference": "d2a2a839e4c8d15ffb1b0caa35219b6f73483a7d"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/php-mqtt/laravel-client/zipball/d2a2a839e4c8d15ffb1b0caa35219b6f73483a7d",
|
||||||
|
"reference": "d2a2a839e4c8d15ffb1b0caa35219b6f73483a7d",
|
||||||
|
"shasum": "",
|
||||||
|
"mirrors": [
|
||||||
|
{
|
||||||
|
"url": "https://mirrors.aliyun.com/composer/dists/%package%/%reference%.%type%",
|
||||||
|
"preferred": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"illuminate/config": "~7.0|~8.0|~9.0",
|
||||||
|
"illuminate/support": "~7.0|~8.0|~9.0",
|
||||||
|
"php": "^7.4|^8.0",
|
||||||
|
"php-mqtt/client": "^1.0"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"squizlabs/php_codesniffer": "^3.5"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"laravel": {
|
||||||
|
"providers": [
|
||||||
|
"PhpMqtt\\Client\\MqttClientServiceProvider"
|
||||||
|
],
|
||||||
|
"aliases": {
|
||||||
|
"MQTT": "PhpMqtt\\Client\\Facades\\MQTT"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"PhpMqtt\\Client\\": "src"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Marvin Mall",
|
||||||
|
"email": "marvin-mall@msn.com",
|
||||||
|
"role": "developer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "A wrapper for the php-mqtt/client library for Laravel.",
|
||||||
|
"homepage": "https://github.com/php-mqtt/laravel-client",
|
||||||
|
"keywords": [
|
||||||
|
"client",
|
||||||
|
"laravel",
|
||||||
|
"mqtt",
|
||||||
|
"publish",
|
||||||
|
"subscribe"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/php-mqtt/laravel-client/issues",
|
||||||
|
"source": "https://github.com/php-mqtt/laravel-client/tree/v1.1.0"
|
||||||
|
},
|
||||||
|
"time": "2022-11-22T21:32:07+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "phpoption/phpoption",
|
"name": "phpoption/phpoption",
|
||||||
"version": "1.8.1",
|
"version": "1.8.1",
|
||||||
|
118
config/mqtt-client.php
Normal file
118
config/mqtt-client.php
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
use PhpMqtt\Client\MqttClient;
|
||||||
|
use PhpMqtt\Client\Repositories\MemoryRepository;
|
||||||
|
|
||||||
|
return [
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Default MQTT Connection
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| This setting defines the default MQTT connection returned when requesting
|
||||||
|
| a connection without name from the facade.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
'default_connection' => 'default',
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| MQTT Connections
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| These are the MQTT connections used by the application. You can also open
|
||||||
|
| an individual connection from the application itself, but all connections
|
||||||
|
| defined here can be accessed via name conveniently.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
'connections' => [
|
||||||
|
|
||||||
|
'default' => [
|
||||||
|
|
||||||
|
// The host and port to which the client shall connect.
|
||||||
|
'host' => env('MQTT_HOST'),
|
||||||
|
'port' => env('MQTT_PORT', 1883),
|
||||||
|
|
||||||
|
// The MQTT protocol version used for the connection.
|
||||||
|
'protocol' => MqttClient::MQTT_3_1,
|
||||||
|
|
||||||
|
// A specific client id to be used for the connection. If omitted,
|
||||||
|
// a random client id will be generated for each new connection.
|
||||||
|
'client_id' => 'lae-' . uniqid(),
|
||||||
|
|
||||||
|
// Whether a clean session shall be used and requested by the client.
|
||||||
|
// A clean session will let the broker forget about subscriptions and
|
||||||
|
// queued messages when the client disconnects. Also, if available,
|
||||||
|
// data of a previous session will be deleted when connecting.
|
||||||
|
'use_clean_session' => env('MQTT_CLEAN_SESSION', true),
|
||||||
|
|
||||||
|
// Whether logging shall be enabled. The default logger will be used
|
||||||
|
// with the log level as configured.
|
||||||
|
'enable_logging' => env('MQTT_ENABLE_LOGGING', true),
|
||||||
|
|
||||||
|
// Defines which repository implementation shall be used. Currently,
|
||||||
|
// only a MemoryRepository is supported.
|
||||||
|
'repository' => MemoryRepository::class,
|
||||||
|
|
||||||
|
// Additional settings used for the connection to the broker.
|
||||||
|
// All of these settings are entirely optional and have sane defaults.
|
||||||
|
'connection_settings' => [
|
||||||
|
|
||||||
|
// The TLS settings used for the connection. Must match the specified port.
|
||||||
|
'tls' => [
|
||||||
|
'enabled' => env('MQTT_TLS_ENABLED', false),
|
||||||
|
'allow_self_signed_certificate' => env('MQTT_TLS_ALLOW_SELF_SIGNED_CERT', false),
|
||||||
|
'verify_peer' => env('MQTT_TLS_VERIFY_PEER', true),
|
||||||
|
'verify_peer_name' => env('MQTT_TLS_VERIFY_PEER_NAME', true),
|
||||||
|
'ca_file' => env('MQTT_TLS_CA_FILE'),
|
||||||
|
'ca_path' => env('MQTT_TLS_CA_PATH'),
|
||||||
|
'client_certificate_file' => env('MQTT_TLS_CLIENT_CERT_FILE'),
|
||||||
|
'client_certificate_key_file' => env('MQTT_TLS_CLIENT_CERT_KEY_FILE'),
|
||||||
|
'client_certificate_key_passphrase' => env('MQTT_TLS_CLIENT_CERT_KEY_PASSPHRASE'),
|
||||||
|
],
|
||||||
|
|
||||||
|
// Credentials used for authentication and authorization.
|
||||||
|
'auth' => [
|
||||||
|
'username' => env('MQTT_AUTH_USERNAME'),
|
||||||
|
'password' => env('MQTT_AUTH_PASSWORD'),
|
||||||
|
],
|
||||||
|
|
||||||
|
// Can be used to declare a last will during connection. The last will
|
||||||
|
// is published by the broker when the client disconnects abnormally
|
||||||
|
// (e.g. in case of a disconnect).
|
||||||
|
'last_will' => [
|
||||||
|
'topic' => env('MQTT_LAST_WILL_TOPIC'),
|
||||||
|
'message' => env('MQTT_LAST_WILL_MESSAGE'),
|
||||||
|
'quality_of_service' => env('MQTT_LAST_WILL_QUALITY_OF_SERVICE', 0),
|
||||||
|
'retain' => env('MQTT_LAST_WILL_RETAIN', false),
|
||||||
|
],
|
||||||
|
|
||||||
|
// The timeouts (in seconds) used for the connection. Some of these settings
|
||||||
|
// are only relevant when using the event loop of the MQTT client.
|
||||||
|
'connect_timeout' => env('MQTT_CONNECT_TIMEOUT', 60),
|
||||||
|
'socket_timeout' => env('MQTT_SOCKET_TIMEOUT', 5),
|
||||||
|
'resend_timeout' => env('MQTT_RESEND_TIMEOUT', 10),
|
||||||
|
|
||||||
|
// The interval (in seconds) in which the client will send a ping to the broker,
|
||||||
|
// if no other message has been sent.
|
||||||
|
'keep_alive_interval' => env('MQTT_KEEP_ALIVE_INTERVAL', 10),
|
||||||
|
|
||||||
|
// Additional settings for the optional auto-reconnect. The delay between reconnect attempts is in seconds.
|
||||||
|
'auto_reconnect' => [
|
||||||
|
'enabled' => env('MQTT_AUTO_RECONNECT_ENABLED', false),
|
||||||
|
'max_reconnect_attempts' => env('MQTT_AUTO_RECONNECT_MAX_RECONNECT_ATTEMPTS', 3),
|
||||||
|
'delay_between_reconnect_attempts' => env('MQTT_AUTO_RECONNECT_DELAY_BETWEEN_RECONNECT_ATTEMPTS', 0),
|
||||||
|
],
|
||||||
|
|
||||||
|
],
|
||||||
|
|
||||||
|
],
|
||||||
|
|
||||||
|
],
|
||||||
|
|
||||||
|
];
|
Loading…
Reference in New Issue
Block a user