今回はDS-K1T502DBWX-Cという指紋認証機をつかって、
Minecraftにセキュリティ対策バッチリの金庫の作り方を紹介します。
Contents
開発環境
PC:Windows 11
※Raspberry Pi 4 Model B (Linux)
開発ツール:Node.js (v18.19.0)
Node-RED (v.3.1.3)
インターネット:社内の無線LAN
Minecraft:v1.20.51 (執筆時点)
※Node-REDをRaspberry Piで動かしています。Windowsで動かしていれば不要です。
事前準備
指紋の登録
指紋認証機 DS-K1T502DBWX-C に、利用者の指紋を登録します。
認証機の詳しい説明や登録方法はこちらの記事を参考にしてください。
hikvision のノードを追加
パレットの管理から「node-red-contrib-hikvision-ultimate」を追加しておきます。
指紋認証機からのレスポンスをこのノードから受け取ります。
完成像
フローの概要

Access Control Terminalの設定

ノードを開くと上のようなプロパティが現れます。
Server IPに認証機のIPアドレス。
Username、Passwordにも認証機に登録しているものを入力します。
入力後Connectします。
Switchノード
ここではpayloadに格納された認証機からのデータ中の
msg.payload.nameで指定されたユーザーネームを分岐させています。
Minecraftへのコマンドリクエスト
ノードの詳細は以前の記事で紹介しています。
今回はコマンドラインにMinecraft内で信号源となる
レッドストーンブロックの設置コマンドを設定しています。
(正直、レッドストーンで動かせるものであれば、ドア以外でも何でもできます。)
ノードデータ
[ { "id": "4cfb3200712e5663", "type": "switch", "z": "458a61ef3f0be4ba", "name": "", "property": "payload.name", "propertyType": "msg", "rules": [ { "t": "eq", "v": "登録したユーザーネーム", "vt": "str" }, { "t": "else" } ], "checkall": "true", "repair": false, "outputs": 2, "x": 470, "y": 360, "wires": [ [ "7505a1c7e7b33495" ], [] ] }, { "id": "99a4b07eba1c8258", "type": "debug", "z": "458a61ef3f0be4ba", "name": "debug", "active": true, "tosidebar": true, "console": false, "tostatus": false, "complete": "payload", "targetType": "msg", "statusVal": "", "statusType": "auto", "x": 470, "y": 400, "wires": [] }, { "id": "7505a1c7e7b33495", "type": "uuid", "z": "458a61ef3f0be4ba", "uuidVersion": "v4", "namespaceType": "", "namespace": "", "namespaceCustom": "", "name": "", "field": "payout", "fieldType": "msg", "x": 610, "y": 360, "wires": [ [ "15f0dea048dc1c86" ] ] }, { "id": "15f0dea048dc1c86", "type": "function", "z": "458a61ef3f0be4ba", "name": "DoorUnlock", "func": "const uuid = msg.payout;\n\nconst commandRequestMessageJSON = {\n \"header\": {\n \"version\": 1, // プロトコルのバージョン1.18.2時点では1でOK\n \"requestId\": uuid, // UUIDv4を生成して指定\n \"messageType\": \"commandRequest\", // commandRequestを指定\n \"messagePurpose\": \"commandRequest\", // commandRequestを指定\n },\n \"body\": {\n \"origin\": {\n \"type\": \"player\" // 誰がコマンドを実行するかを指定(ただし、Player以外にどの値が利用可能かは要調査)\n },\n \"version\": 1, // プロトコルのバージョン1.18.2時点では1でOK\n \"commandLine\": \"setblock -31 -62 19 redstone_block \", // マイクラで実行したいコマンドを指定(ここではニワトリをスポーンさせるコマンドを指定)\n }\n};\n\nmsg.payload = JSON.stringify(commandRequestMessageJSON);\n\nreturn msg;", "outputs": 1, "timeout": 0, "noerr": 0, "initialize": "", "finalize": "", "libs": [], "x": 770, "y": 360, "wires": [ [ "17091469b71424d5" ] ] }, { "id": "17091469b71424d5", "type": "websocket out", "z": "458a61ef3f0be4ba", "name": "", "server": "c838b41f45982027", "client": "", "x": 940, "y": 360, "wires": [] }, { "id": "08f63652795a9552", "type": "hikvisionUltimateAccessControlTerminal", "z": "458a61ef3f0be4ba", "name": "", "topic": "", "server": "0af0a3ff10a518c3", "filtermajorevent": 0, "filterminorevent": "0", "x": 250, "y": 360, "wires": [ [ "4cfb3200712e5663", "99a4b07eba1c8258" ], [] ] }, { "id": "c838b41f45982027", "type": "websocket-listener", "path": "ws", "wholemsg": "false" }, { "id": "0af0a3ff10a518c3", "type": "AccessControl-config", "host": "", "port": "80", "name": "Access Control Terminal", "protocol": "http", "deviceinfo": "[object Object]", "authentication": "digest" } ]