2013年7月31日 星期三

android 開發使用 NFC TAG

在Android系統下,使用NFC必須先在Android系統開啟NFC認證(註冊)才可以在Android系統下使用,

而 NFC message 以 NDEF NFC Data Exchange Format (NDEF)格式為主,

但是 遇到非 NDEF NFC Data Exchange Format (NDEF)格式 也是有其他的方法可以使用。

而使用 NFC 有一些注意到的事項,

Android 2.3.3 (API Level 10)才有支援完整的NFC功能,

Android 4.x 支持 Android Application Record (AAR),

Android 4.0 支持 Beam,

在Android developers官網裡分別有二篇文章說明NFC的使用:<NFC Basics>與<Advanced NFC>。

根據 NFC Basics 學習在Android上,

如何傳送與接收NDEF data message,

來自NFC tag 、 Beaming NDEF Message由一個device到另一個,

操作NFC APIs、Android Beam™,

NDFE data 從 NFC tag 中取出,

交由tag dispatch system進行處理,包括:分析發現的NFC tags、將資料進行分類,並且根據資料啟動應用程式。

一個應用程式想要處理被掃瞄到的NFC tag,可以宣告intent filter與請求要處理的data。

NDEF record的定義:

由四個資訊組合:
1). 3-bit TNF (Type Name Format):
      說明如何解釋Type欄位 (Variable length type)的格式。透過下表說明the tag dispatch system如何透過TNF與type field
      來識別該NDEF message是MIME type或URI。可以被配對到的NDEF message,系統會觸發ACTION_NDEF_DISCOVERED,
      如果無法配對,系統會再倒給ACTION_TECH_DISCOVERED進行配對,如果沒有再退給ACTION_TAG_DISCOVERED。

2). Variable length type:
      描述該record的類型。如果是TNF_WELL_KNOWN,使用該欄位需要參考Record Type Definition (RTD)。

3). Variable length ID:
      該record的unique identifier。該欄位經常不使用,但如果需要唯一識別該tag,可以建立一個ID給他。

4). Variable length payload:
      實際想要讀或寫的資料內容(data payload)。一個NDEF message可包括多個NDEF records,所以不要以為所有的資料
     均寫在NDEF message的第一個record。

以下的註冊就是教你如何在Android系統下使用NFC,

註冊filter ACTION_NDEF_DISCOVERED:
            為了filter ACTION_NDEF_DISCOVERED intents,宣告intent filter要處理的資料類型。
以下例子使用處理MIME Type為text/plain:
<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:mimeType="text/plain" />
</intent-filter>
以下例子使用處理URI類型:http://developer.android.com/index.html;
註冊處理為http的scheme,developer.android.com的host,以及固定第一個字段為:index.html。
<intent-filter>
    <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
    <category android:name="android.intent.category.DEFAULT"/>
   <data android:scheme="http"
              android:host="developer.android.com"
              android:pathPrefix="/index.html" />
</intent-filter>


註冊filter ACTION_TECH_DISCOVERED:
          如果要註冊filter ACTION_TECH_DISCOVERED,需要在專案中增加一個新的XML檔案,定義該應用程式支持的 tech-list sets。
可以透過呼叫getTechList()來確認偵測到的NFC tag是否與定義的tech-list sets有所匹配。該檔案建議放罝於<project-root>/res/xml目錄下。
舉例來說:
如果一個tag被偵測到,它支持三種標準:MifareClassic、NdefFormatable與NfcA,在定義的tech-list sets就需要加入這些標準,
可能是一個、二個或三個標準都支持,以確保可以處理該intent。以下列出定義常見的tech-list集合:
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.IsoDep</tech>
        <tech>android.nfc.tech.NfcA</tech>
        <tech>android.nfc.tech.NfcB</tech>
        <tech>android.nfc.tech.NfcF</tech>
        <tech>android.nfc.tech.NfcV</tech>
        <tech>android.nfc.tech.Ndef</tech>
        <tech>android.nfc.tech.NdefFormatable</tech>
        <tech>android.nfc.tech.MifareClassic</tech>
        <tech>android.nfc.tech.MifareUltralight</tech>
    </tech-list>
</resources>

另外,也可以定義多組tech-list sets。每一個tech-list set是獨立的,如果任何一組tech-list set被匹配到,activity將會被啟動,
該activity也可以透過getTechList()來確認偵測到的NFC tag是否與定義的tech-list sets有所匹配。它提供了 AND 與OR的定義匹配技術。
透過下列範例,說明支持NdefA與NdefB:
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.NfcA</tech>
        <tech>android.nfc.tech.Ndef</tech>
    </tech-list>
</resources>

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <tech-list>
        <tech>android.nfc.tech.NfcB</tech>
        <tech>android.nfc.tech.Ndef</tech>
    </tech-list>
</resources>

定義好了resource,可以在AppManifest.xml中指定activity透過<meta-data />定義要使用那一個resource。如下:
<activity>
...
<intent-filter>
    <action android:name="android.nfc.action.TECH_DISCOVERED"/>
</intent-filter>

<meta-data android:name="android.nfc.action.TECH_DISCOVERED"
    android:resource="@xml/nfc_tech_filter" />
...
</activity>
更多詳細的資料可以參考<Working with Supported Tag Technologies>。


註冊ACTION_TAG_DISCOVERED:
<intent-filter>
    <action android:name="android.nfc.action.TAG_DISCOVERED"/>
</intent-filter>

擴增實境Augmented Reality

擴增實境為將電腦產生的視覺影像及資訊整合到現實環境的一種應用與技術,與虛擬實境不同的地方在於透過電腦上建構一個虛擬的世界,且藉由特殊界面讓人們進入該虛擬世界中,如同身處在真實世界一般,因此虛擬實境比擴增實境的應用限制來的大。

目前擴增實境可被用來應用於醫療、工業、軍事等,目前高通推出擴增實境開發平台vuforia ,進去該網頁後點擊右上角註冊按鈕如下圖
該平台為免費的開發平台,接下來進到環境建置教學網頁 進行環境建置,由該網頁資料可以了解該平台環境需求為:

Component
Version
JDK
Java SE 7u21
Eclipse IDE
最新版本
Android SDK Downloader
Android SDK Tools revision 22
Android ADT
最新版本
Android SDK Tools
Android SDK Tools revision 22
Android SDK platform support
Android SDK Platform tools revision 17
Cygwin Environment
Latest version 1.7.18-1
Android NDK
Android NDK r8e

2013年7月17日 星期三

REST 與 RESTful 架構

REST( REpresentational State Transfer ),為"具體狀態傳輸",是一種架構模式,用於Web上的架構。Web上所有資源都可統稱resource,因resource以URI表示,具有唯一識別性;因而能用以區分所有的網路資源。Client觸發某個超連結時,Web能夠以該事件啟用下一個狀態或resource,依此藉由Client不斷的觸發而產生的狀態變動

如下為REST 的優點:

  • 支援快取 caching 將改善反應時間跟server的負載能力。
  • 因為不必維持連結狀態,大大改善 server 的 scalability 能力。這表示不同server可以處理同一串 requests。
  • 一個瀏覽器就可以存取任一應用程式跟資源,client 端不需使用別的軟體。
  • 在HTTP之上不依存其他機制跟軟體。
  • 跟其他連結方式相比(如RPC),可以提供相等的功能。
  • 不需要其他的 discovery 機制,因為使用超連結了。
  • 提供比RPC更好的長期相容性,因為 :
  • 如同HTML這種文件具有後前及向後的相容能力
  • 支援新的內容格式不需要丟掉舊的

RESTful所表示是符合 REST principles 的系統稱做 RESTful,細部則是RESTful的環境,Client建構URL跟規劃好的resource做對應,明確排程Web狀態的改變。簡單來說,若是以 HTTP 為基礎來設計 RESTful 系統,即是完善的使用 HTTP,因為 HTTP 本身就是 REST 的實作。


參考出處:
http://ihower.tw/blog/archives/1542
http://blog.kkbruce.net/2012/04/aspnet-web-api-2-rest.html#.Udr-P_kwdsx
http://blog.toright.com/archives/1399