2022IoT物联网MOTT协议、设备上云、消息发与接收实战接入技术_第1页
2022IoT物联网MOTT协议、设备上云、消息发与接收实战接入技术_第2页
2022IoT物联网MOTT协议、设备上云、消息发与接收实战接入技术_第3页
2022IoT物联网MOTT协议、设备上云、消息发与接收实战接入技术_第4页
2022IoT物联网MOTT协议、设备上云、消息发与接收实战接入技术_第5页
已阅读5页,还剩152页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MQTT协议与IoT物联网平 CoAP协议详 电信NB-IoT无缝对接阿里云 微信小程序MQTT模拟 IoT存量设备零改造迁移上 基于函数计算实现IoT设备动态注 Nodejs版mqtt接入阿里云 C#设备接入IoT物联网平 IoT设备用HTTPS协议接入物联网平 设备用X.509证书接入实战(一 设备用X.509证书接入实战(二 深度解读IoT消息洪峰怎么 亿级IoT设备连接底层逻 IoT平台广播消息Broadcast实 自定义Topic同步调用RRPC实战(二 系统Topic实现云端同步调用RRPC(一 MQTT协议与MQTT协议与IoTMQTT协议与IoT一、MQTT协议介MQTTMQTT(消息队列遥测传输)是基于TCP/IP协议栈而构建的支持在各方之间异步通信的消息协议。MQTT在空间和时间上将消息发送者与接收者分离,因此可以在不可靠MQTTIoT这个轻量级协议可在严重受限的设备硬件和高延迟/IoTMQTTClientMQTTClient库在很多语言中都有实现,包括EmbeddedC、C、Java、JavaScript、Python、C++、C#、Go、i、AndroidEclipsePahoMQTT库下载地址:MQTTFixed控制报文类型控制报文类型标志位剩余长度Variable内容根据报文类型的不同而不同。可变报头的报文标识符(PacketIdentifier)字段存在MQTTPUBLISH来说有效< 其中td,me,wo由设备三元组dcKydcmttp//helaliyncom/ocmnt_etil/7372html设备端代码示例(Nodes版)client.js"dependencies":"dependencies":{"mqtt":"2.18.8"constmqtt=require('mqtt');//设备身份三元组+区域constdeviceConfig={productKey:"替换",deveNam:"替换",deviceSecret:"替换",regionId:"cn-shanghai"//根据三元组生成mqttconstoptions=consturl=`tcp://${deviceCductKey}.iot-as-qt.$deiCoi.rioId.lynconstclient=mqtt.connect(url,client.on('packetsend',function(packet){console.log('send+pckecmd'packet=>',packet)client.on('packetreceive',function(packet){console.log('receive+ackecm+'packet=>',packet)functionnqOpndevcenfg){constparams={productKey:deviceCductKey,devceame:devcenfg.evceame,meamp:Date.now(),clientId://CONNECT参数//CONNECT参数keepalive:60,protocolVersion:4//MQTTv3.1.1//1.生成options.password=gnmacha1paa,deviceConfig.deviceSecret);options.clientId={param.lientIdecureoesignmethdhmaha1timetoon.uenae=return参考文档:hp:hepaun.cmdoumenda742.hm?#h2url-functiongnmacha1paa,deviceSecret){letkeys=//按字典序排序keyskeys.sort();constlist=[];keys.map((key)=>{constcontentStr=returncp.ceemacha1,receivereceiveconnackpacket=>Packet{cmd:'connack',qos:0,length:2,payload:null,sessionPresent:payload:null,sessionPresent:false,returnCode:0}sendsendpingreqpacket=>{cmd:'pingreq'receivepingresppacketreceivepingresppacket=>Packet{cmd:'pingresp',qos:0,dup:false,length:0,topic:null,//3//3consttopic=`/sys/${deviceCductKey}/${deviceConfig.deviceNasetInterval(function()},},5*functiongetPostData(){constpayloadJson={id:Date.now(),params:{temperature:ah.ooahandm)*20)+humidity:ah.foah.ndo)*20)+method:console.log("===postData\ntopic="+topic)returnsendpublishpacket=>{cmd:topic:payload:d:148648116paam:empeau:2humd:}"meho:hngqos:1,messageId:38850,dup:false}receivereceivepubackpacket=>Packet{cmd:'puback',qos:0,dup:false,length:2,topic:null,messageId:38850//4//4constsubTopic=`/${deviceCductKey}/${deviceConfig.devcen.nmeage,function(topic,message){console.log("topic"+topic)cooe.omeage"+message)SUBSCRIBEsendsubscribepacket=>{cmd:'subscribe',[{topic:a1hFedeud1fgAP2eIdcono,qos:0}],qos:1,dup:false,messageId:38851SUBACKreceivesubackpacket=>Packet{cmd:'suback',receivesubackpacket=>Packet{cmd:'suback',qos:0,dup:false,length:3,topic:null,granted:[128],messageId:38851}sendunsubscribepacket=>{cmd:'unsubscribe',qos:1,sendunsubscribepacket=>{cmd:'unsubscribe',qos:1,messageId:unsubscriptions:[a1hFedeud1fgA2eIdcono']receivereceiveunsubackpacket=>Packet{cmd:'unsuback',qos:0,dup:false,length:2,topic:null,messageId:34323IoTunsubscribe,否则订阅关TLSIoTTLSv1.2TLS加密,需要下载根证书。CONNECTclientIdsecuremode=2poom_m >CoAPCoAPCoAP协议详解 CoAP|IoTCAP(CnstraindAplicatinrotocl)的缩写。在T物联网场景,为了让小设备可以接入互联网,CoAP协议被设计出来。CoAP是一种应用层协议,它运行于UDP协议之上而不是像HTTP那样运行于TCP之上。CoAP协议非常4字节。CAPHTPESTHTPCAP既考CAP提供RIEST式的方法如GTOTUT和ELTE另一方面,CAP基于轻量级的DP协议,并且允许P多播。为了弥补UDP传输的不可靠性,CoAP定义了带有重传机制的事务处理机制。并且提供资源发现机制,并带有资请求/CoAPUDPCoAP报文:【Ver【T】报文类型,CoAP协议定了4种不同形式的报文,CON报文,NON报文,ACKRST报文。【TKL】CoAP标识符长度。CoAP协议中具有两种功能相似的标识符,一种【Code】功能码/响应码。Code在CoAP请求报文和响应报文中具有不同的表现形式,Code35c.dd0.XXCoAP2.XX、4.XX5.XXCoAP响应的某种具体表现。【MessageID【Token】标识符具体内容,通过TKL指定Token长度。【inCoAP主机,CoAPURI,CoAP请求【11111111B】CoAP报文和具体负载之间的分隔符。0.01GET0.02POST:0.03PUT:0.04DELETE:删除资源Success2.012.022.032.042.05ContentClientError4.xx:4.00Bad4.014.02Bad4.034.05MethodNot4.06Not4.12Precondition4.13RequestEntityToo4.15UnsupportedContent-FormatServerError5.xx:5.00InternalServer5.01Not5.03ServiceUnavailableCoAPHTTP的设计思路,同时也根据受限资源限制设备的具体情况改良CON:需要被确认的请求,如果CONNON:不需要被确认的请求,如果NONACK:应答消息,接受到CONRST:复位消息,当接收者接收到的消息包含一个错误,接收者解析消息或者不再关CoAPHTTPRESTFulWEB应用中越来越受欢迎,这样的道理同样适用于CoAP。一个CoAP资源可以被一个URI所描述,例如一个设备可以测量温度,那么这个温度传感器的URI被描述为CAPmchin.adCoAPUDP5683HTTPCoAP对比:HTTP代表超文本传输协议,CoAPHTTP协议的传输层采用了TCP,CoAP协议的传输层使用CoAPHTTPCoAPHTTPCoAPCoAPIoT/WSN/M2MCoAPMQTTMQTT协议使用发布/订阅模型,CoAP协议使用请求/MQTT是长连接,CoAPMQTT通过中间代理传递消息的多对多协议,CoAPServerClientMQTTClients,CoAP内置内容协商IoTIoT >CoAPIoTLinuxAndroidArduino在操作系统层面,解决了不同通信模块的差异,硬件端的应用程序只需要集成云平台的IoTSDK,或者MQTTSDK即可和云端建立长连接通信链路。ROTS系统,甚至无操作系统,采MCU+通信模组的方式,实现设备数据远程采集。(B-oT/2G/3G/4G)移远通信芯讯通合宙有方科技、广和通、日海智能、高新兴等,而各家的ATigBee设备,LoRa设备,Modbus设备,而不具有互联网接入协议栈支持,此时需要借助DTU/网关设备QTT面对这种场景,可以通过自有系统集成泛化SDK通过HTTP/2协议,在不改造设备 >电信NB-IoT电信NB-IoT电信NB-IoTIoT< 电信NB-IoT无缝对接阿里云NB-IoTCW,无法直接在阿里云IoT,AWSIoTIoTNB-IoTIoTNB-IoTCig登陆电信Win控制台,创建产品:上海花城水表,选择智能水表,其他配置信产品创建成功后,查看服务定义用水量water_cnsumpo如下图:在产品详情-设备管理页面添加NB-IoT设备,这里我们输入NB-IoT水表设备的在应用管理页面添加应用:上海花城水表管理,获取到应用的AppKey和CWing物联网平台,我们按需开通连接型在产品功能定义中添加物模型的属性:用水量,标识为watecnsumpo在产品数据解析Tn平台的数据格式转换IoT云网关,用来解析电信平台流转过来的设备数据,关联前面创建的产品上海花城水表CWing${deviceId}来自动注册设备,如下图:URL,IoTTn控制台,在产品详情的订阅管理IoT我们启动手上的NB-IoTTn控制台看到水表上报的数据,IoT在日志服务也可以看到电信Tn平台流转过来的NB-IoT设备数据在阿里云IoTNB-IoT设备从电信CWig平台流转过来的完整数据报文至此,我们完成了NB-IoTIoT,充分享受阿里云的海量存IoT >LoRaWAN LoRaWAN随着IoT物联网的高速发展,低功耗,远距离,抗干扰的低功耗广域网快速崛起,LoRaNB-IoTLoRaWANIoTLnW服务后,即可实现LoRaWAN设备的上云。LoRaWAN液位传感器为例,完整方案如下:开通企业实例-LinN首先,我们按需开通基础型企业物联网实例,开启inkWAN服务,如下图:添加LinAN在LinkWAN的网关管理页面,添加网关,录入手中LinkWAN网关设备的GwEUI、PINCode和频段、通信模式在LinkWAN的入网凭证在设备管理LoRa液位传感器LoRaWAN连网模式,并LoRa入网凭证,如下图:inkWAN的入网凭证LoRa产品和入网凭证在设备管理的设备页面,添加LoRa液位传感器具体设备,录入手上LoRa设备的DevEUI,JoinEuiAppKey信息,如下图:启动LinkWAN网关oaRa当前液位值 >MQTT一、IoTMQTT模拟器IoTTopicregion③基于当前产品,注册设备,并获取身份三元组三、MQTTTopicTopicTopic①点击属性上报,输入JSON结构的属性值。②物联网平台控制台,设备详情>物模型数据>运行状态IdJSON四、设备三元组ChromeIoTChrome插件。点击阅读原文获取插件安装包。Chrome加载已解压的扩展程序按钮,选中本地扩展程序文件夹,然后点击选择①进入物联网平台控制台,进入设备详情,点击查看DeviceSecret >IoTIoTIoT IoT|物联网场景中,设备产线烧录不同三元组成本很高,Android设备更是无法独立烧录我们进入IoT物联网平台控制台,创建一个新产品:Android进入产品详情,获取productKey和productSecret。开启动态注册Node.js代码演示设备动态注册完整过程。CONNECTMQTT${productKey}.iot-as-mqtt.${regionId}.m8MQTTCONNECTmqttClientId:mqttClientId:cenIdecuemoe2auhpeegnandomxsgnmeho"mqttUserName:devceame&+poucKeymqttPassword:Topic:/ext/regnwl,返回IoTPayload"productKey":devceNme":"deviceToken":"xxx"functionfunctiondoDeviceRegister()constproductInfo=productKey:"产品productKey",productSecret:"产品productSecret",regionId:"cn-shanghai"productKey:"产品productKey",productSecret:"产品productSecret",regionId:"cn-shanghai"//2.程序读取的设备唯一标识,比如A,ealNumber等poucInf.evceame=ahandm).ng6).ub2)varoptions=getRegisterOptions(productInfo,4clientIddeviceTokenvarregisterClient=mqconncoon);egeen.onmage,function(topic,message)if('/ext/regnwl'==topic)//6.断开注册连接7MQTTdevceOnneJO.pemeage)cn-poom_functiongetRegisterOptions(productInfo,rootCA){functiongetRegisterOptions(productInfo,rootCA){varrandom=Date.now();varcontent=devceame:productInfo.deviceName,productKey:productIductKey,random:randomvaroptions=options.clientId=Date.now()+"seueode=,atTyp=rgwl,ado=++opn.uename=poucInf.evceame+"&"+productIductKeyoptions.password=gnmacha1cnen,productIductSecret)options.port=1883;options.host=`${productIductKey}.iot-as-mqtt.${productInfo.regionId}.aliyuncs.coptions.host=`${productIductKey}.iot-as-mqtt.${productInfo.regionId}.aliyuncs.coptions.ca=rootCAoptions.keepalive=120returnoptions;ClientIDDeviceTokenMQTT连接,IoTCONNECT参数如下:mqttClientId:mqttClientId:cenIdecuemoe-2,authType=connwl"mqttUsername:deceNae+&+pduKeymqttPassword:deviceTokenmttClietIdClientIDmqttUserName:组成结构为momqttPassword:设备动态注册时获得的设备建立MQTTfunctionfunctiondevcenneoegonId)MQTT连接参数varoptions={}options.clientId=opts.clientId+"securemode=-2,authType=connwl"opn.uename=op.evceame+"&"+ductKeyoptions.password=opts.deviceTokenoptions.port=options.host=`${ductKey}.iot-as-mqegonId}aunc.cm`tocol='mqtt'options.keepalive=vardeviceClient=//上报业务数据diele.pbls(/${dte}/{opt.diee/srupdt`"sdkclient"+Date.now(),{qos:1 >IoTIoT存量设备零改造迁移上云< IoT存量设备零改造迁移上云< IoT存量设备零改造迁移上云在物联网实际项目中,有些设备采用私有协议接入了本地设备管理系统,有些NB-IoT设备被迫接入了电信AEP平台,有些设备接入了移动OneNET平台。但甲方客户IoTSDK接入的方案IoT设备零改造的前提下,帮助企业快速构建云上桥接服务,通过网桥实现IoT终端设备与阿里云IoT物联网SDK泛化协议SDKSDKServerSDK,SDK泛化协议仅支持Java开发语言,添加泛化协议SDK的项目Maven<artifactId>iot-as-bridge-sdk-您需要创建一个BridgeBootstrap对象实例,并调用bootstrap方法。泛化协议SDK初始化工作完成后,读取网桥信息,并向云端发起网桥设备上线请求等。nnelHandlerBridgeBootstrapBridgeBootstrapbridgeBootstrap=newBridgeBootstrap();bridgeBootstrap.bootstrap(newDownlinkChannelHandler(){publicbooleanpushToDevice(Sessionsession,Stringtopic,byte[]payload)Stringcontent=newreturntrue;publicbooleanbroadcast(Stringtopic,byte[]payload){returnfalse;Java(src/mai/reurce/application.conf##Serverhttp2Endpointhttps://你的ProductK-hangha.aunccom44"productKey=${bridge-ProductKey}devceame=${bridge-evceame}deviceSecret=${bridge-DeviceSecret}Java工程的默认资源文件路径(一般是/an/esues/)下的devices.conf中读${device-original-Identity}${device-original-Identity}{productKey:${device-ProductKey}deveName:${device-Devceame}deviceSecret:${device-DeviceSceret}设备上线时,需要传Session。下行消息回调时,会把Session回调给网桥。SessionUplinkChannelHandlerUplinkChannelHandleruplinkHandler=newObjectchannel=newSessionsession=Session.newInstance(originalIdentity,booleanbooleansuccess=upnandedonneeon,originalIdentity);if(success){网桥使用泛化协议SDKDeviceIdentitydeviceIdentity=oaoy.Dcoiar.evIdiypoocoeage.etopctng.fomaOPI_MLATUSR_DFIN,deviceIdentitygetProductKey(),deviceIdentity.getDeviceName()));//uplinkChannelHandler.doPublishAsync(originalIdentity,PubAPIprivatestaticExecutorServiceexecutorServiceprivatestaticExecutorServiceexecutorService=newThreadPoolExecutor(RunmegeRune).avabeoceo)*2,60,newnewThreadFactoryBuilder().setDaemon(true).setNameFormat("bridge-downlink--newpublicstaticvoidmanngargs[])//Useapplication.conf&devices.confbydefaultbridgeBootstrap=newBridgeBootstrap();bridgeBootstrap.bootstrap(newDownlinkChannelHandler(){publicbooleanpushToDevice(Sessionsession,Stringtopic,byte[]payload)//getmessagefrom//getdownlinkmessagefromexecutorService.submit(()->handeonLnkeageeon,topic,payload));returntrue;publicbooleanbroadcast(Strings,byte[]bytes){returnfalse;privatestaticvoidhandeonLnkeageeonsession,Stringtopic,byte[]payload){Stringcontent=newString(payload);Objectchannel=session.getChannel();StringoriginalIdentity=//foreampleyoucansendthemessagetodeviceviachannel,itdependsonyouspecifcservermpemeaon 基于函数计算实现IoT基于函数计算实现IoT >基于函数计算实现IoTIoTdeviceIdHTTPSFC函数计算FC调用IoT平台的RegisterDevice接口,传递productKey和IoTQueyDeceDetaproductKeydeviceId,获MQTTIoTAPIRegisterDevicettp//helaliyncom/ocmnt_etil/9470htmlQuerDeveDetatts//helaliyncm/cumentdtail/959.tmlHTTPSNodejs版本实现:constconstgetRawBody=equea-body');constco=require('co');constRPCClient=eqe@acoupo-constoptions=accessKey:"云账号的AK",accessKeySecret:"云账号的AKSecret"//1.创建iotpopserverconstiotClient=newRPCClient({secretAccessKey:apiVersion:options.apiVersion'2018-01-20'}constproductKey='pduKe;moue.ep.haner=function(req,resp,context){getRawBody(req,function(err,body)body=constdeviceId=body.deviceId;co(function*(){constdeviceId=body.deviceId;co(function*(){tryconstregisterResponse=yieldiotClient.request(RegeDevce,{devceame:deviceIdsuccess:true,data:}catch(err)constqueryResponse=yieldiotClient.request(ueDevceDe,{deveNam:deviceIdconstreturnJson={success:true}returnJson.data={Devceame:quRepone.aa.evceNme,ProductKey:queryResponse.Data.ProductKey,DeviceSecret:queryResponse.Data.DeviceSecret,IotId:queryResponse.Data.IotIdHTTPSPOSTJSONNodejsNodejsmqtt接入阿里云IoT >NodejsmqttNodejsmqttIoTpwwodNodejsIoTnodejs2package.jsonpackage.jsonIoTsdk"name":"aliyun-iot-demo","dependencies":{"mqtt":npmIoT$$npm"dependencies":{"mqtt":"2.18.8"constmqtt=require('mqtt');constdeviceConfig{productKey:"替换产品",deveNam:"替换设备",regionId:"cn-shanghai"constparams=productKey:deviceCductKey,deveNam:deveonfgdeveNam,meam:Date.now(),clientId://CONNECTconstoptionskeepalive:60,clean:falsecleanSessionprotocolVersion:4//MQTTv3.1.1//1.生成options.password=gnmacha1aam,options.clientId={aa.lintdeurmeinetohah1tmtapopn.uename=consturl=`tcp://${deviceCductKey}.iot-as-mqtt.${deviceConfig.regionId}.aliyuconsturl=`tcp://${deviceCductKey}.iot-as-mqtt.${deviceConfig.regionId}.aliyuconstclient=consttopic=sy/$dvCoi.podty${diof.dva/i/e/psetInterval(function()//发布数据到topic},5*constpayloadJson={id:Date.now(),params:{temperature:ah.ooahandm)*20)+humidity:ah.foah.ndo)*20)+method:console.log("===postData\ntopic="+topic)return参考文档:hp:hepaun.cmdoumenda742.hm?#h2url-*/functiongnmacha1pam,deviceSecret)letkeys=keys=keys.sort();constlist=[];keys.map((key)=>keys=keys.sort();constlist=[];keys.map((key)=>{constcontentStr=returncp.ceemacha1,IoTC#设备接入C#设备接入IoT >C#设备接入IoTC#设备接入IoT物联网平台IoT产品官网:wm获取设备身份三元组eIoT平台接入password签名规则参考:ttsw.yuu.cm/clu-dev/iot-接入IoTC#MQTTCmqttVisualStudioC#语言开发的传感器设备接入阿里云IoTIoTIoTHTTPS协议接入物联网平台< >IoTHTTPSIoT设备用HTTPSIoTHTTPS协议栈,那么我们能否接入IoT物联网平台呢?答案是肯定的。本文就通过开发实战给大家讲解如何使用HTTPSIoT2(上海)区域。HTTPS接入的官网文档ttphelaliyncom/ocmnt_etil/83.tmlHTTPS接入主要有两个步骤:HTTPS设备身份认证服务器接入点:-POSTPOST/authHost:-hanga.aunc.omContent-Type:application/jsonbody:"version":"default",gnmehod:"hmacsha1","sign":"productKey":"ZG1EvTEa7NN",devceNme:Naspuh8FB,"timestamp":"1501668289957""code0,//业务状态码"messagesuccess",//业务信息"info"token":IoT-POSTPOST/topic/a1GFjLP3xxC/device123/pubHost:-hanga.aunc.omContent-Type:application/octet-streambody:${your_data}"code0,//业务状态码"messagesuccess",//业务信息"info"messageId":三、使用HTTPS上报数据实战设备详情varvarrp=require('request-pme);constcrypto=require('crypto');constdeviceConfig{productKey"productKey",devceame:"devceame,deviceSecret:"替换consttopic=sy/$dty/{diCoi.dia/hgetpro//1.获取身份token.then(function(parsedBody)console.log('AuthInfo//2pubData(topic,parsedB.token,.catch(function(err)console.log('AutherrfunctiongeAuhpondvceong)constparams=productKey:deviceCductKey,deveNam:devcenfg.evceame,meam:Date.now(),clientId://生成varpassword=gnmacha1paa,varoptions={method:O,uri:'-hanga.aunc.omauh,body:{"version":"default","clientId":paamcenId,gnmehod:"hmacsha1","sign":password,"productKey":deviceCductKey,devceNme:devcenfg.evceame,"timestamp":paammeampjson:functionpubData(topic,token,data)constoptions={method:uri:'-hanga.aunc.omoc'+topic,body:data,headers:password:password:onenType':'application/octet-.then(function(parsedBody){console.log('publishsuccess:'+parsedBody).catch(function(err)console.log('publisherr'+functiongetPostDatavarpayloadJson={id:Date.now(),params:{humidity:ah.ooahandm)*20)+temperature:ah.foah.ndo)*20)+method:console.log("===postData\ntopic="+topic)//HmacSha1functiongnmacha1pam,deviceSecret)letkeys=//按字典序排序constlist=[];keys.map((key)=>{constcontentStr=returncp.ceemacha1, >网关与子设备上云开发实战<网关与子设备上云开发实战< IoT无连接互联网能力时,那么数据如何上IoTMQTT长连接通道,所有子设备可以复用网关的MQTT通道,高效传输数据到云端。IoTIoTMQTT连接,收发数据,还要负责子设备管理,包括:mqtthttp、mqtt、ZigBee、Modbus、BLE、OPC-UA等,这部分逻辑由网关实现。整体架构如下:JavaLinkKitSDK使用网关设备三元组身份,建立端到云上的MQTTLinkKitInitParamsLinkKitInitParamsparams=newDeviceInfogatewayInfo=newDeviceInfo();gaeaInfodeveName=gaea.evceNme;gatewayInfo.deviceSecret=gateway.deviceSecret;paamdevceIfo=gatewayInfo;IoTDeviceInfodeviceInfo=newDeviceInfo();deviceIductKeyDeviceInfodeviceInfo=newDeviceInfo();deviceIductKey=productKey;devceIfodevceame=devceame;deviceInfo.deviceSecret=deviceSecret;deviceInfo,//子设备身份DeviceInfodeviceInfo=newDeviceInfo();deviceIductKeyDeviceInfodeviceInfo=newDeviceInfo();deviceIductKey=productKey;devceIfodevceame=devceame;deviceInfo.deviceSecret=deviceSecret;deviceInfo,//子设备身份子设备成功上线后,我们在网关设备详情,可以查看到子设备状态为:IoTDeviceInfoDeviceInfodeviceInfo=newDeviceInfo();deviceIductKey=productKey;devceIfodevceame=devceame;deviceInfo.deviceSecret=deviceSecret;topic,//子设备topicdeviceInfo,//子设备身份DeviceInfoDeviceInfodeviceInfo=newDeviceInfo();deviceIductKey=productKey;devceIfodevceame=devceame;deviceInfo.deviceSecret=deviceSecret;topicTopicdeviceInfo,deviceInfo,DeviceInfoDeviceInfodeviceInfo=newDeviceInfo();deviceIductKey=productKey;devceIfodevceame=devceame;deviceInfo.deviceSecret=deviceSecret;deviceInfoDeviceInfoDeviceInfodeviceInfo=newDeviceInfo();deviceIductKey=productKey;devceIfodevceame=devceame;deviceInfo.deviceSecret=deviceSecret;deviceInfoCPython开发,背后交互逻辑相同,具体可以参考阿里云IoT云产品开发文档。 >X.509(一X.509X.509 X.509CA仅MQTT协议直连的设备可使用私有CA证书。目前仅2(上海)CA使用私有CA证书时,只支持RSA算法10CACAMacOpenSSLCAopensslopensslopensslversion-abuilton:Nov19platform:darwin64-x86_64-options:bn(64,64)m2n)rc4(ptr,char)des(idx,cisc,16,int)compiler:-archx86_64-fmessage-length=0-pipe-Wno-trigraphs-fpascal-strings--blocks-O3-D_REENTRANT-DDSO_DLFCN-DHAVE_DLFCN_H-DL_ENDIAN-DMD32_REG_T=int-DOPENSSL_NO_IDEA-DOPENSSL_PIC-DOPENSSL_THREADS-DZLB-mmacosx-version-min=10.6OPENSSLDIR:"/System/Library/OpenSSL"CAkey#生成私有CA#生成私有CAkey10opensslreq-new-x509-days3650-newkeyrsa:2048-keyoutmyIoTCARoot.key-outmyoTCARoot.crt-subj\#查看CA证书opensslx509-noout-text-inCA在左侧导航栏,选择设备管理>CACA证书管理页,单击CA证书CA注册码OpenSSLopensslgenrsa-outverificationCert.keyCSR,CommonNameIoTCA证书#生成验证证书#生成验证证书opensslreqnewkeyverificationCert.keyoutverificationCert.csrsubj使用由私有CA证书私钥签名的CSR#用私有#用私有CAkeyopensslx509-req-inverificationCert.csr-CAmyIoTCARoot.crt-CAkeymyIoTCARoot.key-CAcreateserial-outverificationCert.crt-days365-sha512opensslx509-noout-text-in三、上传并验证私有CA证书CAIoT >X.509(一X.509X.509 CACAIoTCAX.509IoTX.509X.509在左侧导航栏,选择产品X.509CA是 >X.509(二X.509X.509 基于已创建的空气净化器产品,添加设备,输入设备evicNme注册完成后,设备处于未激活X.509IoTCAopensslCNevicNme。pempemopensslgenrsaoutdevice-1.key2048CSRopensslreq-new-keydevice-1.key-outdevice-1.csr-newkeyrsa:2048-subj\set_serial#用私有CAopensslx509-req-indevice-1.csr-CAmyIoTCARoot.crt-CAkeymyIoTCARoot.key-CAceateserial-outdevice-1.crt-days3650-sha512#查看设备证书opensslx509-noout-text-indevice-SNIoToue,eeNm和设备证书SN的映射csvIoTCSVJavaJavaPKCS#8OpenSSL来进行转换,命令如#转换格式#转换格式opensslpkcs8-topk8-informPEM-indevice-1.key-outdevice-1_pkcs8.key-使用TLS(securemode=2)iot_root.crt、设备证书、设备证书私钥来构造SSLSocketFactoryprotectedprotectedSSLSocketFactorycreateSSLSocket()throwsException//物联网平台根证书,可以从官网文档中下载X.509用来验证IoTCA证InputStreamin=lttiKeyStorekeyStore=KeyStore.getInstance(KeyStore.getDefaultType());keyStore.load(null,null);TrustManagerFactorytmf=TrustManagerFactory.getInstance(TrustManagerFactory.ge//InputStreamcertIn=mKeyStoreks=KeyStore.getInstance(KeyStore.getDefaultType());PrivateKeyprivateKey=ks.setKeyEntry("private-key",privateKey,privateKeyPassword.toCharArray(),newCertiicate[]{certCa});KeyManagerFactorykmf=KeyManagerFactory.getInstance(KeyManagerFactory.getDekmf.init(ks,//构造SSLContextSSLContextcontext=SSLContext.getInstance("TLSV1.2");context.init(kmf.getKeyManagers(),tmf.getTrustManagers(),null);SSLSocketFactorysocketFactory=context.getSocketFactory();returnsocketFactory;MQTTCONNECT,usernamepassword////Stringbroker="ssl://x509.itls."+regionId+MQTTStringmqttClientId=em.cuenme)+ecuemode;emoeencepersistence=newemoeence);mqttClient=newqeneveURL,mqttClientId,persistence);qonncOpnsconnOpts=newqonncOpn);connOpts.setMqttVersion(4);//MQTT3.1.1TLSroot.crt,mqttClientIdsecuremode=2。connectmqeneCabacknewqabac){publicvoidmeageAvedngtopic,MqttMessagemessage)throwsExceptionif("/ext/auth/identity/response".equals(topic))JSONObjectjson=JSONObject.parseObject(newString(message.getPayload(),StanproductKeyStringproductKey=json.getString("productKey");StringdeveName=json.getString("deviceName");}else//publicvoiddeveopeeIDeveokentoken)publicvoidconnectionLost(Throwablecause)设备启动,联网后,我们可以在IoTX.509X.509IoT >深度解读IoTIoTIoT消息洪峰怎么扛< 深度解读IoT消息洪峰怎么扛 IoT传统的消息队列(Kafka、RocketMQ等)经过多年打磨,在高性能、海量堆积、消息可靠性等诸多方面都已经做得非常极致,但在IoT物联网场景中,往往需要面临着海量的列最大意义在于让整个消息在不可控的环境中平稳运行IoT支持设备级的海量息顺序写文件优势就会导致一个broker要退化到随机写,失去优势,另外要zookeeper是“海量topic尽量相互隔离,并且不影响整体性能”,尽量做到设备A的消息堆积topicB。有用。因此,实时生成消息优先发送,堆积的消息进入降级模式。IoTbrokerbrokernosqlDB,高吞吐写。取堆积消息,而拉取是由AMQP队列网关来做,给到用户接口始终是推送过去的onMessagebrokerconsumer来连接,而是把队列网关剥离出来,这样会更灵活,甚至对于部分用户我们的queue可以切换到ons、kafka等实现。kafka、rocketmqbrokerbroker实时消息优先推送给consumer,失败才会落到queue;这是一个完整事件,producert。ACK线性扩展-broker三、一个思考一一如何解决海量topictopic数据生成,brokermqtttopictopictreeivemq有实现版本。AIoTAIoT为了降低接入成本,用户可以使用AMQP1.0协议接入,符合开源生态。同时兼容传统队列和新队列,交给用户按场景来选择,用户即可选择使用kafka、mq,也可以选用iot队AIoTmq队列、kafkaIoT >亿级IoT亿级IoT亿级IoT IoTIoT标准化:物模型作为物联网的抽象层,类似操作系统屏蔽硬件、JVMOS的差异ISV,SI,IHV可适配:由于行业里面已经有不少设备模型和交互协议,比如工业场景的Modbus,opcble,zigbee早期大多数物联网平台比如Azure、AWS都只做连接和基础管理能力,并没有围绕数大多数对于设备建模都采用的是面向对象语言的思路,比如WoT、OPC、OMA、OCF、CWMP、AllJoin等,面向对象语言的抽象能力在计算机编程发展的几十年已经被javaclassclassschema进行了一定的扩展,定义为属性、服务(方法)和事件三要素,事件是一类特【图为物模型基础schema(没有包括模块化、多语言、多版本等一系列高阶特性)AIoTschema描述设备的能力,但由于物联网碎片化,大家对于设备IoTICAICA功能模块:一组资源的集合。集合中的资源可以是标准库中已有资源的组装,也可以是物模板:一组功能模块和一组资源的集合。集合中的模块和资源可以是标准库中已有模ICA >IoTBroadcastIoTIoTBroadcast< IoT平台广播消息Broadcast实战Topic/broadcast/${YourProductKey/broadcast/${YourProductKeyPubBroadcastAPIpoom_注:broadcasttopicIoT*nodebroadcast-//constoptions=require("./iot-device-constclient=cen.nmeage,function(topic,message){console.log("topic"+topic)cooe.omeage"+message)"productKeyproductKey",devceame:deceNae,"deviceSecret":"替换deviceSecret","regionId":"cn-shanghai"*package.json添加依赖:@acoudppcore":"*/constco=constconstRPCClient=eqe@acoupo-constoptions=accessKey:"自己的accessKey",accessKeySecret:"自己的accessKeySecret"//1.创建constclient=newRPCClient({secretAccessKey:options.accessKeySecret,apiVersion:'2018-01-20'2iot//这里是POPAPI的ActionconstactionubBoadc;constparams={ProductKey:opcFName:MessageContent:newBuffer('{"broadcast":"thisisbroadcastconstresponse=yieldclient.request(action,PubBroadcastAPI3 >IoTIoTIoT IoTIoT24设备沉睡处于离线状态;这些现状带来一个新的挑战:在MQTTQoS=1IoTQoS=1离线消息MQTT协议设计了一套保证消息稳定传输的机制,包括消息应答、存储和重传。在这S(ualityofService):QoS=0QoS=1QoS=2QoS=1代表,Sender发送的一条消息,Receiver至少能收到一次,也就是说Sender向Receiver发送消息,如果发送失败,会继续重试,直到Receiver收到消息为止,但是因为重传的原因,Receiver有可能会收到重复的消息;QoS=1方式发布消息到IoT物联网平台,即可保证消息至少到达设备端SessionMQTTCONNECTCleanSession=0,即保留之前sessionQoS=1QoS=1的消息。Node.jsCONNECT参数示例:constconstoptions=clientId:`decuemoesgnmehohmacha1meammeamp`,username:`devceNae}&poucKe}`,password:"根据文档规则进行hmacsha1protocol:"mqtt",cleanfalseSessionkeepalive:300IoTPubAPIQos1APIpoom_mNode.jsPubAPI//1//1PubAPIconstparams={opcFName:"下行指令的完整Topic",MessageContent"base64",ProductKey:"产品ProductKey",IotInstanceIdId",Qos:1//设备离线时,IoT7//2.发起Pub//2.发起PubAPIIoT物联网平台提供设备影子功能,可以实现离线设备的消息触达,完整消息链路如为了实现设备影子功能,IoTochadwgtpdce}$eeNme以便实Node.js示例代码如下:constconstmqtt=require('aliyun-iot-//constdeviceConfig={"productKey":"产品",devceNme:"设备","deviceSecretdeviceSecret","regionId":"cn-shanghai"//1constclient=//2.订阅设备影子constgetShadow=`/shadow/get/${deviceCductKey}/${deviceConfig.deviceNacen.nmeage,function(topic,message)if(topic==getShadow){message=console.log(newDate().Format("yyyy-MM-ddHH:mm:ss.S"))console.log("\tappConfig.content:",.sriyss.pyoad.t.dsid.ppooe.o"\ppog.s:",.tnysg.pod.ad.diconstupdateShadow=`/shadow/update/${deviceCductKey}/${deviceConfig.declient.publish(updateShadow,JONngfmehod:"get"}),{qos:1服务端调用设备影子接口UpdateDeviceShadow把新的配置参数保存到设备影子的desiredttp//helaliyncom/ocmnt_etil/9954htmlNode.js示例代码如下:constconstco=constRPCClient=eqe@acoupo-constoptions={accessKey:"accessKey",accessKeySecret:"你的//1.初始化constclient=newRPCClient({accessKeyId:options.accessKey,apiVersion:'2018-01-20'constshadowMessage={method:"update",state:{desired:{maxTemperature:constparams=ProductKey:"你的ProductKey",Devceame:"你的Devceame,ShadowMessage:try{constresponse=yieldcen.eueUpaeDevchado,params);}catch(err){云端业务系统调用成功后,我们在IoT物联网平台的控制台,设备详情>设备影子, TopicTopic同步调用RRPC实战(二)< TopicRRPC(二RRPC:Revert-RPC。RPC(RemoteProcedureCall)采用客户机/服务器模RRPC则可以实现由服务端请求。动等业务场景,应用服务器通过POPAPI发起RRPC调用,IoT设备端只需要在TmoutPubIoT。服务端同步RRPC调用业务流程如下:Topic:Topic:epc1242232chagngcmdPayload:{"power":200,"port":"3"}Topic:Topic:epc1242232chagngcmdPayload:{"bizCode":0,"errMsg":"xxxxx"}为了配合自定义Topic的RRPC调用,设备端需要在MQTT的CONNECT参数clientIdext=1标识:constconstmqtt=require('aliyun-iot-constoptions={productKey:"YourproductKey",devceame:"Yourdevceame,deviceSecret:"YourdeviceSecret",//2;//3RRPC主题cen.nmeage,function(topic,message)console.log("topic<<="+topic)console.log("payload<<="+message)handleRrpc(topic,message)functionhandleRrpc(topic,//RRPCpayloadconstpayloadJsonbizCode:00400console.log("replytopic=>>"+console.log("replypayload=>>"+JONngfpaoadJo))client.publish(topic,JSON.stringify(payloadJson));RRPCAPIRRPCAPINode.jsconstconstco=constRPCClient=eqe@acoupo-constoptions=accessKey:"youraccessKey",accessKe

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论