気象庁防災情報XMLを取得してWebSocketでクライアントに送信する

2017.10.08

気象庁防災情報XMLをPubSubHubbubで取得してWebSocketでクライアントに送信する.

仕組み

気象庁 ->    サーバ -> クライアント
  PubSubHubbub  WebSocket

サーバ受信側(CGI)

新しい文書があると,気象庁からsubscriber.phpがPOSTメソッドで呼ばれ, XMLファイルを保存する. 登録失敗するので,このファイルの末尾に改行を入れてはいけない.

pisite/subscriber.php at master · noyuno/pisite

受信ファイルの自動削除

古い文書を自動で削除しないとストレージを1週間で1GBくらい消費するので,crondなどで定期的に消す.

pisite/rm.sh at master · noyuno/pisite

サーバ送信側(Systemd service/HTTP/WebSocket)

Systemdサービスとして実行. CGIで保存されたXMLファイルをwatchdogが監視する. ファイルの作成を検知したらTornadoを使って WebSocketですべての接続済みクライアントに送る. 送るデータは,XMLファイルのリンクとXMLを開けて取得したタイトル,日付,題名など. ある時間経過すると,watchdogがファイルを監視しなくなってしまったため, 1分ごとにObserverの開始,終了を繰り返している. NginxでXMLファイルを取得できるよう設定.

pisite/websocket.py at master · noyuno/pisite

クライアント側

コマンド

  • cache: 直近500件のデータを取得

コマンドの入力にかかわらず,接続中であれば新しい文書が到達するとリアルタイムでデータが飛んでくるようになっている.

データ構造

wsdump.py ws://localhost:8000
{
    "data": [
        {
            "id": "c69643ce-0cb4-36a1-a1fe-dd12117fa29c",
            "infokind": "気象警報・注意報",
            "link": "http://noyuno.space/jma/data/c69643ce-0cb4-36a1-a1fe-dd12117fa29c.xml",
            "target-datetime": "2018-03-05T10:48:00+09:00",
            "text": "熊本、天草・芦北地方では、強風や高波に注意してください。天草・芦北地方では、高潮に 注意してください。熊本県では、竜巻などの激しい突風や急な強い雨、落雷に注意してください。",
            "title": "熊本県気象警報・注意報"
        },...
    ],
    "event": "cache",
    "status": true
}

フロントエンド

フロントエンドは,WebSocketでサーバからの新しい文書を待ち, 飛んでくるとクライアントは 必要に応じてXMLファイルをHTTP GETでより詳細なデータを取得することとなっている.

Web

/jma

[image](/images/2017-10-08-jma.png)

CLI

  • jmaで直近の文書表を表示
  • jma -kで上記に加えてWebSocketでリッスン

dotfiles/jma at master · noyuno/dotfiles


新しい記事: GitBucketを更新する 2017.10.09
古い記事: Chromecastを操作する 2017.10.08