一般用途向けのQ&Aはこちら → よくある質問
せめてタイムアウト指定とか、なければタイマー割り込みとかほしい...
FlashAirのLuaインタプリタは、1つの系統につき1つのスクリプトしか走りません。
また、無限ループに陥ると、電源抜差ししない限り復帰しません。
途中で止める方法はありますが、スクリプトに工夫が必要になります→Lua:実行中の停止と取得
また、無限ループに陥ると、電源抜差ししない限り復帰しません。
途中で止める方法はありますが、スクリプトに工夫が必要になります→Lua:実行中の停止と取得
FlashAir(W-03)には、アップデータが配信されています。
Lua機能や、安定化などが施されており、これを入れないと一部の関数は全く機能しません。
http://www.toshiba-personalstorage.net/support/dow...
Lua機能や、安定化などが施されており、これを入れないと一部の関数は全く機能しません。
http://www.toshiba-personalstorage.net/support/dow...
FlashAirは,劣悪な電波環境にさらされると急激に速度が低下します.
シールドに覆われていないか,強いノイズを発する機器とともに置いていないか
電源が安定しているかを十分確認してください.
シールドに覆われていないか,強いノイズを発する機器とともに置いていないか
電源が安定しているかを十分確認してください.
電源が不安定だったり、Wi-Fiが通りにくかったり、ノイズにまみれた環境では
当然のことながらデバッグがしにくくなる。
開発ボード(Airioがおすすめ)にスマホ用電源をつなぎ動作確認することを勧める。
開発ボードは、FlashAirの電波を遮蔽しないよう設計されている上、
電源も一般的なSDカードには過剰なほどの容量を持たせてあるため、不安定要素を排除できる。
当然のことながらデバッグがしにくくなる。
開発ボード(Airioがおすすめ)にスマホ用電源をつなぎ動作確認することを勧める。
開発ボードは、FlashAirの電波を遮蔽しないよう設計されている上、
電源も一般的なSDカードには過剰なほどの容量を持たせてあるため、不安定要素を排除できる。
Luaスクリプトでcgi的に応答する場合、まずHTTPレスポンスを返す必要がある。
大抵のブラウザは無くても適当に反応してくれるが、
一部のブラウザや機器は、レスポンスがおかしい時点で接続を切断してしまう。
print("HTTP/1.1 200 OK\n")
大抵のブラウザは無くても適当に反応してくれるが、
一部のブラウザや機器は、レスポンスがおかしい時点で接続を切断してしまう。
print("HTTP/1.1 200 OK\n")
LUA_RUN_SCRIPTなどでLuaスクリプトを実行している最中に、
追加でブラウザなどからLuaスクリプトを実行することは、一応できるようではあるが、
大抵動作が不安定になったり、メモリ不足が発生するため、おすすめしない。
特に、FTLEなどLuaスクリプトを使うツールが異常動作をする場合は、
裏で別のLuaスクリプトが動作していないか確認すべきである。
追加でブラウザなどからLuaスクリプトを実行することは、一応できるようではあるが、
大抵動作が不安定になったり、メモリ不足が発生するため、おすすめしない。
特に、FTLEなどLuaスクリプトを使うツールが異常動作をする場合は、
裏で別のLuaスクリプトが動作していないか確認すべきである。
ライブラリのコードサイズがおもいっきりメモリを食い潰すようです。
ライブラリ読み込み時にcollectgarbage()するのは当たり前と言ってもいいレベル。
ライブラリの方で読み込み時にcollectgarbage()するようになっていることもありますす。
ライブラリ読み込み時にcollectgarbage()するのは当たり前と言ってもいいレベル。
ライブラリの方で読み込み時にcollectgarbage()するようになっていることもありますす。
数学関数mathがない。ので、浮動小数点を切り捨てることすら出来ない。
ビット演算は適当に丸める(bankers roundで行われる)ため、
単に切り捨てたい時には使えない。(変な結果になります)
block = tonumber(string.format ("%d",num));
あるいは
block = num - (num%1)
おそらく後者のほうが早い。
参考:RoundingInFlashAir - Radi開別館
https://sites.google.com/site/radikaiwarehouse/lua...
ビット演算は適当に丸める(bankers roundで行われる)ため、
単に切り捨てたい時には使えない。(変な結果になります)
block = tonumber(string.format ("%d",num));
あるいは
block = num - (num%1)
おそらく後者のほうが早い。
参考:RoundingInFlashAir - Radi開別館
https://sites.google.com/site/radikaiwarehouse/lua...
- 3KBまでしか受信できない。
タイムアウトがない。→ タイムアウトは120秒エラーが起きると最悪応答がなくなる。- ポート番号も指定できない。
- ただ、TLS(https)はできる。
fa.pioはホストとの通信を妨害するようです。
ホストが初期化する前にpioを呼ぼうものなら、信号が衝突しますし、
初期化後に拒否られた状態でpioを呼び続けても不安定になるようです。
まずCONFIGファイルのIFMODEが1でなければ0(失敗)
関数を実行する前にSDカードが初期化されると0(失敗)
SDカードが初期化されていなければ1(成功)となりますが、
注意点として、例えすべてのピンを入力にしていたとしても、一度PIO関数を実行すると
FlashAirはPIOモードになるらしく、以降ホスト機器から初期化しようとしても失敗するようになるようです。
また、ホスト機器は電源を供給したからと言って即初期化するとは限らないため、
その間の時間の間にPIO関数を実行すると(電源を入れなおすまで)読み書き不能になり、
さらに、仮にホスト機器と出力信号がぶつかると、ホスト機器およびFlashAirが破壊する恐れがある。
少なくとも、PIO関数は、ホスト機器と接続されているか否かの判別には使用できない。
一応、衝突対策には、スクリプトの冒頭に下のような行を入れることで対処できます。
sleep(15000); --初期化を待つ
if(fa.pio(0,0) == 0)then return; end; --pioが使えない場合は処理を終了する
ホストが初期化する前にpioを呼ぼうものなら、信号が衝突しますし、
初期化後に拒否られた状態でpioを呼び続けても不安定になるようです。
まずCONFIGファイルのIFMODEが1でなければ0(失敗)
関数を実行する前にSDカードが初期化されると0(失敗)
SDカードが初期化されていなければ1(成功)となりますが、
注意点として、例えすべてのピンを入力にしていたとしても、一度PIO関数を実行すると
FlashAirはPIOモードになるらしく、以降ホスト機器から初期化しようとしても失敗するようになるようです。
また、ホスト機器は電源を供給したからと言って即初期化するとは限らないため、
その間の時間の間にPIO関数を実行すると(電源を入れなおすまで)読み書き不能になり、
さらに、仮にホスト機器と出力信号がぶつかると、ホスト機器およびFlashAirが破壊する恐れがある。
少なくとも、PIO関数は、ホスト機器と接続されているか否かの判別には使用できない。
一応、衝突対策には、スクリプトの冒頭に下のような行を入れることで対処できます。
sleep(15000); --初期化を待つ
if(fa.pio(0,0) == 0)then return; end; --pioが使えない場合は処理を終了する
例えば以下の様なスクリプトがある場合、
これをブラウザ(およびFTLE)から実行すると、大抵はc = -1(fa.requestの実行失敗)になる。
たとえ、現在つないでいるWi-Fi APに接続しなおしたとしても。
おそらく、ブラウザとの通信が強制的に切断されてスクリプトが動作不能になるか、
あるいは、Wi-Fi接続状況を変更できなくなるのか。
回避するには、
・ブラウザ(もしくはFTLE)から実行する場合は、Wi-Fi通信設定関係の操作をしない
・SDカードイベントもしくは、起動時実行から実行する
これをブラウザ(およびFTLE)から実行すると、大抵はc = -1(fa.requestの実行失敗)になる。
たとえ、現在つないでいるWi-Fi APに接続しなおしたとしても。
--Wi-FiアクセスポイントのSSID ssid="FlashAir"; --Wi-Fiアクセスポイントのパスワード networkkey="12345678"; --ここから fa.Disconnect(); sleep(3000); fa.Connect(ssid, networkkey); sleep(15000); --ここまでをコメントアウトすると動く。 b,c,h = fa.request("http://example.com/") f = io.open("file.txt","w") f:write(c); f:close();
おそらく、ブラウザとの通信が強制的に切断されてスクリプトが動作不能になるか、
あるいは、Wi-Fi接続状況を変更できなくなるのか。
回避するには、
・ブラウザ(もしくはFTLE)から実行する場合は、Wi-Fi通信設定関係の操作をしない
・SDカードイベントもしくは、起動時実行から実行する
FlashAirのLuaスクリプト実行機能に、
起動時に実行する"LUA_RUN_SCRIPT"という設定がありますが、これが結構クセモノです。
なにがクセモノかというと、スクリプトでエラーが起きたことを知る手段がありません。
それだけなのですが、それが本当に致命的。文法エラーひとつわからない。
デバッグの方法はRUN/EVENTのデバッグを参照。
ので、そんな時の切り分け方を以下に記します。
起動時に実行する"LUA_RUN_SCRIPT"という設定がありますが、これが結構クセモノです。
デバッグの方法はRUN/EVENTのデバッグを参照。
ので、そんな時の切り分け方を以下に記します。
CONFIGファイルのVERSIONを確認してください。
末端がW3.00.00の場合は古いバージョンですので、ファームウェアアップデートをしてください。
Luaスクリプトの実行に関していくつものバグが有ります。
末端がW3.00.00の場合は古いバージョンですので、ファームウェアアップデートをしてください。
Luaスクリプトの実行に関していくつものバグが有ります。
起動時に動くスクリプトなら、ブラウザからも実行できるはずです。
公式チュートリアルだとなぜか、一番最初にやることが起動時に実行になってますが、
正直ハマります。まずはブラウザからLuaスクリプトを叩いて実行できるか確認しましょう。
それで実行できないものはそもそも起動時にも実行できません。
FlashAirでは、実行エラーは出力なしのだんまりになります。
ちなみに、手前味噌ですが、FlashTools Lua EditorのDebug機能を使うと、
具体的に何のエラーが起きているのか知ることができます。
※ただし、Wi-Fi設定を変更するLuaスクリプトは、ブラウザからは正常に動きません!
公式チュートリアルだとなぜか、一番最初にやることが起動時に実行になってますが、
正直ハマります。まずはブラウザからLuaスクリプトを叩いて実行できるか確認しましょう。
それで実行できないものはそもそも起動時にも実行できません。
FlashAirでは、実行エラーは出力なしのだんまりになります。
ちなみに、手前味噌ですが、FlashTools Lua EditorのDebug機能を使うと、
具体的に何のエラーが起きているのか知ることができます。
※ただし、Wi-Fi設定を変更するLuaスクリプトは、ブラウザからは正常に動きません!
ファイルはブラウザ上ではリアルタイムに更新されますが、
PCなどからは確認できないことが多いです。
というのも、差込時に読み出し、その後の変化は知らんぷりなためです。
なので、実行が終わった辺りで差し込み直すといいでしょう。
ちなみに、LUA_RUN_SCRIPTは暴走防止等で、起動から実行まで最低5秒くらい待たされます。
PCなどからは確認できないことが多いです。
というのも、差込時に読み出し、その後の変化は知らんぷりなためです。
なので、実行が終わった辺りで差し込み直すといいでしょう。
ちなみに、LUA_RUN_SCRIPTは暴走防止等で、起動から実行まで最低5秒くらい待たされます。
割と見落としがちなのですが、LUA_RUN_SCRIPTはWi-Fi接続が確立する前から
実行が始まります。ので、スクリプト起動後すぐにfa.requestなどの通信をしようとしても、
どうやってもうまく行きません。
ブラウザでは動くのに起動時に動かないの大抵はこれです。
実行が始まります。ので、スクリプト起動後すぐにfa.requestなどの通信をしようとしても、
どうやってもうまく行きません。
ブラウザでは動くのに起動時に動かないの大抵はこれです。
コメントをかく