http命令について byスマートフォン勉強会@関西#14で話をしました (4)
http命令は、http.addHeader( ヘッダ名, 内容 )、http.get( URL, 取得ファイル名 )、http.status()の3つです。これらの命令でヘッダのセット、ファイルの取得、取得状態チェックを行います。
http命令によるファイルの取得処理は、luaプログラムから独立しているので、http.status()を使って処理が終わったかどうかを確認する必要があります。http.status()が返す内容は図のように8通りあり、1が返ってくると取得に成功しています。
下記に、すまべんで使用したデモプログラムを書いておきます。詳しくは、ここのブログで説明しています。
------------------------------------------ --画像取得サンプル ------------------------------------------ --関数宣言-------------------------------- main={} --mainメソッド initPicture={} --ワークエリアに画像を読み込みます getNextTime={} --今の時間から次の時分を求めます jiwajiwaDisp={} --画像をじわじわ表示する getPicture={} --指定時刻の画像を読み込む printscrl={} --スクロールするテキスト表示 --グローバル変数宣言---------------------- Gwide, Gheight = canvas.getviewSize() --画面サイズ取得 PicName = "/picture.jpg" LuaridaPath=system.getCardMnt().."/luarida" --luaファイルを保存しているPath ------------------------------------------ mt={} mt.__newindex=function(mtt,mtn,mtv) dialog( "Error Message", "宣言していない変数 "..mtn.." に値を入れようとしています", 0 ) toast("画面タッチで実行を続けます", 1) touch(3) end mt.__index=function(mtt,mtn) dialog( "Error Message", "変数 "..mtn.." は宣言されていません", 0 ) toast("画面タッチで実行を続けます", 1) touch(3) end setmetatable(_G,mt) --------以下が実プログラム---------------- ------------------------------------------ --スクロールするテキスト表示 ------------------------------------------ function printscrl( str, fontsize, fcolor, bcolor ) local sc --一度、見えないところにテキストを書いて、改行数を求める sc = canvas.drawTextBox( str, 0, Gheight+1, fontsize, fcolor, Gwide ) --画面の絵をワークエリアに取り込みます canvas.getg( 0, fontsize*sc, Gwide-1, Gheight-1, 0, fontsize*sc, Gwide-1, Gheight-1 ) --取り込んだ画面をスクロールさせて描きます canvas.putg( 0, 0, Gwide-1, Gheight-fontsize*sc-1, 0, fontsize*sc, Gwide-1, Gheight-1 ) --書き出す部分をバックカラーで塗り潰します canvas.drawRect( 0, Gheight-fontsize*sc-1, Gwide, Gheight, bcolor, 1 ) --スクロールしたところにテキストを書きます canvas.drawTextBox( str, 0, Gheight-fontsize*sc, fontsize, fcolor, Gwide ) end ------------------------------------------ --指定時刻の画像を読み込む ------------------------------------------ function getPicture( tm ) local url = "http://www.bijint.com/jp/img/clk/"..tm..".jpg" http.addHeader( "Referer" , "http://www.bijint.com/" ) http.get( url, LuaridaPath..PicName ) end ------------------------------------------ --画像をじわじわ表示する ------------------------------------------ function jiwajiwaDisp() local i for i=0,255,8 do canvas.drawCls( color(255,255,255,i) ) end for i=255,0,-8 do canvas.putg( 0,0,Gwide-1,Gheight-1, 0,0,Gwide-1,Gheight-1 ) canvas.drawCls( color(255,255,255,i) ) end canvas.putg( 0,0,Gwide-1,Gheight-1, 0,0,Gwide-1,Gheight-1 ) canvas.putflush() end ------------------------------------------ --今の時間から次の時分を求めます ------------------------------------------ function getNextTime() local hm = os.date("%H%M") local h = tonumber(string.sub( hm, 1, 2 )) local m = tonumber(string.sub( hm, 3, 4 )) local tm = "" m = m + 1 if( m>59 )then m = 0 h = h + 1 if( h>59 )then h = 0 end end if( h<10 )then tm = "0"..tostring(h) else tm = tostring(h) end if( m<10 )then tm = tm.."0"..tostring(m) else tm = tm..tostring(m) end return tm end ------------------------------------------ -- ワークエリアに画像を読み込みます ------------------------------------------ function initPicture() local filename local wide,height local bwide, bheight local rx, ry --ワークエリア画面をクリアします canvas.workCls(color(0,0,0)) filename = LuaridaPath..PicName --サイズの取得 wide, height = canvas.getBmpSize( filename ) if( height*Gwide/wide>Gheight )then bwide = wide*Gheight/height bheight = Gheight rx = (Gwide - bwide)/2 ry = 0 else bwide = Gwide bheight = height*Gwide/wide rx = 0 ry = (Gheight-bheight)/2 end --local str = Gwide.." "..Gheight.." "..wide.." "..height --local str = bwide.." "..bheight --printscrl( str, 30, color(0,0,0), color(255,255,255) ) --touch(3) if( canvas.loadBmp( filename, rx, ry, rx+bwide-1, ry+bheight-1 )==-1)then return -1 end --if( canvas.loadBmp( filename, 0, -23, Gwide-1, 342 )==-1)then return -1 end return 0 end ------------------------------------------ --メインプログラム ------------------------------------------ function main() local i local sta --メイン画面サイズを設定する canvas.setMainBmp( Gwide, Gheight ) --メイン画面のサイズ設定 canvas.setWorkBmp( Gwide, Gheight ) --ワークエリアも一緒のサイズにする --画面を黒くする canvas.drawCls( color(0,0,0) ) --今の時刻の画像を読み込む getPicture( os.date("%H%M") ) --少し待つ for i=0,5000 do sta = http.status() if( sta~=0 )then break end end if( sta==1 )then --読み込み成功 if( initPicture()==0 )then jiwajiwaDisp() --画像をじわじわ表示する end end --読み込みに失敗したら諦める local tmg = os.date("%H%M") --今の時間を取得する sta = 2 while( true )do if( sta>1 )then --canvas.drawText( os.date("%S").." "..sta, 0,0,30,color(255,255,255), color(0,0,0) ) --次の画像を取得する getPicture( getNextTime() ) end sta = http.status() --http取得statusを読み込む(読み込み中=0,正常終了=1) if( tmg~=os.date("%H%M") )then --時間が変ったときは画像を切り替える if( initPicture()==0 )then jiwajiwaDisp() --画像をじわじわ表示する --picgetFlg = 0 --読み込み成功フラグを0にする tmg = os.date("%H%M") --今の時間を再設定する sta = 2 end end local x,y,s = touch() if( s~=1 )then s = dialog( "美人時計" , "終了しますか?", 2 ) if( s==1 )then break end end end end main() system.exit()
以上です。