Внимание! Горячие новости и планы проекта Usb2Kbd
    02.11.2024 Протестировал отправку через CoolTerm управляющей команды в Usb2kbd_COM на Mac OS. Все работает.
    28.08.2024 Прекращена поддержка устаревшего продукта Usb2kbd_DLL. Для всех владельцев Usb2kbd_DLL при необходимости рекомендую переходить на более совершенный и гибкий продукт Usb2kbd_LAN/COM.
    12.08.2024 Успешно протестирована с девайсом программа для перенаправления UDP траффика с порта на заданный IP и порт. Возможность пригодится для удаленного управления девайсом Usb2kbd_LAN/COM по сети.

Usb2kbd_LAN/COM


Уважаемые друзья!

Представляю Вашему вниманию замечательную IT разработку - Usb2kbd_LAN/COM.

Usb2kbd_LAN/COM

В основе этого девайса лежит знаменитая платформа Arduino Leonardoа для управления девайсом через LAN предусмотрен сетевой модуль Arduino Ethernet shield W5500, работающий по UDP-протоколу (модуль может отсоединяться).

Принцип работы Usb2kbd_LAN/COM заключается в том, что девайс умеет принимать управляющие команды (пакеты) из LAN-сети (UDP) или же через собственный COM-порт, причём неважно, откуда пришел пакет, главное, чтобы он прошел проверку на подлинность девайсом. Далее, получив такой пакет, Usb2kbd_LAN/COM через USB-протокол нажимает клавишу клавиатуры или управляет мышью согласно пакету. Для успешного управления девайсом достаточно знать, как из Вашей программы, написанной на любом известном Вам языке программирования, составить и отправить простой управляющий пакет девайсу по сети (протокол UDP, локальная сеть или интернет) или через COM-порт (примеры отсылки управляющих пакетов приведены ниже в разделе примеров).

Важно помнить, что управляющий пакет для COM-порта девайса Usb2kbd_LAN/COM по структуре полностью аналогичен управляющему пакету пакету UDP, только в конце пакета обязательно должен быть добавлен специальный символ конца строки ($0A, он же LF).

Итак, для чего нужен девайс Usb2kbd_LAN/COM, какая основная функция, возможности, и какое применение на практике?
- Самая важная и основная функция Usb2kbd_LAN/COM состоит в том, что, благодаря девайсу, можно управлять любым дистанционным компьютером или даже планшетом (на базе Android с поддержкой OTG) в локальной сети (включая самим собой) или через интернет.

Напоминаю, что в девайсе, кроме управления по LAN (UDP), реализована возможность управлять девайсом через COM-порт. Эта функция подойдет для случая, если у Вас нет задачи управлять дистанционным компьютером и Вы захотите управлять девайсом локально через собственный COM-порт устройства. Для активации режима COM-порта в девайсе достаточно перед включением девайса в USB замкнуть перемычкой выводы 12 и GND девайса, затем включить девайс в USB и убедиться, что у Вас в диспетчере устройств Windows появился новый COM-порт девайса (см. фото ниже).

Usb2kbd_LAN/COM

Важно! Такая возможность управления девайсом через COM-порт доступна как для пользователей Win10 и Win11 (установка дополнительных драйверов не требуется), так и для пользователей Win7 (скачать драйвер .inf с инструкцией можно здесьПосле подготовки Вами и правки прилагаемого файла .inf согласно инструкции нажмите "Обновить драйвер" неизвестного устройства в диспетчере устройств Windows и выберите отрадактированный Вами .inf файл). 

Также важно знать, что по умолчанию девайс имеет относительную систему координат мыши. Для перевода устройства в абсолютную систему координат достаточно будет отключить его, затем замкнуть перемычкой ПИН11 и GRD, как показано на фото, затем включить девайс.

Usb2kbd_LAN/COM

При этом, можно одновременно замыкать как PIN11 на GRD, так и PIN12 на GRD, чтоб в девайсе была как одновременно абсолютная система координат, так и возможность управления через COM-порт!

При подключении в USB-порт компьютера, Usb2kbd_LAN/COM автоматически определится системой как стандартная USB-HID клавиатура и мышь (комбо-девайс, 2-в-одном), никаких дополнительных драйверов для клавиатуры и мыши устанавливать не нужно!

Плюсы Usb2kbd_LAN/COM:

- Доступно управление девайсом как через LAN-интерфейс, так и через внутренний COM-порт;

- Через Usb2kbd_LAN/COM можно без труда управлять мышкой и клавиатурой в системах DOS, BIOS, Linux (т.е. вне системы Windows);

- Управление Usb2kbd_LAN/COM через UDP работает быстро, т.к. не требует подтверждения доставки пакета.

- Управление Usb2kbd_LAN/COM через COM-порт работает в 8 раз быстрее, чем Usb2kbd_LAN/COM через UDP-протокол. Это 2 мс на одну команду против 15,6 мс!

- Usb2kbd_LAN/COM выполнен на всемирно известной платформе Arduino, что обеспечивает стабильность работы и помехоустойчивость.

- Мышь в Usb2kbd_LAN/COM может иметь относительную или абсолютную систему координат по Вашему выбору.

- Usb2kbd_LAN/COM в относительной системе координат может смещать курсор мыши за 1 команду на + - 32767 пикселей, в абсолютной - в пределах текущего разрешения экрана.

Минусы Usb2kbd_LAN/COM:

- ТОЛЬКО ДЛЯ ОТНОСИТЕЛЬНОЙ СИСТЕМЫ КООРДИНАТ! Для корректной работы мыши Usb2kbd_LAN/COM в относительной системе координат необходимо будет ОБЯЗАТЕЛЬНО отключать "ускорение мыши" в Windows на управляемом и управляющем компьютерах. Что такое "отключение ускорения Widnows" и зачем его отключать? Дело в том, что по умолчанию такое ускорение включено в Windows и если, например, Вы отправите девайсу Usb2kbd_LAN/COM через управляющий пакет команду "сместить курсор на 100 пикселей по оси X", то девайс, конечно, выполнит команду и отправит в Windows точное смещение на те же 100 пикселей по оси X. Но вот Windows, получив такое смещение, самостоятельно "ускорит" мышь - и курсор мыши сместиться не на 100 пикселей, а на большую величину (например, 159 пикселей).  Так вот чтоб такого не произошло, Вам необходимо будет самостоятельно отключить ускорение мыши в настройках мыши Windows (смотрите рисунок ниже) на обоих компьютерах (управляющем и управляемом посредством Usb2kbd_LAN/COM). Для этого войдите в раздел панели управления "Мышь" и выставите настройки как на картинке ниже (В примере - для Windows 7, для Windows 10 - внешний вид настройки чуть другой, но принцип тот же).

Usb2kbd_LAN/COM

Ниже рассмотрим более детально основную функцию Usb2kbd_LAN/COM - функцию управления по сети.

Как управлять дистанционным компьютером/планшетом в локальной сети:

а) Подключите LAN-разьем девайса Usb2kbd_LAN/COM в локальную сеть при помощи патч-корда (например, в свободный разъем LAN вашего домашнего маршрутизатора или же свитча).

б) Подключите USB-разъем девайса Usb2kbd_LAN/COM через ДАТА-кабель MicroUSB (минимальной длины) в управляемый компьютер или планшет (через OTG-кабель), которым хотите дистанционно управлять.

в) Убедитесь, что девайс Usb2kbd_LAN/COM корректно виден в локальной сети, т.е. пропингуйте его с компьютера, с которого Вы хотите управлять (управляющий компьютер) - по умолчанию IP-адрес девайса - (клавиатура+мышь) - 192.168.0.222, порт - 12345. (IP-адрес и порт девайса могут быть заданы любыми при покупке).

Важно помнить, что Usb2kbd_LAN/COM умеет при включении считывать и задавать себе  IP-адрес с конфигурационного txt-файла с флеш памяти MicroSD. Для этого найдите флеш-карту MicroSD желательно размером 4 Гб или меньше, отформатируйте ее в файловой системе FAT32 (это важно!), затем подготовьте и поместите на карту строго 1 файл ip.txt (скачать образец в RAR-архиве можно здесь), в котором пропишите желаемый IP-адрес. Вставьте MicroSD карту в Usb2kbd_LAN/COM, после чего включите его в USB-разъем комьютера. При загрузке Usb2kbd_LAN/COM считает файл IP.txt с флеш-карты MicroSD и автоматически присвоит себе заданные Вами в файле IP-адрес.

г) Попробуйте в своей программе (скрипте) на управляющем компьютере составить и отправить первый управляющий UDP-пакет девайсу (мыши+клавиатуре) в локальной сети. Можно также использовать штатную программу дистанционного управления и отсылки пакетов в Usb2kbd_LAN/COM (программа высылается при покупке девайса). Программа не только проверит работоспособность девайса, но и поможет Вам научиться правильно составлять управляющие пакеты для отправки в девайс (описание программы читайте в конце этого раздела).

ОЧЕНЬ ВАЖНО!  ВНИМАНИЕ! При ручном управлении мышью с использованием штатного ПО очень важно использовать НЕ ИГРОВУЮ самую обычную мышь! Т.к. игровые мыши посылают намного больше событий в девайс, чем обычные мышки, тем самым могут вызвать зависание устройства!

Структура же самого отправляемого управляющего пакета также будет рассмотрена ниже.

д) Если Вы все сделали правильно, то LAN-модуль девайса получит Ваш управляющий пакет и исполнит его (нажмет клавишу клавиатуры или переместит мышь) на управляемом компьютере/планшете.

Так как UDP пакет не подразумевает контроль доставляемости, в девайсе реализована возможность контроля доставляемости UDP пакета. Так, получив управляющий UDP-пакет, девайс ответит на IP-адрес отправителя и порт 22222 информационным UDP пакетом, который будет содержать полученный им управляющий пакет. Так можно будет контролировать 100% доставляемость UDP управляющих пакетов в девайс.

NEW!  Также в Usb2kbd_LAN реализована возможность выполнения заранее набранных команд с MicroSD карты, вставленной в девайс. Достаточно скопировать файл commands.txt из этого архива (образец, проставьте свои команды и паузы!) в корень MicroSD карты (Fat32) и при включении девайс через небольшую паузу начнет их выполнять в цикле.

Для управления удаленным компьютером/планшетом через сеть интернет - Вам также нужно будет сделать настройку маршрутизатора удаленной сети - осуществить "проброс порта" 12345 из вне на девайс в сети -  IP-адрес девайса Usb2kbd_LAN/COM по умолчанию, как мы уже говорили, 192.168.0.222, порт 12345.

Ниже - пример проброса портов для роутера TPLINK-WR841N:

Usb2kbd_LAN/COM

После осуществления проброса портов Вы сможете управлять клавитурой и мышью дистанционного компьютера (не своим) через Usb2kbd_LAN/COM по UDP-протоколу безо всяких скриптов через вышеупомянутую специальную штатную программу управления и отсылки пакетов в Usb2kbd_LAN (далее штатное ПО, высылается при покупке), вот такую:

Usb2kbd_LAN/COM

и в ней прописываете настройки соединения (вкладка "Настройки"), соединяетесь с удаленным компьютером через любую программу дистанционного управления (рекомендую Parsec) в режиме просмотра (чтоб видеть, чем же Вы там управляете) и жмете "Старт" в программе. Теперь все события клавиатуры и мыши с управляемого компьютера будут отсылаться в девайс по локальной сети на заданный IP адрес и порт, и вот Вы управляете удаленным компьютером как будто Вы возле него! Причем все нажатия клавиатуры и мыши будут настоящими, а не эмулированными!

Есть еще один вариант управления девайсом в случае, если сам девайс и управляемый компьютер располагаются удаленно от управляющего компьютера и напрямую слать пакеты в девайс нет возможности по локальной сети. В таком случае вы запускаете штатное ПО на удаленном компьютере (которым нужно управлять), выбираете в штатном ПО особый режим работы, когда все эмулированные события движения мыши и клавиатуры, полученные  из Parsec, будут дублироваться в девайс и становиться "настоящими". 

Кстати, в Usb2kbd_LAN/COM есть возможность отсылать дублированные нажатия клавиатуры и мыши одновременно сразу на несколько пар IP:PORT. Для этого допишите необходимые параметры в файл settings.ini программы. Вот пример settings.ini с двумя дополнительными парами IP и PORT (т.е. в примере одна пара SendToIPAddress:SendToPort - основная, а SendToIPAddress1:SendToPort1 и SendToIPAddress2:SendToPort2 - дополнительные. Итого - пакеты будет отсылаться одновременно на 3 пары.

Пример файла settings.ini:

[global]
serial=1247
systempass=0
IPAddress=192.168.0.50
SendToIPAddress=192.168.0.223
SendToPort=12345
SendToIPAddress1=192.168.0.224
SendToPort1=12345
SendToIPAddress2=192.168.0.225
SendToPort2=12345

При запуске штатной программы с такими установками во вкладке "Настройки" Вы увидите надпись о том, сколько дополнительных пар IP:PORT было найдено в settings.ini

Кроме того, напомню, что при помощи этой программы Вы также сможете научиться правильно составлять управляющие пакеты для отправки в девайс (вкладка программы Составитель пакетов). Там же можно и сразу отправить составленный пакет в девайс (работает только для пакетов смещения курсора мыши без нажатий кнопок, чтоб не было эффекта "залипания" нажатой клавиши без отжатия).

Управляющий пакет Usb2kbd_LAN/COM

Итак, что такое управляющий пакет Usb2kbd_LAN/COM? Управляющий пакет - это 18-значный цифровой код определенного формата, который Вы отправляете в Usb2kbd_LAN/COM (через LAN-интерфейс или COM-порт), который получается девайсом, проверяется и, если пакет прошел проверку на корректность, выполняется (происходит нажатие клавиши клавиатуры, движение мыши и т.д.). Рассмотрим структуру управляющего пакета для отправки в Usb2kbd_LAN/COM:

Usb2kbd_LAN/COM
Как видно, структура управляющего пакета очень простая и состоит строго из 18 цифровых символов.  Для простоты представления можно представить управляющий пакет в виде формулы:
Packet = ID+b1+b2+b3+b4

где ID  - ID  девайса (написан маркером на девайсе, у каждого девайса уникален);

b1, b2, b3, b4 - параметры управляющего пакета, где мы описываем что мы хотим нажимать, куда смещать мышь и на сколько.

Давайте сначала рассмотрим детальнее параметры b1, b2, b3, b4 управляющего пакета, необходимые для работы Usb2kbd_LAN:

b1 - Управляющий символ (целое число) - определяет действие, которое необходимо выполнить устройством Usb2kbd_Lan. Его возможные значения Вы сможете увидеть в таблице ниже

b2 - Вспомогательный символ, который дополняет символ b1. Может означать:

а) Код клавиши (целое число, значения от 4 до 231) - определяет код нажатой или отжатой клавиши клавиатуры для случаев, когда b1 = 1 или 2 (коды клавиш Вы сможете скачать в разделе сайта "Загрузки");

ИЛИ

б) Код нажатия кнопок мыши (целое число, значения от 0 до 7) - определяет код нажатой или отжатой кнопки мыши для случаев, когда b1 = 4.

... т.д. Подробнее - в таблице параметров управляющего пакета ниже.

Usb2kbd_LAN/COM
Очень важно! Обратите внимание на параметры b3 и b4 - это передаваемые координаты  X и Y. Для относительной системы координат X и Y могут принимать значения смещений курсора мыши в диапазоне от -32767 ... 0 ... +32768, фактически же в управляющий пакет кладуться только положительные значения (см. формулу расчета в структуре управляющего пакета), для абсолютной системы координат - передаваемые значения X и Y в девайс должны рассчитываться по формуле (смотрите пример выше).
Для закрепления знаний об управляющем пакете давайте рассмотрим управляющий пакет вида "120640000010000100" (как раз он изображен в структуре управляющего пакета на картинке выше), где
"1206" - ID девайса (написан маркером на девайсе, у каждого девайса уникален);
"4" - управляющий символ b1 - в данном случае - 4 - "событие мыши" - см. таблицу параметров управляющего пакета выше. Если мышь Usb2kbd_LAN/COM находится в относительной системе координат, то курсор будет  смещаться относительно текущего положения курсора мыши на заданную величину X и Y, если же в абсолютный системе координат - то курсор мыши будет смещаться в заданную координату экрана X и Y.
"000" - вспомогательный символ b2 - в данном случае 0 -  "ни одна из кнопок мыши не нажата", значит будем просто перемещать курсор мыши без нажатий;
"00100" - b3 задано значение 100 по оси X. Для относительной системы координат мыши - это будет смещение по оси X на 100 пикселей, для абсолютной - перемещение в координату X экрана  = 100;
"00100" - b4 задано значение 100 по оси Y. Для относительной системы координат мыши - это будет смещение по оси X на 100 пикселей, для абсолютной - перемещение в координату X экрана  = 100;
Как видно, данный пример пошлет команду девайсу сместить курсор мыши относительного текущего положения курсора мыши на положительные значения X=X+100, Y=Y+100 (пикселей) для относительнй системы координат, либо переместить курсор мыши в координаты экрана X=100 Y=100 для абсолютной системы координат мыши девайса. 
Как рассчитать отрицательные смещения для относительной системы координат? Смотрите ответ на картинке выше в структуре управляющего пакета.
Приведу пример - Вы хотите отправить команду смещения мыши на отрицательные значения X=-100 Y=-50. 
Без труда вычислим параметры b3 и b4, необходимые для относительного смещения курсора мыши (смотрим шпаргалку - структуру управляющего пакета):
b3 = 65536 - 100 = 65436;
b4 = 65536 - 50 = 65486;
Еще раз напомню, потренироваться составлять управляющие пакеты Вы сможете при помощи штатной программы управления и отсылки пакетов в Usb2kbd_LAN/COM (программа высылается Вам при покупке девайса). Я уверен, что Вы разберетесь! :)

Хватит теории, пошла практика:

ВНИМАНИЕ! ВАЖНО! Для стабильной и бесперебойной работы Usb2kbd_LAN/COM по протоколу UDP (LAN) ОБЯЗАТЕЛЬНО используйте минимальные паузы в 1 мс между событиями, иначе возможны потери UDP-пакетов! Для работы через COM-порт паузы между событиями не обязательны.

Отправка UDP управляющего пакета в локальную сеть:

Перед началом написания программы отправки управляющего UDP-пакета в устройство помните, что сначала в Вашей программе Вам нужно будет задать следующие исходные параметры сети:

- IP адрес локального компьютера (откуда будет посылаться UDP-пакеты), в примерах - 192.168.0.50, проставьте свой;

- IP-адрес подключенного устройства Usb2kbd_LAN/COM (по умолчанию один IP - 192.168.0.222 для клавиатуры и для мыши), проставьте свой, если отличен от 192.168.0.222;

- Порт назначения (12345 для клавиатуры и для мыши), проставьте свой, если отличен от 12345;

- вызвать функцию формирования и отправки управляющего UDP-пакета на указанный IP-адрес и порт).

Отправка COM управляющего пакета в COM-порт девайса:

Если же Вы решите вместо UDP отправлять управляющие пакеты через COM-порт в устройство Usb2kbd_LAN/COM, помните, что сначала в Вашей программе Вам нужно будет задать  следующие исходные параметры:

- COM-порт, который отобразится при подключении девайса к USB компьютера с замкнутыми выводами 12 и GRN платы (см. информацию выше в этом разделе);

- вызвать функцию формирования и отправки управляющего COM-пакета на указанный COM-порт. Напомню, управляющий пакет для COM-порта девайса аналогичен пакету UDP, только в конце пакета (18 цифр) обязательно должен быть добавлен специальный символ конца строки ($0A, он же LF).


Для всех примеров ниже за эталон ID девайса будет принято число 1206.

Убедительная просьба - копируйте тексты кодов с сайта в блокнот, чтоб код был более читабельный.


ПРИМЕРЫ ДЛЯ UDP (Usb2kbd_LAN)


Пример на Autohotkey (UDP):

Sleep, 2000

IPAddress:="192.168.0.50" ; локальный ip

SendToIPAddress:="192.168.0.222" ; ip девайса

Port:= "12345" ; порт локальной тачки, откуда пойдут UDP-пакеты в сеть

SendToPort:= "12345" ; порт удаленной тачки, куда пойдет UDP-пакет для девайса

; инициализируем UDP один раз вначале

VarSetCapacity(wsaData, 32)

DllCall("Ws2_32\WSAStartup", "UShort", 2, "UInt", &wsaData)

socket := DllCall("Ws2_32\socket", "Int", 2, "Int", 2, "Int", 17)

VarSetCapacity(sockaddr, 32)

NumPut(2, sockaddr, 0, "Short")

NumPut(DllCall("Ws2_32\htons", "UShort", Port), sockaddr, 2, "UShort")

NumPut(DllCall("Ws2_32\inet_addr", "Str", IPAddress), sockaddr, 4)

DllCall("Ws2_32\WSAAsyncSelect", "UInt", socket, "UInt", WinExist("A"), "UInt", 0x5555, "Int", 1)

OnMessage(0x5555, "WinsockMessage")

SendText := "120640000010000100"

; отправим сформированный UDP-пакет в девайс

VarSetCapacity(sendaddr, 32)

NumPut(2, sendaddr, 0, "Short")

NumPut(DllCall("Ws2_32\htons", "UShort", SendToPort), sendaddr, 2, "UShort")

NumPut(DllCall("Ws2_32\inet_addr", "Str", SendToIPAddress), sendaddr, 4)

DllCall("Ws2_32\sendto", "UInt", socket, "Str", SendText, "Int", StrLen(SendText), "Int", 0 , "UInt", &sendaddr, "Int", 32)


Пример на Autoit (UDP):

Ниже приведу пример формирования и отсылки управляющего UDP-пакета в Usb2kbd_LAN/COM посредством Autoit:

UDPStartup()

$LocalIP = "192.168.0.50"
$LocalPort = "12345"
$RemoteIP = "192.168.0.222"
$RemotePort = "12345"
$sock = UDPBind($LocalIP, $LocalPort)
$sock[2] = $RemoteIP
$sock[3] = $RemotePort
Sleep(3000)
UDPSend($sock, "120610040000000000")
UDPSend($sock, "120680000000000000")
UDPShutdown()

Пример нажимает клавишу А на клавиатуре и затем отжимает ВСЕ клавиши клавиатуры.


Пример на С++ (UDP, спасибо за пример Александру):

void SendInputClass::SendInput(){

SendInputClass::SendUDP("1", "030", "00000", "00000"); // нажатие 1
Sleep(30);
SendInputClass::SendUDP("2", "030", "00000", "00000"); // отжатие 1
}
void SendInputClass::SendUDP(string b1, string b2, string b3, string b4) {
// 1206 - ID
// 192.168.0.222 - IP
// 12345 - Port
CHAR pak[300];
sprintf_s(pak, "1206%s%s%s%s", b1.c_str(), b2.c_str(), b3.c_str(), b4.c_str());
struct sockaddr_in si_other;
int s, slen = sizeof(si_other);
WSADATA wsa;
//Initialise winsock
if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0)
DebugBreak();
//create socket
if ((s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SOCKET_ERROR)
DebugBreak();
//setup address structure
memset((char *)&si_other, 0, sizeof(si_other));
si_other.sin_family = AF_INET;
si_other.sin_port = htons(12345);
si_other.sin_addr.S_un.S_addr = inet_addr("192.168.0.222");
sendto(s, pak, strlen(pak), 0, (struct sockaddr *) &si_other, slen);
closesocket(s);
WSACleanup();
}


Пример на Delphi7 (UDP):

Скачать пример


Пример на Java (UDP, спасибо за код Матвею):

DatagramSocket socket = new DatagramSocket();

 InetAddress inetAddress = InetAddress.getByName("192.168.1.222");
 byte[] msg;
 msg = "120610040000000000".getBytes(); // press button "a"
 DatagramPacket packet = new DatagramPacket(msg, msg.length, inetAddress, 12345);
 socket.send(packet);
 Thread.sleep(1); //delay 1ms
 msg = "120620040000000000".getBytes(); //release button "a"
 packet = new DatagramPacket(msg, msg.length, inetAddress, 12345);
 socket.send(packet);
 socket.close();

 

Еще пример на Java (UDP, спасибо за пример Александру):

import java.net.*;

import java.io.IOException;

public class Main {

    public static void main(String[] args) throws IOException, InterruptedException {

        String deviceId = "3485";       // Device ID

        InetAddress deviceIpAddress = InetAddress.getByName("192.168.0.222");       // Device IP address

        int deviceUdpPort = 12345;      // Device UDP port

        byte[] message;     // Net message

        int delay = 1;      // Delay 1ms

        DatagramSocket socket = new DatagramSocket();

        // Press button "s"

        message = (deviceId + "10220000000000").getBytes();

        DatagramPacket packet = new DatagramPacket(message, message.length, deviceIpAddress, deviceUdpPort);

        socket.send(packet);

        // Delay

        Thread.sleep(delay);

        // Release button "s"

        message = (deviceId + "20220000000000").getBytes();

        packet = new DatagramPacket(message, message.length, deviceIpAddress, deviceUdpPort);

        socket.send(packet);

        // Close connection

        socket.close();

    }

}

 


Пример на C# (UDP, спасибо за код Александру):

using System;
using System.Threading;
using System.Net.Sockets;

class Program
{
        static string server = "192.168.0.222";
        static int port = 12345;
        static string serial = "1206";
       
        static void Main(string[] args)
        {
                Sendkeyb("1", "030", "00000", "00000"); // отошлем клавиатуре нажатие 1
                Sendkeyb("2", "030", "00000", "00000"); // отошлем клавиатуре отжатие 1
        }
       
        static void Sendkeyb(string b1, string b2, string b3, string b4)
        {
                string message = serial + b1 + b2 + b3 + b4;
                UdpClient client = new UdpClient(server, port);
                byte[] data = Encoding.UTF8.GetBytes(message);
                int numberOfSentBytes = client.Send(data, data.Length);
                client.Close();
                Thread.Sleep(1);
        }
}


Пример на Питоне 3.8.10 для LAN (спасибо за пример Александру):

import socket

import time

 

# основная функция - печатает цифры девайсом.

def print_on_device(so, string_to_print, timelap, DEV_ID):

 

    for e_symb in string_to_print:

        if e_symb == "1":

            keycode = "030"

        elif e_symb == "2":

            keycode = "031"

        elif e_symb == "3":

            keycode = "032"

        elif e_symb == "4":

            keycode = "033"

        elif e_symb == "5":

            keycode = "034"

        elif e_symb == "6":

            keycode = "035"

        elif e_symb == "7":

            keycode = "036"

        elif e_symb == "8":

            keycode = "037"

        elif e_symb == "9":

            keycode = "038"

        elif e_symb == "0":

            keycode = "039"

 

        # пакет №1 - нажимаем клавишу

        MESSAGE_1_keydown = DEV_ID + "1" + keycode + "00000" + "00000"

        so.sendto(bytes(MESSAGE_1_keydown, "utf-8"), (UDP_IP, UDP_PORT))

        time.sleep(timelap) # пауза. Рекомендую 0.1 с 

 

        # пакет №1 - отжимаем клавишу

        MESSAGE_2_keyup = DEV_ID + "2" + keycode + "00000" + "00000"

        so.sendto(bytes(MESSAGE_2_keyup, "utf-8"), (UDP_IP, UDP_PORT))

        time.sleep(timelap+0.1) #немного увеличенная пауза для перехода к следующей цифре

 

 

# основные настройки

UDP_IP = "192.168.0.222"

UDP_PORT = 34512

DEVICE_ID = "5388"

 

# инициализируем socket

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)

 

# печатаем первую клавишу (только одну)

print_on_device(sock, "0", 0.1, DEVICE_ID)

time.sleep(3) # ждем 3с

 

# выдаем на девайс набор клавиш

print_on_device(sock, "4258", 0.1, DEVICE_ID)

print('done!')


ПРИМЕРЫ ДЛЯ COM (Usb2kbd_COM)


Пример на Autohotkey (COM-порт):

; инициализируем COM

port := FileOpen("\\.\COM72", "w")  ; Open for writing only, not reading/appending.  Тут проставьте COM-порт своего девайса.

port.Write("120640000000100000")  ; 1 px mouse X move

port.WriteChar(10)  ; Write конец строки ($0A).

port.Close() ; close the Port


Пример на AutoIt (COM-порт):

Скачать пример


Пример на Питоне (COM-порт, Спасибо за пример Александру):

#pip install pyserial - Уставливаем библиотеку

 

import serial # Импортируем библиотеку

 

# Настройка COM-порта (замените на правильный)

com_port = 'COM6'  # Замените на ваш порт

baud_rate = 9600   # Скорость соединения

timeout = 1        # Таймаут соединения

 

port = serial.Serial(com_port, baud_rate, timeout=timeout)

port.write(b"120640000000100000") # Двигаем мышкой как пример.

port.write(b"\n") # Не забываем про конец строки.

port.close()  # Закрываем порт.


Пример на AHK для программной перезагрузки девайса/reset для COM (спасибо за пример Алексею):

autohotkeyCopy code; Открываем последовательный порт

SerialPort := ComObjCreate("MSCommLib.MSComm")

SerialPort.CommPort := 12 ; Измените на номер вашего порта

SerialPort.Settings := "1200,N,8,1"

SerialPort.PortOpen := true

 

; Ждем перед сбросом (при необходимости, измените время)

Sleep, 100

 

; Выполняем сброс, переключая линию DTR (Data Terminal Ready)

DllCall("kernel32.dll\EscapeCommFunction", Ptr, SerialPort.hCom, UInt, 6) ; 6 соответствует CLRDTR

 

; Предоставляем время для того, чтобы Arduino вошла в режим загрузчика

Sleep, 2000

 

; Закрываем последовательный порт

SerialPort.PortOpen := false

 

MsgBox Режим загрузчика активирован.

ExitApp

 

Примечание:

Убедитесь, что номер порта (CommPort) в коде соответствует вашему порту Arduino.При необходимости, вы можете изменить параметры последовательного порта в строке SerialPort.Settings.Код использует библиотеку MSCommLib, которая включена в AHK. В случае её отсутствия, вы можете скачать и зарегистрировать её.Пожалуйста, выполните код с административными правами, чтобы избежать проблем с доступом к порту.


Пример на C++ (COM-порт, Спасибо за пример Александру):

void SendDataToComPort(const std::wstring& port, const std::string& data) {

    HANDLE comHandle = CreateFileW(port.c_str(), GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, 0, nullptr);

    if (comHandle == INVALID_HANDLE_VALUE) {

        std::cout << "Проблемы с COM-портом." << std::endl;

        return;

    }

 

    DWORD bytesWritten = 0;

    WriteFile(comHandle, data.c_str(), static_cast<DWORD>(data.length()), &bytesWritten, nullptr);

    std::cout << "Отправлено байт " << bytesWritten << " в USB2KBD" << std::endl;

 

    CloseHandle(comHandle);

}

 

int main() {

    // Отправляем данные на COM-порт Arduino

    std::wstring comPort = L"\\\\.\\COM3";  // Укажите соответствующий порт

    std::string dataToSend = "120640000050000500\n";  // Данные для отправки

    SendDataToComPort(comPort, dataToSend);

    return 0;

}


ВНИМАНИЕ! Если в примерах Вы не нашли пример на Вашем любимом языке программирования, попробуйте упорно погуглить (пояндексить), как можно отправить UDP-пакет в сеть или как отправить пакет в COM-порт компьютера при помощи Вашего языка программирования. Если Вы самостоятельно найдете решение, то поделитесь своей радостью с другими, написав решение мне в telegram/e-mail, указанный в разделе сайта "КОНТАКТЫ" и Ваш пример обязательно попадет на сайт продукта. Так Вы значительно облегчите жизнь другим и поможете развитию проекта. Спасибо!