require 'awsiot_shadow' @_host = 'ABCDEF.iot.ap-northeast-1.amazonaws.com' _certdir = '/home/user1/certs' @_ca_file = _certdir + '/aws-iot-rootCA.pem' @_key_file = _certdir + '/privkey.pem' @_cert_file = _certdir + '/cert.pem' shadow_client = Centurysys::AWSIotShadow.new( :host => @_host, :ca_file => @_ca_file, :key_file => @_key_file, :cert_file => @_cert_file, :thing_name => 'TestThing', :client_id => 'test', :keep_alive => 15 ) # AWS IoTのMQTTブローカーに接続する。 shadow_client.connect() now_state = nil # AWS IoTから、デバイスに設定すべきShadowの初期状態を取得する。 timeout(5) { now_state = shadow_client.get } # 実際にはここでnow_stateに従ってデバイスの状態を変える # AWS IoT上にあるShadowの状態を、デバイスに設定した状態に更新する。 timeout(5) { shadow_client.update(now_state) } p "start main loop" while true delta = nil begin # AWS IoTから、Shadowの更新を取得する。(ここでは5秒間でtimeoutするようにしている) timeout(5) { delta = shadow_client.yield } p delta # デバイスの状態(now_state)をdeltaに従って変える。 delta.each_key { |key| if (now_state[key] != delta[key]) then # changing device state to delta(desired) state now_state[key] = delta[key] end } # AWS IoTのShadowの状態を、デバイスに設定した状態に更新する。 timeout(5) { shadow_client.update(now_state) } rescue Timeout::Error # タイムアウトした(ここではそのまま次のループへ) p "Timeout occured. wait again" end end