0

私は現在、雇用主の既存の製品にリンクする Android アプリに取り組んでいます。システムは、.NET Windows プログラム、直接シリアル通信、または制御 Web ページを使用して、シリアル、イーサネット、または Wi-Fi 経由で制御可能なファームウェアを実行するデバイスです。Android アプリは、制御 Web ページに自動接続するためのものであり、IP アドレスを手動で見つける必要なく、電話からデバイスを制御できます。そのためには、IP アドレスを見つけて、そのアドレスがこれらのファームウェア デバイスのいずれかに対応しているかどうかを判断できる必要があります。

基本的に、私がやりたいことは、Android が認識し、それぞれを上記のメソッドに送信するすべての IP アドレスを実行することです。この Thing は、ファームウェア コマンドでアドレスに ping を実行し、何が返されたかを確認して、アドレスがファームウェア デバイスに対応しているかどうかを判断します。現時点では、「HOME」や「GETINFO」などのコマンド (もちろん、ファームウェア用に正しくフォーマットされています) を送信し、何かが返された場合に期待される応答と比較することで、これを行っています。home のようなコマンドには、物理​​的な応答を引き起こすという利点もあります。そのため、少なくともコマンドが受信されたかどうかは、マイクロチップ デバッガーがなくてもわかります。

現状では、正しいアドレスがハードコーディングされており、このメソッドに送信されています。アプリは URL と同じアドレスを使用して Web ページ コントロールを正常に読み込むことができることを知っているため、アドレスが正しく、接続が良好である必要がありますが、デバイスへの直接通信が機能していません。物理的な応答は観察されず、情報は返されません。入力ストリームはタイムアウトして -1 を返します。これについて私がひどく困惑しているのは、私が知る限り、.NET Windows コントロールとまったく同じ方法で情報を送信しているにもかかわらず、それが機能していないことです。

もう 1 つ注意: IP アドレス文字列をソケット コンストラクターにホスト名として送信してもおそらくうまくいかないことは承知していますが、UnknownHostException がスローされないため、ソケットがそれを IP アドレスに解決できることはわかっています。正しい?

私のコードは次のとおりです。

 private class NetworkTask extends AsyncTask<String, Boolean, Boolean> {    
  protected Boolean doInBackground(String... addr){
   try {
          String message = "<FHGETHUBINFO>";
          byte[] input = new byte[8];

          //addr is an array of string parameters containing a single IP address string. E.g. addr[0]=”192.168.199.108”  
          Socket s = new Socket(addr[0],80);

          //outgoing stream redirect to socket
          OutputStream out = s.getOutputStream();
          out.write(message.getBytes());

          Log.v(TAG, "output sent. Waiting for input.");

          InputStream in = s.getInputStream();
          //Skip the exclamation mark and newline. Verified that nothing is received even without a skip.
          in.skip(2);
          int numBytes = in.read(input,0,8);
          Log.v(TAG, "Input received: "+numBytes);
          String st = input.toString();
          //Close connection
          s.close();

          if(st != "HUB INFO"){
                 return true;
          }
          else{
                 return false;
          }

   }

   catch (UnknownHostException e) {
          Log.v(TAG,"UnknownHostException: "+e.getMessage());
          e.printStackTrace();
   }

   catch (IOException e) {
          Log.v(TAG,"IOException: "+e.getMessage());
          e.printStackTrace();
   }
   return false;

あなたが与えることができるどんな助けにも感謝します, 本当に感謝します!

4

1 に答える 1

0

検証目的のためだけに、ソケットで isReachable を呼び出す必要があることに同意したので、ヒントをありがとう! ただし、デバイスがポート 80 で通信していないことが問題であることが判明したため、間違ったポートを使用していることが問題の原因であることは間違いありません。にもかかわらず、アドバイスありがとうございます。

于 2012-06-07T16:30:03.590 に答える