Skip to content

Repository files navigation

php-mqtt/client

Latest Stable VersionTotal DownloadsCoverageQuality Gate StatusMaintainability RatingReliability RatingSecurity RatingVulnerabilitiesLicense

php-mqtt/client was created by, and is maintained by Marvin Mall. It allows you to connect to an MQTT broker where you can publish messages and subscribe to topics. The current implementation supports all QoS levels (with limitations).

Installation

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

composer require php-mqtt/client

The package requires PHP version 7.4 or higher.

Usage

In the following, only a few very basic examples are given. For more elaborate examples, have a look at the php-mqtt/client-examples repository.

Publish

A very basic publish example using QoS 0 requires only three steps: connect, publish and disconnect

$server = 'some-broker.example.com';
$port = 1883;
$clientId = 'test-publisher';
$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
$mqtt->connect();
$mqtt->publish('php-mqtt/client/test', 'Hello World!', 0);
$mqtt->disconnect();

If you do not want to pass a $clientId, a random one will be generated for you. This will basically force a clean session implicitly.

Be also aware that most of the methods can throw exceptions. The above example does not add any exception handling for brevity.

Subscribe

Subscribing is a little more complex than publishing as it requires to run an event loop which reads, parses and handles messages from the broker:

$server = 'some-broker.example.com';
$port = 1883;
$clientId = 'test-subscriber';
$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
$mqtt->connect();
$mqtt->subscribe('php-mqtt/client/test', function ($topic, $message) {
echosprintf("Received message on topic [%s]: %s\n", $topic, $message);
}, 0);
$mqtt->loop(true);
$mqtt->disconnect();

While the loop is active, you can use $mqtt->interrupt() to send an interrupt signal to the loop. This will terminate the loop before it starts its next iteration. You can call this method using pcntl_signal(SIGINT, $handler) for example:

pcntl_async_signals(true);
$clientId = 'test-subscriber';
$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
pcntl_signal(SIGINT, function (int$signal, $info) use ($mqtt) {
$mqtt->interrupt();
});
$mqtt->connect();
$mqtt->subscribe('php-mqtt/client/test', function ($topic, $message) {
echosprintf("Received message on topic [%s]: %s\n", $topic, $message);
}, 0);
$mqtt->loop(true);
$mqtt->disconnect();

Client Settings

As shown in the examples above, the MqttClient takes the server, port and client id as first, second and third parameter. As fourth parameter, the protocol level can be passed. Currently supported is MQTT v3.1, available as constant MqttClient::MQTT_3_1. A fifth parameter allows passing a repository (currently, only a MemoryRepository is available by default). Lastly, a logger can be passed as sixth parameter. If none is given, a null logger is used instead.

Example:

$mqtt = new \PhpMqtt\Client\MqttClient(
$server, $port, $clientId,
\PhpMqtt\Client\MqttClient::MQTT_3_1,
new \PhpMqtt\Client\Repositories\MemoryRepository(),
newLogger()
);

The Logger must implement the Psr\Log\LoggerInterface.

Connection Settings

The connect() method of the MqttClient takes two optional parameters:

  1. A ConnectionSettings instance
  2. A boolean flag indicating whether a clean session should be requested (a random client id does this implicitly)

Example:

$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
$connectionSettings = (new \PhpMqtt\Client\ConnectionSettings)
->setConnectTimeout(3)
->setUseTls(true)
->setTlsSelfSignedAllowed(true);
$mqtt->connect($connectionSettings, true);

The ConnectionSettings class provides a few settings through a fluent interface. The type itself is immutable, and a new ConnectionSettings instance will be created for each added option. This also prevents changes to the connection settings after a connection has been established.

The following is a complete list of options with their respective default:

$connectionSettings = (new \PhpMqtt\Client\ConnectionSettings)
// The username used for authentication when connecting to the broker.
->setUsername(null)
// The password used for authentication when connecting to the broker.
->setPassword(null)
// The connect timeout defines the maximum amount of seconds the client will try to establish// a socket connection with the broker. The value cannot be less than 1 second.
->setConnectTimeout(60)
// The socket timeout is the maximum amount of idle time in seconds for the socket connection.// If no data is read or sent for the given amount of seconds, the socket will be closed.// The value cannot be less than 1 second.
->setSocketTimeout(5)
// The resend timeout is the number of seconds the client will wait before sending a duplicate// of pending messages without acknowledgement. The value cannot be less than 1 second.
->setResendTimeout(10)
// The keep alive interval is the number of seconds the client will wait without sending a message// until it sends a keep alive signal (ping) to the broker. The value cannot be less than 1 second// and may not be higher than 65535 seconds. A reasonable value is 10 seconds (the default).
->setKeepAliveInterval(10)
// If the broker should publish a last will message in the name of the client when the client// disconnects abruptly, this setting defines the topic on which the message will be published.//// A last will message will only be published if both this setting as well as the last will// message are configured.
->setLastWillTopic(null)
// If the broker should publish a last will message in the name of the client when the client// disconnects abruptly, this setting defines the message which will be published.//// A last will message will only be published if both this setting as well as the last will// topic are configured.
->setLastWillMessage(null)
// The quality of service level the last will message of the client will be published with,// if it gets triggered.
->setLastWillQualityOfService(0)
// This flag determines if the last will message of the client will be retained, if it gets// triggered. Using this setting can be handy to signal that a client is offline by publishing// a retained offline state in the last will and an online state as first message on connect.
->setRetainLastWill(false)
// This flag determines if TLS should be used for the connection. The port which is used to// connect to the broker must support TLS connections.
->setUseTls(false)
// This flag determines if the peer certificate is verified, if TLS is used.
->setTlsVerifyPeer(true)
// This flag determines if the peer name is verified, if TLS is used.
->setTlsVerifyPeerName(true)
// This flag determines if self signed certificates of the peer should be accepted.// Setting this to TRUE implies a security risk and should be avoided for production// scenarios and public services.
->setTlsSelfSignedAllowed(false)
// The path to a Certificate Authority certificate which is used to verify the peer// certificate, if TLS is used.
->setTlsCertificateAuthorityFile(null)
// The path to a directory containing Certificate Authority certificates which are// used to verify the peer certificate, if TLS is used.
->setTlsCertificateAuthorityPath(null)
// The path to a client certificate file used for authentication, if TLS is used.//// The client certificate must be PEM encoded. It may optionally contain the// certificate chain of issuers.
->setTlsClientCertificateFile(null)
// The path to a client certificate key file used for authentication, if TLS is used.//// This option requires ConnectionSettings::setTlsClientCertificateFile() to be used as well.
->setTlsClientCertificateKeyFile(null)
// The passphrase used to decrypt the private key of the client certificate,// which in return is used for authentication, if TLS is used.//// This option requires ConnectionSettings::setTlsClientCertificateFile() and// ConnectionSettings::setTlsClientCertificateKeyFile() to be used as well.
->setTlsClientCertificateKeyPassphrase(null);

Features

  • Supported MQTT Versions
    • v3 (just don't use v3.1 features like username & password)
    • v3.1
    • v3.1.1
    • v5.0
  • Transport
    • TCP (unsecured)
    • TLS (secured, verifies the peer using a certificate authority file)
  • Connect
    • Last Will
    • Message Retention
    • Authentication (username & password)
    • TLS encrypted connections
    • Clean Session (can be set and sent, but the client has no persistence for QoS 2 messages)
  • Publish
    • QoS Level 0
    • QoS Level 1 (limitation: no persisted state across sessions)
    • QoS Level 2 (limitation: no persisted state across sessions)
  • Subscribe
    • QoS Level 0
    • QoS Level 1
    • QoS Level 2 (limitation: no persisted state across sessions)
  • Supported Message Length: unlimited (no limits enforced, although the MQTT protocol supports only up to 256MB which one shouldn't use even remotely anyway)
  • Logging possible (Psr\Log\LoggerInterface can be passed to the client)
  • Persistence Drivers
    • In-Memory Driver
    • Redis Driver

Limitations

  • Message flows with a QoS level higher than 0 are not persisted as the default implementation uses an in-memory repository for data. To avoid issues with broken message flows, use the clean session flag to indicate that you don't care about old data. It will not only instruct the broker to consider the connection new (without previous state), but will also reset the registered repository.

Developing & Testing

Certificates (TLS)

To run the tests (especially the TLS tests), you will need to create certificates. A command has been provided for this:

sh create-certificates.sh

This will create all required certificates in the .ci/tls/ directory. The same script is used for continuous integration as well.

MQTT Broker for Testing

Running the tests expects an MQTT broker to be running. The easiest way to run an MQTT broker is through Docker:

docker run --rm -it -p 1883:1883 -p 8883:8883 -p 8884:8884 -v $(pwd)/.ci/tls:/mosquitto-certs -v $(pwd)/.ci/mosquitto.conf:/mosquitto/config/mosquitto.conf eclipse-mosquitto:1.6

When run from the project directory, this will spawn a Mosquitto MQTT broker configured with the generated TLS certificates and a custom configuration.

In case you intend to run a different broker or using a different method, or use a public broker instead, you will need to adjust the environment variables defined in phpunit.xml accordingly.

License

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

About

An MQTT client written in and for PHP.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - Golface/client: An MQTT client written in and for PHP. · GitHub
Skip to content

Repository files navigation

php-mqtt/client

Latest Stable VersionTotal DownloadsCoverageQuality Gate StatusMaintainability RatingReliability RatingSecurity RatingVulnerabilitiesLicense

php-mqtt/client was created by, and is maintained by Marvin Mall. It allows you to connect to an MQTT broker where you can publish messages and subscribe to topics. The current implementation supports all QoS levels (with limitations).

Installation

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

composer require php-mqtt/client

The package requires PHP version 7.4 or higher.

Usage

In the following, only a few very basic examples are given. For more elaborate examples, have a look at the php-mqtt/client-examples repository.

Publish

A very basic publish example using QoS 0 requires only three steps: connect, publish and disconnect

$server = 'some-broker.example.com';
$port = 1883;
$clientId = 'test-publisher';
$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
$mqtt->connect();
$mqtt->publish('php-mqtt/client/test', 'Hello World!', 0);
$mqtt->disconnect();

If you do not want to pass a $clientId, a random one will be generated for you. This will basically force a clean session implicitly.

Be also aware that most of the methods can throw exceptions. The above example does not add any exception handling for brevity.

Subscribe

Subscribing is a little more complex than publishing as it requires to run an event loop which reads, parses and handles messages from the broker:

$server = 'some-broker.example.com';
$port = 1883;
$clientId = 'test-subscriber';
$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
$mqtt->connect();
$mqtt->subscribe('php-mqtt/client/test', function ($topic, $message) {
echosprintf("Received message on topic [%s]: %s\n", $topic, $message);
}, 0);
$mqtt->loop(true);
$mqtt->disconnect();

While the loop is active, you can use $mqtt->interrupt() to send an interrupt signal to the loop. This will terminate the loop before it starts its next iteration. You can call this method using pcntl_signal(SIGINT, $handler) for example:

pcntl_async_signals(true);
$clientId = 'test-subscriber';
$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
pcntl_signal(SIGINT, function (int$signal, $info) use ($mqtt) {
$mqtt->interrupt();
});
$mqtt->connect();
$mqtt->subscribe('php-mqtt/client/test', function ($topic, $message) {
echosprintf("Received message on topic [%s]: %s\n", $topic, $message);
}, 0);
$mqtt->loop(true);
$mqtt->disconnect();

Client Settings

As shown in the examples above, the MqttClient takes the server, port and client id as first, second and third parameter. As fourth parameter, the protocol level can be passed. Currently supported is MQTT v3.1, available as constant MqttClient::MQTT_3_1. A fifth parameter allows passing a repository (currently, only a MemoryRepository is available by default). Lastly, a logger can be passed as sixth parameter. If none is given, a null logger is used instead.

Example:

$mqtt = new \PhpMqtt\Client\MqttClient(
$server, $port, $clientId,
\PhpMqtt\Client\MqttClient::MQTT_3_1,
new \PhpMqtt\Client\Repositories\MemoryRepository(),
newLogger()
);

The Logger must implement the Psr\Log\LoggerInterface.

Connection Settings

The connect() method of the MqttClient takes two optional parameters:

  1. A ConnectionSettings instance
  2. A boolean flag indicating whether a clean session should be requested (a random client id does this implicitly)

Example:

$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
$connectionSettings = (new \PhpMqtt\Client\ConnectionSettings)
->setConnectTimeout(3)
->setUseTls(true)
->setTlsSelfSignedAllowed(true);
$mqtt->connect($connectionSettings, true);

The ConnectionSettings class provides a few settings through a fluent interface. The type itself is immutable, and a new ConnectionSettings instance will be created for each added option. This also prevents changes to the connection settings after a connection has been established.

The following is a complete list of options with their respective default:

$connectionSettings = (new \PhpMqtt\Client\ConnectionSettings)
// The username used for authentication when connecting to the broker.
->setUsername(null)
// The password used for authentication when connecting to the broker.
->setPassword(null)
// The connect timeout defines the maximum amount of seconds the client will try to establish// a socket connection with the broker. The value cannot be less than 1 second.
->setConnectTimeout(60)
// The socket timeout is the maximum amount of idle time in seconds for the socket connection.// If no data is read or sent for the given amount of seconds, the socket will be closed.// The value cannot be less than 1 second.
->setSocketTimeout(5)
// The resend timeout is the number of seconds the client will wait before sending a duplicate// of pending messages without acknowledgement. The value cannot be less than 1 second.
->setResendTimeout(10)
// The keep alive interval is the number of seconds the client will wait without sending a message// until it sends a keep alive signal (ping) to the broker. The value cannot be less than 1 second// and may not be higher than 65535 seconds. A reasonable value is 10 seconds (the default).
->setKeepAliveInterval(10)
// If the broker should publish a last will message in the name of the client when the client// disconnects abruptly, this setting defines the topic on which the message will be published.//// A last will message will only be published if both this setting as well as the last will// message are configured.
->setLastWillTopic(null)
// If the broker should publish a last will message in the name of the client when the client// disconnects abruptly, this setting defines the message which will be published.//// A last will message will only be published if both this setting as well as the last will// topic are configured.
->setLastWillMessage(null)
// The quality of service level the last will message of the client will be published with,// if it gets triggered.
->setLastWillQualityOfService(0)
// This flag determines if the last will message of the client will be retained, if it gets// triggered. Using this setting can be handy to signal that a client is offline by publishing// a retained offline state in the last will and an online state as first message on connect.
->setRetainLastWill(false)
// This flag determines if TLS should be used for the connection. The port which is used to// connect to the broker must support TLS connections.
->setUseTls(false)
// This flag determines if the peer certificate is verified, if TLS is used.
->setTlsVerifyPeer(true)
// This flag determines if the peer name is verified, if TLS is used.
->setTlsVerifyPeerName(true)
// This flag determines if self signed certificates of the peer should be accepted.// Setting this to TRUE implies a security risk and should be avoided for production// scenarios and public services.
->setTlsSelfSignedAllowed(false)
// The path to a Certificate Authority certificate which is used to verify the peer// certificate, if TLS is used.
->setTlsCertificateAuthorityFile(null)
// The path to a directory containing Certificate Authority certificates which are// used to verify the peer certificate, if TLS is used.
->setTlsCertificateAuthorityPath(null)
// The path to a client certificate file used for authentication, if TLS is used.//// The client certificate must be PEM encoded. It may optionally contain the// certificate chain of issuers.
->setTlsClientCertificateFile(null)
// The path to a client certificate key file used for authentication, if TLS is used.//// This option requires ConnectionSettings::setTlsClientCertificateFile() to be used as well.
->setTlsClientCertificateKeyFile(null)
// The passphrase used to decrypt the private key of the client certificate,// which in return is used for authentication, if TLS is used.//// This option requires ConnectionSettings::setTlsClientCertificateFile() and// ConnectionSettings::setTlsClientCertificateKeyFile() to be used as well.
->setTlsClientCertificateKeyPassphrase(null);

Features

  • Supported MQTT Versions
    • v3 (just don't use v3.1 features like username & password)
    • v3.1
    • v3.1.1
    • v5.0
  • Transport
    • TCP (unsecured)
    • TLS (secured, verifies the peer using a certificate authority file)
  • Connect
    • Last Will
    • Message Retention
    • Authentication (username & password)
    • TLS encrypted connections
    • Clean Session (can be set and sent, but the client has no persistence for QoS 2 messages)
  • Publish
    • QoS Level 0
    • QoS Level 1 (limitation: no persisted state across sessions)
    • QoS Level 2 (limitation: no persisted state across sessions)
  • Subscribe
    • QoS Level 0
    • QoS Level 1
    • QoS Level 2 (limitation: no persisted state across sessions)
  • Supported Message Length: unlimited (no limits enforced, although the MQTT protocol supports only up to 256MB which one shouldn't use even remotely anyway)
  • Logging possible (Psr\Log\LoggerInterface can be passed to the client)
  • Persistence Drivers
    • In-Memory Driver
    • Redis Driver

Limitations

  • Message flows with a QoS level higher than 0 are not persisted as the default implementation uses an in-memory repository for data. To avoid issues with broken message flows, use the clean session flag to indicate that you don't care about old data. It will not only instruct the broker to consider the connection new (without previous state), but will also reset the registered repository.

Developing & Testing

Certificates (TLS)

To run the tests (especially the TLS tests), you will need to create certificates. A command has been provided for this:

sh create-certificates.sh

This will create all required certificates in the .ci/tls/ directory. The same script is used for continuous integration as well.

MQTT Broker for Testing

Running the tests expects an MQTT broker to be running. The easiest way to run an MQTT broker is through Docker:

docker run --rm -it -p 1883:1883 -p 8883:8883 -p 8884:8884 -v $(pwd)/.ci/tls:/mosquitto-certs -v $(pwd)/.ci/mosquitto.conf:/mosquitto/config/mosquitto.conf eclipse-mosquitto:1.6

When run from the project directory, this will spawn a Mosquitto MQTT broker configured with the generated TLS certificates and a custom configuration.

In case you intend to run a different broker or using a different method, or use a public broker instead, you will need to adjust the environment variables defined in phpunit.xml accordingly.

License

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

About

An MQTT client written in and for PHP.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Golface/client: An MQTT client written in and for PHP. · GitHub
Skip to content

Repository files navigation

php-mqtt/client

Latest Stable VersionTotal DownloadsCoverageQuality Gate StatusMaintainability RatingReliability RatingSecurity RatingVulnerabilitiesLicense

php-mqtt/client was created by, and is maintained by Marvin Mall. It allows you to connect to an MQTT broker where you can publish messages and subscribe to topics. The current implementation supports all QoS levels (with limitations).

Installation

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

composer require php-mqtt/client

The package requires PHP version 7.4 or higher.

Usage

In the following, only a few very basic examples are given. For more elaborate examples, have a look at the php-mqtt/client-examples repository.

Publish

A very basic publish example using QoS 0 requires only three steps: connect, publish and disconnect

$server = 'some-broker.example.com';
$port = 1883;
$clientId = 'test-publisher';
$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
$mqtt->connect();
$mqtt->publish('php-mqtt/client/test', 'Hello World!', 0);
$mqtt->disconnect();

If you do not want to pass a $clientId, a random one will be generated for you. This will basically force a clean session implicitly.

Be also aware that most of the methods can throw exceptions. The above example does not add any exception handling for brevity.

Subscribe

Subscribing is a little more complex than publishing as it requires to run an event loop which reads, parses and handles messages from the broker:

$server = 'some-broker.example.com';
$port = 1883;
$clientId = 'test-subscriber';
$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
$mqtt->connect();
$mqtt->subscribe('php-mqtt/client/test', function ($topic, $message) {
echosprintf("Received message on topic [%s]: %s\n", $topic, $message);
}, 0);
$mqtt->loop(true);
$mqtt->disconnect();

While the loop is active, you can use $mqtt->interrupt() to send an interrupt signal to the loop. This will terminate the loop before it starts its next iteration. You can call this method using pcntl_signal(SIGINT, $handler) for example:

pcntl_async_signals(true);
$clientId = 'test-subscriber';
$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
pcntl_signal(SIGINT, function (int$signal, $info) use ($mqtt) {
$mqtt->interrupt();
});
$mqtt->connect();
$mqtt->subscribe('php-mqtt/client/test', function ($topic, $message) {
echosprintf("Received message on topic [%s]: %s\n", $topic, $message);
}, 0);
$mqtt->loop(true);
$mqtt->disconnect();

Client Settings

As shown in the examples above, the MqttClient takes the server, port and client id as first, second and third parameter. As fourth parameter, the protocol level can be passed. Currently supported is MQTT v3.1, available as constant MqttClient::MQTT_3_1. A fifth parameter allows passing a repository (currently, only a MemoryRepository is available by default). Lastly, a logger can be passed as sixth parameter. If none is given, a null logger is used instead.

Example:

$mqtt = new \PhpMqtt\Client\MqttClient(
$server, $port, $clientId,
\PhpMqtt\Client\MqttClient::MQTT_3_1,
new \PhpMqtt\Client\Repositories\MemoryRepository(),
newLogger()
);

The Logger must implement the Psr\Log\LoggerInterface.

Connection Settings

The connect() method of the MqttClient takes two optional parameters:

  1. A ConnectionSettings instance
  2. A boolean flag indicating whether a clean session should be requested (a random client id does this implicitly)

Example:

$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
$connectionSettings = (new \PhpMqtt\Client\ConnectionSettings)
->setConnectTimeout(3)
->setUseTls(true)
->setTlsSelfSignedAllowed(true);
$mqtt->connect($connectionSettings, true);

The ConnectionSettings class provides a few settings through a fluent interface. The type itself is immutable, and a new ConnectionSettings instance will be created for each added option. This also prevents changes to the connection settings after a connection has been established.

The following is a complete list of options with their respective default:

$connectionSettings = (new \PhpMqtt\Client\ConnectionSettings)
// The username used for authentication when connecting to the broker.
->setUsername(null)
// The password used for authentication when connecting to the broker.
->setPassword(null)
// The connect timeout defines the maximum amount of seconds the client will try to establish// a socket connection with the broker. The value cannot be less than 1 second.
->setConnectTimeout(60)
// The socket timeout is the maximum amount of idle time in seconds for the socket connection.// If no data is read or sent for the given amount of seconds, the socket will be closed.// The value cannot be less than 1 second.
->setSocketTimeout(5)
// The resend timeout is the number of seconds the client will wait before sending a duplicate// of pending messages without acknowledgement. The value cannot be less than 1 second.
->setResendTimeout(10)
// The keep alive interval is the number of seconds the client will wait without sending a message// until it sends a keep alive signal (ping) to the broker. The value cannot be less than 1 second// and may not be higher than 65535 seconds. A reasonable value is 10 seconds (the default).
->setKeepAliveInterval(10)
// If the broker should publish a last will message in the name of the client when the client// disconnects abruptly, this setting defines the topic on which the message will be published.//// A last will message will only be published if both this setting as well as the last will// message are configured.
->setLastWillTopic(null)
// If the broker should publish a last will message in the name of the client when the client// disconnects abruptly, this setting defines the message which will be published.//// A last will message will only be published if both this setting as well as the last will// topic are configured.
->setLastWillMessage(null)
// The quality of service level the last will message of the client will be published with,// if it gets triggered.
->setLastWillQualityOfService(0)
// This flag determines if the last will message of the client will be retained, if it gets// triggered. Using this setting can be handy to signal that a client is offline by publishing// a retained offline state in the last will and an online state as first message on connect.
->setRetainLastWill(false)
// This flag determines if TLS should be used for the connection. The port which is used to// connect to the broker must support TLS connections.
->setUseTls(false)
// This flag determines if the peer certificate is verified, if TLS is used.
->setTlsVerifyPeer(true)
// This flag determines if the peer name is verified, if TLS is used.
->setTlsVerifyPeerName(true)
// This flag determines if self signed certificates of the peer should be accepted.// Setting this to TRUE implies a security risk and should be avoided for production// scenarios and public services.
->setTlsSelfSignedAllowed(false)
// The path to a Certificate Authority certificate which is used to verify the peer// certificate, if TLS is used.
->setTlsCertificateAuthorityFile(null)
// The path to a directory containing Certificate Authority certificates which are// used to verify the peer certificate, if TLS is used.
->setTlsCertificateAuthorityPath(null)
// The path to a client certificate file used for authentication, if TLS is used.//// The client certificate must be PEM encoded. It may optionally contain the// certificate chain of issuers.
->setTlsClientCertificateFile(null)
// The path to a client certificate key file used for authentication, if TLS is used.//// This option requires ConnectionSettings::setTlsClientCertificateFile() to be used as well.
->setTlsClientCertificateKeyFile(null)
// The passphrase used to decrypt the private key of the client certificate,// which in return is used for authentication, if TLS is used.//// This option requires ConnectionSettings::setTlsClientCertificateFile() and// ConnectionSettings::setTlsClientCertificateKeyFile() to be used as well.
->setTlsClientCertificateKeyPassphrase(null);

Features

  • Supported MQTT Versions
    • v3 (just don't use v3.1 features like username & password)
    • v3.1
    • v3.1.1
    • v5.0
  • Transport
    • TCP (unsecured)
    • TLS (secured, verifies the peer using a certificate authority file)
  • Connect
    • Last Will
    • Message Retention
    • Authentication (username & password)
    • TLS encrypted connections
    • Clean Session (can be set and sent, but the client has no persistence for QoS 2 messages)
  • Publish
    • QoS Level 0
    • QoS Level 1 (limitation: no persisted state across sessions)
    • QoS Level 2 (limitation: no persisted state across sessions)
  • Subscribe
    • QoS Level 0
    • QoS Level 1
    • QoS Level 2 (limitation: no persisted state across sessions)
  • Supported Message Length: unlimited (no limits enforced, although the MQTT protocol supports only up to 256MB which one shouldn't use even remotely anyway)
  • Logging possible (Psr\Log\LoggerInterface can be passed to the client)
  • Persistence Drivers
    • In-Memory Driver
    • Redis Driver

Limitations

  • Message flows with a QoS level higher than 0 are not persisted as the default implementation uses an in-memory repository for data. To avoid issues with broken message flows, use the clean session flag to indicate that you don't care about old data. It will not only instruct the broker to consider the connection new (without previous state), but will also reset the registered repository.

Developing & Testing

Certificates (TLS)

To run the tests (especially the TLS tests), you will need to create certificates. A command has been provided for this:

sh create-certificates.sh

This will create all required certificates in the .ci/tls/ directory. The same script is used for continuous integration as well.

MQTT Broker for Testing

Running the tests expects an MQTT broker to be running. The easiest way to run an MQTT broker is through Docker:

docker run --rm -it -p 1883:1883 -p 8883:8883 -p 8884:8884 -v $(pwd)/.ci/tls:/mosquitto-certs -v $(pwd)/.ci/mosquitto.conf:/mosquitto/config/mosquitto.conf eclipse-mosquitto:1.6

When run from the project directory, this will spawn a Mosquitto MQTT broker configured with the generated TLS certificates and a custom configuration.

In case you intend to run a different broker or using a different method, or use a public broker instead, you will need to adjust the environment variables defined in phpunit.xml accordingly.

License

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

About

An MQTT client written in and for PHP.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Golface/client: An MQTT client written in and for PHP. · GitHub
Skip to content

Repository files navigation

php-mqtt/client

Latest Stable VersionTotal DownloadsCoverageQuality Gate StatusMaintainability RatingReliability RatingSecurity RatingVulnerabilitiesLicense

php-mqtt/client was created by, and is maintained by Marvin Mall. It allows you to connect to an MQTT broker where you can publish messages and subscribe to topics. The current implementation supports all QoS levels (with limitations).

Installation

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

composer require php-mqtt/client

The package requires PHP version 7.4 or higher.

Usage

In the following, only a few very basic examples are given. For more elaborate examples, have a look at the php-mqtt/client-examples repository.

Publish

A very basic publish example using QoS 0 requires only three steps: connect, publish and disconnect

$server = 'some-broker.example.com';
$port = 1883;
$clientId = 'test-publisher';
$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
$mqtt->connect();
$mqtt->publish('php-mqtt/client/test', 'Hello World!', 0);
$mqtt->disconnect();

If you do not want to pass a $clientId, a random one will be generated for you. This will basically force a clean session implicitly.

Be also aware that most of the methods can throw exceptions. The above example does not add any exception handling for brevity.

Subscribe

Subscribing is a little more complex than publishing as it requires to run an event loop which reads, parses and handles messages from the broker:

$server = 'some-broker.example.com';
$port = 1883;
$clientId = 'test-subscriber';
$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
$mqtt->connect();
$mqtt->subscribe('php-mqtt/client/test', function ($topic, $message) {
echosprintf("Received message on topic [%s]: %s\n", $topic, $message);
}, 0);
$mqtt->loop(true);
$mqtt->disconnect();

While the loop is active, you can use $mqtt->interrupt() to send an interrupt signal to the loop. This will terminate the loop before it starts its next iteration. You can call this method using pcntl_signal(SIGINT, $handler) for example:

pcntl_async_signals(true);
$clientId = 'test-subscriber';
$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
pcntl_signal(SIGINT, function (int$signal, $info) use ($mqtt) {
$mqtt->interrupt();
});
$mqtt->connect();
$mqtt->subscribe('php-mqtt/client/test', function ($topic, $message) {
echosprintf("Received message on topic [%s]: %s\n", $topic, $message);
}, 0);
$mqtt->loop(true);
$mqtt->disconnect();

Client Settings

As shown in the examples above, the MqttClient takes the server, port and client id as first, second and third parameter. As fourth parameter, the protocol level can be passed. Currently supported is MQTT v3.1, available as constant MqttClient::MQTT_3_1. A fifth parameter allows passing a repository (currently, only a MemoryRepository is available by default). Lastly, a logger can be passed as sixth parameter. If none is given, a null logger is used instead.

Example:

$mqtt = new \PhpMqtt\Client\MqttClient(
$server, $port, $clientId,
\PhpMqtt\Client\MqttClient::MQTT_3_1,
new \PhpMqtt\Client\Repositories\MemoryRepository(),
newLogger()
);

The Logger must implement the Psr\Log\LoggerInterface.

Connection Settings

The connect() method of the MqttClient takes two optional parameters:

  1. A ConnectionSettings instance
  2. A boolean flag indicating whether a clean session should be requested (a random client id does this implicitly)

Example:

$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
$connectionSettings = (new \PhpMqtt\Client\ConnectionSettings)
->setConnectTimeout(3)
->setUseTls(true)
->setTlsSelfSignedAllowed(true);
$mqtt->connect($connectionSettings, true);

The ConnectionSettings class provides a few settings through a fluent interface. The type itself is immutable, and a new ConnectionSettings instance will be created for each added option. This also prevents changes to the connection settings after a connection has been established.

The following is a complete list of options with their respective default:

$connectionSettings = (new \PhpMqtt\Client\ConnectionSettings)
// The username used for authentication when connecting to the broker.
->setUsername(null)
// The password used for authentication when connecting to the broker.
->setPassword(null)
// The connect timeout defines the maximum amount of seconds the client will try to establish// a socket connection with the broker. The value cannot be less than 1 second.
->setConnectTimeout(60)
// The socket timeout is the maximum amount of idle time in seconds for the socket connection.// If no data is read or sent for the given amount of seconds, the socket will be closed.// The value cannot be less than 1 second.
->setSocketTimeout(5)
// The resend timeout is the number of seconds the client will wait before sending a duplicate// of pending messages without acknowledgement. The value cannot be less than 1 second.
->setResendTimeout(10)
// The keep alive interval is the number of seconds the client will wait without sending a message// until it sends a keep alive signal (ping) to the broker. The value cannot be less than 1 second// and may not be higher than 65535 seconds. A reasonable value is 10 seconds (the default).
->setKeepAliveInterval(10)
// If the broker should publish a last will message in the name of the client when the client// disconnects abruptly, this setting defines the topic on which the message will be published.//// A last will message will only be published if both this setting as well as the last will// message are configured.
->setLastWillTopic(null)
// If the broker should publish a last will message in the name of the client when the client// disconnects abruptly, this setting defines the message which will be published.//// A last will message will only be published if both this setting as well as the last will// topic are configured.
->setLastWillMessage(null)
// The quality of service level the last will message of the client will be published with,// if it gets triggered.
->setLastWillQualityOfService(0)
// This flag determines if the last will message of the client will be retained, if it gets// triggered. Using this setting can be handy to signal that a client is offline by publishing// a retained offline state in the last will and an online state as first message on connect.
->setRetainLastWill(false)
// This flag determines if TLS should be used for the connection. The port which is used to// connect to the broker must support TLS connections.
->setUseTls(false)
// This flag determines if the peer certificate is verified, if TLS is used.
->setTlsVerifyPeer(true)
// This flag determines if the peer name is verified, if TLS is used.
->setTlsVerifyPeerName(true)
// This flag determines if self signed certificates of the peer should be accepted.// Setting this to TRUE implies a security risk and should be avoided for production// scenarios and public services.
->setTlsSelfSignedAllowed(false)
// The path to a Certificate Authority certificate which is used to verify the peer// certificate, if TLS is used.
->setTlsCertificateAuthorityFile(null)
// The path to a directory containing Certificate Authority certificates which are// used to verify the peer certificate, if TLS is used.
->setTlsCertificateAuthorityPath(null)
// The path to a client certificate file used for authentication, if TLS is used.//// The client certificate must be PEM encoded. It may optionally contain the// certificate chain of issuers.
->setTlsClientCertificateFile(null)
// The path to a client certificate key file used for authentication, if TLS is used.//// This option requires ConnectionSettings::setTlsClientCertificateFile() to be used as well.
->setTlsClientCertificateKeyFile(null)
// The passphrase used to decrypt the private key of the client certificate,// which in return is used for authentication, if TLS is used.//// This option requires ConnectionSettings::setTlsClientCertificateFile() and// ConnectionSettings::setTlsClientCertificateKeyFile() to be used as well.
->setTlsClientCertificateKeyPassphrase(null);

Features

  • Supported MQTT Versions
    • v3 (just don't use v3.1 features like username & password)
    • v3.1
    • v3.1.1
    • v5.0
  • Transport
    • TCP (unsecured)
    • TLS (secured, verifies the peer using a certificate authority file)
  • Connect
    • Last Will
    • Message Retention
    • Authentication (username & password)
    • TLS encrypted connections
    • Clean Session (can be set and sent, but the client has no persistence for QoS 2 messages)
  • Publish
    • QoS Level 0
    • QoS Level 1 (limitation: no persisted state across sessions)
    • QoS Level 2 (limitation: no persisted state across sessions)
  • Subscribe
    • QoS Level 0
    • QoS Level 1
    • QoS Level 2 (limitation: no persisted state across sessions)
  • Supported Message Length: unlimited (no limits enforced, although the MQTT protocol supports only up to 256MB which one shouldn't use even remotely anyway)
  • Logging possible (Psr\Log\LoggerInterface can be passed to the client)
  • Persistence Drivers
    • In-Memory Driver
    • Redis Driver

Limitations

  • Message flows with a QoS level higher than 0 are not persisted as the default implementation uses an in-memory repository for data. To avoid issues with broken message flows, use the clean session flag to indicate that you don't care about old data. It will not only instruct the broker to consider the connection new (without previous state), but will also reset the registered repository.

Developing & Testing

Certificates (TLS)

To run the tests (especially the TLS tests), you will need to create certificates. A command has been provided for this:

sh create-certificates.sh

This will create all required certificates in the .ci/tls/ directory. The same script is used for continuous integration as well.

MQTT Broker for Testing

Running the tests expects an MQTT broker to be running. The easiest way to run an MQTT broker is through Docker:

docker run --rm -it -p 1883:1883 -p 8883:8883 -p 8884:8884 -v $(pwd)/.ci/tls:/mosquitto-certs -v $(pwd)/.ci/mosquitto.conf:/mosquitto/config/mosquitto.conf eclipse-mosquitto:1.6

When run from the project directory, this will spawn a Mosquitto MQTT broker configured with the generated TLS certificates and a custom configuration.

In case you intend to run a different broker or using a different method, or use a public broker instead, you will need to adjust the environment variables defined in phpunit.xml accordingly.

License

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

About

An MQTT client written in and for PHP.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - Golface/client: An MQTT client written in and for PHP. · GitHub
Skip to content

Repository files navigation

php-mqtt/client

Latest Stable VersionTotal DownloadsCoverageQuality Gate StatusMaintainability RatingReliability RatingSecurity RatingVulnerabilitiesLicense

php-mqtt/client was created by, and is maintained by Marvin Mall. It allows you to connect to an MQTT broker where you can publish messages and subscribe to topics. The current implementation supports all QoS levels (with limitations).

Installation

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

composer require php-mqtt/client

The package requires PHP version 7.4 or higher.

Usage

In the following, only a few very basic examples are given. For more elaborate examples, have a look at the php-mqtt/client-examples repository.

Publish

A very basic publish example using QoS 0 requires only three steps: connect, publish and disconnect

$server = 'some-broker.example.com';
$port = 1883;
$clientId = 'test-publisher';
$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
$mqtt->connect();
$mqtt->publish('php-mqtt/client/test', 'Hello World!', 0);
$mqtt->disconnect();

If you do not want to pass a $clientId, a random one will be generated for you. This will basically force a clean session implicitly.

Be also aware that most of the methods can throw exceptions. The above example does not add any exception handling for brevity.

Subscribe

Subscribing is a little more complex than publishing as it requires to run an event loop which reads, parses and handles messages from the broker:

$server = 'some-broker.example.com';
$port = 1883;
$clientId = 'test-subscriber';
$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
$mqtt->connect();
$mqtt->subscribe('php-mqtt/client/test', function ($topic, $message) {
echosprintf("Received message on topic [%s]: %s\n", $topic, $message);
}, 0);
$mqtt->loop(true);
$mqtt->disconnect();

While the loop is active, you can use $mqtt->interrupt() to send an interrupt signal to the loop. This will terminate the loop before it starts its next iteration. You can call this method using pcntl_signal(SIGINT, $handler) for example:

pcntl_async_signals(true);
$clientId = 'test-subscriber';
$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
pcntl_signal(SIGINT, function (int$signal, $info) use ($mqtt) {
$mqtt->interrupt();
});
$mqtt->connect();
$mqtt->subscribe('php-mqtt/client/test', function ($topic, $message) {
echosprintf("Received message on topic [%s]: %s\n", $topic, $message);
}, 0);
$mqtt->loop(true);
$mqtt->disconnect();

Client Settings

As shown in the examples above, the MqttClient takes the server, port and client id as first, second and third parameter. As fourth parameter, the protocol level can be passed. Currently supported is MQTT v3.1, available as constant MqttClient::MQTT_3_1. A fifth parameter allows passing a repository (currently, only a MemoryRepository is available by default). Lastly, a logger can be passed as sixth parameter. If none is given, a null logger is used instead.

Example:

$mqtt = new \PhpMqtt\Client\MqttClient(
$server, $port, $clientId,
\PhpMqtt\Client\MqttClient::MQTT_3_1,
new \PhpMqtt\Client\Repositories\MemoryRepository(),
newLogger()
);

The Logger must implement the Psr\Log\LoggerInterface.

Connection Settings

The connect() method of the MqttClient takes two optional parameters:

  1. A ConnectionSettings instance
  2. A boolean flag indicating whether a clean session should be requested (a random client id does this implicitly)

Example:

$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
$connectionSettings = (new \PhpMqtt\Client\ConnectionSettings)
->setConnectTimeout(3)
->setUseTls(true)
->setTlsSelfSignedAllowed(true);
$mqtt->connect($connectionSettings, true);

The ConnectionSettings class provides a few settings through a fluent interface. The type itself is immutable, and a new ConnectionSettings instance will be created for each added option. This also prevents changes to the connection settings after a connection has been established.

The following is a complete list of options with their respective default:

$connectionSettings = (new \PhpMqtt\Client\ConnectionSettings)
// The username used for authentication when connecting to the broker.
->setUsername(null)
// The password used for authentication when connecting to the broker.
->setPassword(null)
// The connect timeout defines the maximum amount of seconds the client will try to establish// a socket connection with the broker. The value cannot be less than 1 second.
->setConnectTimeout(60)
// The socket timeout is the maximum amount of idle time in seconds for the socket connection.// If no data is read or sent for the given amount of seconds, the socket will be closed.// The value cannot be less than 1 second.
->setSocketTimeout(5)
// The resend timeout is the number of seconds the client will wait before sending a duplicate// of pending messages without acknowledgement. The value cannot be less than 1 second.
->setResendTimeout(10)
// The keep alive interval is the number of seconds the client will wait without sending a message// until it sends a keep alive signal (ping) to the broker. The value cannot be less than 1 second// and may not be higher than 65535 seconds. A reasonable value is 10 seconds (the default).
->setKeepAliveInterval(10)
// If the broker should publish a last will message in the name of the client when the client// disconnects abruptly, this setting defines the topic on which the message will be published.//// A last will message will only be published if both this setting as well as the last will// message are configured.
->setLastWillTopic(null)
// If the broker should publish a last will message in the name of the client when the client// disconnects abruptly, this setting defines the message which will be published.//// A last will message will only be published if both this setting as well as the last will// topic are configured.
->setLastWillMessage(null)
// The quality of service level the last will message of the client will be published with,// if it gets triggered.
->setLastWillQualityOfService(0)
// This flag determines if the last will message of the client will be retained, if it gets// triggered. Using this setting can be handy to signal that a client is offline by publishing// a retained offline state in the last will and an online state as first message on connect.
->setRetainLastWill(false)
// This flag determines if TLS should be used for the connection. The port which is used to// connect to the broker must support TLS connections.
->setUseTls(false)
// This flag determines if the peer certificate is verified, if TLS is used.
->setTlsVerifyPeer(true)
// This flag determines if the peer name is verified, if TLS is used.
->setTlsVerifyPeerName(true)
// This flag determines if self signed certificates of the peer should be accepted.// Setting this to TRUE implies a security risk and should be avoided for production// scenarios and public services.
->setTlsSelfSignedAllowed(false)
// The path to a Certificate Authority certificate which is used to verify the peer// certificate, if TLS is used.
->setTlsCertificateAuthorityFile(null)
// The path to a directory containing Certificate Authority certificates which are// used to verify the peer certificate, if TLS is used.
->setTlsCertificateAuthorityPath(null)
// The path to a client certificate file used for authentication, if TLS is used.//// The client certificate must be PEM encoded. It may optionally contain the// certificate chain of issuers.
->setTlsClientCertificateFile(null)
// The path to a client certificate key file used for authentication, if TLS is used.//// This option requires ConnectionSettings::setTlsClientCertificateFile() to be used as well.
->setTlsClientCertificateKeyFile(null)
// The passphrase used to decrypt the private key of the client certificate,// which in return is used for authentication, if TLS is used.//// This option requires ConnectionSettings::setTlsClientCertificateFile() and// ConnectionSettings::setTlsClientCertificateKeyFile() to be used as well.
->setTlsClientCertificateKeyPassphrase(null);

Features

  • Supported MQTT Versions
    • v3 (just don't use v3.1 features like username & password)
    • v3.1
    • v3.1.1
    • v5.0
  • Transport
    • TCP (unsecured)
    • TLS (secured, verifies the peer using a certificate authority file)
  • Connect
    • Last Will
    • Message Retention
    • Authentication (username & password)
    • TLS encrypted connections
    • Clean Session (can be set and sent, but the client has no persistence for QoS 2 messages)
  • Publish
    • QoS Level 0
    • QoS Level 1 (limitation: no persisted state across sessions)
    • QoS Level 2 (limitation: no persisted state across sessions)
  • Subscribe
    • QoS Level 0
    • QoS Level 1
    • QoS Level 2 (limitation: no persisted state across sessions)
  • Supported Message Length: unlimited (no limits enforced, although the MQTT protocol supports only up to 256MB which one shouldn't use even remotely anyway)
  • Logging possible (Psr\Log\LoggerInterface can be passed to the client)
  • Persistence Drivers
    • In-Memory Driver
    • Redis Driver

Limitations

  • Message flows with a QoS level higher than 0 are not persisted as the default implementation uses an in-memory repository for data. To avoid issues with broken message flows, use the clean session flag to indicate that you don't care about old data. It will not only instruct the broker to consider the connection new (without previous state), but will also reset the registered repository.

Developing & Testing

Certificates (TLS)

To run the tests (especially the TLS tests), you will need to create certificates. A command has been provided for this:

sh create-certificates.sh

This will create all required certificates in the .ci/tls/ directory. The same script is used for continuous integration as well.

MQTT Broker for Testing

Running the tests expects an MQTT broker to be running. The easiest way to run an MQTT broker is through Docker:

docker run --rm -it -p 1883:1883 -p 8883:8883 -p 8884:8884 -v $(pwd)/.ci/tls:/mosquitto-certs -v $(pwd)/.ci/mosquitto.conf:/mosquitto/config/mosquitto.conf eclipse-mosquitto:1.6

When run from the project directory, this will spawn a Mosquitto MQTT broker configured with the generated TLS certificates and a custom configuration.

In case you intend to run a different broker or using a different method, or use a public broker instead, you will need to adjust the environment variables defined in phpunit.xml accordingly.

License

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

About

An MQTT client written in and for PHP.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Golface/client: An MQTT client written in and for PHP. · GitHub
Skip to content

Repository files navigation

php-mqtt/client

Latest Stable VersionTotal DownloadsCoverageQuality Gate StatusMaintainability RatingReliability RatingSecurity RatingVulnerabilitiesLicense

php-mqtt/client was created by, and is maintained by Marvin Mall. It allows you to connect to an MQTT broker where you can publish messages and subscribe to topics. The current implementation supports all QoS levels (with limitations).

Installation

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

composer require php-mqtt/client

The package requires PHP version 7.4 or higher.

Usage

In the following, only a few very basic examples are given. For more elaborate examples, have a look at the php-mqtt/client-examples repository.

Publish

A very basic publish example using QoS 0 requires only three steps: connect, publish and disconnect

$server = 'some-broker.example.com';
$port = 1883;
$clientId = 'test-publisher';
$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
$mqtt->connect();
$mqtt->publish('php-mqtt/client/test', 'Hello World!', 0);
$mqtt->disconnect();

If you do not want to pass a $clientId, a random one will be generated for you. This will basically force a clean session implicitly.

Be also aware that most of the methods can throw exceptions. The above example does not add any exception handling for brevity.

Subscribe

Subscribing is a little more complex than publishing as it requires to run an event loop which reads, parses and handles messages from the broker:

$server = 'some-broker.example.com';
$port = 1883;
$clientId = 'test-subscriber';
$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
$mqtt->connect();
$mqtt->subscribe('php-mqtt/client/test', function ($topic, $message) {
echosprintf("Received message on topic [%s]: %s\n", $topic, $message);
}, 0);
$mqtt->loop(true);
$mqtt->disconnect();

While the loop is active, you can use $mqtt->interrupt() to send an interrupt signal to the loop. This will terminate the loop before it starts its next iteration. You can call this method using pcntl_signal(SIGINT, $handler) for example:

pcntl_async_signals(true);
$clientId = 'test-subscriber';
$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
pcntl_signal(SIGINT, function (int$signal, $info) use ($mqtt) {
$mqtt->interrupt();
});
$mqtt->connect();
$mqtt->subscribe('php-mqtt/client/test', function ($topic, $message) {
echosprintf("Received message on topic [%s]: %s\n", $topic, $message);
}, 0);
$mqtt->loop(true);
$mqtt->disconnect();

Client Settings

As shown in the examples above, the MqttClient takes the server, port and client id as first, second and third parameter. As fourth parameter, the protocol level can be passed. Currently supported is MQTT v3.1, available as constant MqttClient::MQTT_3_1. A fifth parameter allows passing a repository (currently, only a MemoryRepository is available by default). Lastly, a logger can be passed as sixth parameter. If none is given, a null logger is used instead.

Example:

$mqtt = new \PhpMqtt\Client\MqttClient(
$server, $port, $clientId,
\PhpMqtt\Client\MqttClient::MQTT_3_1,
new \PhpMqtt\Client\Repositories\MemoryRepository(),
newLogger()
);

The Logger must implement the Psr\Log\LoggerInterface.

Connection Settings

The connect() method of the MqttClient takes two optional parameters:

  1. A ConnectionSettings instance
  2. A boolean flag indicating whether a clean session should be requested (a random client id does this implicitly)

Example:

$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
$connectionSettings = (new \PhpMqtt\Client\ConnectionSettings)
->setConnectTimeout(3)
->setUseTls(true)
->setTlsSelfSignedAllowed(true);
$mqtt->connect($connectionSettings, true);

The ConnectionSettings class provides a few settings through a fluent interface. The type itself is immutable, and a new ConnectionSettings instance will be created for each added option. This also prevents changes to the connection settings after a connection has been established.

The following is a complete list of options with their respective default:

$connectionSettings = (new \PhpMqtt\Client\ConnectionSettings)
// The username used for authentication when connecting to the broker.
->setUsername(null)
// The password used for authentication when connecting to the broker.
->setPassword(null)
// The connect timeout defines the maximum amount of seconds the client will try to establish// a socket connection with the broker. The value cannot be less than 1 second.
->setConnectTimeout(60)
// The socket timeout is the maximum amount of idle time in seconds for the socket connection.// If no data is read or sent for the given amount of seconds, the socket will be closed.// The value cannot be less than 1 second.
->setSocketTimeout(5)
// The resend timeout is the number of seconds the client will wait before sending a duplicate// of pending messages without acknowledgement. The value cannot be less than 1 second.
->setResendTimeout(10)
// The keep alive interval is the number of seconds the client will wait without sending a message// until it sends a keep alive signal (ping) to the broker. The value cannot be less than 1 second// and may not be higher than 65535 seconds. A reasonable value is 10 seconds (the default).
->setKeepAliveInterval(10)
// If the broker should publish a last will message in the name of the client when the client// disconnects abruptly, this setting defines the topic on which the message will be published.//// A last will message will only be published if both this setting as well as the last will// message are configured.
->setLastWillTopic(null)
// If the broker should publish a last will message in the name of the client when the client// disconnects abruptly, this setting defines the message which will be published.//// A last will message will only be published if both this setting as well as the last will// topic are configured.
->setLastWillMessage(null)
// The quality of service level the last will message of the client will be published with,// if it gets triggered.
->setLastWillQualityOfService(0)
// This flag determines if the last will message of the client will be retained, if it gets// triggered. Using this setting can be handy to signal that a client is offline by publishing// a retained offline state in the last will and an online state as first message on connect.
->setRetainLastWill(false)
// This flag determines if TLS should be used for the connection. The port which is used to// connect to the broker must support TLS connections.
->setUseTls(false)
// This flag determines if the peer certificate is verified, if TLS is used.
->setTlsVerifyPeer(true)
// This flag determines if the peer name is verified, if TLS is used.
->setTlsVerifyPeerName(true)
// This flag determines if self signed certificates of the peer should be accepted.// Setting this to TRUE implies a security risk and should be avoided for production// scenarios and public services.
->setTlsSelfSignedAllowed(false)
// The path to a Certificate Authority certificate which is used to verify the peer// certificate, if TLS is used.
->setTlsCertificateAuthorityFile(null)
// The path to a directory containing Certificate Authority certificates which are// used to verify the peer certificate, if TLS is used.
->setTlsCertificateAuthorityPath(null)
// The path to a client certificate file used for authentication, if TLS is used.//// The client certificate must be PEM encoded. It may optionally contain the// certificate chain of issuers.
->setTlsClientCertificateFile(null)
// The path to a client certificate key file used for authentication, if TLS is used.//// This option requires ConnectionSettings::setTlsClientCertificateFile() to be used as well.
->setTlsClientCertificateKeyFile(null)
// The passphrase used to decrypt the private key of the client certificate,// which in return is used for authentication, if TLS is used.//// This option requires ConnectionSettings::setTlsClientCertificateFile() and// ConnectionSettings::setTlsClientCertificateKeyFile() to be used as well.
->setTlsClientCertificateKeyPassphrase(null);

Features

  • Supported MQTT Versions
    • v3 (just don't use v3.1 features like username & password)
    • v3.1
    • v3.1.1
    • v5.0
  • Transport
    • TCP (unsecured)
    • TLS (secured, verifies the peer using a certificate authority file)
  • Connect
    • Last Will
    • Message Retention
    • Authentication (username & password)
    • TLS encrypted connections
    • Clean Session (can be set and sent, but the client has no persistence for QoS 2 messages)
  • Publish
    • QoS Level 0
    • QoS Level 1 (limitation: no persisted state across sessions)
    • QoS Level 2 (limitation: no persisted state across sessions)
  • Subscribe
    • QoS Level 0
    • QoS Level 1
    • QoS Level 2 (limitation: no persisted state across sessions)
  • Supported Message Length: unlimited (no limits enforced, although the MQTT protocol supports only up to 256MB which one shouldn't use even remotely anyway)
  • Logging possible (Psr\Log\LoggerInterface can be passed to the client)
  • Persistence Drivers
    • In-Memory Driver
    • Redis Driver

Limitations

  • Message flows with a QoS level higher than 0 are not persisted as the default implementation uses an in-memory repository for data. To avoid issues with broken message flows, use the clean session flag to indicate that you don't care about old data. It will not only instruct the broker to consider the connection new (without previous state), but will also reset the registered repository.

Developing & Testing

Certificates (TLS)

To run the tests (especially the TLS tests), you will need to create certificates. A command has been provided for this:

sh create-certificates.sh

This will create all required certificates in the .ci/tls/ directory. The same script is used for continuous integration as well.

MQTT Broker for Testing

Running the tests expects an MQTT broker to be running. The easiest way to run an MQTT broker is through Docker:

docker run --rm -it -p 1883:1883 -p 8883:8883 -p 8884:8884 -v $(pwd)/.ci/tls:/mosquitto-certs -v $(pwd)/.ci/mosquitto.conf:/mosquitto/config/mosquitto.conf eclipse-mosquitto:1.6

When run from the project directory, this will spawn a Mosquitto MQTT broker configured with the generated TLS certificates and a custom configuration.

In case you intend to run a different broker or using a different method, or use a public broker instead, you will need to adjust the environment variables defined in phpunit.xml accordingly.

License

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

About

An MQTT client written in and for PHP.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Golface/client: An MQTT client written in and for PHP. · GitHub
Skip to content

Repository files navigation

php-mqtt/client

Latest Stable VersionTotal DownloadsCoverageQuality Gate StatusMaintainability RatingReliability RatingSecurity RatingVulnerabilitiesLicense

php-mqtt/client was created by, and is maintained by Marvin Mall. It allows you to connect to an MQTT broker where you can publish messages and subscribe to topics. The current implementation supports all QoS levels (with limitations).

Installation

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

composer require php-mqtt/client

The package requires PHP version 7.4 or higher.

Usage

In the following, only a few very basic examples are given. For more elaborate examples, have a look at the php-mqtt/client-examples repository.

Publish

A very basic publish example using QoS 0 requires only three steps: connect, publish and disconnect

$server = 'some-broker.example.com';
$port = 1883;
$clientId = 'test-publisher';
$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
$mqtt->connect();
$mqtt->publish('php-mqtt/client/test', 'Hello World!', 0);
$mqtt->disconnect();

If you do not want to pass a $clientId, a random one will be generated for you. This will basically force a clean session implicitly.

Be also aware that most of the methods can throw exceptions. The above example does not add any exception handling for brevity.

Subscribe

Subscribing is a little more complex than publishing as it requires to run an event loop which reads, parses and handles messages from the broker:

$server = 'some-broker.example.com';
$port = 1883;
$clientId = 'test-subscriber';
$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
$mqtt->connect();
$mqtt->subscribe('php-mqtt/client/test', function ($topic, $message) {
echosprintf("Received message on topic [%s]: %s\n", $topic, $message);
}, 0);
$mqtt->loop(true);
$mqtt->disconnect();

While the loop is active, you can use $mqtt->interrupt() to send an interrupt signal to the loop. This will terminate the loop before it starts its next iteration. You can call this method using pcntl_signal(SIGINT, $handler) for example:

pcntl_async_signals(true);
$clientId = 'test-subscriber';
$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
pcntl_signal(SIGINT, function (int$signal, $info) use ($mqtt) {
$mqtt->interrupt();
});
$mqtt->connect();
$mqtt->subscribe('php-mqtt/client/test', function ($topic, $message) {
echosprintf("Received message on topic [%s]: %s\n", $topic, $message);
}, 0);
$mqtt->loop(true);
$mqtt->disconnect();

Client Settings

As shown in the examples above, the MqttClient takes the server, port and client id as first, second and third parameter. As fourth parameter, the protocol level can be passed. Currently supported is MQTT v3.1, available as constant MqttClient::MQTT_3_1. A fifth parameter allows passing a repository (currently, only a MemoryRepository is available by default). Lastly, a logger can be passed as sixth parameter. If none is given, a null logger is used instead.

Example:

$mqtt = new \PhpMqtt\Client\MqttClient(
$server, $port, $clientId,
\PhpMqtt\Client\MqttClient::MQTT_3_1,
new \PhpMqtt\Client\Repositories\MemoryRepository(),
newLogger()
);

The Logger must implement the Psr\Log\LoggerInterface.

Connection Settings

The connect() method of the MqttClient takes two optional parameters:

  1. A ConnectionSettings instance
  2. A boolean flag indicating whether a clean session should be requested (a random client id does this implicitly)

Example:

$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
$connectionSettings = (new \PhpMqtt\Client\ConnectionSettings)
->setConnectTimeout(3)
->setUseTls(true)
->setTlsSelfSignedAllowed(true);
$mqtt->connect($connectionSettings, true);

The ConnectionSettings class provides a few settings through a fluent interface. The type itself is immutable, and a new ConnectionSettings instance will be created for each added option. This also prevents changes to the connection settings after a connection has been established.

The following is a complete list of options with their respective default:

$connectionSettings = (new \PhpMqtt\Client\ConnectionSettings)
// The username used for authentication when connecting to the broker.
->setUsername(null)
// The password used for authentication when connecting to the broker.
->setPassword(null)
// The connect timeout defines the maximum amount of seconds the client will try to establish// a socket connection with the broker. The value cannot be less than 1 second.
->setConnectTimeout(60)
// The socket timeout is the maximum amount of idle time in seconds for the socket connection.// If no data is read or sent for the given amount of seconds, the socket will be closed.// The value cannot be less than 1 second.
->setSocketTimeout(5)
// The resend timeout is the number of seconds the client will wait before sending a duplicate// of pending messages without acknowledgement. The value cannot be less than 1 second.
->setResendTimeout(10)
// The keep alive interval is the number of seconds the client will wait without sending a message// until it sends a keep alive signal (ping) to the broker. The value cannot be less than 1 second// and may not be higher than 65535 seconds. A reasonable value is 10 seconds (the default).
->setKeepAliveInterval(10)
// If the broker should publish a last will message in the name of the client when the client// disconnects abruptly, this setting defines the topic on which the message will be published.//// A last will message will only be published if both this setting as well as the last will// message are configured.
->setLastWillTopic(null)
// If the broker should publish a last will message in the name of the client when the client// disconnects abruptly, this setting defines the message which will be published.//// A last will message will only be published if both this setting as well as the last will// topic are configured.
->setLastWillMessage(null)
// The quality of service level the last will message of the client will be published with,// if it gets triggered.
->setLastWillQualityOfService(0)
// This flag determines if the last will message of the client will be retained, if it gets// triggered. Using this setting can be handy to signal that a client is offline by publishing// a retained offline state in the last will and an online state as first message on connect.
->setRetainLastWill(false)
// This flag determines if TLS should be used for the connection. The port which is used to// connect to the broker must support TLS connections.
->setUseTls(false)
// This flag determines if the peer certificate is verified, if TLS is used.
->setTlsVerifyPeer(true)
// This flag determines if the peer name is verified, if TLS is used.
->setTlsVerifyPeerName(true)
// This flag determines if self signed certificates of the peer should be accepted.// Setting this to TRUE implies a security risk and should be avoided for production// scenarios and public services.
->setTlsSelfSignedAllowed(false)
// The path to a Certificate Authority certificate which is used to verify the peer// certificate, if TLS is used.
->setTlsCertificateAuthorityFile(null)
// The path to a directory containing Certificate Authority certificates which are// used to verify the peer certificate, if TLS is used.
->setTlsCertificateAuthorityPath(null)
// The path to a client certificate file used for authentication, if TLS is used.//// The client certificate must be PEM encoded. It may optionally contain the// certificate chain of issuers.
->setTlsClientCertificateFile(null)
// The path to a client certificate key file used for authentication, if TLS is used.//// This option requires ConnectionSettings::setTlsClientCertificateFile() to be used as well.
->setTlsClientCertificateKeyFile(null)
// The passphrase used to decrypt the private key of the client certificate,// which in return is used for authentication, if TLS is used.//// This option requires ConnectionSettings::setTlsClientCertificateFile() and// ConnectionSettings::setTlsClientCertificateKeyFile() to be used as well.
->setTlsClientCertificateKeyPassphrase(null);

Features

  • Supported MQTT Versions
    • v3 (just don't use v3.1 features like username & password)
    • v3.1
    • v3.1.1
    • v5.0
  • Transport
    • TCP (unsecured)
    • TLS (secured, verifies the peer using a certificate authority file)
  • Connect
    • Last Will
    • Message Retention
    • Authentication (username & password)
    • TLS encrypted connections
    • Clean Session (can be set and sent, but the client has no persistence for QoS 2 messages)
  • Publish
    • QoS Level 0
    • QoS Level 1 (limitation: no persisted state across sessions)
    • QoS Level 2 (limitation: no persisted state across sessions)
  • Subscribe
    • QoS Level 0
    • QoS Level 1
    • QoS Level 2 (limitation: no persisted state across sessions)
  • Supported Message Length: unlimited (no limits enforced, although the MQTT protocol supports only up to 256MB which one shouldn't use even remotely anyway)
  • Logging possible (Psr\Log\LoggerInterface can be passed to the client)
  • Persistence Drivers
    • In-Memory Driver
    • Redis Driver

Limitations

  • Message flows with a QoS level higher than 0 are not persisted as the default implementation uses an in-memory repository for data. To avoid issues with broken message flows, use the clean session flag to indicate that you don't care about old data. It will not only instruct the broker to consider the connection new (without previous state), but will also reset the registered repository.

Developing & Testing

Certificates (TLS)

To run the tests (especially the TLS tests), you will need to create certificates. A command has been provided for this:

sh create-certificates.sh

This will create all required certificates in the .ci/tls/ directory. The same script is used for continuous integration as well.

MQTT Broker for Testing

Running the tests expects an MQTT broker to be running. The easiest way to run an MQTT broker is through Docker:

docker run --rm -it -p 1883:1883 -p 8883:8883 -p 8884:8884 -v $(pwd)/.ci/tls:/mosquitto-certs -v $(pwd)/.ci/mosquitto.conf:/mosquitto/config/mosquitto.conf eclipse-mosquitto:1.6

When run from the project directory, this will spawn a Mosquitto MQTT broker configured with the generated TLS certificates and a custom configuration.

In case you intend to run a different broker or using a different method, or use a public broker instead, you will need to adjust the environment variables defined in phpunit.xml accordingly.

License

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

About

An MQTT client written in and for PHP.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - Golface/client: An MQTT client written in and for PHP. · GitHub
Skip to content

Repository files navigation

php-mqtt/client

Latest Stable VersionTotal DownloadsCoverageQuality Gate StatusMaintainability RatingReliability RatingSecurity RatingVulnerabilitiesLicense

php-mqtt/client was created by, and is maintained by Marvin Mall. It allows you to connect to an MQTT broker where you can publish messages and subscribe to topics. The current implementation supports all QoS levels (with limitations).

Installation

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

composer require php-mqtt/client

The package requires PHP version 7.4 or higher.

Usage

In the following, only a few very basic examples are given. For more elaborate examples, have a look at the php-mqtt/client-examples repository.

Publish

A very basic publish example using QoS 0 requires only three steps: connect, publish and disconnect

$server = 'some-broker.example.com';
$port = 1883;
$clientId = 'test-publisher';
$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
$mqtt->connect();
$mqtt->publish('php-mqtt/client/test', 'Hello World!', 0);
$mqtt->disconnect();

If you do not want to pass a $clientId, a random one will be generated for you. This will basically force a clean session implicitly.

Be also aware that most of the methods can throw exceptions. The above example does not add any exception handling for brevity.

Subscribe

Subscribing is a little more complex than publishing as it requires to run an event loop which reads, parses and handles messages from the broker:

$server = 'some-broker.example.com';
$port = 1883;
$clientId = 'test-subscriber';
$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
$mqtt->connect();
$mqtt->subscribe('php-mqtt/client/test', function ($topic, $message) {
echosprintf("Received message on topic [%s]: %s\n", $topic, $message);
}, 0);
$mqtt->loop(true);
$mqtt->disconnect();

While the loop is active, you can use $mqtt->interrupt() to send an interrupt signal to the loop. This will terminate the loop before it starts its next iteration. You can call this method using pcntl_signal(SIGINT, $handler) for example:

pcntl_async_signals(true);
$clientId = 'test-subscriber';
$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
pcntl_signal(SIGINT, function (int$signal, $info) use ($mqtt) {
$mqtt->interrupt();
});
$mqtt->connect();
$mqtt->subscribe('php-mqtt/client/test', function ($topic, $message) {
echosprintf("Received message on topic [%s]: %s\n", $topic, $message);
}, 0);
$mqtt->loop(true);
$mqtt->disconnect();

Client Settings

As shown in the examples above, the MqttClient takes the server, port and client id as first, second and third parameter. As fourth parameter, the protocol level can be passed. Currently supported is MQTT v3.1, available as constant MqttClient::MQTT_3_1. A fifth parameter allows passing a repository (currently, only a MemoryRepository is available by default). Lastly, a logger can be passed as sixth parameter. If none is given, a null logger is used instead.

Example:

$mqtt = new \PhpMqtt\Client\MqttClient(
$server, $port, $clientId,
\PhpMqtt\Client\MqttClient::MQTT_3_1,
new \PhpMqtt\Client\Repositories\MemoryRepository(),
newLogger()
);

The Logger must implement the Psr\Log\LoggerInterface.

Connection Settings

The connect() method of the MqttClient takes two optional parameters:

  1. A ConnectionSettings instance
  2. A boolean flag indicating whether a clean session should be requested (a random client id does this implicitly)

Example:

$mqtt = new \PhpMqtt\Client\MqttClient($server, $port, $clientId);
$connectionSettings = (new \PhpMqtt\Client\ConnectionSettings)
->setConnectTimeout(3)
->setUseTls(true)
->setTlsSelfSignedAllowed(true);
$mqtt->connect($connectionSettings, true);

The ConnectionSettings class provides a few settings through a fluent interface. The type itself is immutable, and a new ConnectionSettings instance will be created for each added option. This also prevents changes to the connection settings after a connection has been established.

The following is a complete list of options with their respective default:

$connectionSettings = (new \PhpMqtt\Client\ConnectionSettings)
// The username used for authentication when connecting to the broker.
->setUsername(null)
// The password used for authentication when connecting to the broker.
->setPassword(null)
// The connect timeout defines the maximum amount of seconds the client will try to establish// a socket connection with the broker. The value cannot be less than 1 second.
->setConnectTimeout(60)
// The socket timeout is the maximum amount of idle time in seconds for the socket connection.// If no data is read or sent for the given amount of seconds, the socket will be closed.// The value cannot be less than 1 second.
->setSocketTimeout(5)
// The resend timeout is the number of seconds the client will wait before sending a duplicate// of pending messages without acknowledgement. The value cannot be less than 1 second.
->setResendTimeout(10)
// The keep alive interval is the number of seconds the client will wait without sending a message// until it sends a keep alive signal (ping) to the broker. The value cannot be less than 1 second// and may not be higher than 65535 seconds. A reasonable value is 10 seconds (the default).
->setKeepAliveInterval(10)
// If the broker should publish a last will message in the name of the client when the client// disconnects abruptly, this setting defines the topic on which the message will be published.//// A last will message will only be published if both this setting as well as the last will// message are configured.
->setLastWillTopic(null)
// If the broker should publish a last will message in the name of the client when the client// disconnects abruptly, this setting defines the message which will be published.//// A last will message will only be published if both this setting as well as the last will// topic are configured.
->setLastWillMessage(null)
// The quality of service level the last will message of the client will be published with,// if it gets triggered.
->setLastWillQualityOfService(0)
// This flag determines if the last will message of the client will be retained, if it gets// triggered. Using this setting can be handy to signal that a client is offline by publishing// a retained offline state in the last will and an online state as first message on connect.
->setRetainLastWill(false)
// This flag determines if TLS should be used for the connection. The port which is used to// connect to the broker must support TLS connections.
->setUseTls(false)
// This flag determines if the peer certificate is verified, if TLS is used.
->setTlsVerifyPeer(true)
// This flag determines if the peer name is verified, if TLS is used.
->setTlsVerifyPeerName(true)
// This flag determines if self signed certificates of the peer should be accepted.// Setting this to TRUE implies a security risk and should be avoided for production// scenarios and public services.
->setTlsSelfSignedAllowed(false)
// The path to a Certificate Authority certificate which is used to verify the peer// certificate, if TLS is used.
->setTlsCertificateAuthorityFile(null)
// The path to a directory containing Certificate Authority certificates which are// used to verify the peer certificate, if TLS is used.
->setTlsCertificateAuthorityPath(null)
// The path to a client certificate file used for authentication, if TLS is used.//// The client certificate must be PEM encoded. It may optionally contain the// certificate chain of issuers.
->setTlsClientCertificateFile(null)
// The path to a client certificate key file used for authentication, if TLS is used.//// This option requires ConnectionSettings::setTlsClientCertificateFile() to be used as well.
->setTlsClientCertificateKeyFile(null)
// The passphrase used to decrypt the private key of the client certificate,// which in return is used for authentication, if TLS is used.//// This option requires ConnectionSettings::setTlsClientCertificateFile() and// ConnectionSettings::setTlsClientCertificateKeyFile() to be used as well.
->setTlsClientCertificateKeyPassphrase(null);

Features

  • Supported MQTT Versions
    • v3 (just don't use v3.1 features like username & password)
    • v3.1
    • v3.1.1
    • v5.0
  • Transport
    • TCP (unsecured)
    • TLS (secured, verifies the peer using a certificate authority file)
  • Connect
    • Last Will
    • Message Retention
    • Authentication (username & password)
    • TLS encrypted connections
    • Clean Session (can be set and sent, but the client has no persistence for QoS 2 messages)
  • Publish
    • QoS Level 0
    • QoS Level 1 (limitation: no persisted state across sessions)
    • QoS Level 2 (limitation: no persisted state across sessions)
  • Subscribe
    • QoS Level 0
    • QoS Level 1
    • QoS Level 2 (limitation: no persisted state across sessions)
  • Supported Message Length: unlimited (no limits enforced, although the MQTT protocol supports only up to 256MB which one shouldn't use even remotely anyway)
  • Logging possible (Psr\Log\LoggerInterface can be passed to the client)
  • Persistence Drivers
    • In-Memory Driver
    • Redis Driver

Limitations

  • Message flows with a QoS level higher than 0 are not persisted as the default implementation uses an in-memory repository for data. To avoid issues with broken message flows, use the clean session flag to indicate that you don't care about old data. It will not only instruct the broker to consider the connection new (without previous state), but will also reset the registered repository.

Developing & Testing

Certificates (TLS)

To run the tests (especially the TLS tests), you will need to create certificates. A command has been provided for this:

sh create-certificates.sh

This will create all required certificates in the .ci/tls/ directory. The same script is used for continuous integration as well.

MQTT Broker for Testing

Running the tests expects an MQTT broker to be running. The easiest way to run an MQTT broker is through Docker:

docker run --rm -it -p 1883:1883 -p 8883:8883 -p 8884:8884 -v $(pwd)/.ci/tls:/mosquitto-certs -v $(pwd)/.ci/mosquitto.conf:/mosquitto/config/mosquitto.conf eclipse-mosquitto:1.6

When run from the project directory, this will spawn a Mosquitto MQTT broker configured with the generated TLS certificates and a custom configuration.

In case you intend to run a different broker or using a different method, or use a public broker instead, you will need to adjust the environment variables defined in phpunit.xml accordingly.

License

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

About

An MQTT client written in and for PHP.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages