// Decode uplink function.//// Input is an object with the following fields:// - bytes = Byte array containing the uplink payload, e.g. [255, 230, 255, 0]// - fPort = Uplink fPort.// - variables = Object containing the configured device variables.//// Output must be an object with the following fields:// - data = Object representing the decoded payload.// Valve Positioning Sensor decoderfunctiondecodeUplink(input){// bytesvarbytes=input.bytes;// typevaruplinkType=(bytes[0]>>4)&0x0f;switch(uplinkType){case0x01:return{data:decodeRegistration(bytes)};case0x02:return{data:decodeHeartbeat(bytes)};case0x03:return{data:decodeVceState(bytes)};default:returnnull;}}// type: 0x01 RegistrationfunctiondecodeRegistration(bytes){vardata={};data.type="Registration";data.adr=((bytes[0]>>3)&0x1)==0?"OFF":"ON";data.power=((bytes[2]>>3)&0x1f)+"dBm";data.dr=(bytes[3]>>4)&0x0f;data.gnssEnable=((bytes[3]>>3)&0x01)==0?"Disable":"Enable";varpositionModeValue=(bytes[3]>>1)&0x03;if(positionModeValue==0){data.positionMode="Period";}elseif(positionModeValue==1){data.positionMode="Autonomous";}elseif(positionModeValue==2){data.positionMode="Demand";}data.bleEnable=(bytes[3]&0x01)==0?"Disable":"Enable";data.blePositionReportInterval=(((bytes[4]<<8)&0xff00)|(bytes[5]&0xff))*5+"s";data.gnssPositionReportInterval=(((bytes[6]<<8)&0xff00)|(bytes[7]&0xff))*5+"s";data.heartbeatReportInterval=(bytes[8]&0xff)*30+"s";data.version=(bytes[9]&0xff).toString(16).toUpperCase()+"."+(bytes[10]&0xff).toString(16).toUpperCase();data.cfmsg="1 Confirmed every "+(bytes[11]&0xff)+" Heartbeat";data.hbCount="Disconnect Judgement "+(bytes[12]&0xff);data.fallDetection=(bytes[13]&0xff)*0.5+" meters";returndata;}// type: 0x02 HeartbeatfunctiondecodeHeartbeat(bytes){vardata={};data.type="Heartbeat";data.battery=bytes[1]+"%";data.rssi=bytes[2]*-1+"dBm";data.snr=(((bytes[3]<<8)&0xff00)|(bytes[4]&0xff))/100+"dB";vargnssStateValue=(bytes[5]>>4)&0x0f;if(gnssStateValue==0){data.gnssState="Off";}elseif(gnssStateValue==1){data.gnssState="Boot GNSS";}elseif(gnssStateValue==2){data.gnssState="Locating";}elseif(gnssStateValue==3){data.gnssState="Located";}elseif(gnssStateValue==9){data.gnssState="No signal";}data.moveState=bytes[5]&0x0f;varchargeStateValue=(bytes[6]>>4)&0x0f;if(chargeStateValue==0){data.chargeState="Power cable disconnected";}elseif(chargeStateValue==5){data.chargeState="Charging";}elseif(chargeStateValue==6){data.chargeState="Charge complete";}returndata;}// type: 0x03 VceStatefunctiondecodeVceState(bytes){vardata={};data.type="VceState";vardirectionValue=(bytes[1]>>7)&0x01;if(directionValue==0){data.direction="CW";}elseif(directionValue==1){data.direction="CCW";}varvceValue=bytes[5]&0x0f;if(vceValue==0){data.vceState="Close";}elseif(vceValue==1){data.vceState="Open";}elseif(vceValue==2){data.vceState="HalfOpen";}returndata;}functionhex2float(num){varsign=num&0x80000000?-1:1;varexponent=((num>>23)&0xff)-127;varmantissa=1+(num&0x7fffff)/0x7fffff;returnsign*mantissa*Math.pow(2,exponent);}functiontimestampToTime(timestamp){constdate=newDate(timestamp);constyear=date.getFullYear();constmonth=(date.getMonth()+1).toString().padStart(2,"0");constday=date.getDate().toString().padStart(2,"0");consthour=date.getHours().toString().padStart(2,"0");constminute=date.getMinutes().toString().padStart(2,"0");constsecond=date.getSeconds().toString().padStart(2,"0");return`${year}-${month}-${day}${hour}:${minute}:${second}`;}
// Decode uplink function.//// Input is an object with the following fields:// - bytes = Byte array containing the uplink payload, e.g. [255, 230, 255, 0]// - fPort = Uplink fPort.// - variables = Object containing the configured device variables.//// Output must be an object with the following fields:// - data = Object representing the decoded payload.// Valve Positioning Sensor decoderfunctiondecodeUplink(input){// bytesvarbytes=input.bytes;// typevaruplinkType=(bytes[0]>>4)&0x0f;switch(uplinkType){case0x01:return{data:decodeRegistration(bytes)};case0x02:return{data:decodeHeartbeat(bytes)};case0x03:return{data:decodeVceState(bytes)};default:returnnull;}}// type: 0x01 RegistrationfunctiondecodeRegistration(bytes){vardata={};data.type="Registration";data.adr=((bytes[0]>>3)&0x1)==0?"OFF":"ON";data.power=((bytes[2]>>3)&0x1f)+"dBm";data.dr=(bytes[3]>>4)&0x0f;data.gnssEnable=((bytes[3]>>3)&0x01)==0?"Disable":"Enable";varpositionModeValue=(bytes[3]>>1)&0x03;if(positionModeValue==0){data.positionMode="Period";}elseif(positionModeValue==1){data.positionMode="Autonomous";}elseif(positionModeValue==2){data.positionMode="Demand";}data.bleEnable=(bytes[3]&0x01)==0?"Disable":"Enable";data.blePositionReportInterval=(((bytes[4]<<8)&0xff00)|(bytes[5]&0xff))*5+"s";data.gnssPositionReportInterval=(((bytes[6]<<8)&0xff00)|(bytes[7]&0xff))*5+"s";data.heartbeatReportInterval=(bytes[8]&0xff)*30+"s";data.version=(bytes[9]&0xff).toString(16).toUpperCase()+"."+(bytes[10]&0xff).toString(16).toUpperCase();data.cfmsg="1 Confirmed every "+(bytes[11]&0xff)+" Heartbeat";data.hbCount="Disconnect Judgement "+(bytes[12]&0xff);data.fallDetection=(bytes[13]&0xff)*0.5+" meters";returndata;}// type: 0x02 HeartbeatfunctiondecodeHeartbeat(bytes){vardata={};data.type="Heartbeat";data.battery=bytes[1]+"%";data.rssi=bytes[2]*-1+"dBm";data.snr=(((bytes[3]<<8)&0xff00)|(bytes[4]&0xff))/100+"dB";vargnssStateValue=(bytes[5]>>4)&0x0f;if(gnssStateValue==0){data.gnssState="Off";}elseif(gnssStateValue==1){data.gnssState="Boot GNSS";}elseif(gnssStateValue==2){data.gnssState="Locating";}elseif(gnssStateValue==3){data.gnssState="Located";}elseif(gnssStateValue==9){data.gnssState="No signal";}data.moveState=bytes[5]&0x0f;varchargeStateValue=(bytes[6]>>4)&0x0f;if(chargeStateValue==0){data.chargeState="Power cable disconnected";}elseif(chargeStateValue==5){data.chargeState="Charging";}elseif(chargeStateValue==6){data.chargeState="Charge complete";}returndata;}// type: 0x03 VceStatefunctiondecodeVceState(bytes){vardata={};data.type="VceState";vardirectionValue=(bytes[1]>>7)&0x01;if(directionValue==0){data.direction="CW";}elseif(directionValue==1){data.direction="CCW";}varvceValue=bytes[5]&0x0f;if(vceValue==0){data.vceState="Close";}elseif(vceValue==1){data.vceState="Open";}elseif(vceValue==2){data.vceState="HalfOpen";}returndata;}functionhex2float(num){varsign=num&0x80000000?-1:1;varexponent=((num>>23)&0xff)-127;varmantissa=1+(num&0x7fffff)/0x7fffff;returnsign*mantissa*Math.pow(2,exponent);}functiontimestampToTime(timestamp){constdate=newDate(timestamp);constyear=date.getFullYear();constmonth=(date.getMonth()+1).toString().padStart(2,"0");constday=date.getDate().toString().padStart(2,"0");consthour=date.getHours().toString().padStart(2,"0");constminute=date.getMinutes().toString().padStart(2,"0");constsecond=date.getSeconds().toString().padStart(2,"0");return`${year}-${month}-${day}${hour}:${minute}:${second}`;}
在ThingsBoard中创建集成
接下来,我们将在 ThingsBoard 中创建“The Things Industries”集成。