Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
10
Help us understand the problem. What are the problem?
@bellx2

FlashAirで固定IPを設定する

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

(追記)当初はLuaでやるしかなかったのですが、その後CONFIGで設定される方法が公開されました。デベロッパーサイトもクローズになり、情報がリンク切れだったので更新しておきました(21/07/27)

設定ファイルにて設定する方法

WLANSD/CONFIGに設定を入れます。

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をいじってわかったこと。

ここに

・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
10
Help us understand the problem. What are the problem?