我正在使用新的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 他们似乎被左箭头&amp;在c ++中使用的右箭头符号。
我记下关于以太类的说明。我使用了名为“udpListener”的Ethercard文件夹中的一个例子,并对未被声明的类感到困惑。我假设是在ethercard.h中完成的。
程序正常工作并使用udpSerialPrint方法监听并显示正确接收的udp数据包,因此Listening端正常工作。我想向udp数据包的发送者回复一些内容,而udpSend不起作用。
我使用的盾牌如链接:http://hobbycomponents.com/index.php/microduino-enc28j60-ethernet-module-arduino-compatible.html
兼容的库可以通过同一个网页找到:
https://github.com/jcw/ethercard
我希望这可以在必要时为您提供更多信息。
答案 0 :(得分: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&amp; R表示它是实施定义的。
所以,最初作为测试我会尝试:
ether.sendUdp(msg, 12, portMy, ipDestination, portDestination);
另外,尝试的另一个更改是修改msg
,以便它具有用于html页面的正确标头。此消息将转到本地计算机上的IP,然后尝试在浏览器中显示它?如果是这样,那么扩展msg以使其符合,并增加消息长度。
答案 1 :(得分:0)
我遇到了同样的问题,在输入正确的IP后发现我的网关IP地址错误我的代码工作正常。 如果所有参数都正确,下面的函数工作正常,我也使用java udp client
进行检查ether.sendUdp(msg, sizeof msg, portMy, ipDestination, portDestination);
答案 2 :(得分:0)
老问题,但对于后代来说,这是一个解决方法,可以解决各种问题:
我在2016年10月确认了您对Ethercard库的观察。问题是,如果目标位于本地子网上,则库必须对属于目标IP地址的MAC进行ARP查找 - 它不会“T。您可以通过运行Wireshark并查看ENC28J60传输的UDP数据包来确认。展开“Ethernet II”信息,您将看到目标MAC为00:00:00:00:00:00。
可能的解决方法是传输到本地子网的广播地址。无论目标MAC地址如何,您的本地UDP服务器都将接收数据包。
答案 3 :(得分:0)
有同样的问题:/你可以尝试使用makeUdpReply - 它适用于你的样本:D
ether.makeUdpReply(msg, sizeof msg, portDestination);
答案 4 :(得分:-1)
我有同样的问题,我可以发送但我无法接收。
我认为上面的代码很好。
ether.sendUdp(msg, sizeof msg, portMy, ipDestination, portDestination);
解决方案是:
所以像这样的IP配置
电脑PC:
IP : 192, 168, 0, 9
Gateway : (none)
DNS : (none)
Port open:8888
<强> Arduino的:强>
IP : 192,168,0,201
Gateway : 192, 168, 0, 9
DNS : (none)
Port open:8888