2015-01-22 1 views
1

Я разрабатываю для Google Glass и проблемы с загрузкой файлов из Glass в приложение сервлета, которое я использую для управления вызовами API. Я установил идентификатор клиента и секрет для аутентификации вызовов api из приложения сервлета, используя консоль разработчика. Я видел эти ссылки упоминания запросы HTTP из стекла:
HTTP Requests in Glass GDK 1
Google Glass upload files using http-client
... но они не были невероятно полезны. У меня есть разрешения для Интернета, установленные в файле манифеста. Это код, у меня есть:Может ли HTTP-запрос отправляться из стекла?

public class MyAsyncTask extends AsyncTask<Void, Void, Void> { 
    private static final String TAG = "MyAsyncTask"; 
    private static String FILE_PATH; 
    private String fileType; 
    private static final String HOST_URL="http://10.0.2.2:8080/main"; 
    private static java.io.File fileToUpload; 

public MyAsyncTask(String filePath){ 
    FILE_PATH=filePath; 
    fileToUpload=new java.io.File(FILE_PATH); 
    Log.d(TAG,FILE_PATH); 
    fileType=FILE_PATH.substring(FILE_PATH.indexOf(".")); 
} 
@Override 
protected Void doInBackground(Void... params) { 
    post(); 
    return null; 
} 

private int post() { 

    int resultCode = 0; 

    String url = HOST_URL; 

    HttpClient client = new DefaultHttpClient(); 
    HttpPost post = new HttpPost(url); 


    List<NameValuePair> urlParameters = new ArrayList<NameValuePair>(); 
    urlParameters.add(new BasicNameValuePair("source", "glass")); 

    try { 
     post.setEntity(new UrlEncodedFormEntity(urlParameters)); 

     HttpResponse response = client.execute(post); 
     System.out.println("\nSending 'POST' request to URL : " + url); 
     System.out.println("Post parameters : " + post.getEntity()); 
     System.out.println("Response Code : " + 
       response.getStatusLine().getStatusCode()); 

     resultCode = response.getStatusLine().getStatusCode(); 

     BufferedReader rd = new BufferedReader(
       new InputStreamReader(response.getEntity().getContent())); 

     StringBuffer result = new StringBuffer(); 
     String line = ""; 
     while ((line = rd.readLine()) != null) { 
      result.append(line); 
     } 

     System.out.println(result.toString()); 
    } catch (Exception e) { 
     Log.e("POST", e.getMessage()); 
    } 

    return resultCode; 
} 

Результат вызова MyAsyncTask (Filepath) .Execute(); заключается в том, что соединение отклонено. Я установил URL-адрес на то, что он есть, потому что я читал, что localhost может ссылаться на устройство Glass, как это происходит при запуске эмулятора Android, но сервлет работает на http://localhost:8080.

Для справки Я использую Jetty 6.1.x для своего сервлета.

В чем может быть проблема? Не поддерживает ли Glass обстрел HTTP-запросов? Должен ли я пытаться аутентифицироваться там, где у меня нет? Я был бы рад предоставить любую другую ссылочную информацию по запросу. Я очень признателен за любые рекомендации и опыт. Спасибо.

+0

Google Glass похож на обычное устройство Android. Таким образом, запрос http ведет себя одинаково. Работа в локальной сети не связана с Google, но с любым устройством. Вы должны посмотреть, как получить доступ к локальной сети с устройства Android. Вы найдете свой ответ –

+0

@SimonMarquis. Я подробно рассмотрел это. Я знаю, что локальным хостом работающего устройства является само устройство. Я попробовал сетевой IP-адрес, но все-таки я получил отказ от отказа подключения – cheft

+0

Вы пытались использовать частный локальный IP-адрес машины, на которой запущен сервер? Изменить: взгляните на это, например: http://stackoverflow.com/questions/19132059/how-to-allow-remote-access-to-my-wamp-server-for-mobileandroid –

ответ

0

Стекло поддерживает HTTP-вызовы - я не думаю, что это ваша проблема.

Проблема, скорее всего, связана с вашим сервлетом или сетевой конфигурацией (или некоторой их комбинацией).

Некоторые вещи, чтобы проверить:

  • Убедитесь, что стекло подключен к локальной сети, и той же локальной сети, что ваш сервер подключен. Адрес 10.x.x.x для вашего сервера указывает, что он находится в частной сети, и вы должны убедиться, что Glass находится в той же частной сети.
    • Вы можете проверить и подтвердить, к какой сети Wi-Fi подключены, перейдя на экран настроек на стекле. Убедитесь, что он говорит «Wi-Fi». Нажав на экран, он должен сказать вам, с какой сетью Wi-Fi вы подключены.
    • Чтобы проверить, возможно, вы захотите получить IP-адрес устройства. См. this answer для получения кода, который может вам помочь.
  • Убедитесь, что вы можете перейти на сервер по указанному вами адресу. Используйте браузер на другом компьютере (в той же сети), если сможете. Убедитесь, что вы используете точный URL-адрес приложения Glass - http://10.0.2.2:8080/main
    • Использование IP-адреса, а не «localhost» важно.
    • Тестирование его с одного и того же компьютера на другой машине в той же сети может указывать на брандмауэр на машине, блокирующий порт, или нет.
  • Подтвердите, какой порт прослушивает ваш сервлет.
    • Вы не говорите о том, какой сервлет-движок вы используете, поэтому вам сложно указать, в каком именно файле вы должны проверить конфигурацию. Если вы сообщите нам, мы сможем указать вас в правильном направлении, если вы не знаете.
    • URL на стекле ищет 8080, поэтому убедитесь, что ваш сервлет также настроен на использование этого порта. (8080 - довольно типичный, но не гарантированный). Ваш сервлет не должен открывать порт сам по себе - пусть контейнер сервлета обработает это.
  • Проверьте журналы сервлетов, особенно журнал доступа, чтобы проверить, действительно ли подключено к нему стеклянное устройство и ваш ручной тест. Или, если что-нибудь вообще может подключиться к нему.
+0

Нужно ли сервлету явно прослушивать подключения, например, с помощью сокета? – cheft

+0

Ответ обновлен, чтобы обсудить некоторые из ваших вопросов. – Prisoner

0

Я понял свою проблему, и я понял, что мог бы предоставить дополнительную информацию. Мои извинения. В любом случае сервер Jetty работал только на localhost (127.0.0.1). Чтобы исправить это, я отредактировал файл pom.xml моего проекта maven следующим образом:

-Добавлен в тег плагина appengine под тегом конфигурации тег адреса с адресом 0.0.0.0 и тег порта с портом 8080. Это разрешил ему работать на локальном хосте.
-Тогда AppEngine дал ошибку 400, когда я попытался получить доступ к сырой локальный IP, так что я отредактирован файл хостов на моей машине, расположенной на что-то вроде/частных/и т.д./хостов и добавили эту строку:

мой -wlan-ф fakedomain.com

Но я также должен был добавить fakedomain.com:8080/oauth2callback моим зарегистрированным перенаправляют URIs в консоли разработчика Google под учетными данными.

Позвольте мне получить доступ к этому моему devserver с других устройств.