tcp socket client

Тема в разделе "Проводная и беспроводная связь", создана пользователем 127486, 13 фев 2018.

  1. 127486

    127486 Нуб

    Доброго времени суток.

    Есть Arduino uno + Ethernet shield на ENC28J60.

    Потребность чтобы вся эта кухня подключалась к серверу как сокет клиент и отправляла данные с A0 (АЦП) на 192.168.0.Х:2000.

    Помогите разобраться.
     
  2. 127486

    127486 Нуб

    В общем решение нашел следующим образом.
    Но столкнулся с проблемой, работает только в сети где есть шлюз и днс.
    А необходимо запустить работу в сети без днс и шлюза.
    Помогите с кодом.


    Код (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 );  
      }
    }
     
     
  3. droideka

    droideka Нерд

    Получилось разобраться?
     
  4. b707

    b707 Гуру

    ИМХО, маршрут надо пробрасывать. Без маршрутов по умолчанию клиент все шлет на адрес шлюза - gwip
     
  5. Для одноранговой сети, адрес шлюза не используется, каждый узел сам себе и клиент и сервер.
    Для отправки данных на 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.
     
  6. b707

    b707 Гуру

    а как у вас узел узнает, что сеть одноранговая? - именно для этого маршрут и нужен, имхо
     
  7. О какой маршрутизации идет речь?
    Устройство (сетевая карта если хотите, в данном случае enc28j60) передаёт кадр raw 802.3, заполняя мак адрес получателя и отправителя, этого достаточно для передачи в пределах локальной сети.
    Устройство у ТС имело адрес 192.168.0.157 и запросы предполагалось отправлять на 192.168.0.Х:2000.
    Поясните для чего в этой схеме нужен шлюз, который обычно используется для перенаправления запросов в другие сети.

    П.С.
    В примере никакой маршрутизации не настраивается, тем не менее на приемной стороне пакеты видны.
     
  8. b707

    b707 Гуру

    Вы забываете, что два узла с адресами 192.168.0.Х вовсе не обязательно лежат в одной сети. Это верно только для конфигурации с netmask = 0.0.0.255
    дальше продолжать?
     
  9. :):) Вы лучше поясните как заставить эти узлы не отвечать на ARP запросы чтоб пример перестал работать. И ещё ткните носом меня в тот netmask который ТС использовал. На примере конкретной библиотеки я предложил работающее решение, предложите своё.