// Decode decodes an array of bytes into an object.// - fPort contains the LoRaWAN fPort number// - bytes is an array of bytes, e.g. [225, 230, 255, 0]// - variables contains the device variables e.g. {"calibration": "3.5"} (both the key / value are of type string)// The function must return an object, e.g. {"temperature": 22.5}// Temperature & Humidity Sensor decoderfunctiondecodeUplink(input){// bytesvarbytes=input.bytes;// typevaruplinkType=(bytes[0]>>4)&0x0f;switch(uplinkType){case0x01:return{data:decodeRegistration(bytes)};case0x02:return{data:decodeHeartbeat(bytes)};case0x0f:return{data:decodeAcknowledgment(bytes)};default:returnnull;}}// type: 0x1 RegistrationfunctiondecodeRegistration(bytes){vardata={};data.type="Registration";// adrdata.adr=((bytes[0]>>3)&0x1)==0?"OFF":"ON";// modevarmodeValue=bytes[0]&0x07;if(modeValue==0x01){data.mode="AU920";}elseif(modeValue==0x02){data.mode="CLAA";}elseif(modeValue==0x03){data.mode="CN470";}elseif(modeValue==0x04){data.mode="AS923";}elseif(modeValue==0x05){data.mode="EU433";}elseif(modeValue==0x06){data.mode="EU868";}elseif(modeValue==0x07){data.mode="US915";}// smodevarsmodeValue=bytes[1];if(smodeValue==0x01){data.smode="AU920";}elseif(smodeValue==0x02){data.smode="CLAA";}elseif(smodeValue==0x04){data.smode="CN470";}elseif(smodeValue==0x08){data.smode="AS923";}elseif(smodeValue==0x10){data.smode="EU433";}elseif(smodeValue==0x20){data.smode="EU868";}elseif(smodeValue==0x40){data.smode="US915";}// powerdata.power=((bytes[2]>>3)&0x1f)+"dBm";// reservedvarreservedValue=bytes[2]&0x07;if(reservedValue==1){data.frequencySweepMode="A mode";}elseif(reservedValue==2){data.frequencySweepMode="B mode";}elseif(reservedValue==3){data.frequencySweepMode="C mode";}elseif(reservedValue==4){data.frequencySweepMode="D mode";}elseif(reservedValue==5){data.frequencySweepMode="E mode";}elseif(reservedValue==6){data.frequencySweepMode="All frequency sweep";}// drdata.dr=(bytes[3]>>4)&0x0f;// reptingdata.repting=((bytes[3]>>3)&0x01)==0?"false":"true";// temperatureReportPerioddata.temperatureReportPeriod=(((bytes[4]<<8)&0xff00)|(bytes[5]&0xff))*10+"s";// crcdata.crc=((bytes[6]<<8)&0xff00)|(bytes[7]&0xff);returndata;}// type: 0x2 HeartbeatfunctiondecodeHeartbeat(bytes){vardata={};// typedata.type="Heartbeat";// versiondata.version=bytes[0]&0x0f;// batterydata.battery=bytes[1]+"%";// rssidata.rssi=bytes[2]*-1+"dBm";// snrdata.snr=(((bytes[3]<<8)&0xff00)|(bytes[4]&0xff))/100;// temperatureif(0==((bytes[5]>>7)&0x01)){vartempInt=bytes[5]&0x7f;vartempFra=bytes[6];data.temperature=tempInt+"."+tempFra+"℃";}else{vartempInt=(bytes[5]&0x7f)*-1;vartempFra=bytes[6];data.temperature=tempInt+"."+tempFra+"℃";}// humiditydata.humidity=bytes[7]+"%";// crcdata.crc=((bytes[8]<<8)&0xff00)|(bytes[9]&0xff);returndata;}// type: 0xf AcknowledgmentfunctiondecodeAcknowledgment(bytes){vardata={};data.type="Acknowledgment";data.result=(bytes[0]&0x0f)==0?"Success":"Failure";data.msgId=(bytes[1]&0xff).toString(16).toUpperCase();returndata;}
// Decode decodes an array of bytes into an object.// - fPort contains the LoRaWAN fPort number// - bytes is an array of bytes, e.g. [225, 230, 255, 0]// - variables contains the device variables e.g. {"calibration": "3.5"} (both the key / value are of type string)// The function must return an object, e.g. {"temperature": 22.5}// Temperature & Humidity Sensor decoderfunctiondecodeUplink(input){// bytesvarbytes=input.bytes;// typevaruplinkType=(bytes[0]>>4)&0x0f;switch(uplinkType){case0x01:return{data:decodeRegistration(bytes)};case0x02:return{data:decodeHeartbeat(bytes)};case0x0f:return{data:decodeAcknowledgment(bytes)};default:returnnull;}}// type: 0x1 RegistrationfunctiondecodeRegistration(bytes){vardata={};data.type="Registration";// adrdata.adr = ((bytes[0] >> 3) & 0x1) == 0 ? "OFF" : "ON";// modevarmodeValue=bytes[0]&0x07;if(modeValue==0x01){data.mode="AU920";}elseif(modeValue==0x02){data.mode="CLAA";}elseif(modeValue==0x03){data.mode="CN470";}elseif(modeValue==0x04){data.mode="AS923";}elseif(modeValue==0x05){data.mode="EU433";}elseif(modeValue==0x06){data.mode="EU868";}elseif(modeValue==0x07){data.mode="US915";}// smodevarsmodeValue=bytes[1];if(smodeValue==0x01){data.smode="AU920";}elseif(smodeValue==0x02){data.smode="CLAA";}elseif(smodeValue==0x04){data.smode="CN470";}elseif(smodeValue==0x08){data.smode="AS923";}elseif(smodeValue==0x10){data.smode="EU433";}elseif(smodeValue==0x20){data.smode="EU868";}elseif(smodeValue==0x40){data.smode="US915";}// powerdata.power=((bytes[2]>>3)&0x1f)+"dBm";// reservedvarreservedValue=bytes[2]&0x07;if(reservedValue==1){data.frequencySweepMode="A mode";}elseif(reservedValue==2){data.frequencySweepMode="B mode";}elseif(reservedValue==3){data.frequencySweepMode="C mode";}elseif(reservedValue==4){data.frequencySweepMode="D mode";}elseif(reservedValue==5){data.frequencySweepMode="E mode";}elseif(reservedValue==6){data.frequencySweepMode="All frequency sweep";}// drdata.dr=(bytes[3]>>4)&0x0f;// reptingdata.repting=((bytes[3]>>3)&0x01)==0?"false":"true";// temperatureReportPerioddata.temperatureReportPeriod=(((bytes[4]<<8)&0xff00)|(bytes[5]&0xff))*10+"s";// crcdata.crc=((bytes[6]<<8)&0xff00)|(bytes[7]&0xff);returndata;}// type: 0x2 HeartbeatfunctiondecodeHeartbeat(bytes){vardata={};// typedata.type="Heartbeat";// versiondata.version=bytes[0]&0x0f;// batterydata.battery=bytes[1]+"%";// rssidata.rssi=bytes[2]*-1+"dBm";// snrdata.snr=(((bytes[3]<<8)&0xff00)|(bytes[4]&0xff))/100;// temperatureif(0==((bytes[5]>>7)&0x01)){vartempInt=bytes[5]&0x7f;vartempFra=bytes[6];data.temperature=tempInt+"."+tempFra+"℃";}else{vartempInt=(bytes[5]&0x7f)*-1;vartempFra=bytes[6];data.temperature=tempInt+"."+tempFra+"℃";}// humiditydata.humidity=bytes[7]+"%";// crcdata.crc=((bytes[8]<<8)&0xff00)|(bytes[9]&0xff);returndata;}// type: 0xf AcknowledgmentfunctiondecodeAcknowledgment(bytes){vardata={};data.type="Acknowledgment";data.result=(bytes[0]&0x0f)==0?"Success":"Failure";data.msgId=(bytes[1]&0xff).toString(16).toUpperCase();returndata;}
在ThingsBoard中创建集成
接下来,我们将在 ThingsBoard 中创建“The Things Industries”集成。