Windows Mobile 6.5 Mother of all tutorial : Part 6 การใช้ GPS

Posted 15/01/2010 22:41 by nantcom

mofat53

ในการใช้งาน GPS บน Windows Mobile นั้น Microsoft มี API แบบ Native (ใช้งานด้วย C++) และ GPS Intermediate Driver รองรับการเขียนโปรแกรมติดต่อกับอุปกรณ์ GPS ให้เราเรียบร้อยแล้ว ซึ่งข้อดีของมันก็คือ

  • หลายโปรแกรม สามารถใช้งานอุปกรณ์ GPS พร้อมกันได้ (ยกเว้น มีโปรแกรมที่เปิด Serial Port ไปยัง COM Port ของ GPS โดยตรง)
  • คุณสามารถตั้งค่าให้ระบบ Intermediate Driver ทำการ Log ข้อมูลลงไฟล์ได้อัตโนมัติ เมื่อ GPS เปิดใช้งาน
  • ไม่จำเป็นต้องเรียนรู้ภาษา NMEA หรือการคำนวณใดๆ ที่เกี่ยวข้องกับ GPS เลย

แต่อย่าเพิ่งรีบไปเปิด PInoke.net หาทางเรียก API นะครับ เพราะ Microsoft ก็ได้สร้าง Wrapper มาให้พร้อมแล้วด้วยเหมือนกัน สะดวกไหมล่ะ

image

ตัว Code จะอยู่ใน C:\Program Files (x86)\Windows Mobile 6 SDK\Samples\PocketPC\CS\GPS (เครื่อง 64-bit) หรือ C:\Program Files\Windows Mobile 6 SDK\Samples\PocketPC\CS\GPS สำหรับเครื่อง 32-bit ครับ

เมื่อเปิดไฟล์ Solution ขึ้นมา เราอาจจะต้องทำการ Convert ก่อน เพราะ Solution เป็นของ Visual Studio 2005 ให้กด Finish ได้เลย

image

จากนั้น เปลี่ยนการ Compile เป็นแบบ Release แล้วสั่ง Rebuild Solution

image

image

จากนั้น ปิด Visual Studio และเปิด Folder bin\Release ขึ้นมา เพื่อ Copy ไฟล์ Microsoft.WindowsMobile.Samples.Location.dll

image

จากนั้น สร้างโปรเจคใหม่ขึ้นมา และสร้าง Folder Lib ภายใน Projectr ก่อนจะนำไฟล์ Microsoft.WindowsMobile.Samples.Location.dll วางลงไปด้านใน

image

จากนั้น Add Reference โดยที่เลือกไฟล์ Microsoft.WindowsMobile.Samples.Location.dll ที่อยู่ใน Folder Lib ของโปรเจค (ไม่ใช่ตัวที่อยู่ใน C:\Program Files (x86)\Windows Mobile 6 SDK\Samples\PocketPC\CS\GPS\bin\Release)

image

image จากนั้น ขั้นแรก ทำการสร้าง Listbox ขึ้นมา 1 ตัว บน Form แล้วจึงเปิด โค๊ดขึ้นมา เพื่อแก้ไขดังนี้

เพิ่ม Using ที่ด้านบน
  1. using System;
  2. using System.Linq;
  3. using System.Collections.Generic;
  4. using System.ComponentModel;
  5. using System.Data;
  6. using System.Drawing;
  7. using System.Text;
  8. using System.Windows.Forms;
  9.  
  10. using Microsoft.WindowsMobile.Samples.Location;
  11.  
  12. namespace SmartDeviceProject5
  13. {
  14.     public partial class Form1 : Form
  15.     {

จากนั้น ใน Contructor ของ Form เพิ่มโค๊ดดังนี้

ใส่โค๊ดเปิด GPS
  1. public Form1()
  2. {
  3.     InitializeComponent();
  4.  
  5.     Gps gps = new Gps();
  6.     gps.Open();
  7.     gps.LocationChanged += new LocationChangedEventHandler(gps_LocationChanged);
  8. }

และเพิ่มฟังก์ชั่น เพื่อรับค่าจาก GPS

Event Handler ของ GPS
  1. private void gps_LocationChanged(object sender, LocationChangedEventArgs args)
  2. {
  3.     if (args.Position.LatitudeValid && args.Position.LongitudeValid)
  4.     {
  5.         this.listBox1.Items.Add(
  6.             string.Format("Lat:{0}, Lon:{1}", args.Position.Latitude, args.Position.Longitude));
  7.     }
  8. }

จากนั้น รันโปรเจคด้วย Emulator ของ Windows Mobile 6.5 QVGA ที่เราได้ตั้งค่าไว้ตาม ตอนที่ 1 ซึ่งมีการติดตั้งโปรแกรม Fake GPS ไว้แล้ว เพื่อจำลองการทำงานของ GPS

image

แล้วคุณจะพบว่า…

image

และนั่นคือคำถาม

จะเห็นว่า เราสามารถอ่านค่าจาก GPS ได้แล้ว แต่ว่าโปรแกรมมันกลับ Exception ซะอย่างนั้น เพราะอะไรล่ะ?

image

ผมทิ้งระเบิดไว้ก่อน Smile และเดี๋ยวผมจะทิ้งคำใบ้ไว้ วันละ 1 คำใบ้ แล้ว เมื่อครบ 5 คำใบ้ แล้วจะมาเฉลยครับ ว่าจะแก้ไขได้อย่างไร (ผมเคยเขียนเรื่องนี้แล้วด้วยละ) ถ้ามีเพื่อนๆ ที่สามารถเฉลยได้ก่อนผม โดยการมาตอบไว้กระทู้นี้ (อย่าใช้ Comment) ผมมีของรางวัลเล็กๆ น้อยๆ เป็นพวงกุญแจไฟฉาย Aero Peek ลาย Windows 7 มาแจก 1 ชิ้นครับ สั่งตรงจาก Company Store ที่ Microsoft Redmond มาเลยทีเดียว image

UPDATE มีคำตอบ อยู่ในกระทู้แล้วนะครับ ตามมาอ่านเลย

 (*** เดี๋ยวของรางวัล นัดรับพร้อมกับกิจกรรม MyPhone สิ้นเดือนนี้ ที่ Microsoft Office ตึก All Season ครับ - ไม่ใช่ชื่อโปรแกรมนะนั่นอะ เหอๆๆๆ ***)

Published Jan 15 2010, 10:41 PM by nantcom
Filed under:
 

TingPalm said:

ผมไม่ได้มาตอบคำถามนะครับ

แต่จะมาถามว่า Microsoft.WindowsMobile.Samples.Location.dll

ใช้งานจริง กับ Mobile Phone ที่มี GPS Build in ไม่ได้ใช่ไหมครับ

ใช้ได้แต่ ทดลองกับ Fake เท่านั้นใช่ไหมครับ

January 17, 2010 12:04 PM
 

nantcom said:

ใช้งานได้ครับ มันติดต่อกับ Immediate Driver จริงครับ :)

January 19, 2010 1:06 PM
(required)  
(optional)
(required)  
Add