MQTT Client實(shí)現(xiàn)消息推送功能的方法詳解
一、MQTT
二、MQTT C Client實(shí)戰(zhàn)
了解更多可以閱讀《MQTT C Client for Posix and Windows》一文,下面根據(jù)官網(wǎng)資料,摘錄了幾個(gè)C語(yǔ)言實(shí)現(xiàn)MQTT的小DEMO。
MQTT使用起來(lái)也十分容易,基本上就那四五個(gè)函數(shù):MQTTClient_create(創(chuàng)建客戶端)、MQTTClient_connect(連接服務(wù)端)、MQTTClient_publishMessage(客戶端->服務(wù)端發(fā)送消息)、MQTTClient_subscribe(客戶端訂閱某個(gè)主題)等等。其中,很多異步回調(diào)函數(shù),需要自己去實(shí)現(xiàn),如,
MQTTAsync_setCallbacks(mqtt->_client, mqtt->_client, connlost, msgarrvd, NULL);
MQTTAsync_setCallbacks中,
- connlost函數(shù)指針,是當(dāng)MQTT意外斷開鏈接時(shí)會(huì)回調(diào)的函數(shù),由自己實(shí)現(xiàn);
- msgarrvd函數(shù)指針,是當(dāng)服務(wù)器有消息推送回來(lái)時(shí),客戶端在此處接受服務(wù)端消息內(nèi)容。
另外,就是一些函數(shù)執(zhí)行是否成功的回調(diào)函數(shù),C語(yǔ)言封裝回調(diào)之后,就是這么寫法,看起來(lái)有些變扭。有興趣的可以看《淺談C/C++回調(diào)函數(shù)(Callback)& 函數(shù)指針》文章,再了解以下回調(diào)函數(shù)。
mqtt->_conn_opts.onSuccess = onConnect; mqtt->_conn_opts.onFailure = onConnectFailure;
最后,不得不說的就是,MQTT有些發(fā)送或者是訂閱的內(nèi)容時(shí)(某些函數(shù)中),在編程最好將參數(shù)中傳進(jìn)來(lái)的值在內(nèi)存中拷貝一份再操作,筆者當(dāng)時(shí)開發(fā)時(shí),就是因?yàn)檫@樣的問題,折騰了較長(zhǎng)時(shí)間,后來(lái)在wireshark中發(fā)現(xiàn)數(shù)據(jù)包中根本沒有內(nèi)容,才知道是由于函數(shù)參數(shù)是指針形式,直接在異步中使用可能會(huì)發(fā)生一些未知的錯(cuò)誤。
參考文檔:
https://yq.aliyun.com/articles/521549?spm=5176.10695662.1996646101.searchclickresult.39f82372vfl8ed
三、MQTT client for Node.js
Installation
#You can install it as dependency with npm. $?#?save?into?package.json?dependencies?with?-S? $?npm?install?aliyun-iot-mqtt?-S
Usage
Aliyun IoT Hub mqtt client with authrozied by productKey & deviceName & deviceSecret.
GET Data
const?Mqtt?=?require('aliyun-iot-mqtt'); const?client?=?Mqtt.getAliyunIotMqttClient({ ????productKey:?"", ????deviceName:?"", ????deviceSecret:?"", ????regionId:?"cn-shanghai", ????keepalive:120?//?mqtt?options }); client.on('connect',?function()?{ ????console.log("connect") }) client.end(function?(){ ????console.log("end") })
TLS mqtts
var?trustedCA?=?fs.readFileSync(path.join(__dirname,?'/aliyun_iot_root.cer')) var?options?=?{ ????productKey:?"", ????deviceName:?"", ????deviceSecret:?"", ????regionId:?"cn-shanghai", ????protocol:?'mqtts', ????ca:?trustedCA, ????keepalive:120?//?mqtt?options };
Subscribe Topic
client.subscribe(topic)
Publish Message
client.publish(topic,?'Hello?mqtt') client.publish(topic,?'Hello?mqtt',?{?qos:?1?})
Receive Message
client.on('message',?function(topic,?message)?{ ????console.log(topic+","?+?message.toString()) })
補(bǔ)充:nodejs發(fā)送訂閱mqtt完整示例:
var mqtt = require('mqtt'); var opt={ port:1883 } var client=mqtt.connect('tcp://10.66.28.51',opt); client.on('connect',function(){ console.log("mqtt已連接"); // client.publish('wks/cim/ASPY/#','需要發(fā)送的信息'); client.subscribe('wks/cim/ASPY/#') }) client.on('message',function(topic,msg){ console.log('收到'+topic+"訊息:"+msg.toString()); })
參考文檔:
https://www.npmjs.com/package/aliyun-iot-mqtt
- 在Node.js下運(yùn)用MQTT協(xié)議實(shí)現(xiàn)即時(shí)通訊及離線推送的方法
- Django連接MQTT的示例代碼
- vue3+vite2+mqtt連接遇到的坑及解決
- vue3使用mqtt的示例代碼
- MQTT.js 入門使用教程
- 詳解JS HTML Web端使用MQTT通訊測(cè)試
- VUE3+mqtt封裝解決多頁(yè)面使用需重復(fù)連接等問題(附實(shí)例)
- 解決spring-integration-mqtt頻繁報(bào)Lost connection錯(cuò)誤問題
- JS?連接MQTT的使用方法
- 使用java?實(shí)現(xiàn)mqtt兩種常用方式
- Android MQTT與WebSocket協(xié)議詳細(xì)講解
相關(guān)文章
nodejs不用electron實(shí)現(xiàn)打開文件資源管理器并選擇文件
最近在開發(fā)一些小腳本,用 nodejs 實(shí)現(xiàn),其中很多功能需要選擇一個(gè)/多個(gè)文件,或者是選擇一個(gè)文件夾,這種情況下網(wǎng)上給出的解決方案都是 electron,但是我一個(gè)小腳本用 electron 屬實(shí)有點(diǎn)夸張了,后來(lái)轉(zhuǎn)念一想可以通過 powershell 來(lái)實(shí)現(xiàn)類似的功能,需要的朋友可以參考下2024-01-01Linux系統(tǒng)中利用node.js提取Word(doc/docx)及PDF文本的內(nèi)容
這篇文章主要給大家介紹了關(guān)于Linux系統(tǒng)中利用node.js提取Word(doc/docx)及PDF文本的內(nèi)容,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友們下面跟著小編來(lái)一起看看吧。2017-06-06nodejs文件操作模塊FS(File System)常用函數(shù)簡(jiǎn)明總結(jié)
這篇文章主要介紹了nodejs文件操作模塊FS(File System)常用函數(shù)簡(jiǎn)明總結(jié),對(duì)FS模塊的大部份異步函數(shù)做了介紹,而且用中文注釋,這下用起來(lái)方便了,需要的朋友可以參考下2014-06-06Node.js安裝詳細(xì)步驟教程(Windows版)詳解
這篇文章主要介紹了Node.js安裝詳細(xì)步驟教程(Windows版),本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09在Node.js中處理Promise中錯(cuò)誤的示例代碼
在現(xiàn)代JavaScript開發(fā)中,尤其在Node.js環(huán)境中,Promise已成為處理異步操作的重要方式,然而,Promise的錯(cuò)誤處理卻常常讓開發(fā)者感到困惑,在這篇文章中,我們將深入探討如何在Node.js中處理Promise中的錯(cuò)誤,提供多個(gè)示例代碼,以便于理解和實(shí)踐,需要的朋友可以參考下2024-09-09手動(dòng)下載Chrome并解決puppeteer無(wú)法使用問題
本篇文章主要介紹了手動(dòng)下載Chrome并解決puppeteer無(wú)法使用問題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2018-11-11