사물인터넷_0502

allzeroyou·2022년 5월 2일

사물인터넷

목록 보기
4/7

네트워크 프로그래밍
옆친구 온도 센서, 모터 등을 돌리고 싶을때 => 휴대폰 접속할 수 있어야

preview

int softToneCreate (int pin) ;
This creates a software controlled tone pin. You can use any GPIO pin and the pin numbering will be that of the wiringPiSetup() function you used.

The return value is 0 for success. Anything else and you should check the global errno variable to see what went wrong.

http://wiringpi.com/reference/software-tone-library/

int softToneCreate (int pin) ;
pin: 사용할 gpio번호

return type이 int임
줄 값이 있다는 뜻이다.

리눅스에 저장되어 있는 값

0이 호출되지 않으면 실패함.

해당 핀을 다른 용도로 사용하고 있는 경우가 실패 요인이겠지?

output mode이어야 함.

1초 동안 소리를 내고 싶다면?
내부적으로 thread을 만든다.

소리나는 것을 돌리고 있음

한번 해보기.

소켓 통신 프로그래밍

통신하는 프로그램 만들어보자

클라이언트-서버(cs 모델)

어떤형식으로 동작?
=> 1:다 관계임. 서버는 클라이언트에게 요청을 할 수 없음. 서버는 많은 클라이언트와 이야기를 해야!
복잡성을 줄이기 위해 => cs 모델을 사용함

p2p(peer to peer)

cs모델과 반대인 개념.
어떤 사람이든 원할 때 데이터를 띄울 수 있다.

보편적으로 cs 모델을 사용한다.

  • OSI 7 Layer
  1. 물리계층
    선 연결
    랜선(통신)
    이더넷선(8가닥)
    실제로 사용은 4가닥(100mbps)
  • vcc
  • gr
  • transaction(tx)
  • reception(rx)

신뢰성 체크(ack확인..)

  • Layer 3 network
    ip(forwarding)

  • L4
    라즈베리파이 vs 800만원 컴퓨터
    배려하는 마음으로 데이터를 주고받으면서 상대방이 잘 받을 수 있는지 체크
    => 흐름 체크

port 번호 필요
웹서버: 80번
ssh: 22번
80번 웹이 사용중..
www.naver.com => dns => ip 접속
접속후 어떤 포트 사용?
ssh pi@ip주소:port
ssh가 사용하는 포트 정해져있음
정해져있는 포트는 사용하면 안됨.
0~1023까지 정해져 있는 포트임 => well known port
ex) 21번 ftp
22번 ssh
23번 텔넷
25번 smp(email protocol)
80번 web
ip주소: 32비트(long타입)
포트: 16비트 (short타입)
=> 0~65535까지 사용가능
1024~65535까지 사용가능한 포트 번호임=> user defined port

  • L5
    session
    가상의 connection 위에서 데이터 주고받음

  • L6
    표현의 포맷을 맞추자
    Presentation

  • L7
    애플리케이션. 최상단

표준 api를 만들어보자 => socket(bsd) programing

L1~L4까지는 정형화되어있음.
소켓에서 미리 다 짜놓고 필요한 것만 사용자에게 입력받음.
사용자는 맞춰서 정보만 제공하면 됨.
소켓 API에 파라미터만 잘 맞추면 된다.

Sever

socket()

bind()

listen()

accept()

read()
↓ 반복
write()

close()


Client
socket()

connect()

write()
↓ 반복
read()

close()

=> connection established

Tx

  • write()
  • send()

Rx

  • read()
  • recv()

서버는 읽기만 가능해야!

socket

파일입출력
fopen함
file형 포인터 리턴
다음부터 파일을 접근하기위해서는 그 포인터를 사용하겠음

open
(File Descriptor)
https://twofootdog.tistory.com/51

과 비슷함
내부적으로 소통할수 있는 정보꾸러미 만들어서 정보꾸러미에 접속할 수 있는 주소 알려줌.

create endpoint => 정보꾸러미를 만들어서 접근할 수 있는 번호

AF_LOCAL 사용

define sys로 사용가능


domain : AF_INET
type: SOCK_STREAM(TCP), SOCK_DGRAM(UDP), SCTP...

특별할 거 쓸필요는 없음. 쓸거 없다면 0을 넣으면 된다.

file desciptor => pointer x, 번호임
88번과 같이 unique한 번호
파일, 소켓, 디바이스 접속 등 유닉스에선 모두 fd로 소통됨(모든 fd는 유니크하다)

서버함수

  • socket(): 소켓함수의 정의는 소켓 생성
  • bind(): 서버에만 있고 클라이언트에는 없음. 시스템 내부에 사용할 포트 예약
    1023까지 사용가능.
    complict이 일어나지 않게끔 포트를 예약해놔야 함. 포트 이용가능한지 예약 확인해야!
    => success/fail을 확인해야 한다.

포트는 sender 포트(source, 내가 보내는 포트-내가 지우면 된다), receive 포트

클라이언트는 먼저 쏘지, 쏘임을 받지 않음.
(만약 p2p의 경우는 둘다 bind 필요)

시스템상으로 빈 포트를 예약하기 때문에, 중복될 일은 없음

  • listen(): tcp 초기 window 크기 지정
    슬라이딩 윈도우
    ack가 안오면 줄이고, 또 올리고, ..
    초기에 윈도우라고 하는 것(데이터를 하나를 보낼지, 5로 보낼지, ..을 통해 tcp 에서 운영)
    윈도우 값을 뭐로 잡아야 돼?

  • accept(): 접속을 받기 위함(client로부터 connect() 받음)

  • close(): 생성된 소켓 파기 + 접속종료

클라이언트 함수

socket(): 서버와 동일
connect(): 접속 요청(client=>서버)
close: 서버와 동일

멍텅구리 같은 삶보다는 내부원리를 알자.

tcp접속

3-way-handshaking

tcp에서 접속 =>

  • 3-way-handshaking
    a: 접속가능?
    b: ㅇㅇ
    b: 그러면 너는 접속 가능해?
    a: ㅇㅇ

tcp에서 어떻게 connect establish?

server - client
tcp 접속(establishment)
1. synk(세그먼트)를 보낸다.
2. 서버에서 client로 synk+ack를 보낸다.
3. client에서 ack를 보낸다.

appect()-connect()

data transmission

데이터를 보내고 ack를 받으면 된다.
몇개를 보내고 ack를 받느냐가 슬라이딩 윈도우의 윈도우 갯수임!

=> listen()에서 지정(window 크기 지정)

write() => read()
write함수에 내가 보낼 함수의 포인터만 넘겨주자~

disconnection

서버와 클라이언트 누구든 가능.
3-way-handshaking은 클라이언트로 부터 시작
disconnection은 서버, 클라이언트 둘 다 사용가능한데 보편적으로 클라이언트가 진행함.

클라이언트에서 서버로 FIN신호를 통해 연결을 끊고 서버는 ACK를 보낸다.

close() 함수 사용

좀비패킷 => TTL(10번을 Forwarding되도 해당 ip를 못 찾을 경우 없어진다)

source routing 패킷 => db os 패킷이야~라는 뜻이다.

blocking vs non-blocking

blocking 함수: 농구에서 막는 것.
어디에서 대기하는 것.
어떠한 조건이 맞춰질 때까지 그곳에서 멈춰있는 것(머물러 있음)
non-blocking 함수: 머물러 있지 않음
scanf는 blocking함수(화면에서 입력할때까지 멈춰있음)
prinf는 non-blocking함수

blocking APIs

  • accept(): 언제 올지 모르니까 connect가 올때까지 기다림.
  • read(): write()가 올때까지 기다림

연결이 되려면 서버가 열려있어야 해서 connect은 아님!
debug할때 accept, read는 조건이 만족되지 않으면 머물려 있음.

non blocking APIs
나머지 다~

man 페이지로 socket 뿐만 아니라 나머지 함수들을 살펴볼 예정.
코딩을 하겠다!

profile
모든 건 zero 부터, 차근차근 헛둘헛둘

0개의 댓글