728x90

라즈베리 파이3, 기본 설정

 

홈페이지  https://www.raspberrypi.org/

 

Raspbian Jessie 풀버전 다운로드

https://downloads.raspberrypi.org/raspbian_latest

 

 

Win32DiskImager 다운로드 (0.95 추천)

https://sourceforge.net/projects/win32diskimager/files/Archive/


SD카드 포맷을 위한 포매터

https://www.sdcard.org/downloads/formatter_4/eula_windows/index.html


 

Device항목에 sd카드 드라이브명 확인후,

다운받은 Raspbian 이미지를 디스크 모양 아이콘을 눌러 선택하고 Write를 누른다.

 

 

 

 

[라즈베리 파이, 기본 세팅]

전원을 꼽는 순간 부팅된다.


sudo : SUbstitute user DO 의 줄임말, 관리자 권한의 계정으로 명령을 내림

su - : root권한 획득


$ : 일반계정

# : 루트계정 (sudo)


Ctrl + D : 로그아웃, 한번 더 입력하면 창을 닫는다.


apt-get 프로그램을 받음, 설치시 install 명령어를 뒤에 같이 씀

-> install (대상)

예) sudo apt-get install vim


sudo raspi-config // 라즈베리 파이 환경설정

1. Expand Filesystem // 파일시스템 확장(SD 카드 전체용량 사용하도록 확장)
2. Change User Password // pi계정 비밀번호 변경

5. Internationalisation Options  //언어, 키보드,타임존 등을 설정

sudo apt-get update  // 각 업데이트 저장소 에서 업데이트 패키지 목록을 갱신

apt-get 프로그램 받아서 설치해줌




[ 네트워크 설정 ]



네트워크 설정 파일을 찾아서 편집

1
cd /etc/network/
cs

interfaces 수정

1
sudo nano interfaces
cs

다음과 같이 수정한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# interfaces(5) file used by ifup(8) and ifdown(8)
 
# Please note that this file is written to be used with dhcpcd
# For static IP, consult /etc/dhcpcd.conf and 'man dhcpcd.conf'
 
# Include files from /etc/network/interfaces.d:
source-directory /etc/network/interfaces.d
 
auto lo
iface lo inet loopback
 
auto eth0
allow-hotplug eth0
iface eth0 inet manual
 
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
cs


Ctrl + x 누르고 Y눌러 저장 후 엔터눌러 종료



wap_supplicant.conf 수정

1
sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
cs

다음과 같이 수정한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=US
 
network={
        ssid="Xiaomi"
        psk="12345678"
        key_mgmt=WPA-PSK
}
 
network={
        ssid=""
        psk=""
        key_mgmt=WPA-PSK
}
cs


네트워크 재시작

1
 sudo service networking reload
cs


그 다음 sudo reboot 또는 셧다운 메뉴를 통해 라즈베리 재시작



ifconfig를 통해 eth0또는 wlan의 ip주소를 확인한다 ( inet addr:192.168.~ )



원격 데스크탑 연결을 하려면

 sudo apt-get install xrdp  


원격 데스크탑 연결에서 사용자 명 pi를 넣어 접속


putty에서 접속하려면
호스트네임에 라즈베리파이 ip주소를 넣어 접속하고 기본 계정명(pi)와 비밀번호를 입력해 접속한다.



IP고정 및 포트포워딩


1
 sudo nano /etc/dhcpcd.conf
cs


최하단에 아래의 설정을 추가 (IP나 라우터, dns등은 자신의 네트워크 환경에 맞게 설정)

1
2
3
4
5
6
7
8
9
10
11
interface eth0
static ip_address=210.119.12.~
static routers=210.119.12.1
static domain_name_servers=210.119.0.2
static netmask=255.255.255.0
 
interface wlan0
static ip_address=
static router=
static domain_name_servers=8.8.8.8
static netmask=255.255.255.0
cs



그 다음 공유기 설정에서 포워딩 IP 주소를 고정 IP주소로 설정, DMZ 설정에도 마찬가지로 고정 IP주소로 설정하면 된다.

'Study > Embedded' 카테고리의 다른 글

GCM  (0) 2017.06.27
라즈베리파이, Pi4J를 통한 GPIO 제어  (0) 2017.06.20
아두이노 LCD  (0) 2017.06.01
아두이노 기초  (0) 2017.05.25
ATMEGA USART-C# App 연동  (0) 2016.12.12
728x90

Java Network 프로그래밍 기초 

( 참고 서적 : 자바 네트워크 프로그래밍 [자바 8과 함께하는 네트워크 애플리케이션 개발] )


IP 주소를 나타내는 InetAddress 클래스


InetAddress 클래스는 public 생성자가 없으므로 여러 static type의 get 메소드 중 하나를 사용한다. (.get~~)

다음은 특정 사이트의 ip주소를 얻는 예제이다. 


1
2
3
4
5
6
7
8
9
import java.net.InetAddress;
import java.net.UnknownHostException;
 
public class Address {
    public static void main(String[] args) throws UnknownHostException {
         InetAddress address = InetAddress.getByName("www.packtpub.com");
         System.out.println(address);
    }
}
cs


결과 : 

www.packtpub.com/83.166.169.231


해당 주소의 접속 여부를 결정하기 위해 필요한 대기시간을 다음과 같이 지정할 수 있다.

isReachable 메소드의 인자는 m/s 단위의 대기 시간이다.


1
 address.isReachable(3000);
cs




NIO 지원



selector : 다중 채널을 처리하기 위한 싱글 스레드를 허용하는 기술




자바 서버와 안드로이드 클라이언트 연동


Server.java 의 전체 소스


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
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
 
public class Server {
 
    public static void main(String[] args) {
        ServerStart();
    }
 
public static void ServerStart() {
    try {
        int portNum = 11001;
 
        System.out.println("서버 시작이당");
        @SuppressWarnings("resource")
        ServerSocket serverSocket = new ServerSocket(portNum);
        System.out.println(portNum);
 
        while (true) {
            Socket socket = serverSocket.accept();
            InetAddress clientHost = socket.getInetAddress();
            int clientPort = socket.getPort();
            System.out.println("클라이언트 접속, 호스트 : " + clientHost + ", port : " + clientPort);
 
            ObjectInputStream inputStream = new ObjectInputStream(socket.getInputStream());
            Object obj = inputStream.readObject();
            System.out.println("Input : " + obj);
 
            ObjectOutputStream outputStream = new ObjectOutputStream(socket.getOutputStream());
 
            outputStream.writeObject(obj + " 서버로부터 메시지 ");
            outputStream.flush();
            socket.close();
        }
    }
    
    catch(Exception ex)
        {
            ex.printStackTrace();
        }
    }
}
 
cs



안드로이드 클라이언트


인터넷을 사용하기 위해 AndroidManifest.xml에 유저 권한 추가

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


클라이언트 레이아웃 (activity_main.xml 디자인)




MainActivity.java의 전체 소스

package com.example.pknu.hello;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;

public class MainActivity extends AppCompatActivity {

EditText input01;
Button button01;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

input01 = (EditText) findViewById(R.id.input01);

// 버튼 이벤트 처리
button01 = (Button) findViewById(R.id.button01);
button01.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String addr = input01.getText().toString().trim();

ConnectThread thread = new ConnectThread(addr);
thread.start();
}
});

}

class ConnectThread extends Thread {
String hostname;

public ConnectThread(String addr) {
hostname = addr;
}

public void run() {

try {
int port = 11001;

Socket sock = new Socket(hostname, port);
ObjectOutputStream outstream = new ObjectOutputStream(sock.getOutputStream());
outstream.writeObject("Hello AndroidTown on Android");
outstream.flush();

ObjectInputStream instream = new ObjectInputStream(sock.getInputStream());
String obj = (String) instream.readObject();

Log.d("MainActivity", "서버에서 받은 메시지 : " + obj);

sock.close();

} catch(Exception ex) {
ex.printStackTrace();
}

}
}
}



'Study > Java' 카테고리의 다른 글

자바 - 식별자  (0) 2021.01.06
자바 NIO 셀렉터  (0) 2017.07.05
NIO 기반 네트워킹  (0) 2017.05.30
JAVA - NIO  (0) 2017.05.29
Java - OOP_인터페이스와 다형성  (0) 2017.03.20
728x90

D pin에 다음과 같이 연결한다.

RS - 12, RW - 11, EN - 10

DATA 4~7 - D4~1


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <LiquidCrystal.h>
 
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(121154321);
 
void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(162);
  // Print a message to the LCD.
  lcd.print("hello, world!");
}
 
void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(01);
  // print the number of seconds since reset:
  lcd.print(millis() / 1000);
}
cs

LiquidCrystal::LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable,      uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3)



'Study > Embedded' 카테고리의 다른 글

라즈베리파이, Pi4J를 통한 GPIO 제어  (0) 2017.06.20
라즈베리 파이3, 기본 설정  (0) 2017.06.10
아두이노 기초  (0) 2017.05.25
ATMEGA USART-C# App 연동  (0) 2016.12.12
7/21 Atmega128 포트/ win32 api  (0) 2016.07.21
728x90

서버소켓 채널 생성과 다중 클라이언트 연결 수락 (서버)


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
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
 
public class ServerTest {
 
    public static void main(String[] args) {
        ServerSocketChannel serverSocketChannel = null;
        
        try {
            serverSocketChannel = ServerSocketChannel.open();
            serverSocketChannel.configureBlocking(true);
            serverSocketChannel.bind(new InetSocketAddress(5001));
            
            while(true) {
                System.out.println("연결 대기..");
                SocketChannel socketChannel = serverSocketChannel.accept();
                InetSocketAddress inetSockAddr = (InetSocketAddress) socketChannel.getRemoteAddress();
                System.out.println("연결 수락!" + inetSockAddr.getHostName());
                
                ByteBuffer byteBuffer = null;
                Charset charset = Charset.forName("UTF-8");
                
                byteBuffer = ByteBuffer.allocate(100);
                int byteCount = socketChannel.read(byteBuffer);
                byteBuffer.flip();
                String message = charset.decode(byteBuffer).toString();
                System.out.println"[데이터 수신 성공] : " + message);
                
                byteBuffer = charset.encode("Hello Client");
                socketChannel.write(byteBuffer);
                System.out.println"[데이터 전송 성공]");
            }
        }
        catch (Exception e) {
        }
        
        if (serverSocketChannel.isOpen()) {
            try {
                serverSocketChannel.close();
            } catch (Exception e) {
            }
        }
    }
}
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
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.nio.charset.Charset;
 
public class ClientTest {
    public static void main(String[] args) {
        SocketChannel socketChannel = null;
        try {
            socketChannel = SocketChannel.open();
            socketChannel.configureBlocking(true);
            System.out.println"[연결 요청]");
            socketChannel.connect(new InetSocketAddress("localhost"5001));
            System.out.println"[연결 성공]");
            
            ByteBuffer byteBuffer = null;
            Charset charset = Charset.forName("UTF-8");
            
            // client가 데이터(헬로서버) 보냄
            byteBuffer = charset.encode("Hello Server");
            socketChannel.write(byteBuffer);
            System.out.println"[데이터 전송 성공]");
            
            // client가 데이터 받음
            byteBuffer = ByteBuffer.allocate(100);
            int byteCount = socketChannel.read(byteBuffer);
            byteBuffer.flip();
            String message = charset.decode(byteBuffer).toString();
            System.out.println"[데이터 수신 성공] : " + message);
            
        } catch(Exception e) {}
        
        if(socketChannel.isOpen()) {
            try {
                socketChannel.close();
                System.out.println"[연결 닫음]");
            } catch (IOException e1) {}
        }    
    }
}
cs



'Study > Java' 카테고리의 다른 글

자바 NIO 셀렉터  (0) 2017.07.05
Java Network 프로그래밍 기초  (0) 2017.06.03
JAVA - NIO  (0) 2017.05.29
Java - OOP_인터페이스와 다형성  (0) 2017.03.20
Java - OOP_클래스와 상속, 생성자, 오버로딩/오버라이딩  (0) 2017.03.17
728x90

NIO (New Input/Output)    (참고 서적 : 이것이 자바다)


java.nio 패키지는 자바4부터 포함된 패키지로, 새로운 입출력이라는 뜻을 가지고 있다.

자바7에서는 네트워크 지원과 IO와 NIO사이의 클래스 일관성을 강화해 NIO.2 API가 추가되었다.


NIO는 IO 와 다르게 스트림이 아닌 채널 방식을 사용하며, 버퍼와 비동기 방식을 기본적으로 제공한다. 

또한, IO가 블로킹 방식만 지원하는 것과 달리 NIO는 블로킹과 넌 블로킹 방식을 모두 지원한다.



스트림 vs 채널

스트림 기반에서 입출력을 위해 입력 스트림과 출력스트림을 모두 생성해야하는 것과 달리, 

채널은 스트림과 달리 양방향으로 입출력이 가능하다.



non 버퍼 vs 버퍼


IO는 입출력을 위한 버퍼를 제공해주는 보조 스트림이 있다. NIO는 기본적으로 버퍼를 사용해 입출력을 하기 때문에 성능이 좋다.


IO가 스트림에 읽은 데이터를 즉시 처리하는 것과 달리 NIO에서는 읽은 데이터를 무조건 버퍼에 저장한다.

이는 별도로 입력된 데이터를 저장하지 않아도, 버퍼내에서 데이터의 위치를 이동해 가며 필요한 부분을 읽고 쓸 수 있는 유연성을 제공한다.



블로킹(blocking : 대기상태) vs non 블로킹

IO에서 입력 스트림의 read() 메소드를 호출하면 데이터가 입력되기 전까지 스레드가 블로킹(대기상태)가 된다. write() 메소드도 마찬가지로 출력되기전까지 블로킹 상태가 된다. 블로킹 상태에서 다른 일을 할 수 없고 이 상태를 빠져나오기 위해 인터럽트 될 수도 없다. 블로킹을 빠져나오기 위해선 스트림을 닫는 수 밖에 없다.


non 블로킹은 스레드를 인터럽트함으로써 빠져나올 수 있으며, 스레드가 블로킹 되지 않는다. 이는 입출력 준비가 완료된 채널만 선택해, 작업 스레드가 처리하기 때문에 블로킹 되지 않는다.



어떤 경우에 IO와 NIO중에서 취사 선택해야 하는가?

IO는 연결 클라이언트 수가 적고, 전송되는 데이터가 대용량으로 순차처리 될 때에 사용하는 것이 적다.


NIO는 연결 클라이언트 수가 많고, 하나의 입출력 처리 작업이 오래 걸리지 않는 경우에 사용하는 것이 좋다. 처리가 오래 걸리면 대기 작업의 수가 늘어나기 때문에 비효율적이다. 또한, 모든 입출력에 버퍼를 사용하기 때문에 대용량 데이터의 처리에는 버퍼 할당의 문제도 있다.



경로 정의 및 탐색


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
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Iterator;
 
public class PathExample {    
    public static void main(String[] args) throws Exception {
        Path path = Paths.get("src/sec02/exam01_path/PathExample.java");
        // or ("src/sec02/", "exam01_path/PathExample.java");
        
        System.out.println("[파일명] " + path.getFileName());
        System.out.println(("부모 디렉토리명]: " + path.getParent().getFileName()));
        
        System.out.println("중첩 경로수: " + path.getNameCount());
        
        System.out.println();
        for(int i=0; i<path.getNameCount(); i++) {
            System.out.println(path.getName(i));
        }
        
        System.out.println();
        Iterator<Path> iterator = path.iterator();
        while(iterator.hasNext()) {    // 이동할 항목이 있다면 true 리턴 
            Path temp = iterator.next();    // 현재 위치를 순차적으로 하나 증가해 이동
            System.out.println(temp.getFileName());
        }
    }
}
cs



WatchService

자바 7에서 도입된 와치 서비스는, 디렉토리 내부에서 파일 생성, 삭제, 수정 등의 변화를 감시하는데 사용된다. 

(에디터에서 파일이 변경되면 다시 불러올 것인지를 묻는 것이 와치 서비스의 예)



와치 서비스 실행 결과 및 예제 (Java FX)

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
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchEvent.Kind;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.util.List;
 
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
 
public class WatchServiceExample extends Application {
    class WatchServiceThread extends Thread {
        @Override
        public void run() {
            try {
                WatchService watcher = FileSystems.getDefault().newWatchService();
                Path directory = Paths.get("C:/temp");
                directory.register(watcher, StandardWatchEventKinds.ENTRY_CREATE,
                        StandardWatchEventKinds.ENTRY_DELETE,
                        StandardWatchEventKinds.ENTRY_MODIFY);                
                                
                while(true) {
                    WatchKey watchKey = watcher.take(); // 블로킹(Watch키가 큐에 들어올 때까지)
                    List <WatchEvent<?>> list = watchKey.pollEvents(); // WatchEvent목록 얻음
                    
                    for(WatchEvent<?> watchEvent : list) {
                        // 이벤트 종류 얻음
                        Kind<?> kind = watchEvent.kind();
                        // 감지된 path 얻음
                        Path path = (Path)watchEvent.context();
                        
                        if(kind == StandardWatchEventKinds.ENTRY_CREATE) {
                            Platform.runLater(()-> textArea.appendText("파일 생성됨 " + 
                        path.getFileName() + "\n"));
                        } else if (kind == StandardWatchEventKinds.ENTRY_DELETE) {
                            Platform.runLater(()-> textArea.appendText("파일 삭제됨 " +
                        path.getFileName() + "\n"));
                        } else if (kind == StandardWatchEventKinds.ENTRY_MODIFY) {
                            Platform.runLater(()-> textArea.appendText("파일 변경됨 " +
                        path.getFileName() + "\n"));
                        } else if (kind == StandardWatchEventKinds.OVERFLOW) {                            
                        }
                    }
                    boolean valid = watchKey.reset();
                    
                    if(!valid) { break; }
                    }
            } catch (Exception e) { }
        }
    }
    
 
    TextArea textArea = new TextArea();
    
    @Override
    public void start(Stage primaryStage) throws Exception {
        BorderPane root = new BorderPane();
        root.setPrefSize(500300);
        
        textArea.setEditable(false);
        root.setCenter(textArea);
        
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.setTitle("워치 서비스 예제");
        primaryStage.show();
        
        WatchServiceThread wst = new WatchServiceThread();
        wst.start();
    }
    
    public static void main(String[] args) throws Exception {
        launch(args);
    }
}
cs



non 다이렉트 버퍼와 다이렉트 버퍼


non 다이렉트 버퍼는 JVM이 관리하는 heap 메모리 공간을 이용하는 버퍼로 버퍼 생성 시간이 빠르다.  반면에 heap 공간은 상당히 제한되어 있으므로 버퍼의 크기를 크게 잡을 수가 없다. 또한 입출력을 위해 non다이렉트 버퍼의 내용을 임시 다이렉트 버퍼를 생성해 복사하고, 그곳에서 OS의 native I/O와 같은 기능을 수행하기 때문에 입출력 속도는 느리다.


반면에 다이렉트 버퍼는 OS의 native C 함수를 호출하고 여러 가지 처리할 것이 있기 때문에 버퍼 생성이 느리다. 하지만 OS가 관리하는 메모리 공간을 이용하므로 버퍼의 크기가 크고, 입출력 성능이 높다는 장점이 있다. 따라서 한 번 생성해놓고, 빈번한 입출력과 큰 데이터 처리에 사용하는 것이 효율이 좋다.



다음 예제에서는 non 다이렉트와 다이렉트 버퍼를 생성하고 그 결과를 보는 예제이다. non 다이렉트 버퍼는 앞서 설명했듯 JVM이 관리하는 제한된 heap메모리 공간을 사용하므로 크기가 작아, OutOfMemoryError가 발생한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
import java.nio.ByteBuffer;
 
public class BufferSizeExample {
 
    public static void main(String[] args) {
        ByteBuffer directBuffer = ByteBuffer.allocateDirect(200 * 1024 * 1024);
        System.out.println("다이렉트 버퍼 생성 " + directBuffer);
        
        ByteBuffer nonDirectBuffer = ByteBuffer.allocateDirect(2000 * 1024 * 1024);
        System.out.println("non 다이렉트 버퍼 생성 " + nonDirectBuffer);
    }
 
}
cs


다이렉트 버퍼 생성 java.nio.DirectByteBuffer[pos=0 lim=209715200 cap=209715200]

Exception in thread "main" java.lang.OutOfMemoryError: Direct buffer memory

at java.nio.Bits.reserveMemory(Bits.java:693)

at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123)

at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311)

at BufferSizeExample.main(BufferSizeExample.java:9)





allocate() 메소드

JVM heap 메모리에 non다이렉트 버퍼 생성.

1
2
ByteBuffer byteBuffer = ByteBuffer.allocate(100);    // 최대 100개의 바이트를 저장하는 ByteBuffer 생성
CharBuffer charBuffer = CharBuffer.allocate(100);    // 최대 100개의 문자를 저장하는 CharBuffer 생성
cs


Wrap() 메소드

각 타입별 Buffer클래스는 모두 wrap() 메소드를 가지고 있다. wrap() 메소드는 이미 생성된 자바 배열은 Wrapping해서 Buffer 객체를 생성한다.

자바 배열은 JVM heap 메모리에 생성되므로(배열도 객체이다) wrap()은 non다이렉트 버퍼를 생성한다.


1
2
byte[] byteArray = new byte[100];
ByteBuffer byteBuffer = ByteBuffer.wrap(byteArray);
cs


다음과 같이 배열의 일부 데이터만 Buffer객체를 생성할 수도 있다.

1
2
3
4
char[] charArray = new char[100];
 
// 0 인덱스부터 50개만 버퍼로 생성 
CharBuffer charBuffer = CharBuffer.wrap(charArray, 050);  
cs



CharBuffer는 CharSequence 인터페이스로 구현한 클래스이므로 CharSequence 타입의 매개값을 갖는 wrap() 메소드도 제공한다. 즉, 매개값으로 문자열을 제공해서 다음과 같이 CharBuffer 생성이 가능하다.


1
CharBuffer charBuffer = CharBuffer.wrap("문자열 매개값 넣기");
cs


CharSequence 인터페이스

http://impartially.tistory.com/23



allocateDirect() 메소드

이 메소드는 다이렉트 버퍼(OS가 메모리 관리)를 생성하며, ByteBuffer만 제공한다. 각 타입별 버퍼는 없지만 as-Buffer()를 통해 각 타입별 Buffer를 얻을 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.IntBuffer;
 
public class DirectBufferCapacityExample {
    public static void main(String[] args) {
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(100);
        System.out.println("저장용량: " + byteBuffer.capacity() + " 바이트");
        
        
        CharBuffer charBuffer = ByteBuffer.allocateDirect(100).asCharBuffer();
        System.out.println("저장용량: " + charBuffer.capacity() + " 문자");
        
        IntBuffer intBuffer = ByteBuffer.allocateDirect(100).asIntBuffer();
        System.out.println("저장용량: " + intBuffer.capacity() + " 정수");
    }
}
 
cs



byte 해석 순서

1
2
3
4
5
6
7
8
import java.nio.ByteOrder;
 
public class ComputerByteOrderExample {
    public static void main(String[] args) {
        System.out.println("운영체제 종류 : " + System.getProperty("os.name"));
        System.out.println("네이티브 바이트 해석 순서 : " + ByteOrder.nativeOrder());
    }
}
cs

결과 :

운영체제 종류 : Windows 7

네이티브 바이트 해석 순서 : LITTLE_ENDIAN



CPU 등 환경에 따라 바이트의 처리 순서에는 차이가 있다. (Little Endian, Big Endian)

따라서, 네트워크로 데이터를 주고 받을 때는 하나의 Endian에 맞도록 Byte Order해줄 필요가 있다.



JVM은 무조건 Big Endian으로 자동적으로 처리해주지만, 다이렉트 버퍼일 경우 OS의 native I/O를 사용하므로 

다음과 같이 기본 해석순서로 맞춰주면 성능에 도움이 된다.


1
    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(100).order(ByteOrder.nativeOrder());
cs




728x90

https://msdn.microsoft.com/en-us/library/323b6b3k.aspx?f=255&MSPPError=-2147217396


참고



size_t는 대상 플랫폼에 따라 unsigned __int64 또는 unsigned integer를 뜻한다.

CRTDEFS.H 또는 다른 include 파일에 의해 정의된다.



vcruntime.h

// Definitions of common types
#ifdef _WIN64
    typedef unsigned __int64 size_t;
    typedef __int64          ptrdiff_t;
    typedef __int64          intptr_t;
#else
    typedef unsigned int     size_t;
    typedef int              ptrdiff_t;
    typedef int              intptr_t;
#endif


#define의 유용성을 생각해보면 필요해 따라 type을 바꿔 쓸 수도 있을 것이다.

'Study > C' 카테고리의 다른 글

enum, auto, 구조체  (0) 2017.03.24
C 복습-콘솔 입출력  (0) 2017.02.11
c 복습  (0) 2016.11.03
파일의 분할과 헤더파일의 디자인  (0) 2016.08.30
선행처리기와 매크로2  (0) 2016.08.30
728x90

Arduino IDE 다운로드

https://www.arduino.cc/en/Main/Software




아두이노 웹 시뮬레이터

https://circuits.io/lab


// led 번갈아 깜박


led의 긴 핀은 Cathode(전류가 흘러나오는 쪽), 짧은 쪽이 Anode(전류가 흘러들어가는 쪽)이다.

led의 긴핀 (다리가 구부러진 쪽)을 D13에 짧은 쪽을 저항을 통해 GND에 연결한다.



void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second

  digitalWrite(12, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);                       // wait for a second
  digitalWrite(12, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);                       // wait for a second
}



// fnd 0~9 표시



int a = 2, b = 3, c = 4, d = 5, e = 6, f = 8, g = 7;  // 선을 꽂을 때, 교차되지 않도록 f와 g를 바꿈
int led[7] = { a, b, c, d, e, f, g };

int digit[10][7] = { {1, 1, 1, 1, 1, 1, 0}, // 0
                     {0, 1, 1, 0, 0, 0, 0}, // 1
                     {1, 1, 0, 1, 1, 0, 1}, // 2
                     {1, 1, 1, 1, 0, 0, 1}, // 3
                     {0, 1, 1, 0, 0, 1, 1}, // 4
                     {1, 0, 1, 1, 0, 1, 1},
                     {0, 0, 1, 1, 1, 1, 1},
                     {1, 1, 1, 0, 0, 1, 0},
                     {1, 1, 1, 1, 1, 1, 1},
                     {1, 1, 1, 0, 0, 1, 1} };

void setup() {
  // put your setup code here, to run once:
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  for (int i=0; i<10; i++) {
    for (int j=0; j<7; j++) {
      digitalWrite(led[j], digit[i][j]);
    }
    delay(1000);
  }
}


// 건전지 전압 측정



//  택트 스위치로 LED 끄고 켜기


int sw = 2;
int led = 13;

void setup() {
  pinMode(sw, INPUT);
  pinMode(led, OUTPUT);
}

void loop() {
  if (digitalRead(sw) == HIGH)
  {
    digitalWrite(led, LOW);
  }
  else
  {
    digitalWrite(led, HIGH);    
  }
}



// pwm LED 단계적으로 밝아지게

아두이노에 pwm 표시가 있는 포트에 연결 (pwm 지원 아날로그 출력 포트에 연결)


analogWrite 함수를 사용한 pwm은 490Hz 주파수(1/490 sec 간격)로 HIGHT와 LOW를 오가며 전압을 변화시킨다.


밝기를 변화시킬 LED와 함께 사용할 저항 값은 다음과 같이 계산한다.


LED와 함께 사용할 저항 값 (Ω) = ( 전원 전압(V) - LED 규격 전압(V) )  /  정격 전류 (A)

     85 Ω =                   ( 5 V - 3.3 V )                 /   0. 02            


저항값이 꼭 정확히 맞아야 하는건 아니므로, 밝기 변화 단계는 적어지지만 무난하게 100 Ω 을 사용하면 된다.

byte n = 5;

void setup() {
  // put your setup code here, to run once:  
}

void loop() {
  for (int x = 0; x<n; x++)
  {
    analogWrite(9, x * 255 / n);  // pwm 아날로그 출력
    delay(1000);
  }
}


// 기울기 센서

void setup() { 
  pinMode(2, INPUT_PULLUP);
  pinMode(13, OUTPUT);
} 

void loop()
{ 
  boolean sw = false;

  while (sw == digitalRead(2));
  digitalWrite(13, LOW);
  delay(3000);
  digitalWrite(13, HIGH);
}


// piezo 스피커로 소리 출력

byte n = 5;

void setup() {
  // put your setup code here, to run once:  
}

void loop() {
  analogWrite(9, 255 / 2);
}


// PWM 아날로그 출력을 통한 모터 작동


int INA = 9; 
 
void setup() { }
 
void loop() { 
  for (int i=0; i<256; i+=5)  {
    analogWrite(INA, 255 - i);
    delay(100);
  }      
  delay(1000); 
}



'Study > Embedded' 카테고리의 다른 글

라즈베리 파이3, 기본 설정  (0) 2017.06.10
아두이노 LCD  (0) 2017.06.01
ATMEGA USART-C# App 연동  (0) 2016.12.12
7/21 Atmega128 포트/ win32 api  (0) 2016.07.21
7/8 LCD제어2  (0) 2016.07.08
728x90

사운드 관련 클래스 정의

using System.Runtime.InteropServices;
public class Win32
        {
            #region 사운드 관련
            [DllImport("winmm.dll")]
            public static extern int waveOutGetVolume(IntPtr hwo, out uint dwVolume);
 
            [DllImport("winmm.dll")]
            public static extern int waveOutSetVolume(IntPtr hwo, uint dwVolume);
 
            public static void SetSoundVolume(int volume)
            {
                try
                {
                    int newVolume = ((ushort.MaxValue / 10* volume);
                    uint newVolumeAllChannels = (((uint)newVolume & 0x0000ffff| ((uint)newVolume << 16));
                    waveOutSetVolume(IntPtr.Zero, newVolumeAllChannels);
                }
                catch (Exception) { }
            }
 
            public static int GetSoundVolume()
            {
                int value = 0;
                try
                {
                    uint CurrVol = 0;
                    waveOutGetVolume(IntPtr.Zero, out CurrVol);
                    ushort CalcVol = (ushort)(CurrVol & 0x0000ffff);
                    value = CalcVol / (ushort.MaxValue / 10);
                }
                catch (Exception) { }
                return value;
            }
            #endregion
        }



폼의 생성자

public Form1()
        {
            InitializeComponent();
            formInit();
 
            lobbyBgm.PlayLooping();
            Win32.SetSoundVolume(5);    // 초기 볼륨 설정 (0~10)
 
            trackBar1.Value = Win32.GetSoundVolume();   // 트랙바의 값을 현재 볼륨값으로 설정
        }


트랙바 스크롤 이벤트

private void trackBar1_Scroll(object sender, EventArgs e)
        {
            int volume;
            volume = trackBar1.Value;
            
            Win32.SetSoundVolume(volume);
        }


'Study > C#' 카테고리의 다른 글

c# docx 에서 텍스트 얻기  (0) 2020.10.28
IP 주소 정수로 변환  (0) 2017.05.16
C# Thread  (0) 2017.04.24
C# MS-SQL 연동  (0) 2017.04.14
C# 네트워크 기본  (1) 2017.04.12
728x90
public string BringIP()
        {
            IPHostEntry host = Dns.GetHostEntry(Dns.GetHostName());
            string ip = string.Empty;
 
            for (int i = 0; i < host.AddressList.Length; i++)
                if (host.AddressList[i].AddressFamily == AddressFamily.InterNetwork)
                    ip = host.AddressList[i].ToString();
 
            return ip;
        }
      
 
        public Form1()
        {
            InitializeComponent();
            
            byte[] ip = BringIP().Split('.').Select(s => Byte.Parse(s)).ToArray();
            if (BitConverter.IsLittleEndian)
            {
                Array.Reverse(ip);
            }
            uint num = BitConverter.ToUInt32(ip, 0);
 
            txtServerIP.Text = num.ToString();
        }


'Study > C#' 카테고리의 다른 글

c# docx 에서 텍스트 얻기  (0) 2020.10.28
c#트랙바를 통한 볼륨 조절  (0) 2017.05.18
C# Thread  (0) 2017.04.24
C# MS-SQL 연동  (0) 2017.04.14
C# 네트워크 기본  (1) 2017.04.12
728x90

Thread 관련 예제


using System;
using System.Threading;
 
namespace Study_CS_ConsoleApp
{
    class Program
    {
        static Thread threadA = new Thread(FuncA);
        static Thread threadB = new Thread(FuncB);
        static Thread threadC = new Thread(FuncC);
 
 
        static void FuncA()
        {
 
            for(int i=0; i<50; i++)
            {
                if (i > 30)
                    threadA.Abort();
 
                Console.WriteLine("A : Count = " + i);
            }
        }
 
        static void FuncB()
        {
            for (int i=0; i<50; i++)
            {
                System.Threading.Thread.Sleep(100);
                Console.WriteLine("B : Count = " + i);
            }
        }
 
        static void FuncC()
        {
            for (int i = 0; i < 50; i++)
            {   
                Console.WriteLine("C : Count = " + i);
                threadC.Suspend();
            }
        }
 
        static void Main(string[] args)
        {
            threadA.Start();
            threadB.Start();
            threadC.Start();
        }
    }
}



suspend()와 resume()


using System;
using System.Threading;
 
namespace Study_CS_ConsoleApp
{
    class Program
    {
        static Thread threadA = new Thread(FuncA);
        static Thread threadB = new Thread(FuncB);
        
        static void FuncA()
        {
 
            for(int i=0; i<=10; i++)
            {
                System.Threading.Thread.Sleep(100);
                Console.WriteLine("A : Count = " + i);
 
                if(i == 0)  // 조건문이 없으면 또 다시 Suspend
                threadA.Suspend();
            }
        }
 
        static void FuncB()
        {
            for (int i=0; i<=10; i++)
            {
                System.Threading.Thread.Sleep(100);
                Console.WriteLine("B : Count = " + i);
            }
            threadA.Resume();
        }
 
        static void Main(string[] args)
        {   
            threadA.Start();
            threadB.Start();
        }
    }
}


delegate


using System;
using System.Threading;
 
namespace Study_CS_ConsoleApp
{
    class Program
    {
        // 델리게이트 선언
        public delegate int cal(int a, int b);
 
        public static int Plus(int a, int b) { return a + b; }
        public static int Minus(int a, int b) { return a - b; }
 
        static void Main(string[] args)
        {
            cal plus = new cal(Plus);
            cal minus = new cal(Minus);
 
            Console.WriteLine(plus(46));
            Console.WriteLine(minus(115));
        }
    }
}



'Study > C#' 카테고리의 다른 글

c#트랙바를 통한 볼륨 조절  (0) 2017.05.18
IP 주소 정수로 변환  (0) 2017.05.16
C# MS-SQL 연동  (0) 2017.04.14
C# 네트워크 기본  (1) 2017.04.12
C# 예외처리, delegate  (0) 2017.04.10

+ Recent posts