Перейти к содержанию
Fire Monkey от А до Я

Евгений Корепов

Пользователи
  • Постов

    738
  • Зарегистрирован

  • Посещение

  • Победитель дней

    100

Сообщения, опубликованные Евгений Корепов

  1. 7 часов назад, AlexShaman сказал:

    Мне нужно чтоб UDPServer и UDPClient работали одновременно на одном порту и IP в одном приложении.

    Реализую технологию UDP Hole Punching для peer-to-peer соединения (Peer-to-Peer Communication Across Network Address Translators)

    Код уже написан и оттестирован под Win32, все работает как надо, но на Android почему-то не хочет.

    Если клиент и сервер на одном порту, то сервер ничего не получает, ReuseSocket= true

    Приложите проект который можно запустить, попробую помочь. Кстати может стоит отказаться от UDP клиента совсем? UDP сервер умеет все тоже что и клиент, плюс умеет слушать порт. 

  2. 15 часов назад, Равиль Зарипов (ZuBy) сказал:

    спасибо, круто) я проверял на android wear тоже все показало.

    а сетевые параметры считываются только по вайфай, поэтому там пусто

    А вот как получить параметры Ethernet?

    Кстати вот еще способ получения дополнительных параметров:

    Папка /sys/class/, в ней много всего, к примеру display, ethernet, input, net, video.

    Вот некоторые файлы папки /sys/class/net/eth0/ (через тире их содержимое):

    address - f8:f0:82:4f:06:17
    carrier - 1
    duplex - full
    mtu - 1500
    operstate - up
    speed - 100

    P.S. Кстати для просмотра содержимого удобно поставить ftp-сервер на устройство и с компа клиентом, к примеру Far Manager, смотреть.

  3. В 14.03.2016 в 11:57, OnePeople сказал:

    Парни может хотя бы кто скажет, procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle) должна работать на андроид?

    Не только должна, но и отлично работает. Вот пример:

    function TFormMain.CreateUDPServer : Boolean;
    Var I : Integer;
    begin
      Result:=False;
      IdUDPServer:=TIdUDPServer.Create;
      IdUDPServer.BroadcastEnabled:=True;
      IdUDPServer.OnUDPRead:=IdUDPServerUDPRead;
      for I := Low(UDPPortArray) to High(UDPPortArray) do
      begin
        IdUDPServer.Bindings.Clear;
        with IdUDPServer.Bindings.Add do
        begin
          IP:='0.0.0.0';
          Port:=UDPPortArray[I];
        end;
        try
          IdUDPServer.Active:=True;
        except
        end;
        if IdUDPServer.Active then
        begin
          FActiveUDPPort:=IdUDPServer.Bindings.Items[0].Port;
          IPMACLocalPair.Port:=IdUDPServer.Bindings.Items[0].Port;
          Result:=True;
          Exit;
        end;
      end;
      FActiveUDPPort:=-1;
    end;
    
    procedure TFormMain.IdUDPServerUDPRead(AThread: TIdUDPListenerThread;
      const AData: TIdBytes; ABinding: TIdSocketHandle);
    Var S : String;
    begin
      if (IPMACLocalPair.IP.Equals(ABinding.PeerIP)) And (IPMACLocalPair.Port=ABinding.PeerPort) then exit;
      DateTimeToString(S, 'hh:nn:ss.zzz', Now);
      S:=S+' '+BytesToString(AData , IndyUTF8Encoding);
      S:=S+' | from '+ABinding.PeerIP+':'+ABinding.PeerPort.ToString;
      Memo.Lines.Insert(0,S);
    end;

    На UDPPortArray не обращайте внимание, это если порт занят, то используется другой (UDPPortArray : array [0..2] of Integer = (55771, 55772, 55773);). 

    IdUDPServer.BroadcastEnabled:=True; тоже не нужно, если не собираетесь широковещать.

    Большинство функций работы с TIdBytes доступны в юните idGlobal, как например BytesToString(AData , IndyUTF8Encoding) в моем коде.

  4. Проверил на тв-приставке. Все отлично, кроме определения сетевых параметров. На приставке wifi выключен, имеется 100Мбит ethernet подключение. Скриншот прилагаю. Прошу прощения за качество, не допер как сделать скриншот с телевизора (или приставки), так что сфотографировал экран ;-)

    IMAG0492.jpg

  5. Проверил на своей приставке UHD200 - по FormKeyDown приходят только цифровые клавиши (0-9), стрелки вверх, вниз, влево, вправо - соответствуют кодам на pc клавиатуре, и приходит код от кнопки назад. На этом все. Как использовать способы предложенные Brovin Yaroslav, не понял совсем, буду гуглить в надежде на прояснение.

    Цветные кнопки пульта игнорируются полностью, и что самое обидное, самая главная кнопка "Ok" тоже никак себя не проявляет. Даже пробовал форму с единственной кнопкой, принудительно в onShow устанавливал ей фокус, но реакции ноль.Смена ControlStyle на Platform тоже не помогает. 

    Хотя все не дельфи приложения адекватно реагируют на кнопку - установил десяток различных приложений, все контролы переключаются нормально.

    И еще проблема - в fmx под андроид нет визуального подтверждения фокуса на контроле. Сделал приложение которое по таймеру устанавливает фокус нескольким контролам, но на экране никакой разницы нет, все контролы мертвые.

    Вывод пока неутешительный - писать что то под андроидные тв-приставки в Дельфи можно, но управлять приложениями с штатного пульта можно только переключая в режим мышки, что конечно жуткий ад.

  6. 1 час назад, krapotkin сказал:

    а традиционного меню developer mode там я так понимаю нет?

    Есть, уже нашел. Много раз тыкнул на версию билда в настройках о устройстве и режим разработчика включился. И даже есть опция перевода USB в slave режим - видимо можно подключить к компу для отладки. Правда у меня устройство в другой комнате, еще не пробовал. Помню была какое то приложение для отладки по wifi, надо попробовать его.

    И также закралось подозрение что на приставке не Android TV, а обычный андроид лолипоп 5.1.1. Хотя, честно говоря, пока не понимаю разницы. Андроид ТВ это же не отдельная операционка? Гуглевское приложение (Android TV Remote Control) приставку не видит.

  7. Наконец стал счастливым обладателем телевизионной приставки на android tv Amlogic Vermax UHD200. Все приложения написанные на Дельфи, в моему удивлению, отлично на ней заработали. Конечно специфика управления пультом внесла некоторые не приятные моменты - в большинстве случаем без переключения в режим мышки (стрелками двигаешь курсор по экрану и нажимаешь кнопкой Ок) не обойтись.

    Пару вопросов коллегам которые уже имеют опыт создания приложений под подобные устройства (помню были темы, но найти не смог):

    • Как деплоить приложение на приставку - apk на флэшку и в приставку? И можно ли производить отладку приложения на устройстве?
    • Как победить специфику управления? Достаточно ли будет управлять фокусом контролов и последовательностью табуляций (переходов по ним). 

    С радостью выслушаю советы, хинты и прочую полезную информацию. Естественно поделюсь своим опытом, когда он появится :-)

    P.S. Странно, но 99% приложений из маркета, не имеют в интерфейсе поддержку android tv. Из 10 перебранных DLNA проигрывателей, только один полностью готов к работе с пультом. Некоторые приложения вообще отказались работать по причине "Включите WiFi, а то у вас нет сети", хотя приставка подключена 100 мегабитной медью к сети.

  8. А если  TIdHTTPServer заменить на TIdTCPServer, интересно на сколько увеличится быстродействие? И еще вопрос - по ядрам процессора нагрузка распределяется равномерно или грузит только одно ядро в вашем случае?

     

  9. 37 минут назад, Камышев Александр сказал:

    инди создает срэд перед вызовом OnCommandGet, есть HeadersAvailable но оттуда редиректнуть нельзя, а смысл перенаправлять если ресурсы уже заняты...

    MaxConnections есть ограничение в IdHTTTPServer, и да, разумная цифра 1024 там не будет лишней.

    Смысл в том что в комбинации с IdHTTPServer1.KeepAlive:=False, код ниже будет сразу освобождать ресурсы, т.е. количество соединений не превысит 1024 плюс несколько десятков отправленных в редирект с последующим отключением.

    procedure TForm1.IdHTTPServer1CommandGet(AContext: TIdContext;
      ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
    begin
      if CurrentConnectionCount>1024 then
        AResponseInfo.Redirect('sadas.asdasf.com');
    end;

     

  10. Ограничте количество соединений самостоятельно разумной цифрой, при попытке соединения сверх лимита отдавайте в хеадере редирект на следующий сервер в кластере. Если конечно есть следующий сервер...

  11. 13 часов назад, d7d1cd сказал:

    Евгений, получилось разместить приложение? Можете сказать название приложения. Хочется посмотреть, скачать. То есть узнать как это все работает, когда делаешь через RAD.

    Пока отложил, Новый год на носу :-) После празднования посмотрю ролик по ссылке выше и попробую еще раз. Приложение будет "Актированный день Ухта", под андроид уже опубликовано, вот как раз хотел под винду потестить.

  12. Заплатил микрософту денег, получил доступ к публикации приложений. Но все попытки что сделать провалились. 

    Видео от ембаркадеры https://www.embarcadero.com/products/rad-studio/windows-10-store-desktop-bridge откровенный фейк, при попытке воспроизвести действия в ролике, создается пакет, но устанавливаться не хочет по причине отсутствия сертификата. 

    Может кто встречал на просторах интернета мануал с нормально расписанными шагами. А то ембаркадера даже хелп не удосужилась создать для странички настройки provisioing в режиме windows

    Добавление:

    Кое что начинает проясняться, спасибо Равилю Зарипову за ссылку
    https://community.embarcadero.com/blogs/entry/appx-development-for-windows-10-store

    Вот что я упустил:
    Следующий шаг, чтобы убедиться, что вы включили "режим разработчика" на ОС Windows 10. Это необходимо для установки APPX пакетов, подписанных с тестовыми сертификатами. Вы можете найти эту опцию в Windows 10 "Настройки" в разделе "Обновление и безопасность" и "для разработчиков".

  13. 19 часов назад, ZuBy сказал:

    1) в чем проявляются косяки?

    2) этот код сорцов студии

    3) зачем использовать поток?

    1. Увеличение веса приложения - туда натолкано столько кода, понятно что мультиплатформенности (тот же, не используемый в андроиде, TControl в параметрах множества функций). На андроиде может работать, а может и нет, или срабатывать через раз. Не знаю причину, разбираться лень.

    2. Да, из исходников и выдран метод. После того как ознакомился с исходниками, решил ограничится коротенькой процедурой.

    3. Без потока приложение залипает на 2-3 секунды, не очень приятное ощущение, особенно когда вызов идет с нажатой на MultiView кнопки - анимация закрытия MultiView замораживается в неопределенном состоянии и приложение выглядит как будто умерло :-)

     

  14. 19 часов назад, Brovin Yaroslav сказал:

    LThread может и не запуститься на андроиде и удалиться до старта, после выхода из метода.

    Точно! Сейчас посмотрел свежим взглядом и понял недочет, сделаю LThread глобальным.

  15. В 21.11.2016 в 19:20, Рагим сказал:

    Не помогло.

     

    На телефоне TCPServer не получает ничего. проставил showmessage практически на все события, которые у него есть, но глухо. TCPClient нормально подключается к телефону и посылает сообщение.

    Попробуйте еще телнетом проверить : telnet IP_телефона Порт_сервера ,произойдет соединение или нет?

  16. 4 минуты назад, Камышев Александр сказал:

    tcp сервер на телефоне, жесть

    Почему? Для некоторых нужд очень даже. К примеру регулярно пользуюсь ftp-сервером на телефоне - намного удобнее заливать/сливать (по wifi) книги, музыку и прочее, сидя за компьютером в Far manager, чем перетаскивая мышкой в убогих индусских синхронизаторах или пользоваться облачными решениями (залить 30 гигов в dropbox с компьютера (тут нет проблем, инет 450 мегабит), а потом их выкачивать из инета на телефон даже по wifi ac то еще удовольствие).

  17. Функция показа виртуальной клавиатуры при подключенной физической включается в настройках самого устройства. Как это сделать программно я не допёр. У каждого производителя по разному, на китайцах и HTC все просто, на Samsung - долгие танцы с бубном (отключение/подключение физической клавиатуры, тыкания в настройки и т.п.)

  18. Я отказался от TActions ввиду глючности и не предсказуемости. Попробуйте этот код:

    procedure TFormMain.ListBoxMultiViewItemClick(const Sender: TCustomListBox;
      const Item: TListBoxItem);
    Var LThread: TThread;
        S : String;
    begin
      if Not Item.Selectable then
        exit;
      if Not Item.Enabled then
        exit;
      MultiView.HideMaster;
    
      if Item = ListBoxItemShare then
      begin
        SendError('Share url');
        S:='Всем срочно ставить моё крутое приложение для Android'+#10+URLGooglePlay;
        LThread:=TThread.CreateAnonymousThread(
          procedure
          begin
            ShareUrl(S);
            TThread.CurrentThread.Terminate;
          end);
        LThread.FreeOnTerminate := true;
        LThread.Start;
      end;
    end;
    
    procedure ShareUrl(AURL : String);
    {$IFDEF ANDROID}
    Const SMediaLibraryOpenTextWith = 'Send text using:';
    var MIMETypes: string;
        Intent: JIntent;
        IntentChooser: JIntent;
        ChooserCaption: string;
    {$ENDIF ANDROID}
    begin
    {$IFDEF ANDROID}
      try
        Intent := TJIntent.Create;
        MIMETypes := 'text/plain';
      //    Intent.setAction(TJIntent.JavaClass.ACTION_SEND_MULTIPLE)
          Intent.setAction(TJIntent.JavaClass.ACTION_SEND);
        Intent.setType(StringToJString(MIMETypes));
        Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
        Intent.addFlags(TJIntent.JavaClass.FLAG_GRANT_READ_URI_PERMISSION);
        Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString(AURL));
        ChooserCaption := SMediaLibraryOpenTextWith;
        IntentChooser := TJIntent.JavaClass.createChooser(Intent, StrToJCharSequence(ChooserCaption));
        SharedActivity.startActivity(IntentChooser);
      finally
      end;
    {$ENDIF ANDROID}
    end;

     

  19. Я делаю велосипед - после покупки делаю хеш-строку на базе "id-продукта + параметры устройства" и пишу ее в файл. При запуске приложения, сначала проверяю наличие и валидность строки, а если не вышло, то потом IsProductPurchased(). Велосипед из десятка строчек работает надежно и не зависит от перезагрузок. 

  20. В 21.11.2016 в 19:20, Рагим сказал:

    Не помогло.

     

    На телефоне TCPServer не получает ничего. проставил showmessage практически на все события, которые у него есть, но глухо. TCPClient нормально подключается к телефону и посылает сообщение.

    Покажите код сервера, включая инициализацию (назначение портов и прочее)

  21. procedure TDM.TCPServerExecute(AContext: TIdContext);
    Var AData : TIdBytes;
        Status : TStatus;
    begin
    //  AContext.Connection.IOHandler.CheckForDataOnSource(10);
      if not AContext.Connection.IOHandler.InputBufferIsEmpty then
      begin
        AContext.Connection.IOHandler.ReadBytes(AData,VoiceBufferByteLength);
    //  AContext.Connection.IOHandler.ReadStream();
        if AData<>Nil then
        begin
          Status.DataType:='recieved';
          Status.ByteOut:=0;
          Status.ByteIn:=Length(AData);
          QueueStatus.PushItem(Status);
          if Length(AData)=VoiceBufferByteLength then
          begin
            BytesToRaw(AData,FVoiceBuffer.Data^,VoiceBufferByteLength);
            QueuePlay.PushItem(FVoiceBuffer);
          end;
        end;
      end;
    end;

    Вот как то так попробуйте

  22. AppTethering в эбаркадере написан по быстрому на коленке, через блютус почти не работает, в одном проекте удалось заставить работать с вероятностью один к десяти, т.е. одна успешная передача при десяти попытках. wifi тоже глючит, особенно автоконнект, при ручном связывании и костылях работает вполне прилично. 

  23. 4 часа назад, brunnengi сказал:

    Вопрос остался открытым.

    1. AppTethering через Bluetooth между двумя смартфонами не работает. (спасибо Rusland'у за подтверждение это проблемы)

    2. AppTethering через Wi-Fi не пашет, если на одном устройстве создать моб.точку доступа, а с другого подключиться. Вроде бы они получаются в одной подсети, но по факту AppTethering не пашет.

    3. Хотел сделать передачу считывания через QR Code, но объем данных для QR оказался слишком большой. Да и адекватного компонента нет. 

    Какие ещё варианты передачи данных/строки/файла, из программы на FMX стоящей на смартфоне некой Alice можно передать в такую же программа на FMX стоящей на смартфоне некого Bob'а, максимально легко (не в плане кода, а плане дальней эксплуатации пользователями), вы можете посоветовать, предложить? 

    Условия:

    1. При передачи не использовать интернет. Должна быть передача именно с телефона на телефон.

    2. Способ передачи должен быть технически возможен на большинстве устройств. Т.е. например передачу через NFC не рассматриваем, так как есть не у всех.

    Могу предложить передачу звуком. Как когда то в модемах. Будет наверное забавно ;-) 

    P.S. А передачу с помощью QR Code попробуйте следующим образом - не одна картинка с кодом, а несколько с интервалом в N секунд. Давно хотел такое реализовать, но руки не доходили, да и в Delphi с распознаванием и генерацией QR кодов глухо, приходится использовать сторонние приложения.

×
×
  • Создать...