日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ThingsBoard接入阿里ALink协议的网关设备探讨

發(fā)布時間:2023/12/20 编程问答 72 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ThingsBoard接入阿里ALink协议的网关设备探讨 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

  • 前言
  • 整體規(guī)劃
  • 調(diào)用流程
  • 開始
  • 總結(jié)

前言

市面多數(shù)設(shè)備支持阿里云物聯(lián)網(wǎng)平臺的ALink協(xié)議,假設(shè)這類網(wǎng)關(guān)無法更改上下行協(xié)議,如何接入tb平臺?
文章是個人調(diào)研過程中的理解和分享,順便通過偏實戰(zhàn)的方式,更全面的實踐tb網(wǎng)關(guān)的mqtt連接器使用。看官網(wǎng)介紹的時候覺得很簡單,真正用起來,細節(jié)和文檔缺失的介紹還是很多的(比如官網(wǎng)只介紹了使用tb網(wǎng)關(guān)時,設(shè)備如何訂閱共享屬性更新,卻沒有介紹設(shè)備還可以主動請求共享屬性)。
由于thingsboard平臺和阿里物聯(lián)網(wǎng)平臺對物聯(lián)網(wǎng)中的相關(guān)定義及功能設(shè)計不一致。以個人淺顯理解,使用下面的對應(yīng)關(guān)系做接入。


ALink協(xié)議文檔
tb-gateway mqtt連接器文檔


ALink協(xié)議ThingsBoard協(xié)議 [tb-gateway]
設(shè)備身份注冊自動注冊
管理拓撲關(guān)系不需要
子設(shè)備上下線連接/斷開連接請求
設(shè)備只讀屬性客戶端屬性/遙測
設(shè)備讀寫屬性上行客戶端屬性 下行RPC
設(shè)備上報事件遙測+規(guī)則鏈/客戶端屬性 ?
設(shè)備服務(wù)(異步同步)服務(wù)端RPC(oneway/twoway)
設(shè)備期望屬性值待完善
設(shè)備禁用/啟用/刪除上行客戶端屬性(屬性名method)下行RPC
設(shè)備標簽上行客戶端屬性 下行RPC
ack遙測+規(guī)則鏈
TSL模板共享屬性 待完善
OTA待完善
遠程配置共享屬性 待完善
設(shè)備日志上報待完善
設(shè)備網(wǎng)絡(luò)狀態(tài)待完善
設(shè)備分發(fā)待完善
設(shè)備任務(wù)待完善

整體規(guī)劃

  • ALink網(wǎng)關(guān)及網(wǎng)關(guān)子設(shè)備 用js模擬(硬件沒到,手動調(diào)研吧)
  • 需要依賴 npm install mqtt

  • 使用tb-gateway接入ALink網(wǎng)關(guān)
  • tb web頁面添加ALink網(wǎng)關(guān)
  • 調(diào)用流程

    數(shù)據(jù)上傳:(上行)
    ALink網(wǎng)關(guān)js 發(fā)送mqtt到EMQX,tb-gateway訂閱EMQX相關(guān)主題,并將數(shù)據(jù)格式及上下行協(xié)議轉(zhuǎn)為tb格式 發(fā)送到tb
    數(shù)據(jù)下發(fā):(下行)
    tb服務(wù)端下發(fā)指定 到 tb-gateway,tb-gateway轉(zhuǎn)換主題和數(shù)據(jù)格式 發(fā)送到 EMQX,js訂閱EMQX收到消息
    下行如果需要回復:js 收到消息后發(fā)送數(shù)據(jù)到EMQX,tb-gateway訂閱回復主題 并轉(zhuǎn)換消息及上行協(xié)議格式 發(fā)送數(shù)據(jù)到tb

    開始

  • tb web添加設(shè)備 阿里云ALink協(xié)議網(wǎng)關(guān) 并勾選 是網(wǎng)關(guān)
  • 點擊 復制訪問令牌將令牌粘貼到 tb-gateway的tb_gateway.yaml中,并設(shè)置tb的地址和端口以及打開mqtt連接器
  • 大體看下js中規(guī)劃的功能,接下來根據(jù)各個功能配置mqtt.json文件
  • //設(shè)備讀寫屬性 var power = 'on'; var publish_telemetry_interval = 10; var publish_label_interval = 30; //設(shè)備只讀屬性 var temperature; //設(shè)備標簽 var model = 'AHT15'//型號 var vendor = 'jin_shi_da';//廠商 var area = 'beijing'; //設(shè)備禁用/啟用/刪除 var status = 'enable';/* topic定義 */ //下行 alink屬性 var set_attributes_topic = '/sys/' + productKey + '/' + deviceName + '/thing/service/property/set'; //下行 alink屬性響應(yīng) var set_attributes_topic_reply = '/sys/' + productKey + '/' + deviceName + '/thing/service/property/set_reply'; //上行 alink屬性 var property_post_topic = '/sys/' + productKey + '/' + deviceName + '/thing/event/property/post'; //上行 子設(shè)備上線 var device_login_topic = '/ext/session/' + productKey + '/' + deviceName + '/combine/login'; //上行 子設(shè)備下線 var device_logout_topic = '/ext/session/' + productKey + '/' + deviceName + '/combine/logout'; //下行 子設(shè)備禁用/啟用/刪除 var device_disable_topic = '/sys/' + productKey + '/' + deviceName + '/thing/disable'; var device_enable_topic = '/sys/' + productKey + '/' + deviceName + '/thing/enable'; var device_delete_topic = '/sys/' + productKey + '/' + deviceName + '/thing/delete'; //上行 設(shè)備標簽上報 var label_upload_topic = '/sys/' + productKey + '/' + deviceName + '/thing/deviceinfo/update'; //下行 設(shè)備標簽上報 var label_upload_reply_topic = '/sys/' + productKey + '/' + deviceName + '/thing/deviceinfo/update_reply'; //上行 刪除標簽信息 var label_delete_topic = '/sys/' + productKey + '/' + deviceName + '/thing/deviceinfo/delete'; //下行 刪除標簽信息 var label_delete_reply_topic = '/sys/' + productKey + '/' + deviceName + '/thing/deviceinfo/delete_reply'; //下行 服務(wù)調(diào)用 var service_topic = '/sys/' + productKey + '/' + deviceName + '/thing/service/+'; //上行 服務(wù)調(diào)用響應(yīng) var service_reply_topic = '/sys/' + productKey + '/' + deviceName + '/thing/service/+' + '_reply';
  • 配置mqtt.json [json文件不能注釋,下面這個文件加了注釋,文章最后貼出無注釋的mqtt.json文件]
  • 模擬演示一個溫度傳感器經(jīng)過ALink網(wǎng)關(guān)上傳數(shù)據(jù):
    有temperature屬性作為遙測,通過ALink上行屬性topic上傳。
    power屬性作為客戶端屬性,通過ALink上行屬性topic上傳。tb通過服務(wù)改變power的值,控制溫度傳感器的工作與否。
    publish_telemetry_interval屬性作為客戶端屬性,通過ALink上行屬性topic上傳。下行屬性控制ALink上行屬性topic上傳間隔。
    model型號vendor廠商area地址,作為客戶端屬性,通過ALink上行標簽topic上傳。
    status設(shè)備狀態(tài),作為客戶端屬性,通過ALink下行 子設(shè)備禁用/啟用/刪除topic控制。
    子設(shè)備上線、子設(shè)備下線
    設(shè)置屬性
    調(diào)用服務(wù)
    下行響應(yīng)

    {"broker": {"name": "Default Local Broker", //外部mqtt服務(wù)器名稱 這里使用主流 EMQX Broker"host": "192.168.7.190", //外部mqtt服務(wù)器地址"port": 1883, //外部mqtt服務(wù)器端口"clientId": "ThingsBoard_gateway", //客戶端ID"security": {"type": "basic","username": "admin", //emqx客戶端賬號"password": "admin" //emqx客戶端密碼, 沒有可以刪掉這一項}},"mapping": [//這個對象將ALink網(wǎng)關(guān)的上行屬性,根據(jù)屬性特征轉(zhuǎn)換為tb的客戶端屬性和遙測消息.//ALink屬性上行協(xié)議params中沒有deviceName、productKey倆字段,由于目前沒有時間研究deviceNameTopicExpression,就簡單使用deviceNameJsonExpression//所以在屬性上傳時params加了deviceName、productKey倆個字段。應(yīng)該從topic獲取就完美了,后面有時間補上{ "topicFilter": "/sys/+/+/thing/event/property/post","subscriptionQos": 0, //qos可以不設(shè)置,默認1,只支持 0,1"converter": {"type": "json","deviceNameJsonExpression": "${params.deviceName}","deviceTypeJsonExpression": "${params.productKey}","timeout": 60000,"attributes": [{"type": "string","key": "power","value": "${params.power.value}"},{"type": "int","key": "publish_telemetry_interval","value": "${params.publish_telemetry_interval.value}"},{"type": "int","key": "publish_label_interval","value": "${params.publish_telemetry_interval.value}"},{"type": "string","key": "status","value": "${params.status.value}"}],"timeseries": [{"type": "float","key": "temperature","value": "${params.temperature.value}"}]}},{"topicFilter": "/sys/+/+/thing/deviceinfo/update","subscriptionQos": 0,"converter": {"type": "json","deviceNameJsonExpression": "${sys.deviceName}","deviceTypeJsonExpression": "${sys.productKey}","timeout": 60000,"attributes": [{"type": "string","key": "model","value": "${params[0].attrValue}"},{"type": "string","key": "vendor","value": "${params[1].attrValue}"},{"type": "string","key": "area","value": "${params[2].attrValue}"}]}}],"connectRequests": [{"topicFilter": "/ext/session/+/+/combine/login","deviceNameJsonExpression": "${params.deviceName}","deviceTypeJsonExpression": "${params.productKey}"}],"disconnectRequests": [{"topicFilter": "/ext/session/+/+/combine/logout","deviceNameJsonExpression": "${params.deviceName}","deviceTypeJsonExpression": "${params.productKey}"}],"attributeUpdates": [],"attributeRequests": [],"serverSideRpc": [{"deviceNameFilter": ".*","methodFilter": "setStatus","requestTopicExpression": "/sys/${deviceType}/${deviceName}/thing/${params}","responseTopicExpression": "/sys/${deviceType}/${deviceName}/thing/${params}_reply","responseTimeout": 10000,"valueExpression": "{\"id\":\"123\",\"version\":\"1.0\",\"params\":{},\"method\":\"thing.${params}\"}"},{"deviceNameFilter": ".*","methodFilter": "setProperty","requestTopicExpression": "/sys/${deviceType}/${deviceName}/thing/service/property/set","responseTopicExpression": "/sys/${deviceType}/${deviceName}/thing/service/property/set_reply","responseTimeout": 10000,"valueExpression": "{\"id\":\"123\",\"version\":\"1.0\",\"params\":${params},\"method\":\"thing.service.property.set\"}"},{"deviceNameFilter": ".*","methodFilter": "replyLabelUpdate","requestTopicExpression": "/sys/${deviceType}/${deviceName}/thing/deviceinfo/update_reply","valueExpression": "{\"id\":\"123\",\"code\":200,\"data\":{}}"},{"deviceNameFilter": ".*","methodFilter": "service.*","requestTopicExpression": "/sys/${deviceType}/${deviceName}/thing/service/${methodName}","valueExpression": "{\"id\":\"123\",\"version\":\"1.0\",\"params\":${params},\"method\":\"thing.service.${methodName}\"}"}] }
  • 完整js
  • var mqtt = require('mqtt'); var client = mqtt.connect('mqtt://localhost:1884', {username: 'admin',password: 'admin' }); // 設(shè)備預(yù)置參數(shù) var productKey = "a1CpLSEvPUk"; var deviceName = "RoomTempSensor"; var version = "1.0"; var clientId = 'asdasdasdaedqwe123123123123'; //設(shè)備讀寫屬性 var power = 'on'; var publish_telemetry_interval = 10; var publish_label_interval = 30; //設(shè)備只讀屬性 var temperature; //設(shè)備標簽 var model = 'AHT15'//型號 var vendor = 'jin_shi_da';//廠商 var area = 'beijing'; // var model = 'LM35DZ'; // var model = 'LM35'; //設(shè)備禁用/啟用/刪除 var status = 'enable';/* topic定義 */ //下行 alink屬性 var set_attributes_topic = '/sys/' + productKey + '/' + deviceName + '/thing/service/property/set'; //下行 alink屬性響應(yīng) var set_attributes_topic_reply = '/sys/' + productKey + '/' + deviceName + '/thing/service/property/set_reply'; //上行 alink屬性 var property_post_topic = '/sys/' + productKey + '/' + deviceName + '/thing/event/property/post'; //上行 子設(shè)備上線 var device_login_topic = '/ext/session/' + productKey + '/' + deviceName + '/combine/login'; //上行 子設(shè)備下線 var device_logout_topic = '/ext/session/' + productKey + '/' + deviceName + '/combine/logout'; //下行 子設(shè)備禁用/啟用/刪除 var device_disable_topic = '/sys/' + productKey + '/' + deviceName + '/thing/disable'; var device_enable_topic = '/sys/' + productKey + '/' + deviceName + '/thing/enable'; var device_delete_topic = '/sys/' + productKey + '/' + deviceName + '/thing/delete'; //上行 設(shè)備標簽上報 var label_upload_topic = '/sys/' + productKey + '/' + deviceName + '/thing/deviceinfo/update'; //下行 設(shè)備標簽上報 var label_upload_reply_topic = '/sys/' + productKey + '/' + deviceName + '/thing/deviceinfo/update_reply'; //上行 刪除標簽信息 var label_delete_topic = '/sys/' + productKey + '/' + deviceName + '/thing/deviceinfo/delete'; //下行 刪除標簽信息 var label_delete_reply_topic = '/sys/' + productKey + '/' + deviceName + '/thing/deviceinfo/delete_reply'; //下行 服務(wù)調(diào)用 var service_topic = '/sys/' + productKey + '/' + deviceName + '/thing/service/+'; //上行 服務(wù)調(diào)用響應(yīng) var service_reply_topic = '/sys/' + productKey + '/' + deviceName + '/thing/service/+' + '_reply';//程序變量 var id = 0; var pre_interval_property; var pre_interval_label; var success = JSON.stringify({"id": "123", "code": 200, "data": {}}) //設(shè)備連接回調(diào) client.on('connect', function () {console.log('connected');connect();client.subscribe(set_attributes_topic)client.subscribe(device_disable_topic)client.subscribe(device_enable_topic)client.subscribe(device_delete_topic)client.subscribe(service_topic)pre_interval_property = setPublishPropertyInterval(null, publish_telemetry_interval * 1000);pre_interval_label = setPublishLabelInterval(null, publish_label_interval * 1000); }); //收到消息回調(diào) client.on('message', function (topic, message) {console.log('on message:')console.log(topic);console.log(message.toString());console.log('--------------------------------------')let data = JSON.parse(message);//下行 服務(wù)調(diào)用正則驗證var service_topic_regex = new RegExp(service_topic.replace("+", "[^/]+"))switch (topic) {case set_attributes_topic:if (data.params.hasOwnProperty('publish_telemetry_interval')) {publish_telemetry_interval = data.params.publish_telemetry_interval;pre_interval_property = setPublishPropertyInterval(pre_interval_property, data.params.publish_telemetry_interval * 1000);}if (data.params.hasOwnProperty('publish_label_interval')) {publish_label_interval = data.params.publish_label_interval;pre_interval_label = setPublishPropertyInterval(pre_interval_label, data.params.publish_label_interval * 1000);}if (data.params.hasOwnProperty('power')) {power = data.params.power;}//響應(yīng)設(shè)置設(shè)備屬性publish(set_attributes_topic_reply, success)break;case device_disable_topic:case device_enable_topic:case device_delete_topic://模擬設(shè)備禁用啟用刪除if (data.hasOwnProperty('method')) {status = data.method.split('.')[1];//響應(yīng)設(shè)備禁用啟用刪除publish('/sys/' + productKey + '/' + deviceName + '/thing/' + status + '_reply', success)}break;case label_delete_reply_topic://下行 刪除設(shè)備標簽響應(yīng)break;case label_upload_reply_topic://下行 標簽信息上報響應(yīng)break;}//下行 服務(wù)調(diào)用if (service_topic_regex.test(topic)) {if (data.hasOwnProperty('method')) {var methodName = data.method.split('.')[2]if (methodName === "power") {power = data.params.power;}//上行 服務(wù)調(diào)用響應(yīng)publish(service_reply_topic.replace('+', data.method), success);}} }); //ctrl+c回調(diào) client.on('SIGINT', function () {console.log('disconnected');disconnect();client.end();console.log('Exited!');process.exit(2); }); //捕獲異常 process.on('uncaughtException', function (e) {console.log('Uncaught Exception...');console.log(e.stack);process.exit(99); });//alink屬性上傳 function publishTelemetry() {var message = {"id": ++id,"version": version,"sys": {"ack": 0},"params": {"productKey": productKey,"deviceName": deviceName,"power": { //alink讀寫屬性"value": power,"time": new Date().getTime()},"publish_telemetry_interval": { //alink讀寫屬性"value": publish_telemetry_interval,"time": new Date().getTime()},"publish_label_interval": { //alink讀寫屬性"value": publish_label_interval,"time": new Date().getTime()},"temperature": { //alink只讀屬性"value": genNextValue(23.6, 0, 45),"time": new Date().getTime()},'status': { //alink設(shè)備啟用禁用刪除'value': status,'time': new Date().getTime()},"model": {"value": model,"time": new Date().getTime()},"vendor": {"value": vendor,"time": new Date().getTime()},"area": {"value": area,"time": new Date().getTime()}},"method": "thing.event.property.post"}publish(property_post_topic, message); }//alink標簽上傳 function publishLabel() {var message = {"id": ++id,"version": version,"sys": {"ack": 0,"productKey": productKey,"deviceName": deviceName},"params": [{"attrKey": "model","attrValue": model},{"attrKey": "vendor","attrValue": vendor},{"attrKey": "area","attrValue": area}],"method": "thing.deviceinfo.update"}publish(label_upload_topic, message); }//子設(shè)備上線 function connect() {var message = {"id": ++id,"params": {"productKey": productKey,"deviceName": deviceName,"clientId": clientId,"timestamp": new Date().getTime(),"signMethod": "hmacmd5","sign": "9B9C732412A4F84B981E1AB97CAB****","cleanSession": "true"}}publish(device_login_topic, message); }//子設(shè)備下線 function disconnect() {var message = {"id": ++id,"params": {"productKey": productKey,"deviceName": deviceName}}publish(device_logout_topic, JSON.stringify(message)); }//發(fā)送數(shù)據(jù)+打印日志 function publish(topic, message) {client.publish(topic, JSON.stringify(message));log(topic, message); }//定時上傳屬性數(shù)據(jù) function setPublishPropertyInterval(preInterval, interval) {if (status === 'enable') {if (preInterval != null) {clearInterval(preInterval);}return setInterval(publishTelemetry, interval);}return null; }//定時上傳標簽數(shù)據(jù) function setPublishLabelInterval(preInterval, interval) {if (status === 'enable') {if (preInterval != null) {clearInterval(preInterval);}return setInterval(publishLabel, interval);}return null; }// Generates new random value that is within 3% range from previous value function genNextValue(prevValue, min, max) {var value = prevValue + ((max - min) * (Math.random() - 0.5)) * 0.03;value = Math.max(min, Math.min(max, value));return Math.round(value * 10) / 10; }//控制臺打印 function log(topic, message) {console.log('send message:')console.log(topic)console.log(JSON.stringify(message))console.log('===================================') }
  • 完整mqtt.json
  • {"broker": {"name": "emqx","host": "localhost","port": 1884,"clientId": "ThingsBoard_gateway","security": {"type": "basic","username": "admin","password": "admin"}},"mapping": [{"topicFilter": "/sys/+/+/thing/event/property/post","subscriptionQos": 0,"converter": {"type": "json","deviceNameJsonExpression": "${params.deviceName}","deviceTypeJsonExpression": "${params.productKey}","timeout": 60000,"attributes": [{"type": "string","key": "power","value": "${params.power.value}"},{"type": "int","key": "publish_telemetry_interval","value": "${params.publish_telemetry_interval.value}"},{"type": "int","key": "publish_label_interval","value": "${params.publish_telemetry_interval.value}"},{"type": "string","key": "status","value": "${params.status.value}"}],"timeseries": [{"type": "float","key": "temperature","value": "${params.temperature.value}"}]}},{"topicFilter": "/sys/+/+/thing/deviceinfo/update","subscriptionQos": 0,"converter": {"type": "json","deviceNameJsonExpression": "${sys.deviceName}","deviceTypeJsonExpression": "${sys.productKey}","timeout": 60000,"attributes": [{"type": "string","key": "model","value": "${params[0].attrValue}"},{"type": "string","key": "vendor","value": "${params[1].attrValue}"},{"type": "string","key": "area","value": "${params[2].attrValue}"}]}}],"connectRequests": [{"topicFilter": "/ext/session/+/+/combine/login","deviceNameJsonExpression": "${params.deviceName}","deviceTypeJsonExpression": "${params.productKey}"}],"disconnectRequests": [{"topicFilter": "/ext/session/+/+/combine/logout","deviceNameJsonExpression": "${params.deviceName}","deviceTypeJsonExpression": "${params.productKey}"}],"attributeUpdates": [],"attributeRequests": [],"serverSideRpc": [{"deviceNameFilter": ".*","methodFilter": "setStatus","requestTopicExpression": "/sys/${deviceType}/${deviceName}/thing/${params}","responseTopicExpression": "/sys/${deviceType}/${deviceName}/thing/${params}_reply","responseTimeout": 10000,"valueExpression": "{\"id\":\"123\",\"version\":\"1.0\",\"params\":{},\"method\":\"thing.${params}\"}"},{"deviceNameFilter": ".*","methodFilter": "setProperty","requestTopicExpression": "/sys/${deviceType}/${deviceName}/thing/service/property/set","responseTopicExpression": "/sys/${deviceType}/${deviceName}/thing/service/property/set_reply","responseTimeout": 10000,"valueExpression": "{\"id\":\"123\",\"version\":\"1.0\",\"params\":${params},\"method\":\"thing.service.property.set\"}"},{"deviceNameFilter": ".*","methodFilter": "replyLabelUpdate","requestTopicExpression": "/sys/${deviceType}/${deviceName}/thing/deviceinfo/update_reply","valueExpression": "{\"id\":\"123\",\"code\":200,\"data\":{}}"},{"deviceNameFilter": ".*","methodFilter": "service.*","requestTopicExpression": "/sys/${deviceType}/${deviceName}/thing/service/${methodName}","valueExpression": "{\"id\":\"123\",\"version\":\"1.0\",\"params\":${params},\"method\":\"thing.${methodName}\"}","responseTopicExpression": "/sys/${deviceType}/${deviceName}/thing/service/thing.${methodName}_reply","responseTimeout": 10000}] }
  • tb-gateway代碼修改。有幾處不能滿足要求(ALink協(xié)議必須要productKey),添加一行,有些bug修復。這里暫時就不一一指出了。



  • post模擬服務(wù)端RPC
  • 全部使用twoway有響應(yīng)的RPC調(diào)用
    獲取token

    設(shè)備啟用禁用刪除

    tb頁面 客戶端屬性上報也會變

    設(shè)置屬性

    服務(wù)調(diào)用

    總結(jié)

    要使用mqtt連接器,要熟悉源碼,方便調(diào)試甚至更改源碼BUG(bug不多)。在調(diào)試過程中可能有一些隱蔽的自身程序的問題,但看起來像tb網(wǎng)關(guān)出問題了,這類問題先找自身程序原因,不要有問題就說網(wǎng)關(guān)有bug,除非能從源碼斷定。


    要熟練掌握mqtt.json的配置方式,還有源碼,因為有些值不提供但你一定要用,就需要自己做些修改,比如alink協(xié)議topic上的productKey。以及掌握交互流程,這個比較容易暈頭,因為子設(shè)備到tb,有倆個網(wǎng)關(guān),倆個mqtt服務(wù)器,中間還要做格式轉(zhuǎn)換。


    了解倆種平臺的上下行協(xié)議及功能對應(yīng)。


    后續(xù)還有些功能沒有來得及實現(xiàn),找機會補上,或者不補了吧。
    沒有什么不可能。

    總結(jié)

    以上是生活随笔為你收集整理的ThingsBoard接入阿里ALink协议的网关设备探讨的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。