Управление I SPY TANK через компьютер

в 16:21, , рубрики: .net, Программирование, робот-игрушка, робототехника, роботы, метки: , ,

Попалась мне в руки такая игрушка
image

Поиграв им немного с телефона, решил сделать управление с компьютера.

Реинжиниринг

Вооружившись ноутбуком с WiFi, подключился с помощью него к танку. Оказалось что у него IP 10.10.1.1. Первым делом решил обратится к нему по http через браузер на адрес 10.10.1.1:80, но не тут то было, web-сервер на танке поднят, но закрыт паролем, что меня немного расстроило. Дальше подключаюсь по FTP — он тоже поднят и работает, доступ открытый, но только в режиме чтения. Опять разочарование.
Следующим шагом было сканирование портов. Среди списка открытых портов, два из них (8150 и 8196) мне показались наиболее подозрительными.
Проверил их в браузере. Порт 8150 мне ничего не ответил, а вот по 8196 порту передавался поток MJPG.

Дальше оказалось сложнее — определить команды управления.
Для этого я набросал простенькую программку, которая слушает 8150 порт, установил IP ноутбука 10.10.1.1 и перевел его WiFi в режим точки доступа. Подключившись к нему с телефона, попробовал запустить программу управления танком. Как я и ожидал, она подключилась к порту, который я прослушивал, но тут же вылетела, оказалось она немогла подключится к порту передачи видео. Дописав в своей программе имитацию передачи видео, программа все-таки запустилась. Проанализировав полученные от программы управления данные выявил команды управления, которых оказалось не так много.
Все команды состоят из двух байт.
Первый байт отвечает отвечает за выбор устройства, которому адресована команда:

  • 49 (0x31) — левая гусеница
  • 50 (0x32) — правая гусеница
  • 51 (0x33) — башня (подъем/опускание камеры)

Второй байт — направление движения:

  • 48 (0x30) — стоп (остановить движение)
  • 49 (0x31) — вперед/вверх(для камеры)
  • 50 (0x32) — назад/вниз

Комбинируя эти команды, можно легко управлять танком, например, чтоб поехать вперед нужно послать 4 байта 0x31 0x31 0x32 0x31.
Выполнение команды, если не послана другая команда, автоматически завершается где-то через 1с.

Подключение

Постоянно подключатся напрямую к танку, мне не хотелось и я решил использовать давно валявшийся без дела роутер TP-LINK MR3020.
Залив в него прошивку OpenWrt я настроил его как клиент для подключения к роутеру танка. Далее настроил переброс портов 8150 и 8196 с локального интерфейса на WiFi и подключил его к домашнему роутеру. Теперь можно было подключатся к танку из локальной сети.

Управление

Ниже привожу простенький код на C#, который управляет танком.

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//Подключаемся к роутеру с переадресацией портов
socket.Connect(IPAddress.Parse("192.168.10.15"), 8150);
//Одним пакетом отправляется сназу 3 команды левой/правой гусенице и камере
//Отправляем комманду на движение вперед
socket.Send( new byte[] { 49, 49, 50, 49, 51, 48 });
//Ждем 1 секунду
Thread.Sleep(1000);
//назад
socket.Send( new byte[] { 49, 50, 50, 50, 51, 48 });
Thread.Sleep(1000);
//влево
socket.Send( new byte[] { 49, 50, 50, 49, 51, 48 });
Thread.Sleep(1000);
//вправо
socket.Send( new byte[]  { 49, 49, 50, 50, 51, 48 });
Thread.Sleep(1000);
//поднять камеру
socket.Send( new byte[] { 49, 48, 50, 48, 51, 49 });
Thread.Sleep(1000);
//остановка
socket.Send( new byte[] {49, 48, 50, 48, 51, 48});
socket.Disconnect();

Надеюсь кому-то пригодится.

Автор: vassav

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js