В этот раз речь пойдет об использовании сервиса Connection Manager, который позволяет определить состояние подключения к сети. В WebOS существует возможность узнать состояние подключения к:

  • Bluetoot
  • Wi-Fi
  • WAN

Использовать сервис Connection Manager можно как для одноразового получения состояния сетевых подключений, так и для подписки на уведомление об изменении состояния подключений.Для определения текущего состояния сетевых соединений необходимо вызвать метод serviceRequest() объекта-контроллера, в который передать идентификатор сервиса Connection Manager, а также JSON-объект с параметрами вызова сервиса. Параметры вызова сервиса могут быть такими:

  • method – обязательный параметр. У сервиса Connection Manager есть всего один метод – getstatus.
  • parameters – JSON-объект, который будет передан в качестве параметра методу getstatus. У этого объекта есть одно значимое булевое свойство – subscribe. Если свойство subscribe имеет значение true, то будет выполнена подписка на уведомления об изменении состояния подключений. При каждом изменении состояния будет вызвана наша callback-функция.
  • onSuccess – callback-функция, вызываемая при успешном завершении запроса состояния подключений.
  • onFailure – callback-функция, вызываемая если запрос состояния подключений завершился с ошибкой.

Пример вызова Connection Manager

this.controller.serviceRequest('palm://com.palm.connectionmanager', {
    method: 'getstatus',
    parameters: {subscribe:true},
    onSuccess: this.handleOKResponse.bind(this),
    onFailure: this.handleErrResponse
});

Теперь рассмотрим более детально callback-функции, вызываемые при завершении запроса состояния соединения.

onSuccess

Callback-функция onSuccess принимает в качестве параметра объект, содержащий информацию о состоянии подключений. Этот объект содержит такие поля:

Свойство Тип Описание
errorCode integer Код завершения операции проверки статуса подключения.
errorText string Описание ошибки если errorCode содержит ненулевое значение.
isInternetConnectionAvailable boolean Содержит значение true если есть подключение к Internet.
returnValue boolean true если была выполнена подписка на уведомление об изменении состояния подключений. Может быть получено только первый раз при выполнении подписки.
wifi object Содержит информацию о подключении к Wi-Fi.
btpan object Содержит информацию о подключении к Bluetooth.
wan object Содержит информацию о подключении к WAN.

Теперь посмотрим что можно узнать о подключениях:

Свойства объекта btpan
Свойство Тип Описание
ipAddress string IP-адрес в сети Bluetooth PAN.
panUser string Содержит название клиента сети Bluetooth PAN, подключенного к устройству.
state string Имеет значение “connected” если соединение есть и “disconnected” если соединения нет.
Свойства объекта wifi
Свойство Тип Описание
bssid string Basic service set identifier (BSSID) точки доступа.
ipAddress string IP-адрес в сети Wi-Fi.
ssid string Service set identifier (BSSID) точки доступа.
state string Имеет значение “connected” если соединение есть и “disconnected” если соединения нет.
Свойства объекта wan
Свойство Тип Описание
ipAddress string IP-адрес в сети WAN.
network string Сожет иметь значения: “unknown”, “unusable”, “gprs”, “edge”, “umts”, “hsdpa”, “1x”, or “evdo.”
Внимание: значение “unusable” используется в случае если интерфейс WAN подключен, но данніе не могут быть отправлены или получены по каким-либо причинам.
state string Имеет значение “connected” если соединение есть и “disconnected” если соединения нет.

onFailure

Callback-функция onFailure принимает в качетве параметра объект, содержащий информацию об ошибке. Свойства этого объекта приведены ниже:

Свойство Тип Описание
errorCode string Строка, содержащая код ошибки:

  1. Неизвестная ошибка.
  2. Ошибка подписки на уведомления о состоянии соединения.
errorText string Строка, содержащая описание ошибки.
returnValue boolean false

Пример использования

С теоретической частью мы закончили. Теперь рассмотрим пример.

Создадим новый проект и в нем сцену с названием first.

app/views/first/first-scene.html

<div id="SubscribeButton" x-mojo-element="Button"></div>
<div id="area-to-update"></div>
<div class="palm-inline-error" style="display:none" id="ErrorMessage">
<div class="error-message">Unable to subscribe to Connection Manager's event.</div>
</div>

<div class="palm-group">
  <div class="palm-group-title">Wi-Fi</div>
  <div class="palm-list">
    <div class="palm-row first">
      <div class="palm-row-wrapper textfield-group" x-mojo-focus-highlight="true">
        <div class="title">
          <div class="label">IP Address</div>
          <div id="WiFiIPTextBox" x-mojo-element="TextField"></div>
        </div>
      </div>
    </div>
    <div class="palm-row">
      <div class="palm-row-wrapper textfield-group" x-mojo-focus-highlight="true">
        <div class="title">
          <div class="label">BSSID</div>
          <div id="WiFiBSSIDTextBox" x-mojo-element="TextField"></div>
        </div>
      </div>
    </div>
    <div class="palm-row">
      <div class="palm-row-wrapper textfield-group" x-mojo-focus-highlight="true">
        <div class="title">
          <div class="label">SSID</div>
          <div id="WiFiSSIDTextBox" x-mojo-element="TextField"></div>
        </div>
      </div>
    </div>
    <div class="palm-row last">
      <div class="palm-row-wrapper textfield-group" x-mojo-focus-highlight="true">
        <div class="title">
          <div class="label">State</div>
          <div id="WiFiStateTextBox" x-mojo-element="TextField"></div>
        </div>
      </div>
    </div>
  </div>
</div>

<div class="palm-group">
  <div class="palm-group-title">Bluetooth</div>
  <div class="palm-list">
    <div class="palm-row first">
      <div class="palm-row-wrapper textfield-group" x-mojo-focus-highlight="true">
        <div class="title">
          <div class="label">IP Address</div>
          <div id="BTPanIPTextBox" x-mojo-element="TextField"></div>
        </div>
      </div>
    </div>
    <div class="palm-row">
      <div class="palm-row-wrapper textfield-group" x-mojo-focus-highlight="true">
        <div class="title">
          <div class="label">User</div>
          <div id="BTPanUserTextBox" x-mojo-element="TextField"></div>
        </div>
      </div>
    </div>
    <div class="palm-row last">
      <div class="palm-row-wrapper textfield-group" x-mojo-focus-highlight="true">
        <div class="title">
          <div class="label">State</div>
          <div id="BTPanStateTextBox" x-mojo-element="TextField"></div>
        </div>
      </div>
    </div>
  </div>
</div>

<div class="palm-group">
  <div class="palm-group-title">WAN</div>
  <div class="palm-list">
    <div class="palm-row first">
      <div class="palm-row-wrapper textfield-group" x-mojo-focus-highlight="true">
        <div class="title">
          <div class="label">IP Address</div>
          <div id="WanIPTextBox" x-mojo-element="TextField"></div>
        </div>
      </div>
    </div>
    <div class="palm-row">
      <div class="palm-row-wrapper textfield-group" x-mojo-focus-highlight="true">
        <div class="title">
          <div class="label">Network</div>
          <div id="WanNetworkTextBox" x-mojo-element="TextField"></div>
        </div>
      </div>
    </div>
    <div class="palm-row last">
      <div class="palm-row-wrapper textfield-group" x-mojo-focus-highlight="true">
        <div class="title">
          <div class="label">State</div>
          <div id="WanStateTextBox" x-mojo-element="TextField"></div>
        </div>
      </div>
    </div>
  </div>
</div>

app/assistants/first-assistant.js

function FirstAssistant() {
}

FirstAssistant.prototype.setup = function() {
    this.controller.setupWidget('SubscribeButton', {}, {label:'Subscribe'});
    this.controller.setupWidget("BTPanIPTextBox",
        {
            modelProperty: 'originalValue'
        },
        this.btpanIPModel =
        {
            originalValue: '',
            disabled: true
        });
    this.controller.setupWidget("BTPanUserTextBox",
        {
            modelProperty: 'originalValue'
        },
        this.btpanUserModel =
        {
            originalValue: '',
            disabled: true
        });
    this.controller.setupWidget("BTPanStateTextBox",
        {
            modelProperty: 'originalValue'
        },
        this.btpanStateModel =
        {
            originalValue: '',
            disabled: true
        });

    this.controller.setupWidget("WiFiIPTextBox",
        {
            modelProperty: 'originalValue'
        },
        this.wifiIPModel =
        {
            originalValue: '',
            disabled: true
        });
    this.controller.setupWidget("WiFiBSSIDTextBox",
        {
            modelProperty: 'originalValue'
        },
        this.wifiBSSIDModel =
        {
            originalValue: '',
            disabled: true
        });
    this.controller.setupWidget("WiFiSSIDTextBox",
    {
            modelProperty: 'originalValue'
        },
        this.wifiSSIDModel =
        {
            originalValue: '',
            disabled: true
        });
    this.controller.setupWidget("WiFiStateTextBox",
        {
            modelProperty: 'originalValue'
        },
        this.wifiStateModel =
        {
            originalValue: '',
            disabled: true
        });

    this.controller.setupWidget("WanIPTextBox",
        {
            modelProperty: 'originalValue'
        },
        this.wanIPModel =
        {
            originalValue: '',
            disabled: true
        });
    this.controller.setupWidget("WanNetworkTextBox",
        {
            modelProperty: 'originalValue'
        },
        this.wanNetworkModel =
        {
            originalValue: '',
            disabled: true
        });
    this.controller.setupWidget("WanStateTextBox",
        {
            modelProperty: 'originalValue'
        },
        this.wanStateModel =
        {
            originalValue: '',
            disabled: true
        });

    Mojo.Event.listen(this.controller.get('SubscribeButton'),
        Mojo.Event.tap, this.handleSubscribeButton.bind(this));
}

FirstAssistant.prototype.handleSubscribeButton = function(){
    this.controller.serviceRequest('palm://com.palm.connectionmanager', {
        method: 'getstatus',
        parameters: {subscribe:true},
        onSuccess: this.handleOKResponse.bind(this),
        onFailure: this.handleErrResponse
    });
}

FirstAssistant.prototype.handleOKResponse = function(response){
    this.controller.get('ErrorMessage').hide();
    this.controller.get('ErrorMessage').setStyle({visibility:'hidden'});

    this.btpanStateModel.originalValue = response.btpan.state;
    this.btpanIPModel.originalValue = response.btpan.ipAddress;
    this.btpanUserModel.originalValue = response.btpan.panUser;
    this.controller.modelChanged(this.btpanStateModel);
    this.controller.modelChanged(this.btpanIPModel);
    this.controller.modelChanged(this.btpanUserModel);

    this.wifiStateModel.originalValue = response.wifi.state;
    this.wifiIPModel.originalValue = response.wifi.ipAddress;
    this.wifiSSIDModel.originalValue = response.wifi.ssid;
    this.wifiBSSIDModel.originalValue = response.wifi.bssid;
    this.controller.modelChanged(this.wifiStateModel);
    this.controller.modelChanged(this.wifiIPModel);
    this.controller.modelChanged(this.wifiSSIDModel);
    this.controller.modelChanged(this.wifiBSSIDModel);

    this.wanStateModel.originalValue = response.wan.state;
    this.wanIPModel.originalValue = response.wan.ipAddress;
    this.wanNetworkModel.originalValue = response.wan.network;
    this.controller.modelChanged(this.wanStateModel);
    this.controller.modelChanged(this.wanIPModel);
    this.controller.modelChanged(this.wanNetworkModel);
}

FirstAssistant.prototype.handleErrResponse = function(response){
    this.controller.get('ErrorMessage').show();
    this.controller.get('ErrorMessage').setStyle({visibility:'visible'});
}

FirstAssistant.prototype.cleanup = function(event) {
    Mojo.Event.stopListening(this.controller.get("SubscribeButton"),
        Mojo.Event.tap, this.handleSubscribeButton);
}

Сцена содержит кнопку, при нажатии на которую приложение осуществляет подписку на уведомления об изменении состояния сетевых подключений.

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

WebOS Connection Manager Test

В обработчике onSuccess мы получаем значения всех полей из объектов wan, wifi и btpan и отображаем их в соответствующих текстовых полях.

В эмуляторе валидной будет информация только о подключении к Wi-Fi. Другие сетевые подключения на данный момент не доступны под эмулятором.

Скачать исходный код примера.

Previous ArticleNext Article
Технический директор IT-Dimension, компании-разработчика кросс-платформенного программного обеспечения

Leave a Reply

Your email address will not be published. Required fields are marked *

В.

ВИДЕО: Вебкаст о разработке для Palm webOS

Palm webOS WebCast

Вот.. выложили видео вебкаста о программированиии для Palm webOS. Как я уже говорил, там были проблемы с видео, поэтому первые 1:35 идут без звука. Там, в принципе, только обзор был, поэтому ничего страшного.

В.

Впечатления от вебкаста по Palm webOS

Palm PreПоучаствовал в вебкасте по разработке для Palm webOS.

Как это было? Это было ммм.. довольно странно. Видео тормозило просто жутчайшим образом, а звука вобще не было. Вернее вместо этого был только шум. Как вариант предлагалось позвонить по телефону и послушать таким образом о чем там идет речь, но… как-то межлународный звонок в течении часа.. ну не каждый осилит.

Но в общем ладно. Теперь о хорошем. Как-то так постараюсь тезисно свое мнение изложить:

  1. Palm OS это прикольно. 😉
  2. Т.к. приложения пишутся на JavaScript, то для разоаботки GUI кроме текстового редактора ничего не нужно.
  3. В вебкасте чудо-человек разработчик демонстрировал все под Mac OS но т.к. JavaScript отрабатывает на клиенте, то писать можно и под Windows и под Linux
  4. JavaScript как и реньше не имеет доступа к системным ресурсам, зато для этого предусмотрен серверный функционал. Для получения, например, данных о GPS координатах из JavaScript выполняется запрос к локальному Web-сервису (URL начинается как-то так с “palm://…”, целиком не запомнил)
  5. Архитектура приложения на вид напоминает MVC. В подробности особо не вдавались, вебкаст короткий.
  6. Форматирование и GUI-контролы реализуются с помощью предустановленных CSS-стилей. На вид выглядит довольно аккуратно и юзабельно.
  7. SDK будет включать (по крайней мере по обещаниям) какое-то подобие веб-сервера, реализующего эмуляцию серверной части API для webOS (тех веб-сервисов, которые доступны в самой OS и которые можно использовать из JS).
  8. Не очень понятно пока каким образом можно реализовывать свой серверный функционал (т.е. например какой-нибудь сервис, который могут дергать все приложения, запущенные на устройстве, это пока загадка).
  9. Не очень понятно как поучаствовать в закрытом бета-тестировании SDK (оно пока не доступно для широкой общественности).
  10. Записанный вариант вебкаста обещали выложить (не знаю пока, в публичном доступе или только для участников) и прислать адрес в почту. Если пришлют, обязательно выложу информацию здесь на сайте.

Ну вот как-то так. Жаль, конечно, что из-за недостаточного качества организации мероприятия не получилось узнать больше, но тема сама по себе очень интересная.