1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//#include <enc28j60.h>
#include <EtherCard.h>
//#include <net.h>
 
  static byte mymac[] =  { 0x74,0x69,0x69,0x2D,0x30,0x31 };
  byte Ethernet::buffer[700];
 
void setup() {
  // put your setup code here, to run once:
 Serial.begin(9600);
 
 if (ether.begin(sizeof Ethernet::buffer, mymac) == 0
    Serial.println(F("Failed to access Ethernet controller"));
 
  if (!ether.dhcpSetup())
    Serial.println(F("DHCP failed"));
  ether.printIp("My IP: ", ether.myip);
  ether.printIp("Netmask: ", ether.netmask);
  ether.printIp("GW IP: ", ether.gwip);
  ether.printIp("DNS IP: ", ether.dnsip);
}
 
void loop() {
  // put your main code here, to run repeatedly:
 
}
cs


PIN Connections (Using Arduino UNO):

VCC -   3.3V
GND -    GND
SCK - Pin 13
SO  - Pin 12
SI  - Pin 11
CS  - Pin  8 # Selectable with the ether.begin() function




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  const char website[] PROGMEM = "www.google.com";
  static byte hisip[] = {내 ip};
  static uint32_t timer;
 
 
void setup() {
 
  ether.hisport = 8080;
  ether.copyIp(ether.hisip, hisip);
}
 
void loop() {
  // put your main code here, to run repeatedly:
   if (millis() > timer) {
   timer = millis() + 5000;
    Serial.println();
    Serial.print("<<< REQ ");
  ether.packetLoop(ether.packetReceive());
  ether.browseUrl(PSTR("/Spring_Hello/"), "hello.do""내 ip"NULL);
  delay(1000);
}}
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void setup() {
  // put your setup code here, to run once:
  pinMode(13,OUTPUT);
  pinMode(3,INPUT);
  Serial.begin(19200);
}
 
void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(13,HIGH);
  delay(1000);
  digitalWrite(13,LOW);
  delay(1000);
  Serial.println(digitalRead(3));
}
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int ledPin = 5;
int buttonApin = 9;
int buttonBpin = 8;
 
byte leds = 0;
 
void setup() 
{
  pinMode(ledPin, OUTPUT);
  pinMode(buttonApin, INPUT_PULLUP); 
  pinMode(buttonBpin, INPUT_PULLUP); 
}
 
void loop() 
{
  if (digitalRead(buttonApin) == LOW)
  {
    digitalWrite(ledPin, HIGH);
  }
  if (digitalRead(buttonBpin) == LOW)
  {
    digitalWrite(ledPin, LOW);
  }
}
cs


아두이노 LCD

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <LiquidCrystal.h>
 
//초기화를 위한 기본적인 인터페이스 핀 리스트
LiquidCrystal lcd (3410111213);
 
void setup() {
  // put your setup code here, to run once:
  lcd.begin(16,2); //가로 16칸, 세로 2칸
  lcd.clear();
}
 
void loop() {
  // put your main code here, to run repeatedly:
  lcd.setCursor(0,0);
  lcd.print("Hello arduino");
  lcd.setCursor(0,1);
  lcd.print("welcome to hell");
}
cs





안드로이드 스튜디오 단축키 설정 - 이클립스



안드로이드 뷰페이저


뷰페이저에 현재 보이는 화면을 그리는 방법은 직접xml파일을 인플레이션해서 배치하던가, 프레그먼트 단위로 박아야한다.

1
2
3
4
5
6
    <android.support.v4.view.ViewPager
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/viewpager">
             
    </android.support.v4.view.ViewPager>
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import android.app.Activity;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
 
public class MainActivity extends Activity {
 
    private Button btn1;
    private Button btn2;
    private Button btn3;
    private ViewPager viewPager;
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        btn1 = (Button) findViewById(R.id.btn1);
        btn2 = (Button) findViewById(R.id.btn2);
        btn3 = (Button) findViewById(R.id.btn3);
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        btn1.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                viewPager.setCurrentItem(0);
                
            }
        });
        btn2.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                viewPager.setCurrentItem(1);
                
            }
        });
        btn3.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                viewPager.setCurrentItem(2);
                
            }
        });
        viewPager.setAdapter(new PagerAdapter() {
            
            @Override
            public boolean isViewFromObject(View arg0, Object arg1) {
                // TODO Auto-generated method stub
                return arg0 == arg1;
            }
            
            @Override
            public int getCount() {
                // TODO Auto-generated method stub
                return 3;
            }
 
            @Override
            public void destroyItem(ViewGroup container, int position, Object object) {
                // TODO Auto-generated method stub
//                super.destroyItem(container, position, object);
                //container == viewpager
                //object == 현재 페이지에 박혀있는 view
                ((ViewPager) container).removeView((View)object);
            }
 
            @Override
            public Object instantiateItem(ViewGroup container, int position) {
                // TODO Auto-generated method stub
//                return super.instantiateItem(container, position);
                //position에 해당하는 뷰를 인플레이션해서
                //뷰페이저인 container에 addview
                View view = null;
                switch (position){
                case 0:
                    view = getLayoutInflater().inflate(R.layout.page_first, container,false);
                    break;
                case 1:
                    view = getLayoutInflater().inflate(R.layout.page_second, container,false);
                    break;
                case 2:
                    view = getLayoutInflater().inflate(R.layout.page_third, container,false);
                    break;
                }
                ((ViewPager)container).addView(view);
                return view;
            }
            
        });
        
        
    }
}
 
cs


' IOT 기반 응용 SW과정 > Android, Arduino' 카테고리의 다른 글

Day117 아두이노 이더넷 통신  (0) 2016.09.08
Day115 아두이노  (0) 2016.09.06
Day110 아두이노  (0) 2016.08.30
Day109 아두이노  (0) 2016.08.29
Day107 안드로이드 브로드캐스트리시버  (0) 2016.08.25

1. 시리얼이란?

시리얼은 거의 모든 PC에서 표준으로 사용되는 디바이스 통신 프로토콜입니다. 시리얼의 개념을 USB의 개념과 잘 구분하십시오. 대부분의 컴퓨터에는 2개의 RS232 기반 시리얼 포트가 있습니다. 시리얼은 또한 여러가지 디바이스에서 계측을 위한 일반 통신 프로토콜이며, 여러 GPIB 호환 디바이스에는 RS232 포트가 장착되어 있습니다. 뿐만 아니라, 원격 샘플링 디바이스로 데이터 수집을 하는 경우에도 시리얼 통신을 사용할 수 있습니다.

시리얼 통신의 개념은 간단합니다. 시리얼 포트는 정보의 바이트를 한번에 한 비트씩 순차적으로 송수신합니다. 한번에 전체 바이트를 동시에 전달하는 병렬 통신과 비교하면 시리얼 통신은 속도가 느리지만 훨씬 간단하며 장거리에도 사용할 수 있습니다. 예를 들어, 병렬 통신용 IEEE 488 스펙을 보면 기기간 케이블링은 총 20 m 미만이어야 하며, 두 개의 디바이스간은 2 m 미만이어야 합니다. 반면 시리얼 통신은 최대 1.2 Km의 통신거리를 보장합니다.

통상 엔지니어들은 ASCII 데이터를 전송할 때 시리얼 통신을 사용합니다. 이 때 송신용 (Tx), 수신용 (Rx), 그라운드용 (GND)의 세 가지의 전송 라인을 사용하여 통신합니다. 시리얼은 비동기식이므로 포트는 한 라인에서 데이터를 전송하고 다른 라인에서 데이터를 수신합니다. 핸드쉐이킹용 라인도 사용 가능하지만 필수 요구사항은 아닙니다. 시리얼 통신의 가장 중요한 특징에는 보드 속도 (baud rate), 데이터 비트, 정지 비트, 패리티가 있습니다. 두 개의 포트가 통신하기 위해서는 이러한 파라미터가 반드시 적절하게 맞춰져야 합니다.


1
2
3
4
5
6
7
8
9
10
11
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
 
}
 
void loop() {
  // put your main code here, to run repeatedly:
  Serial.println("Hello world");
  delay(1000);
}
cs

시리얼 모니터

아두이노에는 특별한 디버깅할만한 수단이 마땅치 않은데, 시리얼 모니터를 안드로이드 로그캣처럼 사용



1
2
3
4
5
6
7
8
9
10
11
12
SoftwareSerial mySerial(10,11);
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  mySerial.begin(9600);
}
 
void loop() {
  // put your main code here, to run repeatedly:
  Serial.println("Hello world");
Serial.write(1);
  delay(1000);
}
cs



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

7 segment에 시그널로 입력받은 숫자 출력하기

int signal[10][7= {
  { 0,0,0,0,0,0,1 }, //0
  { 1,0,0,1,1,1,1 }, //1
  { 0,0,1,0,0,1,0 },  //2
  { 0,0,0,0,1,1,0 },  //3
  { 1,0,0,1,1,0,0 }, 
  { 0,1,0,0,1,0,0 }, 
  { 0,1,0,0,0,0,0 }, 
  { 0,0,0,1,1,1,1 },  
  { 0,0,0,0,0,0,0 }, 
  { 0,0,0,1,1,0,0 }   
};
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
}
 
void showNum(int num){
  int pin = 2;
  int index = 0;
  for( pin = 2; pin <9; pin++,index++){
    digitalWrite(pin, signal[num][index]);
  }
}
 
void loop() {
if(Serial.available()){
  showNum(Serial.parseInt());    
  }
  
}
cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void setup() {
  // put your setup code here, to run once:
  pinMode(11,OUTPUT); 불이 천천히 밝아졌다가, 천천히 어두워지기
}
 
void loop() {
  // put your main code here, to run repeatedly:
  int i = 0;
  for( i = 0; i <255; i++)
  {
    analogWrite(11,i);
    delay(10);
  }
  for(i = 255; i >0; i--)
  {
    analogWrite(11,i);
    delay(10);
  }
  digitalWrite(11,0);
}
cs


   보모터 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <Servo.h>
Servo myServo; //서보 기능덩어리를 선언(객체레가 보셔도됨)
 
void setup() {
  // put your setup code here, to run once:
  myServo.attach(10); //servo모터가 사용할 핀번호를 attach메소드에 전달
}
 
void loop() {
  // put your main code here, to run repeatedly:
    int angle;    //각도 변수 선언
    
    //0 -> 180도로 서보모터 움직임
    for (angle = 0; angle < 180; angle++)
    {
        myServo.write(angle);    //angle(각도)값으로 서보모터 제어
        delay(15);                    //delay로 각도의 변화 속도를 조절
    }
    //180 -> 0도로 서보모터 움직임
    for (angle = 180; angle > 0; angle--)
    {
        myServo.write(angle);    //angle(각도)값으로 서보모터 제어
        delay(15);                    //delay로 각도의 변화 속도를 조절
    }
}
cs



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
피에조 부저를 이용한 도레미파솔라시도

int speakerpin = 12//스피커가 연결된 디지털핀 설정
int note[] = {2093,2349,2637,2793,3136,3520,3951,4186}; //도레미파솔라시도
 
void setup() {
  int elementCount = sizeof(note) / sizeof(int);
  for (int i=0; i < elementCount; i++)    //note를 play
  {
    tone(speakerpin,note[i],300);
    delay(750);
  }
}
 
void loop() {
}
 
cs


아두이노 : 마이크로 컨트롤러(micro controller)를 제어하는 방법중 하나,

입력(센서),출력(제어)을 할 수 있는 프로세서와 메모리를 갖춘 소형 컴퓨터




circuits.io

연습용 사이트

브로드캐스트 : OS가 시스템의 상태 정보를 모든 어플리케이션에 알리는 방송


브로드캐스트리시버 : 브로드캐스트를 수신하기 위한 어플리케이션의 구성요소


브로드캐스트리시버 만드는 방법

- 브로드캐스트리시버클래스를 상속받는 클래스 작성
- 해당 클래스를 매니패스트에 구성요소로 등록
- 해당 클래스에 onReceive구현


1
2
3
4
5
6
7
8
9
10
        <receiver 
            android:name=".MyBroadcastReceiver">
            <intent-filter >
 
            브로드캐스트 리시버 정적으로 등록하는 방법
            구현한 브로드캐스트리시버 클래스를 receiver태그로 등록하고
            수신할 액션을 intent-filter에 정의
 
            </intent-filter>
        </receiver>
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class MainActivity extends Activity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        
        BroadcastReceiver br = new MyBroadcastReceiver();
        registerReceiver(br, new IntentFilter(Intent.ACTION_SCREEN_OFF));
        registerReceiver(br, new IntentFilter(Intent.ACTION_SCREEN_ON));

        //동적으로 등록하는 방법(manifest엔 없어도됨)
        //동적으로하면,, 브로드캐스트리시버를 넣었다뺏다 할 수 있고
//        몇몇 액션에 대해서는 보안상의 이유로 동적으로만 등록 가능
    }
}
cs

1
2
3
4
5
6
            <intent-filter >
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter> 문자수신액션
 
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>
 
cs



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import java.util.Date;
 
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.util.Log;
 
public class MyBroadcastReceiver extends BroadcastReceiver{
 
    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Bundle bundle = intent.getExtras();
        Object[] messages = (Object[]) bundle.get("pdus");
        SmsMessage[] smsMessage = new SmsMessage[messages.length];
 
        for(int i = 0; i < messages.length; i++) {
            // PDU 포맷으로 되어 있는 메시지를 복원합니다.
            smsMessage[i] = SmsMessage.createFromPdu((byte[])messages[i]);
        }
 
        // SMS 수신 시간 확인
        Date curDate = new Date(smsMessage[0].getTimestampMillis());
        Log.d("문자 수신 시간", curDate.toString());
 
        // SMS 발신 번호 확인
        String origNumber = smsMessage[0].getOriginatingAddress();
 
        // SMS 메시지 확인
        String message = smsMessage[0].getMessageBody().toString();
        Log.d("문자 내용""발신자 : "+origNumber+", 내용 : " + message);
        
        SmsManager smsManager = SmsManager.getDefault();
        String sendTo = "010xxxxxxxx";
        String myMessage = message;
        smsManager.sendTextMessage(sendTo, null, myMessage, nullnull);
    }
 
}
cs

1
2
    <uses-permission android:name="android.permission.SEND_SMS"/>
 
cs


' IOT 기반 응용 SW과정 > Android, Arduino' 카테고리의 다른 글

Day110 아두이노  (0) 2016.08.30
Day109 아두이노  (0) 2016.08.29
Day105 안드로이드 웹뷰  (0) 2016.08.19
Day103  (0) 2016.08.17
Day102 안드로이드  (0) 2016.08.11

웹뷰는 안드로이드 위젯의 한 종류로 내장 웹브라우저

안드로이드 앱 안에서 HTML을 호출하여 앱을 구현하는 하이브리드 형태의 앱을 개발하는데도 많이 사용된다.

하이브리드 앱은 네이티브앱에 비해 개발이 비교적 쉽고, 기기간 호환성을 해결하기 상대적으로 편하다는 장점이 있으며,

HTML기반인 만큼 상대적으로 반응성이 약하고, 애니메이션등의 다양한 UI효과를 넣기 어렵다.


그럼에도 불구하고 SNS나 기타 서비스 앱에서는 타 웹사이트 링크로 가는 기능들을 제공하기 위해 웹뷰가 많이 사용된다.

웹뷰에 사용되는 브라우저는 우리가 일반적으로 사용하는 브라우저 수준은 아니며, 

안드로이드 OS에 맞게 일부 기늘들을 제외한 아주 기본적인 웹브라우저이다.


모바일 웹페이지    //    하이브리드 앱    //    네이티브 앱


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" 
    android:orientation="vertical">
    
    <RelativeLayout 
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    <EditText 
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_toLeftOf="@+id/main_btn_search"
        android:id="@+id/main_edt_url"/>
    <Button 
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentRight="true"
        android:id="@+id/main_btn_search"/>
    </RelativeLayout>
    <WebView 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/main_webView"/>
 
 
</LinearLayout>
 
cs


귄한부여(Manifest)

1
<uses-permission android:name="android.permission.INTERNET"/>
cs



1
2
3
4
5
6
7
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" 
        android:hardwareAccelerated="true">
  하드웨어가속사용(성능향상) : 웹뷰나 미디어재생같은 기능 사용시
cs

findViewById

1
2
3
4
5
6
7
8
9
10
11
    private EditText uriEdt;
    private Button searchBtn;
    private WebView webview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        uriEdt = (EditText) findViewById(R.id.main_edt_url);
        searchBtn = (Button) findViewById(R.id.main_btn_search);
        webview = (WebView) findViewById(R.id.main_webView);
    }
cs

1
2
3
4
        //이 함수를 생략하면 어플 위에 새창이 뜬다.
        webview.setWebViewClient(new WebViewClient());
        
        webview.loadUrl("http://pikac.tistory.com");
cs


1
2
3
4
5
6
7
8
9
10
11
12
        searchBtn.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                String url = uriEdt.getText().toString();
                if(!url.startsWith("http://")){
                    url = "http://" +url;
                }
                webview.loadUrl(url);
            }
        });
cs



1
2
3
4
5
6
7
8
9
10
11
        webview.setWebViewClient(new WebViewClient(){
 
            @Override
            public void onPageFinished(WebView view, String url) {
                // TODO Auto-generated method stub
                super.onPageFinished(view, url);
                urlEdt.setText(url);
                //page가 다 불려졌을때 현재 url을 url입력창에 세팅
            }
            
        });
cs



1. 웹브라우저스럽게 앞으로가기, 뒤로가기 버튼 추가, 눌렸을 때 웹브라우저 히스토리를 이용해 앞 뒤 이동하기

1
2
webview.goBack(); 뒤로가기
webview.goForward(); 앞으로가
cs

1
2
gobackBtn.setEnabled(webview.canGoBack());
goforwardBtn.setEnabled(webview.canGoForward());
   이동할곳 없을 시 비활성화cs



2. 외부가 아닌 html파일을 저장해놓고 로드하기

1
webview.loadUrl("file:///android_asset/ladder.html");
cs


3. 자바스크립트 코드 동작하기

1
webview.getSettings().setJavaScriptEnabled(true);
cs

4. 북마크 저장하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class Bookmark {
    private int _id;
    private String name;
    private String url;
    private Date redDate;
    public int get_id() {
        return _id;
    }
    public void set_id(int _id) {
        this._id = _id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public Date getRedDate() {
        return redDate;
    }
    public void setRedDate(Date redDate) {
        this.redDate = redDate;
    }
    
} 모델 생성
 
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
 
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
 
public class BookmarkDBmanager {
    private static final String DB_NAME = "bookmark.db";
    private static final String TABLE_NAME = "bookmark";
    public static final int dbVersion = 1;
    
    private SQLiteDatabase db;
    private Context context;
    private SQLiteOpenHelper openHelper;
    
    private class MySQLiteOpenHelper extends SQLiteOpenHelper{
        
        
        public MySQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) {
            super(context, name, factory, version);
            // TODO Auto-generated constructor stub
        }
 
        @Override
        public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
            String sql = "create table"+TABLE_NAME + "id integer primary key autoincrement,"
                    + " name text, url text, regdate text";
            db.execSQL(sql);
            
        }
 
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub
            
        }
        
    }
    public BookmarkDBmanager(Context context){
        this.context = context;
        this.openHelper = new MySQLiteOpenHelper(context, DB_NAME, null, dbVersion);
        db = openHelper.getWritableDatabase();
    }
    public void insertBookmark(Bookmark bookmark){
        ContentValues params = new ContentValues();
        params.put("name", bookmark.getName());
        params.put("url", bookmark.getUrl());
        params.put("regdate"new SimpleDateFormat("yyyy-MM-dd").format(bookmark.getRedDate()));
        db.insert(TABLE_NAME, null, params);
    }
    public List<Bookmark> selectAll(){
        Cursor cursor = db.rawQuery("select * from "+TABLE_NAME, null);
        List<Bookmark> list = null;
        while(cursor.isAfterLast()){
            Bookmark bookmark = new Bookmark();
            bookmark.setName(cursor.getString(1));
            bookmark.setUrl(cursor.getString(2));
            try {
                bookmark.setRedDate(new SimpleDateFormat("yyyy-MM-dd").parse(cursor.getString(3)));
            } catch (ParseException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            list.add(bookmark);
            cursor.moveToNext();
        }
        return list;
    }
}
 
cs


' IOT 기반 응용 SW과정 > Android, Arduino' 카테고리의 다른 글

Day109 아두이노  (0) 2016.08.29
Day107 안드로이드 브로드캐스트리시버  (0) 2016.08.25
Day103  (0) 2016.08.17
Day102 안드로이드  (0) 2016.08.11
Day101  (0) 2016.08.10

- 웹뷰(웹앱의 기반)

- 아직 안한 안드로이드 구성요소 
 : 서비스( 화면이 없는 명령처리 흐름 ) -> 다운로드, 음악재생....
 : 브로드캐스트리시버 (os로부터) -> SMS수신
    sms를 수신하면 특정 이메일이나 문자로 전달하는 예제

 : 컨텐트프로바이더 -> 같은 기기에 설치된 서로 다른 앱 간에 데이터 공유
  (생략)


- 위치정보 활용

- 미디어 활용

- 센서정보 활용


스프링에서 json으로 응답하기

- 필요한 라이브러리
 -> 잭슨 매퍼data-bind/잭슨 매퍼asl

- 서블릿 설정파일에 mvc:annotation-dirven태그 추가

- 응답합 컨트롤러 작성(리턴값을 데이터로, 그 앞에 @ResponseBody 달기)

1
2
3
4
5
6
7
8
9
10
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.13</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.8.1</version>
        </dependency>
cs

1
2
3
4
5
6
7
8
    <servlet>
        <servlet-name>json</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>json</servlet-name>
        <url-pattern>*.json</url-pattern>
    </servlet-mapping>
cs


' IOT 기반 응용 SW과정 > Android, Arduino' 카테고리의 다른 글

Day107 안드로이드 브로드캐스트리시버  (0) 2016.08.25
Day105 안드로이드 웹뷰  (0) 2016.08.19
Day102 안드로이드  (0) 2016.08.11
Day101  (0) 2016.08.10
Day99 안드로이드 파일 복사  (0) 2016.08.08
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
class ImageDownLoader extends AsyncTask<String, Void, Bitmap>
    {    
        ImageView imageView;
        public ImageDownLoader(ImageView imageView) {
            // TODO Auto-generated constructor stub
            this.imageView = imageView;
            //생성자 혹은 설정자를 통해 이미지뷰 주입받기
        }
        @Override
        protected Bitmap doInBackground(String... params) {
            // TODO Auto-generated method stub
                Bitmap bitmap = null;
                try {
                    URL url = new URL(params[0]);
                    BufferedInputStream bi = new BufferedInputStream(url.openStream());
                    bitmap = BitmapFactory.decodeStream(bi);
                    bi.close();
                } catch (MalformedURLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e){
                    e.printStackTrace();
                }
                
            return bitmap;
        }
        @Override
        protected void onPostExecute(Bitmap result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            if(result != null)
                imageView.setImageBitmap(result);
        }
        
        
    }
cs

네이버 검색 api 이미지 받아오기

' IOT 기반 응용 SW과정 > Android, Arduino' 카테고리의 다른 글

Day105 안드로이드 웹뷰  (0) 2016.08.19
Day103  (0) 2016.08.17
Day101  (0) 2016.08.10
Day99 안드로이드 파일 복사  (0) 2016.08.08
Day98_2 안드로이드 OpenHelper  (0) 2016.08.05

Working with System Permissions

안드로이드 6.0 권한 변경
Declaring Permissions
Learn how to declare the permissions you need in your app manifest.
Requesting Permissions at Run Time
Learn how to request permissions from the user while the app is running. This lesson only applies to apps on devices running Android 6.0 (API level 23) and higher.
Permissions Best Practices
Guidelines for creating the best user experience in requesting and using permissions.


네이버 D2

http://d2.naver.com/home 


Android의 HTTP 클라이언트 라이브러리

Android 애플리케이션에서는 HTTP 통신을 다루는 부분의 비중이 크다. 데이터를 조회하거나 저장하기 위해 서버와 통신하는 모듈은 대부분 HTTP API를 사용하고 있기 때문이다.

TCP/UDP의 낮은 레벨의 통신은 송수신을 위해 개발자가 직접 처리해야됨, 잔 작업도 많고 NAT문제에 자유롭지 않다


사용자가 보는 화면 개발을 제외한다면 HTTP 클라이언트가 애플리케이션 개발의 중심이라고도 할 만하다.

Android 환경에서 HTTP 클라이언트를 개발하는 방식은 다양하다. Android SDK에서 제공하는 기능을 직접 사용하기도 하고, 이를 좀 더 편하게 사용하도록 도와주는 유틸리티 클래스를 프로젝트마다 개발하기도 한다. 오픈 소스 라이브러리를 활용한 애플리케이션도 있다.


SDK에서 제공하는 HTTP 클라이언트의 허점과 변경 사항

Android는 표준 JRE의 클래스와 동일한 형태인 HTTPURLConnection 클래스를 제공한다. 

그리고 오픈 소스로 유명한 Apache HttpComponents의 HttpClient도 SDK에 포함되어 있다. (6.0부터 x)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class NaverBookSearchService {
    //요청을 하기 위한 ID와 SECRET
    private static final String CLIENT_ID = "";
    private static final String CLIENT_SECRET = "";
    
    //요청할 URL
    private static final String URL
    ="https://openapi.naver.com/v1/search/book.xml";
    
    //한번의 요청에서 받아올 아이템 갯수
    private static final int DISPLAY_ITEM_COUNT = 10;
    
    //현재 페이지를 알기 위한 상태값
    private int currentSkip = 1;
    
    //검색할 키워드
    private String keyword;
    
    public NaverBookSearchService(String keyword)
    {
        this.keyword = keyword;
    }
    public void nextPage()
    {
        currentSkip += DISPLAY_ITEM_COUNT;
    }
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
public List<Book> search(){
        List<Book> list = null;
        try {
            URL url;
            url = new URL(URL + "?query="
                    + URLEncoder.encode(keyword, "UTF-8")
                    + "&display=" + DISPLAY_ITEM_COUNT
                    + "&start="+ currentSkip);
 
            URLConnection urlConn = url.openConnection();
            urlConn.setRequestProperty("X-Naver-Client-Id", CLIENT_ID);
            urlConn.setRequestProperty("X-Naver-Client-Secret", CLIENT_SECRET);
             
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            XmlPullParser parser = factory.newPullParser();
            parser.setInput(
                    new InputStreamReader(urlConn.getInputStream()));
             
             
             
            int eventType = parser.getEventType();
            Book b = null;
            while (eventType != XmlPullParser.END_DOCUMENT) {
                switch (eventType) {
                case XmlPullParser.END_DOCUMENT: // 문서의 끝
                    break;
                case XmlPullParser.START_DOCUMENT:
                    list = new ArrayList<Book>();
                    break;
                case XmlPullParser.END_TAG: {
                    String tag = parser.getName();
                    if(tag.equals("item"))
                    {
                        list.add(b);
                        b = null;
                    }
                }
                case XmlPullParser.START_TAG: {
                    String tag = parser.getName();
                    switch (tag) {
                    case "item":
                        b = new Book();
                        break;
                    case "title":
                        if(b != null)
                            b.setTitle(parser.nextText());
                        break;
                    case "link":
                        if(b != null)
                            b.setLink(parser.nextText());
                        break;
                    case "image":
                        if(b != null)
                            b.setImage(parser.nextText());
                        break;
                    case "author":
                        if(b != null)
                            b.setAuthor(parser.nextText());
                        break;
                    case "price":
                        if(b != null)
                            b.setPrice(parser.nextText());
                        break;
                    case "discount":
                        if(b != null)
                            b.setDiscount(parser.nextText());
                        break;
                    case "publisher":
                        if(b != null)
                            b.setPublisher(parser.nextText());
                        break;
                    case "pubdate":
                        if(b != null)
                            b.setPubdate(parser.nextText());
                        break;
                    case "isbn":
                        if(b != null)
                            b.setIsbn(parser.nextText());
                        break;
                    case "description":
                        if(b != null)
                            b.setDescription(parser.nextText());
                        break;
                    }
                     
                }
                }
                eventType = parser.next();
            }
             
             
             
             
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (XmlPullParserException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return list;
    }
cs

1
2
NaverBookSearchService service = new NaverBookSearchService(keyword);
service.search();
cs

search메소드는 네트워크 통신을 사용하기 때문에 UI쓰레드에서 직접 호출할 수 없음, 파생쓰레드를 만들어서 호출해야 하고 파생쓰레드가 얻어낸 데이터를 UI쓰레드로 가져오려면 UI(메인)쓰레드의 핸들러가 필요하다.

UI(메인)쓰레드는 파생쓰레드가 받아온 데이터를 전달 받았을 때 UI에 반영하는 코드를 Handler클래스를 상속받아 handleMessage에 구현, 파생쓰레드는 네트워크 통신을 통해 얻은 데이터를 UI쓰레드에게 전달해주기 위해서 UI(메인)쓰레드의 Handler객체에 대한 참조 필요

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    private Handler handler =  new Handler(){
 
        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);
            //what이 1이면 NaverBookSearchThread가 보내는 데이터 인걸로
            if(msg.what == 1)
            {
                //arg1이 100이면 처음 검색에 대한 결과를 갖다 준걸로
                if(msg.arg1 == 10)
                {
                    String result = "";
                    List<Book> data = (List<Book>)msg.obj;
                    for(Book b : data)
                        result += b + "\n";
                    Toast.makeText(MainActivity.this, result, 0).show();
                }
                //arg1이 20이면 검색했던 결과에 대해 추가 아이템을 요청한걸로
                else if(msg.arg1 == 20)
                {
                    
                }
            }
        }
        
    };
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class NaverBookSerachThread extends Thread{
    private NaverBookSearchService service;
    private Handler handler;
    
    public NaverBookSerachThread(NaverBookSearchService service, Handler handler)
    {
        this.service = service;
        this.handler = handler;
    }
 
    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        
        //service의 search메소드를 수행하고 결과를 핸들러를 통해 메인에게 전달
        List<Book> data = service.search();
    }
    
}
cs

1
2
3
4
5
    public int getCurrentSkip(){
        return currentSkip;
        //nextPage함수가 한번이상 불려서 currentSkip이 1이 아니면
        //처음 검색이 아니고 아이템 추가
    }

c
s

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        
        //service의 search메소드를 수행하고 결과를 핸들러를 통해 메인에게 전달
        List<Book> data = service.search();
        
        Message msg = handler.obtainMessage();
        msg.what = 1;
        msg.obj = data;
        if(service.getCurrentSkip() == 1)
            msg.arg1 = 10;
        else                //첫 검색인지 아닌지 구분
            msg.arg1 = 20;
        handler.sendMessage(msg);
    }
cs

1
2
3
4
5
6
7
8
9
10
            public void onClick(View v) {
                // TODO Auto-generated method stub
                String keyword = keywordEdt.getText().toString();
                NaverBookSearchService service = new NaverBookSearchService(keyword);
//                service.search();
                NaverBookSerachThread thread = new NaverBookSerachThread(service, handler);
                thread.start();    
 
            }
        });
cs


리스트뷰 작성

getView할일

1. 껍데기 인플레이션하기(convertView가 null이 아니면 재사용 가능)

2. 껍데기 내부의 위젯들 객체 얻어오기 (findViewByid)

3. 각 위젯에 데이터 바인딩하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
public class BookAdapter extends ArrayAdapter<Book>{
    private Context context;
    private int resource;
    private List<Book> bookList;
    
    public BookAdapter(Context context, int resource, List<Book> bookList) {
        super(context, resource, bookList);
        this.context = context;
        this.resource = resource;
        this.bookList = bookList;
    }
 
    static class BookViewHolder{
        public ImageView imageView;
        public TextView titleTv;
        public TextView priceNpub;
        public TextView authorNpubDate;
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
//        return super.getView(position, convertView, parent);
 
        //getView메소드는 리스트뷰의 한줄의 아이템을 그리기 위한 뷰를 만들어내는 함수이고
        //한줄의 아이템에 대해서 UI를 인플레이션하고 그 객체를 리턴하면됨
        BookViewHolder holder;
        if(convertView == null)
        {
            //이미 인플레이션 한 뷰가 있다면 매개변수 convertView에 들어와 재사용 가능하닌까
            //convertView가 null일때만 인플레이션 해줌
            LayoutInflater inflater
            = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.list_item, parent, false);
            //처음 인플레이션 될 때 홀더객체를 만들어서 홀더 셋트의 위젯 참조변수들에 findViewById
            holder = new BookViewHolder();
            holder.imageView = (ImageView) convertView.findViewById(R.id.list_img);
            holder.titleTv = (TextView) convertView.findViewById(R.id.list_tv_title);
            holder.priceNpub = (TextView) convertView.findViewById(R.id.list_tv_price_and_publisher);
            holder.authorNpubDate = (TextView) convertView.findViewById(R.id.list_tv_author_and_pubdate);
            
            //holder객체는 각 위젯들의 findViewById한 결과들 집합이다.
            convertView.setTag(holder);
        }
        else
        {
            holder = (BookViewHolder) convertView.getTag();
        }
        Book book = bookList.get(position);
        //여기까지 이제 홀더객체 안의 각 위젯에 book객체의 각 멤버변수값들이랑 바인딩하면 된다.
        holder.imageView.setImageResource(R.drawable.ic_launcher);
        holder.titleTv.setText(book.getTitle());
        holder.priceNpub.setText(book.getPrice() +"원\t출판사 : "+book.getPublisher());
        holder.authorNpubDate.setText("저자 : "+ book.getAuthor() + "\t출판일 : " + book.getPubdate());
        return convertView;
    }
}
 
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class MainActivity extends Activity {
    private EditText keywordEdt;
    private Button searchBtn;
    private ListView listView;
    private BookAdapter adapter;
    private List<Book> bookList;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        keywordEdt = (EditText) findViewById(R.id.main_edt_search);
        searchBtn = (Button) findViewById(R.id.main_btn_search);
        listView = (ListView) findViewById(R.id.main_listView);
        bookList = new ArrayList<Book>();
        adapter = new BookAdapter(this, R.layout.list_item,bookList);
        
        listView.setAdapter(adapter);
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    private Handler handler =  new Handler(){
 
        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);
            //what이 1이면 NaverBookSearchThread가 보내는 데이터 인걸로
            if(msg.what == 1)
            {
                //arg1이 10이면 처음 검색에 대한 결과를 갖다 준걸로
                if(msg.arg1 == 10)
                {
//                    String result = "";
//                    List<Book> data = (List<Book>)msg.obj;
//                    for(Book b : data)
//                        result += b.getTitle() + "\n";
//                    Toast.makeText(MainActivity.this, result, 0).show();
                    bookList.clear();
                    bookList.addAll((List<Book>) msg.obj);
                    adapter.notifyDataSetChanged();
                }
                //arg1이 20이면 검색했던 결과에 대해 추가 아이템을 요청한걸로
                else if(msg.arg1 == 20)
                {
                    
                }
            }
        }
        
    };
cs




1
    <uses-permission android:name="android.permission.INTERNET"/>
cs

' IOT 기반 응용 SW과정 > Android, Arduino' 카테고리의 다른 글

Day103  (0) 2016.08.17
Day102 안드로이드  (0) 2016.08.11
Day99 안드로이드 파일 복사  (0) 2016.08.08
Day98_2 안드로이드 OpenHelper  (0) 2016.08.05
Day98 안드로이드 db Select문  (0) 2016.08.05

+ Recent posts