GPS的數據格式是DDMM.MMMMMM
獲取到的GPS幀數據比如是:$GNRMC,112317.000,A,3438.1633,N,11224.4992,E,0.19,186.95,240916,,,A*7D
說明
經度112°24.4992′
緯度34°38.1633′
OneNet支持的GPS數據經測試是DD.DDDDD,因此需要轉換
經度為 112+24.4992/60 = 112.40832
緯度為 34+38.1633/60 = 34.636055
上傳到GPS的數據流為
{"datastreams":[{"id":"location","datapoints":[{"value":{"lon":112.40832,"lat":34.636055}}]}]}
OneNet的GPS坐標是經過百度地圖糾偏過的,所以這部分轉換交給平台,直接上傳上面的數據即可
用Arduino測試下轉換計算過程:
char lon_str[] = "11224.4992";
char lat_str[] = "3438.1633";
double longitudeToOnenetFormat()
{
double lon_temp = 0;
long lon_Onenet = 0;
int dd_int = 0;
long mm_int = 0;
double lon_Onenet_double = 0;
lon_temp = atof(lon_str);
lon_Onenet =lon_temp*100000; //轉換為整數
dd_int = lon_Onenet/10000000; //取出dd
mm_int = lon_Onenet%10000000; //取出MM部分
lon_Onenet_double = dd_int + (double)mm_int/60/100000;//換算為Onenet格式
return lon_Onenet_double;
}
double latitudeToOnenetFormat()
{
double lat_temp = 0;
long lat_Onenet = 0;
int dd_int = 0;
long mm_int = 0;
double lat_Onenet_double = 0;
lat_temp = atof(lat_str);
lat_Onenet =lat_temp*100000; //轉換為整數
dd_int = lat_Onenet/10000000; //取出dd
mm_int = lat_Onenet%10000000; //取出MM部分
lat_Onenet_double = dd_int + (double)mm_int/60/100000;//換算為Onenet格式
return lat_Onenet_double;
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.println(longitudeToOnenetFormat(),5);
Serial.println(latitudeToOnenetFormat(),5);
}
void loop(){
}
串口計算后輸出內容
用到double類型,略微有偏差,這個偏差經過計算大概在地圖上能差別1米內
112.40832
34.63605
