我需要帮助来组织节点红色的功能节点中的阵列。
当数据有效时(标志= A)...运行良好 当数据无效时(标志=否则)...错误分割。附加数组wifiAccessPoints(answer.wifiAccessPoints)不能像应该的那样进行拆分,例如:ssid,macAddress,signalStrength
下面只有四个wifiAccessPoints,但实际上可以更多。
// when flag = A
// IWAP01080524A2232.9806N11404.9355E000.1061830323.8706000908000102,460,0,9520,3671#
// when flag = else
// IWAP01080524V0000.0000N00000.0000E000.1061830323.8706000908000102,460,0,9520,3671,主页| 74-DE-2B-44-88-8C | 97&Home1 | 74-DE-2B-44-88-8C | 97&Home2 | 74-DE-2B-44-88-8C | 97&Home3 | 74-DE-2B-44-88-8C | 97#
let answer = {}
let elements = msg.payload.replace('#','').split(",") // this gives an array containing the bits
// elements[0] is the long string starting IWAP01
answer.command = elements[0].substr(0,6)
let dateStr = elements[0].substr(6,6) // eg "190215" 15th Feb 2019
answer.date = new Date(Number(dateStr.substr(0,2))+2000, Number(dateStr.substr(2,2))-1, dateStr.substr(4,2)) // 080524 - date
answer.valid = (elements[0].substr(12,1) === "A") // true or false - A or V
if (answer.valid) {
let degreesN = Number(elements[0].substr(13,2))
let minutesN = Number(elements[0].substr(15,7))
let ns = elements[0].substr(22,1) // N or S
let degreesE = Number(elements[0].substr(23,3))
let minutesE = Number(elements[0].substr(26,7))
let ew = elements[0].substr(33,1) // E or W
node.warn(`${degreesN} ${minutesN} ${ns} ${degreesE} ${minutesE} ${ew}`)
answer.latitude = degreesN + minutesN/60 // 2232.9806N
if (ns === "S") answer.latitude = -answer.latitude
answer.longitude = degreesE + minutesE/60
if (ew === "W") answer.longitude = -answer.longitude // 11404.9355E
} else {
answer.latitude = 0
answer.longitude = 0
}
answer.speedMoving = elements[0].substr(34,5) // 000.1
answer.angleDirection = elements[0].substr(45,6) // 323.87
answer.GSMsignal = elements[0].substr(51,3) // 060
answer.satellites = elements[0].substr(54,3) // 009
answer.batteryLevel = elements[0].substr(57,3) // 080
// LBS datas
answer.mobileCountryCode = elements[1] // 460
answer.mobileNetworkCode = elements[2] // 0
answer.locationAreaCode = elements[3] // 9520
answer.cellId = elements[4] // 3671
// WIFI bases only with flag = else
//
// answer.wifiAccessPoints = elements[5]
//
answer.wifiAccessPoints = []
if (answer.valid === "else") {
i = elements[4]+1 // move on to wifi bases
let wifiAccessPointsStrings = elements[5].split("&")
let j;
for (j=0; j<wifiAccessPointsStrings.length; j++) {
let baseElements = wifiAccessPointsStrings[j].split("|")
answer.wifiAccessPoints.push({ssid: baseElements[0], macAddress: baseElements[1], signalStrength: baseElements[2]}) // Home|74-DE-2B-44-88-8C|97&Home1|74-DE-2B-44-88-8C|97&Home2|74-DE-2B-44-88-8C|97&Home3|74-DE-2B-44-88-8C|97
}
}
msg.payload = answer
return msg
答案 0 :(得分:0)
假设,主要问题是在这一行中检查'else'
与false
的给定值
answer.valid = elements[0].substr(12, 1) === "A"
以供以后在此行中检查
if (answer.valid === "else") { // wrong, answer.valid contains a boolean
替换为
if (!answer.valid) {
,并通过省略未使用的赋值给未声明的值,
i = elements[4] + 1 // ns: i never used
它应该运行。
请测试结果并提供反馈。
function functionWithoutAnInterestingName(msg) {
let answer = {}
let elements = msg.payload.replace('#', '').split(",") // this gives an array containing the bits
// elements[0] is the long string starting IWAP01
answer.command = elements[0].substr(0, 6)
let dateStr = elements[0].substr(6, 6) // eg "190215" 15th Feb 2019
answer.date = new Date(Number(dateStr.substr(0, 2)) + 2000, Number(dateStr.substr(2, 2)) - 1, dateStr.substr(4, 2)) // 080524 - date
answer.valid = elements[0].substr(12, 1) === "A" // true or false - A or V
if (answer.valid) {
let degreesN = Number(elements[0].substr(13, 2))
let minutesN = Number(elements[0].substr(15, 7))
let ns = elements[0].substr(22, 1) // N or S
let degreesE = Number(elements[0].substr(23, 3))
let minutesE = Number(elements[0].substr(26, 7))
let ew = elements[0].substr(33, 1) // E or W
// ns: node does not exist!
// node.warn(`${degreesN} ${minutesN} ${ns} ${degreesE} ${minutesE} ${ew}`)
console.log(`${degreesN} ${minutesN} ${ns} ${degreesE} ${minutesE} ${ew}`)
answer.latitude = degreesN + minutesN / 60 // 2232.9806N
if (ns === "S") answer.latitude = -answer.latitude
answer.longitude = degreesE + minutesE / 60
if (ew === "W") answer.longitude = -answer.longitude // 11404.9355E
} else {
answer.latitude = 0
answer.longitude = 0
}
answer.speedMoving = elements[0].substr(34, 5) // 000.1
answer.angleDirection = elements[0].substr(45, 6) // 323.87
answer.GSMsignal = elements[0].substr(51, 3) // 060
answer.satellites = elements[0].substr(54, 3) // 009
answer.batteryLevel = elements[0].substr(57, 3) // 080
// LBS datas
answer.mobileCountryCode = elements[1] // 460
answer.mobileNetworkCode = elements[2] // 0
answer.locationAreaCode = elements[3] // 9520
answer.cellId = elements[4] // 3671
// WIFI bases only with flag = else
//
// answer.wifiAccessPoints = elements[5]
//
answer.wifiAccessPoints = []
if (!answer.valid) {
//i = elements[4] + 1 // ns: i never used // move on to wifi bases
let wifiAccessPointsStrings = elements[5].split("&")
let j;
for (j = 0; j < wifiAccessPointsStrings.length; j++) {
let baseElements = wifiAccessPointsStrings[j].split("|")
answer.wifiAccessPoints.push({ ssid: baseElements[0], macAddress: baseElements[1], signalStrength: baseElements[2] }) // Home|74-DE-2B-44-88-8C|97&Home1|74-DE-2B-44-88-8C|97&Home2|74-DE-2B-44-88-8C|97&Home3|74-DE-2B-44-88-8C|97
}
}
msg.payload = answer
return msg
}
var a = 'IWAP01080524A2232.9806N11404.9355E000.1061830323.8706000908000102,460,0,9520,3671#',
b = 'IWAP01080524V0000.0000N00000.0000E000.1061830323.8706000908000102,460,0,9520,3671,Home|74-DE-2B-44-88-8C|97&Home1|74-DE-2B-44-88-8C|97&Home2|74-DE-2B-44-88-8C|97&Home3|74-DE-2B-44-88-8C|97#';
console.log(functionWithoutAnInterestingName({ payload: a }));
console.log(functionWithoutAnInterestingName({ payload: b }));
.as-console-wrapper { max-height: 100% !important; top: 0; }