Перейти к содержанию
  • Регистрация

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

Пользователи
  • Публикаций

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

  • Посещение

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

    69

Весь контент Евгений Корепов

  1. Это происходит в основном или с русским ребрендингом, где пытаются скрыть настоящего производителя аппарата с помощью программный заглушек. Типа Dexp и прочий мусор. Или с контрафактной китайщиной без IMEI. Тут не студия не видит, а винда не понимает что к ней подключили. Обычно решается поиском на китайских форумах подходящих дров. Просто покупайте любой Xiaomi c Android One (чистый андроид). Его вы всегда сможете использовать по назначению для себя/семьи или продать. Или покупайте любой, в нормальном магазине - если что то не заработает, вернете в течении двух недель со словами "Его цвет не походит к моим глазам" )))
  2. Это вряд ли. Да и по хуавею уже на попятную пошли, ибо без редкоземельных металлов, штатам придется вернутся к плантациям и неграм-рабам. ))))
  3. Я бы переделал и код отправки и код приема. При отправке вы выполняете лишние действия, проверяете наличие интернет, преобразуете json в лист. Отправка любым способом желательна в виде "Ключ=Значение", чтоб на стороне сервера корректно распознать данные. Вот отправка POST (добавьте в uses System.Net.Mime): function TForm1.PostURL(const aurl, json: string): string; var AHTTPClient : THTTPClient; AHttpResponse: IHttpResponse; ASource: TMultipartFormData; begin result:= ''; AHTTPClient:= THTTPClient.Create; ASource:=TMultipartFormData.Create(); ASource.AddField('request', json); try try AHttpResponse := AHTTPClient.Post(aurl, ASource); if AHttpResponse.StatusCode <> 200 then Result := AHttpResponse.StatusText else Result := AHttpResponse.ContentAsString(); except on E: exception do ShowMessage('Ошибка сети: '+E.Message); end; finally FreeAndNil(ASource); FreeAndNil(AHTTPClient); end; end; Но гораздо проще и быстрее делать GET (добавьте в uses System.NetEncoding): function TForm1.GetURL(const aurl, json: string): string; var AHTTPClient : THTTPClient; AHttpResponse: IHttpResponse; AEncodedJSON : String; begin result:= ''; AHTTPClient:= THTTPClient.Create; AEncodedJSON:=System.NetEncoding.TURLEncoding.URL.Encode(json); try try AHttpResponse := AHTTPClient.Get(aurl + '?request=' + AEncodedJSON); if AHttpResponse.StatusCode <> 200 then Result := AHttpResponse.StatusText else Result := AHttpResponse.ContentAsString(); except on E: exception do ShowMessage('Ошибка сети: '+E.Message); end; finally FreeAndNil(AHTTPClient); end; end; file_get_contents("php://input", "r") - это тоже вариант, но никогда такое не используйте. На стороне сервера, в php есть специальные глобальные переменные для получения данных $_REQUEST, $_POST и $_GET. $_POST и $_GET - для соответствующих HTTP методов. $_REQUEST - универсальный. Вот вам код php для сервера, я там описал вспомогательную функцию лога MyLog, измените путь логов на свой. <?php @ini_set("display_errors", "1"); error_reporting(E_ALL); //@ini_set("display_errors", "0"); error_reporting(0); function MyLog($Title, $Value = "", $Debug = false) { $LogFile = "/var/log/service/test001.log"; if (is_array($Title)) $Title = "\n".print_r($Title, true)."\n"; if (is_array($Value)) $Value = "\n".print_r($Value, true)."\n"; $Message = date("Y.m.d H:i:s")." ".$Title.$Value."\r\n"; if ($Debug) echo $Message; file_put_contents($LogFile, $Message, FILE_APPEND); } // Проверяем наличие параметра request if (!isset($_REQUEST["request"])) { echo "Нет параметров"; return; } // Декодируем строку из $_REQUEST["request"] в массив $RequesrArray = json_decode($_REQUEST["request"], true); // Проверяем прошло ли декодирование нормально if (!isset($RequesrArray)) { echo "Ошибочный JSON"; return; } MyLog('*************************************************************************************************************************'); MyLog('$_REQUEST:', $_REQUEST); MyLog('$_POST:', $_POST); MyLog('$_GET:', $_GET); MyLog('$RequesrArray:', $RequesrArray); // Работаем с массивом $RequesrArray $lessongrid_type = $RequesrArray['lessongrid_type']; $schedule0 = $RequesrArray['schedule'][0]; Обратите внимание json_decode($_REQUEST["request"], true); используется с вторым параметром true - при этом создается не объект (медленно), а ассоциативный массив (быстрее некуда). Вот код Delphi procedure TForm1.FormCreate(Sender: TObject); Var AURL : String; AJSON : String; begin AURL:='http://myserver.ru/api/test001.php'; AJSON:='{"lessongrid_idpartner":2,"lessongrid_type":0,"lessongrid_idpointcity":1,"lessongrid_iddircourses":1,"lessongrid_idteacher":1,"schedule":["0:00","5:00","0:00","0:00","0:00","0:00","0:00"]}'; PostURL(AURL, AJSON); GetURL(AURL, AJSON); end; А вот логи на стороне сервера: 2019.06.06 13:29:13 ************************************************************************************************************************* 2019.06.06 13:29:13 $_REQUEST: Array ( [request] => {"lessongrid_idpartner":2,"lessongrid_type":0,"lessongrid_idpointcity":1,"lessongrid_iddircourses":1,"lessongrid_idteacher":1,"schedule":["0:00","5:00","0:00","0:00","0:00","0:00","0:00"]} ) 2019.06.06 13:29:13 $_POST: Array ( [request] => {"lessongrid_idpartner":2,"lessongrid_type":0,"lessongrid_idpointcity":1,"lessongrid_iddircourses":1,"lessongrid_idteacher":1,"schedule":["0:00","5:00","0:00","0:00","0:00","0:00","0:00"]} ) 2019.06.06 13:29:13 $_GET: Array ( ) 2019.06.06 13:29:13 $RequesrArray: Array ( [lessongrid_idpartner] => 2 [lessongrid_type] => 0 [lessongrid_idpointcity] => 1 [lessongrid_iddircourses] => 1 [lessongrid_idteacher] => 1 [schedule] => Array ( [0] => 0:00 [1] => 5:00 [2] => 0:00 [3] => 0:00 [4] => 0:00 [5] => 0:00 [6] => 0:00 ) ) 2019.06.06 13:29:13 ************************************************************************************************************************* 2019.06.06 13:29:13 $_REQUEST: Array ( [request] => {"lessongrid_idpartner":2,"lessongrid_type":0,"lessongrid_idpointcity":1,"lessongrid_iddircourses":1,"lessongrid_idteacher":1,"schedule":["0:00","5:00","0:00","0:00","0:00","0:00","0:00"]} ) 2019.06.06 13:29:13 $_POST: Array ( ) 2019.06.06 13:29:13 $_GET: Array ( [request] => {"lessongrid_idpartner":2,"lessongrid_type":0,"lessongrid_idpointcity":1,"lessongrid_iddircourses":1,"lessongrid_idteacher":1,"schedule":["0:00","5:00","0:00","0:00","0:00","0:00","0:00"]} ) 2019.06.06 13:29:13 $RequesrArray: Array ( [lessongrid_idpartner] => 2 [lessongrid_type] => 0 [lessongrid_idpointcity] => 1 [lessongrid_iddircourses] => 1 [lessongrid_idteacher] => 1 [schedule] => Array ( [0] => 0:00 [1] => 5:00 [2] => 0:00 [3] => 0:00 [4] => 0:00 [5] => 0:00 [6] => 0:00 ) ) Как видите можно использовать код с $_REQUEST в обоих случаях. Вот итоговый код php <?php @ini_set("display_errors", "1"); error_reporting(E_ALL); //@ini_set("display_errors", "0"); error_reporting(0); // Проверяем наличие параметра request if (!isset($_REQUEST["request"])) { echo "Нет параметров"; return; } // Декодируем строку из $_REQUEST["request"] в массив $RequesrArray = json_decode($_REQUEST["request"], true); // Проверяем прошло ли декодирование нормально if (!isset($RequesrArray)) { echo "Ошибочный JSON"; return; } // Работаем с массивом $RequesrArray $lessongrid_type = $RequesrArray['lessongrid_type']; $schedule0 = $RequesrArray['schedule'][0];
  4. Покупайте любой телефон с андроидом посвежее (потому как в последней версии студии на андроиде < 5 вы ничего уже не запустите). И обязательно берите чистый аднроид, никаких HTC, Samsung, Xiaomi с их мега-облочками. Вот к примеру Xiaomi A1 - модель с чистым андроидом, вполне себе средний телефон, не дорого.
  5. Одно из основных требований протокола REST - отсутствия состояния. Т.е. сервер ничего не должен хранить: запрос от клиента, ответ от сервера, все. Никаких сессий и прочей мути. То что у вас на данный момент реализовано - велосипедный костыль, поэтому никакие стандартные фреймворки с этим работать не будут. P.S. Прочитал ваше сообщение внимательнее - все верно у вас работает. "НО! после любого обращения по REST, сервер создает и уничтожает сразу класс ServerMethod" - вот так и должно быть.
  6. MultiView.IsShowed http://docwiki.embarcadero.com/Libraries/Rio/en/FMX.MultiView.TCustomMultiView.IsShowed
  7. Продукты Apple не умеют корректно декодировать URL. Это исключительно ваша задача. Все другие платформы делают это автоматически. Вам нужно добавить код: uses System.NetEncoding; ... URL:='http://blabla.com/php/pay2.php?eks=' + System.NetEncoding.TURLEncoding.URL.Encode('блабла&sum=100&hash=блабла&orderid=205');
  8. Зайдите в Менеджер лицензий (в меню Help) и убедитесь что у вас активирована лицензия именно на "Delphi 10.3 Rio Professional with Mobile". Если нет, то повторная регистрация поможет.
  9. Я уже поднимал эту тему, поищите по AndroidTV, но тоже не смог побороть проблему. Проблема вроде именно в FMX, где то в исходниках даже видел некий массив "разрешенных" кнопок. Но занимался этим эпизодически, потом вообще забил. Если докопаетесь до истины - будет хорошо.
  10. Мимо проходил. Вот вам код на php (собираем все данные в один массив и энкодим в json) $QueryArray = array( "SELECT ... FROM `...`;", "SELECT ... FROM `...`;", "SELECT ... FROM `...`;", "SELECT ... FROM `...`;", ); $Index = 0; $ResultArray = array(); foreach ($QueryArray as $query) { if ($mysqli_result = mysqli_query($DBLink, $query)) while ($row = mysqli_fetch_array($mysqli_result, MYSQLI_ASSOC)) $ResultArray[$Index][] = $row; $Index++; } $ResultJSON = json_encode($ResultArray, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); echo $ResultJSON;
  11. Можно просто вызывать как внешнее приложение с нужными параметрами. Я к примеру на сервере Asterisk на лету пережимаю wav в ogg таким образом - все работает превосходно. Если не хотите использовать внешнее приложение, то у ffmpeg отличная документация, в том числе и по работе с вызовами функций из библиотек, так что дополнительная прокладка в виде компонента может и не понадобиться. В линуксе же можно подключать библиотеки so, по аналогии с windows dll ? Тут мои знания и опыт очень ограничены, но предполагаю что нет ничего не возможного )))
  12. Как вариант - можете использовать внешнее приложение https://ffmpeg.org/ . И вроде можно использовать его библиотеки в своем приложении (но тут не скажу, не пробовал).
  13. Просто закиньте в паку с проектом, этого думаю достаточно. P.S. для проверки напечатайте какую нибудь явную ересь в этом файле - если компилер ругнется на ошибку, значит он нужный файл подключает к проекту.
  14. Интересно! Обязательно сообщите результаты! )))
  15. Какая версия среды у вас и какая версия Indy? Возможно проблема в старой версии Indy, погуглите "delphi indy OffsetFromUTC" - там были какие то проблемы, и вроде они исправлены. У меня вот такая версия (в Rio с последним апдейтом). Узнать версию - киньте любой компонент Indy на форму, правой кнопкой по компоненту и About. Повторюсь - на андроиде я не проверял правильность работы.
  16. Посмотрите исходники модуля IdSNTP - там все достаточно просто (всего 300 строк кода). Может пошаговый дебаг поможет понять откуда берется ошибка. На винде у меня правильное время отдает, на андроиде не пробовал.
  17. Я приводил вам пример работы скроллинга, а не спецификацию.
  18. Протокол SNTP Помимо NTP, существует упрощенная версия этого протокола - SNTP (Simple Network Time Protocol). Он реализован для синхронизации времени конечным клиентом, поскольку все преимущества протокола NTP проявляются именно в сети серверов, а для получения показаний конечным пользователем NTP излишне сложен. Поэтому для синхронизации времени конечными компьютерами и серверами был предложен протокол SNTP (SNTPv3: 1992 г., RFC1361 и 1995 г., RFC1769; SNTPv4 включён как подпротокол в NTPv4). На самом деле SNTP - это не новый протокол, а способ использования NTP-пакетов и NTP-серверов в приложениях, где не требуется высокоточное время, либо оно недостижимо. В этом случае клиент использует только часть информации UDP-пакета NTP-сервера. SNTP-клиент может работать с любыми версиями NTP-серверов, и кроме них - с особыми SNTP-серверами, которые в откликах заполняют только необходимые данные UDP-пакета. Таким образом, "облегченный" SNTP образует не сеть синхронизирующихся серверов, а пары "клиент-сервер". Любой NTP-сервер является одновременно SNTP-сервером. Клиент, который не передаёт полученное время дальше, может работать как NTP- или SNTP-клиент, в зависимости от условий. Для SNTP, как и для NTP, зарезервирован 123-й UDP-порт. Uses IdSNTP, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient; .... procedure TForm1.Button2Click(Sender: TObject); Var IdSNTP: TIdSNTP; begin IdSNTP:=TIdSNTP.Create(Self); IdSNTP.Host := 'ntp1.stratum2.ru'; ShowMessage(DateTimeToStr(IdSNTP.DateTime)); IdSNTP.Free; end;
  19. Тогда все было несколько проще - видеопамять была просто частью оперативной памяти, и видеокарта просто отрисовывала на экране содержимое памяти начиная с заданного адреса. 1 байт = 1 пиксел. Ширина экрана 320 пикселей. Вы говорили видеокарте установить смещение в 1000 байт и она отрисовыла все начиная с тысячного байта. Потом вы устанавливали смещение видеобуфера в 1320 байт (+1 строка) - и вот уже кадр на экране сместился на 1 пиксель выше. Повторяем на каждый тик - и у вас картинка скроллится снизу вверх. Сейчас у видеокарт все организованно сложнее, но принимая во внимание их безумную производительность, вы можете 50 раз в секунду рисовать абсолютно новую картинку. Но рисовать приходится каждый кадр с нуля. И только заслуга программистов что вы видите скроллы, коридоры, бегущих монстров и т.д. Естественно все это рисуется с помощью специальных интерфейсов взаимодействия с GPU (CUDA, Vulkan, OpenCL). Для вашей задачи вы вполне можете использовать эти мощнейшие механизмы - грузить в видеопамять картинки (текстуры), аппаратно натягивать их на плоскость, аппаратно скроллить эту плоскость. Все инструменты для этого есть в стандартной палитре компонентов Delphi.
  20. Может вам пойти простым путем - написать web-приложение (карта OpenStreetMap, маркеры на карте, немного JS). Все будет в браузере, плавно. При желании сможете засунуть все это в приложение, загрузив в TWebBrowser. Со своим советом я исходил их предположения что вам нужна карта и двигающиеся по ней картинки троллейбусов
  21. Вот как то так: ShellExecute(0, 'C:\Program Files\Java\jre1.8.0_121\bin\javaw.exe', '-jar D:\file.jar', nil, nil, SW_SHOWNORMAL);
  22. Соблазн велик! Но не поддавайтесь ереси! ? Ну или поддавайтесь ? Сделав все самостоятельно, вы не только сэкономите деньги, но и получите бесценный опыт. И получите площадку для сотен приложений. Тот же myclouddata очень ограничен - бесплатный аккаунт 1000 записей в таблице это ниочем. Да и платный с миллионом записей тоже не поражает воображение. Одно из моих приложений за пару лет накидало в таблицу с регистрациями FCM 600 тысяч записей. Так что вы (или заказчик приложения) может упереться в ограничение в самый неподходящий момент и придется судорожно искать другой сервис.
  23. Вы всегда можете изменить max_execution_time (равный по умолчанию 30 сек) в runtime : ini_set('max_execution_time', '3600');
  24. 1) Не безопасно. Потому как авторизация нужна (хотя бы в виде ключа "xq34mt89o32834yt9148t87913" в параметрах запроса ? 2) Это точно не нужно - безумная на грузка на сервер, транспортный протокол и клинта. 3) FTP - можно но нафик. Во первых отдельная логика на стороне клиента, во вторых хостер обычно предоставляет FTP доступ ко всей площадке, а хранить логин/пароль от площадки на клиенте это - нельзя. К счастью у нас на стороне сервера есть PHP, который для этого и предназначен: <?php //@ini_set("display_errors", "1"); error_reporting(E_ALL); @ini_set("display_errors", "0"); error_reporting(0); $SecureToken = "ce48oltq38p94tv83"; // Ключ для доступа $FilesPath = "/usr/share/My_Secret_File_folder/"; // Место хранения бинарных файлов // Просто пример неких данных для передачи пользователю в формате JSON (но храним и оперируем мы ими в обычном массиве $ExampleUserData = array( "Овощи" => array( "Помидорка", ), "Фрукты" => array( "Яблочко", ), ); if (!isset($_GET['token']) or $_GET['token'] != $SecureToken) { echo "Ах ты хитрая жопа! Пожалуйста, не взламывай мой сервер!"; exit; } if (!isset($_GET['command'])) { echo "Нет команды, не знаю что делать..."; exit; } switch ($_GET['command']) { "get_file" : if (!isset($_GET['file_name'])) { echo "Не знаю какой файл ты хочешь..."; exit; } $BinatyFilePath = $FilesPath . $_GET['file_name']; if (!file_exists($BinatyFilePath)) { echo "Не угадал, нет такого файла..."; exit; } if (ob_get_level()) { ob_end_clean(); } header('Content-Description: File Transfer'); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($BinatyFilePath)); // читаем файл и отправляем его пользователю if ($fd = fopen($BinatyFilePath, 'rb')) { while (!feof($fd)) { print fread($fd, 1024); } fclose($fd); } break; "get_data" : $JSONData = json_encode($ExampleUserData, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); header('Content-Type: application/json; charset=utf-8'); echo $JSONData; break; default : echo "Не знаю такой комманды..."; } Вот это простой кусок кода сделает следующие вещи: http://my_server.com/api/?token=ce48oltq38p94tv83&command=get_data - отдаст JSON данные http://my_server.com/api/?token=ce48oltq38p94tv83&command=get_file&file_name=naked_girl.jpg - отдаст бинарный файл, предположительно с изображение голой девушки. Ну а на в приложении вам останется только: Var HTTPResponse : IHTTPResponse; begin HTTPResponse:=FHTTPClient.Get(AURL); HTTPResponse.ContentAsString или HTTPResponse.ContentStream, смотря что вы запрашивали.
×
×
  • Создать...