roboforum.ru

Технический форум по робототехнике.

Робот на базе роутера D Link DIR-320

Робот на базе роутера D Link DIR-320

esprit » 14 фев 2011, 07:33

==================================================================================================================
Вставка от =DeaD=

ВНИМАНИЕ!!! На рынке сейчас часто вместо DIR-320 продаётся DIR-320NRU - это совершенно другой по железу роутер и всё что тут описано к нему не имеет отношения. Будьте бдительны!

На текущий момент задача проброски видео и уарта на роутере D-Link DIR-320 решена полностью, при этом в рамках флеш-памяти роутера, т.е. для работы подключение каких-то флешек или usb-хабов не требуется.

Порядок модификации роутера для этой задачи подробно описан в вики на странице [[DIR-320]].

Кроме того от пользователя d3xr есть описание установки прошивки OpenWrt на DIR-320, оно находится на странице [[OpenWrt]]
==================================================================================================================


Вдохновленный темой http://roboforum.ru/forum40/topic5222.html, задумался над созданием робота на базе этого роутера. Первоначальный функционал - управляемый с компьютера робот по каналу Wi-Fi. Робот прошит (так скажем, не без усилий) прошивкой от http://vampik.ru/. На нем завелась Linux-подобная операционка, можно подключиться Телнетом. Задача первая научиться рулить роботом посредством операционной системы. На борту есть USB порт, говорят есть UART. Вот его лицо
face.jpg
, а это спина
back.jpg
.

Re: Робот на базе роутера D Link DIR-320

=DeaD= » 04 мар 2011, 15:01

Конечно, столько сил положено, а на выходе чудище, разве это приятно? :)

Re: Робот на базе роутера D Link DIR-320

dccharacter » 04 мар 2011, 15:12

=DeaD= писал(а):Конечно, столько сил положено, а на выходе чудище, разве это приятно? :)


Один езернет-порт заюзать. Паять правда придется.
А, стой. Нам же три проводника нужно. Значит ставим аудио-джек слева в углу (ну как кнопка ресета справа), маста там тютелька в тютельку.

Re: Робот на базе роутера D Link DIR-320

=DeaD= » 04 мар 2011, 15:17

да, пока рабочий вариант вместо RESET поставить аудиоджек (рядом не получится, там с одной стороны корпус уже загибается, а с другой - стойка крепления идёт.

Re: Робот на базе роутера D Link DIR-320

dccharacter » 04 мар 2011, 15:22

Вооон туда
Вложения
face.jpg

Re: Робот на базе роутера D Link DIR-320

dccharacter » 04 мар 2011, 22:35

Код: Выделить всёРазвернуть
[admin@WL-001731DF8479 root]$ gcc -nodefaultlibs -Wl,--dynamic-linker,/lib/ld-uC
libc.so.0 -lc /opt/usr/local/suart.c -o suart
[admin@WL-001731DF8479 root]$ ./suart
Connect accepted
Some data available.
Socket=>: ЪШЪШ ЪШЪШ'ЪЩЪШЪЩ
No data in 10 seconds.
Some data available.
Socket=>: lon

Some data available.
Socket=>: lof

No data in 10 seconds.
No data in 10 seconds.


Ха ха ха ха!!!!!!!! Волшебникиииииииииии :-) Спасибо :-)))

Re: Робот на базе роутера D Link DIR-320

=DeaD= » 04 мар 2011, 22:38

Это поди еще с флешки, закидывай во флеш роутера, когда ничего лишнего не торчит - это вообще песня! :wink:

Re: Робот на базе роутера D Link DIR-320

dccharacter » 04 мар 2011, 23:04

Слуш, ты какой-то вирус написал:

Код: Выделить всёРазвернуть
[1]+  Done(255)                  ./suart
[admin@WL-001731DF8479 root]$ ps |grep suart
  132 admin     1484 S    grep suart
[admin@WL-001731DF8479 root]$ kill 132
sh: can't kill pid 132: No such process
[admin@WL-001731DF8479 root]$ kill 132
sh: can't kill pid 132: No such process
[admin@WL-001731DF8479 root]$ ps |grep suart
[admin@WL-001731DF8479 root]$ ps |grep suart
[admin@WL-001731DF8479 root]$ ps |grep suart
  138 admin     1484 S    grep suart
[admin@WL-001731DF8479 root]$ ps |grep suart
[admin@WL-001731DF8479 root]$ ps |grep suart
[admin@WL-001731DF8479 root]$ ps |grep suart
  144 admin     1484 S    grep suart
[admin@WL-001731DF8479 root]$ ps |grep suart
[admin@WL-001731DF8479 root]$
[admin@WL-001731DF8479 root]$
[admin@WL-001731DF8479 root]$ ps |grep suart
[admin@WL-001731DF8479 root]$ ps |grep suart
[admin@WL-001731DF8479 root]$ ps |grep suart
  152 admin     1484 S    grep suart
[admin@WL-001731DF8479 root]$ ps |grep suart
[admin@WL-001731DF8479 root]$

Re: Робот на базе роутера D Link DIR-320

=DeaD= » 04 мар 2011, 23:08

Это не я :) может ты его как-то в авторестарт запихнул куда-то? Или в старт каждые 5 секунд? :)

Re: Робот на базе роутера D Link DIR-320

dccharacter » 04 мар 2011, 23:11

Не, ты не понял. Это после выхода из него по ctrl+c. Он становится призраком. Который зажал порт. При этом в процессах его нет. Он там изредка появляется под разными пидами. Т.е. снять его через kill тоже нельзя :-)))

Re: Робот на базе роутера D Link DIR-320

=DeaD= » 04 мар 2011, 23:18

Странно, у меня вообще вроде тоже бывает что он после вырубания через Ctrl+C порт не сразу отдаёт, но вот за призраками я не гонялся еще :)

Re: Робот на базе роутера D Link DIR-320

Michael_K » 04 мар 2011, 23:25

Да. Это проблема. Я тоже когда-то писал сервер под NAS.
Так и не удалось решить проблему с зомби-процессом. Правда глубоко не копал - забил.
(Проще было ресет нажать, чем разбираться).

Re: Робот на базе роутера D Link DIR-320

boez » 05 мар 2011, 01:25

Нее, dccharacter, это ты не то ловишь, ты глянь внимательно на команду! там же grep suart, а не просто suart. Это нормальное явление - grep иногда успевает себя поймать (ps начал выводить список процессов в stdout, grep запустился и его начал сканить, ps его увидел), а иногда нет (ps успел получить весь список процессов до того, как шелл запустил grep). И никакого шаманства. И пиды естественно разные.

Re: Робот на базе роутера D Link DIR-320

dccharacter » 05 мар 2011, 01:42

boez писал(а):Нее, dccharacter, это ты не то ловишь, ты глянь внимательно на команду! там же grep suart, а не просто suart. Это нормальное явление - grep иногда успевает себя поймать (ps начал выводить список процессов в stdout, grep запустился и его начал сканить, ps его увидел), а иногда нет (ps успел получить весь список процессов до того, как шелл запустил grep). И никакого шаманства. И пиды естественно разные.

Хм, точно
А кто ж на порту сидит?

Re: Робот на базе роутера D Link DIR-320

=DeaD= » 05 мар 2011, 01:45

Вроде добавил ключи и еще интегрировал небольшую help страничку в утилиту:

suart.c code:
Код: Выделить всёРазвернуть
/*
*  SUART -- Socket to UART tunnel utility
*
*  Copyright (c) 2011 Volkov Andrey (espirit), Botov Anton (=DeaD=)
*
*  Permission is hereby granted, free of charge, to any person obtaining a copy
*  of this software and associated documentation files (the "Software"), to deal
*  in the Software without restriction, including without limitation the rights
*  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
*  copies of the Software, and to permit persons to whom the Software is
*  furnished to do so, subject to the following conditions:
*
*  The above copyright notice and this permission notice shall be included in
*  all copies or substantial portions of the Software.
*
*  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
*  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
*  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
*  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
*  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
*  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
*  THE SOFTWARE.
*****************************************************************************/


#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h> /* UNIX standard function definitions */
#include <fcntl.h> /* File control definitions */
#include <errno.h> /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */

int main(int argc, char *argv[])
{
    int debug=0;     //<Print debug info> flag
    int show_help=0; //<Show help page and exit> flag

    int port_num=3000; //Socket address
    speed_t baudrate=B115200; //Baudrate for serial port
    char* ttyPort="/dev/ttyS0\0";

    int arg=1;
    while(arg<argc){
      if(argv[arg][0]!='-'){ printf("error 0 in key %d - bad first symbol in '%s' key\n\n",arg,argv[arg]); show_help=1; };
      if(argv[arg][1]=='?')show_help=1;
      if(argv[arg][1]=='p' || argv[arg][1]=='b'){
        if(argv[arg][2]=='\0'){
          printf("error 1 in -p|b keys\n\n");
          show_help=1;
        }else{
          int val=atoi(argv[arg]+2);
          if(val==0){
            printf("error 2 in -p|b keys\n\n");
            show_help=1;
          }else{
            if(argv[arg][1]=='p'){
              port_num=val;
            }else{
              if(val==9600){ baudrate=B9600; }
              else if(val==19200){ baudrate=B19200; }
              else if(val==38400){ baudrate=B38400; }
              else if(val==57600){ baudrate=B57600; }
              else if(val==115200){ baudrate=B115200; }
              else{ printf("error 3 in -b key\n\n"); show_help=1; };
            };
          };
        }
      };
      if(argv[arg][1]=='s'){
        if(argv[arg][2]=='\0'){ printf("error 4 in -s key\n\n"); show_help=1; };
        ttyPort=(char *)(argv[arg]+2);
      };
      if(argv[arg][1]=='d')debug=1;
      arg++;
    };

    if(show_help==1){
      printf("Suart is tool that allow you to tunnel a local serial connection over a network\n");
      printf("\n");
      printf("Usage: suart [-s<serial_port>] [-p<socket_addr>] [-b<baudrate>] [-d] [-?]\n");
      printf("\n");
      printf("   -s<serial_port> Set serial port, default is /dev/ttyS0\n");
      printf("   -p<socket_addr> Set socket address, default is 3000\n");
      printf("   -b<baudrate> Set serial port baudrate (9600/19200/38400/57600/115200), default is 115200\n");
      printf("   -d Show debug info - transferred data\n");
      printf("   -? Show this help page\n");
      printf("\n");
      printf("Example: suart -s/dev/ttyS1 -p3005 -b9600 -d\n");
      return 0;
    };

    int sock_fd, listener;
    struct sockaddr_in addr;
    char buf[100];
    int bytes_read;

    listener = socket(AF_INET, SOCK_STREAM, 0);
    if(listener < 0)
    {
      perror("Can't create  socket");
      return -1;
    }
   
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port_num);
    addr.sin_addr.s_addr = htonl(INADDR_ANY);
    if(bind(listener, (struct sockaddr *)&addr, sizeof(addr)) < 0)
    {
     perror("Can't bind port");
     close(sock_fd);
     return -1;
    }

    listen(listener, 1);
   
//    printf("Listening port   :%s\n",prt);


int tty_fd; /* File descriptor for the port */
int n;
struct termios options;

tty_fd = open(ttyPort, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (tty_fd == -1) perror("open_port: Unable to open serial port");
else
{
fcntl(tty_fd, F_SETFL, 0);

tcgetattr(tty_fd, &options);
cfmakeraw(&options);

/************************************************************************/
// c_cflag
options.c_cflag |= CS8;
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag |= CREAD; // Enable Receiver
options.c_cflag |= CLOCAL; // Ignore modem control lines.

cfsetispeed(&options, baudrate);
cfsetospeed(&options, baudrate);

tcsetattr(tty_fd, TCSAFLUSH, &options);
tcflush(tty_fd, TCIOFLUSH); /**/
}


    while(1)
    {
        sock_fd = accept(listener, NULL, NULL);
        if(sock_fd < 0)
        {
         perror("Can't bind port");
         close(sock_fd);
         return -1;
        }
        printf("Connect accepted\n");
        while(1)
        {

          fd_set rfds;
          struct timeval tv;
          int retval;
          int nfds=tty_fd+1;
          if(sock_fd>tty_fd) nfds=sock_fd+1;

          FD_ZERO(&rfds);
          FD_SET(tty_fd, &rfds);
          FD_SET(sock_fd, &rfds);

          tv.tv_sec = 10;
          tv.tv_usec = 0;
          retval = select(nfds, &rfds, NULL, NULL, &tv);

          if (retval)
          {
            if(debug)printf("Some data available.\n");
            if (FD_ISSET(tty_fd, &rfds))
            {
              bytes_read = read(tty_fd, buf, 50);
              send(sock_fd, buf, bytes_read, 0);
              buf[bytes_read]=0;
              if(debug)printf("=>Socket: %s\n",buf);
              if(!debug)printf("=>Socket: %d bytes\n",bytes_read);
            };
            if (FD_ISSET(sock_fd, &rfds))
            {
              bytes_read = recv(sock_fd, buf, 50, 0);
              if(bytes_read <= 0) break;
              write(tty_fd, buf, bytes_read);
              buf[bytes_read]=0;
              if(debug)printf("Socket=>: %s\n",buf);
              if(!debug)printf("Socket=>: %d bytes\n",bytes_read);
            };
          }
          else
            printf("No data in 10 seconds.\n");

        }
   
        close(sock_fd);
    }
   
    return 0;
}


Добавлено спустя 1 минуту 49 секунд:
boez, можешь собрать, плиз, версию для /lib ? :oops:

А если еще и немного протестируешь - вообще буду очень благодарен! :roll:

Re: Робот на базе роутера D Link DIR-320

dccharacter » 05 мар 2011, 01:51

Код: Выделить всёРазвернуть
[admin@WL-001731DF8479 root]$ gcc -nodefaultlibs -Wl,--dynamic-linker,/lib/ld-uC
libc.so.0 -lc /opt/usr/local/suart.c -o suart
[admin@WL-001731DF8479 root]$ ./suart
open_port: Unable to open serial port: No such file or directory

[admin@WL-001731DF8479 root]$ ./suart -p3000 -s/dev/tts/1 -b115200
Connect accepted
Socket=>: 21 bytes
=>Socket: 23 bytes
Socket=>: 15 bytes
=>Socket: 17 bytes
Socket=>: 3 bytes
=>Socket: 5 bytes
Socket=>: 3 bytes
=>Socket: 5 bytes
Socket=>: 1 bytes
=>Socket: 3 bytes
No data in 10 seconds.
No data in 10 seconds.
Socket=>: 3 bytes
=>Socket: 21 bytes
No data in 10 seconds.


Rambler\'s Top100 Mail.ru counter