FlashAirはアドレスを固定にする方法が無く、DHCPの無いネットワークでは使えないらしい。DHCP振り出し時にMACアドレス指定で割り振るしかIPを固定できないので困っているとの話。なんとなくできそうな雰囲気だったので、自分も会社帰りにビックカメラで購入してやってみました。
(追記)当初はLuaでやるしかなかったのですが、その後CONFIGで設定される方法が公開されました。デベロッパーサイトもクローズになり、情報がリンク切れだったので更新しておきました(21/07/27)
設定ファイルにて設定する方法
WLANSD/CONFIGに設定を入れます。
DHCP_Enabled=NO
IP_Address=192.168.1.200
Subnet_Mask=255.255.255.0
Default_Gateway=192.168.1.1
Preferred_DNS_Server=8.8.8.8
Alternate_DNS_Server=192.168.1.1
....
その他パラメータ
Luaスクリプトを使って頑張ってやる方法
注意(追記)15/5/2
DHCP初期化に失敗すると、インターフェースがdisableになってしまうようで、繰り返しセットしたり書き込みタイミングでIPを再設定しようとしてもセットできませんでした。
ということで以下はDHCPでIPを取得後に任意のIPに変更する方法になります。
できなさそうだけど...
ここに
・FlashAirには、隠し(非公開/未公開/内部用)関数が存在する。
簡単なLuaの知識だけで一覧を閲覧できるので、探すとよい。
現在のFlashAirに割り当てられたIPアドレス、固定IPアドレスの設定、ゲートウェイのIPアドレス取得、内部APへの接続子機数、ping、WPS機能の開始、時刻設定、ファイルの削除・変更(fsを使わず)、接続状態の取得、SPI通信、無線チャネルの設定、より応用的なHTTP通信などができる、ようだ。
と書いてあるのでできそうと判断。
関数一覧の取得
とりあえず、隠し関数一覧を探すことに。LuaスクリプトはHashテーブルのようになっているようなので、faの一覧ができれば良さそう。
Luaで一覧を表示するコードを書いてみる。ブラウザーからアクセスするのでHTTPヘッダーを最初に出力しないといけないのに注意。
print("HTTP/1.1 200 OK\n")
for key,val in pairs(fa) do
print (key)
end
これをブラウザーで表示すれば以下のような結果が表示された。
ip
Disconnect
SendHTTPMessageByFile
SendHTTPFileByFile
ClrSecretCode
ConnectNum
SetCurrentTime
HTTPGetFile
GetSecretCode
SendHTTPSSLMessageByFile
pio
Connect
SetRmHeader
SetChannel
remove
spi
IBSS
Scan
request
Bridge
WlanLink
StartWPS
ftp
ReadResponse
md5
ping
rename
GetScanInfo
ReadStatusReg
SetSecretCode
getStatus
SendHTTPSSLFileByFile
Establish
ということで、関数リファレンスにはありませんが、fa.ipコマンドで取得できそうという事が判明
IP取得
ということで引数無しにfa.ipを呼ぶことでLuaでIPが取得できるようだ。返り値としてip,netmask,gatewayがかえってきているので、以下のように取得する。
print("HTTP/1.1 200 OK\n")
myip,netmask,gateway = fa.ip()
print(string.format("IP:%s,NETMASK:%s,GW:%s",myip,netmask,gateway))
IP:192.168.1.117,NETMASK:255.255.255.0,GW:192.168.1.1
IP固定
ということはfa.ip()で値をセットすればOK。以下のようにすると設定できた。
print("HTTP/1.1 200 OK\n")
myip,netmask,gateway = fa.ip()
myip = "192.168.1.222"
fa.ip(myip,netmask,gateway)
print("OK!")
セットした直後にIPが変更されるので、最後のOKは表示されない。
起動時のIP固定化
という事で初期化時にスクリプトを実行するように設定!
LUA_RUN_SCRIPT=/setip.lua
やってみると最初のIP固定スクリプトではうまくいきません。調べてみると起動スクリプトは電源ONの5秒後に実行されるようですが、DHCPでのIP取得にはそれ以上かかっているので反映されない模様。
ということで初期化するスクリプトに使うにはsetip.luaにwaitをいれてみるとうまくいきました。手元環境では次のように10秒程ウエイトを入れると初期化できるようになりましたとさ(最小値は特に探していません)
sleep(10000)
ポイント
- DHCPの無い環境下では固定できない(追記)
- Luaスクリプトなので第三世代限定かと
- 非公式APIなので無くなっても泣かない
- IPはスクリプト直書きではなくip.txt等ファイルに入れたほうが良さそう