Android/History | Posted by 덩치 2013. 10. 28. 13:25

안드로이드는 ?

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO

안드로이드(Android)는휴대 전화를 비롯한 휴대용 장치를 위한 운영 체제와 미들웨어, 사용자 인터페이스 그리고 표준 응용 프로그램(웹 브라우저, 이메일 클라이언트, 단문 메시지 서비스(SMS), 멀티미디어 메시지 서비스(MMS)등)을 포함하고 있는 소프트웨어 스택이자 모바일 운영 체제이다. 안드로이드는 개발자들이 자바 언어로 응용 프로그램을 작성할 수 있게 하였으며, 컴파일된 바이트코드를 구동할 수 있는 런타임 라이브러리를 제공한다. 또한 안드로이드 소프트웨어 개발 키트(SDK)를 통해 응용 프로그램을 개발하기 위해 필요한 각종 도구들과 API를 제공한다.


안드로이드는 리눅스 커널 위에서 동작하며, 다양한 안드로이드 시스템 구성 요소에서 사용되는 C/C++ 라이브러리들을 포함하고 있다. 안드로이드는 기존의 자바 가상 머신과는 다른 가상 머신인 달빅 가상 머신을 통해 자바로 작성된 응용 프로그램을 별도의 프로세스에서 실행하는 구조로 되어 있다.


2005년에 안드로이드 사를 구글에서 인수한 후 2007년 11월에 안드로이드 플랫폼을 휴대용 장치 운영 체제로서 무료 공개한다고 발표한 후 48개의 하드웨어, 소프트웨어, 통신 회사가 모여 만든 오픈 핸드셋 얼라이언스(Open Handset Aliance, OHA)에서 공개 표준을 위해 개발하고 있다. 구글은 안드로이드의 모든 소스 코드를 오픈 소스 라이선스인 아파치 v2 라이선스로 배포하고 있어 기업이나 사용자는 각자 안드로이드 프로그램을 독자적으로 개발을 해서 탑재할 수 있다. 또한 응용 프로그램을 사고 팔 수 있는 구글 플레이를 제공하고 있으며, 이와 동시에 각 제조사 혹은 통신사별 응용 프로그램 마켓이 함께 운영되고 있다. 마켓에서는 유료 및 무료 응용 프로그램이 제공되고 있다.


안드로이드의 역사 

- 2005년 7월 구글이 미국 캘리포니아 주의 팔로알토에 위치한 작은 '안드로이드'사를 인수


- 2007년 11월 5일 텍사스 인스트루먼트, 브로드컴 코퍼레이션, 구글, HTC, 인텔, LG전자, 마벨 테크놀로지 그룹, 모토로라, 엔비디아, 퀄컴, 삼성전자, 스프린트 넥스텔, T-모바일의 몇몇 회사로 구성된 컨소시엄인 오픈 핸드셋 얼라이언스(OHA)가 모바일 기기의 공개 표준을 개발하는 것을 목표로 결성되었다. 또한 OHA는 리눅스 커널 2.6에서 빌드된 그들의 첫 번째 모바일 기기 플랫폼 결과물인 안드로이드를 발표.


- 2008년 10월 21일 안드로이드의 오픈소스 선언, 구글은 네트워크와 텔레폰 스택을 포함하는 완전한 소스 코드를 아파치 라이선스로 공개하였다.


- 2008년 12월 9일 ARM 홀딩스, 아세로스(Atheros Communications), 아수스, 가르민, 소프트뱅크, 소니 에릭슨, 도시바, 보다폰으로 구성된 새로운 14개의 멤버가 안드로이드 프로젝트에 참여하였다.


- 2010년 12월 15일 중국산 보급형 태블릿 단말 뿐만 아니라 갤럭시탭, 노션 잉크의 아담 등 하이엔드 유저를 겨냥한 태블릿 단말들이 출시되어 있는 상태로 안드로이드는 휴대전화 뿐 아니라 3G 또는 와이파이 전용 태블릿 단말에도 탑재되어 출시되고 있다.


구조 -


안드로이드의 구조는 위쪽 그림과 같은 구성 요소로 구성되며 이 구성 요소에는 응용 프로그램, 응용프로그램 프레임워크, 라이브러리, 안드로이드 런타임, 리눅스 커널의 총 5개의 계층으로 분류되어 있다.


버전 -

안드로이드는 6개월~12개월에 한번씩 업데이트를 진행한다. 업데이트의 내용은 주로 오류 수정이나 새로운 기능 추가로 구성된다. 하지만 이전 버전을 사용하는 기기들은 바로 업데이트를 제공받을 수 없으며, 기기 제조사에서 구글의 소스를 받아 직접 작업후 배포해야 한다. 이때문에 아직도 구버전 사용자가 많은 것이다. 참고로, 안드로이드의 각 버전들은 알파벳 첫 글자를 오름차순에 맞춘 음식 이름(디저트)을 코드명으로 삼고 있다. 버전은 1.0,2.0...으로 올라가며, 앞자리의 숫자가 올라가면 대규모 업데이트(메이저 업데이트), 소수점 아래 숫자가 올라가면 소규모 업데이트(마이너 업데이트)로 판명한다.


안드로이드는 6개월~12개월에 한번씩 업데이트를 진행한다. 업데이트의 내용은 주로 오류 수정이나 새로운 기능 추가로 구성된다. 하지만 이전 버전을 사용하는 기기들은 바로 업데이트를 제공받을 수 없으며, 기기 제조사에서 구글의 소스를 받아 직접 작업후 배포해야 한다. 이때문에 아직도 구버전 사용자가 많은 것이다. 참고로, 안드로이드의 각 버전들은 알파벳 첫 글자를 오름차순에 맞춘 음식 이름(디저트)을 코드명으로 삼고 있다. 버전은 1.0,2.0...으로 올라가며, 앞자리의 숫자가 올라가면 대규모 업데이트(메이저 업데이트), 소수점 아래 숫자가 올라가면 소규모 업데이트(마이너 업데이트)로 판명한다.


구성 및 특징 -

커널 : 리눅스

그래픽 엔진 : 오픈 GL의 휴대기기용 버전인 오픈GL ES를 채택

폰트 : 프리타입

웹 렌더링 : 웹키트 엔진

보안 모듈 : SSL

개발환경 : 이클립스와 이클립스에 통합된 플러그인 ADT(안드로이드 개발 도구) 사용을 권장하고 있음.



안드로이드 버전별 점유율(13년 8월 1일 기준) -




출처 - 위키백과 ( http://ko.wikipedia.org )

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO

public static byte[] shortToByte(short a) {

byte[] shortToByte = new byte[2];

shortToByte[0] |= (byte)((a & 0xFF00) >>> 8);

shortToByte[1] |= (byte)(a & 0xFF & 0xff);

return shortToByte;

}  

   public static byte[] intToByte(int a) {  

     byte[] intToByte = new byte[4];     

     intToByte[0] |= (byte)((a&0xFF000000)>>24);     

     intToByte[1] |= (byte)((a&0xFF0000)>>16);     

     intToByte[2] |= (byte)((a&0xFF00)>>8);     

     intToByte[3] |= (byte)(a&0xFF);   

     return intToByte;  

   }  


-끝-

Android/WI-FI | Posted by 덩치 2013. 10. 23. 16:18

Wifi를 검색하여 자동으로 연결하기

펌 OK (출처 표시), 상업적 이용 NO, 컨텐츠 변경 NO

wifi를 검색하는 방법에 대해서는 이전 글에서 알아보았다.


wifi에 연결하기 위해서는 보안방식과 비밀번호, ssid가 필요한데

보안방식과 ssid는 이전글의 ScanResult에서 뽑아낼 수가 있다.


비밀번호를 모르면 당연히 보안이 걸려있는 wifi에는 연결이 불가능.


일단 소스를 살펴보자


open일때

wfc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);

wfc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);

wfc.allowedProtocols.set(WifiConfiguration.Protocol.WPA);

wfc.allowedAuthAlgorithms.clear();

wfc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);

 

wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);

wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);

wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);

wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);

wep일때

wfc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);

wfc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);

wfc.allowedProtocols.set(WifiConfiguration.Protocol.WPA);

wfc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);

wfc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);

wfc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);

 

wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);

wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);

wfc.wepKeys[0] = "123456abcd";   <<--이부분중요. \"부분 빼고 그냥 비밀번호만 넣는다

wfc.wepTxKeyIndex = 0;

wpa나 wpa2일때

wfc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);

wfc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);

wfc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);

wfc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);

wfc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);

wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);

wfc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);

wfc.preSharedKey = "\"".concat("123456abcd").concat("\"");


이렇게 보안방식별로 설정 방법이 다르다.

wpa와 wpa2는 설정이 같다고 하는데 필자의경우 wpa방식은 연결이 안되더라.

실제 테스트해본건 wpa2와 wep, open밖에 없다.

참고로 ScanResult.capabilites에서 뱉어주는 보안방식이 실제 open, web, wpa로 나오는건 아니고

[WPA-PSK-TKIP+CCMP][ESS]

[WPA2-PSK-CCMP][WPS][ESS]  이런식이며, 같은 방식도 length가 다른경우가 있다.

이부분은 알아서 잘 처리해주리라 믿고,



먼저 공통설정을

WifiConfiguration wfc = new WifiConfiguration(); (WifiConfiguration는 전역변수,지역변수 알아서 상황에 맞게 조절한다)

wfc = new WifiConfiguration();

wfc.SSID = "\"".concat(ssid 입력).concat("\"");

wfc.status = WifiConfiguration.Status.DISABLED;

wfc.priority = 40;

이렇게 해준다.


그리고 위의 보안방식에 따른 설정을 해 주고,


int networkId = wm.addNetwork(wfc);

if (networkId != -1) {

wm.enableNetwork(networkId, true);

}


이렇게 해주면 해당하는 wifi에 연결이 완료된다.

open형의 경우에는 level(신호세기)에 따라 정렬을 해 주고, 위의 소스를 적용시키면 가장 신호가 센놈으로

자동으로 연결될듯하다.



-끝-