Статьи

Интеграция Twilio с @Home в Windows Azure

Я начал этот пост около двух месяцев назад (сразу после встречи с Джоном Готфридом , одним из евангелистов Twilio , в Boston Startup Weekend ), но потребовалось вчерашнее объявление, чтобы зажечь огонь подо мной и закончить его!

В случае, если вы не знакомы с @Home с Windows Azure , это проект, который мои коллеги Брайан Хитни , Питер Лаудати и я вместе разработали, который использует Windows Azure для участия в медицинском исследовательском проекте Стэнфорда Folding @ homeМы проведем вас через развертывание простого приложения Windows Azure для бесплатной 90-дневной пробной версии или учетной записи MSDN , и, в свою очередь, ваш код вносит циклы вычислений в проект Stanford. 

Вы можете отслеживать свой вклад, проверив веб-сайт, который вы развернете в рамках приложения, которое мы вам даем, но где в этом удовольствие? Разве не круто получать обновления каждый раз, когда задание Folding @ home завершается, и / или иметь возможность запрашивать обновление статуса, где бы вы ни находились, прямо с вашего мобильного телефона? Конечно, это будет! Введите Twilio и его возможности SMS.

TwilioВ этой статье я расскажу о шагах, которые я предпринял, чтобы начать работу с пробной учетной записью Twilio, и об изменениях, внесенных в исходный код @home с кодом Windows Azure, чтобы включить функции, которые

  • отправлять SMS-сообщения на мой мобильный телефон всякий раз, когда выполняется задание Folding @ home, и
  • Позвольте мне отправить текстовое сообщение и получить информацию о ходе выполнения текущих заданий сворачивания.

Настройка вашей учетной записи Twilio

Это как можно проще. Просто нажмите на Started Получить кнопку на странице регистрации Twilio в , введите ваше имя, адрес электронной почты и пароль, и вы. Вы будете иметь бесплатную учетную запись в этой точке, и , как упоминалось в объявлении вчера, вы получите кредит на 1000 текстов или входящих минут при обновлении с этой бесплатной учетной записи. Вам не нужно делать обновление сейчас, чтобы понять, как все это работает.

Как только ваша учетная запись будет настроена, вы увидите свою панель инструментов (ниже), которая включает в себя ссылки для начала работы, аналитику и, самое главное, учетные данные вашей учетной записи и приложение-песочницу. Приложение «песочница» дает вам телефонный номер, который вы можете использовать для отправки и получения текстовых и голосовых сообщений для разработки и тестирования.

Twilio Dashboard

Поскольку вы используете пробную учетную запись с приложением «песочница», существует несколько ограничений на использование; они исчезают, когда вы покупаете номер и переходите на платный аккаунт. В частности,


  1. Вы должны подтвердить свои номера, чтобы отправлять им текстовые сообщения.
    Сделайте это на вкладке «
    Подтвержденный номер » в
    меню «
    Номера» . После того, как вы введете свой номер, вы увидите код подтверждения на экране и получите телефонный звонок на введенный вами номер. Ответьте на этот звонок, введите проверочный код, и ваш номер теперь сможет отправлять и получать сообщения.
    Белый список "до" номера

  2. Всякий раз, когда вы отправляете текстовое сообщение со своего телефона в приложение песочницы Twilio, вы должны будете предварять это сообщение PIN-кодом песочницы, который вы видите на своей панели инструментов.

    Поиск вашего PIN песочницы

 

Получение клиентских библиотек Twilio

Twilio предоставляет свои возможности SMS и телефонии через конечные точки REST и Twilio Markup XML (TwiML) , поэтому из этого следует, что вы можете создать клиентское приложение, используя практически любой язык программирования или среду, которая может говорить на HTTP и XML, например, на C #. 

Работа с HTTP программно, хотя и утомительна. Конечно, вы можете использовать HttpWebRequest и обрабатывать заголовки запросов, тело, код состояния и т. Д., Но зачем это делать, когда есть пакет NuGet помощника Twilio REST API ?

Вы можете найти и установить пакет Twilio с помощью опции контекстного меню Manage NuGet Packages… в проекте AtHomeWebRole , которая приводит к следующему диалоговому окну:

Панель NuGet UI

или просто используйте консоль диспетчера пакетов

Консоль диспетчера пакетов

Это включает вспомогательные библиотеки Twilio (которые абстрагируют вызовы HTTP REST), а также их зависимости, такие как Json.NET и RestSharp .

Напишите немного кода!

Есть две вещи, которые я хочу сделать:

  1. Пусть @home уведомит меня через текстовое сообщение о том, что фальцовка завершена. Это означает, что я набрал больше очков, поэтому я могу проверить свой текущий статус среди всех остальных папок.
  2. Позвольте мне отправить текст @home, чтобы выяснить, как далеко продвигается текущая рабочая единица, и получить другую информацию о том, насколько мое развертывание внесло вклад в проект Стэнфорда.

Отправка смс сообщения через Twilio

Некоторое время назад я написал обширную серию блогов о первой версии @home с Windows Azure . Недавнее воплощение немного проще (единственная веб-роль), но общий рабочий процесс тот же — по существу, поток непрерывно зацикливается в веб-роли, вызывая консольный клиент Folding @ home из командной строки Стэнфорда . Веб-роль Azure постоянно проверяет, завершен ли клиентский процесс консоли. Когда процесс завершается успешно (то есть рабочая единица выполнена), веб-роль просто запускает другой процесс и единицу работы до бесконечности .

В процессе опроса роль Azure проверяет процент выполнения, записанный в небольшом текстовом файле, который клиент Stanford обновляет по мере выполнения, и записывает это значение в учетную запись хранения таблицы Azure, связанную с развернутым приложением ( UpdateLocalStatus, строка 324). ниже) и SQL Azure, который является частью основного сайта @home ( UpdateServerStatus , строка 325 ниже). Если вы посмотрите на исходный код , все это происходит в методе запуска FoldingClient.cs .

   // when work unit completes successfully
   if (exeProcess.ExitCode == 0)
   {
       // make last update for completed role
       FoldingClientStatus status = ReadStatusFile();
    
       if (!status.HasParseError)
       {
           UpdateLocalStatus(status);
           UpdateServerStatus(status);
       }
   }
   else

Это условие IF выше, которое определяет, когда фальцовка завершена, поэтому нам нужно отправить SMS сразу после обновления статуса локального сервера и сервера. Вот модифицированный код с выделенными дополнениями (и одним изменением).

  // when work unit completes successfully
  if (exeProcess.ExitCode == 0)
  {
      // make last update for completed role
      FoldingClientStatus status = ReadStatusFile();
   
      if (!status.HasParseError)
      {
          WorkUnit workUnit = UpdateLocalStatus(status);
          UpdateServerStatus(status);
   
          TimeSpan duration = workUnit.CompleteTime.Value - workUnit.StartTime;
          String msg = String.Format("WU completed{4}{0}/{1}{4}duration: {2:#0}h {3:00}m",
                              status.Name, status.Tag, duration.TotalHours, 
                              duration.Minutes, Environment.NewLine);
          TwilioRestClient client = new TwilioRestClient(
              "ACcdd159...9a237", "fde24...d14");
          client.SendSmsMessage("415-000-0000", "508-000-0000", msg);
      }
  }
  else

В строке 324 вы заметите, что в UpdateLocalStatus была внесена модификация, чтобы возвращать информацию о рабочей единице для использования позже в этом методе. Для этого изменения потребовалось изменить тип возвращаемого значения этого метода с void на WorkUnit и вернуть экземпляр класса рабочих единиц, который ранее использовался только в качестве локальной переменной в этом методе.

Большая часть кода добавлена ​​для создания текста SMS! Для отправки SMS требуется всего две строки кода — одна для создания клиентского прокси Twilio, передачи SID и токена вашей учетной записи Twilio, а другая — для отправки сообщения с номера учетной записи песочницы на номер сотового телефона, который вы ранее явно подтвердили. , 

Вот как все это намечается; Конечно, вы не будете жестко задавать значения, подобные этим, и, вероятно, вместо этого будете использовать пользовательские параметры конфигурации службы, которые вы определили в ServiceDefinition.csdef и ServiceConfiguration.cscfg.

Источники параметров API Twilio

Макет полученного текстового сообщенияТеперь, когда каждый вызов клиента Folding @ home завершается, я получаю на телефон текстовое сообщение, которое выглядит примерно так, как вы видите справа. Префикс «Отправлено с номера песочницы Twilio» является еще одной «функцией» пробной учетной записи; когда вы переходите на платную учетную запись, это уходит.

Между прочим, вам также не нужно развертывать это в Azure. Фактически, чтобы получить различные снимки экрана для этого поста, я использовал эмулятор Windows Azure и клиент фиктивного свертывания, который мы поставляем с @home с Windows Azure .

Получение SMS-сообщения в Twilio

То, что мы только что реализовали, было отправленным сообщением, вызванным завершением рабочего блока. Folding @ домашних единиц может занять несколько часов , чтобы закончить , хотя, и то , что если вы хотите знать , прямо сейчас , как далеко работа есть? Теперь вместо приложения, инициирующего SMS, вы хотите, чтобы конечный пользователь сделал это со своего телефона и получил ответ от приложения @home.

Отправка текста достаточно проста, просто отправьте его на номер «Песочница» (с префиксом PIN-кода «Песочница» для пробных учетных записей), но, конечно, вам нужно что-то на другом конце, чтобы интерпретировать текст и действовать в соответствии с ним. Вот где приходят два URL-адреса на панели мониторинга. Эти URL-адреса являются конечными точками для служб REST, которые отвечают на SMS или голосовые сообщения, отправленные проверенным отправителем. Сервисы по умолчанию просто отображают / воспроизводят приветственное сообщение, поэтому нам нужно сделать что-то более сложное, что-то, что принимает SMS-сообщение пользователя в качестве входного и отправляет ответное SMS-сообщение, содержащее соответствующую статистику @home.

There are a number of different ways we could write such a service, with the new ASP.NET Web API perhaps at the top of the list.  Rather that get sidetracked by yet another new and cool technology though, I’m going to keep it simple (albeit a bit kludgy) and just add a simple ASP.NET ASPX page to AtHomeWebRole (which is essentially an ASP.NET Web Forms application).  The page, SMSStatus.aspx, doesn’t have any markup, just a Page_Load method:

  protected void Page_Load(object sender, EventArgs e)
  {
      String command = Request["Body"].Trim();
      String outgoingMsg = String.Empty;
   
      switch (command)
      {
          case "current":
              outgoingMsg = "<current status goes here>";
              break;
          case "total":
              outgoingMsg = “<total contribution to date>";
              break;
          default:
              outgoingMsg = String.Format("invalid request: {0}", command);
              break;
      }
   
      Response.Write(String.Format(@"<?xml version=""1.0"" encoding=""UTF-8""?>
          <Response>    
          <Sms>{0}</Sms>
          </Response>
          ", Server.HtmlEncode(outgoingMsg)));
  }

This code will process two messages sent via SMS from a user.  When the word “current” is texted (prefaced by the Sandbox PIN for a trial account), a response will be sent consisting of the message seen on Line 9.  Likewise, when the word “total” is texted, the user will receive a reply message shown on Line 12. 

Of course, these are all hardcoded strings for illustration; in my actual deployment, I’m calling a method to process each message and pulling information from Windows Azure Storage to provide the current percentage complete of a work unit, total number of folding jobs running, number complete, etc. – processing similar to what occurs to build the Status.aspx page that’s part of the same @home with Windows Azure project.  Obviously, you can do whatever processing you want, just as long as you wrap up your response in TwiML as you see on Line 19ff.

The last step here is to indicate that this ASPX page should be the desired target to be executed whenever a text is sent to the Sandbox number.   That association is made in the Twilio Dashboard, by specifying the location of SMSStatus.aspx as the SMS URL.  Of course, at this point you can’t test this (easily) within the local Windows Azure emulator, because http://localhost won’t be resolvable, I deployed my updated @home at Windows Azure solution to http://twiliotest.cloudapp.net, and so the complete SMS URL is:

http://twiliotest.cloudapp.net/SMSStatus.aspx

Указание конечной точки URL-адреса SMS

Now I can start texting my application!

Макет SMS-разговора Twilio на Windows Phone

Wrap Up

I hope the article provided some useful insight into how easy it is to incorporate Twilio into a Windows Azure application.  I didn’t touch on the voice aspects, but the process would be quite similar, and you could dial in from a landline (if you can find one) and get your @home with Windows Azure stats. 

Twilio also has an offering called Twilio Connect which makes building and pricing SaaS applications that much easier.  Instead of you having to provision a number and metering the billing among your clients, Twilio Connect enables your application to tap into your customers’ existing Twilio accounts via OAuth, so you don’t have to figure out how to split up your one big end-of-the-month bill across all of the clients that used your SaaS application.

Give it a shot, and if you have questions or issues getting it set up, let me know.

@home with Windows Azure is great (and meaningful) project to get started with Windows Azure – and now Twilio as well!