FlashAirからLuaでJSONをPOSTしてNode-REDに連携するメモ

FlashAirからLuaでJSONをPOSTしてNode-REDに連携するメモです。

やりたいこと

image

FlashAirの起動時にLuaプログラムを動かして、シンプルな形でJSONデータをPOSTしてNode-REDとやりとりします。

FlashAirの設定

image

FlashAirの4世代を使用して設定を行います。

CONFIGの設定

FlashAir Developers – CONFIG

こちらを参考に SD_WLAN/CONFIG のCONFIGファイルを以下のように設定しました。

[Vendor]

CIPATH=/DCIM/100__TSB/FA000001.JPG
APPMODE=5
APPNAME=myflashair
APPSSID=APPSSID
APPNETWORKKEY=************
VERSION=VERSION
CID=CID
PRODUCT=FlashAir
VENDOR=TOSHIBA
MASTERCODE=MASTERCODE
LUA_RUN_SCRIPT=/Hello_Node-RED.lua

キモはLUA_RUN_SCRIPTです。このHello_Node-RED.luaがFlashAirが起動したときに実行されます。

APPSSID・APPNETWORKKEY・VERSION・CID・MASTERCODEあたりは適宜自分の環境に合わせて設定しておきましょう。APPMODEを5にしているのでSTAモードです。これでAPPSSID・APPNETWORKKEYの設定を行ってWi-Fiへ通信可能にしておきます。

Hello_Node-RED.lua

続いて、実行先のLuaプログラムです。

image

最上位の階層にHello_Node-RED.luaを置きます。先ほどのCONFIGで示したLUA_RUN_SCRIPTの /Hello_Node-RED.lua ですね。

プログラムは以下を参考にしました。

FlashAir非公式Luaチュートリアル – 3.Twitterでつぶやく – おまけ程度のツール置き場

こちらでPOSTの送り方を、

IFTTT Maker ChannelをFlashAirで使ってみた

こちらで、JSONデータの送り方を参考にしました。

/Hello_Node-RED.lua

sleep(15000);
local cjson = require "cjson"

mes = { 
    messageEN = "Hello Node-RED!!!", 
    messageJP = "やあ!のーどれっど!", 
	flag= "true"
}

mes = cjson.encode(mes)
len_s = tostring(string.len(mes))

b,c,h = fa.request{
    url = "http://163.43.30.76:1880/flashair_post",
    method = "POST",
    headers = {["Content-Length"] = len_s,["Content-Type"] = "application/json;charset=utf-8"},
    body = mes
}

print("HTTP/1.1 200 OK\r")
print("Content-Type:application/json;charset=utf-8;\r")
print("\r")
print(b)
print(c)

**** NODE-RED ADDRESS **** の部分は、Node-REDを起動しているサーバーアドレスにしましょう。私の場合は、さくらインターネットで起動しているNode-REDに向けて無事動きました。

その他に大事な点としては、起動時にWi-Fiつながるまでに少し時間がかかるのでsleepを15秒かけています。

Node-REDの設定

つづいて、Node-REDの設定です。

image

このようにシンプルにPOSTでJSONを受けて返答するだけの仕組みです。

image

http in ノードは以下のとおりです。

image

/flashair_post というURLで受けています。

image

このフローをデプロイした後にFlashAirで試しにURLと叩いてみると動作確認できました!

JSONフロー

JSONフローも置いておきます。

[
    {
        "id": "f27b4253.48fbf",
        "type": "http in",
        "z": "8554fe50.57faf",
        "name": "",
        "url": "/flashair_post",
        "method": "post",
        "upload": false,
        "swaggerDoc": "",
        "x": 310,
        "y": 420,
        "wires": [
            [
                "284c2301.87529c",
                "f500ec5e.7abf4"
            ]
        ]
    },
    {
        "id": "284c2301.87529c",
        "type": "debug",
        "z": "8554fe50.57faf",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "x": 500,
        "y": 420,
        "wires": []
    },
    {
        "id": "f500ec5e.7abf4",
        "type": "http response",
        "z": "8554fe50.57faf",
        "name": "",
        "statusCode": "",
        "headers": {},
        "x": 490,
        "y": 480,
        "wires": []
    }
]

動かしてみる

それではいざ動かしてみましょう。

image

FlashAirを差し込みます。

しばらく待っていると起動の5秒とスリープの15秒でだいたい20秒くらいでしょうか。

image

Node-REDのdebugノードが反応し、英語も日本語もしっかりデータがJSONで送られていることが確認できました。日本語が文字化けしないのも素敵ですね。

FlashAirでファイルをPOSTで送るサンプルは多かったのですが、このようにシンプルな形でJSONデータをPOSTで送るものが試せてよかったです。Node-REDとFlashAirを引き合わせることができました。

ひきつづき、いろいろと試してみます。