안녕하세요. 두 개의 wz610mj 로 송,수신 테스트를 하고 있는데요…
일반적인 방법 ( 지정된 IP로 데이터를 보내는 방법? )
과 브로드캐스트 둘 다 제대로 데이터를 받을 수 없었습니다
다음은 제가 사용한 코드입니다…
초기화 부분
// 아랫부분은 위즈넷 예제에서 가져와서 조금 수정했어요
wiz_NetInfo gWIZNETINFO = { .mac = {0x00,0x08,0xdc,0xFF,0xFF,0xF0},
#ifdef TX
.ip = {192,168,0,10},
#else
.ip = {192,168,0,11},
#endif
.sn = {255, 255, 255, 0},
.gw = {192, 168, 177, 1},
.dns = {168, 126, 63, 1},
//.dhcp = NETINFO_STATIC,
.lla={0xfe,0x80,0x00,0x00,
0x00,0x00, 0x00,0x00,
0x02,0x08, 0xdc,0xff,
0xfe,0x57, 0x57,0x25}, ///< Source Link Local Address
.gua={0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00}, ///< Source Global Unicast Address
.sn6={0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00 }, ///< IPv6 Prefix
.gw6={0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00} ///< Gateway IPv6 Address
};
ctlwizchip(CW_SYS_UNLOCK,& syslock);
ctlnetwork(CN_SET_NETINFO,&gWIZNETINFO);
// 소켓 오픈 전에 해야 하는 것인지 알 수 없어 앞 뒤로 최대 버퍼 값을 바꾸려 했습니다
setSn_TX_BSR(0,2);
setSn_RX_BSR(0,2);
socket(0,Sn_MR_UDP4,50000,SF_MULTI_ENABLE);
//socket(0,Sn_MR_UDP4,50000,SF_IO_NONBLOCK); // 이것도 시도해보았습니다만…
setSn_TX_BSR(0,2);
setSn_RX_BSR(0,2);
송신부
bool W6100_SendData(uint8_t socket_num, uint8_t* databuf, datasize_t len )
{
uint8_t destip[16] = {255, 255, 255, 255};
//uint8_t destip[16] = {192,168,0,255};
int16_t destport = 50000;
uint8_t addrlen = 4;
datasize_t ret;
if( socket_num > 8 )
return false; /// socketnum error
ret = sendto(socket_num , databuf, len, destip, destport, addrlen); // Broadcast,
// ret 은 이제 실제로 보낸 값이 들어있음The real sent data size. It may be equal to <i>len</i> or small.\n
if( len != ret )
return false;
return true;
}
수신부
아래에서 temp_datasize 가 항상 0이어서 수신을 처리 할 수가 없었습니다
datasize_t W6100_ReceiveData( uint8_t socket_num, uint8_t* databuf )
{
datasize_t temp_datasize = 0;
datasize_t ret = 0;
uint8_t addrlen = 4;
uint8_t status;
static uint8_t destip[16] = {192,168,0,10};
static uint16_t destport = 50000;
getsockopt(socket_num, SO_STATUS,&status);
if( status == SOCK_UDP ){
if( SOCK_OK != getsockopt( socket_num, SO_RECVBUF, &temp_datasize) )
return 0;
if( temp_datasize <= 0)
return 0;
ret = recvfrom( socket_num , databuf, temp_datasize, (uint8_t*)destip, (uint16_t*)destport, &addrlen );
}
else
return 0;
// ret 가 1 이상이면 받은 데이터 갯수임
// ret 가 0 이하면 에러임
return ret;
}
수신이 안된다고 생각하는 이유는
송신하는 부분을 컴퓨터 랜카드와 연결하여 wireshark로 확인하였을때 데이터가 들어오는것이
확인되기 때문이었습니다.
브로드캐스트를 보내고 받고 싶어 시작을 했는데요…
아무리 해도 잘 안되어서 송,수신부에 정해진 IP를 부여하여 보내는 방법도 사용 해보았지만
소득이 없었습니다. 도움 부탁드립니다.