コンテンツにスキップ

Markdown版はこちら

端末の素性と出自

DS-MDA001 は日本では「運送事業者向けの点呼用アルコールチェッカー」として中古市場に流れています。しかし中身を開けると、もともとは中国の警察向けに開発された、路上取り締まり用の呼気アルコール検知器であることが見えてきます。

このページでは、そう判断した根拠と、日本流通版で何が削られているのかを整理します。


1. 素性の根拠

1.1 アプリのデフォルト言語が中国語

com.hikvision.alcoholtest の 無修飾ロケール (res/values/strings.xml) が中国語です。つまり中国語が翻訳ではなく原語です。

リソース名 値
app_name 酒精检测
please_install_the_blower_to_blow 请装好吹管吹气(吹管=マウスピース)
str_not_exceeding_the_standard 未超标
str_driving_after_drinking 饮酒后驾车
str_drunk_driving 醉酒后驾车
str_linkage_mode 明眸联动模式

1.2 判定区分が中国の道路交通法規に一致

饮酒后驾车(酒気帯び運転)と 醉酒后驾车(酩酊運転)は、中国国家標準 GB 19522「车辆驾驶人员血液、呼气酒精含量阈值与检验」 が定める法的区分そのものです。コード上の閾値 20 / 80 も同標準の数値(20〜79 mg/100mL=飲酒運転、80 mg/100mL 以上=酩酊運転)と一致します。

// NormalTestModeActivity.java
if (f2 < 20.0f)                      → str_not_exceeding_the_standard (未超标) 緑
else if (f2 >= 20.0f && f2 < 80.0f)  → str_driving_after_drinking (饮酒后驾车) 黄
else if (f2 >= 80.0f)                → str_drunk_driving (醉酒后驾车) 赤

なお、この判定ラダーは実機では動作しません

比較対象の f2 は mg/L(BrAC) の生値であるのに対し、閾値 20 / 80 は mg/100mL(BAC) の数値です。単位換算を挟まずに比較しているため、実測値(0.15 mg/L 等)では常に「未超标」に落ちます。詳細は 測定モードと運用仕様 を参照してください。

1.3 GB/T 21254-2017 適合

本機は中国国家標準 GB/T 21254-2017「呼出气体酒精含量检测仪」(呼気アルコール検知器の器差・応答時間等を定める計測器規格)に適合する製品として開発されています。

同規格に基づく取り締まり用途の要請として、検知器には次の 2 モードが求められます。

モード 中国語仕様 内容
正常测试(通常測定) 具备正常酒精气体呼出检测功能,插入一次性防倒吸标准吹管 使い捨ての逆流防止マウスピースを装着して正規の呼気量を吹き込む、証拠能力のある測定
快速筛查(迅速スクリーニング) 具备快速筛查功能,不用安装吹管,只需被测人员轻吹一口气就能快速判断是否饮酒 マウスピース不要。検問で軽く息を吹きかけさせ、飲酒の有無だけを即座に判定する

検問の現場ではまず全車両を快速筛查で流し、反応した相手にだけマウスピースを装着して正常测试を行う、という運用になります。民生用のアルコールチェッカーには存在しない、取り締まり専用の設計思想です。

1.4 型番体系

警察向けには DS-MDA001/GLE というモデルが存在し、日本で流通しているのはそこから機能をオミットした民生向けバージョンと考えられます。実際、後述のとおり取り締まり用のモードと通信機能がまとめて削られています。

APK 内に GB/T 21254 の文字列は存在しません

GB/T 21254-2017 への適合は製品仕様・ラベル側の情報であり、com.hikvision.alcoholtest の全ソース・全リソースを検索しても GB/T / 21254 / 国标 / 筛查 / 快速 の文字列はヒットしません。本ドキュメントでは外部情報として扱っています。 一方、上記 1.1 / 1.2 の中国語リソースと GB 19522 準拠の判定区分は APK 内で直接確認できる一次証拠です。


2. 日本流通版で削られているもの

2.1 快速筛查モードは Dead Code として残っている

迅速スクリーニングのコマンドは APK に定義だけ残っていて、呼び出し元が 1 箇所もありません。

// OrderTools.java — 3つとも完全に同じフレーム (cmd 0x04 / sub 0x03)
public static String QuickBlow              = "FE020C00020101040309F0FE";
public static String blowQuick              = "FE020C00020101040309F0FE";
public static String quickTestStartAutoPump = "FE020C00020101040309F0FE";
  • この 3 定数を参照しているコードは APK 全体で 0 箇所
  • 専用の serial ヘルパークラス util/RapidScreening.java も存在するが、一度も new されていない(OrderTools.java に未初期化フィールド RapidScreening rs; があるだけ)
  • CmdType 列挙に ExitTestForQuick が定義されているが、代入も比較も存在しない
  • モード選択メニュー(res/values/arrays.xml)は「明眸联动模式 / 单机模式 / 记录查询」の 3 項目のみで、スクリーニングへの導線がない

つまりセンサー基板側のファームウェアは快速筛查に対応している可能性が高いが、アプリ側の機能が丸ごと殺されている状態です。コマンド自体はプロトコル上存在するので、自作ツール から直接叩けば挙動を確かめられます。

2.2 被動測定 (passiveTest) も同様に到達不能

マウスピースなしで周囲の気体を吸って判定する passiveTest (cmd 0x10) も、公式アプリからは起動できません。

// NormalTestModeActivity.java:381 — この条件は永久に false
if (SampleBoradState == OrderTools.CmdType.ExitTestForWarm) {
    SampleBoradState = OrderTools.CmdType.PassiveTest;
    SerialHelper.sendHex(OrderTools.passiveTest);

CmdType.ExitTestForWarm はどこからも代入されず、また起動用の btn_passive_test は findViewById されておらず(レイアウト XML にボタン ID が 1 つも無い)、参照すれば NPE になります。

2.3 無線が全部殺されている

Wi-Fi / Bluetooth / セルラーはソフトウェア・ハードウェア両面で無効化されています。取り締まり用モデルであれば通信機能は必須のはずで、これも民生転用にあたって落とされた機能と考えられます。

  • ソフト側: ro.vendor.radio.noril、HAL 宣言の削除、wpa_supplicant.rc の削除、Bluetooth.apk の物理削除
  • ハード側: U.FL / IPEX コネクタは実装済みだがアンテナ本体が非搭載

詳細は Wi-Fi 恒久有効化 と Bluetooth 移植(失敗) を参照してください。


3. アプリから読み取れる構成

項目 値
パッケージ com.hikvision.alcoholtest
バージョン 1.0.2 (versionCode 102)
署名・権限 android:sharedUserId="android.uid.system"(プラットフォーム署名)
SDK compileSdk 32 / minSdk 16 / targetSdk 32
動作モード 明眸联动模式(顔認証端末連携)/ 单机模式(スタンドアロン)/ 记录查询(記録閲覧)
同梱 SDK Hikvision NetSDK (libhcnetsdk.so, libHCCore*.so, libPlayCtrl*.so) — 明眸連携用
ハード制御ライブラリ libgzds_utils.so(com.gzds.utils)— シリアルポートとサーマルプリンタの両方を担当
センサー接続 /dev/ttyMSM1 @ 9600 8N1
既定の連携先 192.168.42.10:8000(Hikvision ISAPI の既定値)

「明眸 (MinMoe)」は Hikvision の顔認証端末シリーズの名称で、連携モードでは顔認証端末とペアで運用し、「誰が測定したか」を紐づける設計になっています。

gzds とは

シリアル・プリンタを抽象化しているベンダーライブラリの名前空間ですが、APK 内に正式名称の記載はありません。Hikvision 自身ではなく、端末(SOM +プリンタ)を供給した OEM 側のライブラリと考えられます。


4. 日本向けの改造はソースに直書きされている

面白いことに、日本語化はリソース翻訳ではなく Java コードへのハードコードで行われています。

  • res/values-ja/strings.xml は存在するが、中身は AndroidX / Material の枠組み文字列のみ(アプリ独自の文字列は 0 件)
  • 一方で Java 側に直接:

    // NormalTestModeActivity.java:1035
    DescDialog.setDesc("測定結果印刷");
    // PrintUtil.java:18-31 — レシートの印字文字列
    "許可証" / "氏名:" / "時間:" / "アルコール濃度:" + "mg/L" / "温度:" / "判定:OK" / "判定:NG"
    
  • 判定閾値も、中国式の 20 / 80 とは別に 日本の道交法基準 0.15 mg/L の判定が追記されている(測定モードと運用仕様 参照)

つまり中国向け本体に日本向けの判定と印字を後付けしたビルドであり、元の中国語リソースも中国式判定ロジックもそのまま残っています。


5. 入手性

  • 主な入手ルートはヤフオク等の中古市場、相場は 1.2〜1.3 万円程度
  • 付属品として専用 AC アダプタ(12V 2A / DC ジャック 外径 3.5mm・内径 1.1mm)が必要。USB からは充電できません
  • 感熱ロール紙は紙幅 57〜58mm、ロール外径 25mm まで。市販のレシート用紙が使えます