заглавие | Описание | Ссылка на сайт |
---|---|---|
Приложениям дополненной реальности требуется серверная часть веб-службы. Это 90-дневное без обязательств, абсолютно бесплатное предложение использовать Windows Azure в качестве веб-службы для клиентов Windows 8. | Вы получаете: Compute / 750 небольших вычислительных часов в месяц, веб-сайты / 10 веб-сайтов, мобильные сервисы / 10 мобильных сервисов, реляционная база данных / 1 база данных SQL, отчеты SQL / 100 часов в месяц, хранилище / 35 ГБ с 50 000 000 транзакций хранения, пропускная способность / неограниченный входящий и 25 ГБ исходящий, CDN / 20 ГБ исходящий с 500 000 транзакций, кэш / 128 МБ, служебная шина / 1500 часов ретрансляции и 500 000 сообщений | http://www.microsoft.com/click/services /Redirect2.ashx?CR_CC=200114759 |
Шаг 0: Что мы будем строить. Дополненная реальность, Windows 8 и облачные вычисления — как реализовать с реальным кодом | Введение высокого уровня в наше законченное приложение. | http://blogs.msdn.com/b/brunoterkaly/archive/2012 / 11/05 / step-0-что-мы-будем-строить- дополненную реальность-windows-8-and-cloud-computing-how-how- в реализации-с реальной code.aspx # |
Шаг 1 — Дополненная реальность, Windows 8 и облачные вычисления — Как реализовать с реальным кодом | Вступление. Что такое дополненная реальность | http://blogs.msdn.com/b/brunoterkaly/archive/2012/10/29/ шаг-1-дополненная реальность-окна-8-и-облачные вычисления- как реализовать с реальным- code.aspx # |
Шаг 2 — Дополненная реальность, Windows 8 и облачные вычисления — Как реализовать с реальным кодом | Сборка первой части нашего бэкэнда Azure. | http://blogs.msdn.com/b/brunoterkaly/archive/2012/10/30/ step-2-augmented-reality-windows-8-and- cloud-computing-как реализовать с реальными code.aspx # |
Шаг 3 — Дополненная реальность, Windows 8 и облачные вычисления — Как реализовать с реальным кодом (Внедрение облачной среды) | В этом посте представлен весь исходный код и пояснения для серверной части Azure. Это серверная часть для Windows 8 Client дополненной реальности. | http://blogs.msdn.com/b/brunoterkaly/archive/2012/11/05 / step-3-augmented-reality-windows-8-and-cloud-computing-как реализовать с реальными реализующий код из облака-обратно-end.aspx # |
Шаг 4 — Дополненная реальность, Windows 8 и облачные вычисления — Как реализовать с реальным кодом … | Этот пост содержит весь исходный код и пояснения для клиента Windows 8 (демонстрация дополненной реальности). Клиент дополненной реальности Windows 8 обращается к бэкэнду Azure, описанному в шаге 3 выше. | http://blogs.msdn.com/b/brunoterkaly/archive/2012/11/06/ шаг-4-дополненная реальность-окна-8-и-облачные вычисления-как реализовать с реальными- код реализации Windows-8-client.aspx # |
Исходный код — серверная часть веб-службы | Это проект Windows Azure, к которому обращаются клиенты Windows 8 | http://sdrv.ms/Qoqb1J |
Исходный код — клиент Windows 8 | Это клиент дополненной реальности для Windows 8 | http://sdrv.ms/T38uBC |
Это готовый клиент дополненной реальности.
- Я выполнил код . Теперь пришло время рассказать об этом в блоге.
- Обратите внимание на то, что в дополнение к живой фотографии перегружены данные дополненной реальности.
- У этого также есть спутниковое изображение
- Вы можете использовать симулятор GPS, чтобы изменить местоположение
- В моей системе нет устройства GPS, а у вас, вероятно, нет
- Отображаемая информация представляет собой совокупность Карт Google и информации от Национального управления океанических и атмосферных исследований.
- Я предоставлю весь исходный код.
Увеличение данных дополненной реальности
- Немного лучшее разрешение, чтобы увидеть, что происходит.
Это Windows Azure Back-end
- Он размещен в Microsoft Data Center
- Изображение выше работает локально (в эмуляторе)
- Это работающее приложение может быть масштабировано для удовлетворения любых требований клиентов Windows 8
- Стиль приложения Azure (MVC Web API) описан в следующих статьях.
Архитектура приложения
- Мы создадим Windows 8 Client в следующем посте
- Вот где на самом деле происходит дополненная реальность
- Наш уровень веб-служб поддерживает наш клиент Windows 8
- Мы развернем этот уровень в Microsoft Data Center
- Уровень обслуживания приложений будет Google Maps и Национальное агентство по океанической атмосфере (NOAA)
- Это может быть так же легко Bing Maps
- На самом деле, есть много, много вариантов здесь http://www.programmableweb.com/
- Это может быть спроектировано для еще большего масштаба.
- Вы можете использовать очереди сообщений и фоновые процессы (рабочие роли)
- В настоящее время он использует многопоточность для параллельного просмотра данных.
- Это означает, что я звоню в Google Maps и NOAA одновременно, используя .NET Tasks
- Следующим шагом является завершение построения облачного сервера.
- Оттуда я покажу код позади клиента Windows 8
Сосредоточение внимания на облачной Back-End
- На шаге 2 вы можете увидеть, как создать:
- Облачный проект Windows Azure с:
1 MVC 4 Веб-роль
Тип веб-роли = ASP.NET Web API
Запуск сервера
- Это облачное приложение Windows Azure
- Ранее было опубликовано здесь
- Шаг 2 — Дополненная реальность, Windows 8 и облачные вычисления — Как реализовать с реальным кодом
- http://blogs.msdn.com/b/brunoterkaly/archive/2012/10/30/step-2-augmented-reality-windows-8-and-cloud-computing-how-to-implement-with-real- code.aspx
- Но нам нужно добавить больше к этому проекту.
Visual Studio 2012 — обозреватель решений
- Вы можете увидеть одно решение с двумя проектами:
- Проект 1: Location_WebRole
- Здесь мы делаем всю работу, добавляя код
- Проект 2: LocationWebService
- Это проект конфигурации, который позволяет нам масштабировать наше приложение после его развертывания в облаке.
- Проект 1: Location_WebRole
Как создать серверную часть облачного приложения Azure
- Мы собираемся сделать 3 вещи здесь:
- Изменить существующие файлы
- Добавить папку для хранения нашего кода
- Добавить новые классы
- Изменить файлы
- ValuesController.cs
- Добавить папку
- HelperObjects
- Добавить классы (HelperObjects)
- CityFromGps.cs
- DataExtractor.cs
- LocationInfo.cs
ValuesController.cs
- Это точка входа для клиентов, совершающих http-вызовы.
- Нам нужен только один метод.
- Метод Get () отвечает на запросы клиентов Windows 8
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; using Location_WebRole.HelperObjects; namespace Location_WebRole.Controllers { public class ValuesController : ApiController { // location contains lat/long, "37.788345,-122.404679", for example public LocationInfo Get(string location) { string[] columns = location.Split(','); CityFromGps city = new CityFromGps(); return city.ReverseGeoLoc(columns[1], columns[0]); } } }
Код прохождение |
Линия 11 | ValuesController.cs был создан Visual Studio при создании проекта. Это точка входа для клиентских запросов Windows 8. |
Линия 14 | У нас есть только один метод Get () . Это выполняется автоматически клиентами Windows 8. Клиент Windows выдаст команды в таблице A |
Строка 16 | Разделите GPS-координаты. столбцы [0] будут 37,785530, а столбцы [1] будут -122,405672 |
Строка 17 | Наш вспомогательный класс, который фактически выполняет всю обработку |
Линия 18 | Верните ответы JSON обратно в клиент Windows 8 |
Таблица А |
Наш облачный проект работает в эмуляторе | http://127.0.0.1:81/api/values?location=37.785530,-122.405672 |
Наш облачный проект работает в Microsoft Data Center | http://locationwebservice.cloudapp.net/api/values?location=37.785530,-122.405672 |
Основная рабочая лошадка — CityFromGps.cs
- Этот класс делает большую часть тяжелой работы.
- В нем используются методы параллельного программирования для проведения сопоставлений данных.
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Http; using System.Net.Http.Formatting; using System.Text; using System.Threading.Tasks; using System.Xml; using Location_WebRole.HelperObjects; namespace Location_WebRole.Controllers { // My custom string manipulator. Nows how to parse all the XML structures public class CityFromGps { // Method that does all the lookups based on longitude and latitude. public LocationInfo ReverseGeoLoc(string longitude, string latitude) { // Return data is LocationInfo LocationInfo loc_info = new LocationInfo(); DataExtractor de = new DataExtractor(); // a helper class to make this threading code readable loc_info.longitude = longitude; loc_info.latitude = latitude; try { // // Get Data // XmlDocument[] xmldocs = new XmlDocument[3] { new XmlDocument(), new XmlDocument(), new XmlDocument() }; Task<string>[] tasks = new Task<string>[3] { Task<string>.Factory.StartNew(() => { xmldocs[0].Load("http://maps.googleapis.com/maps/api/elevation/xml?locations=" + latitude + "," + longitude + "&sensor=false"); XmlNodeList weatherList = xmldocs[0].SelectNodes("//ElevationResponse/result"); loc_info.elevation = (Convert.ToDouble(weatherList[0]["elevation"].InnerText) * 3.2808399).ToString(); return ""; }), Task<string>.Factory.StartNew(() => { // Get Transit and Neighborhood Info xmldocs[1].Load(string.Format("http://maps.googleapis.com/maps/api/geocode/xml?latlng={0},{1}&sensor=false", latitude, longitude)); loc_info.bus_and_neighborhood = de.GetTransitAndNeighborhood(xmldocs[1]); return ""; }), Task<string>.Factory.StartNew(() => { // Get Weather Info xmldocs[2].Load(string.Format("http://graphical.weather.gov/xml/sample_products/browser_interface/ndfdXMLclient.php?lat={0}&lon={1}&product=time-series&maxt=maxt&mint=mint", latitude, longitude)); loc_info.max_temp = de.GetMaxTemp(xmldocs[2]); loc_info.min_temp = de.GetMinTemp(xmldocs[2]); return ""; }) }; //Block until all tasks complete. This is much faster. Task.WaitAll(tasks); return loc_info; } catch (Exception ex) { loc_info.error = "(Location lookup failed: ) " + ex.Message; return loc_info; } } } }
Код прохождение |
Строки с 1 по 10 | Нужно с помощью утверждений |
Линия 15 | Класс CityFromGps, который мы добавили |
Линия 19 | Метод ReverseGeoLoc (). Он возвращает данные в формате JSON для LocationInfo (класс, который нам еще нужно добавить). Требуется два параметра: логит и широта. Он выполнит ряд проверок в отношении других веб-сервисов, таких как Google Maps и NOAA (NOAA — Национальное управление океанических и атмосферных исследований). |
Линии 22 и 23 | Создайте объекты-помощники. LocationInfo будет содержать результаты наших поисков данных. Он будет держать температуру, высоту, город и т. Д. |
Линия 33 | Объекты XmlDocument, которые будут использоваться для поиска в веб-сервисах |
Линии 37, 44, 51 | 3 Запускаются задачи (параллельные потоки, если достаточно ядер), которые работают параллельно, выполняя поиск по веб-сервисам. |
Линии 40-41, 47-48, 54-56 | Фактические поиски. Здесь происходит фактический вызов Google Maps и NOAA. |
Линия 61 | Дождитесь завершения всех задач. Эта строка гарантирует, что мы продолжим только после того, как все 3 задачи будут выполнены. |
Линия 62 | Вернуть объект LocationInfo, который теперь заполнен данными. Веб-API ASP.NET автоматически превращает этот объект в формат JSON. |
DataExtractor.cs и LocationInfo.cs
- DataExtractor.cs раскрывает сложность парсинга XML и получения необходимых нам ответов.
- Например, максимальная температура, минимальная температура, высота и т. Д.
- LocationInfo.cs представляет данные, возвращающиеся клиенту Windows 8
- Это в формате JSON.
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Xml; namespace Location_WebRole.Controllers { public class DataExtractor { public string GetTransitAndNeighborhood(XmlDocument doc) { string result = ""; bool foundneighborhood = false; bool foundbus = false; XmlNodeList xnList = doc.SelectNodes("//GeocodeResponse/result/address_component"); foreach (XmlNode xn in xnList) { try { switch (xn["type"].InnerText) { //Add whatever you are looking for below case "bus_station": { if (foundbus) break; if (result != "") result += ", "; result += "Bus: " + xn["long_name"].InnerText; foundbus = true; break; } case "neighborhood": { if (foundneighborhood) break; if (result != "") result += ", "; result += "Neighborhood: " + xn["long_name"].InnerText + " (" + xn["short_name"].InnerText + ")"; foundneighborhood = true; break; } default: break; } } catch (Exception e) { } } return result; } internal string GetMaxTemp(XmlDocument doc) { XmlNodeList xnList = doc.SelectNodes("//dwml/data/parameters/temperature"); return xnList[0]["value"].InnerText; // offset 0 is max temps } internal string GetMinTemp(XmlDocument doc) { XmlNodeList xnList = doc.SelectNodes("//dwml/data/parameters/temperature"); return xnList[1]["value"].InnerText; // offset 1 is min temps } } }
Код прохождение |
Линия 11 | Метод, который возвращает информацию об автобусной остановке и окрестностях. |
Линия 60 | Метод, который возвращает информацию о максимальной температуре из NOAA |
Линия 65 | Метод, который возвращает информацию о минимальной температуре из NOAA |
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Http; using System.Net.Http.Formatting; using System.Web; namespace Location_WebRole.HelperObjects { public class LocationInfo { // Data we will lookup public string latitude { get; set; } public string longitude { get; set; } public string elevation { get; set; } public string bus_and_neighborhood { get; set; } public string max_temp { get; set; } public string min_temp { get; set; } public string error { get; set; } } }
Код прохождение |
Линия 11 | Наша структура LocationInfo.
Это будет возвращено клиенту Windows 8, заполненному данными. Веб-API ASP.NET автоматически преобразует этот объект в формат JSON. |