2015年10月26日 星期一

NFC於Android之應用

NFC基本原理
# 近場通訊NFC(Near Field Communication)無線射頻辨識 (Radio Frequency IDentificationRFID)的一種延伸技術

具有以下特點:
# 非接觸式點對點資料傳輸
# 10 公分 (3.9 英吋)
# RFID演變而來
# 13.56MHz運行於20公分內
# 傳輸速度106 Kbit / 212 Kbit/ 425 Kbit/
# ISO/IEC IS 18092 國際標準
# EMCA-340標準
# ETSI TS 102 190 標準
# 讀取模式 : 主動 / 被動


NFC
Bluetooth
Bluetooth Low Energy
RFID相容
ISO 18000-3
active
active
標準化機構
ISO/IEC
Bluetooth SIG
Bluetooth SIG
網路標準
ISO 13157 etc.
IEEE 802.15.1
IEEE 802.15.1
網路類型
Point-to-point
WPAN
WPAN
加密
not with RFID
available
available
範圍
< 0.2 m
~10 m (class 2)
~1 m (class 3)
頻率
13.56 MHz
2.4-2.5 GHz
2.4-2.5 GHz
Bit rate
424 kbit/s
2.1 Mbit/s
~1.0 Mbit/s
設定程式
< 0.1 s
< 6 s
< 0.006 s
功耗
< 15mA (read)
varies with class
< 15 mA (xmit)


NFC的資料通訊模式分為主動模式與被動模式兩種:
(1) 主動模式 (有源標籤)
在主動模式下,NFC的兩端設備都必須要支援全雙向的資料交換,
接收端需要有電源供應,稱為有源標籤.

(2) 被動模式 (無源標籤)
在被動模式下,NFC的啟動端,將要傳輸的訊息發送到NFC的接收端,接收端本身不需要有電源的供應,就像是我們的悠遊卡一樣,接收端利用發送端所產生的電場回應訊息給NFC的啟動端。

# 在每張NFC卡在出廠時都會配有一組UID,基本上是不可更改的.

使用Android Mobile作為NFC模擬卡:
在一部配備NFC功能的手機實現NFC卡的模擬,目前有兩種方式.
一種是基於硬體的,稱為虛擬卡模式(Virtual Card Mode).
一種是基於軟體的,被稱為主機卡模式(Host Card Mode).
在硬體的虛擬卡實現中,需要有SE模組的支援(Secure Elemen),而SE模組的實施有以下方案:
#內嵌於 SIM
#內嵌於 SD
#內嵌於 NFC 晶片

20131031日,google發布android 4.4系統,其中包含一種叫HCE(Host Card Emulation)的技術.HCE能使用軟體的方式使行動裝置能使用NFC卡模擬的功能.
HCE技術是模擬NFCSE通信的協議和實現。但是HCE並沒有實現SE,只是用NFCSE通信的方式告訴NFC讀卡器後面有SE的支持,從而以虛擬SE的方式完成NFC業務的安全保證.

Android4.4系統使用NFC論壇制定的的ISO-DEP標準協議(基於ISO/IEC14443-4ISO-DEP)標準)進行數據傳輸,傳輸的數據單元被稱為應用協議數據單元(APDUs)

權限:
<uses-feature android:name="android.hardware.nfc.hce" android:required="true" />
<uses-permission android:name="android.permission.NFC" />

服務註冊:
  <!-- Service for handling communication with NFC terminal. -->
        <service android:name=".CardService"
                 android:exported="true"
                 android:permission="android.permission.BIND_NFC_SERVICE">
            <!-- Intent filter indicating that we support card emulation. -->
            <intent-filter>
                <action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
            <!-- Required XML configuration file, listing the AIDs that we are emulating cards
                 for. This defines what protocols our card emulation service supports. -->
            <meta-data android:name="android.nfc.cardemulation.host_apdu_service"
                       android:resource="@xml/aid_list"/>
        </service>
<!-- END_INCLUDE(CardEmulationManifest) -->

AID註冊:
<!-- BEGIN_INCLUDE(CardEmulationXML) -->
<host-apdu-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:description="@string/service_name"
    android:requireDeviceUnlock="false">
    <!--
    If category="payment" is used for any aid-groups, you must also add an android:apduServiceBanner
    attribute above, like so:

    android:apduServiceBanner="@drawable/settings_banner"

     apduServiceBanner should be 260x96 dp. In pixels, that works out to...
       - drawable-xxhdpi: 780x288 px
       - drawable-xhdpi:  520x192 px
       - drawable-hdpi:   390x144 px
       - drawable-mdpi:   260x96  px

    The apduServiceBanner is displayed in the "Tap & Pay" menu in the system Settings app, and
    is only displayed for apps which implement the "payment" AID category.

    Since this sample is implementing a non-standard card type (a loyalty card, specifically), we
    do not need to define a banner.

    Important: category="payment" should only be used for industry-standard payment cards. If you are
        implementing a closed-loop payment system (e.g. stored value cards for a specific merchant
        or transit system), use category="other". This is because only one "payment" card may be
        active at a time, whereas all "other" cards are active simultaneously (subject to AID
        dispatch).
    -->

    <aid-group android:description="@string/card_title" android:category="other">
        <aid-filter android:name="F222222222"/>
    </aid-group>
<!-- END_INCLUDE(CardEmulationXML) -->
</host-apdu-service>

繼承 and 複寫:

public class CardService extends HostApduService
{
...

 // BEGIN_INCLUDE(processCommandApdu)
    @Override
    public byte[] processCommandApdu(byte[] commandApdu, Bundle extras) {
        Log.i(TAG, "Received APDU: " + ByteArrayToHexString(commandApdu));
        // If the APDU matches the SELECT AID command for this service,
        // send the loyalty card account number, followed by a SELECT_OK status trailer (0x9000).
        if (Arrays.equals(SELECT_APDU, commandApdu)) {
            String account = AccountStorage.GetAccount(this);
            byte[] accountBytes = account.getBytes();
            Log.i(TAG, "Sending account number: " + account);
            return ConcatArrays(accountBytes, SELECT_OK_SW);
        } else {
            return UNKNOWN_CMD_SW;
        }
    }
    // END_INCLUDE(processCommandApdu)

...
}

Android官方範例:

使用Android Mobile 作為NFC讀卡機:
連線至讀卡機後,傳送SELECT AID的指令,
NFC 模擬卡的部分,我們設定AID (Application ID) = F222222222
因此傳送此指令:
00A4040005F222222222


參考資料:

2015年9月29日 星期二

致冷片+水冷散熱

因為之前的致冷效果並不理想,
所以最近就把硬體的等級在拉高一點.
把致冷片換成12V, 8.5A ,
又順便弄了一顆350W的電源供應器.

而致冷片的熱面,
試過很多散熱片+風扇,
以及各式各樣的散熱方法,
效果都不理想.

最後還是弄了水冷散熱效果比較理想.
圖二是開機5分鐘和30分鐘後的圖.
終於可以在常溫下結霜了.

耗電量粗算約110W
110W * 8小時 = 880/1000= 0.88 度
0.88度*3元*30天 = 約 80元/月




2015年9月9日 星期三

Cura - 3D 列印切片軟體

Cura 是Ultimaker 公司所釋出的開源軟體,Cura能將STL的圖檔轉換為GCode檔案,讓3D印表機能根據轉換出的參數,進行打印.

Cura的組成有兩大部分,一部分是由Python所呈現的UI.
另一部分是C++ 做為核心的列印引擎.

Cura 的安裝包Sctipy可透過 ”package.sh ”接參數win32製作.

參考文獻:

編譯環境需要的基本軟體:
˙Windows SDK

˙7z

# 注意事項:
# 安裝Arduino的預設路徑與package.sh的可能不同
# 安裝Winavr的版本中,GNUmake.exe的版本在3.82以下有bug,須更新至4.1以上
# ARDUINO 1.6.4 不相容,需安裝ARDUINO1.0.6

If you'rerunning Windows 8 or higher, the Make in WinAVR won't work as distributed. Download this file and install it in winavr's util/bin directory afterinstalling WinAVR:
http://www.madwizard.org/download/electronics/msys-1.0-vista64.zip

WinAVR
"Date modified" is also odd for me since therelease is named "WinAVR-20100110" and I do not believe thattime-travel is possible in our universe I doubt that even this is correct ...

There is also a file named "make.exe.old" but it is waste of time touse/test that since I already know that this version is not better.

Anyway I found the workaround (to be correct it is just a workaround, not afinal solution) it is fine for me that way. We plan to move to AtmelStudio/toolchain anyway ...

Problem : #\$_OUTDIR/Lib/site-packages

------
以上為核心建置的部分
------
若只需要修改UI,可直接修改Python檔案即可.
------
Cura的安裝檔為一個壓縮檔,安裝的過程中會解壓縮檔案至目錄,並可選擇是否安裝Arduino的驅動程式.

Python的檔案結構
# 在第一次執行Cura的時候,Cura會去執行\\Cura\cura.py
# Cura.py在第一次時會去執行configWizard.py 的設定檔視窗
# 220 行 (options[5] 預設第五個選項)這是視窗選項預設的語言

例如:
def AddCombo(self, label, options):
combo = wx.ComboBox(self, -1, options[5], choices=options, style=wx.CB_DROPDOWN|wx.CB_READONLY)
text = wx.StaticText(self, -1, label)
self.GetSizer().Add(text, pos=(self.rowNr, 0), span=(1, 1), flag=wx.LEFT | wx.RIGHT)
self.GetSizer().Add(combo, pos=(self.rowNr, 1), span=(1, 1), flag=wx.LEFT | wx.RIGHT)
self.rowNr += 1
return combo

設定完成以後,設定檔的位置會被寫入
設定檔位置C:\Users\User_name\.cura

而之後每次執行都會去Load profile,執行C:\Users\User_name\.cura
內所設定的參數檔.

Resource.py 資源檔
434 行 (self.OtherRadio =self.AddRadioButton(_("測試機型")))

C:\Users\User_name\.cura\current_profile.ini 設定完預設參數

Python 程式碼 :
Cura_15.04.2\resources\machine_profiles 機器設定原始參數
Cura_15.04.2\resources\locale\zh\LC_MESSAGES\Cura.po 對照Python

參考資料:

在修改Python檔案以後,重新執行即可.

因此,若要修改UI層級的軟體,可透過修改設定檔和Python的直譯檔即可.

Cura 是透過 Protobuf與Python的UI做溝通的,Protobuf是一種簡單的數據結構,是Google內部用來做混合語言的溝通.

參考資料:

2015年8月1日 星期六

女性一生的親密關係 (筆記)

女性的角色其一生主要圍繞在四個面向,
原生家庭、孩子、伴侶、以及姻親家庭.

對於目前的社會型態來說,
女性終究是比男性在乎親密關係的.
然而,親密關係似乎比想像的困難,
無條件的愛更是顯得遙不可及.

一但真正去面對自己可能是個痛苦的經驗,
但如果逃避,
我們將會連正面情緒也無法接觸.

有些人原生家庭十分幸運,
有些人則顯得有些辛苦,
但不論如何,
這些經驗都會帶給我們一些體悟, 
成就了現在的我們.

從女性的角度,
"親密關係"和"人際關係"可以看出自己過去的依附關係和原生的傷痕,
是否有錯誤的歸因,才能去面對自己,直到傷痕療癒.
有時候我們必須去檢視自己,
不斷抓住某種痛苦/傷痕是為了什麼?

我們每個人小時候或多或少都想過拯救我們自己的家庭,
在能量上會吸附母親(或父親)的悲傷.
很可能過去的經驗是,
我是沒有價值的,我是不被愛的, 
在這樣的經驗中所形成的親密關係,
含有多大的恐懼,
總是考驗著愛情.

而我們正在寫著一個怎樣的人生劇本? 該如何選擇?
不論我們如何選擇, 另一個沒被選擇的部分, 都會成為遺憾.
因為它總留有無限的可能性.

---
你會選擇怎麼樣的伴侶?

在伴侶關係中,
我們往往彼此都在複製傷痕,
過去被拋棄的經驗,
讓我們會不斷的回到創傷經驗,
只為了要重整它.
以為這次會有一個希望,這次一定會搞定,
我本來以為我可以,但我又挫敗了,這樣的潛意識讓我們產生熟悉的挫折感.
---
以下一個簡易的測驗是典型的婚姻治療學派常用的方法之一

試著回想過去小時候,我們的主要照顧者(可能是父親或母親),

他們的正向特質部分?(稱為A),負向特質部分?(稱為B).
然後小時候一直想要得到的是?(稱為C),可能是陪伴或是關注等等.
以及我們小時候遇到挫折時,回應的方式是?(稱為D)
最後小時候經驗美好回憶時的感覺是?(稱為E)

我們找到A~E的答案以後,把它套入以下形容,即是我們可能尋找的伴侶關係.
----------------------------------------------------------------------------------------------------------------
我一直在尋找一個擁有B的伴侶,他最好是有A,能夠給我C,並讓我感到E,但我常會因為D而使自己得不到理想中的親密關係.
----------------------------------------------------------------------------------------------------------------
這是一個婚姻治療學派的其中一種方法,
B 的部分稱為致命吸引力,
我們習慣透過這樣的方式去療癒過去的傷口.
B 是我們心動的部分,
因為它代表我們未走完的歷程.
在B中,父母曾經傷害自己的部分,
使我們透過伴侶想變成理想中的父母,
在一次經驗這樣的歷程,
但總希望這次能給我們不同的經驗,
讓我們的過去得以療癒.

而D的部分,
其實我們這一生的課題,
還是不斷的與自己的陰影相遇,
所以過去遇到挫折的回應方式,
往往是長大後困住我們的主要因素之一.

2015年7月28日 星期二

從另一種角度理解情感同理心

在學了多年的資訊工程領域以後,
總會想試著用各種角度去理解這個世界,
以及其他人所感受到、在乎的事情.

所以這篇本來是要整理軟硬整合系統的筆記,
卻硬是要扯到同理心.

[人類從食物採集者變身為資訊採集者。──麥克魯漢]

從資訊工程的角度來看,
粗略分成硬體和軟體兩部分.
這兩部分組成一個設備(Device)

兩台設備之間的溝通則稱為通訊.
通訊的目的是為了傳遞某樣事物或概念.

如果要傳遞溫度,
大致上的流程,
要先有一個會因為溫度而變化的物質.
法拉第、赫茲等大大就發現了一堆效應和定理,
讓我們能瞭解物質變化的特性.

但有這些還不夠, 
因為連續的訊號輸入和時序有關,
所以我們需要一個震盪器來產生頻率.

而在電子元件的接收方和發送方,
頻率必須一樣才能傳遞正確的訊號.

但即使正確傳遞了訊號,
仍然無法解讀這些訊號的意義,
所以必須靠通訊協定.
兩台設備必須先定義好這些訊號所代表的意義.

所以設備間的通訊就在一堆 
電/磁/訊號/頻率 換來換去的情況下傳遞了.
而其中由於傳遞的方式/概念越來越複雜,
所以描述這些邏輯的軟體也就越來越複雜.

-------------------------------------------------------------

情感同理心, 能夠體會他人的情緒和想法、理解他人的立場和感受.

情緒, 感受,
這些東西的產生和環境, 成長背景以及原生的個性有關係. (想法和立場先放一邊)

感受和情緒會產生,
都是因為接收到外在物質狀態的改變,
經由認知判斷,
所形成自身狀態改變的一種概念.

而若要能瞭解他人的感受,
要先瞭解對方對於外在環境變化的感測能力,
以及解讀感測資訊所採用的認知模式,
最後產生的變化再與當前的感受疊加或相互影響,

才會對方是真正的感受.

而相互能同理的溝通, 才是真正的溝通.
否則都是誤解.

-------------------------------------------------------------

認真瞭解一個人

而要知道電子元件的感測能力,
或是頻率. 可以拿三用電表, 示波器.

要知道軟體系統所採用的認知模式, 通訊協定
可以讀原廠的規格, 如 [android][windows], [tcp/ip] , ...

要知道系統當前狀態,
可以print system log.

但如果是人呢?
只能不斷的反覆理解, 確認,
然後修正.

確認我們所用的語言定義是一致的,
妳的感受轉換成語言,
語言在轉換為我的感受去確認妳的感受,
也是一致的.

而還要再確認這些感受,
在經過妳所成長的環境, 與認知的解讀方式.
所產生的變化.

要知道認知的方式,
要仔細的瞭解成長背景, 
以及原生的個性.

最後還要瞭解和細心察覺妳目前的狀態,
才算是完全的同理.

而過程有太多的不確定和失真的因素.

但這只是相互體諒, 包容, 溝通的第一步

-------------------------------------------------------------

所以後來我才瞭解,
原來要能真正聽懂/同理對方所要表達的,
與對方所感受的,
是有多麼不容易.

所以後來我很喜歡說,
我想認真的瞭解、傾聽,
因為在關係中,
注定不會有完全的同理,
訊號在不斷的轉換中,
難免會有失真.

我們唯一能做的就是認真,
認真的對待每一件事物,
盡力而為.

-------------------------------------------------------------