workerman/mqtt

MQTT เป็นโปรโตคอลการส่งข้อความแบบ publish/subscribe ที่มีสถาปัตยกรรมลูกค้า-เซิร์ฟเวอร์ ได้กลายเป็นส่วนสำคัญของ IoT แนวคิดการออกแบบคือมีน้ำหนักเบา เปิดกว้าง ง่าย และมีมาตรฐาน ทำให้ใช้งานง่าย คุณลักษณะเหล่านี้ทำให้มันเป็นตัวเลือกที่ดีในหลาย ๆ สถานการณ์ โดยเฉพาะอย่างยิ่งสำหรับสภาพแวดล้อมที่มีข้อจำกัด เช่น การสื่อสารระหว่างเครื่องจักร (M2M) และสภาพแวดล้อม IoT

workerman\mqtt เป็นไลบรารี MQTT ลูกค้าที่ยุ่งเหยิงที่ทำงานบน workerman ซึ่งสามารถใช้ในการรับหรือส่งข้อความตามโปรโตคอล MQTT รองรับ QoS 0, QoS 1, QoS 2 รองรับเวอร์ชัน MQTT 3.1 3.1.1 5

ที่อยู่โปรเจ็กต์

https://github.com/walkor/mqtt

การติดตั้ง

composer require workerman/mqtt

การสนับสนุน

  • MQTT
  • MQTT5
  • MQTT ผ่าน websocket

ตัวอย่าง

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();

รันใน command line php subscribe.php start เพื่อเริ่มต้น

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();

รันใน command line php publish.php start เพื่อเริ่มต้น

workerman\mqtt\Client อินเทอร์เฟซ


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

สร้างอินสแตนซ์ของไคลเอ็นต์ mqtt

  • $address ที่อยู่เซิร์ฟเวอร์ mqtt รูปแบบคล้ายกับ 'mqtt://test.mosquitto.org:1883'.

  • $options อาร์เรย์ตัวเลือกของลูกค้า สามารถตั้งค่าได้ดังนี้:

    • keepalive: ระยะเวลาที่ลูกค้าส่งสัญญาณ heartbeat ไปยังเซิร์ฟเวอร์ โดยค่าเริ่มต้นคือ 50 วินาที, ตั้งค่าเป็น 0 จะไม่เปิดใช้งาน heartbeat
    • client_id: รหัสประจำตัวลูกค้า หากไม่ตั้งค่าจะใช้ค่าเริ่มต้นเป็น "workerman-mqtt-client-".mt_rand()
    • protocol_name: ชื่อโปรโตคอล, MQTT (เวอร์ชัน 3.1.1) หรือ MQIsdp (เวอร์ชัน 3.1), ค่าเริ่มต้นคือ MQTT
    • protocol_level: ระดับโปรโตคอล, เมื่อ protocol_name เป็น MQTT ค่าจะเป็น 4, เมื่อ protocol_name เป็น MQIsdp ค่าจะเป็น 3
    • clean_session: ล้างเซสชัน ค่าเริ่มต้นเป็น true ตั้งค่าเป็น false จะสามารถรับข้อความออฟไลน์ระดับ QoS 1 และ QoS 2
    • reconnect_period: ระยะเวลาการเชื่อมต่อใหม่ ค่าเริ่มต้น 1 วินาที, 0 แสดงว่าไม่เชื่อมต่อใหม่
    • connect_timeout: ระยะเวลาที่รอการเชื่อมต่อ mqtt ค่าเริ่มต้น 30 วินาที
    • username: ชื่อผู้ใช้, ไม่บังคับ
    • password: รหัสผ่าน, ไม่บังคับ
    • will: ข้อความสลาย เมื่อไคลเอ็นต์ขาดการเชื่อมต่อ Broker จะส่งข้อความสลายไปยังไคลเอนต์อื่น ๆ อัตโนมัติ รูปแบบคือ:
      • topic: หัวข้อ
      • content: เนื้อหา
      • qos: ระดับ QoS
      • retain: ธง retain
    • resubscribe : เมื่อต่อเชื่อมกับ Broker หายไปและเชื่อมต่อใหม่ จะต้องทำการสมัครรับข่าวสารหัวข้อก่อนหน้าหรือไม่ ค่าเริ่มต้นเป็น true
    • bindto ใช้เพื่อกำหนดว่าเชื่อมต่อกับ Broker ด้วย IP และพอร์ตใด ค่าเริ่มต้นเป็น ''
    • ssl ตัวเลือก ssl ค่าเริ่มต้นเป็น false หากตั้งค่าเป็น true จะเชื่อมต่อด้วย ssl สนับสนุนการส่งอาร์เรย์ context ssl เพื่อกำหนดค่าใบรับรองท้องถิ่น ข้อมูลเพิ่มเติมเกี่ยวกับ context ssl ดูที่ https://php.net/manual/en/context.ssl.php
    • debug เปิดโหมด debug หรือไม่ โหมด debug สามารถแสดงรายละเอียดการสื่อสารกับ Broker ค่าเริ่มต้นเป็น false
    • uri ที่อยู่ของ mqtt ผ่าน websocket ปกติจะเป็น /mqtt

connect()

เชื่อมต่อกับ Broker


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

ส่งข้อความไปยังหัวข้อหนึ่ง

  • $topic หัวข้อ
  • $content ข้อความ
  • $options อาร์เรย์ตัวเลือก รวมถึง
    • qos ระดับ QoS, ค่าเริ่มต้น 0
    • retain ธง retain ค่าเริ่มต้น false
    • dup ธงการส่งซ้ำ, ค่าเริ่มต้น false
  • $callback - function (\Exception $exception = null) (ไม่สนับสนุนการตั้งค่านี้เมื่อ QoS เป็น 0) เรียกใช้เมื่อเกิดข้อผิดพลาดหรือการเผยแพร่สำเร็จ โดยที่ $exception เป็นวัตถุข้อยกเว้น หากไม่มีข้อผิดพลาดเกิดขึ้น $exception จะเป็น null เช่นเดียวกัน

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

สมัครรับข่าวสารหัวข้อหนึ่งหรือหลายหัวข้อ

  • $topic เป็นสตริง (สมัครรับข่าวสารหัวข้อหนึ่ง) หรืออาร์เรย์ (สมัครรับข่าวสารหลายหัวข้อ)
    เมื่อสมัครรับข่าวสารหลายหัวข้อ $topic เป็นหัวข้อที่เป็นคีย์ และ QoS เป็นค่าของอาร์เรย์ เช่น array('topic1'=> 0, 'topic2'=> 1)
  • $options อาร์เรย์ตัวเลือกการสมัครรับข่าวสาร รวมถึงการตั้งค่าดังนี้:
    • qos ระดับ QoS, ค่าเริ่มต้น 0
  • $callback - function (\Exception $exception = null, array $granted = [])
    ฟังก์ชัน callback ที่เรียกใช้เมื่อการสมัครรับข่าวสารสำเร็จหรือเกิดข้อผิดพลาด
    • exception วัตถุข้อยกเว้น เมื่อไม่มีข้อผิดพลาดเกิดขึ้นคือ null เช่นเดียวกัน
    • granted อาร์เรย์ผลลัพธ์การสมัครรับข่าวสาร คล้ายกับ array('topic' => 'qos', 'topic' => 'qos') ซึ่ง:
    • topic คือหัวข้อที่สมัครรับ
    • qos คือระดับ QoS ที่ Broker ยอมรับ

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

ยกเลิกการสมัครสมาชิก

  • $topic เป็นสตริงหรืออาร์เรย์ของสตริง คล้ายกับ array('topic1', 'topic2')
  • $callback - function (\Exception $e = null), ฟังก์ชัน callback ที่เรียกใช้เมื่อสำเร็จหรือผิดพลาด

disconnect()

ตัดการเชื่อมต่อกับ Broker อย่างถูกต้อง ข้อความ DISCONNECT จะถูกส่งไปยัง Broker


close()

บังคับตัดการเชื่อมต่อกับ Broker จะไม่ส่งข้อความ DISCONNECT ไปยัง Broker


callback onConnect(Client $mqtt)

จะเรียกใช้เมื่อการเชื่อมต่อกับ Broker เสร็จสมบูรณ์ ในช่วงเวลานั้นได้มีการรับข้อความ CONNACK จาก Broker


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

function (topic, message, packet) {}

จะเรียกใช้เมื่อไคลเอ็นต์ได้รับข้อความ Publish

  • $topic หัวข้อที่ได้รับ
  • $content เนื้อหาข้อความที่ได้รับ
  • $mqtt อินสแตนซ์ไคลเอ็นต์ mqtt

callback onError(\Exception $exception = null)

จะเรียกใช้เมื่อเกิดข้อผิดพลาดบางอย่างในการเชื่อมต่อ


callback onClose()

จะเรียกใช้เมื่อการเชื่อมต่อถูกปิด ไม่ว่าจะเป็นการปิดโดยไคลเอ็นต์หรือเซิร์ฟเวอร์ก็จะเรียกใช้ onClose

ตัวอย่างเพิ่มเติม examples/workerman