Кроссплатформенная разработка в Delphi XE5. Клиент-серверное приложение для доступа с нетбука к данным датчика GPS планшета

Итак, мальчики и девочки, то, о чем так долго мечтали большевикипоклонники среды разработки Delphi, свершилось! Как вы уже наверняка в курсе, а кто не в курсе, бегом скачивать официальный полный образ RAD Studio XE5.iso (размерами ни много, ни мало 4.63 GB), компания Embarcadero представила свой релиз 11 сентября, почти ко дню Программиста (кстати, еще раз поздравляю коллег). Теперь список поддерживаемых нативно Delphi платформ включает: Windows 32/64 bit, Mac OSx, iOS и самую вкусность... Android. Более подробно отошлю вас к уже имеющимся описаниям бета-тестеров, а мы тем временем, покопавшись в имеющихся сэмплах, создадим клиент-серверное приложение для передачи данных с датчика GPS нашего андрофона в распределенной одноранговой городской Wi-Fi сети. Интересно? Тогда далее следует...
Предпосылки реализации ПО
Прежде всего, что мы имеем? В наличии у нас следующее оборудование и ПО:
1. 7" Android-планшет LuxP@d 3755 3G/HD (ссылку не даю, поскольку большинство коммерческих) от китайских брайтьев с 4-м андроидом (полный фарш, скажу я вам ...помимо типичных функций планшетов как Wi-Fi/GPS/Bluetooth 3.0, оный поддерживает две SIM-карты с 3G и имеет даже встроенный FM-модулятор для вещания вашего плейлиста в радиусе ~50 метров или просто переадресации всех аудиопотоков на приемник FM-диапазона).
2. Нетбук Lenovo S10-3 на процессоре Intel Atom N450 processor (1.66 ГГц), RAM 1 GB, с интегрированной графикой GMA 3150 и с установленным Windows XP SP3 (для работы в Delphi XE5 и тестов клиентского приложения).
3. Переходной кабель USB-Micro USB (для возможности заливки и отладки серверного приложения в планшет).
4. Распределенная по городу Wi-Fi сеть, в которой и будут общаться планшет и нетбук.
5. Собственно, установленый на нетбуке TurboDelphi-Lite (предпочитаю его для старых проектов) и RAD Studio XE5.
К слову, о системных требованиях последнего с сайта разработчика:
· 1 GB RAM (2 GB+ recommended)
· 3-35 GB free hard disk space depending on edition and configuration
· DVD-ROM drive (if installing from a Media Kit DVD)
· Basic GPU – Any vendor DirectX 9.0 class or better (Pixel Shader Level 2)
· Intel® Pentium® or compatible, 1.6 GHz minimum (2GHz+ recommended)
· 1024x768 or higher-resolution monitor
· Mouse or other pointing device
· Microsoft® Windows 8 (32-bit and 64-bit)
· Microsoft® Windows 7 SP1 (32-bit and 64-bit)
· Microsoft® Windows Vista™ SP2 (32-bit and 64-bit) requires administrator rights
· Microsoft® Windows Server® 2008 (32-bit and 64-bit)
Тем не менее никаких проблем с установкой среды и ее запуском на моей хрюше не возникло. Однако следует отметить несколько особенностей:
1. При установке выбирал все по дефолту, убрав лишь в самом начале птичку с Си-билдера и выбрав только Delphi XE5, а далее ничего не трогал (в сети некоторые пишут, что если убрать птичку с билдера, то далее не будет варианта выбора андроида, это не так, по крайней мере с указанным ISO-образом, поскольку на сайте Embarcadero предлагается также скачать и неполный установщик на сотню мегабайт и он все остальное тянет за собой из Интернета. Вероятно эта особенность свойственна ему).
2. Если вы откажетесь от установки OCX-компонент и дополнительных пакетов, то у вас могут пропасть тэймплеты при последующем создании мобильного приложения, так что лучше не трогайте.
3. В корне системного диска при установке была создана папка PlatformSDKs с NDK и ADT, даже несмотря на то, что при задании путей установки был выбран каталог 'Program Files'. Это связано с тем, что SDK с NDK для Андроида не понимают пути с пробелами.
4. Для сравнения, изначально было свободно 25-ть гигабайт, после установки и перезагрузки ОС около 13-ти, при этом во временных каталогах осталась куча распакованного "мусора". Памятуя о том, что этот "мусор" может использоваться при первичном запуске и донастройке-доустановки среды, был проведен ее запуск, несколько компиляций и после этого временные папки были вычищены. Освободилось 7 гиг. Эх, Embarcadero.
5. Размер собираемой .so либы бланк проекта в дебаге 45 MB, а релизе 11.
Пару слов о настройке андрофона. Для того, чтобы иметь возможность заливать и отлаживать APK-приложение требуется активировать режим отладки по USB. Для этого зайдите в параметры через меню андрофона и активируйте данную опцию:
После этого вы можете подключить переходной кабель к андрофону и компьютеру. Если ранее вы не подключали свой андрофон к ПК (а до этого у меня лично такой необходимости не появлялось ни разу, достаточно было поднять FTP-сервер на планшете и иметь доступ ко всей файловой системе из тотал-коммандера на ПК), то ОС обнаружит новое устройство и запросит драйвера. В моем случае, было обнаружено некое MT65xx Android Phone. Поискав в сети:
наткнулся на универсальный драйвер MTK USB windriver for tablet (приложено к ресурсам ниже):
После установки драйвера был обнаружен Android Composite ADB Interface и диспетчер устройств весело плямкнул, доложив о добавлении нового гаджета:
Вот теперь наши железяки готовы к измывательствам. Однако, одного железа мало. Закономерен вопрос: "Как передавать данные вне зависимости от адреса устройства?". С обменом данными все более-менее ясно, обнаруженная вкладка с пакетом Indy в палитре компонентов XE5 приятно порадовала глаз. Можно отсылать на выделенный сервер с "белым" адресом, можно работать с почтовыми серверами, а можно и отсылать... широковещательные посылки по протоколу UDP. Для локальной одноранговой сети самое оно: не нужно заморачиваться знанием адреса сервера и клиента, подписка на броадкаст по заданному порту решает этот вопрос для всех устройств в сети одновременно. Сервер будет заниматься своим делом - получать данные с датчика и отсылать данные, клиент в любом месте сети получать их и парсить на предмет выделения требуемых значений и визуализировать местонахождение андрофона, скажем на картах Google Maps.
Проектируем сервер
Запустите Delphi XE5 и откройте сэмпл 'Location' из каталога 'MobileCodeSnippets' в demos. Данное приложение содержит пример работы с датчиком GPS. Удалите кнопку включения активности датчика (мы его будем активировать при старте приложения) и перенесите на форму модуль UDP сервера TIdUDPServer1 (для приема широковещательных пакетов и реализации ответного эха, для контроля), таймер TTimer1 (для периодического запуска передач) и две текстовых метки для визуализации принятого текста, модуль TLocationSensor не трогаем. Также из выпадающего списка вверху справа выберите платформу (в нашем случае 7" WSVGA Android Tablet (600 dp x 1024 dp: mdpi)):
В событии OnUDPRead() модуля сервера напишем код для приема данных от клиентов и реализации эха для самоконтроля:
procedure TLocationForm.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle); var msg: string; begin msg:= BytesToString(AData, enUTF8); label3.Text:= 'Read port 5006: ' + msg; // реализуем эхо send('Echo: ' + msg); end;
Получение данных датчиком из сэмпла выглядит следующим образом:
procedure TLocationForm.LocationSensor1LocationChanged(Sender: TObject; const OldLocation, NewLocation: TLocationCoord2D); begin { convert the location to latitude and longitude } lbLatitude.Text := 'Latitude: ' + NewLocation.Latitude.ToString; lbLongitude.Text:= 'Longitude: ' + NewLocation.Longitude.ToString; { and track the location via Google Maps } //WebBrowser1.Navigate(Format(LGoogleMapsURL, [NewLocation.Latitude.ToString, NewLocation.Longitude.ToString])); end;
Закомментируйте обращение к классу TWebBrowser. Ни к чему нам грузить трафиком сеть и отображать местоположение на сервере. Теперь добавим код активации датчика и периодической отсылки данных по таймеру:
procedure TLocationForm.send(text: string); begin IdUDPServer1.BroadcastEnabled:= True; IdUDPServer1.ThreadedEvent := True; // Send Broadcast try IdUDPServer1.Active := true; IdUDPServer1.Broadcast(Text, 5007, '', enUTF8); except on Exception do end; end; procedure TLocationForm.Timer1Timer(Sender: TObject); begin send(lbLatitude.Text); send(lbLongitude.Text); end; procedure TLocationForm.FormCreate(Sender: TObject); begin LocationSensor1.Active:= true; end; procedure TLocationForm.FormDestroy(Sender: TObject); begin LocationSensor1.Active := false; IdUDPServer1.Active := false; IdUDPServer1.ThreadedEvent := false; IdUDPServer1.BroadcastEnabled:= false; end;
Почему отсылка данных осуществлена в таймере, а не в событии получения новой локации onLocationChanged()? Это сделано умышленно. Представим, что положение объекта не меняется или пропал сигнал со спутников. Как узнать последнее местоположение, если событие не происходит? Да, можно послать запрос на получение данных, ведь обратную связь в виде эха мы реализовали. Как вариант для дальнейшего снижения трафика тоже подойдет.
Теперь подключим андрофон и перейдем справа на вкладку 'Target Platforms/Android - Android SDK/Target' и убедимся, что GDB-сервер его обнаружил:
В нашем случае он показал устройство под именем SS707. Для заливки в которое активируйте его кликнув левой кнопкой мыши и выбрав в контекстном меню 'Activate'. После чего компилируем по 'F9' модифицированное приложение-сервер:
По окончании компиляции* на андрофоне GDB-сервер запустит его. Довольно удобно. Стоит отметить, что если во время отладки нажать отмену, то GDB-сервер вылетит с ошибкой. Впрочем, на само приложение это не повлияет, но из процессов на компьютере сервер придется все же выгрузить вручную. Да и при последующей сборке инсталлированное приложение тоже придется предварительно удалить вручную (у кого-нибудь автоматом вышло?), по крайней мере у меня так.
* На первых порах меня дернуло запустить приложение на встроенном эмуляторе, однако сразу же убедился что не стоило этого делать. Запуск эмулятора оказался таким же длительным как и в Eclipse , да еще и не на столь "мощной" машине. Это конечно относительно, на работе приходилось использовать машинки куда хуже http://procoder.info/index.php/entry/postavil-xp-na-amd-k2-266-mhz-s-ram... . Таки отладка на целевом аппарате быстрее.
Проектируем клиента
На самом деле клиент у меня уже был из прошлого тестового проекта броадкаста по UDP:
Поэтому дело ограничилось добавлением парсинга и визуализации данных с использованием API Google Maps :
uses ConvertToGPS, mshtml, activex, IdBaseComponent, IdComponent, IdUDPBase, IdGlobal, IdSocketHandle, IdUDPServer; type tdata = record zoom: integer; caption, date, url, deg, full_date, epicentr: string; end; var p : integer; txt: tdata; tmr: TTimer; gl : integer = 0; gl_lat, gl_lon: string; procedure TForm1.send(text: string); begin // Send Broadcast try IdUDPServer1.Broadcast(text, 5006, '', enUTF8); except on Exception do end; end; procedure TForm1.Edit1Change(Sender: TObject); begin Send(edit1.Text) end; procedure TForm1.Edit1Click(Sender: TObject); begin edit1.Text:= '' end; /////////////////////////////////////////////////////////////////////////////// // РАБОТА С GOOGLE-MAPS // данные предоставлять в абсолютных GPS-координатах const key = 'ABQIAAAAzr2EBOXUKnm_jVnk0OJI7xSosDVG8KKPE1-m51RBrvYughuyMxQ-i1QfUnH94QxWIa6N4U6MouMmBA'; MapType = 'HYBRID'; //NORMAL SATELLITE HYBRID PHYSICAL function tform1.HTML: string; begin result:= '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"' + '"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">'#13 + '<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml">'#13 + '<head>'#13 + '<meta http-equiv="content-type" content="text/html; charset=utf-8"/>'#13 + '<title>Google Maps JavaScript API Example: Simple Map</title>'#13 + '<script src="http://maps.google.com/maps?file=api&v=2&key=' + key + '"'#13 + 'type="text/javascript"></script>'#13 + '<script type="text/javascript">'#13 + 'var map;'#13 + 'var geocoder = new GClientGeocoder();'#13 + 'function initialize() {'#13 + 'if (GBrowserIsCompatible()) {'#13 + 'map = new GMap2(document.getElementById("map_canvas"));'#13 + 'map.setCenter(new GLatLng('+ txt.deg{Latitude +','+ Longitude)} +'),' + inttostr(txt.zoom) + ','+'G_' + MapType +'_MAP'+');'#13 + // панель навигатора и масштаба 'map.addControl(new GLargeMapControl());'#13 + // добавляем шкалу зума 'map.addControl(new GMapTypeControl());'#13 + // переключатель типа карт (Карта, Спутник, Гибрид) // маркер на эпицентре с координатами в подсказке 'var marker_point = new GLatLng('+ txt.deg +');'#13 + 'var marker = new GMarker(marker_point, {title:"GPS: '+ txt.deg +'"});'#13 + 'map.addOverlay(marker);'#13 + 'marker.openInfoWindowHtml(''' + txt.caption + '<br />''+'#13 + ''''+ txt.full_date + '<br />''+'#13 + '''GPS: '+ txt.deg + '<br />''+'#13 + ''''+ txt.epicentr + '<br />'''#13 + ');'#13 + // формирование своего маркера с возможностью записи 'GEvent.addListener(map, "click", function(overlay, latlng) {'#13 + 'if (latlng) {'#13 + 'marker = new GMarker(latlng, {draggable:true});'#13 + 'GEvent.addListener(marker, "click", function() {'#13 + 'var html = "<table>" +'#13 + '"<tr><td>Наименование:</td> <td><input type=''text'' id=''name''/> </td> </tr>" +'#13 + '"<tr><td>Адрес:</td> <td><input type=''text'' id=''address''/></td> </tr>" +'#13 + '"<tr><td>Тип:</td></tr>" +'#13 + '"<tr><td></td><td><input type=''button'' value=''Сохранить'' onclick=''SaveData()''/></td></tr></form>";'#13 + 'marker.openInfoWindow(html);'#13 + '});'#13 + 'map.addOverlay(marker);'#13 + '}'#13 + '});'#13 + '}}'#13 + 'function addAdr(response) {'#13 + // создаем объект типа GLatLng и надпись 'place = response.Placemark[0];'#13 + 'point = new GLatLng(place.Point.coordinates[1],place.Point.coordinates[0]);'#13 + 'marker = new GMarker(point);'#13 + //размещаем надпись на карте 'map.addOverlay(marker);'#13 + //добавляем текст на надпись 'marker.openInfoWindowHtml(place.address + ''<br />'' +'#13 + '''Широта: '' + place.Point.coordinates[1] + ''<br />'' +'#13 + '''Долгота: '' + place.Point.coordinates[0]);'#13 + '}'#13 + '</script>'#13 + '</head>'#13 + '<body onload="initialize()" onunload="GUnload()" scroll=no>'#13 + '<div id="map_canvas" style="width: '+ inttostr(form1.wb.Width-20) + 'px; height: '+ inttostr(form1.wb.Height-30) + 'px"></div>'#13 + '</body>'#13 + '</html>'#13 end; procedure displayDataToBrowser(text_data: string; browser_storage: TWebBrowser); var sl : TStringList; ms : TMemoryStream; begin browser_storage.Navigate('about:blank'); while browser_storage.ReadyState < READYSTATE_INTERACTIVE do Application.ProcessMessages; if Assigned(browser_storage.Document) then begin sl := TStringList.Create; try ms := TMemoryStream.Create; try sl.Text := text_data; sl.SaveToStream(ms); ms.Seek(0, 0); IHTMLDocument2(browser_storage.Document).Charset := 'Windows-1251'; (browser_storage.Document as IPersistStreamInit).Load(TStreamAdapter.Create(ms)); finally ms.Free; end; finally sl.Free; end; end; browser_storage.OleObject.Document.ParentWindow.Scrollto(0, 0); end; procedure TForm1.rec(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle); var temp: String; begin temp:= BytesToString(AData, enUTF8);//Utf8ToAnsi(t.DataString); // контроль эха if pos('Echo: ', temp) > 0 then edit2.Text:= copy(temp, 7, length(temp) - 6); if temp <> '' then begin temp:= StringReplace(temp, ',', '.', [rfReplaceAll]); // парсим Latitude Longitude if pos('Latitude: ', temp) > 0 then begin sb.Panels[0].Text:= 'GPS.' + temp; if pos('.', temp)>0 then gl_lat:= copy(temp, 11, length(temp) - 10) else gl_lat:= ''; end; if pos('Longitude: ', temp) > 0 then begin sb.Panels[1].Text:= 'GPS.' + temp; if pos('.', temp)>0 then gl_lon:= copy(temp, 11, length(temp) - 10) else gl_lon:= ''; // децимация inc(gl); sb.Panels[2].Text:= format('Next update, sec: %.1f', [(5*2 - gl)/2]); if gl > 10 then begin gl:= 0; sb.Panels[2].Text:= ''; // визуализируем карту txt.caption := 'Getting GPS coordinates from the tablet'; txt.full_date:= 'Here could be your ad :)'; txt.deg := gl_lat + ',' + gl_lon; //'43.639833,-79.381027'; txt.epicentr := 'http://raxp.radioliga.com'; txt.zoom := zoom.ItemIndex; if (gl_lon <> '')and(gl_lat <> '') then displayDataToBrowser(HTML, wb) end end end end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin IdUDPServer1.ThreadedEvent := false; IdUDPServer1.BroadcastEnabled:= false; IdUDPServer1.Active := false; freeandnil(IdUDPServer1); end; procedure TForm1.FormCreate(Sender: TObject); begin // работаем в формате с точкой //decimalseparator:= '.'; // двойная буфферизация doublebuffered:= true; IdUDPServer1:= TIdUDPServer.Create(nil); IdUDPServer1.OnUDPRead := rec; // старт броадкаст-приема по 5007 порту IdUDPServer1.DefaultPort := 5007; IdUDPServer1.BroadcastEnabled:= True; IdUDPServer1.ThreadedEvent := true; IdUDPServer1.Active := true; end;
Тестирование
После компиляции и запуска Win-клиента, и работающем сервере на андрофоне, полученные данные будут отражены на карте c указанием в маркере GPS-координат и другой сопутствующей информации :
В качестве тестов прилагаю скринкаст на канале LaboratoryW :
и видео:
По мере добавления новых проектов канал будет пополняться новыми видео- скринкастами.
Постскриптум
Впечатления в целом положительные. Наличие Indy пакета предоставляет замечательные возможности взаимодействия из Android-приложения с сетью, как локальной, так и Интернет. Правда все хорошо, пока у вас анлим пакет . Однако, вот вопрос: "...есть ли встроенные классы в XE5 для обращения к блютуз планшетника/смарта или USB как к последовательным портам?". В J2ME WTK такое есть и в мидлете на самом "древнем" телефоне без ОС (не смарте), но с поддержкой J2ME, было возможно читать-писать в IRDA и блютуз. Даже в Midlet-Pascal есть поддержка JAVA-классов этих устройств (там можно обращаться аналогично и к акселерометру и GPS-датчику и взаимодействовать с сетью). Да-да, старый добрый Midlet-Pascal все еще живет и развивается http://sourceforge.net/projects/midletpascal . Для чего? C практической точки зрения, есть необходимость через сопряженный c планшетником блютуз-модуль от китайских братьев HC-05 (сие прозрачный UART over Bluetooth, цена которого на Ali упала до 5-ти американских президентов с бесплатной доставкой в страны постсоветского пространства) команды гонять на МК и с МК/ПЛИС (управление-контроль-диагностика чего угодно), а также с удаленного осциллографа. По дефолту, этот HC-05 прошит профилем, который прекрасно видится андрофонами, а еще у него есть возможность перешиться в профиль от BlueGiga и писать прошивки прямо в нем.
Ресурсы
1. ISO образ RAD Studio XE5 http://altd.embarcadero.com/download/radstudio/xe5/delphicbuilder_xe5_wi...
2. MTK Phone Universal USB Driver http://www.androidgroupon.com/rom/Tool/MTK_USB_%20Driver.rar
3. Архив UDP Broadcast сервера под андроид, Win-клиента и сервера (на всякий случай, разделение условное ) http://raxp.radioliga.com/cnt/s.php?p=and1_res.zip
- raxp's блог
- Добавить комментарий
- 14078 просмотров
Комментарии
19 комментария(ев)Дата: ВС, 15/09/2013 - 01:36
Афигеть! Не знал, что MidletPascal еще живет. Мы даже командой сайта liveofpc.ru (больше он не существует, так что не переходите по ссылке) выпустили разок журнал со сборкой статей по нему.
Цитировать
Да, есть такое дело. Я когда то подключал один java-класс для работы с файловой системой телефона или вроде того.
Статья интересная. Спасибо, raxp!
Но если честно, меня больше интересует обзор твоего планшета. Если не сложно, опиши как владелец, что он из себя представляет, как собран, сколько батарея держит и так далее? Он правда поддерживает CDMA и GSM сразу? И почему он стоит дороже, чем модель ]]>LuxP@d 5719B 3G HD Black]]>, хотя по характеристикам немного проигрывает?
Дата: ВС, 15/09/2013 - 02:30
Зато существует по ]]>этой]]> ссылке.
Дата: ВС, 15/09/2013 - 02:57
В root мне логи, это он! Но что-то там кроме главной страницы ничего не грузится.
P.S. А у меня есть его локальная копия
Дата: ЧТ, 25/02/2016 - 23:33
Kastor, ну ты ведь программист блин, чего фуфло гонишь, не заметил чтоль, что просто ссылки идут на старый ресурс?
Надо просто менять адрес сервера во всех ссылках и всё на ура грузится!
Например навожу на ссыль:
]]>http://liveofpc.ru/publ/3]]>
Правлю на:
]]>http://liveofpc.3dn.ru/publ/3]]>
И всё в ажуре ))))))
Дата: ЧТ, 25/02/2016 - 23:48
Ты три года выяснял как правильно ссылки подменять? Столько времени прошло с моего сообщения...
Дата: ПТ, 26/02/2016 - 00:03
Нет, статья просто обновилась ))))
Дата: ВС, 15/09/2013 - 02:57
to Kastor:
...брал его в прошлом году (ко дню рождения жены) в интернет-магазине "Микротрон" (думаю ты в курсе про такой, он у вас там есть). Ныне это архивная позиция, но тогда это были первые люкспады в городе. Характеристики из описания следующие:
Цитировать
Собран добротно, пленка в комплекте была. Аккум при свежей зарядке и среднем серфинге с просмотром видео держит сутки, может более, это жену спрашивать надо. Просто я набрался наглости и отобрал для тестов его на сей раз
Да, он действительно работает одновременно с двумя сетями GSM и 3G WCDMA. Одной из особенностей является то, что скайп в нем действительно передает и принимает видео, хотя на смарте LG-P500 с андроид только аудио. При исходящих звонках надо выбирать с какой симки звонить. По TTX с современными моделями, честно говоря, не сравнивал, с кризисом и задержками по зпл уже давно не смотрю на подобные игрушки.
p.s.: за FM-передатчик в описании нигде ни слова, но зато какой сюрпрайз
. Синтезатор частот обеспечивает настройку на нужный участок, шаг регулируется. Если бы еще встроенный же FM-тюнер авиа-диапазон хватал (да-да, раскатал губу ...хотя конверторы для переноса спектра типа перемножителей 174ПС1 никто не отменял, подойдет и простой гетеродин, однако это уже увлекся). Работает отлично. ТВ тоже ловит, эфирное ...не цифру конечно.
Дата: ВС, 15/09/2013 - 04:45
Удивительно но как-то мало экзамплов к новой ide
Огромная просьба скиньте пожалуйста линки где есть хоть какие-то примеры и статьи.
Очень интересует одаптация под андроид, работа с системой и особенно долго и упорно ищу любую инфу как получить список контактов с телефона(
благодарю за любые ссылки\блоги.
Дата: ВС, 15/09/2013 - 08:17
raxp красава! оперативно сработал. спасибо за материал!
Дата: ВС, 15/09/2013 - 19:25
Проблема с кириллицей решена. Код в статье скорректирован.
Дата: СР, 18/09/2013 - 20:07
...как бы эту штуку ]]>https://code.google.com/p/android-serialport-api]]> присобачить к SDK, которую XE5 пользует и сделать видимой для доступа?
Дата: ЧТ, 03/10/2013 - 02:52
...походу штатно еще блютуз не прикрутили ]]>https://forums.embarcadero.com/thread.jspa?threadID=92939&tstart=0]]>
Однако можно воспользоваться JNI ]]>http://www.pclviewer.com/android/]]>
Дата: ПТ, 04/10/2013 - 23:50
Проверил эту штуку. В XE5 действительно JNI работает с блютузом, ищет, подключается: к наушнику, телефону и нетбуку.
Пока рулю по блютуз с нетбука своей утилитой:

Дата: СБ, 28/09/2013 - 04:53
Так-с, пришли с Китая модули HC-05 и дуино в комплекте, набросал примитивный скетч и рулю звуком, выходами, моторами по блютуз с ПК, прикручиваю к андрофону.
Дата: СБ, 28/09/2013 - 05:15
Ну ты как игрушку просто это используешь с практическим кодингом или все таки именно железки эти можно с практической ценностью применить? Ну может автоматическое управление аквариумом (включение света, помпы, подача корма, фильтрация воды и т.п.) или какие-то другие идеи? Просто интересно.
Дата: СБ, 28/09/2013 - 15:28
Просим небольшой обзор в студию. Просим, просим...
Дата: Пнд, 09/11/2015 - 03:27
Материал не отображается, глюк
Дата: СБ, 14/11/2015 - 05:12
слетело все оформление...
Дата: ВС, 27/08/2017 - 02:42
Ссылка не работает, обновите пожалуйста
]]>http://raxp.radioliga.com/cnt/s.php?p=and1_res.zip]]>
HTTP ERROR 403
ОШИБКА HTTP 403