Статьи

Дополненная реальность, Windows 8 и облачные вычисления. Часть 3. Облачный бэкэнд

заглавие Описание Ссылка на сайт
Приложениям дополненной реальности требуется серверная часть веб-службы. Это 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

Это готовый клиент дополненной реальности. 

образ

  1. Я  выполнил код . Теперь пришло время рассказать об этом в блоге.
  2. Обратите внимание на то, что в дополнение к живой фотографии перегружены данные дополненной реальности.
  3. У этого также есть спутниковое изображение
  4. Вы можете использовать  симулятор GPS,  чтобы изменить местоположение

    • В моей системе нет устройства GPS, а у вас, вероятно, нет
  5. Отображаемая информация представляет собой совокупность Карт Google и информации от Национального управления океанических и атмосферных исследований.
  6. Я предоставлю весь исходный код.

Увеличение данных дополненной реальности 

002

  1. Немного лучшее разрешение, чтобы увидеть, что происходит.

Это Windows Azure Back-end 

003

  1. Он размещен в Microsoft Data Center
  2. Изображение выше работает локально (в эмуляторе)
  3. Это работающее приложение может быть масштабировано для удовлетворения любых требований клиентов Windows 8
  4. Стиль приложения Azure (MVC Web API) описан в следующих статьях.

Архитектура приложения 

образ

  1. Мы создадим Windows 8 Client в следующем посте

    • Вот где на самом деле происходит дополненная реальность
  2. Наш уровень веб-служб поддерживает наш клиент Windows 8

    • Мы развернем этот уровень в Microsoft Data Center
  3. Уровень обслуживания приложений будет Google Maps и Национальное агентство по океанической атмосфере (NOAA)

    • Это может быть так же легко Bing Maps
    • На самом деле, есть много, много вариантов здесь http://www.programmableweb.com/
  4. Это может быть спроектировано для еще большего масштаба.

    • Вы можете использовать очереди сообщений и фоновые процессы (рабочие роли)
  5. В настоящее время он использует многопоточность для параллельного просмотра данных.

    • Это означает, что я звоню в Google Maps и NOAA одновременно, используя .NET Tasks
  6. Следующим шагом является завершение построения облачного сервера.
  7. Оттуда я покажу код позади клиента Windows 8

Сосредоточение внимания на облачной Back-End 

образ

  1. На шаге 2 вы можете увидеть, как создать:

    • Облачный проект Windows Azure с:

  1 MVC 4 Веб-роль

  Тип веб-роли = ASP.NET Web API


Запуск сервера 

образ

  1. Это облачное приложение Windows Azure
  2. Ранее было опубликовано здесь

  3. Но нам нужно добавить больше к этому проекту.

Visual Studio 2012 — обозреватель решений 

образ

  1. Вы можете увидеть одно решение с двумя проектами:

    • Проект 1: Location_WebRole

      • Здесь мы делаем всю работу, добавляя код
    • Проект 2: LocationWebService

      • Это проект конфигурации, который позволяет нам масштабировать наше приложение после его развертывания в облаке.

Как создать серверную часть облачного приложения Azure 

образ

  1. Мы собираемся сделать 3 вещи здесь:
    • Изменить существующие файлы
    • Добавить папку для хранения нашего кода
    • Добавить новые классы
  2. Изменить файлы
    • ValuesController.cs
  3. Добавить папку
    • HelperObjects
  4. Добавить классы (HelperObjects)
    • CityFromGps.cs
    • DataExtractor.cs
    • LocationInfo.cs

ValuesController.cs 

образ

  1. Это точка входа для клиентов, совершающих http-вызовы.
  2. Нам нужен только один метод.

    • Метод 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 

011

  1. Этот класс делает большую часть тяжелой работы.
  2. В нем используются методы параллельного программирования для проведения сопоставлений данных.

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 

013

  1. DataExtractor.cs раскрывает  сложность парсинга XML и получения необходимых нам ответов.

    • Например, максимальная температура, минимальная температура, высота и т. Д.
  2. 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.