MQTT.JS เป็นไลบรารีไคลเอนต์สำหรับโปรโตคอล MQTT ที่เขียนด้วย JavaScript สำหรับ Node.js และเบราว์เซอร์
MQTT.JS เป็นโครงการโอเพนซอร์สแบบเปิดดูส่วนที่มีส่วนร่วมเพื่อค้นหาว่าสิ่งนี้หมายถึงอะไร
v5.0.0 (07/2023)
MqttClient new ตอนนี้v4.0.0 (เปิดตัว 04/2020) ลบการสนับสนุนสำหรับรุ่น Node Life ทั้งหมดและตอนนี้รองรับ Node V12 และ V14 นอกจากนี้ยังเพิ่มการปรับปรุงการบันทึกการบันทึกการบันทึกพร้อมกับการเพิ่มคุณสมบัติบางอย่าง
เป็นการ เปลี่ยนแปลงที่เกิดขึ้น โดยค่าเริ่มต้นตัวจัดการข้อผิดพลาดจะถูกสร้างขึ้นในไคลเอนต์ MQTT.JS ดังนั้นหากมีการปล่อยข้อผิดพลาดใด ๆ และผู้ใช้ไม่ได้สร้างตัวจัดการเหตุการณ์บนไคลเอนต์สำหรับข้อผิดพลาดไคลเอนต์จะไม่พังเนื่องจากข้อผิดพลาดที่ไม่ได้รับการจัดการ นอกจากนี้ข้อผิดพลาด TLS ทั่วไปเช่น ECONNREFUSED , ECONNRESET ได้ถูกเพิ่มเข้าไปในรายการของข้อผิดพลาด TLS ที่จะถูกปล่อยออกมาจากไคลเอนต์ MQTT.JS และสามารถจัดการเป็นข้อผิดพลาดในการเชื่อมต่อได้
v3.0.0 เพิ่มการสนับสนุนสำหรับ MQTT 5, รองรับโหนด v10.x และการแก้ไขจำนวนมากเพื่อปรับปรุงความน่าเชื่อถือ
หมายเหตุ: การสนับสนุน MQTT V5 เป็นการทดลองเนื่องจากยังไม่ได้ดำเนินการโดยโบรกเกอร์
v2.0.0 ลบการสนับสนุนสำหรับโหนด v0.8, v0.10 และ v0.12 และเร็วกว่า 3x ในการส่งแพ็คเก็ต นอกจากนี้ยังลบฟังก์ชั่นที่เลิกใช้งานทั้งหมดใน v1.0.0 ส่วนใหญ่ mqtt.createConnection และ mqtt.Server จาก v2.0.0 การสมัครสมาชิกจะถูกกู้คืนเมื่อทำการเชื่อมต่อใหม่หาก clean: true V1.XX อยู่ใน LTS และจะได้รับการสนับสนุนต่อไปตราบใดที่มีผู้ใช้ V0.8, V0.10 และ V0.12
เป็นการ เปลี่ยนแปลงที่แตกหัก ตัวเลือก encoding ในไคลเอนต์เก่าจะถูกลบออกและตอนนี้ทุกอย่างคือ UTF-8 ยกเว้น password ในข้อความเชื่อมต่อและ payload ในข้อความเผยแพร่ซึ่งเป็น Buffer
การเปลี่ยนแปลงที่แตกหัก อีกอย่างคือ MQTT.JS ตอนนี้ค่าเริ่มต้นเป็น MQTT v3.1.1 ดังนั้นเพื่อสนับสนุนโบรกเกอร์เก่าโปรดอ่านเอกสารตัวเลือกไคลเอนต์
v1.0.0 ปรับปรุงสถาปัตยกรรมโดยรวมของโครงการซึ่งตอนนี้แบ่งออกเป็นสามองค์ประกอบ: mqtt.js ช่วยให้ไคลเอนต์การเชื่อมต่อ MQTT รวมถึงรหัสการเชื่อมต่อกระดูกเปลือยสำหรับการใช้งานฝั่งเซิร์ฟเวอร์ ไคลเอนต์ใหม่ปรับปรุงประสิทธิภาพโดยปัจจัย 30%, การสนับสนุน WebSocket Embeds (ตอนนี้เลิกใช้แล้วในขณะนี้) และมีการสนับสนุนที่ดีกว่าสำหรับ QoS 1 และ 2 API ก่อนหน้านี้ยังคงรองรับ แต่เลิกใช้แล้วเช่นนี้ไม่ได้บันทึกไว้ใน readMe นี้
npm install mqtt --saveเพื่อความเรียบง่ายลองวางสมาชิกและผู้เผยแพร่ในไฟล์เดียวกัน:
const mqtt = require ( "mqtt" ) ;
const client = mqtt . connect ( "mqtt://test.mosquitto.org" ) ;
client . on ( "connect" , ( ) => {
client . subscribe ( "presence" , ( err ) => {
if ( ! err ) {
client . publish ( "presence" , "Hello mqtt" ) ;
}
} ) ;
} ) ;
client . on ( "message" , ( topic , message ) => {
// message is Buffer
console . log ( message . toString ( ) ) ;
client . end ( ) ;
} ) ;เอาท์พุท:
Hello mqttMQTT.JS สามารถใช้ในแอปพลิเคชัน React Native หากต้องการใช้ให้ดูตัวอย่าง React Native
หากคุณต้องการเรียกใช้ MQTT Broker ของคุณเองคุณสามารถใช้ Mosquitto หรือ Aedes-CLI และเปิดตัว
คุณยังสามารถใช้อินสแตนซ์ทดสอบ: test.mosquitto.org
หากคุณไม่ต้องการติดตั้งโบรกเกอร์แยกต่างหากคุณสามารถลองใช้ Aedes
const mqtt = require ( "mqtt" ) // require mqtt
const client = mqtt . connect ( "mqtt://test.mosquitto.org" ) // create a client import mqtt from "mqtt" ; // import namespace "mqtt"
let client = mqtt . connect ( "mqtt://test.mosquitto.org" ) ; // create a client import { connect } from "mqtt" ; // import connect from mqtt
let client = connect ( "mqtt://test.mosquitto.org" ) ; // create a client mqtt.js รวมคำสั่งให้โต้ตอบกับนายหน้า เพื่อให้มีอยู่บนเส้นทางของคุณคุณควรติดตั้ง mqtt.js ทั่วโลก:
npm install mqtt -gจากนั้นในเทอร์มินัลหนึ่งเทอร์มินัล
mqtt sub -t ' hello ' -h ' test.mosquitto.org ' -vในอีกอันหนึ่ง
mqtt pub -t ' hello ' -h ' test.mosquitto.org ' -m ' from MQTT.js ' ดู mqtt help <command> สำหรับความช่วยเหลือคำสั่ง
MQTT.JS ใช้แพ็คเกจการดีบักเพื่อจุดประสงค์ในการดีบัก ในการเปิดใช้งานบันทึกการดีบักให้เพิ่มตัวแปรสภาพแวดล้อมต่อไปนี้ในรันไทม์:
# ( example using PowerShell, the VS Code default )
$env:DEBUG='mqttjs*' ส่วนสำคัญของการเชื่อมต่อ WebSocket ใด ๆ คือสิ่งที่ต้องทำเมื่อการเชื่อมต่อลดลงและลูกค้าจำเป็นต้องเชื่อมต่ออีกครั้ง MQTT มีการสนับสนุนการเชื่อมต่อใหม่ในตัวซึ่งสามารถกำหนดค่าให้ทำงานในรูปแบบที่เหมาะสมกับแอปพลิเคชัน
transformWsUrl (WebSocket เท่านั้น)เมื่อการเชื่อมต่อ MQTT ลดลงและจำเป็นต้องเชื่อมต่อใหม่เป็นเรื่องปกติที่จะต้องมีการตรวจสอบความถูกต้องใด ๆ ที่เกี่ยวข้องกับการเชื่อมต่อจะถูกเก็บไว้ในปัจจุบันด้วยกลไกการรับรองความถูกต้อง ตัวอย่างเช่นแอปพลิเคชันบางตัวอาจผ่านโทเค็นการรับรองความถูกต้องพร้อมตัวเลือกการเชื่อมต่อในการเชื่อมต่อเริ่มต้นในขณะที่บริการคลาวด์อื่น ๆ อาจต้องมีการลงนาม URL กับการเชื่อมต่อแต่ละครั้ง
เมื่อถึงเวลาที่การเชื่อมต่อใหม่เกิดขึ้นในวงจรชีวิตแอปพลิเคชันข้อมูลการรับรองความถูกต้องดั้งเดิมอาจหมดอายุ
ในการแก้ไขปัญหานี้เราสามารถใช้ตะขอที่เรียกว่า transformWsUrl เพื่อจัดการ URL การเชื่อมต่อหรือตัวเลือกไคลเอนต์ในเวลาที่ทำการเชื่อมต่ออีกครั้ง
ตัวอย่าง (อัปเดตชื่อผู้ใช้และชื่อผู้ใช้ในการเชื่อมต่อแต่ละครั้ง):
const transformWsUrl = ( url , options , client ) => {
client . options . username = `token= ${ this . get_current_auth_token ( ) } ` ;
client . options . clientId = ` ${ this . get_updated_clientId ( ) } ` ;
return ` ${ this . get_signed_cloud_url ( url ) } ` ;
}
const connection = await mqtt . connectAsync ( < wss url > , {
... ,
transformWsUrl : transformUrl ,
} );ตอนนี้ทุกครั้งที่มีการเปิดการเชื่อมต่อ WebSocket ใหม่ (หวังว่าจะไม่บ่อยเกินไป) เราจะได้รับ URL ที่ลงนามใหม่หรือข้อมูลโทเค็น Auth ใหม่
หมายเหตุ: ขณะนี้ตะขอนี้ ไม่ สนับสนุนสัญญาซึ่งหมายความว่าในการใช้โทเค็น Auth ล่าสุดคุณต้องมีกลไกภายนอกที่ใช้งานอยู่ที่จัดการการตรวจสอบความถูกต้องระดับแอปพลิเคชันเพื่อให้การเชื่อมต่อ WebSocket สามารถคว้าโทเค็นล่าสุดหรือ URL ที่ลงนามได้
createWebsocket (WebSocket เท่านั้น)เมื่อคุณต้องการเพิ่ม subprotocol หรือส่วนหัวของ WebSocket ที่กำหนดเองเพื่อเปิดการเชื่อมต่อผ่านพร็อกซีด้วยการรับรองความถูกต้องที่กำหนดเองการโทรกลับนี้ช่วยให้คุณสร้างอินสแตนซ์ของคุณเองของ WebSocket ซึ่งจะใช้ในไคลเอนต์ MQTT
const createWebsocket = ( url , websocketSubProtocols , options ) => {
const subProtocols = [
websocketSubProtocols [ 0 ] ,
'myCustomSubprotocolOrOAuthToken' ,
]
return new WebSocket ( url , subProtocols )
}
const client = await mqtt . connectAsync ( < wss url > , {
... ,
createWebsocket : createWebsocket ,
} );reconnectPeriod เพื่อให้แน่ใจว่าไคลเอนต์ MQTT พยายามเชื่อมต่อใหม่โดยอัตโนมัติเมื่อการเชื่อมต่อลดลงคุณต้องตั้งค่าตัวเลือกไคลเอนต์ reconnectPeriod กับค่าที่มากกว่า 0 ค่าของ 0 จะปิดการเชื่อมต่อใหม่แล้วยุติการเชื่อมต่อสุดท้ายเมื่อลดลง
ค่าเริ่มต้นคือ 1,000 มิลลิวินาทีซึ่งหมายความว่าจะพยายามเชื่อมต่ออีกครั้ง 1 วินาทีหลังจากสูญเสียการเชื่อมต่อ
โปรดทราบว่าสิ่งนี้จะเปิดใช้งานการเชื่อมต่อใหม่หลังจากหมดเวลาเชื่อมต่อหรือหลังจากการเชื่อมต่อที่ประสบความสำเร็จ มันจะ ไม่ (โดยค่าเริ่มต้น) เปิดใช้งานการเชื่อมต่อใหม่ที่ถูกปฏิเสธอย่างแข็งขันด้วยข้อผิดพลาด connack โดยเซิร์ฟเวอร์
หากต้องการเปิดใช้งานการเชื่อมต่ออัตโนมัติสำหรับข้อผิดพลาด connack ให้ตั้งค่า reconnectOnConnackError: true
หากไคลเอนต์ตั้งค่าตัวเลือก autoUseTopicAlias:true แล้ว MQTT.JS จะใช้นามแฝงหัวข้อที่มีอยู่โดยอัตโนมัติ
ตัวอย่างสถานการณ์:
1. PUBLISH topic: ' t1 ' , ta:1 (register)
2. PUBLISH topic: ' t1 ' - > topic: ' ' , ta:1 (auto use existing map entry)
3. PUBLISH topic: ' t2 ' , ta:1 (register overwrite)
4. PUBLISH topic: ' t2 ' - > topic: ' ' , ta:1 (auto use existing map entry based on the receent map)
5. PUBLISH topic: ' t1 ' (t1 is no longer mapped to ta:1)ผู้ใช้ไม่จำเป็นต้องจัดการหัวข้อใดที่แมปกับนามแฝงหัวข้อ หากผู้ใช้ต้องการลงทะเบียนนามแฝงหัวข้อให้เผยแพร่หัวข้อด้วยนามแฝงหัวข้อ หากผู้ใช้ต้องการใช้นามแฝงหัวข้อให้เผยแพร่หัวข้อโดยไม่มีชื่อแทน หากมีนามแฝงหัวข้อที่แมปให้เพิ่มเป็นคุณสมบัติและอัปเดตหัวข้อเป็นสตริงว่าง
หากไคลเอนต์ตั้งค่าตัวเลือก autoAssignTopicAlias:true แล้ว mqtt.js จะใช้นามแฝงหัวข้อที่มีอยู่โดยอัตโนมัติ หากไม่มีหัวข้อนามแฝงให้กำหนดนามแฝงหัวข้อที่ว่างใหม่โดยอัตโนมัติ หากมีการใช้นามแฝงหัวข้ออย่างเต็มที่แล้ว LRU (ใช้อย่างน้อยเมื่อเร็ว ๆ นี้) รายการหัวข้อ-alias จะถูกเขียนทับ
ตัวอย่างสถานการณ์:
The broker returns CONNACK (TopicAliasMaximum:3)
1. PUBLISH topic: ' t1 ' - > ' t1 ' , ta:1 (auto assign t1:1 and register)
2. PUBLISH topic: ' t1 ' - > ' ' , ta:1 (auto use existing map entry)
3. PUBLISH topic: ' t2 ' - > ' t2 ' , ta:2 (auto assign t1:2 and register. 2 was vacant)
4. PUBLISH topic: ' t3 ' - > ' t3 ' , ta:3 (auto assign t1:3 and register. 3 was vacant)
5. PUBLISH topic: ' t4 ' - > ' t4 ' , ta:1 (LRU entry is overwritten)นอกจากนี้ผู้ใช้สามารถลงทะเบียน Topic-Alias Pair ด้วยตนเองโดยใช้หัวข้อเผยแพร่: 'Some', Ta: x มันทำงานได้ดีกับการกำหนดนามแฝงหัวข้ออัตโนมัติ
mqtt.connect()mqtt.connectAsync()mqtt.Client()mqtt.Client#connect()mqtt.Client#publish()mqtt.Client#publishAsync()mqtt.Client#subscribe()mqtt.Client#subscribeAsync()mqtt.Client#unsubscribe()mqtt.Client#unsubscribeAsync()mqtt.Client#end()mqtt.Client#endAsync()mqtt.Client#removeOutgoingMessage()mqtt.Client#reconnect()mqtt.Client#handleMessage()mqtt.Client#connectedmqtt.Client#reconnectingmqtt.Client#getLastMessageId()mqtt.Store()mqtt.Store#put()mqtt.Store#del()mqtt.Store#createStream()mqtt.Store#close()เชื่อมต่อกับนายหน้าที่ระบุโดย URL และตัวเลือกที่กำหนดและส่งคืนไคลเอนต์
URL สามารถอยู่ในโปรโตคอลต่อไปนี้: 'MQTT', 'MQTTS', 'TCP', 'TLS', 'WS', 'WSS', 'WXS', 'Alis' หากคุณพยายามเชื่อมต่อกับซ็อกเก็ต Unix เพียงผนวกคำต่อท้าย +unix เข้ากับโปรโตคอล (เช่น: mqtt+unix ) สิ่งนี้จะตั้งค่าคุณสมบัติ unixSocket โดยอัตโนมัติ
URL ยังสามารถเป็นวัตถุที่ส่งคืนโดย URL.parse() ในกรณีนั้นวัตถุทั้งสองถูกรวมเข้าด้วยกันเช่นคุณสามารถส่งวัตถุเดียวกับทั้ง URL และตัวเลือกการเชื่อมต่อ
นอกจากนี้คุณยังสามารถระบุตัวเลือก servers ที่มีเนื้อหา: [{ host: 'localhost', port: 1883 }, ... ] , ในกรณีนั้นอาร์เรย์ถูกวนซ้ำทุกการเชื่อมต่อ
สำหรับตัวเลือกที่เกี่ยวข้องกับ MQTT ทั้งหมดให้ดูที่ตัวสร้างไคลเอนต์
เสื้อคลุมแบบอะซิงโครนัสรอบฟังก์ชั่น connect
ส่งคืน Promise ที่แก้ไขไปยังอินสแตนซ์ mqtt.Client เมื่อไคลเอนต์ยิงเหตุการณ์ 'connect' หรือ 'end' หรือปฏิเสธข้อผิดพลาดหากมีการยิง 'error'
โปรดทราบว่าตัวเลือก manualConnect จะทำให้สัญญาที่ส่งคืนโดยฟังก์ชั่นนี้ไม่เคยแก้ไขหรือปฏิเสธเนื่องจากไคลเอนต์พื้นฐานไม่เคยยิงเหตุการณ์ใด ๆ
คลาส Client จะเชื่อมต่อการเชื่อมต่อไคลเอนต์กับนายหน้า MQTT ด้วยวิธีการขนส่งโดยพลการ (TCP, TLS, WebSocket, ECC) Client เป็นผู้จัดกิจกรรมที่มีกิจกรรมของตัวเอง
Client จัดการสิ่งต่อไปนี้โดยอัตโนมัติ:
ข้อโต้แย้งคือ:
streamBuilder เป็นฟังก์ชั่นที่ส่งคืนคลาสย่อยของคลาส Stream ที่รองรับเหตุการณ์ connect โดยทั่วไปแล้ว net.Socketoptions คือตัวเลือกการเชื่อมต่อไคลเอนต์ (ดู: แพ็คเก็ตเชื่อมต่อ) ค่าเริ่มต้น: wsOptions : เป็นตัวเลือกการเชื่อมต่อ WebSocket ค่าเริ่มต้นคือ {} มันเฉพาะสำหรับ websockets สำหรับตัวเลือกที่เป็นไปได้ให้ดูที่: https://github.com/websockets/ws/blob/master/doc/ws.md
keepalive : 60 วินาทีตั้งค่าเป็น 0 เพื่อปิดการใช้งาน
reschedulePings : ข้อความใหม่ PING หลังจากส่งแพ็กเก็ต (ค่าเริ่มต้น true )
clientId : 'mqttjs_' + Math.random().toString(16).substr(2, 8)
protocolId : 'MQTT'
protocolVersion : 4
clean : true ตั้งค่าเป็นเท็จเพื่อรับข้อความ QOS 1 และ 2 ในขณะที่ออฟไลน์
reconnectPeriod : 1000 มิลลิวินาทีช่วงเวลาระหว่างการเชื่อมต่อสองครั้ง ปิดใช้งานการเชื่อมต่ออัตโนมัติโดยการตั้งค่าเป็น 0
reconnectOnConnackError : false ไม่ว่าจะเชื่อมต่ออีกครั้งหากได้รับการเชื่อมต่อพร้อมกับข้อผิดพลาด
connectTimeout : 30 * 1000 มิลลิวินาทีเวลารอก่อนที่จะได้รับ connack
username : ชื่อผู้ใช้ที่นายหน้าของคุณต้องการถ้ามี
password : รหัสผ่านที่นายหน้าของคุณต้องการถ้ามี
incomingStore : ร้านค้าสำหรับแพ็คเก็ตที่เข้ามา
outgoingStore : ร้านค้าสำหรับแพ็คเก็ตขาออก
queueQoSZero : หากการเชื่อมต่อเสียข้อความ QOS Zero ขาออกของคิว (ค่าเริ่มต้น true )
customHandleAcks : MQTT 5 คุณสมบัติของการจัดการแบบกำหนดเอง Puback และ PubRec Packets การโทรกลับ:
customHandleAcks: function ( topic , message , packet , done ) { /*some logic with calling done(error, reasonCode)*/ } autoUseTopicAlias : การเปิดใช้งานนามแฝงหัวข้ออัตโนมัติโดยใช้ฟังก์ชั่น
autoAssignTopicAlias : การเปิดใช้งานหัวข้อ AUTION ALIAS กำหนดฟังก์ชั่นการทำงาน
properties : คุณสมบัติ MQTT 5.0 object ที่รองรับคุณสมบัติต่อไปนี้:
sessionExpiryInterval : เป็นตัวแทนของช่วงเวลาการหมดอายุใน number วินาทีreceiveMaximum : แสดง number ค่าสูงสุดที่ได้รับmaximumPacketSize : แสดงขนาดแพ็คเก็ตสูงสุดที่ลูกค้ายินดีรับ numbertopicAliasMaximum : แสดงถึงค่านามแฝงของหัวข้อค่าสูงสุดหมายถึงค่าสูงสุดที่ไคลเอนต์จะยอมรับเป็นนามแฝงหัวข้อที่ส่งโดย number เซิร์ฟเวอร์requestResponseInformation : ไคลเอนต์ใช้ค่านี้เพื่อขอให้เซิร์ฟเวอร์ส่งคืนข้อมูลการตอบกลับใน boolean ConnackrequestProblemInformation : ไคลเอนต์ใช้ค่านี้เพื่อระบุว่าสตริงเหตุผลหรือคุณสมบัติของผู้ใช้จะถูกส่งในกรณีของความล้มเหลว boolean หรือไม่userProperties : คุณสมบัติผู้ใช้ได้รับอนุญาตให้ปรากฏหลายครั้งเพื่อแสดงชื่อหลายชื่อ object ค่าคู่authenticationMethod : ชื่อของวิธีการตรวจสอบความถูกต้องที่ใช้สำหรับ string การตรวจสอบความถูกต้องแบบขยายauthenticationData : ข้อมูลไบนารีที่มีข้อมูลการตรวจสอบความถูกต้อง binary authPacket : การตั้งค่าสำหรับ object Auth Packet
will : ข้อความที่จะส่งโดยนายหน้าโดยอัตโนมัติเมื่อไคลเอ็นต์ตัดการเชื่อมต่อไม่ดี รูปแบบคือ:
topic : หัวข้อที่จะเผยแพร่payload : ข้อความที่จะเผยแพร่qos : QOSretain : ธงรักษาproperties : คุณสมบัติของ Will โดย MQTT 5.0:willDelayInterval : แสดงถึงช่วงเวลาการหน่วงเวลาใน number วินาทีpayloadFormatIndicator : ข้อความจะเป็นข้อมูลอักขระที่เข้ารหัส UTF-8 หรือไม่ booleanmessageExpiryInterval : ค่าคืออายุการใช้งานของข้อความ WILL ในไม่กี่วินาทีและถูกส่งเป็นช่วงเวลาที่เผยแพร่เมื่อเซิร์ฟเวอร์เผยแพร่ number ข้อความ WILLcontentType : อธิบายเนื้อหาของ string ข้อความ WillresponseTopic : สตริงที่ใช้เป็นชื่อหัวข้อสำหรับ string ข้อความตอบกลับcorrelationData : ข้อมูลสหสัมพันธ์ถูกใช้โดยผู้ส่งข้อความร้องขอเพื่อระบุว่าคำขอใดที่ข้อความตอบกลับเป็นอย่างไรเมื่อได้รับ binaryuserProperties : คุณสมบัติผู้ใช้ได้รับอนุญาตให้ปรากฏหลายครั้งเพื่อแสดงหลายชื่อชื่อ object ค่าคู่ transformWsUrl : ตัวเลือก (url, options, client) => url สำหรับโปรโตคอล WS/WSS เท่านั้น สามารถใช้เพื่อใช้ URL ที่ลงนามซึ่งเมื่อทำการเชื่อมต่อใหม่อาจหมดอายุแล้ว
createWebsocket : url, websocketSubProtocols, options) => Websocket สำหรับโปรโตคอล WS/WSS เท่านั้น สามารถใช้เพื่อใช้งาน subprotocol หรือการใช้งาน WebSocket ที่กำหนดเองหรือการใช้งาน
resubscribe : หากการเชื่อมต่อเสียและเชื่อมต่ออีกครั้งหัวข้อที่สมัครสมาชิกจะถูกสมัครโดยอัตโนมัติอีกครั้ง (ค่าเริ่มต้น true )
messageIdProvider : ผู้ให้บริการ MessageId ที่กำหนดเอง เมื่อมีการตั้งค่า new UniqueMessageIdProvider() จะมีการจัดเตรียมข้อความที่ไม่ขัดแย้ง
log : ฟังก์ชั่นบันทึกที่กำหนดเอง เริ่มต้นใช้แพ็คเกจการดีบัก
manualConnect : ป้องกันตัวสร้างให้เรียก connect ในกรณีนี้หลังจาก mqtt.connect เรียกว่าคุณควรโทรหา client.connect ด้วยตนเอง
timerVariant : ค่าเริ่มต้นเป็น auto ซึ่งพยายามกำหนดตัวจับเวลาใดที่เหมาะสมที่สุดสำหรับสภาพแวดล้อมของคุณหากคุณมีปัญหาการตรวจจับคุณสามารถตั้งค่าเป็น worker หรือ native หากไม่มีอะไรเหมาะกับคุณคุณสามารถผ่านวัตถุตัวจับเวลาที่มีคุณสมบัติที่กำหนดและล้าง:
timerVariant: {
set : ( func , timer ) => setInterval ( func , timer ) ,
clear : ( id ) => clearInterval ( id )
} forceNativeWebSocket : ตั้งค่าเป็นจริงหากคุณมีปัญหาการตรวจจับ (เช่น ws does not work in the browser ) เพื่อบังคับให้ใช้ WebSocket ดั้งเดิม เป็นสิ่งสำคัญที่จะต้องทราบว่าหากตั้งค่าเป็นจริงสำหรับไคลเอนต์แรกที่สร้างขึ้นลูกค้าทั้งหมดจะใช้ WebSocket ดั้งเดิม และในทางกลับกันหากไม่ได้ตั้งค่าหรือตั้งค่าเป็นเท็จทั้งหมดจะใช้ผลการตรวจจับ
unixSocket : หากคุณต้องการเชื่อมต่อกับซ็อกเก็ต Unix ให้ตั้งค่าเป็นจริง
ในกรณีที่จำเป็นต้องใช้ MQTTS (MQTT Over TLS) วัตถุ options จะถูกส่งผ่านไปยัง tls.connect() หากใช้ ใบรับรองที่ลงนามด้วยตนเอง ให้ตั้งค่า rejectUnauthorized: false อย่างไรก็ตามจงระมัดระวังเพราะสิ่งนี้ทำให้คุณมีศักยภาพในการโจมตีกลางและไม่แนะนำให้ผลิต
สำหรับผู้ที่สนับสนุนโปรโตคอล TLS หลายตัวในพอร์ตเดียวเช่น MQTTS และ MQTT ผ่าน WSS ใช้ตัวเลือก ALPNProtocols สิ่งนี้ช่วยให้คุณกำหนดโปรโตคอลการเจรจาต่อรองของ Application Layer Protocol (ALPN) คุณสามารถตั้งค่า ALPNProtocols เป็นอาร์เรย์สตริงบัฟเฟอร์หรือ UINT8ARRAY ตามการตั้งค่าของคุณ
หากคุณกำลังเชื่อมต่อกับโบรกเกอร์ที่รองรับเฉพาะ MQTT 3.1 (ไม่ใช่ 3.1.1 ตามมาตรฐาน) คุณควรผ่านตัวเลือกเพิ่มเติมเหล่านี้:
{
protocolId : 'MQIsdp' ,
protocolVersion : 3
}สิ่งนี้ได้รับการยืนยันใน RabbitMQ 3.2.4 และบน Mosquitto <1.3 Mosquitto เวอร์ชัน 1.3 และ 1.4 ทำงานได้ดีโดยไม่มีสิ่งเหล่านั้น
'connect' function (connack) {}
ปล่อยออกมาจากการเชื่อมต่อที่ประสบความสำเร็จ (อีกครั้ง) (เช่น connack rc = 0)
connack ได้รับแพ็คเก็ต Connack เมื่อตัวเลือกการเชื่อมต่อ clean เป็น false และเซิร์ฟเวอร์มีเซสชันก่อนหน้าสำหรับตัวเลือกการเชื่อมต่อ clientId จากนั้น connack.sessionPresent flag เป็น true เมื่อเป็นเช่นนั้นคุณอาจพึ่งพาเซสชันที่เก็บไว้และไม่ต้องการส่งคำสั่งสมัครสมาชิกสำหรับลูกค้า 'reconnect' function () {}
ปล่อยออกมาเมื่อการเชื่อมต่อเริ่มต้นใหม่
'close' function () {}
ปล่อยออกมาหลังจากขาดการเชื่อมต่อ
'disconnect' function (packet) {}
ปล่อยออกมาหลังจากได้รับแพ็คเก็ตตัดการเชื่อมต่อจากนายหน้า คุณสมบัติ MQTT 5.0
'offline' function () {}
ปล่อยออกมาเมื่อลูกค้าออฟไลน์
'error' function (error) {}
ปล่อยออกมาเมื่อไคลเอนต์ไม่สามารถเชื่อมต่อได้ (เช่น connack rc! = 0) หรือเมื่อเกิดข้อผิดพลาดในการแยกวิเคราะห์
ข้อผิดพลาด TLS ต่อไปนี้จะถูกปล่อยออกมาเป็นเหตุการณ์ error :
ECONNREFUSEDECONNRESETEADDRINUSEENOTFOUND'end' function () {}
ถูกปล่อยออกมาเมื่อเรียกว่า mqtt.Client#end() หากมีการโทรกลับไปที่ mqtt.Client#end() เหตุการณ์นี้จะถูกปล่อยออกมาเมื่อการโทรกลับส่งคืน
'message' function (topic, message, packet) {}
ปล่อยออกมาเมื่อลูกค้าได้รับแพ็คเก็ตเผยแพร่
topic หัวข้อของแพ็คเก็ตที่ได้รับmessage ของแพ็กเก็ตที่ได้รับpacket ที่ได้รับแพ็คเก็ตตามที่กำหนดไว้ใน MQTT-PACKET 'packetsend' function (packet) {}
ปล่อยออกมาเมื่อลูกค้าส่งแพ็กเก็ตใด ๆ ซึ่งรวมถึง. published () แพ็คเก็ตรวมถึงแพ็กเก็ตที่ใช้โดย MQTT สำหรับการจัดการการสมัครรับข้อมูลและการเชื่อมต่อ
packet ที่ได้รับแพ็คเก็ตตามที่กำหนดไว้ใน MQTT-PACKET 'packetreceive' function (packet) {}
ปล่อยออกมาเมื่อลูกค้าได้รับแพ็กเก็ตใด ๆ ซึ่งรวมถึงแพ็กเก็ตจากหัวข้อที่สมัครรับรวมถึงแพ็กเก็ตที่ใช้โดย MQTT สำหรับการจัดการการสมัครรับข้อมูลและการเชื่อมต่อ
packet ที่ได้รับแพ็คเก็ตตามที่กำหนดไว้ใน MQTT-PACKET โดยเริ่มต้นไคลเอนต์เชื่อมต่อเมื่อมีการเรียกตัวสร้าง เพื่อป้องกันสิ่งนี้คุณสามารถตั้งค่าตัวเลือก manualConnect เป็น true และ CALL client.connect() ด้วยตนเอง
เผยแพร่ข้อความไปยังหัวข้อ
topic คือหัวข้อที่จะเผยแพร่เป็น Stringmessage คือข้อความที่จะเผยแพร่ Buffer หรือ Stringoptions คือตัวเลือกในการเผยแพร่ด้วยรวมถึง:qos , Number , ค่าเริ่มต้น 0retain รักษาธงรักษา Boolean เริ่ม falsedup mark เป็นธงซ้ำ, Boolean , ค่าเริ่ม falseproperties : object คุณสมบัติ MQTT 5.0payloadFormatIndicator : Payload เป็นข้อมูลอักขระที่เข้ารหัส UTF-8 หรือไม่ booleanmessageExpiryInterval : อายุการใช้งานของข้อความแอปพลิเคชันใน number ไม่กี่วินาทีtopicAlias : ค่าที่ใช้ในการระบุหัวข้อแทนการใช้ number ชื่อหัวข้อresponseTopic : สตริงที่ใช้เป็นชื่อหัวข้อสำหรับ string ข้อความตอบกลับcorrelationData : ใช้โดยผู้ส่งข้อความร้องขอเพื่อระบุว่าคำขอใดข้อความตอบกลับสำหรับเมื่อได้รับ binaryuserProperties : คุณสมบัติผู้ใช้ได้รับอนุญาตให้ปรากฏหลายครั้งเพื่อแสดงชื่อหลายชื่อ object ค่าคู่subscriptionIdentifier : แสดงตัวระบุ number การสมัครสมาชิกcontentType : สตริงอธิบายเนื้อหาของ string ข้อความแอปพลิเคชันcbStorePut - function () , ถูกไล่ออกเมื่อข้อความถูกใส่เข้าไปใน outgoingStore ถ้า QOS คือ 1 หรือ 2callback - function (err, packet) , ถูกไล่ออกเมื่อการจัดการ QoS เสร็จสมบูรณ์หรือที่เห็บถัดไปถ้า QOS 0 ข้อผิดพลาดเกิดขึ้นหากไคลเอ็นต์ถูกตัดการเชื่อมต่อ Async publish ส่งคืน Promise<Packet | undefined>
messageIdสมัครรับหัวข้อหรือหัวข้อ
topic คือหัวข้อ String ที่จะสมัครหรือ Array ของหัวข้อที่จะสมัครสมาชิก นอกจากนี้ยังสามารถเป็นวัตถุมันมีคีย์วัตถุชื่อหัวข้อและเป็นค่า qos เช่น {'test1': {qos: 0}, 'test2': {qos: 1}} รองรับ MQTT topic Wildcard อักขระ ( + - สำหรับระดับเดียวและ # - สำหรับหลายระดับ)options คือตัวเลือกในการสมัครสมาชิกรวมถึง:qos QoS, ค่าเริ่มต้น 0nl No Local MQTT 5.0 Flag (หากค่าเป็นจริงข้อความแอปพลิเคชันจะต้องไม่ถูกส่งต่อไปยังการเชื่อมต่อกับ clientID เท่ากับ clientId ของการเชื่อมต่อการเผยแพร่)rap เก็บรักษาไว้เป็น FLAG MQTT 5.0 ที่เผยแพร่ (ถ้าเป็นจริงข้อความแอปพลิเคชันที่ส่งต่อโดยใช้การสมัครสมาชิกนี้ให้เก็บค่าสถานะเก็บรักษาไว้ที่พวกเขาเผยแพร่ด้วยหากเท็จข้อความแอปพลิเคชันที่ส่งต่อโดยใช้การสมัครสมาชิกนี้rh ยังคงจัดการ MQTT 5.0 (ตัวเลือกนี้ระบุว่าข้อความที่เก็บรักษาจะถูกส่งเมื่อมีการสมัครสมาชิก)properties : objectsubscriptionIdentifier : แสดงตัวระบุ number การสมัครสมาชิกuserProperties : คุณสมบัติผู้ใช้ได้รับอนุญาตให้ปรากฏหลายครั้งเพื่อแสดงหลายชื่อชื่อ object ค่าคู่callback - function (err, granted) การโทรกลับยิงบน Suback ที่:err ข้อผิดพลาดในการสมัครสมาชิกหรือข้อผิดพลาดที่เกิดขึ้นเมื่อไคลเอ็นต์ตัดการเชื่อมต่อgranted คืออาร์เรย์ของ {topic, qos} ที่ไหน:topic คือการสมัครรับหัวข้อqos คือระดับ QoS ที่ได้รับอนุญาต Async subscribe ส่งคืน Promise<ISubscriptionGrant[]>
ยกเลิกการสมัครจากหัวข้อหรือหัวข้อ
topic คือหัวข้อ String หรืออาร์เรย์ของหัวข้อที่จะยกเลิกการสมัครจากoptions : ตัวเลือกของการยกเลิกการสมัครproperties : objectuserProperties : คุณสมบัติผู้ใช้ได้รับอนุญาตให้ปรากฏหลายครั้งเพื่อแสดงหลายชื่อชื่อ object ค่าคู่callback - function (err) , ยิงบน Unsuback เกิดข้อผิดพลาดหากไคลเอนต์ตัดการเชื่อมต่อ async unsubscribe ส่งคืน Promise<void>
ปิดลูกค้ายอมรับตัวเลือกต่อไปนี้:
force : การส่งผ่านไปยังความจริงจะปิดลูกค้าทันทีโดยไม่ต้องรอข้อความในเที่ยวบิน พารามิเตอร์นี้เป็นทางเลือกoptions : ตัวเลือกการตัดการเชื่อมต่อreasonCode : ตัดการเชื่อมต่อหมายเลข numberproperties : objectsessionExpiryInterval : เป็นตัวแทนของช่วงเวลาการหมดอายุใน number วินาทีreasonString : เป็นตัวแทนของเหตุผลสำหรับ string ตัดการเชื่อมต่อuserProperties : คุณสมบัติผู้ใช้ได้รับอนุญาตให้ปรากฏหลายครั้งเพื่อแสดงชื่อหลายชื่อ object ค่าคู่serverReference : สตริงที่ไคลเอ็นต์สามารถใช้เพื่อระบุเซิร์ฟเวอร์อื่นเพื่อใช้ stringcallback : จะถูกเรียกเมื่อลูกค้าถูกปิด พารามิเตอร์นี้เป็นทางเลือก async end ส่งคืน Promise<void>
ลบข้อความจาก OutgoingStore การโทรกลับขาออกจะถูกเรียกด้วยข้อผิดพลาด ('ลบข้อความ') หากข้อความถูกลบออก
หลังจากเรียกใช้ฟังก์ชั่นนี้แล้ว MessageID จะถูกปล่อยออกมาและสามารถนำกลับมาใช้ใหม่ได้
mId : MessageId ของข้อความใน OutgoingStoreเชื่อมต่ออีกครั้งโดยใช้ตัวเลือกเดียวกันกับการเชื่อมต่อ ()
จัดการข้อความด้วยการรองรับ backpressure ทีละครั้ง แทนที่ด้วยความประสงค์ แต่ จะโทร callback เสมอ หรือลูกค้าจะแขวน
บูลีน: ตั้งค่าเป็น true หากเชื่อมต่อไคลเอนต์ false เป็นอย่างอื่น
หมายเลข: รับรหัสข้อความสุดท้าย นี่คือข้อความที่ส่งเท่านั้น
บูลีน: ตั้งค่าเป็น true หากไคลเอนต์พยายามเชื่อมต่อกับเซิร์ฟเวอร์อีกครั้ง false เป็นอย่างอื่น
การใช้งานในหน่วยความจำของที่เก็บข้อความ
options คือตัวเลือกร้านค้า:clean : true ข้อความบนเครื่องบินทำความสะอาดเมื่อปิดถูกเรียก (ค่าเริ่ม true ) การใช้งานอื่น ๆ ของ mqtt.Store :
เพิ่มแพ็คเก็ตลงในร้านค้าแพ็คเก็ตเป็นสิ่งที่มีคุณสมบัติ messageId การโทรกลับถูกเรียกเมื่อเก็บแพ็กเก็ตแล้ว
สร้างสตรีมที่มีแพ็กเก็ตทั้งหมดในร้าน
ลบแพ็คเก็ตออกจากร้านค้าแพ็คเก็ตเป็นสิ่งที่มีคุณสมบัติ messageId การโทรกลับถูกเรียกเมื่อแพ็คเก็ตถูกลบออก
ปิดร้าน
สำคัญ
โปรโตคอลเดียวที่รองรับในเบราว์เซอร์คือ MQTT เหนือ WebSockets ดังนั้นคุณต้องใช้ ws:// หรือ wss:// โปรโตคอล
ในขณะที่โมดูล WS ใช้ใน NodeJS แต่ WebSocket จะใช้ในเบราว์เซอร์ สิ่งนี้มีความโปร่งใสสำหรับผู้ใช้ทั้งหมดยกเว้นสิ่งต่อไปนี้:
wsOption ไม่ได้รับการสนับสนุนในเบราว์เซอร์
เบราว์เซอร์ไม่อนุญาตให้จับข้อผิดพลาดของ WebSocket จำนวนมากด้วยเหตุผลด้านความปลอดภัยเป็น:
การเข้าถึงข้อมูลนี้อาจทำให้หน้าเว็บที่เป็นอันตรายได้รับข้อมูลเกี่ยวกับเครือข่ายของคุณดังนั้นพวกเขาจึงต้องมีเบราว์เซอร์รายงานข้อผิดพลาดเวลาการเชื่อมต่อทั้งหมดในวิธีที่แยกไม่ออก
ดังนั้นการฟัง client.on('error') อาจไม่ได้รับข้อผิดพลาดทั้งหมดที่คุณจะได้รับใน Nodejs Env
MQTT.JS ถูกรวมเข้าด้วยกันโดยใช้ ESBUILD มันถูกทดสอบว่าทำงานกับ Bundlers ทั้งหมดเช่น Webpack, Vite และ React
คุณสามารถค้นหารุ่น MQTT ทั้งหมดในโฟลเดอร์ dist :
mqtt.js - รูปแบบ iife ไม่ได้ลดลงmqtt.min.js - รูปแบบ iife, minifiedmqtt.esm.js - รูปแบบ ESM minifiedเริ่มต้นจาก mqtt.js> 5.2.0 คุณสามารถนำเข้า MQTT ในรหัสของคุณเช่นนี้:
import mqtt from 'mqtt'สิ่งนี้จะได้รับการจัดการโดย Bundler ของคุณโดยอัตโนมัติ
มิฉะนั้นคุณสามารถเลือกที่จะใช้ชุดข้อมูลเฉพาะเช่น:
import * as mqtt from 'mqtt/dist/mqtt'
import * as mqtt from 'mqtt/dist/mqtt.min'
import mqtt from 'mqtt/dist/mqtt.esm'MQTT.JS Bundle มีให้บริการผ่าน http://unpkg.com โดยเฉพาะที่ https://unpkg.com/mqtt/dist/mqtt.min.js ดู http://unpkg.com สำหรับเอกสารฉบับเต็มในช่วงเวอร์ชัน
นี่คือวิธีการทำงานของ QoS:
เกี่ยวกับการใช้ข้อมูลอย่างชัดเจน qos 2> qos 1> qos 0 หากเป็นข้อกังวลสำหรับคุณ
เริ่มต้นจาก V5 โครงการนี้เขียนด้วย TypeScript และคำจำกัดความประเภทจะรวมอยู่ในแพ็คเกจ
ตัวอย่าง:
import { connect } from "mqtt"
const client = connect ( 'mqtt://test.mosquitto.org' ) รองรับโปรแกรม WeChat Mini ใช้โปรโตคอล wxs ดูเอกสาร WeChat
import 'abortcontroller-polyfill/dist/abortcontroller-polyfill-only' // import before mqtt.
import 'esbuild-plugin-polyfill-node/polyfills/navigator'
const mqtt = require ( "mqtt" ) ;
const client = mqtt . connect ( "wxs://test.mosquitto.org" , {
timerVariant : 'native' // more info ref issue: #1797
} ) ; สนับสนุนโปรแกรม Ali Mini ใช้โปรโตคอล alis ดูเอกสาร Alipay
const mqtt = require ( "mqtt" ) ;
const client = mqtt . connect ( "alis://test.mosquitto.org" ) ; MQTT.JS เป็น โครงการโอเพนซอร์สแบบเปิด ซึ่งหมายความว่า:
บุคคลที่มีส่วนร่วมอย่างมีนัยสำคัญและมีคุณค่าจะได้รับมอบหมายให้เข้าถึงโครงการเพื่อมีส่วนร่วมตามที่เห็นสมควร โครงการนี้เป็นเหมือนวิกิเปิดมากกว่าโครงการโอเพนซอร์สที่ได้รับการปกป้องมาตรฐาน
ดูไฟล์ที่มีส่วนร่วมสำหรับรายละเอียดเพิ่มเติม
MQTT.JS เป็นไปได้เท่านั้นเนื่องจากงานที่ยอดเยี่ยมของผู้มีส่วนร่วมต่อไปนี้:
| ชื่อ | คนอื่น ๆ | |
|---|---|---|
| Adam Rudd | GitHub/Adamvr | Twitter/@adam_vr |
| Matteo Collina | GitHub/McOllina | Twitter/@matteocollina |
| Maxime Agor | GitHub/4rzael | Twitter/@4rzael |
| Siarhei Buntsevich | GitHub/Scarry1992 | |
| Daniel Lando | GitHub/Robertslando |
หากคุณต้องการสนับสนุน mqtt.js โปรดพิจารณาสนับสนุนผู้แต่งและผู้ดูแลที่ใช้งานอยู่:
มิกซ์