Android実機によるUDP受信ができません

5,312 views
Skip to first unread message

KiyoKiyo

unread,
Dec 29, 2011, 2:03:12 AM12/29/11
to 日本Androidの会
PCとAndroid端末実機(Xperia Arc)をUSBケーブルで接続した状態で、
PC側からUDPパケットを送信してAndroid実機で受信したいのですがうまくゆきません。

TCP/IPによる通信、エミュレータによるUDP受信は以下の方法でできることがわかっています。

TCP/IPの場合は事前に、
adb forward tcp:9999 tcp:9999
でポートフォワード設定をしておけばポート9999を使ってTCP/IP受信可能。

エミュレータによるUDP受診は
telnet localhost 5554 で
redir add udp:9999:9999
でポートフォワード設定しておけばUDP受信可能。

ですが、
実機でどうやればよいのかわかりません。

よろしくお願いします。

koba

unread,
Dec 29, 2011, 4:07:41 AM12/29/11
to 日本Androidの会
kobaです。

UDPパケットをUSBでブリッジさせたいということですよね。
そのためにはadb forward を使うことになりますが、TCPはできるけれどもUDPはサポートしていませんね。

詳しくはadbのソースコードを見てください。

KiyoKiyo

unread,
Dec 29, 2011, 4:24:39 AM12/29/11
to 日本Androidの会
Kobaさん

返信ありがとうございます。

adbのソースコードが公開されているんですね。
それはどこにあるのでしょうか?
「adb source code 」等で
で検索かけてみたのですが見つかりませんでした。
申し訳ありませんが教えていただけませんか。

そうすると
「adbのソースを修正してUDPのフォワードに対応させる」
なんてことが、もしかしてできるかもしれないってことでしょうか?

とりあえずソースを見てないとわかりませんが・・。

別の方法としてエミュレータで行ったようなredirの設定を
実機に対しても行えればいいような気がするのですが
そちらの方法はわかりませんか?

koba

unread,
Dec 29, 2011, 4:46:37 AM12/29/11
to 日本Androidの会
kobaです。

On 12月29日, 午後6:24, KiyoKiyo <kiyo23....@gmail.com> wrote:

> adbのソースコードが公開されているんですね。
> それはどこにあるのでしょうか?
> 「adb source code 」等で
> で検索かけてみたのですが見つかりませんでした。
> 申し訳ありませんが教えていただけませんか。
>
Androidのソースコードはこちらから。
http://source.android.com/

ちょっとadbだけのぞいてみたいなら、こちらが便利です。
http://tools.oesf.biz/android-4.0.3_r1.0/xref/system/core/adb/

> そうすると
> 「adbのソースを修正してUDPのフォワードに対応させる」
> なんてことが、もしかしてできるかもしれないってことでしょうか?

できたらぜひ成果をcontributeしてください。
>
> とりあえずソースを見てないとわかりませんが・・。
>
> 別の方法としてエミュレータで行ったようなredirの設定を
> 実機に対しても行えればいいような気がするのですが
> そちらの方法はわかりませんか?

WiFi経由で試したらどうでしょうか。

KiyoKiyo

unread,
Dec 29, 2011, 5:45:54 AM12/29/11
to 日本Androidの会
Kobaさん
ソースコードのありか教えていただいて
ありがとうございます。
ちょっと頑張って見てみますね。

>
> WiFi経由で試したらどうでしょうか。

すいません説明が足りなかったですね。
本機のWiFi接続はできない環境で
PCとのUSBによる接続のみの状態です。

USB接続された実機にtelnetができれば
エミュレーターの時と同じように
redirできそうなんですが、、
どのアドレスに接続すればよいのでしょうか?

たろサ

unread,
Dec 29, 2011, 8:33:25 AM12/29/11
to android-g...@googlegroups.com
 こんにちは、たろサです。

> USB接続された実機にtelnetができれば
> エミュレーターの時と同じように

 エミュレータでできるのであれば、実機でもできるよなぁと思って試してみました。

 と言ってもkiyokiyoさんの目的とは違うかも知れませんが、とりあえず、自分の公開しているAndroid用のスクリプト言語がtcpにも対応しているので、スクリプトをチョチョッと書いて試してみました。

 先ず、adb forwardしました。
  >adb forward tcp:60011 tcp:60011

 実機側、60011ポートで接続を待つスクリプトを書きます。

ret = sock.listenOpen( num, 60011, 10 ) --10sec待ちます

 この状態で、Tera Term起動。
  ホスト: 127.0.0.1
  ポート: 60011
  Telnet接続

 問題無く実機とUSB経由でつながりました。

 スクリプトの方は下記の感じで、適当に受け取って終了するようにしましたが、
Tare Termから5回送信して適当な文字を送信したら、スクリプトも受け取った文字を
5回表示して終了し、それと同時に、Tera Termも閉じました。
 
 なので、USB経由で実機とのTelnet接続は問題なくできるようですよ。

--相手のIPアドレスを取得
add = sock.getAddress( num )

--相手のIPアドレスとこちらのIPアドレスを送信する
printscrl( add.." から接続されました", 24, color(0,0,0), color(255,255,255) )

for i=1,5 do
txt, ret = sock.recv( num, 15 ) --15sec待ちます
printscrl( txt..":"..ret, 24, color(0,0,0), color(255,255,255) )
end
sock.close( num )

--
山本三七男 (Minao Yamamoto) ---------------- ハンドル:たろサ -----
E-Mail: taro...@gmail.com

KiyoKiyo

unread,
Dec 29, 2011, 12:57:22 PM12/29/11
to 日本Androidの会
こんばんは。

>たろサさん

Android上で実行できるスクリプトというものがあるのですね知らなかったです!!!
ご紹介されているスクリプトの言語はPythonですか?
なるほどこれをつかえば簡単にAndroid上で簡単な処理を実行できるのですね~。

なるほど、ご紹介いただいた手順では
TCP/IPによるソケット通信で1文字単位での送信・受信ができてますね。

んーっとやりたかったことというのは
「telnetでandroidに接続してandroidのコンソールを呼び出して、コンソール上でredirコマンドを実行すること」
なんですけが、それも可能でしょうか?

すいません、根本的にtelnetのことをよくわかってないのかもしれませんが
エミュレータに対して telnet 127.0.0.1 9999 を実行すると
コンソールの画面になってエミュレータ上でコマンドが実行できる状態になるんですよね。
実機に対してもそういった状態にきるのかどうなのか、
あっもしかして
adb shell って打った後に出てくるコンソール画面がそうなのでしょうか?
でもそっちにはredirコマンドはなさそうだし。。

うーん、すいませんわからないことだらけで。

たろサ

unread,
Dec 29, 2011, 3:36:21 PM12/29/11
to android-g...@googlegroups.com
 たろサです。

> Android上で実行できるスクリプトというものがあるのですね知らなかったです!!!
 先のメールのは自作ですが、スクリプト言語はいろいろと移植されていますよ。

> ご紹介されているスクリプトの言語はPythonですか?

 私が作ったのはLua言語です。Pythonもありますよ。

http://code.google.com/p/android-scripting/

> なるほどこれをつかえば簡単にAndroid上で簡単な処理を実行できるのですね~。
 便利に使えます。でも、マーケットでは、ほとんどダウンロードされていない
ですがww。

> 「telnetでandroidに接続してandroidのコンソールを呼び出して、コンソール
上でredirコマンドを実行すること」
> なんですけが、それも可能でしょうか?

 コンソールポートと adbポートを持っているのは、エミュレータだけでは無い
でしょうか。実機はadbポートだけじゃないかな・・?

 話からして、Android実機とUBSポート経由で接続した、もしくは、接続したい
「何か」があって、その「何か」はudpしか喋れない。

 ということでしょうか。

 その「何か」はtcp喋れないんですか?
 シリアルとかは繋がらないんですか?

 シリアルが繋がれば、他にやりようがありそうですが・・・。

--

KiyoKiyo

unread,
Dec 29, 2011, 9:46:55 PM12/29/11
to 日本Androidの会
>  話からして、Android実機とUBSポート経由で接続した、もしくは、接続したい
> 「何か」があって、その「何か」はudpしか喋れない。
>
>  ということでしょうか。
>
>  その「何か」はtcp喋れないんですか?
>  シリアルとかは繋がらないんですか?
>

こんにちは KiyoKiyoです。


説明の簡単のため作りたいものの説明を省略していたのがいけなかったですね。
ちゃんと説明します。

環境としては、
AndroidとPCはUSBで接続した状態でWiFiやBluetoothは使えません。

Androidアプリの中ではスレッドA、スレッドB、
PC側ではデーモンCとアプリDが起動しています。

まずスレッドAとデーモンCが一定間隔でデータを送受信し続ける
という処理があります。
これをTCP/IPによるソケット通信で行っています。
制約によりWiFi、Bluetoothは使えないため
adb forward を使いTCPパケットをポート9999へブリッジさせることで
こちらは実現しています。

その状態を維持しつつ
任意のタイミングでPC側のアプリDから制御命令をAndroidのスレッドBへ
送信したいと思っています。これが「何か」です。

ここでTCP/IPのポート9999はすでにスレッドAで使用中なので
別の方法をと考えて今回試行錯誤しています。

まずBroadcastReceiverを使うという手を考えました。
アプリDでインテントを発行(adb shell amコマンド実行)して
Android側で受信するという処理で
これはうまくいったのですがレスポンスの問題があり使えませんでした。

そこでUDPを使って通信させることを考えました。
この方法はエミュレーターでredir add udp:999:9999することで
UDPパケットを転送させることができたので実現できました。
しかし実機でそれができないので今回困っていました。

なるほど、たろサさんのご提案の
シリアル通信という手もあるのですね。
いろいろGoogleで調べてみていますが、
なかなか解説しているところが少なそうです。

何かお勧めのページなどあれば教えていただけませんか?

よろしくお願いします。

KiyoKiyo

unread,
Dec 29, 2011, 10:32:19 PM12/29/11
to 日本Androidの会
すみません。自己解決しました。

たろサさんへの返信を書いていて気付いたのですが

> ここでTCP/IPのポート9999はすでにスレッドAで使用中なので
> 別の方法をと考えて今回試行錯誤しています。

ポート9999がだめならポート8888を使えばよかったみたいです。

てっきり一つの携帯端末に一つのポートしか割り当てられないと思い込んでいたのですが
adb forward tcp:9999 tcp:9999
adb forward tcp:8888 tcp:8888
とやれば2つのポートを一つの端末にブリッジすることができることがわかりました。

これで
ポート9999でTCP通信(スレッドA<->デーモンC)
ポート8888でTCP通信(アプリDー>スレッドB)
の2つの通信路を実現することができました。

kobaさん、たろサさん
お騒がせしました。
いろいろご教授いただきありがとうございました。

たろサ

unread,
Dec 30, 2011, 3:32:11 AM12/30/11
to android-g...@googlegroups.com
 たろサです。

 解決してよかったですね。

 元々tcpもやられていたのですね。了解しました。

 これなら、下記の方法で解決ですね。

 私のメールも、少しお役に立てたようなのでよかったです。

--

Reply all
Reply to author
Forward
0 new messages