PC接続バーコードリーダ＋GS1バーコード読取における、ドキュメント紹介および読取実装例(vue)

# 背景

GS1バーコードは広く採用されているバーコードの規格である。日本におけるJANコード（GTINコード）を内包している（もしかしたら内包していないケースもあるかも知れないが、見たことがない）。
本記事ではGS1Japanのサイトを主に引用しつつ

* そもそものGS1コードの話
* PC接続＋キーボード入力系バーコードリーダでの読込、仕様・実装的な話

上記を纏める。

 **編集日：2021/05/17**

# そもそもGS1コードとは

* GS1（ジーエスワン）事業者コードとは、JAN( GTIN)コードとは
https://www.dsri.jp/jan/about_jan.html

```
GS1事業者コードは、JANコードやGLNなどの国際標準の識別コード（GS1識別コード）を設定するために必要な番号です。
```

```
JANコードは「どの事業者の、どの商品か」を表す、世界共通の商品識別番号です。
JANコードは、商品のブランドを持つ事業者が、当財団から貸与されたGS1事業者コードを用いて、商品ごとに設定します。
JANコードとJANシンボルは世界共通の仕組みであり、多くの国で使用されています。
JANコードは日本国内での呼び方です（JANとはJapaneseジャパニーズ Articleアーティクル Numberナンバーの略）。
国際的にはEANイアン（Europeanヨーロピアン Articleアーティクル Numberナンバー)コード、あるいは、GTINジーティン-13、GTIN-8と呼ばれます。（「GTIN」参照）
```

GS1コードの中にGTINコードなどが入ってくるイメージとなる。

# GS1コードはどのように各コードを判別している？

各コードの先頭にGS1アプリケーション識別子を結合し
読取時にて先頭数文字を用いてどのコードであるかを判別する。


## GS1アプリケーション識別子

https://www.dsri.jp/standard/identify/ai/

より引用

```
GS1アプリケーション識別子とは
GS1が標準化した、さまざまな情報の種類とフォーマット（データの内容、長さ、および使用可能な文字）を管理する2桁から4桁の数字のコードです。商品製造日、ロット番号などのデータの先頭に付けて使用します。アプリケーション識別子は、英語名称のApplication(アプリケーション) Identifier(アイデンティフィァー)の頭文字をとって、AI(エーアイ)とも呼ばれます。AIを使うと、商品識別コードやさまざまな属性情報を、どこの誰とどのシステムとの間でも共通化された方式で、バーコード化して伝達することができます。
```

* AI一覧表

https://www.dsri.jp/standard/identify/ai/explanation08.html

AI一覧表にはGTINコードのように14文字 **固定** のものから、ロット番号など **可変長** のものまである。

## 可変長のモノを読み取るにはどのようにしている？

* AIを正しく実装するためのポイント（プリンター、スキャナーメーカー様向け）

https://www.dsri.jp/standard/identify/ai/explanation07.html

より引用

```
2.重要な制御記号FNC1(ファンクション1)
FNC1（ファンクション１）は、AIをGS1標準シンボルに表現する際に重要な役割を果たす制御記号です。目視文字には表さないため、通常はユーザーに認識されない部分ですが、GS1標準シンボルを正しく表現し、正確なデータをシステムに取り込むために不可欠の機能です。 FNC1には2つの役割があり、使われる位置によって機能が異なります。

1）シンボルの先頭：そのシンボルが表現するデータがGS1標準のデータであることを示す
　独自フォーマットのデータや、ANSIなど他の標準のデータと区別するために使用します。

2）シンボルの途中：FNC1の直前の可変長データの終了（区切り）を示す
　可変長データの後ろに他のデータが続く場合に、可変長データの項目区切りとして使用されます。
　なお、固定長のデータの終了時には、FNC1は必要ありません。
```

すなわち、 **可変長データの末尾には「FNC1」なるデータを設定** し、 **データが終了しているかを判別** する。

# バーコードリーダ読込時

バーコードをバーコードリーダで読込、取得したデータを入力してもらうことで
文字データとして出力することが出来る。

この時留意したほうが良いことは、一般的なPC接続して利用するバーコードリーダの場合は、 **「バーコードリーダ入力≒キーボード入力」** ということ。
我々がキーボードを入力するのと同じく、バーコードリーダも入力する。
よって、基本は

１：あり得るAIを列挙
２：合致したAIが固定長なら固定長取得、可変長なら可変長データ末尾を判別し取得
３：バーコード自体の末尾でなければ１に戻る、末尾ならば終了

となると考える。この「可変長なら可変長データ末尾を判別し取得」を後述する。

## FNC1・GS

 **まず、可変長データ末尾として設定されるFNC1自体はキーボード入力として書き込まれない。** 
一般的なバーコードリーダは、設定によってFNC1部分を`[GS(グループセパレータ)]`として出力することができる。

* 制御文字
https://ja.wikipedia.org/wiki/%E5%88%B6%E5%BE%A1%E6%96%87%E5%AD%97

設定手法はバーコードリーダ機種によるが、概ね「Code128」の「GS送信あり」「UCC/EA1-128読み取りあり」と設定すればOKか？

上記の`^]` `29`の部分。
ここで問題なのは`^]`という文字が入力される **わけではない** 。
コレは `Ctrl + ]`とキーを叩いている。

以下のように実装し動作を確認した。insertGSの詳細コードは記載しない。

```
// vueでの書き方。キーボードがCtrlを押しながら221（]）を押した場合、処理が走るようにする。
// どのように実装するか次第だが、置換用の文字列を追加して元値に返すイメージが安定するだろうか。
          @keydown.ctrl.221="insertGS"
```

```
// バーコードリーダ出力の違いか、PCキーボード出力の違いか、
// 上記以外にもCtrl+219([)のケースでGSが出力されるケースがあるらしい。ソレもキャッチする。
          @keydown.ctrl.219="insertGS"
```

### GS1バーコードから外れたvue実装の余談

https://jp.vuejs.org/v2/guide/events.html#%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E4%BF%AE%E9%A3%BE%E5%AD%90%E3%82%AD%E3%83%BC

vueにて実装する時は上記のキー修飾子を参考にしたが、

```
keyCode イベントの使用は 非推奨 で、新しいブラウザではサポートされない可能性があります。
```

とある。同じ挙動が出来て推奨されているイベントがあれば良いのだが…

# 終わりに

本記事の内容には「一般的」と書いたように、バーコードリーダ自体でも様々な種類が存在する。
あくまでも「こういうドキュメントがあるよ」「こういう例があるよ」ぐらいの参考になれば幸い。