AWS IoT SQLでINT等の整数で渡されたBIT FLAGの値を取り出す

課題

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等で関数探したりで作ってみてください。

docs.aws.amazon.com