GPS – מיקום של דברים בזמן אמת

מודול עקיבה בזמן אמת עבור חפצים/אנשים/בעלי חיים/מכוניות.

הפרויקט שמוצג כאן הוא לצורך "בדיקת היתכנות" של מודול עקיבה GPS באמצעות שרת WEB. כל מה שמוצג כאן הוא על אחריות המשתמש ואין לאתר או למחבר הפוסט שום אחריות למוצג כאן כולל לכל נזק שייגרם. המשך הקריאה על אחריותכם בלבד!
כמו כן במדריך זה אין כל התייחסות לנושא אבטחת מידע וסייבר. הוא לצורך "בדיקת היתכנות" בלבד (POC) קבצי השרת פגיעים וכל מי שירצה יהיה לו גישה אליהם.כמו כן התקשורת בין החבילה לשרת ובין הלקוח לשרת לא מוצפנת וזמינה לכל. בחלק הבא תהיה התייחסות גם לנושא זה.

1.היחידה אחריה נעקוב (להלן החבילה) תהיה מורכבת מ:

  • בקר (ארדואינו)
  • מודול GPS ע"מ לדעת מיקום (SIM808)
  • מודול GSM לצורך התקשרות עם שרת WEB ע"מ לדווח לו את המיקום.(SIM808)

2.היישום בענן/שרת אינטרנט יהיה מורכב מקובץ PHP שאליו החבילה תדווח על מיקומה ,המיקום ישמר ולקוח שירצה מידע על מיקום החבילה יקבל זאת בצורת JSON.

3.הלקוח זה דף HTML עם מפות של גוגל שמתעדכן כל כמה שניות ע"י JSON עם פרטי מיקום החבילה אותו הוא מבקש מהשרת/ענן.

gps-tracker

בציור:

שלב 1 – החבילה מזהה מיקום באמצעות GPS.

שלב 2 – החבילה מדווחת מיקום לשרת.

שלב 3 – לקוח מבקש מידע על המיקום של החבילה מהשרת , מקבל אותו ומציג אותו ע"ג מפה.

רכיבים:

  1. מגן SIM808
  2. ארדואינו אונו
  3. כבל לארדואינו
  4. סוללה להטענת טלפון נייד(אופציונאלי).

shield

sim808-arduino

בנוסף יש צורך בשרת שיכול להריץ PHP ושזמין מהאינטרנט (לא יכוסה במדריך זה).

נחבר את המגן לארדואינו ונחבר את הארדואינו למחשב עם הכבל – בצורה כזאת גם ה SIM808 מקבל מתח.

הקוד:

/**
 *
 * GPS Adapted From Adafruit_FONA lib:
 * Copyright: 2015 Adafruit
 * Author: Todd Treece
 * Licence: MIT
 * Adapted by https://iot.org.il
 **/
 
#include "Adafruit_FONA.h" //lib for the sim808 shield
#include <string.h>
#include <SoftwareSerial.h> //for communicating with sim808

#define FONA_RX 8
#define FONA_TX 7
#define FONA_RST 4

SoftwareSerial fonaSS = SoftwareSerial(FONA_TX, FONA_RX);
SoftwareSerial *fonaSerial = &fonaSS;

Adafruit_FONA fona = Adafruit_FONA(FONA_RST);

int Powerkey = 9;//pin for powering the SIM808
boolean gprson = false;
boolean gpson = false;
void power(void)
{
 //digitalWrite(Powerkey, LOW); 
 //delay(1000); // wait for 1 second
 digitalWrite(Powerkey, HIGH);
}
void flushSerial() {
 while (Serial.available())
 Serial.read();
}
void setup() {
 
 pinMode(Powerkey, OUTPUT); // initialize the digital pin as an output. 
 power(); //power on the sim808 or power down the sim808
 while (! Serial);
 Serial.begin(115200);
 Serial.println(F("Initializing sim808... (May take a few seconds)"));

 fonaSerial->begin(4800);
 if (! fona.begin(*fonaSerial)) {
 Serial.println(F("Couldn't find sim808"));
 while(1);
 }
 Serial.println(F("sim808 is OK")); 
 while(!gpson){
 delay(1000);
 Serial.println(F("Enabling GPS..."));
 if (!fona.enableGPS(true))
 Serial.println(F("GPS OK..."));
 gpson = true;
 }
 while(!gpson){
 delay(1000);
 fona.enableGPRS(false);
 Serial.println(F("Enabling GPRS"));
 if (!fona.enableGPRS(true))
 Serial.println(F("Failed to turn GPRS on"));
 else
 gprson = true;
 }
}

void loop() {
 delay(4000);
 if(!gprson){
 fona.enableGPRS(false);
 Serial.println(F("Enabling GPRS"));
 if (!fona.enableGPRS(true))
 Serial.println(F("Failed to turn GPRS on"));
 else
 gprson = true;
 }
 float latitude, longitude;
 boolean gps_success = fona.getGPS(&latitude, &longitude);
 if (gps_success)
 {
 Serial.print("GPS lat:");
 Serial.println(latitude, 6);
 Serial.print("GPS long:");
 Serial.println(longitude, 6);
 uint16_t statuscode;
 int16_t length;
 char url[100]="http://ivardi.com/gps/report.php?latitude=";
 char lati[10];
 dtostrf(latitude,1,6,lati);
 Serial.println(lati);
 char longi[10];
 dtostrf(longitude,1,6,longi);
 strcat(url, lati);
 strcat(url, "&");
 strcat(url, "longitude=");
 strcat(url, longi);
 flushSerial();
 Serial.println(url);
 if (!fona.HTTP_GET_start(url,&statuscode, (uint16_t *)&length))
 {
 Serial.println("Failed!");
 }
 while (length > 0) 
 {
 while (fona.available()) 
 {
 char c = fona.read();
 #if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
 loop_until_bit_is_set(UCSR0A, UDRE0); // Wait until data register empty. 
 UDR0 = c;
 #else
 Serial.write(c);
 #endif
 length--;
 if (! length) {};
 }
 }
 fona.HTTP_POST_end();
 } 
 else 
 {
 Serial.println("Waiting for GPS fix...");
 }
 }

רכיב ה SIM808 מתקשר עם הארדואינו בממשק סיריאלי – UART – וע"י פקודות AT. היצרן של הרכיב מספק קובץ מפורט איזה פקודות AT מפעילות את האופציות השונות , לדוגמה פקודות לשליחת SMS , להוצאת שיחה וכו'.

אנו נעשה שימוש בסיפריה Adafruit_FONA שמפשטת וחושפת פונקציות פשוטות ופקודות הAT נעשות כבר בתוך הסיפרייה.

כמו כן נעשה שימוש בסיפריה – SoftwareSerial על מנת שנוכל לדבג את התוכנית בערוץ UART החומרתי.

בנוסף בסיפריה ישנו קובץ בשם Adafruit_fona.cpp שם נצטרך לשנות את שם הAPN לאחד שיתאים למפעיל הסלולארי שעם הסים שלו אנו משתמשים.

וכמובן בקוד עצמו יש לשנות את שם השרת אליו נדווח מ yourserver.com לשם של השרת שלכם.

החבילה מבצעת

"GET" request

לשרת עם הפרמטרים של – latitude ו longitude , הקובץ בשרת בשם report.php מקבל את הבקשה ויוצר קובץ JSON עם הערכים הללו.
דף HTML עם מפה של גוגל מוטמעת בו פונה בAJAX כל כמה שניות לשרת בבקשה לספק לו את קובץ ה JSON שהשרת יצר,ואחרי שהוא מקבל את הקובץ הוא מציג את המיקום על גבי המפה שלצורך זה יש לקבל מגוגל KEY ולהוסיף אותו בקובץ tracker.html בשורה 15:

<script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?v=3&key=getYourownKey"></script>

tracker-map
כל הקבצים שבפרוייקט מצורפים:

gps