Help us understand the problem. What is going on with this article?

「あの日止まったままの時計」がまた動き出してしまわないか心配すぎた。

More than 1 year has passed since last update.

こんちには。

「あの日止まったままの時計」がまた動き出したりしないかが気になって眠れない夜もあるので、
SkyWayでWebRTC的に遠隔監視できるって噂を聞いて試してみました。

注目してほしいポイントは以下ですが、この記事は技術記事です。

  • あの日とは
  • なぜ止まったままにしてあるか。
  • 無事監視できるようになったのか。

私を取り巻く環境(開発環境)

  • MacBookPro2018
  • RaspberryPi3
    • OS:Raspbian
    • SD:32GB
    • RasPiカメラモジュール(非正規品だと思います。)
  • あの日止まったままの時計

実物

主役はこのように、あの日止まったままの時計です。一刻も刻む様子はありません。
まるで、壁に落書きをしたかのような時計です。私のマイフェイバリットお気に入りです。

※iPhoneによる撮影です
Image from Gyazo

もちろん心配性な私は、電池を抜いています。
56269979_422909941799994_3104073598982160384_n.jpg

そして、これもあの日止まったままと言ってもよいレベルのラズパイとカメラモジュールです。この子は動かしたいと思います。
56165201_2176595309095010_2041617677725728768_n.jpg

RasPiにOSインストール

OS入れて遊んだ記憶があるのに、SDカードの中身は空っぽでした。
そんな私に手を差し伸べるかのような記事があったので、参考にさせてもらいました。

Raspberry Pi 3にRaspbianをインストール(Mac OS X を使用)

SkyWayを使う

SkyWayをはじめる系の記事はたくさんあったので、とてもスムーズに環境構築が進みました。
ハンズオンの資料がそのまま入門書になってくれていました。感謝です。

SkyWay WebRTC Gatewayハンズオン

順調に進む

とても順調です。楽々に遠隔監視できそうです。
安心して眠れる日も近づいてきました。
気がつけばラズパイの扱いにも慣れてきました。
時計が止まっているので、気がついたら外は明るくなっていました。

SkyWayを試すための環境構築

ハンズオンの資料に基づき、準備は整った。
ラズパイの方でrubyでプログラムをコピペってきたやつをいじって、中身は理解したし、
必要なものは、ホームディレクトリに取り合えず全部置いちゃうぞ!ラズパイだからゼロキロカロリーだ!!
Mac側でサーバ動かす準備も完了だ!監視画面もいけるぞー!

時は訪れた

1コ目のターミナルでWebRTC Gatewayを起動!

$ ./gateway_linux_arm

2個目のターミナルでメインプログラムを起動だ!
環境変数にAPIキーを入れて呼び出したほうが安全だから、exportコマンドするよ。

$ export API_KEY=私のAPIキーをここに入れた
$ ruby webrtc_control.rb PEER_ID

よーし!あとはMac側でサーゔぁっ!?

えっ。400 Bad Request?
えっ。403 Forbidden?

Image from Gyazo

愚かな自分との戦い

まーまー。理解するために色々いじっちゃったから、冷静に調査すれば自分の愚かな凡ミスに気づくさ。
エラーになっている箇所はどうやら、requestの部分っぽいな。仕様をみてみよう。

|  /peers: |
|:--|
|     post: |
|       tags: |
|         - 1.peers |
|       summary: Peerオブジェクトを生成し、SkyWayサーバと接続します |
|       description: Peerオブジェクトを生成し、SkyWayサーバと接続します。SkyWayサーバと正常に接続できた場合のみ201を返します。 |
|       operationId: peer |
|       consumes: |
|         - application/json |
|       produces: |
|         - application/json |
|       parameters: |
|         - in: body |
|           name: body |
|           description: SkyWayサーバへアクセスするための情報を指定します |
|           required: true |
|           schema: |
|             $ref: '#/definitions/PeerOptions' |
|       responses: |
|         '201': |
|           description: Created |
|           schema: |
|             $ref: '#/definitions/PeerResponse' |
|         '400': |
|           description: Invalid input |
|           schema: |
|             required: [ "command_type", "params" ] |
|             properties: |
|               command_type: |
|                 type: string |
|                 example: "PEERS_CLEATE" |
|               params: |
|                 type: object |
|                 required: [ "errors" ] |
|                 properties: |
|                   errors: |
|                     type: array |
|                     items: |
|                       type: object |
|                       properties: |
|                         field: |
|                           type: string |
|                           example: key |
|                         message: |
|                           type: string |
|                           example: "key field is not specified" |
|         '403': |
|           description: Forbidden(key, domainが間違っている場合) |
|         '405': |
|           description: Method Not Allowed |
|         '406': |
|           description: Not Acceptable |
|         '408': |
|           description: Request Timeout |

なるほど、400 Bad Requestは、とにかくなんかそもそも違うことになっているんやな。
メインのwebrtc_control.rbを見返してみよう。

webrtc_control.rb
if __FILE__ == $0
  if ARGV.length != 1
    p "please input peer id"
    exit(0)
  end
  # 自分のPeer IDは実行時引数で受け取っている
  peer_id = ARGV[0]

  # SkyWayのAPI KEYは盗用を避けるためハードコーディングせず環境変数等から取るのがbetter
  skyway_api_key = ENV['']
  # SkyWay WebRTC GatewayにPeer作成の指示を与える
  # 以降、作成したPeer Objectは他のユーザからの誤使用を避けるためtokenを伴って操作する
  peer_token = create_peer(skyway_api_key, peer_id)
  # WebRTC GatewayがSkyWayサーバへ接続し、Peerとして認められると発火する
  # この時点で初めてSkyWay Serverで承認されて正式なpeer_idとなる
  media_connection_id = ""
  process_id = ""
  th_onopen = listen_open_event(peer_id, peer_token) {|peer_id, peer_token|
    (media_connection_id, process_id) = on_open(peer_id, peer_token)
  }

あ、見つけた。skyway_api_keyの変数にAPI_KEYを環境変数から持ってくるのに、ENV['API_KEY']になってない!
なんでこんなことに?まぁ直したからOK!

駄菓子菓子(ダガシカシ)

403 Forbiddenくん。キミは正直お手上げだ、うん。
Forbidden(key, domainが間違っている場合)すごく確認した。絶対間違ってない!(多分)
それに丸コピしてもう一度手順をやり直してもダメだった。
きっと日頃の行いが悪かったんだ。戒めよう。

どなたか教えてください

ここで時を止めることになるとは。
置き場のない気持ちとラズパイを手に、止まった時計を眺める。
キミを遠隔で監視できたら......

※ラズパイcameraで撮影
Image from Gyazo

今日もキミは動いていない

"動いていない"からこそ安心できるのである。
時刻を知りたいなら、画面の右上にカーソル合わせるし、本気出せばアレクサが教えてくれる。

あの日

冬のある日、動いてたキミを信用して何度も布団にくるまった。
午前8時35分が永遠に続いていることに気がつくその時まで......

SkyWayアドベントカレンダー2018 17日目の記事でした。
こちらもどうやらあの日で止まっていたようです。

iotlt
IoT縛りの勉強会です。 毎月イベントを実施しているので是非遊びに来てください! 登壇者を中心にQiitaでも情報発信していきます。 https://iotlt.connpass.com
https://iotlt.connpass.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした