1

我正在使用新的 Microduino ENC28J60 以太网模块(兼容 Arduino)。

我正在使用 udpListener 草图,并希望在 UDP 数据包到达时将消息回显给发送者。

我收到消息正常,但是回调方法中的 udpSend 不起作用。

这在带有以太网屏蔽的 Arduino Uno 上运行良好

任何人都可以帮忙。

提前致谢

这是代码:

// Demonstrates usage of the new udpServer feature.
//You can register the same function to multiple ports, and multiple functions to the same port.
//
// 2013-4-7 Brian Lee cybexsoft@hotmail.com

#include 
#include

#define STATIC 1 // set to 1 to disable DHCP (adjust myip/gwip values below)

#if STATIC
// ethernet interface ip address
static byte myip[] = { 192,168,0,201 };
// gateway ip address
static byte gwip[] = { 192,168,0,1 };

static byte ipDestination[] = {192, 168, 0, 9};

unsigned int portMy = 8888; 
unsigned int portDestination = 9000;

#endif

 // ethernet mac address - must be unique on your network
static byte mymac[] = { 0x70,0x69,0x69,0x2D,0x30,0x31 };

byte Ethernet::buffer[500]; // tcp/ip send and receive buffer

char msg[] = {"Hello World"};

//callback that prints received packets to the serial port
void udpSerialPrint(word port, byte ip[4], const char *data, word len) {
IPAddress src(ip[0], ip[1], ip[2], ip[3]);
Serial.println(src);
Serial.println(port);
Serial.println(data);
Serial.println(len);

//I Added this to echo the packet <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
ether.sendUdp(msg, sizeof msg, portMy, ipDestination, portDestination);
Serial.println("UDP Sent !!");

}

void setup(){
Serial.begin(9600);
Serial.println("\n[backSoon]");

if (ether.begin(sizeof Ethernet::buffer, mymac) == 0)
Serial.println( "Failed to access Ethernet controller");
#if STATIC
ether.staticSetup(myip, gwip);
Serial.println("Serial Started on FixedIP");
#else
if (!ether.dhcpSetup())
Serial.println("DHCP failed");
#endif

ether.printIp("IP: ", ether.myip);
ether.printIp("GW: ", ether.gwip);
ether.printIp("DNS: ", ether.dnsip);

//register udpSerialPrint() to port 1337
ether.udpServerListenOnPort(&udpSerialPrint, portMy);

//register udpSerialPrint() to port 42.
//ether.udpServerListenOnPort(&udpSerialPrint, 42);
}

void loop(){
//this must be called for ethercard functions to work.
ether.packetLoop(ether.packetReceive());
}

===== 附加信息 ====

你好,

对不起,包括:

包括 EtherCard.h 包括 IPAddress.h 它们似乎从文本中删除,使用 c++ 中使用的左箭头和右箭头符号。

我记下了你关于以太类的笔记。我使用了 Ethercard 文件夹中的一个名为“udpListener”的示例,并且对未声明的类感到困惑。我假设 in 是在 ethercard.h 中完成的。

程序按原样工作,并使用 udpSerialPrint 方法监听并显示正确接收的 udp 数据包,因此监听端工作。我想向 udp 数据包的发送者回显一些东西,但 udpSend 不起作用。

我使用的防护罩在链接上:http: //hobbycomponents.com/index.php/microduino-enc28j60-ethernet-module-arduino-compatible.html

可通过同一网页找到兼容的库:

https://github.com/jcw/ethercard

我希望这可以为您提供必要的进一步信息。

4

5 回答 5

1

问题似乎是例行公事:

  void udpSerialPrint(word port, byte ip[4], const char *data, word len) {//etc.

被回调,特别是从这段代码中:

void loop()
{
   //this must be called for ethercard functions to work.
   ether.packetLoop(ether.packetReceive());
}

它显示在 PC 文本消息中,因此我们知道它正在被调用。但是这条线:

ether.sendUdp(msg, sizeof msg, portMy, ipDestination, portDestination);

似乎没有工作。

sendUdp 的原型是:

void EtherCard::sendUdp (char *data, byte datalen ,word sport, byte *dip, word dport)

第二个参数定义为一个字节?,但sizeof msg实际代码代码中的 , 语句会生成什么?K&R 说它是实现定义的。

所以,最初作为测试我会尝试:

   ether.sendUdp(msg, 12, portMy, ipDestination, portDestination);

此外,要尝试的另一个更改是修改msg它以使其具有用于 html 页面的正确标题。此消息将发送到本地计算机上的 ip,然后它会尝试在浏览器中显示它?如果是,则扩展 msg 使其符合,并增加消息长度。

于 2013-09-03T03:01:55.140 回答
0

我遇到了同样的问题,输入正确的 IP 后发现我的网关 IP 地址错误,我的代码可以正常工作。如果所有参数都正确,则以下功能可以正常工作,我也使用 java udp 客户端进行了检查

ether.sendUdp(msg, sizeof msg, portMy, ipDestination, portDestination);
于 2015-07-10T12:47:56.747 回答
0

Old question, but for posterity here is an answer with a work-around of sorts:

I confirmed your observation with the Ethercard library as of October 2016. The problem is that, if the destination is on the local subnet, the library must do an ARP lookup of the MAC belonging to the destination IP address -- it doesn't. You can confirm that by running Wireshark and looking at a UDP packet transmitted by the ENC28J60. Expand the "Ethernet II" info and you will see that the destination MAC is 00:00:00:00:00:00.

A possible work around is to transmit to your local subnet's broadcast address. Your local UDP server will then receive the packets regardless of the destination MAC address.

于 2016-10-28T09:55:26.280 回答
0

有同样的问题:/您可以尝试使用 makeUdpReply - 它适用于您的示例:D

ether.makeUdpReply(msg, sizeof msg, portDestination);
于 2017-03-05T15:49:44.827 回答
-1

我有同样的问题,我可以发送但我无法接收。

我认为你上面的代码很好。

ether.sendUdp(msg, sizeof msg, portMy, ipDestination, portDestination);

解决方案是:

  1. 测试它,使用交叉 UTP 电缆梨对梨,在计算机(IP:192、168、0、9)和 Arduino(IP:192、168、0、201)之间
  2. 使其与 arduino IP 网关和计算机 IP 目的地相同
  3. ether.staticSetup(myip, gwip); “更改为” ether.staticSetup(myip, ipDestination);

所以像这样的IP配置

电脑电脑:

IP       : 192, 168, 0, 9  

Gateway  : (none)           

DNS      : (none)           

Port open:8888               

阿杜诺:

IP       : 192,168,0,201

Gateway  : 192, 168, 0, 9              

DNS      : (none)     

Port open:8888               
于 2015-04-30T02:52:51.273 回答