Help us understand the problem. What is going on with this article?

FlashAirで固定IPを設定する

More than 3 years have passed since last update.

FlashAirはアドレスを固定にする方法が無く、DHCPの無いネットワークでは使えないらしい。IPを固定しようとすると、DHCP振り出し時にMACアドレス指定で割り振るしか無いので困っているとの話。なんとなくできそうな雰囲気だったので、自分も会社帰りにビックカメラで購入してやってみました。

注意(追記)15/10/13

以下にLuaを使わない固定方法がありました。これが設定方法の決定版かと思います。

FlashAirを固定IPアドレスにする(Lua未使用)

DHCP_Enabled=NO

がポイントですね。

注意(追記)15/5/2

DHCP初期化に失敗すると、インターフェースがdisableになってしまうようで、繰り返しセットしたり書き込みタイミングでIPを再設定しようとしてもセットできませんでした。

ということで以下はDHCPでIPを取得後に任意のIPに変更する方法になります。

できなさそうだけど...

FlashAirをいじってわかったこと。

ここに

・FlashAirには、隠し(非公開/未公開/内部用)関数が存在する。
 簡単なLuaの知識だけで一覧を閲覧できるので、探すとよい。
 現在のFlashAirに割り当てられたIPアドレス、固定IPアドレスの設定、ゲートウェイのIPアドレス取得、内部APへの接続子機数、ping、WPS機能の開始、時刻設定、ファイルの削除・変更(fsを使わず)、接続状態の取得、SPI通信、無線チャネルの設定、より応用的なHTTP通信などができる、ようだ。

と書いてあるのでできそうと判断。

関数一覧の取得

とりあえず、隠し関数一覧を探すことに。LuaスクリプトはHashテーブルのようになっているようなので、faの一覧ができれば良さそう。

Luaで一覧を表示するコードを書いてみる。ブラウザーからアクセスするのでHTTPヘッダーを最初に出力しないといけないのに注意。

list.lua
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がかえってきているので、以下のように取得する。

getip.lua
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。以下のようにすると設定できた。

setip.lua
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等ファイルに入れたほうが良さそう

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away