Hi,
Actually working on a new project, I'm looking to implement MLS /ichnaea/api/geolocate in Node-Red. I saw possible nodes like Skyhook (node-red-contrib-skyhook) but I really would prefer the Mozilla locating service.
Actually I'm receiving the basic infos from a 2G simcard device (gps+wifi+lbs) in Node-Red. With help, I've built a function node in javaScript in Node-Red which can decode the infos from a specific protocole and translate in a more human language.
I would like to know the way to integrate use the API service to get back the positions. I don't know how to write ...
Someone who can help to run my test, please?
Here is the js code actually collecting the datas with flag = A and flag = else:
###################################START###################################
// flag = A
//IWAP01080524A2232.9806N11404.9355E000.1061830323.8706000908000102,460,0,9520,3671#
// flag = else
//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#
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.signalStrength = 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]
let i;
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
###################################END#####################################
Geolocate requests are submitted using a POST request to the URL:
https://location.services.mozilla.com/v1/geolocate?key=<XXXXXX>
A minimal example using only WiFi networks:
{
"wifiAccessPoints": [{
"macAddress": "macAddressDatasFromNodeRedjavascript",
"signalStrength": signalStrengthDatasFromNodeRedjavascript
}, {
"ssid": "ssidDatasFromNodeRedjavascript"
}]
}
A minimal example using a cell network:
{
"cellTowers": [{
"mobileCountryCode": mobileCountryCodeDatasFromNodeRedjavascript,
"mobileNetworkCode": mobileNetworkCodeDatasNodeRedjavascript,
"locationAreaCode": locationAreaCodeDatasNodeRedjavascript,
"cellId": cellIdDatasFromNodeRedjavascript,
"signalStrength": signalStrengthDatasNodeRedjavascript
}]
}