tag:crieit.net,2005:https://crieit.net/tags/mqtt/feed
「mqtt」の記事 - Crieit
Crieitでタグ「mqtt」に投稿された最近の記事
2019-12-02T07:00:07+09:00
https://crieit.net/tags/mqtt/feed
tag:crieit.net,2005:PublicArticle/15573
2019-12-02T07:00:07+09:00
2019-12-02T07:00:07+09:00
https://crieit.net/posts/d2e5218181c66086dd0e423f1bc427a9
ボウリング幹事アプリを作りました。
<p>この記事は<a href="https://crieit.net/advent-calendars/2019/crieit">なんでも Advent Calendar 2019</a>の2日目の記事です。<br />
昨日はだら@Crieit開発者さんの「<a href="https://crieit.net/posts/688d4075e654935779abc887cfe485aa">お金も名声も得ることを考えなかったら何を作りたいんだろう?</a>」という記事でした。</p>
<h1 id="ボウリング幹事アプリを作りました"><a href="#%E3%83%9C%E3%82%A6%E3%83%AA%E3%83%B3%E3%82%B0%E5%B9%B9%E4%BA%8B%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E4%BD%9C%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F">ボウリング幹事アプリを作りました</a></h1>
<p><a href="https://crieit.now.sh/upload_images/3cebc8b53a7a1a70fcf9eb56cb0dfce15dda909adf110.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/3cebc8b53a7a1a70fcf9eb56cb0dfce15dda909adf110.jpg?mw=700" alt="" /></a><br />
練習用のレーンを用意しました。ご自由にお使いください。<br />
- <a target="_blank" rel="nofollow noopener" href="https://letsbowling.netlify.com/editor/sandbox">https://letsbowling.netlify.com/editor/sandbox</a></p>
<h2 id="どんなアプリ?"><a href="#%E3%81%A9%E3%82%93%E3%81%AA%E3%82%A2%E3%83%97%E3%83%AA%3F">どんなアプリ?</a></h2>
<p>ボウリング大会などの幹事さん向けに、複数レーンにまたがる大会の<strong>スコアのリアルタイム共有</strong>などができるアプリです。<br />
閲覧専用(参加者向け)と管理用(運営者向け)でURLを分けています。</p>
<h3 id="URLシェア(QRコード)"><a href="#URL%E3%82%B7%E3%82%A7%E3%82%A2%28QR%E3%82%B3%E3%83%BC%E3%83%89%29">URLシェア(QRコード)</a></h3>
<h3 id="選手情報入力"><a href="#%E9%81%B8%E6%89%8B%E6%83%85%E5%A0%B1%E5%85%A5%E5%8A%9B">選手情報入力</a></h3>
<p>チーム名・選手名を入力できます。</p>
<h3 id="各ゲームスコア入力"><a href="#%E5%90%84%E3%82%B2%E3%83%BC%E3%83%A0%E3%82%B9%E3%82%B3%E3%82%A2%E5%85%A5%E5%8A%9B">各ゲームスコア入力</a></h3>
<p>内訳は入力できないのですが、スコアを入力すると後述のソート機能を使うことができます。</p>
<h3 id="ソート・HDCP算出機能"><a href="#%E3%82%BD%E3%83%BC%E3%83%88%E3%83%BBHDCP%E7%AE%97%E5%87%BA%E6%A9%9F%E8%83%BD">ソート・HDCP算出機能</a></h3>
<ul>
<li>合計モード<br />
合計を算出、ソートしたいゲームにチェックを入れます。</li>
<li>HDCPモード<br />
HDCP(<strong>ハンディキャップ</strong>)はチェックを入れたゲームを対象に計算され、HDCPの項で選択したゲームのスコアとハンディキャップの合計でソートします。</li>
</ul>
<p><a href="https://crieit.now.sh/upload_images/102e92a702e89059033b1dff5b0f87c55ddfcf8f27bf9.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/102e92a702e89059033b1dff5b0f87c55ddfcf8f27bf9.jpg?mw=700" alt="" /></a></p>
<h3 id="動作イメージ"><a href="#%E5%8B%95%E4%BD%9C%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8">動作イメージ</a></h3>
<div class="iframe-wrapper"><iframe width="560" height="315" src="https://www.youtube.com/embed/mAIHE4E44Vo" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div>
<h3 id="開発期間"><a href="#%E9%96%8B%E7%99%BA%E6%9C%9F%E9%96%93">開発期間</a></h3>
<p>3週間(平日夜とか土日)</p>
<h2 id="使っている技術"><a href="#%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E6%8A%80%E8%A1%93">使っている技術</a></h2>
<h3 id="MQTT"><a href="#MQTT">MQTT</a></h3>
<p>先日、<a href="https://crieit.net/posts/MQTT">MQTTを使ってみよう</a>という記事を書きましたが、このWEBアプリの目玉の技術です。<br />
このアプリは<strong>DBサーバなしで動いています</strong>が、MQTTでメッセージを送受信して複数人で同じデータ(ローカルストレージ)を共有することによって画面共有を実現しています。</p>
<p>DBサーバ立てるの面倒だな、ローカルストレージを共有する方法ないかな、と思ってたどり着いたのがこれ。後はWebRTCやWebSocketは候補にありました。</p>
<p>複数台(PC/モバイル)で同じ画面を見ながら操作していただくとわかると思いますが、表示を同期することができます。<br />
これをサーバ(DB/AP)への問い合わせなしで実現しました。<br />
<a href="https://crieit.now.sh/upload_images/102e92a702e89059033b1dff5b0f87c55de2900126be6.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/102e92a702e89059033b1dff5b0f87c55de2900126be6.jpg?mw=700" alt="" /></a></p>
<h3 id="ReactJS"><a href="#ReactJS">ReactJS</a></h3>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://github.com/atlassian/react-beautiful-dnd">react-beautiful-dnd</a><br />
ドラッグアンドドロップ</li>
<li><a target="_blank" rel="nofollow noopener" href="http://igorprado.com/react-notification-system/">react-notification-system</a><br />
メッセージ通知</li>
</ul>
<h3 id="local storage"><a href="#local+storage">local storage</a></h3>
<p>データの保存に各端末のローカルストレージを使っています。</p>
<h1 id="おわりに、今年リリースしたもの"><a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB%E3%80%81%E4%BB%8A%E5%B9%B4%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%97%E3%81%9F%E3%82%82%E3%81%AE">おわりに、今年リリースしたもの</a></h1>
<ul>
<li>08/18リリース:<a href="https://crieit.net/posts/cb42a72a9e70af9ea472af216219e0e8">タイピングスコア管理システム</a></li>
<li>08/21リリース:<a href="https://crieit.net/boards/baseball-score-management/f51b909e24c84342ac946117b65d092e">キャップ野球・全国大会非公式特設サイト</a></li>
<li>10/06リリース:<a href="https://crieit.net/boards/baseball-score-management/JCBL-SCORE-ver3">野球リーグスコア管理システム ver3α</a></li>
<li>10/21リリース:<a href="https://crieit.net/posts/4b0c9a1ddc05a0cc0ff61db75530b9b0">ドラフト風画像作成サービス「ドラフトなう!」</a></li>
<li>10/27リリース:<a href="https://crieit.net/posts/AnnictAccess3">アニメランキング作成サービス「Annict Access 3」</a></li>
<li>11/04リリース:<a href="https://crieit.net/boards/baseball-score-management/ReactNative">野球リーグandroidアプリ</a></li>
<li>11/17リリース:<a href="https://crieit.net/posts/509e31a0bbc4ffe7a1003278816c9e5d">音楽ランキングメーカー</a></li>
<li>12/01リリース:<a href="https://crieit.net/boards/baseball-score-management/d3a03b2eecede278f5eb211aaff9a6a2">優勝ラインシミュレーター</a></li>
<li>12/02リリース:<strong>ボウリング幹事アプリ「bowling party manager」</strong></li>
</ul>
ckoshien
tag:crieit.net,2005:PublicArticle/15557
2019-11-21T23:48:51+09:00
2019-11-21T23:48:51+09:00
https://crieit.net/posts/MQTT
MQTTを使ってみよう
<h1 id="MQTT(MQ Telemetry Transport)とは?"><a href="#MQTT%28MQ+Telemetry+Transport%29%E3%81%A8%E3%81%AF%EF%BC%9F">MQTT(MQ Telemetry Transport)とは?</a></h1>
<ul>
<li><a target="_blank" rel="nofollow noopener" href="https://ja.wikipedia.org/wiki/MQ_Telemetry_Transport">wikipedia</a></li>
</ul>
<p>通信プロトコルの一種でPub/Sub型のデータ配信モデル。<br />
軽量プロトコルのため、主にIoTの分野で使われていることが多いです。</p>
<h2 id="Pub/Sub型"><a href="#Pub%2FSub%E5%9E%8B">Pub/Sub型</a></h2>
<p>Pub/Sub型に関わるのは次の3者。</p>
<ul>
<li>Publisher メッセージを出す人</li>
<li>Subscriber メッセージを読む人</li>
<li>Broker 配送業者(中継サーバ)</li>
</ul>
<p>履歴の残らないLINE、という感じでしょうか。</p>
<h1 id="中継サーバを立ててみよう"><a href="#%E4%B8%AD%E7%B6%99%E3%82%B5%E3%83%BC%E3%83%90%E3%82%92%E7%AB%8B%E3%81%A6%E3%81%A6%E3%81%BF%E3%82%88%E3%81%86">中継サーバを立ててみよう</a></h1>
<p><a target="_blank" rel="nofollow noopener" href="https://hub.docker.com/_/eclipse-mosquitto">eclipse-mosquitto</a>というMQTTサーバのdockerイメージが配布されています。</p>
<p>今回はホストの1883番ポートにmosquittoサーバを公開します。<br />
さらにリバースプロキシの後ろに配置するため、nginxと同じnetwork(ここでは<strong>default</strong>)に接続します。</p>
<p><strong>docker-compose.yml(抜粋)</strong></p>
<pre><code class="yml"> mosquitto:
image: eclipse-mosquitto
hostname: mosquitto
container_name: mosquitto
ports:
- "1883:1883"
volumes:
- ./mosquitto.conf:/mosquitto/config/mosquitto.conf
networks:
- default
</code></pre>
<p><strong>moquitto.conf(一部)</strong></p>
<pre><code class="conf"># ========================================================
# Default listener
# ========================================================
# Port to use for the default listener.
port 1883
# Choose the protocol to use when listening.
protocol websockets
# listener port-number [ip address/host name]
listener 9001
</code></pre>
<p><strong>nginx.conf(listen 443)</strong></p>
<pre><code> location /mqtt {
proxy_pass http://mosquitto:1883/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
</code></pre>
<h1 id="クライアント(react)側実装"><a href="#%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%28react%29%E5%81%B4%E5%AE%9F%E8%A3%85">クライアント(react)側実装</a></h1>
<pre><code class="javascript">import PahoMQTT from "paho-mqtt";
const uuidv4 = require('uuid/v4');
//wssを利用する
const client = new PahoMQTT.Client(
'******',443,uuidv4()
);
export const connect=()=>{
client.connect({
userName: "******",
password: "********",
useSSL: true,
onSuccess,
onFailure
});
client.onMessageArrived = onMessageArrived;
client.onConnectionLost = onConnectionLost;
}
const onSuccess=()=>{
client.subscribe(TOPIC);
}
const onFailure=()=>{
console.log('connect failed.')
}
export const onMessageArrived=(message)=>{
console.log(message.payloadString);
}
export const send=(message)=>{
client.send(TOPIC, message, 0, false);
}
function onConnectionLost(responseObject) {
if (responseObject.errorCode !== 0) {
connect();
}
}
</code></pre>
<h1 id="アドベントカレンダー"><a href="#%E3%82%A2%E3%83%89%E3%83%99%E3%83%B3%E3%83%88%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC">アドベントカレンダー</a></h1>
<ul>
<li><a href="https://crieit.net/advent-calendars/2019/crieit">crieitアドベントカレンダー「なんでも」</a></li>
</ul>
<p>2日目に登板予定です。<br />
MQTTを基礎技術に使ったアプリを作る予定です。</p>
ckoshien