2012.11.30 09:08
프로토콜 설명 내용 

1. 개발 환경

OS : Linux

컴파일러: gcc

UPNP SDK(UPNP 라이브러리) : upnp. sourceforge.net 

IGD (UPNP 데몬): igd.sourceforge.net

 

 

2. 용 어

Device: TV, Gateway 등 장치를 뜻한다. C/S 개념으로 서버와 비슷한 개념이다.

Control Point: Device 를 제어하는 장치로서 일반 PC, 노트북을 예로 들수 있다. C/S 개념으로 클라언트와 비교할 수 있다.

 

 

3. UPNP Layer

UPNP 에는 6 Layer 로 구성되어 있다.

 

 

3

Control

(SOAP)

4

Eventing

(GENA)

5

Presentation

(HTTP:HTML)

 

2  Description (HTTP:XML)

 

1 Discovery (SSDP/GENA)

0 Address

 

 

0 Level (Address

 Control point 와 Device 네트워크에 참여하기 위해 IP Address 를 얻어온다.

1 Level (Discovery)

Control point 는 모든 Device 를 찾아내고 Device 자신의 사용 가능여부를 알려준다.

2 Level (Description)

Control point 가 device 에 대한 기본 정보를 가져 온다.

3 Level (Control)

Control point 가 Device를 제어한다.

4 Level (Eventing)

Control point 가 Device 상태를 listen 한다.

5 Level (Presentation

Web 화면을 Device를 정보를 볼 수 있거나 제어 할 수 있다.

Intel Linux 하에서 구현된 upnp sdk 는 Level 1부터 구현되어 있다. Address를 얻어오는 부분은 DHCP 로 얻어 온다.

4. UPNP 프로토콜과 구현

 

 

Upnp 는 SSDP, GENA, SOAP 로 구성되어 있다. SSDP와 GENA 는 UDP 기반위에 멀티 캐스트/유니캐스트 패킷으로 이뤄어 졌고 SOAP는 TCP 기반으로 구성되어 있다. 약간씩 차이는 있지만 기본적인 형태는 HTTP로 이루어 졌기 때문에 UPNP SDK 를 살펴보면 WEB 모듈이 반이상을 차지하는 것을 알 수 있다.


 

 


1) Discovery(SSDP/GENA)

 

Device를 네트워크에 참여시키면 239.255.255.250 패킷 헤더에 NOTIFY , 장치의 고유번호 , 동작여부, Device 를 정의한 xml 파일의 경로 등을 담은 멀티캐스트 udp 패킷을 네트워크로 보낸다(광고한다).

NOTIFY * HTTP/1.1
HOST: 239.255.255.250:1900
CACHE-CONTROL: max-age =
 1800
LOCATION: http://192.168.0.9:2869/gatedesc.xml

NTupnp:rootdevice
NTS
ssdp:alive
SERVER: Linux/2.4.12 UPnP/1.0 Intel UPnP SDK/1.0
USNadvertisement UUID

 

 

 


* 이 부분은 upnp sdk 에서 구현되어 있으므로 사용자가 프로그램 해야 할 부분은 UpnpSendAdvertisement 함수를 호출 해주면 된다.

 

 

 

2) Description (HTTP:XML)

Discovery에서 알아낸 Device의 XML description 파일을 얻어 온다. 프로토콜 방식은 HTTP 방식이다.

 

PC 에서 Description 패킷을 받으면 [내 네트워크 환경]에서 Device 가 나타나는걸 볼 수 있다. 이 아이콘을 누르면 바로 Device의 설정화면인 Web 화면으로 넘어간다. Anygate 상에서는 Description 부분이 구현되어 있다면 Device 의 IP 주소를 몰라도 이 아이콘의 클릭만으로 바로 설정 화면으로 들어갈 수 있다.

 

위에 등록 정보 내용을 수정하려면 xml 파일을 수정하면 된다. 우리는 gatedesc.xml 의 기본내용을 담고 있는 gatedesc.skl에서 각 내용을 수정할 수 있다

 

 

3) Control (SOAP)

Control pointer 에서 Device의 정보를 얻어오거나 Device를 제어할 때 사용되는 Control Level 은 Device와 관련된 부분으로 Anygate에 상에 upnp 를 돌리기 위해 가장 많이 구현해야 하는 부분이다.

해더부분은 M-POST 로 시작하며 SOAPACTION 뒤에 오는 각각의 #ActionName(제어시) 과 #QueryStateVariable(Device에 대한 정보) 요청에 대한 응답 부분을 구현해야 한다.

 

M-POST  /upnp/control/WANIPConn1  HTTP/1.1
HOST: 192.168.0.9:2869  CONTENT-TYPE: text/xml; charset="utf-8"
MAN: "http://schemas.xmlsoap.org/soap/envelope/"; ns=0101-

==============================================================

Device를 제어 할 때

SOAPACTION: "urn:schemas-upnp-org:service:serviceType:v#actionName"
==============================================================

Device의 정보를 알고자 할 때

SOAPACTION: "urn:schemas-upnp-org:control-1-0#QueryStateVariable

 

 


 

 

Device 에는 여러 개의 Service 로 이루워져 있는데 인터넷 공유기인 Anygate 는 IGD 를 기반으로 하기 때문에 연결부분 (CONNECT), 설정 부분(CONFIG), Device 의 OS 3개 부분으로 구성되어 있고 각각을 정의한 description 파일 gateconnSCPD.xml, gateicfgSCPD.xml,  gateinfoSCPD.xml 3개가 존재 한다.

 

각각의 서비스에 대한 Action 값은 igd.sourceforge.net 에 정의 되어 있으나 각 부분에 대한 값들은 구현을 해야 된다.

 

if (strcmp(ca_event->ServiceID, GateServiceId[GATE_SERVICE_CONNECT]) == 0)

=>서비스 종류 확인

{

strcpy(service_type, GateServiceType[GATE_SERVICE_CONNECT]);

if (strcmp(ca_event->ActionName, "GetConnectionTypeInfo") == 0)

=> Action 종류 확인

{

action_succeeded = 1;

strcpy(result_param,"<NewConnectionType>IP_Routed</NewConnectionType>

<NewPossibleConnectionTypes>IP_Routed</NewPossibleConnectionTypes>");

=> 이부분이 Device 장치와 관련 부분으로 사용자가 정의 해야 한다.

}

}

ca_event->ErrCode = UPNP_E_SUCCESS;

sprintf(result_str, "<u:%sResponse xmlns:u=\"%s\">\n%s\n</u:%sResponse>",

ca_event->ActionName,service_type,result_param,ca_event->ActionName);

=> Action 이름/ 서비스 종류/ Action 에 대한 value 값을 result_str 에 복사한 다음  result_str 값을 Control point에 보내주면 된다.

 


 

 

 

 


각 서비스에 대한 Action 과 구현은 아래와 같다.

 

연결 부분 (GateServiceId[GATE_SERVICE_CONNECT])에 대한 Action

 

- GetConnectionTypeInfo: 연결 타입으로 IP_Routed 로 정의

- GetNATRSIPStatus: NAT 사용 여부 로 Enable 값은 1로 정의

- GetStatusInfo: 연결 여부, 연결 시간

  Uptime => /proc/uptime 을 이용한다.

- GetExternalIPAddress: 외부 IP 주소

- GetGenericPortMappingEntry: 기본적으로 내장되어 있는 포트포워딩 으로 아래와 같은 값은 만들어서 보내줘야 동작 한다. 
포트 포워딩에 관련된 값들은 호스트 아이피, 외부 포트, 프로토콜, 내부 포트, 내부 아이피 , 사용여부,  포트 포워딩 설명, 사용 시간에 대한 내용을 표시하여 한다. 각각의 값은 아래 굵은 글씨를 참조하면 된다.

<NewRemoteHost xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="string"></NewRemoteHost>

<NewExternalPort xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="ui2">23</NewExternalPort>

<NewProtocol xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="string">TCP</NewProtocol>

<NewInternalPort xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="ui2">23</NewInternalPort>

<NewInternalClient xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="string"> 192.168.1.0 </NewInternalClient>

<NewEnabled xmlns:dt="urn:schemas-microsoft-com:datatypes"dt:dt="boolean">0</NewEnabled>

<NewPortMappingDescription xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="string"> Telnet </NewPortMappingDescription>

<NewLeaseDuration xmlns:dt="urn:schemas-microsoft-com:datatypes" dt:dt="ui4"> 0 </NewLeaseDuration>

 



- GetSpecificPortMappingEntry: 사용자가 직접 입력한 포트 포워딩 Entry

- AddPortMapping : 포트 포워딩 규칙이 추가될 때 동작 한다.

- DeletePortMapping : 포트 포워딩 규칙이 추가될 때 동작 한다.

 

GateServiceId[GATE_SERVICE_CONFIG]

이부분은 RX_PACKET /TX_PACKET 흐름에 대한 정보를 표현한 것으로 -> /proc/net/dev 에서 가져오면 된다.

 

- GetTotalPacketsSent 인터넷 게이트웨이가 보낸 패킷

- GetTotalPacketsReceived 인터넷 게이트웨이가 받은 패킷

- GetCommonLinkProperties: 연결 상태, 속도

 

GateServiceId[GATE_SERVICE_OSINFO]

 

 

UPNP 에서 Control 패킷을 받으면 [내트워크 연결] 를 보면 인터넷 게이트웨이에 Gateway를 설정할 수 있는 부분이 생겼다는걸 알수 있다.

 

위 아이콘을 클릭하면 연결 상태, 기간, 속도, 인터넷 게이트 웨이에서 주고 받은 패킷에 대한 정보가 나온다. 이부분은 Action 을 계속하여 보내므로써 출력된다. 

 

4) Eventing (GENA)

Control Point Device의 정보를 광고 정보를 subscribe , unsubscribe 할때 받는 패킷으로 헤데 부분에 SUBSCRIBE, UNSUBSCRIBE 로 구현되어 있다.

SUBSCRIBE /upnp/event/OSInfo1 HTTP/1.1
HOST: 192.168.0.9
CALLBACK
: <http://192.168.0.79:5000/notify>..
NTupnp:event
TIMEOUT: Second-requested subscription duration

 



5) Presentation

이부분은 일반 HTTP 프로토콜과 같다.

5. Upnp 실행

 

1) 멀티 캐스트 패킷을 받아야 하므로 멀티캐스킹에 라우팅 규칙을 추가해야 한다.

route add -net 239.0.0.0 netmask 255.0.0.0 eth0

upnp 실행 시키려면 [upnpd 외부 IF 내부 IF ] 명령어를 실행하면 된다.

ex)upnpd eth1 eth0

Posted by k1rha