W5500 을 tcp client 모드로 사용하여tcp 서버에 접속하는 형태로 사용 중입니다.
w5500칩 + ARM 으로 board를 제작하여 기본 접속 및 데이터 송수신 까지 확인 하였습니다.
문제는 사무실이 학교 망을 사용하는데 외부의 서버(서버A라 칭함)에 접속이 안되는 현상입니다.
학교망 내에 IPTIME 공유기를 사용중이며 공유기 아래에 제 PC와 w5500 보드가 있습니다.
W5500보드가 사무실에서 서버A로 접속이 안됩니다.
W5500보드를 학교망 내가 아닌 집에 갖고 가면 서버A에 잘 접속 합니다.
간단히 생각해보면 W5500 패킷을 학교망(라우터 등이겠죠.)에서 막고 있다고만생각이 드는데.
추가적으로 사무실 PC에서 TCP 클라이언트 프로그램을 이용해 서버A에 접속은 또 잘 됩니다.(외부로 나가는 패킷을 모두 막는것은 아닌것 같고 뭔가 패킷내 라우터의 성질을 건으리는 잘못된 값이 있지 않나 추측 중)
혹시나 해서 사무실에서 ARDUINO W5100 쉴드(펌웨어가 다르지만)로 서버A에 접속해도 이또한 접속이 잘 됩니다.
(맥 어드레스나, #define DCHP_HOST_NAME “AABBCCDD\0” 바꿔 가며 테스트 해보아도 안되는건 동일)
펌웨어를 디버깅해보면if(connect(sn,server_ip,server_port)==SOCK_OK); 요 함수에서 서버 연결을 하지 못해 타임아웃으로 리턴값이 0이 되는 상황 입니다.
TCP는 잘 모르는데 Wireshark 으로 아두이노 쉴드로 제 PC에 접속하는 패킷과 제작한 W5500 보드의 접속하는 패킷을 비교해 봐도 거의 대동소이 해 보입니다.
다만
제작한 W5500보드는 src port: 9000, Dst Port: 9000
아두이노 쉴드보드는 Src port:49153 Dst Port:9000 이게 좀 다르네요.(무슨 의미인지 모르겠지만)
네트워크 담당자에게 문의할 상황은 되지 못하며, 작성 내용이 빈약한 다는 것은 알고 있으나
혹여 우선적으로 의심해 봐야할 부분이나, 점검해 볼수 있는 부분에 대해 도움을 받을수 있을까 하고 문의글 남깁니다.
공유기 내에서 w5500보드가 제 PC에 tpc로 접속되어 있는 상황에서 패킷을 뽑아보면 아래와 같습니다.
W5500 = d0:50:99:54:65(192.168.0.27)
TCP Server PC = d0:50:99:6b:54:64(192.168.0.5)
(* 학교망에서 MAC으로 필터링 하나 싶어, W5500맥주소를 PC와 유시하게 설정함)
메일확인하였습니다.
패킷으로보니 상황으로는 server에서 접속시도에대한 응답을 주지못해 timeout이 나는 상황입니다.
W5100으로는 통신이 가능하니 다른경우를 배제하고 의심해봐야할 점은 port number 같습니다.
port number는 하나의 ip로 여러 통신을 하는 경우 target을 명확하기 위해 사용됩니다.
W5100과 W5500의 경우에도 192.168.0.x 로 다른 ip를 할당받았지만 외부에서는 공유기의 ip로 통신을 하며 port number로 구분을 하게 됩니다.
공유기의 경우 설정을 통해 ip별로 통신가능한 port number를 할당 해줄 수 있습니다.
혹시 설정되어있는부분이 있는지 확인 하시는게 좋을것 같습니다.
공유기뿐만아니라 서버에서도 9000번 port 와의 통신을 막아놓았을 수도 있습니다.
따라서 port 번호를 변경해서 시도해보시는 것을 추천드립니다
W5100이 통신이 되므로 W5100과 비슷한 대역의 port로 사용하시는게 좋을 것 같습니다.
더불어
W5500을 IPRAW모드로 socket을 open시키면 ping을 전송할 수 있습니다. ping에 대한 응답은 받는지 확인해보는 것도 좋을 것 같습니다. wizwiki.net에서 application note에서 코드를 다운 받으 실 수 있습니다.
TCP 통신시 destination port와 source port 모두 설정할 수 있습니다.
source port는 Sn_PORT 레지스터를 통해 설정가능하며,
ioLibrary기준으로는
socket.c 에 socket을 open하기위해 사용되는 socket()함수가 있습니다. socket()함수 매개변수중 port에 해당됩니다.
문제는 인터넷에서 긁어온 소스에서 socket 함수를 호출할 때 포트번호를 접속하는 포트번호를 넣었더니 통신이 안되는 문제였네요.
server_port 인자 위치에 0값을 넣고 호출하니 정상적으로 서버에 접속됨을 확인하였습니다.
(0을 넣고 호출하면 적당한 범위의 source port 값으로 설정 되는듯 함)
소스 일부 -
//소켓을 생성한다. 소켓함수 전달 인자는 (“소켓 번호, 통시 모드, 포트 번호, 플래그)” 이다.
if(socket(sn, Sn_MR_TCP, server_port, 0x00)==sn){
printf(“%d:Socket Opened\r\n”,sn);