LINUX.ORG.RU

Отваливается usb-wifi-хаб

 , ,


0

1

Программа под wine. Проброшен /dev/ttyACM0 как com55. Программа его видит (становится зелёным), а потом снова серым. И туда-сюда. При этом даже успевает увидеть модуль, который связан с хабом по wi-fi. Написано на питонятине. Она толи скомпилирована, потому что пишет как бывает с программами на C++, типа ошибка в модуле C:/users/developer-vasya/project1/123.cpp Только на файл .py Реально такого нет. Искал и в архивах. Вот вроде такое там: - Electron (nodejs + chromium) as a GUI talking to Python 3 as a backend via zerorpc

[FableAPI.dongle : INFO] Ping, throw away=b'#\x06\x04\x81\x01\x00`\x0e'
[FableAPI.dongle : INFO] ...success
[FableAPI.dongle : ERROR] Serial connection exception
Traceback (most recent call last):
  File "FableAPI\dongle.py", line 688, in readPacket
  File "site-packages\serial\serialwin32.py", line 293, in read
serial.serialutil.SerialException: GetOverlappedResult failed (OSError(22, '�������.
', None, 1460))
[FableAPI.runtime : DEBUG] 38.6 sec      27.83024 ms     35.93214 Hz     31.0007 %
[FableAPI.dongle : ERROR] Serial connection exception
Traceback (most recent call last):
  File "FableAPI\dongle.py", line 300, in getState
AttributeError: 'NoneType' object has no attribute 'in_waiting'

Интересно, что если бы было

serial object has no attribute ‘in_waiting’

То это было бы расхождение версий библиотек:

Per the documentation of pyserial v3.0, in_waiting «changed to property from inWaiting()». This leads me to believe that your pyserial library is too old for the odb library (ie. odb is using the pyserial library in a way that your version can’t handle; it doesn’t have the in_waiting property that odb is looking for, instead it has the older inWaiting() method instead). А тут типа нету объекта, как будто его оторвали. Втыкал в разные порты usb, не изменилось. wireshark показывает, что всё стабильно, обмен идёт. Вот только анализировать пакеты usb я не сильно умею. Сетевые ещё ладно. Лог pcap тут:

https://mega.nz/file/CHh3yYZS#YOl-7JPnnfGO_Ib1MqlV-lupXDsjmCF8xAtHR6BDNnc



Последнее исправление: c0unt0 (всего исправлений: 1)
Ответ на: комментарий от NDfan

Спасибо, почитаю. На виртуалке с виндой на том же ПК работает стабильно. Дрова те же (в вайн запиханы экспорт-импортом ключей реестра, т.к. он не поддерживает установку дров). Без них не видел вообще. Там простейшие cdc atmel. характерные

«id из dmesg при подключении устройства»

  • никто не знает кроме производителя данной робототехники. Возможно они левые (VID_03EB&PID_FABE).
; Windows 2000, XP, Vista, 7 and 8 (x32 and x64) setup file for Atmel CDC Devices
; Copyright (c) 2000-2013 ATMEL, Inc.

[Version] 
Signature   = "$Windows NT$" 
Class       = Ports 
ClassGuid   = {4D36E978-E325-11CE-BFC1-08002BE10318} 

Provider    = %Manufacturer% 
LayoutFile  = layout.inf 
CatalogFile = fable_driver_cdc.cat
DriverVer   = 03/14/2016,1.0.0.0 
c0unt0
() автор топика
Ответ на: комментарий от c0unt0

Дополнение. Ошибка 22 у питонистов означает кривой аргумент:

[errno22] invalid argument. OSError is an error class for the OS module. It is a built-in exception in python, which is raised. It is raised when the error occurs due to some system failure. I/O failures also give rise to OSErrors.

When the disk is full, or the file cannot be found, OSError is raised. The subclasses of OSError are BlockingIOError, ChildProcessError, ConnectionError, FileExistsError, FileNotFoundError, etc. OSError itself is derived from the EnvironmentError.

И он действительно кривой! Там крякозябры. Но откуда они берутся, помог бы понять исходник. Может декомпильнуть его как-то можно, или IDA Pro прицепиться. Только как она будет под wine работать =/

c0unt0
() автор топика
Ответ на: комментарий от c0unt0

Ясно! Ну дело, конечно, хозяйское, но я не вижу серьёзной причины свисток через Wine прокидывать.

У меня тоже был 1 (как минимум) ноунейм с Али, и вопрос решился загрузкой драйвера для используемого чипа (а их не так много). А дальше имелось уже wifi-устройство, которым можно манипулировать теми же системными утилитами.

Собственно, что изначально предлагал:

1) Запускаем линукс (без всяких wine);

2) Открывает терминал с командой dmesg --follow (или подобной);

3) Подсоединяем донгл. Смотрим вывод в терминале. Там должны промелькнуть интересные коды.

Заодно не помешает посматривать на "rfkill list" и "nmcli device wifi" или что есть похожего.

NDfan
()
Ответ на: комментарий от NDfan

Драйвера я в вайн поставил экспортом-импортом ключей реестра и 1го файла. После этого программа хаб увидела. Но это в начале темы было ) Причина есть - ПО только под винду. Я про него мог бы сказать много матов, разрабы воровали отовсюду, даже у гугля основная часть, которую видит пользователь. Что у них сделано своего - загадка, скорее всего только дизайн устройства, которое подключается к этому wi-fi-usb-serial hub-u. И то небось фрилансера наняли подешевле. Обновлений за всю историю жизни продукта было целых 2. Последнее несколько лет назад. Железка стоит десятки тысяч.

Смог расшифровать что это были за крякозябры. Запустил LANG=en_US.utf8 wine Fable.exe Оказалось…

serial.serialutil.SerialException: GetOverlappedResult failed (OSError(22, 'Timeout.', None, 1460))

Таймаут, блин! А в винде нет таймаута, работает. В скрипте (serialwin32.py , на Киберфоруме подсказал человек где взять) есть работа с ним, т.е. приложение теоретически может таймаут устанавливать. И повлиять на это я не нашёл пока как, т.к. подкладывание правленого скрипта туда, где он должен быть (посмотрел Process Monitor-ом куда программа ходит за папкой site-packages) эффекта не даёт, она скрипт читает «из себя».

Может у Electron-а есть какой-то ключ, который управляет приоритезацией брать снаружи / брать изнутри, но это ещё надо поискать. Можно попробовать с помощью mode.com отключить таймаут, перегнать ключи реестра в wine, но программа всё равно будет их переопределять скорее всего. Не зря там логика сделана «Сохраняем таймаут windows, ставим свой, работаем, потом возвращаем».

c0unt0
() автор топика
Последнее исправление: c0unt0 (всего исправлений: 3)
Ответ на: комментарий от NDfan

Импортозамещение )) Железка которая туда подключается стоит десятки тысяч, нельзя её просто выкинуть.

c0unt0
() автор топика
Последнее исправление: c0unt0 (всего исправлений: 1)
Ответ на: комментарий от NDfan

Нельзя виндовс никак. Там-то работает в виртуалке. Я даже воспроизвёл повышенную нагрузку: 1 процессор в Virtualbox, nice +19 на него и 4 потока cat /dev/random > /dev/null Хаб стал отваливаться и там. Да если и просто быстро по вкладкам программы потыкать, тоже значёк мигать начинает. Можно и софтового )) Программу-бэкэнд, которая работает с хаб-ом завернуть в какую-то среду, которая изменит ход времени в нём, и он будет думать что 1 секунда - это 5. Либо вайн патчить, чтобы время в нём поменять. Только знать бы где.

c0unt0
() автор топика
Ответ на: комментарий от c0unt0

Ночью поэкспериментировал с faketime. Делаешь x20, (c -m разумеется) - оно так быстро ошибается, что значёк постоянно зелёный, но в консоли видно что ошибки идут, т.е. работать не будет. Напомнило бородатый анекдот:

В салон самолета входит стюардесса.

– Господа пассажиры! Самолет идет на посадку в одесский аэропорт. Пристегните ремни, а то будет, как в прошлый раз.

– А как было в прошлый раз?

– Тех, кто не пристегнулся, по стене размазало. А кто пристегнулся, выглядели совсем, как живые.

Делаешь 0.1 - большие задержки между попытками подключиться, но это не помогает. И всегда значёк «не подключено». Единственно, клиентская часть запускает серверную (backend), и если она уже запущена - прибивает и запускает заново. Поэтому запустить серверную отдельно через faketime простым путём не получится. Но я проверил через wine cmd, из него запустил winefile, из него снова cmd, и наследование изменения даты было, значит по-идее дочерние процессы должны унаследовать и изменение времени. Да вот только больно быстро ошибка выскакивает, как будто независимо от установленного коэффициента времени серверная часть отваливается за 1с. Типа до неё не доходит. Под винду аналогов не нашёл, только Nirsoft-овский RunAsDate, но он дату меняет, а время не замедляет. Дата как бы устраивает. Нашёл скрипт js, который предположительно прибивает серверный процесс. Закомментировал строчки - не помогло.

c0unt0
() автор топика
Последнее исправление: c0unt0 (всего исправлений: 3)
Ответ на: комментарий от c0unt0

Есть мнение, что виновата очередь com-port-a:

fixme:comm:set_queue_size insize 4096 outsize 4096 unimplemented stub

В serialwin32.py:

# Setup a 4k buffer
            win32.SetupComm(self._port_handle, 4096, 4096)[/CODE]

Находил баги и по поводу скрипта serialwin32.py связанные с ней, но правки я понятное дело внести не смогу. И по поводу функций в kernel32 / ntdll в wine. Бага открыта, отписал туда. Проверил на новом 8-м вайне, не помогло. Но там и не было упоминаний об этом. Они всё на игрушки смотрят, а базовую функциональность, типа наличия всех апплетов панели управления, и *.msc файлов, для удобного администрирования не кладут. Положишь сам - функций нет, заглушки-чопики. В-общем надо патчить ядро wine…

c0unt0
() автор топика