設置 GPS + Wifi 模組
圖出處: (連結)
請依照圖示安裝好 Wifi, GPS 天線就好了。 (安裝天線請記得拔除電源)設置 Cloud Sandbox 平台
我們要讓資料呈現在雲端,可以利用 Cloud Sandbox 平台處理。網址: https://mcs.mediatek.com/
請註冊後進入 Cloud Sandbox (https://mcs.mediatek.com/v2console/) 的後台。
1. 選擇 Develop with LinkIt ONE
2. 請在左上角選擇 Prototype
3. 新建一個 Prototype
4. 填寫 Prototype 資料:
5. 選擇剛剛建立的 Prototype: (按下 Detail)
6. 新增一個 Channel 來顯示 GPS 資訊 (選擇 Controller -> Add):
7. 接著設定 Data type 為 GPS (下拉選單):
8. 建立好 channel 之後,現在要新增裝置:
9. 接著可以到 Test Device 找到剛剛新增 "裝置" 的 DeviceId 和 DeviceKey。
Arduino 取得 GPS 訊號
Examples -> LGPS -> GPS 範例如下:#include <LGPS.h>
gpsSentenceInfoStruct info;
char buff[256];
static unsigned char getComma(unsigned char num,const char *str)
{
unsigned char i,j = 0;
int len=strlen(str);
for(i = 0;i < len;i ++)
{
if(str[i] == ',')
j++;
if(j == num)
return i + 1;
}
return 0;
}
static double getDoubleNumber(const char *s)
{
char buf[10];
unsigned char i;
double rev;
i=getComma(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
rev=atof(buf);
return rev;
}
static double getIntNumber(const char *s)
{
char buf[10];
unsigned char i;
double rev;
i=getComma(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
rev=atoi(buf);
return rev;
}
void parseGPGGA(const char* GPGGAstr)
{
/* Refer to http://www.gpsinformation.org/dale/nmea.htm#GGA
* Sample data: $GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47
* Where:
* GGA Global Positioning System Fix Data
* 123519 Fix taken at 12:35:19 UTC
* 4807.038,N Latitude 48 deg 07.038' N
* 01131.000,E Longitude 11 deg 31.000' E
* 1 Fix quality: 0 = invalid
* 1 = GPS fix (SPS)
* 2 = DGPS fix
* 3 = PPS fix
* 4 = Real Time Kinematic
* 5 = Float RTK
* 6 = estimated (dead reckoning) (2.3 feature)
* 7 = Manual input mode
* 8 = Simulation mode
* 08 Number of satellites being tracked
* 0.9 Horizontal dilution of position
* 545.4,M Altitude, Meters, above mean sea level
* 46.9,M Height of geoid (mean sea level) above WGS84
* ellipsoid
* (empty field) time in seconds since last DGPS update
* (empty field) DGPS station ID number
* *47 the checksum data, always begins with *
*/
double latitude;
double longitude;
int tmp, hour, minute, second, num ;
if(GPGGAstr[0] == '$')
{
tmp = getComma(1, GPGGAstr);
hour = (GPGGAstr[tmp + 0] - '0') * 10 + (GPGGAstr[tmp + 1] - '0');
minute = (GPGGAstr[tmp + 2] - '0') * 10 + (GPGGAstr[tmp + 3] - '0');
second = (GPGGAstr[tmp + 4] - '0') * 10 + (GPGGAstr[tmp + 5] - '0');
sprintf(buff, "UTC timer %2d-%2d-%2d", hour, minute, second);
Serial.println(buff);
tmp = getComma(2, GPGGAstr);
latitude = getDoubleNumber(&GPGGAstr[tmp]);
tmp = getComma(4, GPGGAstr);
longitude = getDoubleNumber(&GPGGAstr[tmp]);
sprintf(buff, "latitude = %10.4f, longitude = %10.4f", latitude, longitude);
Serial.println(buff);
tmp = getComma(7, GPGGAstr);
num = getIntNumber(&GPGGAstr[tmp]);
sprintf(buff, "satellites number = %d", num);
Serial.println(buff);
}
else
{
Serial.println("Not get data");
}
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
LGPS.powerOn();
Serial.println("LGPS Power on, and waiting ...");
delay(3000);
}
void loop() {
// put your main code here, to run repeatedly:
Serial.println("LGPS loop");
LGPS.getData(&info);
Serial.println((char*)info.GPGGA); //可以更換為 GPGGA,GPGSA,GPGSV,GPRMC 格式
parseGPGGA((const char*)info.GPGGA);
delay(2000);
}
利用 Wifi 傳送 GPS 訊號到 Cloud Platform
(原出處: http://www.instructables.com/id/LinkIt-ONE-GPS-Tracker-MediaTek-Cloud-Sandbox-tuto/)請先安裝 HttpClient Library: https://github.com/amcewen/HttpClient
connect.ino
void AP_connect(){
Serial.print("Connecting to AP...");
while (0 == LWiFi.connect(WIFI_AP, LWiFiLoginInfo(WIFI_AUTH, WIFI_PASSWORD)))
{
Serial.print(".");
delay(500);
}
Serial.println("Success!");
Serial.print("Connecting site...");
while (!c2.connect(SITE_URL, 80))
{
Serial.print(".");
delay(500);
}
Serial.println("Success!");
delay(100);
}
void getconnectInfo(){
//calling RESTful API to get TCP socket connection
c2.print("GET /mcs/v2/devices/");
c2.print(DEVICEID);
c2.println("/connections.csv HTTP/1.1");
c2.print("Host: ");
c2.println(SITE_URL);
c2.print("deviceKey: ");
c2.println(DEVICEKEY);
c2.println("Connection: close");
c2.println();
delay(500);
int errorcount = 0;
Serial.print("waiting for HTTP response...");
while (!c2.available())
{
Serial.print(".");
errorcount += 1;
delay(150);
}
Serial.println();
int err = http.skipResponseHeaders();
int bodyLen = http.contentLength();
char c;
int ipcount = 0;
int count = 0;
int separater = 0;
while (c2)
{
int v = (int)c2.read();
if (v != -1)
{
c = v;
//Serial.print(c);
connection_info[ipcount]=c;
if(c==',')
separater=ipcount;
ipcount++;
}
else
{
Serial.println("no more content, disconnect");
c2.stop();
}
}
//connection_info[ipcount]=NULL;
int i;
for(i=0;i<separater;i++)
{ ip[i]=connection_info[i];
}
int j=0;
separater++;
for(i=separater;i<21 && j<5 && i < ipcount;i++)
{ port[j]=connection_info[i];
j++;
}
//port[j] = NULL;
portnum = atoi (port);
} //getconnectInfo
void connectTCP(){
//establish TCP connection with TCP Server with designate IP and Port
c.stop();
Serial.print("Connecting to TCP...");
while (0 == c.connect(ip, portnum))
{
Serial.println("Re-Connecting to TCP");
delay(1000);
}
c.println(tcpdata);
c.println();
Serial.println("Success!");
} //connectTCP
void heartBeat(){
Serial.println("send TCP heartBeat");
c.println(tcpdata);
c.println();
} //heartBeat
GPS.ino
static unsigned char getComma(unsigned char num,const char *str)
{
unsigned char i,j = 0;
int len=strlen(str);
for(i = 0;i < len;i ++)
{
if(str[i] == ',')
j++;
if(j == num)
return i + 1;
}
return 0;
}
static double getDoubleNumber(const char *s)
{
char buf[10];
unsigned char i;
double rev;
i=getComma(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
rev=atof(buf);
return rev;
}
static double getIntNumber(const char *s)
{
char buf[10];
unsigned char i;
double rev;
i=getComma(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
rev=atoi(buf);
return rev;
}
void parseGPGGA(const char* GPGGAstr)
{
/* Refer to http://www.gpsinformation.org/dale/nmea.htm#GGA
* Sample data: $GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47
* Where:
* GGA Global Positioning System Fix Data
* 123519 Fix taken at 12:35:19 UTC
* 4807.038,N Latitude 48 deg 07.038' N
* 01131.000,E Longitude 11 deg 31.000' E
* 1 Fix quality: 0 = invalid
* 1 = GPS fix (SPS)
* 2 = DGPS fix
* 3 = PPS fix
* 4 = Real Time Kinematic
* 5 = Float RTK
* 6 = estimated (dead reckoning) (2.3 feature)
* 7 = Manual input mode
* 8 = Simulation mode
* 08 Number of satellites being tracked
* 0.9 Horizontal dilution of position
* 545.4,M Altitude, Meters, above mean sea level
* 46.9,M Height of geoid (mean sea level) above WGS84
* ellipsoid
* (empty field) time in seconds since last DGPS update
* (empty field) DGPS station ID number
* *47 the checksum data, always begins with *
*/
int tmp, hour, minute, second, num ;
if(GPGGAstr[0] == '$')
{
tmp = getComma(1, GPGGAstr);
hour = (GPGGAstr[tmp + 0] - '0') * 10 + (GPGGAstr[tmp + 1] - '0');
minute = (GPGGAstr[tmp + 2] - '0') * 10 + (GPGGAstr[tmp + 3] - '0');
second = (GPGGAstr[tmp + 4] - '0') * 10 + (GPGGAstr[tmp + 5] - '0');
sprintf(buff, "UTC timer %2d-%2d-%2d", hour, minute, second);
//Serial.println(buff);
tmp = getComma(2, GPGGAstr);
latitude = getDoubleNumber(&GPGGAstr[tmp])/100.0;
int latitude_int=floor(latitude);
double latitude_decimal=(latitude-latitude_int)*100.0/60.0;
latitude=latitude_int+latitude_decimal;
tmp = getComma(4, GPGGAstr);
longitude = getDoubleNumber(&GPGGAstr[tmp])/100.0;
int longitude_int=floor(longitude);
double longitude_decimal=(longitude-longitude_int)*100.0/60.0;
longitude=longitude_int+longitude_decimal;
sprintf(buff, "latitude = %10.4f, longitude = %10.4f", latitude, longitude);
//Serial.println(buff);
tmp = getComma(7, GPGGAstr);
num = getIntNumber(&GPGGAstr[tmp]);
sprintf(buff, "satellites number = %d", num);
//Serial.println(buff);
}
else
{
Serial.println("Not get data");
}
}
void GPS_receive() {
LGPS.getData(&info);
//Serial.println((char*)info.GPGGA);
parseGPGGA((const char*)info.GPGGA);
}
upload.ino
void uploadstatus(){//calling RESTful API to upload datapoint to MCS to report LED status
while (!c2.connect(SITE_URL, 80))
{
Serial.print(".");
delay(500);
}
delay(100);
if(digitalRead(13)==1)
upload_led = "LED_DISPLAY,,1";
else
upload_led = "LED_DISPLAY,,0";
int thislength = upload_led.length();
HttpClient http(c2);
c2.print("POST /mcs/v2/devices/");
c2.print(DEVICEID);
c2.println("/datapoints.csv HTTP/1.1");
c2.print("Host: ");
c2.println(SITE_URL);
c2.print("deviceKey: ");
c2.println(DEVICEKEY);
c2.print("Content-Length: ");
c2.println(thislength);
c2.println("Content-Type: text/csv");
c2.println("Connection: close");
c2.println();
c2.println(upload_led);
delay(500);
int errorcount = 0;
while (!c2.available())
{
Serial.print(".");
delay(100);
}
int err = http.skipResponseHeaders();
int bodyLen = http.contentLength();
while (c2)
{
int v = c2.read();
if (v != -1)
{
Serial.print(char(v));
}
else
{
Serial.println("no more content, disconnect");
c2.stop();
}
}
Serial.println();
}
void uploadGPS(){
while (!c2.connect(SITE_URL, 80))
{
Serial.print(".");
delay(500);
}
delay(100);
float latitude_post=latitude;
float longitude_post=longitude;
Serial.printf("latitude=%.4f\tlongitude=%.4f\n",latitude,longitude);
if(latitude>-90 && latitude<=90 && longitude>=0 && longitude<360){
sprintf(buffer_latitude, "%.4f", latitude);
sprintf(buffer_longitude, "%.4f", longitude);
}
String upload_GPS = "GPS,,"+String(buffer_latitude)+","+String(buffer_longitude)+","+"0"+"\n"+"LATITUDE,,"+buffer_latitude+"\n"+"LONGITUDE,,"+buffer_longitude;//null altitude
int GPS_length = upload_GPS.length();
HttpClient http(c2);
c2.print("POST /mcs/v2/devices/");
c2.print(DEVICEID);
c2.println("/datapoints.csv HTTP/1.1");
c2.print("Host: ");
c2.println(SITE_URL);
c2.print("deviceKey: ");
c2.println(DEVICEKEY);
c2.print("Content-Length: ");
c2.println(GPS_length);
c2.println("Content-Type: text/csv");
c2.println("Connection: close");
c2.println();
c2.println(upload_GPS);
delay(500);
int errorcount = 0;
while (!c2.available())
{
Serial.print(".");
delay(100);
}
int err = http.skipResponseHeaders();
int bodyLen = http.contentLength();
while (c2)
{
int v = c2.read();
if (v != -1)
{
Serial.print(char(v));
}
else
{
Serial.println("no more content, disconnect");
c2.stop();
}
}
Serial.println();
}
main.ino
#include <LGPRS.h>
#include <LGPRSClient.h>
#include <LGPRSServer.h>
#include <LGPS.h>
#include <HttpClient.h>
#include <LTask.h>
#include <LWiFi.h>
#include <LWiFiClient.h>
#include <LDateTime.h>
#define WIFI_AP "WIFI 名稱"
#define WIFI_PASSWORD "WIFI 密碼"
#define WIFI_AUTH LWIFI_WPA // choose from LWIFI_OPEN, LWIFI_WPA, or LWIFI_WEP.
#define per 50
#define per1 3
#define DEVICEID "裝置 ID"
#define DEVICEKEY "裝置 key"
#define SITE_URL "api.mediatek.com"
gpsSentenceInfoStruct info;
char buff[256];
double latitude;
double longitude;
char buffer_latitude[8];
char buffer_longitude[8];
LGPRSClient c; //用註解掉方式選擇用 gprs 或 wifi 連接
//LWiFiClient c;
unsigned int rtc;
unsigned int lrtc;
unsigned int rtc1;
unsigned int lrtc1;
char port[4]={0};
char connection_info[21]={0};
char ip[15]={0};
int portnum;
int val = 0;
String tcpdata = String(DEVICEID) + "," + String(DEVICEKEY) + ",0";
String tcpcmd_led_on = "LED_CONTROL,1";
String tcpcmd_led_off = "LED_CONTROL,0";
String upload_led;
//LGPRSClient c2; //用註解方式選擇採用 gprs 或 wifi 連接
LWiFiClient c2; //選擇採用 wifi 連接
HttpClient http(c2);
void setup()
{
pinMode(13, OUTPUT);
LTask.begin();
LWiFi.begin();
Serial.begin(115200);
LGPS.powerOn();
//while(!Serial);
AP_connect();
getconnectInfo();
connectTCP();
Serial.println("==============================");
}
void loop()
{
String tcpcmd="";
while (c.available())
{
int v = c.read();
if (v != -1)
{
Serial.print((char)v);
tcpcmd += (char)v;
if (tcpcmd.substring(40).equals(tcpcmd_led_on)){
digitalWrite(13, HIGH);
Serial.print("Switch LED ON ");
tcpcmd="";
}else if(tcpcmd.substring(40).equals(tcpcmd_led_off)){
digitalWrite(13, LOW);
Serial.print("Switch LED OFF");
tcpcmd="";
}
}
}
LDateTime.getRtc(&rtc);
if ((rtc - lrtc) >= per) {
heartBeat();
lrtc = rtc;
}
//Check for report datapoint status interval
LDateTime.getRtc(&rtc1);
if ((rtc1 - lrtc1) >= per1) {
uploadstatus();
GPS_receive();
uploadGPS();
lrtc1 = rtc1;
}
}
設定後,上傳到 LinkIt ONE,並到 Cloud Sandbox: Development -> Test Devices,對剛剛新增的 gpsdevice 按下 detail:
進入詳細後,可以在 data channel 選擇 history:
拖曳拉霸後可以找到詳細時間點:
Reference:
https://docs.labs.mediatek.com/resource/linkit-one/en/tutorials/car-tracker
https://mcs.mediatek.com/v2console/
https://docs.labs.mediatek.com/resource/linkit-one/en/tutorials
http://labs.mediatek.com/api/linkit-one/frames.html?frmname=topic&amp;frmfile=index.html
MediaTek_LinkIt_ONE_Developers_Guide_v1_3.pdf
https://mcs.mediatek.com/
http://makerpro.cc/2015/06/six-steps-to-run-linkit-one%CA%BBs-gps-function/
http://www.instructables.com/id/LinkIt-ONE-GPS-Tracker-MediaTek-Cloud-Sandbox-tuto/
http://blog.cavedu.com/%E7%89%A9%E8%81%AF%E7%B6%B2/linkit/linkit-one-%E6%95%99%E5%AD%B8-mediatek-cloud-sandbox-%E6%8E%A7%E5%88%B6-led-%E4%B8%A6%E6%AA%A2%E8%A6%96%E7%8B%80%E6%85%8B-%E5%8F%AF%E5%90%8C%E6%99%82%E7%94%A8%E6%89%8B%E6%A9%9F%E8%88%87%E7%B6%B2/
https://github.com/amcewen/HttpClient
https://www.alliotcloud.com/media/singl.php?aid=120
Resource about GPS Meta Format, please reference follow this line:
https://rl.se/gprmc
http://b8807053.pixnet.net/blog/post/3610870-gps%E8%B3%87%E6%96%99%E6%A0%BC%E5%BC%8F
http://aprs.gids.nl/nmea/
http://www.gpsinformation.org/dale/nmea.htm
http://www.findlatitudeandlongitude.com/
http://yehnan.blogspot.tw/2015/03/linkit-onegps.html
Resource about Cloud Sandbox, please click follow this picture:

沒有留言:
張貼留言