Android и сетевые коммуникации

Поддерживайте связь со своим собственным миром

Android, функционально насыщенная платформа для разработки приложений, предлагает широкий спектр элементов пользовательского интерфейса и возможностей по управлению данными. Она предлагает также большой выбор вариантов сетевых соединений для разработки приложений, поддерживающих связь с физическим миром. С чем бы вы хотели установить связь? Может быть, вам хочется поведать миру о своих делах через Twitter? Или получать уведомления о продвижении очереди в местной прачечной или у кассы гастронома? Читайте дальше, если есть желание установить связь внешним миром через Android.

Фрэнк Эйблсон, проектировщик ПО, Независимый разработчик

Когда Фрэнк Эйблсон (Frank Ableson) закончил карьеру баскетболиста в команде своего колледжа, не заключив многолетнего контракта с «Лос-Анджедес Лейкерс», он занялся разработкой компьютерных программ. Он любит решать сложные задачи, особенно из области связи и интерфейсов с аппаратурой. Свободное время Фрэнк проводит со своей женой Никки и детьми. С ним можно связаться по адресу: frank@cfgsolutions.com.



05.03.2010

Введение

Эта статья строится на фундаменте, описанном в руководстве Разработка приложений для Android с помощью Eclipse, и посвящена сетевым возможностям платформы Android. Вы узнаете, как применять сетевые средства Android в интересных и полезных целях. Android - идеальная платформа для разработчиков Java™: чтобы организовать сетевое подключение мобильной или встроенной платформы, им достаточно будет имеющихся навыков.

Из этой статьи вы узнаете о некоторых возможностях сетевой связи, доступных для приложений Android, и об основных приемах подключения Android к телекоммуникационным сетям. Мы рассмотрим реальное приложение мониторинга окружающей среды, требующее подключения к сети. Зачем нужна такая система? Вот пример. Мой друг на несколько недель уехал из города. Будучи в отъезде, он позвонил мне и попросил взять кое-что у него дома и отправить ему по почте. Придя к нему, я обнаружил ужасную картину - отопление отключилось, трубы полопались. Если бы там была установлена система контроля температуры, аварию удалось бы предотвратить. В этой статье анализируется роль, которую Android может играть в подобной системе мониторинга.


Сетевые возможности Android

Платформа Android основана на ядре Linux® и содержит богатый набор сетевых средств. Если вы еще не установили SDK Android, то можете загрузить его, чтобы выполнять примеры.

В таблице 1 приведены некоторые пакеты, относящиеся к сетевым возможностям, которые присутствуют в SDK Android.

Таблица 1. Сетевые пакеты SDK Android
ПакетОписание
java.netСодержит классы, связанные с сетевыми функциями, в том числе сокеты потоков и датаграмм, протокол IP, а также общие средства для работы с HTTP. Это многоцелевой ресурс для работы с сетями. Пользуясь этим знакомым пакетом, опытные Java-разработчики смогут сразу же приступить к созданию приложений.
java.ioЭтот пакет чрезвычайно важен, хотя и не относится непосредственно к сетям. Его классы используются сокетами и соединениями, содержащимися в других пакетах Java. Они используются также для обмена с локальными файлами (что часто происходит при взаимодействии с сетью).
java.nioСодержит классы, которые служат буфером для определенных типов данных. Удобен для организации сетевой связи между двумя конечными точками средствами Java.
org.apache.*Набор пакетов, которые обеспечивают точный контроль и функции для HTTP-коммуникаций. Это Apache - знакомый и популярный Web-сервер с открытым исходным кодом.
android.netСодержит дополнительные сокеты доступа к сети в дополнение к основным классам java.net.*. Этот пакет включает в себя класс URI, который часто используется в разработке приложений Android, выходящих за рамки традиционных сетевых функций.
android.net.httpСодержит классы для работы с сертификатами SSL.
android.net.wifiСодержит классы для реализации всех аспектов WiFi (802.11 Wireless Ethernet) на платформе Android. Не все устройства оснащены возможностями WiFi, особенно учитывая, что Android пробивает себе дорогу в сегмент "раскладушек" от таких производителей сотовых телефонов, как Motorola и LG.
android.telephony.gsmСодержит классы, необходимые для управления (текстовыми) сообщениями SMS и для их передачи. Со временем, вероятно, появятся дополнительные пакеты, предоставляющие аналогичные функции в не-GSM сетях, таких как CDMA, что-то вроде android.telephony.cdma.

Приведенный выше список не является исчерпывающим, но дает общее представление о том, на что способна эта платформа. В следующем разделе рассматривается несколько простых примеров работы с сетями.


Простой пример работы с сетью

Чтобы продемонстрировать, как легко подключить Android к сети, приведем пример извлечения текста из Web-страницы. Загрузите исходный код примера. Рисунок 1 демонстрирует приложение в действии.

Рисунок 1. Извлечение текста из Web-страницы
Извлечение текста из Web-страницы

Этот раздел содержит код, необходимый для построения примера приложения. Сначала рассмотрим аспекты пользовательского интерфейса, а затем разберем код, относящийся к сети.

Здесь имеется три элемента пользовательского интерфейса:

  • EditText позволяет указать Web-страницу (на рисунке 1 и в листинге 2 это страница http://developer.android.com).
  • Кнопка используется, чтобы поручить программе извлечь текст из веб-страницы.
  • Полученные данные отображаются в поле TextView.

В листинге 1 представлен файл main.xml, который представляет собой полный макет интерфейса пользователя для этого приложения.

Листинг 1. main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<EditText 
android:layout_height="wrap_content"
android:id="@+id/address"
android:layout_width="fill_parent"
android:text="http://google.com"
>
</EditText>
<Button
 android:id="@+id/ButtonGo" 
 android:layout_width="wrap_content" 
 android:layout_height="wrap_content"
 android:text="go!"
 >
</Button>
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#ffffff"
    android:textColor="#000000"
	android:id="@+id/pagetext"
    />
</LinearLayout>

В листинге 2 показан код Java для данного примера.

Листинг 2. GetWebPage.java
package com.msi.getwebpage;

import android.app.Activity;
import android.os.Bundle;
// used for interacting with user interface
import android.widget.Button;
import android.widget.TextView;
import android.widget.EditText;
import android.view.View;
// used for passing data 
import android.os.Handler;
import android.os.Message;
// used for connectivity
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
public class GetWebPage extends Activity {
    /** Called when the activity is first created. */

    Handler h;
	
	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        final EditText eText = (EditText) findViewById(R.id.address);
        final TextView tView = (TextView) findViewById(R.id.pagetext);

        this.h = new Handler() {

            @Override
            public void handleMessage(Message msg) {
                // process incoming messages here
                switch (msg.what) {
                    case 0:
                    	tView.append((String) msg.obj);
                    	break;
                }
                super.handleMessage(msg);
            }
        };
        final Button button = (Button) findViewById(R.id.ButtonGo);
        button.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View v) {
            	try	{
            		tView.setText("");
                // Perform action on click
                	URL url = new URL(eText.getText().toString());
                    URLConnection conn = url.openConnection();
                    // Get the response
                    BufferedReader rd = new BufferedReader(new 
InputStreamReader(conn.getInputStream()));
                    String line = "";
                    while ((line = rd.readLine()) != null) {
                		Message lmsg;
                        lmsg = new Message();
                        lmsg.obj = line;
                        lmsg.what = 0;
                        GetWebPage.this.h.sendMessage(lmsg);
                    }
            	}
            	catch (Exception e)	{
            	}
            }
        });        
    }
}

Этот код можно разделить на несколько общих областей. Несколько важных (обязательных) операторов импорта обеспечивают правильные ссылки на используемые в приложении классы пользовательского интерфейса, передаваемых данных и сетевых функций. Весь код, относящийся к работе с сетями, находится в методе OnClick класса OnClickListener. Он извлекается при нажатии кнопки, помеченной на рисунке 1 как go!

Классы URL и URLConnection обеспечивают фактическую связь с выбранным пользователем Web-сайтом. Пример BufferedReader выполняет чтение данных, поступающих через соединение с Web-сайтом. После чтения каждой строки ее текст добавляется к TextView. Эти данные не просто присваиваются TextView (хотя в данном примере это можно было бы сделать). Мы предложили механизм создания объекта сообщения и передачи этого объекта экземпляру обработчика. Этот предпочтительный способ обновления пользовательского интерфейса, особенно в реальных приложениях, где несколько потоков могут выполняться одновременно.

В данном примере приложение Android поддерживает связь с Web-сервером HTTP, таким как Apache или Internet Information Server (IIS на сервере Microsoft®). Если бы приложение непосредственно обращалось к сокету TCP, а не HTTP, его пришлось бы строить иначе. В листинге 3 представлен фрагмент кода, демонстрирующий другие средства взаимодействия с удаленным сервером. Этот код реализован как отдельный поток.

Листинг 3. Клиент времени
    public class Requester extends Thread {
        Socket requestSocket;
        String message;
        StringBuilder returnStringBuffer = new StringBuilder();
        Message lmsg;
        int ch;
        @Override
        public void run() {
            try {
                this.requestSocket = new Socket("remote.servername.com", 13);
                InputStreamReader isr = new InputStreamReader(this.requestSocket.
getInputStream(), "ISO-8859-1");
                while ((this.ch = isr.read()) != -1) {
                    this.returnStringBuffer.append((char) this.ch);
                }
                this.message = this.returnStringBuffer.toString();
                this.lmsg = new Message();
                this.lmsg.obj = this.message;
                this.lmsg.what = 0;
                h.sendMessage(this.lmsg);
                this.requestSocket.close();
            } catch (Exception ee) {
                Log.d("sample application", "failed to read data" + ee.getMessage());
            }
        }
    }

Как и в предыдущем примере, приведенный выше код использует подход сообщения и обработчика для возврата данных отправителю с обновлением пользовательского интерфейса и последующей обработкой. В отличие от кода из листинга 1, этот пример не связывается с сервером HTTP, поэтому класс URLConnection не используется. Вместо этого, с помощью класса более низкого уровня Socket через порт 13 открывается потоковое сокет-соединение с удаленным сервером. Порт 13 представляет собой классическое приложение "сервера времени".

Сервер времени принимает входящее сокет-соединение и возвращает в вызывающий сокет дату и время в текстовом формате. Отправив данные, сервер закрывает сокет. Этот пример демонстрирует также использование метода InputStreamReader и конкретной кодировки.

Еще одна задача, которую можно решать с помощью Android — отправка текстовых сообщений. Пример приведен в листинге 4.

Листинг 4. Отправка текстового сообщения
void sendMessage(String recipient,String myMessage) {
 SmsManager sm = SmsManager.getDefault();
 sm.sendTextMessage("destination number",null,"hello there",null,null);
}

Процесс отправки текстового сообщения предельно прост. Сначала получим ссылку на SmsManager с помощью статического метода getDefault(). Затем применяем метод sendTextMessage. Аргументы:

Номер сотового телефона получателя
Включает код города.
Телефон сервисного центра
Значение null указывает на ваше согласие воспользоваться услугами сервисного центра по умолчанию для обработки сообщений. Во всех приложениях, за исключением самых передовых, используйте для этого параметра значение null.
Ваше сообщение
Длина сообщения должна быть меньше 160 байт, иначе данные будут разбиты на несколько сообщений.
Интент отправки
Факультативное действие (intent), инициируемое после отправки сообщения или в случае ошибки. Если такое уведомление не требуется, этому параметру можно передать значение null. (Более подробные сведения об интентах и основах Android можно получить по ссылкам, приведенным в разделе Ресурсы.)
Интент доставки
Факультативное действие (intent), инициируемое после получения подтверждения доставки. Если такое уведомление не требуется, этому параметру можно передать значение null.

Итак, платформа Android, подключенная к Web-странице или специальному приложению TCP, к вашим услугам. Как показано в листинге 4, передача текстовых сообщений осуществляется очень просто. С помощью факультативных параметров интентов можно также предпринимать какие-то действия, когда сообщение отправлено, а затем - когда оно доставлено. Это мощная функция доступна не на всех мобильных платформах.

Следующий раздел посвящен краткому описанию реального приложения.


Обзор системы мониторинга окружающей среды

Для этого сценария предположим, что вы — управляющий несколькими офисными зданиями, в которых находится ваше предприятие. Управление объектами недвижимости не сильно отличается от управления центром обработки данных – долгие периоды скуки прерываются внезапными авралами. Буквально на днях вам пришлось проводить операцию по уборке кладовки, полной старых компьютеров и учебных пособий, после того как водонагреватель, эксплуатировавшийся 10 лет, протек и залил ее. К счастью, вы были в городе. Будь вы в отъезде, ситуация была бы действительно аховая. Это несчастье и другие, подобные ему, вдохновили вас на идею подумать об использовании Android для наблюдения за состоянием зданий. На рисунке 2 приведена общая блок-схема такой системы.

Рисунок 2. Общая блок-схема системы мониторинга.
Общая блок-схема системы мониторинга.

Эта архитектура — традиционный подход с использованием микроконтроллера и нескольких простых датчиков для сбора данных. Данные передаются в контроллер через последовательный протокол связи, такой как RS232 или RS485. Роль контроллера, вероятно, будет играть ПК или аналогичное устройство. К этим данным можно обращаться через Интернет с помощью брандмауэра. Протоколом связи с телефоном Android (таким как TMobile G1) может служить http или специально разработанная схема связи.

Данные, передаваемые между контроллером и устройством на платформе Android, будут состоять из простых байтов, означающих:

  • присутствие воды;
  • текущую температуру;
  • потребляемую мощность;
  • возможно, некоторые аналоговые и цифровые параметры общего назначения.

Зачем заботиться о потребляемой мощности? Одной из причин может быть возможность того, что кто-то оставил включенным свет, а это увеличивает счет за электроэнергию. Вторая, более серьезная причина: допустим, у вас есть большой морозильник, а электроэнергия отключилась. Это может привести к неприятной ситуации, сопровождающейся большими расходам. Или, например, заело реле кондиционера воздуха, и компьютерный зал остался без охлаждения.

Базовая конструкция выглядит разумно. Что касается использования Android, то его можно заменить почти любой другой мобильной платформой (рисунок 2). Но что, если заменить устройством Android микроконтроллер? В следующем разделе рассматривается расширенное приложение и возможности более серьезного использования Android в данной ситуации.


Расширение приложения

Первая архитектура из этой статьи была организована вокруг микроконтроллера. Микроконтроллеры самых разных форм и размеров, от элементов Microchip 10F с шестью выводами до 32-битных монстров с массой периферии, выводов и памяти для хранения кода. Но что если вместо традиционного микроконтроллера применить устройство под Android? В некоторых случаях могут помешать соображения стоимости, но посмотрите, какие возможности открывает этот подход (рисунок 3)!

Рисунок 3. Возможная архитектура системы с использованием Android
Возможная архитектура системы с использованием Android

Применение Android в качестве встроенного устройства позволяет работать с более богатой средой программирования. Вы можете продолжать контролировать те же характеристики влажности, температуры и потребляемой мощности, но заодно также вести запись аудио, видео и вибрации. Вы получаете мини-сигнализацию, систему контроля доступа и инструмент мониторинга окружающей среды. Так как Android так хорошо взаимодействует с телекоммуникационной сетью, можно обойтись без персонального компьютера и подключить его к сети напрямую.

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

Сегодня Android работает в основном на мобильных телефонах, но эта система портирована на нетбуки и другие платформы. Будем надеяться, что эта статья дала вам пищу для размышлений. Мне пора пойти и включить мою систему мониторинга. Ведь никогда не знаешь, когда протечет очередной водонагреватель.


Заключение

Из этой статьи вы в общих чертах узнали о сетевых возможностях Android. Мы рассмотрели несколько примеров приложений, которые можно создать, включая примеры взаимодействия с Web-сервером и передачей текстовых сообщений. Вы увидели, как можно соединить Android с реальной системой мониторинга окружающей среды. Приведенные примеры кода показали, как можно применять Android-устройства в нетипичных приложениях, например, в качестве встроенного контроллера.

В следующей статье я расскажу, как сделать из телефона на базе Android "электронную няню".


Загрузка

ОписаниеИмяРазмер
Исходный код примера GetWebPageos-android-networking_GetWebPage.zip14 КБ

Ресурсы

Научиться

Получить продукты и технологии

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Мобильные приложения
ArticleID=471737
ArticleTitle=Android и сетевые коммуникации
publish-date=03052010