2011년 11월 21일 월요일

ZigBee VS. BLE(Bluetooth 4.0)

2011/11/18에 COEX에서 하는 RFID/USN Korea 2011을 참관하였습니다.

RFID는 들어 봤지만 USN은 뭔지도 모르고 갔는데 ubiquitous sensor network 이더군요.


RFID야 매우 오래된 분야이고 물류쪽에 적용하여 많이 활성화된 기술입니다.




아래 사진은 RFID를 통해서 물류쪽에 적용할 수 있는지 시물레이션하는 모형인데 모형이 참 인상적이 었습니다. 




모형 제작에 상당한 시간과 돈이 들었을 것 같은데 마치 박물관이나 전시회에서나 볼 정도의 완성도였습니다.


이제는 Nexus S, Galaxy S2에 NFC가 기본 탑재되어 있어서 산업/물류 뿐만 아니라 실생활에 어떻게 활용 될지에 대한 내용이 흥미로 왔습니다.


쿠폰을 문자로 받고 화면에 바코드나 번호를 보여 주는 방식에서 NFC를 통해 쿠폰을 받고 결재하는 방식으로 NFC를 이용함으로써 직관적이라는 느낌이 들었습니다. 


CGV에서 쿠폰 및 결재를 NFC가 있는 핸드폰에서 곧 서비스 계획에 있으며 데모를 시현하고 있었습니다.


그리고 기존에 NFC가 없는 핸드폰이나 특수 사용을 목적으로 NFC 외부 모듈 형식에 제품도 많이 보였습니다.




주류 마개에 RFID tag를 넣고 RFID 리더기로 읽고 Bluetooth과 연결된 핸드폰으로 tag 값을 전달 후 인터넷을 통해 진품확인하는 시스템입니다.


그리고 저의 관심 분야인 USN입니다.


아래 사진은 휴인스에서 USN 개발킷입니다.
http://www.huins.com/m16.php?m=rd&no=77#bimg




안드로이드 단말기에서 현관문도 열 수 있고 전구도 on/off가 가능합니다.


여기에 사용된 방식이 ZigBee입니다.


BLE(Bluetooth 4.0)과 ZigBee 어느 쪽이 USN에서 승자가 될까요?


둘다 저전력을 목표로 제작된 것입니다.


하지만 iPhone 4S에 BLE가 적용된 칩이 들어갔고 차후 안드로이드 역시 BLE가 적용된 Wi-Fi/Bluetooth 가 적용된 칩이 적용되겠죠.
broadcom의 bcm4330이 나와 있습니다.


BLE가 전망이 더 밝은 이유가 안드로이 Open Accessory Development Kit에서 채용되지 않을까 예상해 봅니다.


현재 adk는 USB 통신인데 이로 인해 말이 안되는 accessory가 되었죠. 
Google에서 다음 버전은 Bluetooth 무선 accessory가 될것이라 했기 때문에 BLE가 ZigBee 보다는 더 전망이 밝다고 보입니다.



2011년 11월 18일 금요일

foursquare를 이용한 Googl Calendar 관리

Google Calendar를 이용하여 일정관리를 많이 하실겁니다.

스마트폰으로 calendar 어플을 띄워서 시간 장소를 입력하기가 막상 귀찮아서 몇번 하다가 말죠.

foursquare를 이용하여 google calendar에 일정관리 하는 간단한 방법이 있습니다.

일단 스마트폰에서 foursquare를 이용하여 check-ins을 하시고

자신의 foursquare 계정에서 아래의 주소를 들어가시게 되면 URL 주소를 확인 하실 수 있습니다.

https://ko.foursquare.com/feeds/

그리고 Google Calendar에서 다른 캘린더 -> URL 추가에 위에서 ics 링크를 넣어주면 foursquare에서 check-in한 장소들이 Google Calendar에 추가됩니다.

2011년 11월 13일 일요일

android LockScreen 사용 안 하기

android는 Lock Screen을 풀어야 사용할 수 있는 컨셉입니다.

당연히 handheld 제품이라면 필요한 UI입니다.

제가 작업하는 android에는 필요없는 UI 컨셉인 관계로 부팅 후 바로 Home Screen이 나오도록  수정하여 보겠습니다.

framework/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java 에서


public int finishAnimationLw() {
    int changes = 0;

finishAnimationLw() 함수가 있습니다.

        // Hide the key guard if a visible window explicitly specifies that it wants to be displayed
        // when the screen is locked
        if (mKeyguard != null) {
            if (localLOGV) Log.v(TAG, "finishLayoutLw::mHideKeyguard="+mHideLockScreen);
                /*
                if (mDismissKeyguard && !mKeyguardMediator.isSecure()) {
                    if (mKeyguard.hideLw(true)) {
                        changes |= FINISH_LAYOUT_REDO_LAYOUT
                                | FINISH_LAYOUT_REDO_CONFIG
                                | FINISH_LAYOUT_REDO_WALLPAPER;
                    }    
                    if (mKeyguardMediator.isShowing()) {
                        mHandler.post(new Runnable() {
                            public void run() {
                                mKeyguardMediator.keyguardDone(false, false);
                            }    
                        });  
                    }    
                } else if (mHideLockScreen) {
                */
                    if (mKeyguard.hideLw(true)) {
                        changes |= FINISH_LAYOUT_REDO_LAYOUT
                                | FINISH_LAYOUT_REDO_CONFIG
                                | FINISH_LAYOUT_REDO_WALLPAPER;
                    }    
                    mKeyguardMediator.setHidden(true);
                /*
                } else {
                    if (mKeyguard.showLw(true)) {
                        changes |= FINISH_LAYOUT_REDO_LAYOUT
                                | FINISH_LAYOUT_REDO_CONFIG
                                | FINISH_LAYOUT_REDO_WALLPAPER;
                    }    
                    mKeyguardMediator.setHidden(false);
                } 
                */

위과 같이 처리하면 부팅 후 바로 Home Screen이 나옵니다.


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


이 글을 작성 후 USB keyboard를 연결 하고 Home key가 동작하지 않는 버그를 발견했다.


W/KeyguardViewMediator( 2181): verifyUnlock called when not externally disabled

이와 같은 메세지를 출력하는데 이유는 아직 Lock Screen이 있는 상태로 인식 되기 때문인 것 같습니다,

그래서 위에서 제시한 코드를 rollback하고 다른 방법을 찾아 보았습니다.

의외로 간단하게 해결되었습니다.

framework/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java


    /** {@inheritDoc} */
    public void beginAnimationLw(int displayWidth, int displayHeight) {
        mTopFullscreenOpaqueWindowState = null;
        mForceStatusBar = false;
        mHideLockScreen = true;
        //mHideLockScreen = false;
        mAllowLockscreenWhenOn = false;
        mDismissKeyguard = false;
    }   

mHideLockScreen을 true로 만들면 LockScreen도 안 보이고 Keyboard의 Home키가 동작하지 않는 두가지 문제가 동시에 해결됩니다.




2011년 11월 10일 목요일

touch screen이 없는 android에서 app이 죽는 상황

touch screen이 없는 android에서는 Music, Contacts, Phone app이 동작하지 않습니다.

이전 froyo에서는 android 자체가 켜지지 않았지만 gingerbread 부터는 android는 정상 부팅하도록 변경되었습니다.

아래의 메세지와 같이 resource index가 맞지 않아서 죽습니다.

android.content.res.Resources$NotFoundException: Resource contacts

googling 하다가 아래 페이지를 찾았고

https://bugs.launchpad.net/linaro-android/+bug/772528

git log를 보면 fake-ts에 관한 내용이 있습니다.

http://git.linaro.org/gitweb?p=android/device/linaro/common.git;a=commit;h=89a3940ca2ad04a54e4a8aa315f0089ce4621d17

[LINARO] Add fake touchscreen 'driver' to avoid Android activity crash

Some Android activities like 'Music' expect the presence of touchscreen
device, otherwise they would crash due to lacking of corresponding
system resources.

To fix the crash, a fake touchscreen 'driver' is added, which utilizes
uinput to register a touchscreen device in kernel.


touch screen이 없더라도 kernel 드라이버에 fake또는 dummy touch screen driver가 반드시 있어야 합니다.

정확하게는 상황이 이해가 가지 않지만 Music app에서 touch screen을 resource로 관리하고 ts가 없기 때문에 resource index가 문제가 되는 것 처럼 보입니다.

2011년 11월 1일 화요일

android open GL ES 2.0 sample

단말기에서 Open GL ES 2.0이 동작하는 확인 할 수 있는 app

http://code.google.com/p/gdc2011-android-opengl/


svn checkout http://gdc2011-android-opengl.googlecode.com/svn/trunk/ gdc2011-android-opengl-read-only


동작하면 open GL ES 2.0 compatibility 하다고 할 수 있겠죠.


ODROID-A에서 동작하는 모습



2011년 10월 29일 토요일

android-2.3.6_r1(GRK39F) android-2.3.7_r1(GWK74)

android git가 부할해서 간만에 받아 odroid7(s5pc110), odroid-a(s5pc210)와 merge 하였습니다.

android-2.3.6_r1(GRK39F)은 통화에 bluetooth 기능이 추가 된것 같습니다. framework에 bluetooth 관련이 수정 되었고 settings에도 수정 되었더군요.

android-2.3.6_r1(GWK74)는 NFC(nxp)에 firmware upgrade 기능이 추가되었습니다.
저희가 따로 NFC를 개발하는게 있는 관계로 merge를 할 수가 없더군요. chip vendor에서 2.3.7을 release 해주면 그 때 고려 해 봐야 겠습니다.

각 버전은 일단 repo sync로 master를 받으시고 framework/base 폴더에서 git tag를 하시면 현재 어떤 tag가 있는지 확인이 가능합니다.


[~/projects/android-master/frameworks/base]$ git tag
android-1.6_r1
android-1.6_r1.1
android-1.6_r1.2
android-1.6_r1.3
android-1.6_r1.4
android-1.6_r1.5
android-1.6_r2
android-2.0.1_r1
android-2.0_r1
android-2.1_r1
android-2.1_r2
android-2.1_r2.1p
android-2.1_r2.1p2
android-2.1_r2.1s
android-2.2.1_r1
android-2.2.1_r2
android-2.2.2_r1
android-2.2_r1
android-2.2_r1.1
android-2.2_r1.2
android-2.2_r1.3
android-2.3.1_r1
android-2.3.2_r1
android-2.3.3_r1
android-2.3.3_r1.1
android-2.3.4_r0.9
android-2.3.4_r1
android-2.3.5_r1
android-2.3.6_r0.9
android-2.3.6_r1
android-2.3.7_r1
android-2.3_r1


 그리고 repo forall -c git checkout tag명 이렇게 하시면 특정 버전으로 source를 받으실 수 있습니다.

android-4.0.1 버전 emulate도 돌려봤는데 항상 느끼는 거지만 emulate가 너무 느려서...

곧 ICS가 공개 되겠죠... 기대 됩니다.

ODROID-7에 android-2.3.6...


android(Gingerbread)에서 USB 3G Modem 사용하기

android 2.2(froyo)에 HSDPA 3G Modem을 붙여 본 적있습니다.
제 blog에 post한 적이 있습니다.

이번에 gingerbrea(2.3)에 올리는데 성공은 했는데 삽질을 많이 했습니다.
아직 해결 못한 문제도 있고...

ril-daemon이 pppd가 동작하기 전에 특정 동작을 하면 SKTelecom이나 안테나 상태 등을 업데이트 할 수 있습니다. 그런데 이 상태가 되면 pppd로 연결이 실패가 됩니다.

그래서 부팅하고 usb modem이 ril-daemon의 어느 시점 보다 pppd로 접속을 먼저해야 하더라구요.

아래는 참고한 사이트...

그리고 성공 인증샷...