2011年4月30日 星期六

Sensor Observation Services 安裝與設定

感測器觀測服務(Sensor Observation Services ,SOS)能夠提供觀測我們一般使用的感測器的Web services。以下將介紹如何在PC上安裝SOS。
我們的SOS是使用52N所設計的模組 http://52north.org/communities/sensorweb/
系統安裝環境我是使用Fedora 13,在Ubuntu也是可以安裝喔。

接下來,我先列出安裝所需要的所有套件 (網站的套件版本可能會不一樣)



套件下載完之後,之後開始安裝了!

1. 安裝 JAVA JDK
可檢查PC上是否已安裝JAVA,如果有的話則不用再安裝JAVA
java --version

如果沒有的話,則安裝JAVA (至JAVA網站下載)
./jre-6u25-linux-i586.bin

2. 安裝Apache Tomcat
將套件解壓縮安裝在/opt 目錄下
tar xvf apache-tomcat-6.0.32.tar.gz /opt

啟動apache tomcat,進入apache-tomcat-6.0.32 執行
sh bin/startup.sh

測試apache tomcat 網頁,開啟瀏覽器
http://localhost:8080


3. 安裝PostgreSQL 資料庫
./postgresql-8.4.3-1-linux.bin
預設安裝目錄會在/opt下

建立一個新的SOS資料庫
開啟pgAdmin III,新增資料庫












建立一個SoSDB的資料庫



















4. 安裝proj及geos
安裝這兩個套件的原因是,PostGIS必須依靠這兩個套件的libray
(1) 安裝proj
tar xvf proj-4.6.1.tar.gz cd proj-4.6.1 ./configure --prefix=/opt/proj
make
make install
(2) 安裝 geos
tar xvf geos-3.2.0.tar.bz2 cd geos-3.2.0 ./configure --prefix=/opt/geos3
make
make install

5. 安裝PostGIS
設定proj與geos函式庫編譯路徑
gedit /etc/ld.so.conf

加入下列的路徑
/opt/proj4/lib
/opt/geos3/lib

儲存後,需重新更新設定檔,輸入下面指令
ldconfig

現在我們就可以順利安裝PostGIS
tar xvf postgis-1.3.6.tar.gz cd postgis-1.3.6
./configure --prefix=/opt/postgis --with-pgsql=/opt/PostgreSQL/8.4/bin/pg_config
--with- proj=/opt/proj4 --with-geos=/opt/geos3/bin/geos-config
make
make install

編譯完成後,會產生postgis的資料庫,所以我們要把她匯入到postgreSQL
export PATH=/opt/PostgreSQL/8.4/bin:$PATH
cd /opt/postgis/


進入posrtgre shell
su postgres
會出現$的字元,就可以開始輸入postgresql指令了
$ psql -d Sosdb -f lwpostgis.sql
$ psql -d Sosdb -f spatial_ref_sys.sql

6.設定環境路徑,開啟profile
gedit /etc/profile

加入以下設定值

export PROJ_HOME=/opt/proj4 export GEOS_HOME=/opt/geos3
export POSTGIS_HOME=/opt/postgis
export JAVA_HOME=/usr/java/jdk1.6.0_32
export PATH=$M2:$JAVA_HOME/bin:/opt/PostgreSQL/8.4/bin:$PATH


7. 52N SOS 安裝與設定

解壓縮 52n-sos-3.1.1 -binary.zip 會產生一個52nSOSv3_WAR.war
匯入資料庫範本及匯入資料,進入52n-sos-3.1.1-binary目錄
su postgres

$ psql -d Sosdb -f db/datamodel_postgres83.sql
$ psql -d Sosdb -f db/test.sql

開啟apache tomcat進入管理介面
http://localhost:8080

點選Tomcat Manager,會彈出設定管理者帳號密碼的訊息
開啟Tomcat/conf目錄下的tomcat-users.xml,將彈出訊息的內容加上去,並設定自己的
username與password。
完成後,重新開啟apache tomcat

sh /opt/apache-tomcat-6.0.32/bin/shutdown.sh sh /opt/apache-tomcat-6.0.32 /bin/startup.sh


進入管理介面後,匯入SOS所提供的52nSOSv3.war





匯入完成後,就可以看到管理頁面上,出現



之後,就可以進入52NSOS了




2011年4月28日 星期四

以 Android 技術實作車載資通訊閘道系統教材整理

1. Android 開發環境的安裝及建置
1-1 安裝Android SDK開發環境
1-2 第一支Android NDK程式--HelloJni
1-3 如何在eclipse工具下使用NDK
1-4 Android Source core與 Eclipse 整合
1-5 優化Eclipse 開發工具
1-6 Android Proting 首部曲--- 環境建置與原始碼下載

2. Android 基礎教學
2-1 Android Hello應用程式教學
2-2 設定監聽器覆寫事件方法
2-3 Android 按鍵處理程序教學
2-4 部署應用程式至Android手機
2-5 啟動或關閉本地服務應用程式
2-6 連繫或解繫本地服務應用程式
2-7 Toast的使用教學
2-8 兩不同Activity間的資料傳遞
2-9 如何觀察Activity從Running到Pause或從Pause到Running
2-10 利用計時器來更新UI的小範例
2-11 運用計時器來更新UI的另一種方法
2-12 如何把ApiDemos中取得程式,設計成自己的專案
3. Android 進階教學
3-1 Android感測器模擬軟體測試心得
3-2 利用感測器模擬程式來開發感測器應用程式
3-3 運用AIDL來打造Android程序間的通訊
3-4 如何在Android上發展IPC應用程式
3-5 善用AIDL工具來產生IPC的介面溝通程式
3-6 Activity, Service, AIDL產生介面類別三者關係
3-7 好文章分享:深刻解析 Android 的 AIDL 介面
3-8 利用AIDL實作遠端服務之步驟
3-9 用UML來表示由AIDL所產生的介面內部物件的關係圖
3-10 利用IPC及AIDL來打造車身電子通訊網路應用程式的框架(POLL MODEL)
3-11 利用IPC及AIDL來打造車身電子通訊網路應用程式的框架(PUSH MODEL)
3-12 如何在Android上寫出一個Widget
3-13 Android傳簡訊教學網誌


4. 虛擬儀錶教學
4-1 車用虛擬儀表設計
4-2 車用虛擬儀表設計(二)
4-3 將感測器模擬軟體的數值傳送到車用虛擬儀表

5. 相關硬體資訊
5-1 CAN and LIN Bus Transceiver
5-2 在Android下建立RS232通訊應用程式心得分享
5-3 Android有關RIL軟體實作
5-4 CAN晶片介紹(MCP2510)
5-5 實作IPC LED控制程式
5-6 實作IPC COM控制程式
5-7 TI TMS32F2800x eCAN description
5-8 Android IPC設計以LED控制為例


6. 車載協定
6-1 CAN or Controller Area Network Protocol (ISO15765)
6-2 CAN Bus Protection
6
6-3 OBD2 or OBD II Protocols
6-4 CyberLink For Android
6-5 讀取經緯度的小範例
6-6 不錯的OBDII的教學網站
6-7 一顆很好用的OBDII/RS232轉換IC

7. 應用實例
7-1 OBD2 ...WIFI AND IPHONE ..TESTING IN DISCOVERY 3
7-2 南開電通車載節能器
7-3 http://cheng-min-i-taiwan.blogspot.com/2010/03/android_29.html
7-4 openremote project-用iPhone 或 Android 手機遙控家裡的電器
7-5 車用虛擬儀表學生作品分享
7-6 Legend Android 2.1 當作 OBD-II 車輛診斷系統暨HUD還有軌跡紀錄
7-7 [轉貼]通用汽車與Google合作 為Chevrolet Volt提供導航功能

8. 其他
8-1 Android開發教學影片
8-2 介紹台灣創新科技的影片
8-3 Google I/O Session Videos and Slides
8-4 The Android Car
8-5 iTaxi是甚麼?

2011年4月17日 星期日

[ Linux Device Driver ] 淺談 CAN Bus 晶片 MCP 2510的驅動程式設計(一)

對於想學Linux作業系統驅動程式的學員,可以參考Linux Device Drivers, Third Edition
全文可以在http://lwn.net/Kernel/LDD3/下載。Linux驅動可以驅分成三種,如下圖:


本篇將介紹一顆CAN Bus晶片 MCP 2510的Linux驅動程式設計,有興趣可以先閱讀「CAN晶片介紹(MCP2510)」,發表在http://cheng-min-i-taiwan.blogspot.com/2010/05/canmcp2510.html

本文所使用的CAN Bus驅動程式是由長高科技公司所提供,有興趣學員可以向該公司冾詢。該驅動程式的目錄如下:


如上圖中 can.ko 就可以用在Android平台上,而 cantxrx 則是一個Linux應用程式,用來測試 can.ko。



從上圖可以到open, read, write, release, ioctl等常用的驅動函式,

[ Android OpenGL ES 教學(三)] 轉換相關方法

基礎閱讀:[ Android OpenGL ES 教學(二)] 建立多邊形 發表在http://cheng-min-i-taiwan.blogspot.com/2011/04/android-opengl-es_17.html
延伸閱讀:[ Android OpenGL ES 教學(四)] 添加顏色 發表在 http://cheng-min-i-taiwan.blogspot.com/2011/05/android-opengl-es.html
參考文章:OpenGL ES Tutorial for Android – Part III – Transformations 發表在 http://blog.jayway.com/2010/01/01/opengl-es-tutorial-for-android-–-part-iii-–-transformations/




(以下圖形摘自參考文章)
坐標系統


轉換或移動
可以利用下列函式
public abstract void glTranslatef (float x, float y, float z)



旋轉
可以利用下列函式
public abstract void glRotatef(float angle, float x, float y, float z)



縮小或放大
可以利用下列函式
public abstract void glScalef (float x, float y, float z)



其他常用函式
1. 以單位矩陣取代目前的矩陣
public abstract void glLoadIdentity()
2. 儲存目前陣列
public abstract void glPushMatrix()
3. 恢復以前儲存陣列
public abstract void glPopMatrix()

以列是OpenGLRenderer.java程式列表(新增的程式用藍色字表示)


package nkut.cce.smartliving.opengl;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLSurfaceView.Renderer;
import android.opengl.GLU;

public class OpenGLRenderer implements Renderer {
private Square square;
private float angle = 0;

public OpenGLRenderer() {
// 初始化
square = new Square();
}

@Override
public void onDrawFrame(GL10 gl) {
// TODO Auto-generated method stub
// 清除螢幕和深度緩衝區
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
// 以單位矩陣取代目前的矩陣
gl.glLoadIdentity();

// Z軸轉置 10 單位
gl.glTranslatef(0, 0, -10);

// 第一個方形
// 存儲目前陣列
gl.glPushMatrix();
// 反時鐘旋轉
gl.glRotatef(angle, 0, 0, 1);
// 畫出第一個方形
square.draw(gl);
// 復原成最後的矩陣
gl.glPopMatrix();

// 第二個方形
// 存儲目前陣列
gl.glPushMatrix();
// 在移動前先旋轉, 讓第二個方形圍繞著第一個方形旋轉
gl.glRotatef(-angle, 0, 0, 1);
// 移動第二個方形
gl.glTranslatef(2, 0, 0);
// 調整其大小為第一個方形的一半
gl.glScalef(.5f, .5f, .5f);
// 畫出第二個方形
square.draw(gl);

// 第三個方形
// 存儲目前陣列
gl.glPushMatrix();
// 讓第三個方形圍繞著第二個方形旋轉
gl.glRotatef(-angle, 0, 0, 1);
// 移動第三個方形
gl.glTranslatef(2, 0, 0);
// 調整其大小為第二個方形的一半
gl.glScalef(.5f, .5f, .5f);
// 以自己為中心旋轉
gl.glRotatef(angle * 10, 0, 0, 1);
// 畫出第三個方形.
square.draw(gl);

// 復原成第三個方形前的矩陣
gl.glPopMatrix();
// 復原成第二個方形前的矩陣.
gl.glPopMatrix();

// 增加角度
angle++;

}

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// TODO Auto-generated method stub
// 設定新視域視窗的大小
gl.glViewport(0, 0, width, height);
// 選擇投射的陣列模式
gl.glMatrixMode(GL10.GL_PROJECTION);
// 重設投射陣
gl.glLoadIdentity();
// 計算視窗的寬高比率
GLU.gluPerspective(gl, 45.0f, (float) width / (float) height, 0.1f,
100.0f);
// 選擇MODELVIEW陣列
gl.glMatrixMode(GL10.GL_MODELVIEW);
// 重設MODELVIEW陣列
gl.glLoadIdentity();
}

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// TODO Auto-generated method stub
// 設定背景顏色為黑色, 格式是RGBA
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
// 設定流暢的陰影模式
gl.glShadeModel(GL10.GL_SMOOTH);
// 深度緩區的設定
gl.glClearDepthf(1.0f);
// 啟動深度的測試
gl.glEnable(GL10.GL_DEPTH_TEST);
// GL_LEQUAL深度函式測試
gl.glDepthFunc(GL10.GL_LEQUAL);
// 設定很好的角度計算模式
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
}

}

[ Android OpenGL ES 教學(二)] 建立多邊形

基礎閱讀:http://cheng-min-i-taiwan.blogspot.com/2011/04/android-opengl-es.html
延伸閱讀:[ Android OpenGL ES 教學(三)] 轉換相關方法 發表在 http://cheng-min-i-taiwan.blogspot.com/2011/04/android-opengl-es_3388.html
參考文章:OpenGL ES Tutorial for Android – Part II – Building a polygon 發表在http://blog.jayway.com/2009/12/04/opengl-es-tutorial-for-android-%E2%80%93-part-ii-building-a-polygon/
在OpenGL中建立多邊形是利用點連接而成,如下圖(摘自參考文章)

上述的圖形可以轉換成點的陣列如下所示:

 // 點的陣列
 private float vertices[] = { -1.0f, 1.0f, 0.0f, // 0, 左上角
   -1.0f, -1.0f, 0.0f, // 1, 左下角
   1.0f, -1.0f, 0.0f, // 2, 右下角
   1.0f, 1.0f, 0.0f, // 3, 右上角
                            }

接下來我們來實作看看, 其步驟如下:
1. 建立Square類別


2. 以下是Square.java程式列表(新增的程式用藍色字表示)
package nkut.cce.smartliving.opengl;


import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.ShortBuffer;

import javax.microedition.khronos.opengles.GL10;
public class Square {

 // 點的陣列
 private float vertices[] = { -1.0f, 1.0f, 0.0f, // 0, 左上角
   -1.0f, -1.0f, 0.0f, // 1, 左下角
   1.0f, -1.0f, 0.0f, // 2, 右下角
   1.0f, 1.0f, 0.0f, // 3, 右上角
 };

 // 連接點的次序
 private short[] indices = { 0, 1, 2, 0, 2, 3 };

 // 點的緩衝區
 private FloatBuffer vertexBuffer;

 // 索引值緩衝區
 private ShortBuffer indexBuffer;

 public Square() {
  // 浮點數是4位元組因此需要把點陣列長度乘以4
  ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
  vbb.order(ByteOrder.nativeOrder());
  vertexBuffer = vbb.asFloatBuffer();
  vertexBuffer.put(vertices);
  vertexBuffer.position(0);

  // 短整數是2位元組因此需要把點陣列長度乘以2
  ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2);
  ibb.order(ByteOrder.nativeOrder());
  indexBuffer = ibb.asShortBuffer();
  indexBuffer.put(indices);
  indexBuffer.position(0);
 }

 /**
  * 畫圖函式
  * 
  * @param gl
  */
 public void draw(GL10 gl) {
  // 逆時鐘
  gl.glFrontFace(GL10.GL_CCW);
  // 啟動CULL_FACE
  gl.glEnable(GL10.GL_CULL_FACE);
  // 刪除多邀形的背景
  gl.glCullFace(GL10.GL_BACK);

  // 啟動點的緩衝區
  gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
  // 指定位置和資料格式
  gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);

  // 以三點劃出三角形
  gl.glDrawElements(GL10.GL_TRIANGLES, indices.length,
    GL10.GL_UNSIGNED_SHORT, indexBuffer);

  // 除能點的緩衝區
  gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
  // 除能CULL_FACE
  gl.glDisable(GL10.GL_CULL_FACE);
 }
}

3. 以下是OpenGLRenderer.java程式列表(新增的程式用藍色字表示)
package nkut.cce.smartliving.opengl;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLSurfaceView.Renderer;
import android.opengl.GLU;

public class OpenGLRenderer implements Renderer {
 private Square square;

 public OpenGLRenderer() {
  // 初始化
  square = new Square();
 }

 @Override
 public void onDrawFrame(GL10 gl) {
  // TODO Auto-generated method stub
  // 清除螢幕和深度緩衝區
  gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

  // 以單位矩陣取代目前的矩陣
  gl.glLoadIdentity();
  // Z軸轉置 4 單位
  gl.glTranslatef(0, 0, -4);
  // 畫出方形
  square.draw(gl);
 }

 @Override
 public void onSurfaceChanged(GL10 gl, int width, int height) {
  // TODO Auto-generated method stub
  // 設定新視域視窗的大小
  gl.glViewport(0, 0, width, height);
  // 選擇投射的陣列模式
  gl.glMatrixMode(GL10.GL_PROJECTION);
  // 重設投射陣
  gl.glLoadIdentity();
  // 計算視窗的寬高比率
  GLU.gluPerspective(gl, 45.0f, (float) width / (float) height, 0.1f,
    100.0f);
  // 選擇MODELVIEW陣列
  gl.glMatrixMode(GL10.GL_MODELVIEW);
  // 重設MODELVIEW陣列
  gl.glLoadIdentity();
 }

 @Override
 public void onSurfaceCreated(GL10 gl, EGLConfig config) {
  // TODO Auto-generated method stub
  // 設定背景顏色為黑色, 格式是RGBA
  gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
  // 設定流暢的陰影模式
  gl.glShadeModel(GL10.GL_SMOOTH);
  // 深度緩區的設定
  gl.glClearDepthf(1.0f);
  // 啟動深度的測試
  gl.glEnable(GL10.GL_DEPTH_TEST);
  // GL_LEQUAL深度函式測試
  gl.glDepthFunc(GL10.GL_LEQUAL);
  // 設定很好的角度計算模式
  gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
 }

}

4. 執行結果

[ Android OpenGL ES 教學(一)] 設定視域

延伸閱讀:[ Android OpenGL ES 教學(二)] 建立多邊形 發表在http://cheng-min-i-taiwan.blogspot.com/2011/04/android-opengl-es_17.html
參考文章:OpenGL ES Tutorial for Android – Part I – Setting up the view發表在http://blog.jayway.com/2009/12/03/opengl-es-tutorial-for-android-part-i/

GLSurfaceView類別可以幫助我們撰寫OpenGL ES應用程式。

  1. 提供一些事件處理函式碼來連接到OpenGL ES中視域系統(View System)。
  2. 提供一些事件處理函式碼以使OpenGL ES的工作與活動的生命週期。
  3. 很容易選擇合適的幀緩衝區的像素格式。
  4. 建立和管理一個單獨的渲染執行緒,實現了流暢的動畫。
  5. 提供易於使用的除錯工具用於追踪的OpenGL ES API測試和檢查錯誤。


一個基本OpenGL ES應用程式其步驟如下:
1. 建立專案檔


2. 查看自動產生的程式


3. 擴增GLSurfaceView類別物件的程式

(新增的程式用藍色字表示)

package nkut.cce.smartliving.opengl;

import android.app.Activity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;

public class OpenGLActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GLSurfaceView view = new GLSurfaceView(this);
view.setRenderer(new OpenGLRenderer());
setContentView(view);
}
}


4. 建立新的渲染類別


5. 查看新的渲染類別程式


6. 擴增渲染類別程式,來控制視域的模式


package nkut.cce.smartliving.opengl;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.opengl.GLSurfaceView.Renderer;
import android.opengl.GLU;

public class OpenGLRenderer implements Renderer {

@Override
public void onDrawFrame(GL10 gl) {
// TODO Auto-generated method stub
// 清除螢幕和深度緩衝區
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
}

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
// TODO Auto-generated method stub
// 設定新視域視窗的大小
gl.glViewport(0, 0, width, height);
// 選擇投射的陣列模式
gl.glMatrixMode(GL10.GL_PROJECTION);
// 重設投射陣
gl.glLoadIdentity();
// 計算視窗的寬高比率
GLU.gluPerspective(gl, 45.0f, (float) width / (float) height, 0.1f,
100.0f);
// 選擇MODELVIEW陣列
gl.glMatrixMode(GL10.GL_MODELVIEW);
// 重設MODELVIEW陣列
gl.glLoadIdentity();
}

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// TODO Auto-generated method stub
// 設定背景顏色為黑色, 格式是RGBA
gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
// 設定流暢的陰影模式
gl.glShadeModel(GL10.GL_SMOOTH);
// 深度緩區的設定
gl.glClearDepthf(1.0f);
// 啟動深度的測試
gl.glEnable(GL10.GL_DEPTH_TEST);
// GL_LEQUAL深度函式測試
gl.glDepthFunc(GL10.GL_LEQUAL);
// 設定很好的角度計算模式
gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
}

}


7. 執行結果

2011年4月15日 星期五



生活雜記---Cloud Connect

如果嫌Office Live 或 SkyDrive 不好用、速度太慢,
那可以試試看Google Cloud Connect for Microsoft Office。

安裝方法很簡單

1.連結到 Google Cloud Connect for Microsoft Office網站 http://tools.google.com/dlpage/cloudconnect

2.下載並安裝 Google Cloud Connect


系統需求:
裝載 .NET Framework 2.0 的 Windows XP、Windows Vista 或 Windows 7
Microsoft Office 2003、Office 2007 或 Office 2010


3.打開 Word 會看到 Google Cloud Connect 工具列

4.點選登入會要求登入Gmail

5.每次儲存都會和Google的文件同步,還可以共同編修文件

2011年4月12日 星期二

Google Map Javascript API 用於行動裝置

若想在手機上單純使用Web來展示Google Map
Web上有需要注意的是地圖畫布的大小,預設可以先將地圖畫布的div寬度和長度都設定100%
當然也可以用DOM的navigator.userAgent屬性來判斷是使用什麼裝置來上網,依裝置來設定畫布大小
Google有提供簡單的範例如下:

function detectBrowser() {
var useragent = navigator.userAgent; //取得userAgent屬性物件
var mapdiv = document.getElementById("map_canvas"); //取得地圖畫布

//判斷如果是來自iPhone或是Android手機裝置時,將畫布長寬設為100%
//若不是來自iPhone及Android裝置,則設為600*800大小的畫布
if (useragent.indexOf('iPhone') != -1 || useragent.indexOf('Android') != -1 ) {
mapdiv.style.width = '100%';
mapdiv.style.height = '100%';
} else {
mapdiv.style.width = '600px';
mapdiv.style.height = '800px';
}
}

這樣在手機的Web上看到的圖台就可以是滿版的畫面
如果是在iPhone上展示,可以在web程式的header裡加入下列meta資料
meta name="viewport" content="initial-scale=1.0, user-scalable=no"
使用此meta設定會指定以全螢幕顯示地圖,且使用者不得調整地圖大小

完整範例參考如下:


上述方法只適用於網頁開發~~
如果想針對手機裝置進行開發,最好還是用手機原生的Framework
在iPhone上有MapKit套件,在Android上有MapView可以使用
iPhone可以參考:http://developer.apple.com/library/ios/search/index.php?Search=map+kit




Google Maps Javascript API 第 3 版

Google在去年的時候己經推出新版的Google Map API 第三版
這個版本不但不用再申請API Key
還針對行動化裝置進行過處理
有興趣的可以參考Google Map API網站:

新版的宣告方式也跟第二版的不同
新版的宣告方式如下(因javascript tag會被擋,請看最下方程式碼有完整的宣告):
 type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false" 

新版的地圖的宣告方式如下:
用Json來定義你預設的zoomlevl、中心點座標及底圖的型別
var myLatlng = new google.maps.LatLng(-34.397, 150.644);
var myOptions = {
zoom
: 8,
center
: myLatlng,
mapTypeId
: google.maps.MapTypeId.ROADMAP
};

最後再以new 出map物件,並把預設的myOptions物件代入,即可產生簡單的地圖元件
var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

完整的程式碼如下:


詳細的資料可以參考:



2011年4月11日 星期一

Java Native Interface (JNI) 實戰篇

上一篇觀念篇中在PC上的Ubuntu系統中,學習了JAVA呼叫C的方法,本篇就來寫一個透過com port讀取GPS座標的實作,下圖是這次實作的環境。

Java Native Interface (JNI)入門 -- 觀念篇

眾所皆知,Java是一種可以跨平台的程式語言,而JNI是可以讓Java applications跟用其它語言(諸如C,C++)寫成的應用程式或程式庫互相呼叫使用。
JNI技術的出現主要基於三個方面的應用需求:
A.解決效能問題。
B.解決周邊硬體介面呼叫問題或解決標準JAVA預設函式庫中支援你的應用程式所需的平台相關的功能。。
C.可沿用已開發過的C語言,不須重複開發移植到Java系統。

如何在Android平台上移植藍牙

上星期四上課後就計畫移植Bluetooth USB Dongle到開發版上,利用這個假日整理一下移植藍牙的實作讓同學參考一下,下面是整個移植的過程說明。

環境:
OS:Ubuntu 10.10
DMA-6410XP及DMA-6410L
Bluetooth USB Dongle
Kernel:linux-2.6.29
Android 2.1
編輯Kernel及Android原始碼部分本文不進行詳細敘述,細節請參照開發版所附書籍。
(本文使用的是隨手取得的無牌的香菇造型藍牙傳輸器價格大約在NT$200左右,
應該是Bluetooth V2.0+EDR規格其他並沒有測試過!!建議不要使用太新以避免Kernel內附驅動不支援)

2011年4月5日 星期二

如何在Android平台上移植GPS

下面連結是關於如何在Android平台上移植GPS,
前一陣子剛好研究的東西,今天無意間找到一個網站,該站作者寫得很完整了.....
包括了GPS的On/OFF及座標讀取等資料都寫得很清楚(對岸真強阿~)

Android之GPS研究(資料篇)--這裡轉貼的網頁資訊寫得很充足,寫觀念要先知道才會看得懂後面實戰的部分說明。
http://blog.chinaunix.net/space.php?uid=25369701&do=blog&id=116109

Android之GPS研究(實戰篇一)
http://blog.chinaunix.net/space.php?uid=25369701&do=blog&id=118662

Android之GPS研究(實戰篇二)
http://blog.chinaunix.net/space.php?uid=25369701&do=blog&id=125329

2011年4月4日 星期一

Android Game 快速學習手冊

今天整理一份Android Game 快速學習手冊,下載網址http://cce.nkut.edu.tw/android/AndroidGame.pdf

Android 按鍵基礎程式設計教學 - 設定監聽器覆寫事件方法

安裝Android SDK 工具,請參考http://cheng-min-i-taiwan.blogspot.com/2010/03/android-sdk.html
最基本程式設計Hello World是請參考http://cheng-min-i-taiwan.blogspot.com/2010/03/android-hello.html
本篇將介紹如何設計最基本的事件處理函式的設計,其步驟如下:
1. 建立新專案

2. 新增按鈕並設定其標題

3. 宣告按鈕物件並引進其類別宣告(在紅色圈圈處按下右鍵)

4. 利用findViewById函式來建立程式物件和視覺物件間的關係

5. 設定按鈕事件監聽接收器

6. 建立按鈕事件處理監聽物件

7. 增加未實作的覆寫方法的宣告

8. 撰寫事件處理程式

9. 執行結果