Доброго времени суток. Есть Arduino uno + Ethernet shield на ENC28J60. Потребность чтобы вся эта кухня подключалась к серверу как сокет клиент и отправляла данные с A0 (АЦП) на 192.168.0.Х:2000. Помогите разобраться.
В общем решение нашел следующим образом. Но столкнулся с проблемой, работает только в сети где есть шлюз и днс. А необходимо запустить работу в сети без днс и шлюза. Помогите с кодом. Код (Text): #include <EtherCard.h> static byte mymac[] = { 0xAA,0x2B,0x3C,0x4D,0x5E,0x6F }; static byte myip[] = { 192,168,0,157 }; static byte gwip[] = { 192,168,0,7 }; static byte hisip[] = { 192,168,0,7 }; byte Ethernet::buffer[700]; static uint32_t timer; const char website[] PROGMEM = "192.168.0.127"; //Адрес куда шлем const int dstPort PROGMEM = 12345; //Порт куда шлем const int srcPort PROGMEM = 4321; //Порт устройства void setup () { Serial.begin(9600); if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) Serial.println( "Failed to access Ethernet controller"); ether.staticSetup(myip, gwip, hisip); // 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[] = "127480"; //Текст сообщения void loop () { if (millis() > timer) { timer = millis() + 100; //static void sendUdp (char *data,uint8_t len,uint16_t sport, uint8_t *dip, uint16_t dport); ether.sendUdp(textToSend, sizeof(textToSend), srcPort, ether.hisip, dstPort ); } }
Для одноранговой сети, адрес шлюза не используется, каждый узел сам себе и клиент и сервер. Для отправки данных на ip адрес другого клиента, достаточно по ARP получить мак-адрес этого клиента (что в общем то и делается в packetLoop если предварительно задан ether.hisip). Код (C++): #include <EtherCard.h> static byte my_mac[] = {0x74,0x69,0x69,0x2D,0x30,0x31}; static byte my_ip[] = {192, 168, 1, 200}; static byte server_ip[] = {192, 168, 1, 50}; byte Ethernet::buffer[700]; void setup () { Serial.begin(9600); Serial.println(F("\nStart")); if (ether.begin(sizeof Ethernet::buffer, my_mac) == 0) { Serial.println(F("Failed to access Ethernet controller")); } ether.staticSetup(my_ip); ether.copyIp(ether.hisip, server_ip); } void loop () { ether.packetLoop(ether.packetReceive()); static uint32_t timer = 0; if (millis() > timer) { ether.sendUdp("<14>Hello from arduino.", 23, 4321, server_ip, 514); timer = millis() + 5000; } } Подключил езернет кабель от enc28j60 к ПК, на ПК задал статический ip 192.168.1.50 и смотрю пакеты tcpdump-ом Код (C++): sudo tcpdump -v -i enp3s0 ether host 74:69:69:2d:30:31 tcpdump: listening on enp3s0, link-type EN10MB (Ethernet), capture size 262144 bytes 22:50:04.858592 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 51) 192.168.1.200.4321 > gb-i3-2.syslog: SYSLOG, length: 23 Facility user (1), Severity info (6) Msg: Hello from arduino. 22:50:09.858814 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 51) 192.168.1.200.4321 > gb-i3-2.syslog: SYSLOG, length: 23 Facility user (1), Severity info (6) Msg: Hello from arduino.
О какой маршрутизации идет речь? Устройство (сетевая карта если хотите, в данном случае enc28j60) передаёт кадр raw 802.3, заполняя мак адрес получателя и отправителя, этого достаточно для передачи в пределах локальной сети. Устройство у ТС имело адрес 192.168.0.157 и запросы предполагалось отправлять на 192.168.0.Х:2000. Поясните для чего в этой схеме нужен шлюз, который обычно используется для перенаправления запросов в другие сети. П.С. В примере никакой маршрутизации не настраивается, тем не менее на приемной стороне пакеты видны.
Вы забываете, что два узла с адресами 192.168.0.Х вовсе не обязательно лежат в одной сети. Это верно только для конфигурации с netmask = 0.0.0.255 дальше продолжать?
Вы лучше поясните как заставить эти узлы не отвечать на ARP запросы чтоб пример перестал работать. И ещё ткните носом меня в тот netmask который ТС использовал. На примере конкретной библиотеки я предложил работающее решение, предложите своё.