6
5

More than 3 years have passed since last update.

[1]独自のフォーマットに基づいてQRコードを発行する

Last updated at Posted at 2019-12-28

この記事はQRコードを使った入場システムを自作する。シリーズの記事です。

前回

QRコードを使った入場システムを自作する。でなんとなく概要と経緯を説明しました。今回からは実践編です。

QRコードを発行するには。

PythonでQRコードを生成できるモジュールがあったのでそれを使う。

まずはインストール

$ pip3 install qrcode

実際に書いてみる。

QR1.py
import qrcode

#QRコードのサイズを指定
qr = qrcode.QRCode(box_size=5)
#QRコードにする文字列
qr.add_data('Hello_World')
#QRコードを作成
qr.make()
#QRコードを画像化
img = qr.make_image()

#生成した画像を保存
img.save('test.png')

print('Success Generated.')

作成した結果...

作成されたQRコード
test.png
読み取ってみると...
読み取った結果
IMG_4025.PNG

簡単に作成ができました。

作成したQRコードを独自のフォーマットに基づき発行しdbに登録する

以下の大まかな手順により発行しdbへ登録する

  • 上記のソースコードを利用し独自のフォーマット(後述)でQRコードを作成する。
  • MySQL上"testdb"の"QRtest"テーブルにQRコード(ID)と発行した時刻を保存する。

(今回はMySQLの環境構築とラズパイ鯖の構築方法は省きます。)

MySQLをPythonで使えるようにする。(PythonからMySQLに接続するためにmysqlclientパッケージを利用する。)
筆者の実行環境がmacOSであったためまずは以下の手順でライブラリをインストールした。
$ brew install mysql-connector-c
次に
pip install mysqlclientする。
これでdbにアクセスする準備はできました。

...独自のフォーマットとは。

発券されるQRコードを識別できるように券種情報を上3桁、ユーザーIDを下9桁をそれぞれ特定の範囲でランダムに生成し組み合わせることでQRコード(ID)を作成する。

実際に書いてみる。

dbtest.py
'''
    author: @inchoxd
    ver: 0.1.1
    2019/12/5: MySQLに対応
    2019/12/5: QRコードの生成とdbへの登録機能を追加
'''

import qrcode
import random
import os
import datetime
import mysql.connector as testdb

#サイズの指定
qr = qrcode.QRCode(box_size=15)

'''
    QRコードのフォーマット
    ***@@@@@@@@@ -> 12ケタ
    ***---------: 3ケタ, 券種
    ---@@@@@@@@@: 9ケタ, ID 
'''

#券種
ctype = random.randint(693, 862)
#ID
csid = random.randint(100000000, 999999999)
#券種とIDを文字列に変換してQRidを生成
QRid = str(ctype) + str(csid)

#時刻と日付を取得し文字列へ変換
date = datetime.datetime.now().strftime('%Y/%m/%d')
sdate = str(date)
time = datetime.datetime.now().strftime('%H:%M:%S')
stime = str(time)

#QRコードの生成
qr.add_data(QRid)
qr.make()
#QRコード画像を生成
img = qr.make_image()
#/QRimgフォルダへ保存
img.save(os.path.join('./QRimg',str(QRid)+'.png'))

#MySQLへ接続
conn = testdb.connect(
    user = 'tester', 
    password = '12345', 
    host = '192.168.x.x',
    port = '3306',
    database='QRtest'
)

#接続ステータスを確認
conn.ping(reconnect=True)
print(conn.is_connected())

cur = conn.cursor()

#table: QRidへデータを格納 
table = 'QRid'
cur.execute("INSERT INTO QRid VALUES (%s, %s, %s)", (QRid, sdate, stime))

#MySQLへの接続を終了
cur.close()
conn.commit()
conn.close()

print('Data Saved!')
print(str(date)+' '+str(time)+'| Generated Successfully.')

実行した結果...

ターミナル
スクリーンショット 2019-12-29 2.43.34.png
MySQL
スクリーンショット 2019-12-29 2.45.25.png
作成されたQRコード
708377970881.png
読み取った結果
File_001.png

QRコードを作成しdbへ登録。そして生成されたQRコードが読み取れました。
QRコードを作成するスクリプトの基礎的なものは完成しました。

次回予告

[2] 作成したQRコードを読み取り識別する。

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5