課題
AWS IoTに飛んできていたINT等の整数データが実はビットのフラグが並んだものだった場合、AWS IoT SQL使うとフラグに直して後続に渡すことも可能です。
対応
例えば my_data
という項目に8ビットフラグの整数が渡されてきた場合、以下の関数を使ってみます。
bitandで2の倍数のNとのANDを取って、0であるかどうかをBooleanにキャストして解決してみてます。
cast(bitand(my_data,N) as Boolean) as flag_name
Nに2の倍数入れることでフラグ位置を指定できるので以下のようなSQLが考えられます。
SELECT my_data as raw ,cast(bitand(my_data,1) as Boolean) as flag_1 ,cast(bitand(my_data,2) as Boolean) as flag_2 ,cast(bitand(my_data,4) as Boolean) as flag_3 ,cast(bitand(my_data,8) as Boolean) as flag_4 ,cast(bitand(my_data,16) as Boolean) as flag_5 ,cast(bitand(my_data,32) as Boolean) as flag_6 ,cast(bitand(my_data,64) as Boolean) as flag_7 ,cast(bitand(my_data,128) as Boolean) as flag_8 FROM 'my/topic/flagdata'
以下が実際に 0
77
255
を渡してきた場合の結果です。
{ "raw": 0, "flag_1": false, "flag_2": false, "flag_3": false, "flag_4": false, "flag_5": false, "flag_6": false, "flag_7": false, "flag_8": false } { "raw": 77, "flag_1": true, "flag_2": false, "flag_3": true, "flag_4": true, "flag_5": false, "flag_6": false, "flag_7": true, "flag_8": false } { "raw": 255, "flag_1": true, "flag_2": true, "flag_3": true, "flag_4": true, "flag_5": true, "flag_6": true, "flag_7": true, "flag_8": true }
と書いてきましたが、もっとキレイな書き方探したい人は以下のURL等で関数探したりで作ってみてください。