2020年7月6日月曜日

棚卸パッケージをクラウド対応できなかった話

このブログはほとんど〇〇してみた、□□できましたっていう記事で占められていると思うのですが、今日はうまくいかなかった話。

以前にも棚卸パッケージをクラウド対応するっていう話がありました。その概要はGoogle Apps ScriptでAPIを作成して、Androidアプリを改造して通信先をそのAPIに向けるというものでした。今回はちょっとアプローチを変えて、Androidアプリはそのままで、この記事で試したように、WebとはBluetooth経由で通信しようと考えました。

使ったもの


やったこと

クラウド側にはGoogle Spreadsheetを使用しました。アドオンでSpreadsheetに機能を追加できるので、これを使用しました。アドオンでは、呼び出し元をgsで記述、UIをhtmlで作成して、動作をJavascriptで記述することができます。こんな感じです。

呼び出し元
function onInstall(e) {
  onOpen(e);
}
function onOpen(e) {
  var ui = SpreadsheetApp
    .getUi()
    .createAddonMenu()
    .addItem('リーダ', 'showSidebar')
    .addToUi();
}
function showSidebar() {
  var sidebarUi = HtmlService
    .createTemplateFromFile('Sidebar')
    .evaluate()
    .setTitle('MANICA');
  SpreadsheetApp
    .getUi()
    .showSidebar(sidebarUi);
}

UI
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <link rel="stylesheet" href="https://ssl.gstatic.com/docs/script/css/add-ons1.css">
  </head>
  <body>
    <div>
      <form>
      <p>
      <select id="inputMode">
      <option value="fill">セルへ入力する</option>
      <option value="findTag">ICタグを探す</option>
      <option value="findCell" selected>セルを探す</option>
      </select>
      </p>
      </form>
      <button id="connect" onclick="readerLibrary.start();">接続</button>
    </div>
    <?!= HtmlService.createHtmlOutputFromFile('ReaderLibrary').getContent(); ?>
  </body>
</html>

Javascript(GAS上では拡張子はhtmlしか設定できないみたいです)
<script>
window.readerLibrary = {
    writer: undefined,
    encoder: undefined,
    start: async function () {
        const requestOptions = {};
        let port;
        try {
            port = await navigator.serial.requestPort(requestOptions);
            await port.open({ baudrate: 115200 });
        } catch (err) {
            console.log(err);
            return;
        }
        console.log('connected: ' + port);
        while (port.readable && port.writable) {
            console.log('readable and writable');
            this.encoder = new TextEncoder();
            this.writer = port.writable.getWriter();
            const decoder = new TextDecoder();
            const reader = port.readable.getReader();
            while (true) {
                console.log('while loop');
                let value, done;
                try {
                    ({ value, done } = await reader.read());
                } catch (err) {
                    console.log(err);
                    break;
                }
                if (done) {
                    break;
                }
                //this.handleChunk(decoder.decode(value));
               // this.dotNet.invokeMethod('OnReceived', value);
               console.log(value);
            }
            this.writer.releaseLock();
            reader.releaseLock();
            await port.close();
            console.log('disconnected');
        }
        console.log('while loop done');
    }
};
</script>

メニューから作ったアドオンを選択すると、こんな感じで表示されます。


あとは接続ボタンを押せばつながるはずと思ったのですが、残念ながら下記のエラーが表示されて、うまくいきませんでした。


userCodeAppPanel:9 [Violation] Feature policy violation: serial is not allowed in this document.

エラーメッセージを基に調べてみると、下記のIssueが見つかりました。(下記はgeolocationに関するIssueですが、今回のとエラーの原因は同じと思います)

feature policyでserialを許可する必要があるみたいなのですが、Spreadsheetのアドオンからですと、iframeを使った方法もresponse headerを使う方法もどちらも提供されていないようです。そのため、このやり方ではうまく行かず、まったく別の方法を考える必要があるようです。という訳で、うまくいかなかった話でした。

実は上記のあと、Office 365でもチャレンジしてみたのですが、チュートリアルでエラーが出てしまい、挫折しました。

2020年7月3日金曜日

厚さ5mmの各種素材で読み取り距離を比較してみた

ゴム、木などの各種素材の読み取り距離を比較してみました。

NHK「チコちゃんに叱られる!」で、ゴムの分子は水のように自由に動き回っているので伸び縮みする、との放送を見て、前回は氷で実験した流れもあり、ゴムで読み取り実験してみようと思ったのがきっかけです。

https://xn--h9jua5ezakf0c3qner030b.com/10333.html

厚さ5mmのNRゴム(天然ゴム)を入手したのですが、ゴムだけでは物足りないので、
後日、東急ハンズにて、同じ厚さ5mmの素材を探して比較してみることにしました。

使用したリーダーとタグ

・デンソー BHT-1281
・ALN-9654(Gタグ)

素材は以下の5種類になります。(安い素材を選択しました)

① NRゴム(天然ゴム)
  天然ゴムを主原料とした最もゴムらしい素材を選択しました。
② EVA(エチレン酢酸ビニール)
  ビーチサンダルなどで使用されている、弾力性のある軽い素材です。
③ 木(ブナ)
  いろいろな木材があったのですが、ブナが一番安かったので。
④ アクリル
⑤ タイル(陶器)

各素材で、タグを挟み込んで、読み取り距離を比較してみました。
なお、電波が弱すぎると比較が難しいので、MANICA EXCEL TOOLの最弱から3番目の出力としました。

読み取り距離が長い、読み取りが良かった素材のランキングは以下になります。
(カッコ内は、そのまま読み取ったときの距離との比率)

素材なし : 196cm


1位  EVA   188cm (96%)

予想通り一番読み取りがよかったです。

2位  アクリル 184cm (94%)

1位のEVAに比べて若干読み取りが悪く感じましたが、大きな差はありませんでした。

3位  ゴム   168cm (86%)

1位、2位に比べて、明らかに読み取りが悪いです。

4位  木    160cm (82%)

3位のゴムに比べて読み取りが悪かったですが、それほど大きな差はありませんでした。

5位  タイル  145cm (74%)

選んだ素材の中では、もっとも読み取りが悪かったです。
4位の木と比較しても差は大きいです。

6位  タイル表 136cm (70%)
  ※タイルの表面で挟んだ場合

タイルの裏表を逆にして、追加で実験しました。更に読み取りが悪くなりました。
陶器は誘電率が高いのが原因と思います。

ほぼ予想通りの順位かもしれませんが、実際に、同じ条件(厚さ)で比較してみると、このような結果になりました。