前回はMerakiのAPI使用について説明しました。今回はMerakiのWebhookを使用し、そのあとRaspberryを連携する方法を紹介します。よろしくお願いします。
Webhook?
WebhookはWeb CallbackやHttp push APIなど色々な名前もあり、それはServerがイベントが発生するとき送信側が情報を送信する仕組みになります。現在アプリケーションAとアプリケーションBの間にリアルタイムな情報提供が必要なとき、高い頻度でリクエストを送りデータの更新求めるよりWebbookを使用したほうが効率よい場合があります。
例えばGithubでよくあるResponsibilityをPushするたびに情報をSlackにお知らせするようなイメージです。
*MerakiのWebhookはPOSTリクエストです。
Reference Link
http://soup01.com/ja/category/cisco-ja/meraki/
Configure in Meraki Side
MerakiのDash BoardをLoginし>Network-wide>CONFIGURE>Alertsをクリックします。
Webhookの項目があり、これはWebhookを設定する画面です。
Test Server
次はTest Serverを用意します。
Your Unique URLのLINKをCOPYします。
そしてMerakiのDashboardに戻り、Webhook>Add an HTTP serverのボタンをクリックします。
Name:Server名
URL:先CopyしたTest Server URL
そしてWebhook Testsの下にあるSend test webhookをクリックします。
状態はEnqueuedに変わります。
Test ServerにMerakiからの通知が来ましたね!
そのリクエストをクリックするとWebhookの中身がみえます。
状態もDevliveredに変わり、つまり無事に届いたってことです。
Setup Raspberry
こちらは今回の構成です。RaspberryからLocal Severを立ち上げ>Ngrokに公開します。
MerakiからWebhookのURLをNrgrokに公開したServerのURLに設定し、通知を貰えるようにします。
Ngrok Setup
下記のLINKを参考にしてください。
Meraki Side
URLでNgrok公開したServer URLを貼り付けます。
Local Server Code
以下のCodeで簡単なHttp Serverを立ち上げ、常にPostリクエストに200を返答し、WebhookからもらったデータをPrintするだけのプログラムです。
import http.server import socketserver import json class MyHandler(http.server.BaseHTTPRequestHandler): def do_POST(self): self.send_response(200) self.end_headers() print(self.path) content_length = int(self.headers[‘Content-Length’]) post_data = self.rfile.read(content_length) print(post_data) def do_GET(self): self.send_response(200,”GET is received.”) print(“GET is received”) self.end_headers() with socketserver.TCPServer((“”, 8001), MyHandler) as httpd: httpd.serve_forever() |
Result
実際Testしてみると、Merakiから情報が来たらTerminalがRequest内容を出力します。
NgrokでPOSTのリクエストがきたとわかります。