workerman/mqtt

MQTT là một giao thức truyền tải tin nhắn theo mô hình xuất bản / đăng ký dựa trên kiến trúc client-server, đã trở thành một phần quan trọng của Internet of Things (IoT). Ý tưởng thiết kế của nó là nhẹ, mở, đơn giản và tiêu chuẩn, dễ dàng để triển khai. Những đặc điểm này khiến nó trở thành sự lựa chọn tốt cho nhiều tình huống, đặc biệt là trong các môi trường bị hạn chế như giao tiếp máy với máy (M2M) và môi trường IoT.

workerman\mqtt là một thư viện khách hàng MQTT bất đồng bộ dựa trên workerman, có thể được sử dụng để nhận hoặc gửi tin nhắn theo giao thức mqtt. Hỗ trợ QoS 0, QoS 1, QoS 2. Hỗ trợ các phiên bản MQTT 3.1 3.1.1 5.

Địa chỉ dự án

https://github.com/walkor/mqtt

Cài đặt

composer require workerman/mqtt

Hỗ trợ

  • MQTT
  • MQTT5
  • MQTT qua websocket

Ví dụ

subscribe.php

<?php
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker();
$worker->onWorkerStart = function(){
    $mqtt = new Workerman\Mqtt\Client('mqtt://test.mosquitto.org:1883');
    $mqtt->onConnect = function($mqtt) {
        $mqtt->subscribe('test');
    };
    $mqtt->onMessage = function($topic, $content){
        var_dump($topic, $content);
    };
    $mqtt->connect();
};
Worker::runAll();

Chạy lệnh php subscribe.php start để khởi động.

publish.php

<?php
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker();
$worker->onWorkerStart = function(){
    $mqtt = new Workerman\Mqtt\Client('mqtt://test.mosquitto.org:1883');
    $mqtt->onConnect = function($mqtt) {
       $mqtt->publish('test', 'hello workerman mqtt');
    };
    $mqtt->connect();
};
Worker::runAll();

Chạy lệnh php publish.php start để khởi động.

workerman\mqtt\Client接口


__construct (string $address, [array $options])

Tạo một phiên bản khách hàng mqtt.

  • $address địa chỉ máy chủ mqtt, định dạng giống như 'mqtt://test.mosquitto.org:1883'.

  • $options mảng tùy chọn của khách hàng, có thể đặt các tùy chọn sau:

    • keepalive: Khoảng thời gian giữa các trái tim mà khách hàng gửi đến máy chủ, mặc định là 50 giây, đặt thành 0 có nghĩa là không bật trái tim
    • client_id: id của khách hàng, nếu không đặt sẽ mặc định là "workerman-mqtt-client-".mt_rand()
    • protocol_name: Tên giao thức, MQTT (phiên bản 3.1.1) hoặc MQIsdp (phiên bản 3.1), mặc định là MQTT
    • protocol_level: Cấp độ giao thức, giá trị là 4 khi protocol_nameMQTT, giá trị là 3 khi protocol_nameMQIsdp
    • clean_session: Xóa phiên, mặc định là true. Đặt thành false có thể nhận được tin nhắn ngoại tuyến cho QoS 1QoS 2
    • reconnect_period: Khoảng thời gian kết nối lại, mặc định là 1 giây, 0 có nghĩa là không kết nối lại
    • connect_timeout: Thời gian kết nối mqtt hết thời gian, mặc định là 30 giây
    • username: Tên người dùng, tùy chọn
    • password: Mật khẩu, tùy chọn
    • will: Tin nhắn di sản, khi khách hàng ngắt kết nối, Broker sẽ tự động gửi tin nhắn di sản cho các khách hàng khác. Định dạng:
      • topic: Chủ đề
      • content: Nội dung
      • qos: Cấp độ QoS
      • retain: Dấu đánh dấu retain
    • resubscribe: Khi kết nối bị ngắt một cách bất thường và kết nối lại, có nên đăng ký lại các chủ đề trước đó hay không, mặc định là true
    • bindto: Dùng để chỉ định địa chỉ IP và cổng nào sẽ được kết nối đến Broker, giá trị mặc định là ''
    • ssl: Tùy chọn ssl, mặc định là false, nếu đặt thành true, sẽ kết nối dưới dạng ssl. Cũng hỗ trợ truyền vào mảng ngữ cảnh ssl để cấu hình chứng chỉ cục bộ, ngữ cảnh ssl tham khảo tại https://php.net/manual/en/context.ssl.php
    • debug: Có bật chế độ gỡ lỗi hay không, chế độ gỡ lỗi có thể xuất ra thông tin chi tiết về giao tiếp với Broker, mặc định là false
    • uri: Địa chỉ uri mqtt qua websocket, thường là /mqtt

connect()

Kết nối với Broker


publish(String $topic, String $content, [array $options], [callable $callback])

Công bố một tin nhắn đến một chủ đề nào đó

  • $topic Chủ đề
  • $content Tin nhắn
  • $options Mảng tùy chọn, bao gồm
    • qos Cấp độ QoS, mặc định 0
    • retain Dấu đánh dấu retain, mặc định false
    • dup Cờ phát lại, mặc định false
  • $callback - function (\Exception $exception = null) (không hỗ trợ cài đặt này khi QoS là 0) được kích hoạt khi xảy ra lỗi hoặc công bố thành công, $exception là đối tượng ngoại lệ, khi không có lỗi xảy ra thì $exceptionnull, tương tự cho các trường hợp khác.

subscribe(mixed $topic, [array $options], [callable $callback])

Đăng ký một chủ đề hoặc nhiều chủ đề

  • $topic là một chuỗi (đăng ký một chủ đề) hoặc mảng (đăng ký nhiều chủ đề),
    khi đăng ký nhiều chủ đề, $topic là mảng với các chủ đề là key và QoS là giá trị, ví dụ array('topic1'=> 0, 'topic2'=> 1)
  • $options Mảng tùy chọn đăng ký, có các thiết lập sau:
    • qos Cấp độ QoS, mặc định 0
  • $callback - function (\Exception $exception = null, array $granted = [])
    Hàm gọi lại, được kích hoạt khi đăng ký thành công hoặc có lỗi xảy ra
    • exception Đối tượng ngoại lệ, khi không có lỗi xảy ra thì là null, tương tự như trên
    • granted Mảng kết quả đăng ký, tương tự array('topic' => 'qos', 'topic' => 'qos') trong đó:
    • topic là chủ đề đã đăng ký
    • qos Cấp độ QoS mà Broker chấp nhận

unsubscribe(mixed $topic, [callable $callback])

Hủy đăng ký

  • $topic là một chuỗi hoặc mảng chuỗi, giống như array('topic1', 'topic2')
  • $callback - function (\Exception $e = null), hàm gọi lại được kích hoạt khi thành công hoặc thất bại

disconnect()

Ngắt kết nối bình thường với Broker, gói tin DISCONNECT sẽ được gửi đến Broker.


close()

Ngắt kết nối một cách cưỡng bức với Broker, sẽ không gửi gói tin DISCONNECT đến Broker.


callback onConnect(Client $mqtt)

Khi kết nối với Broker được thiết lập hoàn tất thì được kích hoạt. Lúc này đã nhận được gói tin CONNACK từ Broker.


callback onMessage(String $topic, String $content, Client $mqtt)

function (topic, message, packet) {}

Khi khách hàng nhận được gói tin Publish thì được kích hoạt

  • $topic Chủ đề đã nhận
  • $content Nội dung tin nhắn đã nhận
  • $mqtt Phiên bản khách hàng mqtt.

callback onError(\Exception $exception = null)

Khi có một lỗi xảy ra trong kết nối thì được kích hoạt


callback onClose()

Khi kết nối bị đóng, bất kể đó là do khách hàng chủ động đóng hay máy chủ đóng, sẽ kích hoạt onClose

Ví dụ thêm examples/workerman