DMTCに参加して
お久しぶりです。
夏休みあたりから、コードをほとんど書いてない西脇です。
今、KDDI Web Communicationsってとこでバイトしてるんですけどバイト先でもあまりコードを書かなくなってきてます。。。。
そんな自分がgivery主催のDMTCと呼ばれる開発合宿のスタッフとして参加してきました。 http://dmtc.jp
自分がプログラミングを始めた理由も、起業した理由も、エンジニアになろうとした理由もすべての原点は、ブレークスルーキャンプのFacematchというアプリのプレゼンを見て憧れたからです。参考:http://techwave.jp/archives/51708439.html
最近は、アルバイトでコードを書いたりするようになって、自分で企画してアプリ、サービスを作る楽しみを完全に忘れていました。
さらには、勉強意欲も完全に失ってました。
んで、今回DMTCに参加してここを再認識しました。
参加して、よかった。
社会人になっても、こういう場に顔を出して刺激を受けたいと思った。
ちょっと、プログラミングとネットワークの勉強再開します。
Android2.0のWifiの仕組みを追っかけてみた。
Android2.0でWifiアドホックモードに対応させるために、いろいろゴニョゴニョしてるわけだが。
そもそも、AndroidがどのようにWifiをONにしてるのかAOSP(Android open source project)のWifi周りのコードを追っかけてみた。
いろいろと勉強になった。少し、Androidについて理解が深まった。
HandlerとLooper(スレッド間での情報のやりとり的な)
Activityとかも前より、理解が深まった!
Androidのフロント部分は、javaだし思ったより読みやすかったのでこれからも読もうと思う。
本題のAndroid2.0のWifiの仕組み
最初に概略図を以下にまとめた。これを見ながら、AOSPのコード読み進めるとやりやすいかも!
最初勘違いしてたけど、WifiServiceってのは、コンポーネントのサービスのように、常時走るプログラムじゃないってこと。
しかも、WifiManagerのインスタンスを取得するときの
WifiManager mWm = (WifiManager)getSysystemService(WIFI_SERVICE);
っていうのは、WifiManagerを返すんじゃなくて、WifiServiceを返すってこと。
んで、基本的にWifiを操作するのは、
WifiService
WifiStateTracker
あと、これは結構探すの苦労したんだけど、WifiStateTrackerとWifiServiceはConnectivityServiceで初期化されてる!
WifiStateTrackerは、NetworkStateTrackerを継承していて
NetworkStateTrackerは、Handlerを継承しているので
WIfiStateTrackerは、Handlerとしても働きます。また、ConnectivityServiceの中のThreadで初期化されているのでConnectivityServiceのThreadに関連づけられます。
あとはまぁ、画像見れば分かるかな。
これは、結構解読するのに苦労したわ。
Wifiの挙動が違うことからも、多分Android4.0とかだとフローも少し変わるのかもしれない。
今度そっちもコード読んでみる
Android 4.0はAdhocモード不可???
最近Androidのすばらしさを実感している、西脇です。
研究でAd-hocモードをとりあげているので、Ad-hocネタが多くなってます^^;
というわけで、本題に
Android 4.0ではAdhoc不可??
今回は二つの端末で検証しました。
Swicth(challenge.device_type){
Case: Galaxy Nexus
そもそも、Galaxy Nexusでは、iwconfigやiwlistなどのwireless toolから ネットワークインターフェースが認識されません。
という訳で、お手上げです。
break;Case: Nexus7
問題なのは、こいつ。
wireless toolでちゃんとインターフェースが認識されます。ukinau$ifconfig wlan0 down ukinau$iwconfig wlan0 mode Ad-hoc SET failed on device wlan0 ; Operation not supported on transport endpoint.
「Opertation not supported on transport endpoint」かdriverではじかれてるっぽい感じ ってことは、やっぱりdriver入れ替えたりしないといけないってことなんですかね。。。
}
なんでGalaxySとかOptimusChatで、できたの?
Android2.0のWifiの仕組み
もしかしたら、GalaxySとかにwireless-toolを入れてiwconfigとかでAd-hocモードに変更しようとチャレンジした人がいるかもしれない。
でもできなかっただろう。
それはなぜか?
別にDriverにmode変更のoperationが拒否された訳じゃないんです
というのも、Android2.0ではWifiをONにするとdriverが読み込まれて、Wifiのステータスを追っかけるサービスが同時に動いてWifiのステータスをチェックしているのです。
そして、Wifiをオフにするとdriverがunloadされて、Wifiのステータスをチェックするサービスも止まります。
つまり、mode変更の鍵は、Wifiのステータスをチェックするサービスにバレないようにmodeを変更する必要があるのです。
じゃあどうするの?
簡単な話です。
4.0と2.0どこが違うの?
上記の通り、driverでは特にmode変更を阻止するような処理を一切加えてないのが2.0です
mode変更がされてもその度に上書きをしているだけです。
しかし、Android4.0では、driverから直接無理ですと言われていることが分かります。
なので下位レイヤーから変更を加える必要があります。
ただ、少し謎なのがNexus7では、iwconfigからMaster(テザリング)にモード変更しようすると、さっきと同じエラーが出るのに対して、Androidの非公式API(Reflection経由)からテザリングをOnにしてiwconfigでmodeを確認するとMasterに変わってるんですよね・・・・。
なので、wpa_supplicant経由で変更する方法があるのかもしれません。
でもやっぱり、Android4.0でもAdhocやりたい
できません!だけだったらブログは書きません。
ちゃんと、やり方があります。
というのも、完全に拾いもんですが。
Adhocに対応させてるCustom Romを配布しているところを見つけました!!
以下のURLに詳細は書いてあるので、そちらかDLして入れてください。
http://www.thinktube.com/component/content/article/19-technicalinformation/46-android-wifi-ibss
まだ、ちゃんと技術詳細とか読んでないので、今度読もうと思います
android-wifi-tetherのコアプログラムをビルドし直してみた。
Wifi-Adhoc モードを利用したテザリングをするルート化必須のアプリ「android-wifi-tether」
を利用すれば、Wifi-Adhoc モードを使えるんじゃないかと考え、オープンソースでもあるのでこのアプリのソースを読んでました。
ソースはここにあります→http://code.google.com/p/android-wifi-tether/
今回は、branch/wireless-tether のブランチにあるソースを使っています。
まだ全部理解してないものの、私が必要な部分はWifiのモード切り替えの部分だけなので、そこだけを引っ張って自分で新しくアドホックモードに切り替えるアプリを作ろうと試みました。
そこの解説は、後ほど書くとして。
切り替え部分の簡単なフローは
1、WifiをAndroid標準APIからWifiをOFFにする
(Wifiのネットワークインターフェースが見えなくなる)2、Cで書かれたtetherという実行ファイルを実行する
これで、Wifiのモードが変わります。
tetherは、GoogleのOSの更新スクリプトであるEdfiyのインタプリタを拡張したものになっていて
tetherという実行ファイルが実際行っているのは、指定したPATHにあるEdifyスクリプトを実行しているだけです。
tether.edifyっていうのが実際に実行されるedifyスクリプトなんですが、そこで実際にやっていることは、wifiモジュール をロードしたり、iwconfig とifconfig を使って無線LANの設定をしたり、dns 立てたり、iptables でファイアーウォールの設定をしたりとかです。
dns とかファイアーウォール設定とかdhcpサーバーの立ち上げとかは、Wifiモード変更には関係ないので、そこら辺のセンテンスは削除して大丈夫です。
ここからが本題
以上のように、tether というプログラムが android-wifi-tether のコアプログラムです。 なので、これを使えば Wifiモード変更アプリを作れるように思い、実際に作ってみました。
ところが・・・・動きません!!!
デバックしてみると、tetherの中でtether.edifyのパスを直打ちしてあり、パスはパッケージ名に依存するのでandroid.tetherパッケージ以外だと。no such a file とか言われてtether.edifyを見つけられません。
んじゃ、tetherを編集してビルドし直します。
tetherのプログラムは $(PROJECT_ROOT)/native/tether-edify にあります。
tether.cでPATH指定しているところを全て自分のパッケージ名に変更します。
それではビルドしましょう
・・・・・・・・・・・・あれ?・・・・どうやってするんだろう
とりあえず、普通にビルドすることを試みます
続きを読むAndroidからCプログラムを呼び出す
AndroidプログラムからCプログラムを呼び出す
AndroidプログラムからCプログラムを呼び出せます。
Cプログラムというのも、もちろんAndroid用にbuildされたものに限ります。
まずは
適当にCプログラムを書きます。
この時点で、
HelloWorld.c があるとします
Android NDKをここからDL(http://developer.android.com/tools/sdk/ndk/index.html)
1.NDKのpathを通します
2.jniフォルダを作成します
3.jniフォルダにHelloWorld.cを移動します
4.Android用のmakeファイルを作成します,makeファイルはこんな感じ
ーーーーーーーーーーーーーーーーーーーー
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := helloWorld
LOCAL_SRC_FILES := HelloWorld.c
include $(BUILD_EXECUTABLE)
ーーーーーーーーーーーーーーーーーーーー
5. これでjniフォルダがあるフォルダに移動
6. そこでndk-buildと打つとビルドすると、実行ファイルが生成されます
コマンドで示すとこんな感じです
#mkdir ~/bld ~/bld/jni
#cp HelloWorld.c ~/bld/jni
#cd ~/bld/jni
#vi Android.mk ←上記の通り書いてください
#cd ../
#ndk-build
これで後は、生成された実行ファイルをAndroid端末に移動して、実行するだけです。
ここまで来れば、Androidプログラムから呼ぶのも簡単です。
こんな風に、javaから呼べば実行されます。
Process process = Runtime.getRuntime().exec("./helloWorld");
次の記事では「Root化アプリとは?」について書きます!
Wifiアドホックモード
そもそもWIFIアドホックモードとは?
WIFIのモードには大きく分けて3つあります。
1、インフラストラクチャーモード(Master)
2、アドホック(Ad-hoc)
3、クライアント(Managed)
インフラストラクチャーモードは、APとして振る舞うモードです。
アドホックモードは、端末と端末同士で通信するモードです。
クライアントモードは、インフラストラクチャーモードとして振る舞っているAPに接続するモードです。
通常、クライアントモードになれる端末は基本的にはアドホックモードにも対応しています。
しかし、AndroidではWifiアドホックモードがあえてできないようになっています。
それを出来るようにしようというのが今回の話です。
その前に、これができるとどんないいことがあるのか?
率直に申しますと、アドホックモードだからいいことはそんなありません。普段スマホを使う上でAPを介さずに通信したいなんてことはほとんどありませんからね。
じゃあなぜ、わざわざアドホックモードをONにするのか?
それは、
例えば震災が起きてAPが使えなくなったとき、アドホックモードを使って端末同士をつなぎ他の人と通信をすることができるというメリットがあるためです。これらについて研究されてるのがDTNと呼ばれる遅延耐性ネットワークです。詳しくはググってください。
ではアドホック通信の話に移りましょう。
アドホックモードで通信をするには、二通りあります。
- Androidの設定画面にアドホックネットワークを表示させ、つなぎに行く方法
- Wireless Tetherアプリでアドホックネットワークを作り、接続を待つ方法
「Android アドホック」でググルとほとんど1個目の情報が出てきます、しかしWireless Tetherというアプリでもアドホックモードに対応させることができます。
一応私が試した中だと、どちらかが対応している場合は二つともできるはずです。
今回は、1個目の「Androidの設定画面にアドホックネットワークを表示させ、つなぎに行く方法」
を紹介します。
まぁそんな難しいことではありません。
Linuxになれた人(Linuxを触ったことがある人)向けに言えば。
無線LANクライアントツールである、「wpa_supplicant」という実行ファイルをアドホック対応のもの置き換えるだけです。
ただその際に、SystemeディレクトリはRead-OnlyファイルシステムなのでRWでRemoutしたりして書き込みできるようにしないといけません。
こんな感じで。
#mount -o remount,rw /system /system
まぁハマるところはそれぐらいですかね。
アドホックに対応した、wpa_supplicantは対応したものを探してください。
ただ、最新の機種だとなかなか見つかりづらいです。
Galaxy NexusとNexus7は見つかりませんでした。。。
今回言いたいことは、アドホック対応化というと1個目の情報しか出てこないんですが2個目の方法もあるよということですね。
Ps, Iphoneは標準でアドホック通信に対応しているようですね。
続きを読む最近やっていること。(PHP,Lithium,Android,WIFI-Adhoc)
ブログはしばらくご無沙汰してます。
というのも、今大学4年なので就活とかいろいろありまして、開発から離れてました^^;
就職活動も無事終わり、今は研究と開発系のアルバイトをしてる毎日です^^
ブログを休んでる間に、嬉しいことが一個ありました。
週刊アスキーで自分の作ったアプリが紹介されました!!まぁたくさんあるうちの1つなんですがやっぱり嬉しかったですね^^これからも頑張ります。
ってな訳で、最近は開発ばっかりやってるのでブログ再開しようと思います!
最近やってることは、
研究:Androidアプリを作ったり、いじったり
具体的には、AndroidでDTN(遅延体制ネットワーク)を実現して、現在のスマホで実現可能な最適な方式を提案するというものです。
Androidに関しては、既に何個かネタが出来たので明日から書いて行きます。
ネタとしては、非公式テザリングAPIだったり、wifi アドホックモードの対応(要root)だったり、root化アプリの仕組みだったりとその辺ですかね。wifiアドホックモードは意外に情報少ないんですよね。。。。
あとは、最近はRubyはあまり使ってなくて、PHPを勉強し始めました!
フレームワークはLithiumを使っています^^
Lithiumは基本的に英語の情報しかないので、Lithiumの紹介とかもしていこうかなって思ってます。
とまぁ、今日は実のない話でした。明日から実のある記事になるように頑張ります。
Hey ! Long time no see in blog
Having said that I had done job hunting because my grade is 4th. So I had left development away.
Nowadays , I had successfully finished job hunting and I have been doing research and part time job of development every day.
while I stop writing the article at this blog I have happened the lucky incident.
The app I created is introduced at the magazine named "weekly ascii" , But my app is one of many app being introduced. Let me do my best !!
That being said, I will restart to write the blog because the development occupy 90 percent of my life.