โจทย์ของผมก็คือ ทำการเก็บข้อมูลของรถบรรทุก แล้วส่งกลับไปที่ Center ข้อมูลที่จะส่งกลับก็เช่น ตำแหน่งรถ ระดับน้ำมันในถัง การเปิดปิดประตูห้องเก็บสินค้า
สิ่งที่ต้องเรียนรู้เพิ่มเติม คือ การสร้างโปรแกรมบน Server เพื่อรองรับค่าที่ส่งมา บันทึกลงใน mySQL
Ketai ทำหน้าที่อ่านตำแหน่งโดยไม่ใช้ GPS แต่จะอ่านตำแหน่งจากข้อมูลของ WIFI Network Location ซึ่งจะมีความแม่นยำอยู่ในระดับประมาณ 40 - 80 เมตร เทียบกับ GPS ที่ประมาณ 5 เมตร
Arduino อ่านการเปิด-ปิดประตู และระดับน้ำมัน มาประกอบกับข้อมูลตำแหน่ง
แพ็กข้อมูลแล้วก็ส่งไปที่ Server ผ่าน Internet
เริ่มที่ Ketai
ทำการ download Ketai libaray มาไว้ใน Processing ก่อนครับ จากนั้นก็เขียนโปรแกรมแบบ Android
ก่อน Run ให้กำหนดใช้ ACCESS_FINE_LOCATION ในเมนู Android -> Sketch Permission เสียก่อน
การทดสอบกับ Android บางตัวจะไม่มีในส่วนของการอ่านค่า location จาก Network ทำให้ไม่สามารถแสดงค่าตำแหนงได้ สำหรับมือถือส่วนใหญ่ใช้งานได้
import ketai.sensors.*;
KetaiLocation location; // เรียกใช้ location library
double longitude, latitude, altitude; // เก็บค่า ตำแหน่ง
float accuracy; // ความแม่นยำ
void setup(){
orientation(LANDSCAPE);
textAlign(CENTER,CENTER);
textSize(36);
location = new KetaiLocation(this); // เปิดการใช้งาน
}
void draw() {
background(128);
if(location.getProvider() == "none")
text("Location data is unavailable. \n" +
"Please check your location settings.", width/2,height/2);
else
text("Latitude: " + latitude + "\n" +
"Longitude: " + longitude + "\n" +
"Altitude: " + altitude + "\n" +
"Accuracy: " + accuracy + "\n" +
"Provider: " + location.getProvider(), width/2, height/2);
}
void onLocationEvent(double _latitude, double _longitude, double _altitude, float _accuracy){
longitude = _longitude;
latitude = _latitude;
altitude = _altitude;
accuracy = _accuracy;
println("lat/lon/alt/acc: " + latitude + "/" + longitude + "/" + altitude + "/" + accuracy);
}
ผลการ Run แสดงตำแหน่ง อันนี้ใช้ WIFI Network
เมื่อเปิด GPS
ต่อไปก็จะเป็นการเตรียมการที่ Server
การติดตั้ง XAMPP สำหรับทำ Server บน PC ให้ดาวน์โหลดไฟล์
ให้เลือก XAMPP for Widows แล้วติดตั้ง ขอให้ระบุตำแหน่งที่ติดตั้งเป็น C:\ เพื่อความสะดวก
เมื่อติดตั้งเสร็จให้ทดสอบโดยพิมพ์ http://localhost ที่ Browser จะเห็นหน้าตาแบบนี้ เป็นอันใช้ได้ ตอนนี้เรามี Server ใช้แล้ว
การบันทึกข้อมูลต้องใช้ PHP ก็เลยต้องทดสอบการทำงานของ PHP กันก่อน ให้กดที่ phpinfo() จะได้หน้าตานี้
ในส่วนของฐานข้อมูล จะยังไม่ใช้ mySQL เพราะจะทำให้เนื้อหายืดยาวเกินไป ก็เลยจะเก็บข้อมูลไว้ใน Text file แทน ซึ่งต้องเขียนไฟล์ PHP ขึ้น ตามนี้ แล้วนำไปวางไว้ที่ C:\xampp\htdocs\xampp
<?php
// Geolocation Device Locator PHP Script
// Writing to a text file on a web server
if(isset($_GET['get']))
{
$filename = $_GET['get'].".txt";
if(file_exists($filename))
{
$file = file_get_contents($filename);
echo $file;
} else
echo "ERROR! No location found for " . $_GET['get'];
}
//if the request is an update,we dump the location into a file
// named after the device making the request
else if(isset($_GET['update']) && isset($_GET['location']))
{
$fh =fopen($_GET['update'].".txt", "w");
if($fh == FALSE)
{
echo "ERROR. Cannot open file on server.";
return;
}
if(fwrite($fh, $_GET['location']."\n") == FALSE)
echo "ERROR. Writing to file.";
if(fclose($fh) == FALSE)
echo "ERROR. Closing file,";
}
?>
ทดลองให้ PHP ทำงาน ด้วยการพิมพ์ http://localhost/xampp/location.php?get=Test ใน Browser จะแสดงข้อความว่า
ERROR! No location found for Test
ถ้าได้ตามนี้ ก็โอเคครับ ต่อไปจะเพิ่มการบันทึกตำแหน่งไปที่ Server
ให้เพิ่มโค๊ดต่อจากโปรแกรมเดิม จุดที่สำคัญคือ
serverIP เป็น IP ของเครื่อง PC ที่ติดตั้ง XAMPP นะครับ ถ้าไม่รู้ใหัเข้าที่ Command Prompt ใช้คำสั่ง ipconfig ดูที่ IPv4 Address
myName เป็นการแยกไฟล์เก็บข้อมูลของเครื่อง Android แต่ละเครื่อง ถ้ามี 2 เครื่องขึ้นไปให้ตั้ง myName ที่ไม่ซ้ำกัน
String myName = "Supot"; // ชื่อของเครื่อง Android ตั้งไม่ให้ซ้ำกัน
String serverMessage = "";
String serverIP = "192.168.1.14"; // IP Address ของ Server อันนี้เป็นของเครื่องผม
void mousePressed(){
String url = "http://" + serverIP + "/xampp/location.php?update=" + myName +
"&location="+latitude+","+longitude+","+altitude;
// Update ข้อมูลตำแหน่งของเครื่องไปที่ Server ชื่อเครื่องระบุที่ myName
loadStrings(url);
url = "http://" + serverIP + "/xampp/location.php?get=" + myName;
// get ข้อมูลตำแหน่ง ระบุชื่อเครื่องที่ myName
String results[] = loadStrings(url);
if(results.length > 0)
serverMessage = results[0];
}
และแก้ไขในส่วนขอ void draw() ตามนี้
void draw() {
background(128);
if(location.getProvider() == "none")
text("Location data is unavailable. \n" +
"Please check your location settings.", width/2,height/2);
else
text("Latitude: " + latitude + "\n" +
"Longitude: " + longitude + "\n" +
"Altitude: " + altitude + "\n" +
"Accuracy: " + accuracy + "\n" +
"Provider: " + location.getProvider() + "\n" +
"Last Servver Message: " + serverMessage, width/2, height/2);
}
การเก็บข้อมูลจะทำการเขียนเพิ่มลงไปในไฟล์ สมมุติว่ามีการเคลื่อนที่ของเครื่อง เมื่อกดหน้าจอข้อมูลก็จะเอาไปบันทึกต่อท้ายในไฟล์ที่ Server ถ้าสามารถโหลดไฟล์มาได้ ก็จะดูได้ว่าตัวเครื่องเคลื่อนที่ไปที่ไหนบ้าง ถ้าจะให้ดีก็ทำการกำหนดเวลาให้บันทึกตำแหน่ง อาจจะทุกๆ 5 นาที ส่วนนี้ทิ้งไว้ให้คิดต่อกันนะครับ
ไฟล์ Location.php ต้องแก้ไขเล็กน้อย เพื่อให้สามารถเขียนเพิ่มได้ บรรทัดที่ 19
จาก
$fh =fopen($_GET['update'].".txt", "w");
เป็น
$fh =fopen($_GET['update'].".txt", "a");
(w = write, a = append)
ส่วนการอ่านข้อมูลจากไฟลที่บันทึกให้พิมพ์ที่ Browser
เปลี่ยน Supot เป็นชื่อที่ระบุใน myName จากนั้น Server จะตอบกลับมาเป็นตำแหน่งที่บันทึกไว้ โดยใช้ช่องว่างแยกข้อมูลออกจากกัน
13.8921433,100.7591537,0.0 13.8921433,100.7591537,0.0 13.8921433,100.7591537,0.0 13.8921433,100.7591537,0.0
ในส่วนของการนำเอาค่าต่างๆ ที่รับมาจาก Arduino มาเพิ่มเติมเพื่อบันทึกนั้น สามารถประยุกต์จากตัวอย่างที่ผ่านมา ซึ่งผมจะนำมาเพิ่มเติมให้ภายหลัง แต่ผมคิดว่าผู้อ่านสามารถเพิ่มเติมได้เอง
ในส่วนของ Server เอง เราจะเข้าถึงจากภายนอกไม่ได้ ถ้ามีความรู้เรื่อง DDNS (Dynamic Domain Name Server) ก็สามารถทำการปรับตั้งเพื่อให้สามารถบันทึกข้อมูลจากภายนอกได้ ของผมใช้ของ no-ip ถ้าจะลองก็ให้ตั้ง serverIP เป็น supotsaeea.no-ip.info:81 ก็จะมาบันทึกข้อมูลไว้ที่เครื่องผมได้ ลองดูนะครับ ได้ไม่ได้ยังไงก็ส่งความคิดเห็นเข้ามาได้ครับ
------------------------------------------
สำหรับใครที่ทดลอง XAMPP แล้วไม่ผ่าน ให้เปิด Control Panel ของ XAMPP อยู่ใน c:\xampp ชื่อไฟล์ xampp-control.exe เปิดขึ้นมาจะได้หน้าต่างนี้
กดปุ่ม Start ที่แถว Apache
ตัวหนังสือ Apache จะคลุมเป็นสีเขียว ถ้าเป็นสีอื่นต้องแก้ไขหมายเลขพอร์ท สำหรับบางเครื่องที่ลง IIS ของ windows ซึ่งใช้พอร์ท 80 แล้ว ให้หลีกเลี่ยงไปใช้พอร์ท 81 แทน ให้กดที่ Config เลือกเมนูแรก Apache (httpd-conf)
ไฟล์จะเปิดขึ้นด้วย Notepad ให้ไปที่บรรทัดที่ 47 หรือบรรทัดที่เขียนว่า Listen 80 ให้เปลี่ยนเป็น Listen 81 แล้วบันทึก ถ้าไม่สามารถบันทึกได้ให้ดูว่าไฟล์อยู่ที่โฟลเดอร์ไหน ปิดไฟล์จากนั้นเปิด Notepad แบบ Administrator เรียกไฟล์ทำการแก้ไขแล้วบันทึก
ทดลองกด Start อีกครังที่ Apache อาจต้องลองเปลี่ยนพอร์ทเป็น 8080 หรือ 8081 ซึ่งก็สามารถใช้งานได้เช่นกัน ถ้าไม่ได้จริงๆ ลองยังไงก็ไม่ได้ ก็หลังไมค์ได้ครับ
ถ้าใครทำอาชีพขนส่งแล้วอยากรู้ว่ารถของเราอยู่ที่ไหนก็ติดตั้งระบบนี้เข้าไป แต่อยากให้ใช้ GPS จะแม่นยำกว่าครับ เปิดเครื่องที่บริษัทเป็น Server ไม่ต้องไปเช่าใคร ปัจจุบันค่าเนตรายเดือนก็ไม่แพงแล้ว ส่งข้อมูลทั้งวันทั้งคืนก็จ่ายเท่าเดิม