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%)
  ※タイルの表面で挟んだ場合

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

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

2020年6月30日火曜日

NTAG424 DNA で遊ぶ その3(設定編)

いよいよと言うかやっとと言うかようやく設定です。パラメータがたくさんありすぎてきちんと設定できるのか大変心配になる作業です。うっかり設定間違えると設定変更も書き換えもできない何もできなくなってしまうタグが完成してしまいます。恐ろしいですねー。

出荷時にはNDEF部分(FileNo 2)の設定変更には Key0 の Fullモードじゃないとアクセスできないようになっています。というわけで前回面倒な認証作業を実施しました。Fullモードの場合、APDUのデータの部分が暗号化された形で通信を行います。ざっくり言うと CommandHeader + 設定値の暗号化 + チェックサム的な という形式です。

CommandHeader は 02 のようです。コマンドの詳細仕様を見ると先頭に設定を変更する FileNo を記載すると書いてあるので、恐らく FileNo の 2 のことなんだと思いますがよくわかりません。試せばいいんでしょうけど変な風になる恐ろしさがあるのでタグも10枚しかないしそんなにお手軽にできるシチュエーションでもないのですいません。

設定値は FileOption、AccessRights、SDMOptions、SDMAccessRights、UIDOffset、SDMReadCtrOffset、PICCDataOffset、SDMMACInputOffset、SDMENCOffset、SDMENCLength、SDMMACOffset、SDMReadCtrLimit の順に値を並べます。全部説明してると面倒長くなるので、AN12196 の6章で設定してるところだけ書きます。

FileOption(1バイト) は SDM をやるかやらないかと、通信モードを設定します。SDMやる場合は上から2ビット目を1にします。下位2ビットが通信モードです(Plain = 00、MAC = 01、Full = 11)。ということでここは 40h になります。

AccessRights(2バイト)はアクセス権の設定になります。アクセス権は Read、Write、ReadWrite、Change の4つあって、それぞれ 4ビットの値を設定します。0~4を指定すると、そのキー番号での認証を経てアクセス可能になります。 Eh を指定するとフリーアクセス可能です。Changeというのが Write と何が違うねんという感じですがこれは設定の変更の権限になります。AN12196 では Read:Eh、Write:0h、ReadWrite:0h、Change:0h を指定していますが、これだと Read はフリーなんですが Write が認証必要になるので NDEF部分の書き換えが Plainモードでできなくなってしまいます。のでテストするときはやっぱり書き換えたくなったりするのでここは E0EEh にした方がいいと思います。

SDMOptions(1バイト)はSDMの設定になります。先頭1ビット目から、UIDミラーをするかしないか、カウンターミラーをするかしないか、カウンターリミットの機能を使うか使わないか、SDMENCFileDataを使うか使わないか、下位4ビットは 0001 になります。AN12196 では C1h になってますので、UIDミラーとカウンターミラーをONにしています。(SDMENCFileData:1 になってますが間違いです)

SDMAccessRights(2バイト)はSDM関連のアクセス権の設定になります。4ビットずつで F 固定、SDMCtrRet、SDMMetaRead、SDMFileRead の設定です。0~4を指定するとそのキー番号で暗号化されます。この中でSDMMetaReadがUIDとカウンタの暗号化に関わっていて、2を指定していますのでUID+カウンタが Key2 の値で暗号化されることになります。

後は PICCDataOffset(3バイト)、SDMMACInputOffset(3バイト)、SDMMACOffset(3バイト)の順で設定します。PICCDataOffsetがUID+カウンタを暗号化した値をNDEFのURLのどこに挿入するのかを指定します。

設定値は以上になります。ここから Fullモードでアクセスするために電文を組み立てます。

まず暗号化に使用する IV を作ります。IV は A55A + 認証時に取得したTI + コマンドカウンタ + 0000000000000000 を、認証時に作成した Encryption Session Key で暗号化します。コマンドカウンタはコマンドの番号というか順番というかコマンドを発行するたびに+1する値です。

IV = E(Encryption Session Key:1309C877509E5A215007FF0ED19CA564, A55A + 9D00C4DF + 0100 + 0000000000000000 )
 = 3E27082AB2ACC1EF55C57547934E9962

次にこの IV を使って、設定値を暗号化します。

E(Encryption Session Key, IV, 4000E0C1F121200000430000430000 + 80(padding))
= 61B6D97903566E84C3AE5274467E89EA

最後にチェックサム的なところを計算します。

Cmd(5F) + CmdCounter(0100) + TI(9D00C4DF) + CmdHeader(02) +
E(KSesAuthENC, CmdData)
=5F01009D00C4DF0261B6D97903566E84C3AE5274467E89EA

これの AES-CMAC を計算します。

CMAC = 7BD75F991CB7A2C18DA09EEF047A8D04

さらにこれの偶数バイト目だけを集めたものがチェックサム的な値になります。

MACt = D799B7C1A0EF7A04

ここまできてようやく APDU が完成します。

CLA 90
INS 5F
P1 00
P2 00
Lc 19
Data 02 61B6D97903566E84C3AE5274467E89EA D799B7C1A0EF7A04
Le 00

あー、長かったー。



2020年6月24日水曜日

NTAG424 DNA で遊ぶ その2(認証編)

前回はタグの認証を経ずに、Plainモードでタグに素のNDEFを書き込むところまでをやりました。SUN(Secure Unique NFC) を利用するには UIDミラー、カウンターミラー、SDM(Secure Dynamic Messaging) を利用するように設定をしなくてはなりません。設定コマンドは Fullモードでタグとアクセスしなければならないので、まずは認証という手順を実行する必要があります。

認証を行うには、AuthenticateEVFirst というコマンドを投げます。AN12196 の 6.6 の手順になります。(以下、資料内のデータをそのまま記載します)

CLA 90
INS 71
P1 00
P2 00
Lc 02
Data 0000
Le 00

Dataの1バイト目は使用する Key の番号で 0 を指定しています。すると応答が来ます。

A04C124213C186F22399D33AC2A3021591AF

最後の2バイト(91AF)は応答コードで、AFはコマンドに続きがあることを示します。先頭から16バイトが、タグ側で生成された乱数(16バイト、資料ではRndBと記載)を Key0 で暗号化した値になります。暗号は AES128-CBC(パディング無し)が使用されます。Keyはタグ側で保持している Key0 の値を使用し、IV はオール0(16バイト)が使用されます。

そういうわけで、これを復号するにはタグに保持されている Key0 を知っている必要があります。デフォルトではオール0になっているので、Key=オール0、IV=オール0で復号します。

RndB = B9E2FC789B64BF237CCCAA20EC7E6E48

これでタグ側で生成された乱数が取得できました。
続いてリーダ側で乱数を生成し(RndA)、タグに送ります。

RndA = 13C5DB8A5930439FC3DEF9A4C675360F (乱数なのでなんでもいい)

そのままこの値を送信するのではなく、タグに送信するデータを組み立てます。
RndBを1バイト左にローテーションします。

RndB' = E2FC789B64BF237CCCAA20EC7E6E48B9

RndA と RndB' をくっつけます。

RndA || RndB' = 13C5DB8A5930439FC3DEF9A4C675360FE2FC789B64BF237CCCAA20EC7E6E48B9

先ほどと同じ Key=オール0、IV=オール0で暗号化します。

35C3E05A752E0144BAC0DE51C1F22C56B34408A23D8AEA266CAB947EA8E0118D

これをDataとしてAPDUコマンドを送ります。

CLA 90
INS AF
P1 00
P2 00
Lc 20
Data 上記の値
Le 00

レスポンス
3FA64DB5446D1F34CD6EA311167F5E4985B89690C04A05F17FA7AB2F081206639100

最後の2バイト(9100)は正常応答のコードです。
先頭32バイトを復号します。

9D00C4DFC5DB8A5930439FC3DEF9A4C675360F13000000000000000000000000

先頭から、TI(トランザクション識別子)、RndA'、PDcap2、PCDcap2の値になります。

TI = 9D00C4DF
RndA' = C5DB8A5930439FC3DEF9A4C675360F13

RndA'は、RndAを1バイト左にローテーションした値になっています。これで正常に乱数がやり取りできたことを示します。
PDcap2とPCDcap2の値は使用しません。

ここからこの先のコマンドをやり取りするときに利用する暗号キーを組み立てます。

SV1 = A55A00010080 [RndAの先頭2バイト] [RndAの3バイト目から6バイトとRndBの先頭から6バイトをそれぞれ XOR したもの] [RndBの7バイト目から16バイト目まで] [RndAの9バイト目から16バイト目まで]
=A55A0001008013C56268A548D8FBBF237CCCAA20EC7E6E48C3DEF9A4C675360F

SV2 = SV1 の先頭2バイトを 5AA5 に変更
=5AA50001008013C56268A548D8FBBF237CCCAA20EC7E6E48C3DEF9A4C675360F

次にSV1とSV2を使って、上記の暗号とは少し違う AES-CMAC という方式で Key0 を使って認証値(ハッシュ値的な?)を計算します。

Encryption Session Key = CMAC(k0, SV1)
 = 1309C877509E5A215007FF0ED19CA564

CMAC Session Key = CMAC(k0, SV2) = 4C6626F5E72EA694202139295C7A7FC7

これで認証の作業は終了です。次はいよいよ設定値の変更になります。



2020年6月22日月曜日

NTAG424 DNA で遊ぶ その1

リリースされてちょっと時間経ってるんですが、NTAG424 DNAというすごい高機能なタグがあります。これまで見て見ぬふり扱ってなかったんですが、触ってみるとえれー大変だったので備忘録もかねて書きたいと思います。

まずこのタグで何ができるのかなんですが、一番大きな機能は Secure Dynamic Messageing(SDM) という機能で、暗号化された電文でタグと通信できる機能です。さらにその機能をNDEFで利用することができて、これまではNDEFにURLを書くとそれがそのままスマホで読み取りできたんですがここにSDMが適用されると Secure Unique NFC (SUN) message となり、URLの一部が暗号化された状態になります。

これまでのNTAGにはUIDミラー(※参照 NTAG210のUIDミラーを試してみる)とカウンターミラーという機能があって、NDEFのURLに自身のUIDとカウンター(タップされた回数)を埋め込むことができました。

例)
書き込まれたURL
https://www.hayato.info/tag?uid=00000000000000&ctr=000000
スマホで読み取ったときのURL
https://www.hayato.info/tag?uid=04C767F2066180&ctr=000010

これが、SDMを使うと UID+カウンタ の値が暗号化されたものが埋め込まれるようになります。そうするとその値がそのままサーバに飛んでいきますので、サーバ側で復号するとタップしたタグのUIDとカウンタ値が取得できます。カウンタ値も取得できるというのがミソで、例えば最後に飛んできたカウンタの値と同じかもしくは低い値であればそれはおそらくタップして取得されたURLではなく、ブックマークやあるいはURLを誰かに送付してそれをそのまま使ってアクセスしてきているのだということが推測できるわけです。

NTAG424 DNA の仕様書はこちらで公開されています。

これがまたこれまでのタグにくらべてボリューミーで読んでいくだけで疲れ楽しめます。さらにAN12196の資料にはエンコードする手順のサンプルが詳細に記載されていますが、これがまた手順が多いのと暗号化を使うので検証しながらやってくので時間かかるのとあとチョイチョイ(たまにがっつり)記載に間違いがあるのでそうすると自分の手順が違うのか仕様書が違うのかこれをまた検証しながらとかやってたのでえらい時間かかり長時間楽しめました。

まず NTAG424 はこれまでのようにメモリのある部分に設定を書き込むのではなく、ISOのどこかで規定されている MF/DF/EF というファイル構造を持っています。最下層のEFを3つ持っていて、それぞれ CC/NDEF/Proprietary という領域になっていて、NDEF領域にNDEFを書き込みます。さらに5つのキーを持てるようになっており、このキーを使って暗号化を行います。

また通信モードというのが3種類(Plain/MAC/Full)あって、Plainだと平文で通信、Fullだと完全に暗号化された通信という感じで、書き込む情報の重要度によって使い分けるようになっています。

今回は Plain モードでできる NDEF の基本URL(埋め込みする前のURL)を書き込むところまでをやります。

AN12196の6章に詳細手順がありますが、これの3番と8番に相当します。ちなみに6番に面倒な認証の手順がありますが、Plainモードで書き込みを行うだけならこの手順は不要です。

はじめに Select File で DF を選択します。DF名は D2760000850101h になっていますのでこれを指定します。

CLA 00
INS A4
P1 04(Select by DF name)
P2 0C(No Response Data)
Lc 07
Data D2760000850101
Le 00

あとはNDEFを書き込みます。

CLA 00
INS D6
P1 84
P2 00
Lc DataのLength
Data ここにNDEFのデータ
Le 00

仕様書の 6.8.1 では P1=00 になっていますがこれは誤りで、NDEFの領域を示すための値(EFを示す値)を設定する必要あります(それが無いとまだDFまでしか選択してないのでどこに書いていいかわからない)。NDEFのEFは E104h なんですが、ここに設定する値は Short ISO FileID というやつで最後の5ビット(04)になります。先頭1ビット目を1にすることでFileIDを指定することになりますので、84を設定します。

上記2つの APDU を投げることでNDEFの書き込みまでは完了します。
あとは SDM を利用するように設定することで完成しますが、まぁ、そこがまた長い話になるので次回に回します。たぶん。


2020年6月18日木曜日

アンテナとタグの距離を測る

UHFのRFIDタグをリーダで読み取りしたとき、タグがどのへんにあるのかを知りたくなるときがあります。あ、反応してる!してるけどドコ?という感じで。せめてアンテナからの距離がわかれば少しはマシですね。

アンテナからの距離というと最初に思いつくのは電波強度(RSSI)を使うという方法です。確かにタグが近いとRSSIは高くなりますし、タグから離れると低くなります。しかしながらRSSIは結構ざっくりした値でしかも距離に対して線形に変化する値ではないので、正確な距離を求めるにはちょっと物足りません。

そこで位相を利用することが考えられます。位相は昔のリーダでは値採れなかったんですが、最近のリーダはだいたい採れるようになっています。

位相をどう使うかなんですが、イメージとしてはこんな感じです。


1cm単位の精度が出せるというRTK(GPSのごっついみたいな)もこのようなことをしてるんじゃないかと誰かが言っていました。

というわけで計測をやってみます。最近のリーダは位相が採れると言いましたが、リーダによっては値のバラツキが激しかったりします(RSSIもそうですが)。比較的安定して採れている Impinj Revolution を使用しました。

計測風景
結果がこちら

d(cm) RSSI(dBm) 位相(度) 位相の差
5 -37.5 285.47
10 -38.5 206.72 78.75
15 -40.5 126.21 80.51
20 -42.0 46.05 80.16
25 -42.5 318.16 87.89
30 -43.5 228.16 90.00
35 -44.5 136.05 92.11
40 -45.5 42.89 93.16

左からアンテナとタグの距離、RSSI、位相、前の距離のときの位相との差になります。
こうして見ると、RSSIがざっくり下がっていくのに対し、位相は5cmごとに約80度~90度くらいずつ下がってますね。約20cmで一回りしてる感じです。

今回周波数を920.4MHzに固定して行ったので、1波長=c/920.4MHz≒32.6cm くらいですから、30cmくらいで一周すんのかなくらいに思ってましたがそうでもないようです。

とはいえRSSIで何発目の波かをあたりをつけて、位相を使って補正をすることで結構正確に距離がわかるような気がします。

実際はこんなにアンテナと正対することは無いですし、周りに他のタグがあったり電波の反射があったりしますからそううまくいくとはないと思いますが。

2020年6月4日木曜日

氷のタグ読み取り実験

前回、ドライアイスで読み取り実験しましたが、今回は氷で実験してみました。
氷を2つ作り、ドライアイスの時のようにタグを挟み込みます。ただし、氷は縦でないと立たないので、タグも縦になります。

使用したリーダーとタグ

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



氷の面が平らでないので、ピッタリ重なりませんが。。。

MANICA エクセルツールで、最小出力にして読み取りしました。


【実験結果】
そのままで読み取ると、90cmぐらいでした。
氷ではさむと、70cm~75cmぐらいで、20%前後、読み取り距離が短くなりました。
しかし、時間が経過すると氷が溶けるためか、35%ぐらいまで読み取り距離が短くなりました。
ドライアイスと同様、表面の水が影響しているように思います。
極寒地や冷凍倉庫のような、氷が溶けない環境でないと、なかなか正確な実験は難しそうです。

【おまけ】
ガリガリ君で読み取りしてみました。
試す前から短くなることは想定できましたが、読み取り距離が30cmとなり、1/3ぐらいになりました。
氷の塊(固体)と違い、水分量が多いからだと思われます。

2020年5月29日金曜日

MANICAモバイルの隠し機能(NFC温度ロガー編)

MANICAモバイルには実は隠し機能がいくつか搭載されています。今回その中から NFC温度ロガーについて説明したいと思います。実はこの機能、今から2年ほど前に実装されているんですが実装してそのままになっていました。

MANICAモバイルは下記の製品に対応しています。

Temperature Logger NFC<温度ロガーNFC>

この製品は一定間隔で温度を測定して内部のメモリに保存します。保存したデータはスマートフォンなどで読み取りすることができます。このタグを使うことで、温度管理の必要な製品の輸送中の温度を測定し、エビデンスとして残すというようなことが可能になります。

この製品を使用するために専用のアプリが用意されています。

SMARTRAC NFC Temperature Logger App

このアプリを利用して、温度の測定間隔を設定したり、保存した温度データを読み取りすることができます。

アプリで読み取ったデータはメールで送信することもできます。そこでMANICAモバイルのNFCロガー専用のアドレスにメールを送信します。すると...


ほら、データが取り込まれました。ちなみにこのタグ、何かの航空便に入れて測定してたと思います。2年前ですが。

どうでしょうか。これで温度管理もバッチリですね?




2020年5月25日月曜日

ドライアイスのタグ読み取り実験

エンドユーザーよりドライアイスを通過してタグが読み取れるのか、との問い合わせがあり、ドライアイスでタグ読み取りを実験してみました。
1.5Kg、厚さ3cmのドライアイス2枚を用意し、2枚のドライアイスにタグをはさんで読み取りを行いました。



使用したリーダーとタグ
・AT880
・SMARTRAC TEMPERATURE DOGBONE ※温度測定で使用
・ALN-9654(Gタグ)

最初にセンサータグをビニール袋に入れ、ドライアイスではさんだところ、直ぐに読み取り不能になりました。(常温に数秒おくと復活)
梱包材にくるんで、読み取り、温度を測定すると、限界の-40℃以下になるまで、2、3分時間が稼げるので、この方法で測定することにしました。



Gタグを梱包材に包み、そのままで、読み取り距離を測定すると、240cm でした。
(電波強度は1)
次にドライアイスではさみ、新聞紙などで包んで、数回、測定すると、170~180cmになりました。
25~30%ぐらい距離が短くなり、この時点では影響があると思いましたが、ドライアイスの保存方法を調べたところ、空気に触れると空気中の水分が付着するとのことでしたので、実験をやり直すことにしました。

ドライアイスを包む新聞紙(ドライアイス購入時に包んであった新聞紙)を新しい物に交換し、ドライアイス表面をタオルでこすってから、すばやく、しっかりと包みました。
(実験当初は手際が悪く、時間も気になったので、ゆるく包んでいました)




再実験では、170cmぐらいから読み取りを始め、徐々に距離を伸ばしていくと、ドライアイス無しの場合と同じ240cmに到達しました。

【実験結果】
厚さ3cmのドライアイスでの読み取り実験では、影響ありませんでした。
ただし、空気中の水分が冷却され、ドライアイス表面などに水、氷(霜)が付着するので、それが読み取りに影響すると思われます。


2020年5月22日金曜日

Web RAIN! WebからRFIDリーダを制御する

UHF帯のRFIDリーダを使う場合、たいていスマホやパソコンに制御用のアプリを入れる必要がある1と思います。一方で、バーコードスキャナであれば、挿すだけで使えますし、同じRFIDでもNFCについては、ブラウザから直接読み取れるようになりました。UHF帯のRFIDリーダでもブラウザから直接タグを読めるといいなあと思い、今回試してみました。

簡単にどうやったかを説明すると、PCとBluetoothのSPPで接続されたRFIDリーダに対して、ブラウザから現在策定中のSerial APIを介して制御するという感じです。

さて、この言葉が将来使われるのか分かりませんが、まだ誰も使ってなさそうなので、WebからUHF帯RFIDリーダを制御する使い方をWeb RAINと銘うっておこうと思います。次点でWeb LLRPでしょうか。

今回使ったもの


とりあえず作ったサイト



制限など


リーダ

今のところ使えるリーダはRF Blasterのみです。AT388も動くかもしれませんが、未検証です。

OS

Windows 10のみ対応です。Android系はどうもSDKがSerial Portに未対応なので、今後もこの方法での接続はできなさそうです。Androidの場合は、BLEに対応したRFIDリーダをWeb Bluetoothで接続する方向性になるでしょうか。

ブラウザ

ChromeかEdgeの最新版が必要です。ここまではいいとして、#enable-experimental-web-platform-features をEnabledにする必要がありますので、なかなかすぐに業務に使うというのは難しそうです。

準備


Bluetooth

まず、RF BlasterとPCのBluetooth接続を行います。タスクトレイのBluetoothアイコンを右クリックして「Bluetoothデバイスの追加」をクリックします。

「Bluetoothまたはその他のデバイスを追加する」をクリックします。
RF Blasterの電源を付けて、「Bluetooth」をクリックします。そうすると、「RFPrisma-xxxx」みたいなのが見つかると思うので、クリックします。


そのあとPINコードの確認が表示されるので、「接続」をクリックしてください。
元の画面に戻って「その他のBluetoothオプション」をクリックしてください。

COMポートタブを開くと、こんな風になっていると思います。方向が「発信」で、名前が「RFPrisma-xxxx 'AMP-SPP'」となっているポート番号をメモしておきます。あとで使います。下の図の場合は、COM13ですね。


ブラウザ

次にブラウザの設定を行います。使えるのは最新版のGoogle Chromeか、同じく最新版のMicrosoft Edgeとなります。

今回使用するWeb Serialは実験的な位置づけの機能のため、デフォルトの設定では使用できません。アドレスバーに、Chromeの場合は chrome://flags を、Edgeの場合は edge://flags をそれぞれ入力して開いてください。検索窓がありますので、 #enable-experimental-web-platform-features と入力して、見つかった項目をEnabledあるいは有効にしてください。変更後、ブラウザを再起動すれば準備完了です。

あと開発中何度かフラグが無効になっていたことがあったので、ブラウザのアップデートのタイミングとかで元に戻ってしまうのかもしれません。うまく行かないときは再度確認してみてください。




いざ、実行!

下記のURLを開いてください。
https://webrain.azurewebsites.net/


リーダの電源が付いていることを確認したら、Connectボタンを押してください。下記のような画面が表示されると思います。Bluetoothの設定で確認したCOMポートを選択して接続ボタンを押してください。うまく行けばリーダからピピッピピッと鳴って接続されます。

なお、Connectボタンを押してから、専用ダイアログでどの機器と接続するかを選ぶ必要があるのはSecurity上の理由からだそうです。Webサイトを開くだけで、自動でリーダが読取始めたら怖いですからね。


リーダの読取ボタンを押すと、時刻と読み取られたタグIDが表示されると思います。



1: AlienやImpinjといった自律動作可能な据置リーダの場合はシステム構成によってアプリ不要
2: こっちが裏テーマです。つい先日正式版が発表されましたね。C#だけで書けるのはうれしいですが、今回みたいなことをやろうとすると、結局Javascriptが必要になるのかな。その辺は今後調査が必要です。

2020年5月20日水曜日

ItemSenseサーバを動かしてみた

前回ItemSenseサーバをインストールしてみたのですが、今回はそのあとの設定を行って動かしてみようと思います。(もうあれから1年経つんですね、早い)

今回使ったもの

  • Ubuntu 18.04 Server
  • itemsense-2.3.0+6-setup.run
  • xSpan
OSもItemSenseもそれぞれバージョンが上がっています。

インストール

こちらの手順通りで問題なく進められました。前回つまったdocker-composeの辺りもリンク先が明示されていて、分かりやすかったです。

初期セットアップ

次にユーザガイドのInitial Setupを読みながら、進めていきます。

 1. adminのパスワードの変更
 2. Facilityの設定
  建物に紐づく概念ですかね。とりあえず、画面上部のFacilitiesからHayatoを作成。


 3. ネットワークを設定します
  More > Admin Panel > Scanner Configurationから設定します。

 4. ネットワークをスキャン
  Readers > Registrationから設定します。追加したネットワークを選択して、Discover Readersします。リーダが見つかるので選択してRegisterします。

5. リーダ側の準備完了
  リーダにReader Agentというプログラムが設定されました。次は実際の読取のための設定となります。

Reader

リーダの設定をしていきます。Readers > ConfigurationsからCreate New Reader Configurationボタンを押して新規に作成します。
  • Operation:今回Overheadで設定したいので、THRESHOLDを選択
  • Reader Mode:とりあえずMODE_1002がオススメみたいです
  • Session:とりあえず0
  • Transmit Power:とりあえず30 dBmとしますが、現場によって調整だそうです
  • Channel Config:今回不使用。Side by Sideなど近くに他のリーダがある場合はそれぞれで異なるチャンネルを選択します

Threshold

Threshold、日本語にすると閾値でしょうか。ここからこっちは内、ここから先は外を決めるための設定といった感じでしょうか。Create New Thresholdを押して新規に作成します。
  • Arrangement:Overheadを選択
  • Reader1のReader:先ほど準備完了したReaderを選択
  • Configuration:xSpan Overheadを選択


In AntennasとOut Antennasは編集アイコンをクリックすると、どのアンテナ番号をInあるいはOutと見做すかと、それぞれの側のTransmit Powerを設定できます。たとえば、設置現場の片側に明らかに金属製の構造物があるような場合に使います。今回はデフォルトのままとします。ちなみにアンテナ番号はこちらのp. 58にあります。さらに余談となりますが、xSpanのLEDがある側がSECTOR 2 (IN)、反対側がSECTOR 3 (OUT)となります。Side By Sideで左右に設置する場合は、LEDのある側を揃える必要があります。

Recipe

次はRecipe、なんだかお料理みたいですが、秘訣とかこつっていう意味があるんですね。調べて知りました。Create New Recipeを押して新規に作成します。
  • Recipe Type:今回はTHRESHOLDを選択
  • ReadersのThreshold:先ほど作成したThresholdを選択
  • ReadersのRun:リーダを選択
  • ReadersのWith:Reader Configurationを選択  
  • Recipe ParametersのProfile Name:最初は空でよいですが、チューニングした結果を貼り付けるのに使用します
  • Iteration Data Log Enabled:チェックすると、チューニングツールにImportするためのログが出力されます


Job

ここまでで動かすための準備が終わりました。いよいよ動かしてみましょう。
  • Facility:適宜選択
  • Recipe:先ほど作成したRecipeを選択
  • Duration:とりあえず0
  • Start Delay:デフォルトの0のまま
  • Data Handling Options:3つともチェックを入れておきます。Docker使っているので外部にデータを出力するための設定みたいです、多分

Start Jobボタンをクリックします。全部うまく設定されていればJobのStatusがRunningとなります。一番右にあるActionsのTransitionsのアイコンをクリックすると読み取ったタグを表示できます。


このあとは、Actionsのところの右から3つ目のDownloadアイコンでIteration Data Logsを取得し、Threshold Tuning Tool(別ソフト)を使ったチューニング作業へと入ることになりますが、余白がつきたのでここまでにします。

2020年5月8日金曜日

今月も新しいRFID機器に対応しました(MANICA Excel Tool)。



今月も、とか書くと毎月リリースしてそうですが、そんなことありませんでした、、、
ーーーーーーーーーーー
続々と対応機種が増加するMANICA Excel Tool、
あらたに下記4機種への対応版がリリースされました!
・CT4-LX(SATO)
・PSRWU-9000(フェニックスソリューション)
・MC3330(ZEBRA)
・KDC480(KOAMTAC)

対応機種一覧はこちらから。
https://manica.jp/?page_id=301

2020年5月4日月曜日

(幻の)光るタグ

これまた懐かしいシリーズ、9年前の光るタグです。

登録済みの会員カードを読み取ると、お店のキープボトルに取り付けられた光るタグが、結構あかるく光ります。

デモ環境の機器構成は、ArmadilloにNFCリーダーとLF帯のリーダーが接続されていて、人の認証はNFC、光るタグの制御はLFという感じ。

残念ながら製品化までいきませんでしたが、パッシブながら光量に優れた有機EL採用のとても楽しみなプロトタイプだったのになぁ。

Youtube:
https://www.youtube.com/watch?v=sBxtmU9Wid8

事例紹介ページ:
http://www.hayato.info/home/report_hikarutag.htm

#rfid #nfc #icタグ

2020年5月1日金曜日

JR西日本様のRFID導入事例を公開しました!

JR西日本様の導入事例を公開しました。
ICタグを利用した工具管理ですが、タグの取り付け方や読み取らせ方、弊社のExcel Toolの活用方法など現場の知恵が詰まった素晴らしい活用事例かと思います。

誰が、どの工具を持ち出したか/返却したか、を自動的に記録する用途でお使いいただいています。

ハンズフリーでの検品ながら、大掛かりなゲートを設置することなく、アプリケーションもエクセルで済ませてしまうことで、かなりシンプル/低価格な仕組みを実現しています。

使ったことないと、ICタグって何か難しそうみたいなイメージかもしれませんが、全然そんなことないです。似たような仕組みのご要望あればお気軽にお問い合わせくださいませ。






2020年4月22日水曜日

テレワークを応援!RFIDで勤怠報告を自動化する

みなさん、テレワークしてますか。弊社でも昨今の情勢を受け、テレワークでの勤務を推し進めているところです。

さて、テレワーク中は勤怠報告を求められることも多いのではと思います。弊社でも始業時、昼休憩開始時、昼休憩終了時、終業時の1日計4回、メールでの報告を行っています。(そんなのチャットのステータスでいいじゃん、という声もあるかと思いますが、決まりは決まりです)
今まではGmailのテンプレートを使って凌いでいたのですが、この先の見えない状況を考えると4回といえど、重荷になってきます。

そこで、RFIDを使って自動化してしまおうと思います。たぶんこの記事を読んでいる方なら、自宅にRFIDリーダの1台や2台転がっているものと思いますので、ぜひお試しください。

使ったもの


マスプロ電工製RFIDリーダ、RFIDシートアンテナ

こんな感じです。ロープロファイルで机の上に置いておいても邪魔になりません。


Googleスプレッドシート

こんな感じのシートを用意しました。始業時間~終業時間の各列が勤務報告する時間に相当します。その他列はデバッグや判断できない時間帯に読まれた場合に利用します。タグIDのところに勤怠報告に使うタグのIDをセットします。G列にその日にやったことを書いておけば、それを終業時にメールで送信するようにしました。


ちなみに弊社は10:00~15:00がコアタイムのフレックス制で、11:45~12:45がお昼休みとなります。

Google Apps Script

詳しくは他の解説記事にゆずりますが、function doGet(e)という関数を作成すると、HTTP GETでアクセスを受け付けられるようになります。今回はtagId引数に読まれたタグIDを乗っけてアクセスする形にしました。

スプレッドシートのIDを使ってアクセスして、時間に応じて特定のメールを送信する感じにしました。たとえば、8時から10時の間なら業務開始、16時半以降なら業務終了といった感じです。この辺の業務ロジックはスプレッドシート側に設定持たせた方がよかったかもしれません。ソースの一部を抜粋すると、大体こんな感じです。


   
    var id = 'XXXXX';
    var sheet = SpreadsheetApp.openById(id).getSheetByName("シート1");
    
    var registeredTagId= sheet.getRange('B1').getValue();
    
    var tagId = e.parameter.tagId;

    if (tagId == registeredTagId) { // 登録されたタグIDと一致するか
      
      var lastRow = sheet.getLastRow();
      
      var dateNow = new Date();
      
      var lastDate = new Date(sheet.getRange(lastRow, 1).getValue());
      
      var recordRow;
    if (lastDate.getFullYear() == dateNow.getFullYear()
        && lastDate.getMonth() == dateNow.getMonth()
        && lastDate.getDate() == dateNow.getDate()) {
          recordRow = lastRow;
        } else {
          // 当日のレコードが無ければ追加
          recordRow = lastRow + 1;
          sheet.getRange(recordRow, 1).setValue(Utilities.formatDate(dateNow, "JST", "yyyy/MM/dd"));
          sheet.getRange(recordRow, 7).setValue('資料作成');
        }
      
      const recipient = 'recipient@example.jp';
      var subject;
      var body;
      const options = {cc: 'cc@example.jp'}
      if (dateNow.getHours() > 7 
          && dateNow.getHours() < 10) {
        //始業
        recordColumn = 2;
        var workPlan = sheet.getRange(recordRow, 7).getValue();
        subject = 'テレワーク開始連絡(中野)';
        body = `中野です。\n\n今からテレワーク開始します。\n\n <予定作業>\n・${workPlan}\n\nよろしくお願い申し上げます。`;
      } else if ((dateNow.getHours() == 11 && dateNow.getMinutes() >= 45 && dateNow.getMinutes() <= 59)
      || (dateNow.getHours() == 12 && dateNow.getMinutes() >= 0 && dateNow.getMinutes() <= 15)) {
        //休憩開始
        recordColumn = 3;
        subject = '休憩開始連絡(中野)';
        body = '中野です。\n\n今から休憩開始します。\n\nよろしくお願い申し上げます。';
      } else if (dateNow.getHours() == 12 && dateNow.getMinutes() >= 30) {
        // 休憩終了
        recordColumn = 4;
        subject = '休憩終了連絡(中野)';
        body = '中野です。\n\n今から業務を再開します。\n\nよろしくお願い申し上げます。';
      } else if ((dateNow.getHours() == 16 && dateNow.getMinutes() >= 30) 
        || (dateNow.getHours() >= 17)) {
          //終業
          recordColumn = 5;
          var workRecord = sheet.getRange(recordRow, 7).getValue();
          subject = 'テレワーク終了連絡(中野)';
          body = `中野です。\n\nテレワーク終了します。\n\n<実施作業>\n・${workRecord}\n\nよろしくお願い申し上げます。`;
        } else {
          recordColumn = 6;
        }
      
      var recordCell = sheet.getRange(recordRow, recordColumn);
      if (recordCell.isBlank() || recordColumn == 6) {
        recordCell.setValue(Utilities.formatDate(dateNow, "JST", "HH:mm:ss"));
        if (subject != undefined && body != undefined) {
          GmailApp.sendEmail(recipient, subject, body, options);
        }
      }


MANICAコレクタ

MANICAコレクタはこちらからダウンロードいただけます。多くのリーダに対応しておりますので、お持ちのリーダが対応しているかぜひチェックしてみてください。お使いになりたいリーダありましたら、お声がけください。(有償になりますが...)

リーダを追加して、高度な設定を開くと、一番下にWebサーバへ投げるというチェックボックスがあるので、チェックします。隣にGASの公開URLと引数を記述してください。URL中の[タグID]が実際に読まれたタグIDに置換されてHTTP Getされます。ちょっとした注意点としては、httpかhttpsはリストボックスから選択する形なので、URLの//の後ろからテキストボックスにはコピペしてください。


あとはMANICAコレクタのショートカットをWindowsのスタートアップフォルダに作成し、起動時に自動で開始するにチェックを入れておけば準備完了です。次回以降、始業時など、必要なタイミングでタグを読ませれば、自動でメールを送ってくれるようになります。


2020年4月3日金曜日

Bluetooth問題をなんとかする

おかげさまでご好評いただいております棚卸パッケージですが、面倒な問題を抱えております。ハンディリーダとPCの接続方法なんですが、現状はBluetoothかWifiを選択できるようになっています。このBluetoothが結構相性問題があって組み合わせによって接続できなかったり不安点だったりしていました。

昔はBluetoothスタックとして東芝スタックがほとんどの状況で、東芝スタックは安定していたのであまり問題にならなかったんですが東芝スタックを使っているBluetoothドングルというのが少なくなってしまい、他のスタックだと接続できない問題が明らかになってきて何とか東芝スタックのドングルを確保するのに奔走していました。

が、最後の東芝スタック対応ドングルのBT-Micro4-Hが在庫限りとなってしまっておりどうしたもんかなこれ、という状況でした。

この状況を打開するため、目を付けたのがコレ


じゃーん。ESP32ちゃんです。

ESP32のBluetoothは他の案件でも使用していますが結構安定して使えています。ということで通信系はESP32ちゃんに任せてしまって、COMとのブリッジをすることでPCからは単純にCOMポートとしてだけ見える状況にしてしまおうという計画です。

PCからは単にCOMポートにしか見えませんから、Bluetoothスタックがどうのこうのという話はなくなります。Bluetoothが付いていようがいまいが、どんなスタックが入っていようが入っていまいが、とにかくWindowsPCであれば動作するようになります。

というわけでやってみました。
ESP32のプログラムはBluetoothでハンディに接続し、あとはシリアルとBluetoothの通信をブリッジするだけなので簡単です。

#include "BluetoothSerial.h"

static BluetoothSerial SerialBT;
static uint8_t address[6]  = {0xD4, 0xC9, 0x4B, 0x80, 0x3B, 0x89};

void setup() {
  Serial.begin(115200);
  SerialBT.begin("ESP32", true);
}

void loop() {
  if (!SerialBT.hasClient()) {
    if (!SerialBT.connect(address)) {
      while(!SerialBT.connected(10000)) {
      }
    }
  } else {
    while (SerialBT.available() > 0)
      Serial.write(SerialBT.read());
    while (Serial.available() > 0)
      SerialBT.write(Serial.read());
  }
}

従来だと、

ハンディ(とかAndroid)とPCをペアリング → 設定されたCOMポートをエクセルツールに設定

という流れでしたが、

ESP32をPCに接続 → 設定されたCOMポートをエクセルツールに設定

という流れになります。
エクセルツール側はCOMポートとのやりとりということに違いはありませんのでほぼそのままで動きます。
今回Android版で試しましたが、Android側はPCから接続されるかESP32から接続されるかの違いなのでこちらもほぼそのままで動きます。


じゃーん、ちゃんと動きました。

PC <- COM -> ESP32 <- Bluetooth -> Android(SPP)

という組み合わせで動かしてますが、ESP32はWifiも動くので

PC <- COM -> ESP32(Wifi AP) <- Wifi -> Android(Wifi)

という組み合わせも可能ですね(試してないけど)。Wifi版は既設のWifi環境に接続するかモバイルルータなどを使う必要がありましたがこの組み合わせにすると既設のWifiもモバイルルータも必要なし!スバラシイ

そんなわけでこれはちょっと急ぎで進めたいと思います。




2020年3月4日水曜日

ランドセルチェッカー その3

細々と続けておりますランドセルチェッカーですが、ちょっと問題だなーと思っていることがありまして。

結構毎日持ち物が変わる!

ということですね。だいたいは時間割があるので決まってるんですが、

あ、明日は学習発表会の練習だから体育着ね、とか
先生がカラのペットボトルあったら持ってきてくださいだってー、とか

持ち物が変わると当然ですがチェックするものを設定しないといけないわけで、これがスマホ開いてどうのとかタッチパネルでどうのとかだと面倒だなーと思うわけです。

そこでホワイトボードとマグネットを使って簡単に設定できないか試してみることにしました。

100円ショップでホワイトボードと超強力マグネットとマヨネーズカップを買ってきます。何でマヨネーズカップかは後述します。


マヨネーズカップの蓋に小さめのUHFのタグを貼って、中にマグネットを入れます。これでホワイトボードにくっつくようになります。


蓋をボード側にしてつけると、タグがホワイトボードの金属?とマグネットに挟まれる状態になるのでリーダで読めなくなります。逆にカップの底をボード側にしてつけるとタグとボードの間に距離が出ますので、リーダで問題なく読めます。これがやりたかったので普通のマグネットじゃなくて厚みの出るものを探してマヨネーズカップになりました。


緑は必要なもの(カップの底がボード側=タグが読める)で、赤は不要なもの(カップの蓋がボード側=タグが読めない)にしてみました。

この状態でリーダで読み取ると、こくご/さんすう/たいそうぎ/がんばり/ふでいれの5つのタグだけを読み取っています。

ちゃんと必要なものだけを認識していますね。これとランドセルでの読み取りとを比較すればいいわけですね。

どうでしょうか、これならお子さんが自分で設定もできるしいいんじゃないでしょうか。まぁ、見た目はいまいちですけど。