Laravel Client

php-mqtt/laravel-client image

Laravel Client stats

Downloads
92.7K
Stars
124
Open Issues
0
Forks
15

View on GitHub →

A wrapper for the php-mqtt/client library for Laravel.

php-mqtt/laravel-client

php-mqtt/laravel-client was created by, and is maintained by Marvin Mall. It is a Laravel wrapper for the php-mqtt/client package and allows you to connect to an MQTT broker where you can publish messages and subscribe to topics.

Installation

The package is available on packagist.org and can be installed using composer:

composer require php-mqtt/laravel-client

The package will register itself through Laravel auto discovery of packages. Registered will be the service provider as well as an MQTT facade.

After installing the package, you should publish the configuration file using

php artisan vendor:publish --provider="PhpMqtt\Client\MqttClientServiceProvider" --tag="config"

and change the configuration in config/mqtt-client.php according to your needs.

Configuration

The package allows you to configure multiple named connections. An initial example with inline documentation can be found in the published configuration file. Most of the configuration options are optional and come with sane defaults (especially all of the connection_settings).

An example configuration of two connections, where one is meant for sharing public data and one for private data, could look like the following:

'default_connection' => 'private',
 
'connections' => [
'private' => [
'host' => 'mqtt.example.com',
'port' => 1883,
],
'public' => [
'host' => 'test.mosquitto.org',
'port' => 1883,
],
],

In this example, the private connection is the default one.

Note: it is recommended to use environment variables to configure the MQTT client. Available environment variables can be found in the configuration file.

Usage

Publish (QoS level 0)

Publishing a message with QoS level 0 is quite easy and can be done in a single command:

use PhpMqtt\Client\Facades\MQTT;
 
MQTT::publish('some/topic', 'Hello World!');

If needed, the retain flag (default: false) can be passed as third and the connection name as fourth parameter:

use PhpMqtt\Client\Facades\MQTT;
 
MQTT::publish('some/topic', 'Hello World!', true, 'public');

Using MQTT::publish($topic, $message) will implicitly call MQTT::connection(), but the connection will not be closed after usage. If you want to close the connection manually because your script does not need the connection anymore, you can call MQTT:disconnect() (optionally with the connection name as a parameter). Please also note that using MQTT::publish($topic, $message) will always use QoS level 0. If you need a different QoS level, you will need to use the MqttClient directly which is explained below.

Publish (QoS level 1 & 2)

Different to QoS level 0, we need to run an event loop in order for QoS 1 and 2 to work. This is because with a one-off command we cannot guarantee that a message reaches its target. The event loop will ensure a published message gets sent again if no acknowledgment is returned by the broker within a grace period. Only when the broker returns an acknowledgement (or all of the acknowledgements in case of QoS 2), the client will stop resending the message.

use PhpMqtt\Client\Facades\MQTT;
 
/** @var \PhpMqtt\Client\Contracts\MqttClient $mqtt */
$mqtt = MQTT::connection();
$mqtt->publish('some/topic', 'foo', 1);
$mqtt->publish('some/other/topic', 'bar', 2, true); // Retain the message
$mqtt->loop(true);

$mqtt->loop() actually starts an infinite loop. To escape it, there are multiple options. In case of simply publishing a message, all we want is to receive an acknowledgement. Therefore, we can simply pass true as second parameter to exit the loop as soon as all resend queues are cleared:

/** @var \PhpMqtt\Client\Contracts\MqttClient $mqtt */
$mqtt->loop(true, true);

In order to escape the loop, you can also call $mqtt->interrupt() which will exit the loop during the next iteration. The method can, for example, be called in a registered signal handler:

/** @var \PhpMqtt\Client\Contracts\MqttClient $mqtt */
pcntl_signal(SIGINT, function () use ($mqtt) {
$mqtt->interrupt();
});

Subscribe

Very similar to publishing with QoS level 1 and 2, subscribing requires to run an event loop. Although before running the loop, topics need to be subscribed to:

use PhpMqtt\Client\Facades\MQTT;
 
/** @var \PhpMqtt\Client\Contracts\MqttClient $mqtt */
$mqtt = MQTT::connection();
$mqtt->subscribe('some/topic', function (string $topic, string $message) {
echo sprintf('Received QoS level 1 message on topic [%s]: %s', $topic, $message);
}, 1);
$mqtt->loop(true);

Features

This library allows you to use all the features provided by php-mqtt/client. Simply retrieve an instance of \PhpMqtt\Client\Contracts\MqttClient with MQTT::connection(string $name = null) and use it directly.

For an extensive collection of examples which explain how to use the MQTT client (directly), you can visit the php-mqtt/client-examples repository.

License

php-mqtt/laravel-client is open-source software licensed under the MIT license.

Cube

Laravel Newsletter

Join 40k+ other developers and never miss out on new tips, tutorials, and more.


Php Mqtt Laravel Client Related Articles

Matt Stauffer Joins the PHP Foundation Board — What It Means for Laravel image

Matt Stauffer Joins the PHP Foundation Board — What It Means for Laravel

Read article
Laravel 7.7 Released With Variadic Container Support image

Laravel 7.7 Released With Variadic Container Support

Read article
The Artisan Files: Matt Stauffer image

The Artisan Files: Matt Stauffer

Read article
Lucky Media logo

Lucky Media

Get Lucky Now - the ideal choice for Laravel Development, with over a decade of experience!

Lucky Media
Harpoon: Next generation time tracking and invoicing logo

Harpoon: Next generation time tracking and invoicing

The next generation time-tracking and billing software that helps your agency plan and forecast a profitable future.

Harpoon: Next generation time tracking and invoicing
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit: Laravel SaaS Starter Kit

SaaSykit is a Multi-tenant Laravel SaaS Starter Kit that comes with all features required to run a modern SaaS. Payments, Beautiful Checkout, Admin Panel, User dashboard, Auth, Ready Components, Stats, Blog, Docs and more.

SaaSykit: Laravel SaaS Starter Kit
Shift logo

Shift

Running an old Laravel version? Instant, automated Laravel upgrades and code modernization to keep your applications fresh.

Shift
Typesense Search logo

Typesense Search

Typesense is an open source, blazing-fast search engine, optimized for helping you build delightful search experiences for your sites and apps. Natively integrated with Laravel Scout.

Typesense Search
LoadForge logo

LoadForge

Scalable load testing for web apps & APIs. Simulate real-world traffic and identify breaking points and performance limits with powerful, scalable load tests designed for Laravel.

LoadForge