我不确定这是否是提出这个问题的正确位置。如果没有,我将删除它......
无论如何,我为LPC1788制作了enc28j60的驱动程序,我正试图从iOS发送UDP消息。发送失败。 通信由iOS发送ARP请求开始。在LPC上,我做出响应并将其发送到iOS MAC地址。我已经阅读了RFC的ARP并按规范创建了数据包,但由于某种原因,我没有在网络嗅探器中看到响应。
这肯定表明我的响应例程不起作用,如果在我从OSX(nc -u xxx.xxx.xxx.xxx端口)发送正确到LPC的udp消息时没有这种情况。
我观察到的不同之处在于OSX发送的请求长度为42字节,响应时长为60字节,最后18字节为0(填充字节),iOS发送长度为60字节的请求,最后4字节为90 eb 58 96
。
我尝试用所有填充零处理,并复制这4个字节,但两种方法都不起作用。
OSX ARP(req,res)和UDP包在嗅探器中可见。 iOS ARP req在嗅探器中可见,没有别的。
有什么想法吗?
编辑:
IOS代码:
CFSocketRef sock = CFSocketCreate(kCFAllocatorDefault, PF_INET, SOCK_DGRAM, IPPROTO_UDP, 0, NULL, NULL);
if ( sock == NULL) {
NSLog(@"CfSocketCreate Failed");
}else{
struct sockaddr_in remoteAddress;
memset(&remoteAddress, 0, sizeof(remoteAddress));
remoteAddress.sin_family = AF_INET;
remoteAddress.sin_len = sizeof(remoteAddress);
remoteAddress.sin_port = htons(1200);
remoteAddress.sin_addr.s_addr = inet_addr("192.168.5.8");
char data[] = "test";
NSData *message_data = [NSData dataWithBytes:&data length:4];
NSData* remoteAddressData = [NSData dataWithBytes:&remoteAddress length:sizeof(remoteAddress)];
CFSocketError er = CFSocketSendData(sock, (__bridge CFDataRef)(remoteAddressData), (__bridge CFDataRef)message_data, 0);
}
LPC代码:
void make_arp_response (uint8_t *buffer)
{
uint16_t pos = sizeof (ethernet.source)+sizeof (ethernet.dest);
uint8_t type[2];
type[0] = ARP_TYPE>>8;
type[1] = (uint8_t)ARP_TYPE;
memcpy (buffer+pos, &type, sizeof (ethernet.type)); pos = sizeof(ethernet); //set ethernet type
arp.hwType = ((0x01)<<8);
memcpy (buffer+pos, &arp.hwType, sizeof (arp.hwType)); pos += sizeof(arp.hwType);
arp.protocol[0] = 0x08;
arp.protocol[1] = 0x00;
memcpy (buffer+pos, &arp.protocol, sizeof (arp.protocol)); pos += sizeof(arp.protocol);
memcpy (buffer+pos, &arp.macLen, sizeof (arp.macLen)); pos += sizeof(arp.macLen);
memcpy (buffer+pos, &arp.ipLen, sizeof (arp.ipLen)); pos += sizeof(arp.ipLen);
arp.opCode = (0x02) << 8;
memcpy (buffer+pos, &arp.opCode, sizeof (arp.opCode)); pos += sizeof(arp.opCode);
memcpy (buffer+pos, &macaddr, sizeof (arp.sourceMac)); pos += sizeof(arp.sourceMac);
memcpy (buffer+pos, &arp.destIP, sizeof (arp.sourceIp)); pos += sizeof(arp.sourceIp);
memcpy (buffer+pos, &arp.sourceMac, sizeof (arp.destMac)); pos += sizeof(arp.destMac);
memcpy (buffer+pos, &arp.sourceIp, sizeof (arp.destIP));
enc28j60_PacketSend(sizeof (ethernet)+sizeof (arp),buf);
}
更新:
这似乎不仅仅是iOS问题,而是Wifi客户端的问题。我试图通过wifi从Windows笔记本电脑发送UDP,它也发送ARP请求,但响应和UDP数据包以某种方式丢失。看来我的ruter在我的LPC上有一些问题:) 我也尝试将Arduino连接到相同的enc28j60板而不是LPC,并且UDP通信工作。 arduino库位于NET的某个地方。 arduino代码中的ARP响应看起来和我一样。
更新2:
Arp请求:
ff ff ff ff ff ff 85 29 fb 0d c2 71 08 06 00 01
08 00 06 04 00 01 85 29 fb 0d c2 71 c0 a8 05 28
00 00 00 00 00 00 c0 a8 05 08 00 00 00 00 00 00
00 00 00 00 00 00 00 00 25 a9 c3
Arp回复:
85 29 fb 0d c2 71 7b c3 53 a6 9c 55 08 06 00 01
08 00 06 04 00 02 7b c3 53 a6 9c 55 c0 a8 05 08
85 29 fb 0d c2 71 c0 a8 05 28
此响应在LPC上发送后立即从LPC转储。我没有在嗅探器中看到它。