Hej
Napisałem prosty serwer w Javie i chcę odbierać nim pakiety UDP nadesłane z Arduino. Korzystam z biblioteki do karty sieciowej ENC26J60: https://www.aelius.com/njh/ethercard/
Z jakiegoś powodu pakiety nie docierają na serwer... Firewall Windowsa dla testów wyłączyłem całkowicie. Klient na PC i serwer na Arduino - taka konfiguracja działa, natomiast w drugą stronę nie...
Testowałem również dla serwera napisanego w C++ i z takim samym miernym rezultatem. Serwer uruchamiałem zarówno na PC i RaspberryPi. Komputer z Raspberry jest w stanie się porozumieć zarówno jaki klient jak i serwer. Wygląda na to jakby coś blokowało pakiety nadesłane z Arduino do serwera.
Klient na Arduino:
#include <EtherCard.h>
static byte mymac[] = { 0x1A,0x2B,0x3C,0x4D,0x5E,0x6F };
byte Ethernet::buffer[700];
static uint32_t timer;
const char website[] PROGMEM = "komp"; //DNS skonfigurowany w routerze
const int dstPort PROGMEM = 5400;
const int srcPort PROGMEM = 4321;
void setup () {
Serial.begin(9600);
// Change 'SS' to your Slave Select pin, if you arn't using the default pin
if (ether.begin(sizeof Ethernet::buffer, mymac, SS) == 0)
Serial.println( "Failed to access Ethernet controller");
if (!ether.dhcpSetup())
Serial.println("DHCP failed");
ether.printIp("IP: ", ether.myip);
ether.printIp("GW: ", ether.gwip);
ether.printIp("DNS: ", ether.dnsip);
if (!ether.dnsLookup(website))
Serial.println("DNS failed");
ether.printIp("SRV: ", ether.hisip);
}
char textToSend[] = "test";
void loop () {
ether.sendUdp(textToSend, sizeof(textToSend), srcPort, ether.hisip, dstPort );
delay(1000);
}
Serwer Java
class EchoServer extends Thread {
private DatagramSocket socket;
private boolean running;
private byte[] buf = new byte[256];
int src_port = 5400;
public EchoServer() throws Exception {
socket = new DatagramSocket(src_port,InetAddress.getByName("192.168.1.103"));
InetAddress address = InetAddress.getByName("192.168.1.99"); //adres IP ATmega328p
boolean ping = address.isReachable(5000);
System.out.println("ping success? " + ping);
}
public void run() {
try {
running = true;
System.out.println("start...");
while (running) {
System.out.println("waiting for packet...");
DatagramPacket packet
= new DatagramPacket(buf, buf.length);
socket.receive(packet);
System.err.println("Packet info...");
System.err.println("address:" + packet.getAddress());
System.err.println("port:" + packet.getPort());
System.err.println("socket address:" + packet.getSocketAddress());
String received
= new String(packet.getData(), 0, packet.getLength());
System.out.println(received);
}
socket.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
public class Main {
public static void main(String[] args) throws Exception {
new EchoServer().start();
while(true) { }
}
}
Serwer C++
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <string>
#include <WS2tcpip.h>
#pragma comment (lib,"ws2_32.lib")
using namespace std;
int main() {
WSADATA data;
WORD version = MAKEWORD(2, 2);
int wsOK = WSAStartup(version, &data);
if (wsOK != 0) {
cerr << "Cant start WinSock\n";
exit(EXIT_FAILURE);
}
else {
cout << "Successfull start WinSock\n";
}
SOCKET in = socket(AF_INET, SOCK_DGRAM, 0);
ULONG server_addres = 0x728A86CF; //192.168.1.103
sockaddr_in serverHint;
//serverHint.sin_addr.S_un.S_addr = ADDR_ANY;
//serverHint.sin_addr.S_un.S_addr = server_addres;
inet_pton(AF_INET, "192.168.1.103", &serverHint.sin_addr.S_un.S_addr);
serverHint.sin_family = AF_INET;
serverHint.sin_port = htons(5400); //convert from little to big endian
cout << "serverHint:" << serverHint.sin_addr.S_un.S_addr << endl;
if (bind(in, (sockaddr*)& serverHint, sizeof(serverHint)) == SOCKET_ERROR) {
cerr << "cant bind socket: " << WSAGetLastError() << endl;
exit(EXIT_FAILURE);
}
else {
cout << "Successfull bind socket\n";
}
sockaddr_in client;
ZeroMemory(&client, sizeof(client));
int clientLength = sizeof(client);
char buf[1024];
while (true) {
ZeroMemory(buf, 1024);
int bytesIn = recvfrom(in, buf, 1024, 0, (sockaddr*)&client, &clientLength);
if (bytesIn == SOCKET_ERROR) {
cerr << "Error receiving form client:" << WSAGetLastError() << endl;
continue;
}
char clientIp[256];
ZeroMemory(clientIp, sizeof(clientIp));
inet_ntop(AF_INET, &client.sin_addr, clientIp, 256);
cout << "Message recv from " << clientIp << " : " << buf << endl;
}
closesocket(in);
WSACleanup();
}
Zamieszczam dodatkowo screeny z WireShark gdy Arduino pracuje jako serwer a dane nadeslane sa z klienta Java na PC. Może pozwoli to jakoś wydedukować problem...