<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Soul Of Free Loop &#187; NFC</title>
	<atom:link href="https://zohead.com/archives/tag/nfc/feed" rel="self" type="application/rss+xml" />
	<link>https://zohead.com</link>
	<description>Uranus Zhou&#039;s Blog</description>
	<lastBuildDate>Sat, 19 Jul 2025 15:42:46 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.8</generator>
	<item>
		<title>复制MIFARE Classic小区门禁卡记录</title>
		<link>https://zohead.com/archives/copy-mifare-classic/</link>
		<comments>https://zohead.com/archives/copy-mifare-classic/#comments</comments>
		<pubDate>Fri, 23 Jun 2017 16:12:32 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[NFC]]></category>
		<category><![CDATA[Classic]]></category>
		<category><![CDATA[CUID]]></category>
		<category><![CDATA[M1]]></category>
		<category><![CDATA[mfcuk]]></category>
		<category><![CDATA[mfoc]]></category>
		<category><![CDATA[MIFARE]]></category>
		<category><![CDATA[NXP]]></category>
		<category><![CDATA[PL-2303]]></category>
		<category><![CDATA[PN532]]></category>
		<category><![CDATA[UID]]></category>
		<category><![CDATA[门禁卡]]></category>

		<guid isPermaLink="false">https://zohead.com/?p=1455</guid>
		<description><![CDATA[上个月忙着找房搬家换新住处，住进去发现新小区除了稍有点远的大门，平时方便行人出入的侧门都是必须刷门禁卡的，而房东那只有一张 IC 门禁卡，小区物业也无法办理新卡了，因此想着是不是能用手机模拟或者复制门禁卡的方式自己解决。 尝试手机模拟 由于我使用的华硕 Zenfone 2 手机是支持 NFC 功能的，首先可以用手机读取现有的门禁卡信息，这里我使用的是 NXP 官方推出的 NFC TagInfo App： 从 IC Info 里可以看到小区 IC 门禁卡是最常见的 MIFARE Classic EV1 S50 也就是 M1 1k 卡。 另外 App 下方还提示我的手机不兼容此卡，我们可以在 FU [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>上个月忙着找房搬家换新住处，住进去发现新小区除了稍有点远的大门，平时方便行人出入的侧门都是必须刷门禁卡的，而房东那只有一张 IC 门禁卡，小区物业也无法办理新卡了，因此想着是不是能用手机模拟或者复制门禁卡的方式自己解决。</p>
<h2 id="尝试手机模拟">尝试手机模拟</h2>
<p>由于我使用的华硕 Zenfone 2 手机是支持 NFC 功能的，首先可以用手机读取现有的门禁卡信息，这里我使用的是 NXP 官方推出的 <a href="https://play.google.com/store/apps/details?id=com.nxp.taginfolite" target="_blank">NFC TagInfo</a> App：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737369839/android-nxp-m1-info.jpg" alt="IC 卡类型" title="IC 卡类型"></p>
<p>从 <code>IC Info</code> 里可以看到小区 IC 门禁卡是最常见的 MIFARE Classic EV1 S50 也就是 M1 1k 卡。</p>
<p>另外 App 下方还提示我的手机不兼容此卡，我们可以在 <code>FULL SCAN</code> 标签里查询详细信息：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737369839/android-nxp-m1-detail.jpg" alt="IC 卡详细信息" title="IC 卡详细信息"></p>
<p>这里可以读到 M1 卡的 4 个字节 UID，但由于我的 Zenfone 2 手机使用的是 Broadcom 的 BCM20795 NFC 芯片，此芯片并不兼容国内常用的 M1 卡，NFC TagInfo App 读不到卡中的数据。</p>
<p>虽然也有网友分享了通过修改 Android 系统文件固定手机 NFC ID 的方法来模拟门禁卡，但现在的小区门禁并不只单纯验证卡 ID，因此想用手机来模拟门禁卡就行不通了。</p>
<h2 id="准备-nfc-读卡器和-uid-卡">准备 NFC 读卡器和 UID 卡</h2>
<h3 id="nfc-读卡器">NFC 读卡器</h3>
<p>如果为了省事，大家可以选择 <a href="http://www.acs.com.hk/en/products/3/acr122u-usb-nfc-reader/" target="_blank">ACR122U</a> 这种现成的 USB NFC 读卡器，ACR122U 不仅有配套的软件，而且很多 IC 卡商家对其支持也比较好。</p>
<p>不过出于练（省）练（银）手（子）的考虑，我用的还是 NXP 自家产的 <a href="http://www.nxp.com/products/identification-and-security/nfc-and-reader-ics/nfc-controller-solutions/nfc-integrated-solution:PN5321A3HN" target="_blank">PN532</a> NFC/RFID v3 模块 + <a href="http://www.prolific.com.tw/US/ShowProduct.aspx?p_id=8&amp;pcid=41" target="_blank">PL-2303HX</a> USB 转 TTL 模块，毕竟这一套从淘宝买下来也才 30 多大洋。</p>
<p>收到的 PN532 NFC/RFID 模块和配件：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442873/PN532-front.jpg" alt="PN532 NFC/RFID 模块" title="PN532 NFC/RFID 模块"></p>
<p>需要注意模块背面的 <code>GND</code>、<code>VCC</code>、<code>TXD</code> 和 <code>RXD</code> 4 个引脚：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442872/PN532-back.jpg" alt="PN532 背面引脚" title="PN532 背面引脚"></p>
<p>PL-2303HX USB 转 TTL 模块就更简单了，背面依次是 <code>3.3V</code>、<code>5.0V</code>、<code>TXD</code>、<code>RXD</code> 和 <code>GND</code> 5 个引脚：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442872/PL2303HX.jpg" alt="PL-2303HX 背面引脚" title="PL-2303HX 背面引脚"></p>
<p>将引脚针焊接到 PN532 的 4 个引脚，然后按下面的顺序和 PL-2303HX 模块连接起来即可：</p>
<ul>
<li>PN532 的 <code>VCC</code> &lt;-&gt; PL-2303HX 的 <code>5.0V</code>；</li>
<li>PN532 的 <code>GND</code> &lt;-&gt; PL-2303HX 的 <code>GND</code>；</li>
<li>PN532 的 <code>RXD</code> &lt;-&gt; PL-2303HX 的 <code>TXD</code>；</li>
<li>PN532 的 <code>TXD</code> &lt;-&gt; PL-2303HX 的 <code>RXD</code>。</li>
</ul>
<p>完成之后就可以插在电脑的 USB 接口上使用了：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442876/PN532-TTL.jpg" alt="NFC 读卡器" title="NFC 读卡器"></p>
<h3 id="关于-uid-卡">关于 UID 卡</h3>
<p>M1 1k 卡有 16 个数据存储区（扇区），编号是 0 到 15，每个扇区都有独立的加密 key，每个扇区又分为 4 个存储单元（块）。在 M1 卡中数据存储的最小单位就是“块”，每一块有 16 字节用来存放数据。</p>
<p>由于一般的 M1 卡（例如 NFC 读卡器模块商家赠送的两张白卡）的 0 扇区 0 块为制造商使用，其中包括的 UID 值等数据并不能随意修改，这样即使复制下来也没什么意义了。</p>
<p>这里我使用的是被称为 <code>Chinese Magic Card</code> 的 0 扇区 0 块可写的 CUID 卡，相对于普通 UID 卡其好处在于可以被反复擦写，而且还支持使用兼容 M1 卡的 Android 手机（一般都是采用 NXP NFC 芯片的手机）来进行读写。</p>
<h2 id="使用-mfoc-工具复制门禁卡">使用 mfoc 工具复制门禁卡</h2>
<p><a href="https://github.com/nfc-tools/mfoc" target="_blank">MFOC</a>（Mifare Classic Offline Cracker）是一款基于 nested authentication 验证漏洞破解含有默认 key 的M1卡的开源软件，mfoc 软件自带了一些常用的默认 key 来进行破解，用户也可以通过参数添加自定义的 key。</p>
<h3 id="安装-libnfc">安装 libnfc</h3>
<p>为了方便我就直接在 Chromebook 上安装使用了，插上自制的 USB NFC 读卡器之后，我们可以使用 <code>lsusb</code> 命令检查是否找到了 PL-2303HX 设备：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 041: ID 0cf3:e003 Atheros Communications, Inc. 
Bus 001 Device 039: ID 0bda:575a Realtek Semiconductor Corp. 
Bus 001 Device 043: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
</pre>
<p>首先必须安装 mfoc 依赖的 libnfc 包：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~$ sudo apt-get install libnfc-bin libnfc-dev libnfc-examples
</pre>
<p>对于 PL-2303HX 上的 PN532 模块，我们需要修改 libnfc 配置文件开启自动扫描，否则将无法正确识别到 NFC 设备：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~$ sudo mkdir -p /etc/nfc/devices.d
(trusty)zzm@localhost:~$ cat &gt; /etc/nfc/libnfc.conf
allow_autoscan = true
allow_intrusive_scan = true
</pre>
<p>此时将门禁卡放到 PN532 模块上，以 root 用户身份运行 <code>nfc-list</code> 命令，没什么意外的话就可以识别到 NFC 设备，并能读取到门禁卡 UID 信息了：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~$ sudo nfc-list
nfc-list uses libnfc 1.7.0
NFC device: pn532_uart:/dev/ttyUSB0 opened
1 ISO14443A passive target(s) found:
ISO/IEC 14443A (106 kbps) target:
    ATQA (SENS_RES): 00  04
       UID (NFCID1): 8e  f3  7c  de
      SAK (SEL_RES): 08
</pre>
<h3 id="安装和使用-mfoc">安装和使用 mfoc</h3>
<p>最好自行编译安装 GitHub 上最新版本的 mfoc：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~/Downloads/src$ wget https://github.com/nfc-tools/mfoc/archive/mfoc-0.10.7.tar.gz
(trusty)zzm@localhost:~/Downloads/src/mfoc-mfoc-0.10.7$ autoreconf -vis
(trusty)zzm@localhost:~/Downloads/src/mfoc-mfoc-0.10.7$ ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var
(trusty)zzm@localhost:~/Downloads/src/mfoc-mfoc-0.10.7$ sudo make
(trusty)zzm@localhost:~/Downloads/src/mfoc-mfoc-0.10.7$ sudo make install
</pre>
<p>安装成功之后就可以运行 mfoc 命令尝试破解读取门禁卡数据了，参数为需要导出的备份文件名：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~/Downloads$ sudo mfoc -O bak.dmp
ISO/IEC 14443A (106 kbps) target:
    ATQA (SENS_RES): 00  04
* UID size: single
* bit frame anticollision supported
       UID (NFCID1): 8e  f3  7c  de
      SAK (SEL_RES): 08
* Not compliant with ISO/IEC 14443-4
* Not compliant with ISO/IEC 18092

Fingerprinting based on MIFARE type Identification Procedure:
* MIFARE Classic 1K
* MIFARE Plus (4 Byte UID or 4 Byte RID) 2K, Security level 1
* SmartMX with MIFARE 1K emulation
Other possible matches based on ATQA &amp; SAK values:

Try to authenticate to all sectors with default keys...
Symbols: '.' no key found, '/' A key found, '\' B key found, 'x' both keys found
[Key: ffffffffffff] -&gt; [................]
[Key: a0a1a2a3a4a5] -&gt; [................]
[Key: d3f7d3f7d3f7] -&gt; [................]
[Key: 000000000000] -&gt; [................]
[Key: b0b1b2b3b4b5] -&gt; [................]
[Key: 4d3a99c351dd] -&gt; [................]
[Key: 1a982c7e459a] -&gt; [................]
[Key: aabbccddeeff] -&gt; [................]
[Key: 714c5c886e97] -&gt; [................]
[Key: 587ee5f9350f] -&gt; [................]
[Key: a0478cc39091] -&gt; [................]
[Key: 533cb6c723f6] -&gt; [................]
[Key: 8fd0a4f256e9] -&gt; [................]

Sector 00 -  UNKNOWN_KEY [A]  Sector 00 -  UNKNOWN_KEY [B]  
Sector 01 -  UNKNOWN_KEY [A]  Sector 01 -  UNKNOWN_KEY [B]  
Sector 02 -  UNKNOWN_KEY [A]  Sector 02 -  UNKNOWN_KEY [B]  
Sector 03 -  UNKNOWN_KEY [A]  Sector 03 -  UNKNOWN_KEY [B]  
Sector 04 -  UNKNOWN_KEY [A]  Sector 04 -  UNKNOWN_KEY [B]  
Sector 05 -  UNKNOWN_KEY [A]  Sector 05 -  UNKNOWN_KEY [B]  
Sector 06 -  UNKNOWN_KEY [A]  Sector 06 -  UNKNOWN_KEY [B]  
Sector 07 -  UNKNOWN_KEY [A]  Sector 07 -  UNKNOWN_KEY [B]  
Sector 08 -  UNKNOWN_KEY [A]  Sector 08 -  UNKNOWN_KEY [B]  
Sector 09 -  UNKNOWN_KEY [A]  Sector 09 -  UNKNOWN_KEY [B]  
Sector 10 -  UNKNOWN_KEY [A]  Sector 10 -  UNKNOWN_KEY [B]  
Sector 11 -  UNKNOWN_KEY [A]  Sector 11 -  UNKNOWN_KEY [B]  
Sector 12 -  UNKNOWN_KEY [A]  Sector 12 -  UNKNOWN_KEY [B]  
Sector 13 -  UNKNOWN_KEY [A]  Sector 13 -  UNKNOWN_KEY [B]  
Sector 14 -  UNKNOWN_KEY [A]  Sector 14 -  UNKNOWN_KEY [B]  
Sector 15 -  UNKNOWN_KEY [A]  Sector 15 -  UNKNOWN_KEY [B]  
mfoc: ERROR: 

No sector encrypted with the default key has been found, exiting..
</pre>
<p>如果运行正常没有报错的话，那么恭喜你，mfoc 工具会将整个 M1 卡备份为指定的文件。你可以跳过下面这一步接着就将备份文件写入新卡了。</p>
<p>如果你也遇到我贴在上面的错误输出，说明你的门禁卡并没有使用这些默认 key，此时就要请出 mfcuk 工具了。</p>
<h2 id="使用-mfcuk-工具">使用 mfcuk 工具</h2>
<p><a href="https://github.com/nfc-tools/mfcuk" target="_blank">MFCUK</a>（MiFare Classic Universal toolKit） 是一款基于 dackside 攻击原理破解全加密 M1 卡的开源软件，mfcuk 通过算法的漏洞破解出第一个 key，如果某个扇区的 key 被破解出来，就可以再使用 mfoc 工具使用 nested authentication 攻击破解其他扇区的密码。</p>
<p>首先从 GitHub 上下载代码并编译安装：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~/Downloads/src$ wget https://github.com/nfc-tools/mfcuk/archive/mfcuk-0.3.8.tar.gz
(trusty)zzm@localhost:~/Downloads/src/mfcuk-mfcuk-0.3.8$ autoreconf -vis
(trusty)zzm@localhost:~/Downloads/src/mfcuk-mfcuk-0.3.8$ ./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var
(trusty)zzm@localhost:~/Downloads/src/mfcuk-mfcuk-0.3.8$ sudo make
(trusty)zzm@localhost:~/Downloads/src/mfcuk-mfcuk-0.3.8$ sudo make install
</pre>
<p>接着就可以用 mfcuk 进行破解了，我这边破解第一个 key 用了近半个小时的时间：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~/Downloads$ sudo mfcuk -C -R 0:A -s 250 -S 250 -v 3
</pre>
<p>如果破解顺利的话，mfcuk 命令输出中会显示类似下面的 key 信息：</p>
<pre class="brush: plain; title: ; notranslate">
INFO: block 4 recovered KEY: XXXXXXXXXXXX
</pre>
<p>得到第一个 key 之后，我们就可以按 <kbd>Ctrl-C</kbd> 键退出 mfcuk 命令。</p>
<p>此时我们就可以把破解出来的 key 添加到 mfoc 命令的自定义参数中：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~/Downloads$ sudo mfoc -O bak.dmp -k XXXXXXXXXXXX
</pre>
<p>如果 mfcuk 破解得到的第一个 key 是正确的，mfoc 命令一般会在几分钟之内完成整个 M1 卡所有扇区的破解，最终将成功生成导出备份文件。</p>
<h2 id="写入新-uid-卡">写入新 UID 卡</h2>
<p>通过 mfoc 和 mfcuk 工具成功导出原门禁卡数据之后，我们就可以将备份文件写入新的 UID 卡了。</p>
<h3 id="linux-系统写-uid-卡">Linux 系统写 UID 卡</h3>
<p>Linux 系统下我们可以使用 libnfc 软件包自带的 <code>nfc-mfclassic</code> 工具来写新的 UID 卡：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~/Downloads$ sudo nfc-mfclassic W a bak.dump bak.dump f
</pre>
<p><code>nfc-mfclassic</code> 命令的 <code>W</code> 参数表示以 unlocked write 方式写入包含 0 扇区 0 块的数据（必须是 0 扇区 0 块国产魔卡）。</p>
<p>不过可惜的是我使用 <code>nfc-mfclassic</code> 工具写购买的 CUID 卡始终会报 0 块写入失败，无奈只能在 Windows 系统上使用其它工具写卡。</p>
<h3 id="windows-系统写-uid-卡">Windows 系统写 UID 卡</h3>
<p>Windows 上我使用专门适配 PN532 NFC 读卡器设备的 MiFare Offline Cracker GUI（MFOC GUI）工具来写新的 UID 卡，软件界面如下：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442840/mfocgui-pn532-win.jpg" alt="Windows MFOC GUI" title="Windows MFOC GUI"></p>
<p>打开软件之后，首先需要确认 Reader 处能正确识别到 USB 转 TTL 设备（我的是 PN532 COM3 设备），放上新的 UID 卡之后，点击 <code>Read data (Reader)</code> 按钮将会从读卡器读取卡的类型和 UID 值等信息。</p>
<p>选中 <code>Write keys</code> 和 <code>Non-OV Card</code> 复选框，然后点击 <code>Write data (Reader)</code> 按钮，软件会提示你选择之前导出的备份文件，确认之后就会开始将数据写入新卡。</p>
<p>一切运行正常的话，你可以再次点击 <code>Read data (Reader)</code> 按钮读取新卡的 UID 值，如果和原来的门禁卡  UID 一致那就表示写入成功咯。</p>
<blockquote>
<p><strong>提示</strong></p>
<p>如果你使用的其它软件导出的备份文件大小是 1kb 而不是 4kb，那么需要先使用 <code>fixdump</code> 工具修复备份文件，然后再使用 MFOC GUI 写入新卡。</p>
<p>Windows 上的 MFOC GUI 工具、<code>fixdump</code> 还有 MFCUK 软件我已经上传到百度网盘了，有需要的朋友可以通过下面的分享链接下载：</p>
<p><a href="https://pan.baidu.com/s/1kV7MOg3" target="_blank">https://pan.baidu.com/s/1kV7MOg3</a></p>
</blockquote>
<h2 id="改装到手机">改装到手机</h2>
<p>上面的复制及写入步骤都完成之后，我就拿着新复制的两张 UID 卡到小区门禁那测试，不出意外都成功地刷开了两边侧门的门禁。</p>
<p>为了不用外出时还专门带张门禁卡，我决定稍微小改一下 UID 卡装到手机上，首先拆开 UID 卡取出内部的 M1 电子标签，这里就要提醒大家最好购买方便拆装的钥匙扣样式的卡了：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737372135/M1-CUID.jpg" alt="M1 电子标签" title="M1 电子标签"></p>
<p>然后将取出的 M1 电子标签用 NFC 贴纸之类的东西贴到手机后盖或者手机壳上，由于我的华硕 Zenfone 2 手机后盖上有 NFC 线圈，因此只能贴到手机壳上，另外 M1 电子标签最好能远离手机后盖上的 NFC 线圈：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737372293/M1-sticker-phone-case.jpg" alt="手机后盖 M1 标签" title="手机后盖 M1 标签"></p>
<p>搞定之后就能很方便地用手机直接刷小区门禁了，最后祝大家玩的开心，本文中使用的工具和方法还请勿用于非法用途哦。</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/copy-mifare-classic/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Android使用Shell命令配合Tasker控制手机</title>
		<link>https://zohead.com/archives/tasker-shell/</link>
		<comments>https://zohead.com/archives/tasker-shell/#comments</comments>
		<pubDate>Tue, 13 Dec 2016 16:38:02 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[GPS]]></category>
		<category><![CDATA[NFC]]></category>
		<category><![CDATA[Secure Settings]]></category>
		<category><![CDATA[Shadowsocks]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[Tasker]]></category>
		<category><![CDATA[飞行模式]]></category>

		<guid isPermaLink="false">https://zohead.com/?p=1325</guid>
		<description><![CDATA[Secure Settings 对比 Shell 命令 去年我写过一篇 Android 使用 Trigger + Tasker 设定 NFC 标签 的文章，主要介绍怎么使用 Tasker 和 Trigger App 设定 Android 手机刷 NFC 标签时执行指定的操作。该文章中对于手机的 飞行模式 / GPS / NFC 等功能的控制操作都是通过 Secure Settings App 实现的。 不过可惜的是我的华硕 Zenfone2 手机 ROM 升级到 6.0 版本之后，Secure Settings App 就有很多功能不能正常工作了，而且由于开发者也基本不再维护该 App 也有差 [&#8230;]]]></description>
				<content:encoded><![CDATA[<h2 id="secure-settings-对比-shell-命令">Secure Settings 对比 Shell 命令</h2>
<p>去年我写过一篇 <a href="https://zohead.com/archives/tasker-nfc/">Android 使用 Trigger + Tasker 设定 NFC 标签</a> 的文章，主要介绍怎么使用 <a href="https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm" target="_blank">Tasker</a> 和 <a href="https://play.google.com/store/apps/details?id=com.jwsoft.nfcactionlauncher" target="_blank">Trigger</a> App 设定 Android 手机刷 NFC 标签时执行指定的操作。该文章中对于手机的 飞行模式 / GPS / NFC 等功能的控制操作都是通过 <a href="https://play.google.com/store/apps/details?id=com.intangibleobject.securesettings.plugin" target="_blank">Secure Settings</a> App 实现的。</p>
<p>不过可惜的是我的华硕 Zenfone2 手机 ROM 升级到 6.0 版本之后，Secure Settings App 就有很多功能不能正常工作了，而且由于开发者也基本不再维护该 App 也有差不多两年没有任何更新。</p>
<p>最近看到 <a href="http://www.notenoughtech.com/tasker/tasker-run-shell-commands/" target="_blank">Best run shell commands in Tasker</a> 文章介绍  Tasker 的几个常用 Shell 命令控制移动数据、飞行模式等选项，使用 Tasker 自带的运行 Shell 命令功能相比 Secure Settings 插件也有一些好处：</p>
<ul>
<li>Tasker 直接支持运行 Shell 命令（新增 <strong>操作类别</strong> -&gt; <strong>代码</strong> -&gt; <strong>运行外壳</strong> 即可），不需要专门安装 Secure Settings 等第三方 App；</li>
<li>多数命令在手机 root 后就能正常工作，不像 Secure Settings 那样需要特别安装成系统 App；</li>
<li>Shell 命令失效需要替换时也比较灵活，直接改 Shell 命令行就可以。</li>
</ul>
<p>因此我还是卸载了 Secure Settings App，将原来文章里的所有 Tasker 任务的 Secure Settings 操作都以 Shell 命令进行替代。</p>
<h2 id="tasker-任务使用-shell-命令">Tasker 任务使用 Shell 命令</h2>
<h3 id="数据开关-运行-shadowsocks">数据开关 + 运行 Shadowsocks</h3>
<p>为实现以下目标：</p>
<ol>
<li>具有路由器翻墙的住处网络环境下自动关闭手机 Shadowsocks 和移动数据；</li>
<li>其它网络环境下都开启 Shadowsocks 手机翻墙；</li>
<li>任何 Wi-Fi 环境下关闭移动数据以省电；</li>
<li>离开任何 Wi-Fi 自动开启移动数据。</li>
</ol>
<p>为此我建了 4 个 Tasker 配置和任务（当然也可以更简单）：</p>
<ol>
<li>连接住处的 OpenWRT Wi-Fi（根据 Tasker 的 SSID 条件区分） <br />
关闭 Shadowsocks 和移动数据；</li>
<li>连接其它 Wi-Fi <br />
关闭移动数据；</li>
<li>离开任何 Wi-Fi <br />
开启移动数据；</li>
<li>离开住处 Wi-Fi <br />
开启 Shadowsocks。</li>
</ol>
<p>现在 Android 版本 Shadowsocks App 是自带 Tasker 插件支持的（操作类别里选 <strong>插件</strong> -&gt; <strong>影梭</strong> 即可），开启和关闭 Shadowsocks 配置非常简单。</p>
<p>移动数据开关可以分别用下面的命令（Tasker 运行外壳中需要启用 <strong>使用Root</strong> 选项）：</p>
<pre class="brush: bash; title: ; notranslate">
svc data enable
svc data disable
</pre>
<h3 id="控制飞行模式及-nfc">控制飞行模式及 NFC</h3>
<p>为了实现和之前文章里类似的目标：</p>
<ol>
<li>睡觉前刷 NFC 标签开启飞行模式；</li>
<li>打开 NFC（这样起来之后可以刷 NFC 标签）；</li>
<li>起来刷 NFC 标签关闭飞行模式。</li>
</ol>
<p>另外考虑最好只使用一个 NFC 标签就达到效果，这里我只建了一个 Tasker 任务包含 4 个操作：</p>
<ol>
<li>Tasker 操作类别中选 <strong>变量</strong> -&gt; <strong>变量设置</strong>，<code>%TMPAIR</code> 发往 <code>%AIR</code> <br />
先保存 <code>%AIR</code> 这个 Tasker 自带的飞行模式变量；</li>
<li>如果 <code>%AIR = off</code> 则运行外壳开启飞行模式；</li>
<li>如果 <code>%AIR = on</code> 则运行外壳开启 NFC；</li>
<li>如果 <code>%TMPAIR = on</code> 则运行外壳关闭飞行模式。</li>
</ol>
<h4 id="开启关闭飞行模式">开启关闭飞行模式</h4>
<p>开启和关闭飞行模式可以直接使用下面的两条命令：</p>
<pre class="brush: bash; title: ; notranslate">
settings put global airplane_mode_on 1; am broadcast -a android.intent.action.AIRPLANE_MODE --ez state true
settings put global airplane_mode_on 0; am broadcast -a android.intent.action.AIRPLANE_MODE --ez state false
</pre>
<h4 id="开启关闭-nfc">开启关闭 NFC</h4>
<p>开启和关闭 NFC 功能则相对复杂一些，需要区分 Android 系统版本：</p>
<ul>
<li>Android 4.4 以上：</li>
</ul>
<pre class="brush: bash; title: ; notranslate">
# Disable NFC
service call nfc 5
# Enable NFC
service call nfc 6
</pre>
<ul>
<li>Android 4.0.1 - Android 4.3.1：</li>
</ul>
<pre class="brush: bash; title: ; notranslate">
# Disable NFC
service call nfc 4
# Enable NFC
service call nfc 5
</pre>
<ul>
<li>Android 2.3.4 - Android 2.3.7：</li>
</ul>
<pre class="brush: bash; title: ; notranslate">
# Disable NFC
service call nfc 18
# Enable NFC
service call nfc 19
</pre>
<ul>
<li>Android 2.3.3：</li>
</ul>
<pre class="brush: bash; title: ; notranslate">
# Disable NFC
service call nfc 20
# Enable NFC
service call nfc 21
</pre>
<ul>
<li>Android 2.3.2：</li>
</ul>
<pre class="brush: bash; title: ; notranslate">
# Disable NFC
service call nfc 13
# Enable NFC
service call nfc 14
</pre>
<p>我在运行 Android 6.0 系统的 Zenfone2 手机上可以正常使用第一段的两条命令控制系统 NFC 功能。</p>
<h3 id="gps-开关-开启关闭百度地图">GPS 开关 + 开启关闭百度地图</h3>
<p>需求还是和之前的文章相同：</p>
<ol>
<li>刷 NFC 标签自动开启 GPS 和百度地图进行导航：</li>
<li>导航完成后再刷一次 NFC 标签自动关闭百度地图并关闭 GPS。</li>
</ol>
<p>为此我还是只建立一个 Tasker 任务，包含多个操作：</p>
<ol>
<li>Tasker 操作类别中选 <strong>变量</strong> -&gt; <strong>变量设置</strong>，<code>%TMPGPS</code> 发往 <code>%GPS</code> <br />
先保存 <code>%GPS</code> 这个 Tasker 自带的 GPS 设置变量；</li>
<li>如果 <code>%GPS = off</code> 则启动应用 -&gt; 百度地图；</li>
<li>如果 <code>%GPS = off</code> 则运行外壳开启 GPS；</li>
<li>如果 <code>%TMPGPS != on</code> 则停止运行任务（操作类别中选 <strong>任务</strong> -&gt; <strong>停止</strong>）忽略后续操作；</li>
<li>按钮 -&gt; 后退（操作类别中选 <strong>输入</strong> -&gt; <strong>按钮</strong>），此操作需要添加多个以模拟持续按返回键退出百度地图；</li>
<li>杀死应用 -&gt; 百度地图；</li>
<li>运行外壳关闭 GPS。</li>
</ol>
<p>通过 Shell 命令开启关闭 GPS 也稍微有点特殊，需要使用下面两条命令：</p>
<pre class="brush: bash; title: ; notranslate">
settings put secure location_providers_allowed +gps
settings put secure location_providers_allowed -gps
</pre>
<h2 id="后记">后记</h2>
<p>为了方便查询，我把一些可能经常用到的 Android Shell 控制命令也整理保存到我的 Wiki 知识库中了，读者可以点击 Wiki 链接 <a href="https://wiki.zohead.com/%E6%8A%80%E6%9C%AF/Android/Android%20Shell%E6%8E%A7%E5%88%B6%E6%89%8B%E6%9C%BA.md" target="_blank">Android Shell 控制手机</a> 查看。后续有其它 Shell 命令需要加进来或者修改时，我也会尽量及时更新该文档的，最后祝大家玩的开心。</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/tasker-shell/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>为Zenfone 2开启NFC SIM卡刷公交支持</title>
		<link>https://zohead.com/archives/zenfone2-nfc-sim/</link>
		<comments>https://zohead.com/archives/zenfone2-nfc-sim/#comments</comments>
		<pubDate>Wed, 06 Jul 2016 17:34:35 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[手机]]></category>
		<category><![CDATA[生活]]></category>
		<category><![CDATA[NFC]]></category>
		<category><![CDATA[SE]]></category>
		<category><![CDATA[SIM]]></category>
		<category><![CDATA[SWP]]></category>
		<category><![CDATA[Zenfone 2]]></category>
		<category><![CDATA[公交卡]]></category>
		<category><![CDATA[华硕]]></category>
		<category><![CDATA[支付]]></category>

		<guid isPermaLink="false">https://zohead.com/?p=1246</guid>
		<description><![CDATA[我在 4 月份买的华硕 Zenfone 2 ZE551ML 手机已经上手使用一段时间了，当初也看中这款 Zenfone 2 ZE551ML 手机是支持 NFC 功能的，测试使用 NFC 标签配合 Trigger+Tasker 触发任务或者 Smart Lock 智能解锁都是比较好用的。同样我还试过开启招商银行的「掌上生活」App 中的「一闪通」功能（其实就是银联云闪付）进行 NFC 刷手机支付。 不过在使用中国联通的 NFC SIM 卡进行刷公交或者地铁时发现存在问题，根本无法使用，鉴于网上也有不少别的用户碰到这种问题（比较坑的是有人已经给 NFC SIM 卡充完值才发现刷公交或地铁没反应）， [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>我在 4 月份买的<a href="https://zohead.com/archives/zenfone2/">华硕 Zenfone 2 ZE551ML 手机</a>已经上手使用一段时间了，当初也看中这款 Zenfone 2 ZE551ML 手机是支持 NFC 功能的，测试使用 NFC 标签配合 <a href="https://zohead.com/archives/tasker-nfc/">Trigger+Tasker 触发任务</a>或者 Smart Lock 智能解锁都是比较好用的。同样我还试过开启招商银行的「掌上生活」App 中的「一闪通」功能（其实就是银联云闪付）进行 NFC 刷手机支付。</p>
<p>不过在使用中国联通的 NFC SIM 卡进行刷公交或者地铁时发现存在问题，根本无法使用，鉴于网上也有不少别的用户碰到这种问题（比较坑的是有人已经给 NFC SIM 卡充完值才发现刷公交或地铁没反应），这里我把解决的方法写出来供大家参考。</p>
<h2 id="nfc-问题说明">NFC 问题说明</h2>
<p>首先说下开启联通 NFC SIM 卡刷公交功能的流程：</p>
<ol>
<li>首先确认所在城市以及你使用的移动运营商支持 NFC SIM 卡刷公交，这个到网上都可以找到相应的介绍，我所用的南京联通是和智汇市民卡合作支持手机 SIM 卡刷公交的；</li>
<li>在中国联通沃支付网站上确认你所使用的手机是否在其「手机钱包」业务的兼容机型列表中： <br />
<a href="https://epay.10010.com/wop/wallet">https://epay.10010.com/wop/wallet</a></li>
<li>去营业厅将手机 SIM 卡更换为 NFC SWP SIM 卡，联通的话必须去其自有营业厅办理，社会营业厅无法办理，换 NFC SWP SIM 卡一般是免费的；</li>
<li>接着需要在自有营业厅开通手机钱包业务；</li>
<li>下载中国联通<a href="https://epay.10010.com/">沃钱包</a> App，可以在「沃钱包」App 中注册联通沃支付账户；</li>
<li>在「沃钱包」App 中安装「手机钱包」卡包功能插件；</li>
<li>确认「卡包」中能找到手机公交卡就可以在公交地铁充值网点进行充值及手机刷公交和地铁了。</li>
</ol>
<p>刚好我使用的 Zenfone 2 手机是在联通手机钱包业务兼容机型列表中，Android 系统版本是 <code>5.0.2</code>，打开「沃钱包」App（版本：<code>3.5.0</code>）也能正常安装「手机钱包」卡包功能插件（版本：<code>1.4.0</code>）：</p>
<div style="width: 370px" class="wp-caption alignnone"><img alt="沃钱包 App" src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442970/wo-wallet.jpg" width="360" height="640" /><p class="wp-caption-text">沃钱包 App</p></div>
<p>进入「卡包」功能还能认到手机 NFC SIM 卡的公交卡：</p>
<div style="width: 370px" class="wp-caption alignnone"><img alt="NFC SIM 公交卡" src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442861/nfc-sim-bus-card.jpg" width="360" height="640" /><p class="wp-caption-text">NFC SIM 公交卡</p></div>
<p>不过悲剧的就是拿着手机到任何一个公交或者地铁充值点都不能识别到卡信息，充值机或者公交刷卡机、地铁闸机都没有任何反应，当然也没有办法充值或者刷卡了。</p>
<h2 id="问题分析">问题分析</h2>
<p>Android 手机上的 NFC 支付功能是使用 NFC 的卡模拟工作方式，出于对 NFC 通信安全的考虑，如果需要使用 NFC 卡模拟，除了手机自带的 NFC 控制器外，还需要 SE（Secure Element）元件即安全元件，它的作用是用来存储用户的敏感信息，例如银行卡卡号、密码之类的，其一般采用硬件加密方式。</p>
<p>目前 Android 上常见的 NFC 卡模拟 SE 方案有：</p>
<ul>
<li>SE 元件内置在手机中；</li>
<li>SE 元件内置在 SIM 卡中；</li>
<li>SE 元件内置在专用 SD 卡中；</li>
<li>Google 推出的 HCE 技术，即 Host-based card emulation。</li>
</ul>
<p>前 3 种由于需要特定手机或者 SIM 卡、SD 卡等硬件支持，因此 Google 搞了基于主机的卡模拟模式，如果使用这种方案系统可以将一个 App 或者一个云端作为一个虚拟 SE 来实现 NFC 支付，这样可以摆脱对硬件的依赖。Android 5.0 或者 6.0 之后 Google 也默认使用 HCE 方式的主机卡模拟方案。</p>
<p>像本文开头说的招商银行一闪通就是使用的第一种手机内置 SE 方案，而今天我们所要使用的 NFC SIM 卡当然就是用的第二种 SIM SWP 方案，也是广大移动运营商们主推的方案，经过搜索我发现华硕 Zenfone 2 采用的 Broadcom BCM20795 NFC 芯片是支持 SIM SWP 方案的，联通手机钱包业务也说明 Zenfone 2 已经通过 NFC 支付测试。</p>
<p>另外我还发现一个有趣的现象就是虽然 Zenfone 2 手机开机点亮屏幕的状态下刷公交或者地铁没有任何反应，但如果我重启手机并在刚刚显示启动 Logo 的时候刷公交却是有反应的（只是没有充值提示余额不足），这就说明手机刚开机的时候 NFC SIM SWP 是能正常工作的，启动完成进入系统之后反而不行了。</p>
<p>后来我还看到有网友在华硕官方论坛上反映了这个问题，并建议华硕在手机设置中增加类似于一加手机中的 NFC 支付使用手机内置 SE 还是 SIM 卡 SE 的选项，不过华硕并没有对此进行更新处理，因此我认为 Zenfone 2 硬件是支持 NFC SIM SWP 支付的，只是由于系统 ROM 原因不能正常使用，应该可以通过其它方法开启。</p>
<h2 id="修改配置支持刷-sim-卡">修改配置支持刷 SIM 卡</h2>
<p>经过一番搜索之后我发现网上有 Nexus 6 用户也碰到类似的问题：</p>
<p>*<a href="https://paoyuan.org/2015/11/14/nexus-6-android-marshmallow-nfc-swp-sim-support" target="_blank">NEXUS 6 ANDROID MARSHMALLOW NFC SWP-SIM 支援</a></p>
<p>可以通过修改 Android 系统的 Broadcom NFC 配置文件来开启手机的 SIM SWP 支持，我的 Zenfone 2 手机 NFC 配置和上面的 Nexus 6 配置有一些差别，经过多次修改测试发现现在也可以使 NFC SIM SWP 功能正常工作了。</p>
<p>NFC 配置文件的修改都需要先开启手机的 root 权限哦，首先修改 <code>/system/etc/libnfc-brcm.conf</code> 配置文件增加以下内容：</p>
<pre class="brush: diff; title: /system/etc/libnfc-brcm.conf; notranslate">
+NFA_MAX_EE_SUPPORTED=3
+ACTIVE_SE=0xF3
+DEFAULT_ISODEP_ROUTE=0xF3
+NFA_HCI_STATIC_PIPE_ID_F3=0x70
+NFA_HCI_STATIC_PIPE_ID_F4=0x71
+UICC_LISTEN_TECH_MASK=0x0
</pre>
<blockquote>
<p><strong>注意</strong></p>
<p>注意上面显示的是 patch 文件格式，<code>-</code> 号开头的为需要删除的内容，<code>+</code> 号开头的为需要增加的内容，实际修改时请删除开头的 <code>-</code> 号或 <code>+</code> 号。</p>
</blockquote>
<p>上面的 <code>NFA_MAX_EE_SUPPORTED</code> 值为 3 表示开启多种 NFC SE 元件支持，<code>ACTIVE_SE</code> 和 <code>DEFAULT_ISODEP_ROUTE</code> 都设为 0xF3 表示默认使用 SIM SWP SE 元件，剩下的 3 个参数不一定需要设置。</p>
<p>接着修改 <code>/system/etc/libnfc-brcm-20795a20.conf</code> 配置文件：</p>
<pre class="brush: diff; title: /system/etc/libnfc-brcm-20795a20.conf; notranslate">
 ###############################################################################
 # Pre-Discovery Startup Configuration (256 bytes maximum)
-NFA_DM_PRE_DISCOVERY_CFG={0A:C2:08:02:00:C3:04:40:4B:4C:00}
+NFA_DM_PRE_DISCOVERY_CFG={0A:C2:08:01:00:C3:04:40:4B:4C:00}
</pre>
<p>上面的这两个配置文件修改完成之后重启手机，到公交或者地铁充值点去充值刷卡应该就有反应了哦，不过需要注意默认还是只有手机点亮的情况刷卡才有反应。</p>
<h2 id="后记">后记</h2>
<p>NFC SIM 卡的公交卡余额充值功能在各地似乎不太一样，上海之类城市是支持直接在联通的「沃钱包」App 中进行充值的，而我这边「沃钱包」的卡包列表中虽然能看到南京 NFC SIM 卡的智汇卡，但并不能正确显示卡中的余额，也没法直接通过手机 App 进行充值。</p>
<p>总体来说联通的「沃钱包」App 的使用体验还是挺符合其企业形象的，一贯的很难用而且不稳定，像下面这种 App 中找不到 NFC SIM 卡包的报错还是经常会碰到：</p>
<div style="width: 370px" class="wp-caption alignnone"><img alt="沃钱包找不到 NFC SIM 卡包" src="http://res.cloudinary.com/digwht2y0/image/upload/v1737442972/wo-wallet-error.jpg" width="360" height="640" /><p class="wp-caption-text">沃钱包找不到 NFC SIM 卡包</p></div>
<p>当然最后还是要说一下本文只是在南京公交地铁以及联通 NFC SIM 卡环境下使用测试的，如果你使用的环境不同并不能保证就一定能把 NFC SIM 支付用起来哦，祝玩的开心～～～。</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/zenfone2-nfc-sim/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Android使用Trigger+Tasker设定NFC标签</title>
		<link>https://zohead.com/archives/tasker-nfc/</link>
		<comments>https://zohead.com/archives/tasker-nfc/#comments</comments>
		<pubDate>Tue, 03 Nov 2015 18:14:53 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[Android]]></category>
		<category><![CDATA[手机]]></category>
		<category><![CDATA[GPS]]></category>
		<category><![CDATA[NFC]]></category>
		<category><![CDATA[Secure Settings]]></category>
		<category><![CDATA[Sleep as Android]]></category>
		<category><![CDATA[Tasker]]></category>
		<category><![CDATA[Trigger]]></category>
		<category><![CDATA[飞行模式]]></category>

		<guid isPermaLink="false">http://zohead.com/?p=1065</guid>
		<description><![CDATA[现在用的华硕 New PadFone Infinity A86 手机一直都是支持 NFC 功能的，只是之前一直没怎么用过，基本只有在查询公交卡余额的时候才用一下（这里顺便安利一下南京市政府组织开发的 “我的南京” App，可以通过手机 NFC 查询公交卡余额），最近将手机 ROM 升级到 Android 5.0 之后终于觉得 5.0 自带的 Smart Lock 功能会比较适合我了，可以使用蓝牙、NFC 标签等实现手机智能解锁功能。 升级 Android 5.0 另外一个方便的地方就是我的 Chromebook 也支持 Smart Lock 功能，两边都开启之后如果 Android 5.0 以 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>现在用的华硕 New PadFone Infinity A86 手机一直都是支持 NFC 功能的，只是之前一直没怎么用过，基本只有在查询公交卡余额的时候才用一下（这里顺便安利一下南京市政府组织开发的 “我的南京” App，可以通过手机 NFC 查询公交卡余额），最近将手机 ROM 升级到 Android 5.0 之后终于觉得 5.0 自带的 Smart Lock 功能会比较适合我了，可以使用蓝牙、NFC 标签等实现手机智能解锁功能。</p>
<p>升级 Android 5.0 另外一个方便的地方就是我的 Chromebook 也支持 Smart Lock 功能，两边都开启之后如果 Android 5.0 以上的手机在 Chromebook 旁边并且已经解锁，那 Chromebook 也可以自动解锁无需再输入密码登录。</p>
<p>经过一些研究之后，还是买了一些 NFC 标签，准备用之前就捣鼓过的 <a href="https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm" target="_blank">Tasker</a> App（收费 2.99 美元）实现 NFC 标签的各种触发操作，不过这还需要配合使用 <a href="https://play.google.com/store/apps/details?id=com.jwsoft.nfcactionlauncher" target="_blank">Trigger</a> App（基本功能免费，增强功能通过应用内购买），因为 Tasker 没有直接支持 NFC 触发条件，Trigger 倒是有在检测到 NFC 标签之后执行 Tasker 任务的功能，需要特别注意的是 Trigger 必须在安装好 Tasker 之后安装。</p>
<p>Trigger 的 NFC 标签功能具体如何操作也比较简单这里就不介绍了，只需要在执行的动作里勾选 “Tasker” - “Tasker任务” 并选择实际需要执行的 Tasker 任务即可，这里我以两个实际例子说明 Tasker 如何实现稍微复杂一些的任务。</p>
<p><strong>1、一个 NFC 标签实现自动开启停止睡眠追踪：</strong></p>
<p><span style="color: #000080;"><em>需求：</em></span></p>
<p>平时我会使用 <a href="https://play.google.com/store/apps/details?id=com.urbandroid.sleep" target="_blank">Sleep as Android</a> 软件（免费试用 14 天）监控睡眠状况，其功能非常完善而且实际使用起来也很方便（虽然可能不会非常准确 ～～ 哈哈），只是这个 App 是一直在前台运行的比较耗电，而且每天晚上睡觉之前就需要手工开启，早上醒来之后再手工停止，因此就想到在床头贴上一个 NFC 标签实现睡觉之前刷一下自动启动睡眠追踪并开启飞行模式以省电，早上起来之后再刷一下这个 NFC 标签可以停止睡眠追踪并自动关闭飞行模式。</p>
<p><span style="color: #000080;"><em>问题：</em></span></p>
<p>幸好 Sleep as Android 是自带 Tasker 插件，可以在添加任务时选择插件，并指定 “睡眠追踪”，之后就能配置具体执行哪种操作（启动或者停止睡眠追踪之类的）；</p>
<p>另外飞行模式的切换在新的 Android 系统中已经不能直接修改了，这时需要祭出大杀器 <a href="https://play.google.com/store/apps/details?id=com.intangibleobject.securesettings.plugin" target="_blank">Secure Settings</a> App 了，安装之后也会自动增加一个 Secure Settings Tasker 插件，不过后面的操作要求手机必须 root，root 之后启用 Secure Settings 的 System+ Module，这样将 GPS、飞行模式之类的控制功能安装到系统分区就能控制飞行模式之类的切换了。</p>
<p><span style="color: #000080;"><em>Tasker 任务配置：</em></span></p>
<ul>
<li>睡眠追踪 Tasker 插件 - 开始 睡眠追踪，并设置条件：<strong>%AIR = off</strong>；</li>
<li>Secure Settings Tasker 插件 - Airplane Mode Enabled，并设置条件：<strong>%AIR = off</strong>；</li>
<li>睡眠追踪 Tasker 插件 - 停止 睡眠追踪，并设置条件：<strong>%AIR = on</strong>；</li>
<li>Secure Settings Tasker 插件 - Airplane Mode Disabled，并设置条件：<strong>%AIR = on</strong>；</li>
<li>等待 - 3 秒；</li>
<li>Secure Settings Tasker 插件 - NFC Enabled，并设置条件：<strong>%AIR = on</strong>。</li>
</ul>
<p>上面的 5 个步骤顺序不能搞错，而且对应的条件也很重要。</p>
<p><span style="color: #000080;"><em>机制解释：</em></span></p>
<p>第 1 个任务先判断如果当前手机飞行模式（Tasker 中以 %AIR 变量表示）是关闭的，则认为要开始睡眠追踪，接着第 2 个任务在同样的条件下就通过 Secure Settings 启用飞行模式，第 3 个任务则是发现如果飞行模式已启用则认为已经是在睡眠追踪状态，这时就需要停止追踪，第 4 个任务类似跟着就是关闭飞行模式；</p>
<p>第 5 个和第 6 个任务稍微特殊一点，因为我们在启用飞行模式之后 NFC 功能也同样会被禁用的，这样就没法在早上醒来时刷 NFC 标签了，这样就需要在前面几步都做好之后先等待几秒钟，然后判断如果飞行模式已开启则通过 Secure Settings 自动再将 NFC 功能也开启，而且这两个任务不能直接在第 2 个任务（开启飞行模式）之后就执行，因为开启飞行模式之后 %AIR 得到的飞行模式状态不是马上就能更新过来。</p>
<p><strong>2、一个 NFC 标签实现自动开启关闭百度地图：</strong></p>
<p><span style="color: #000080;"><em>需求：</em></span></p>
<p>这个需求就比较常见了，在我的 SUV 汽车仪表盘附近贴一个百度地图导航专用 NFC 标签，实现刷一下自动开启 GPS 并启动百度地图导航，等导航结束了再刷一下就自动退出百度地图并关闭 GPS。</p>
<p><em><span style="color: #000080;">问题：</span></em></p>
<p>开启关闭 GPS 的问题和飞行模式类似，还是通过 Secure Settings 插件来实现，Tasker 直接支持启动其它 App 的操作，也支持杀死其它 App。</p>
<p><span style="color: #000080;"><em>Tasker 任务配置：</em></span></p>
<ul>
<li>Secure Settings Tasker 插件 - GPS Enabled，并设置条件：<strong>%GPS = off</strong>；</li>
<li>启动应用 - 百度地图，并设置条件：<strong>%GPS = off</strong>；</li>
<li>按钮 - 后退（此任务重复添加 5 次或以上），并设置同样的条件：<strong>%GPS = on</strong>；</li>
<li>杀死应用 - 百度地图，并设置条件：<strong>%GPS = on</strong>；</li>
<li>Secure Settings Tasker 插件 - GPS Disabled，并设置条件：<strong>%GPS = on</strong>。</li>
</ul>
<p><span style="color: #000080;"><em>机制解释：</em></span></p>
<p>具体机制还是和上面比较类似的，使用 Tasker 内置的 %GPS 变量根据当前 GPS 状态执行对应的任务操作，值得一提的是第 3 个任务这里为了优雅一点我先用发送多次返回按键的方式模拟退出百度地图的操作，当然对于百度全家桶系的手机 App 我是很乐意直接杀死禁止后台服务和唤醒之类的，因此倒数第二步我还是加上了杀掉百度地图的任务 ^_^，最后再关闭 GPS。</p>
<p>有一点需要说明的是由于 Tasker 没有直接判断某个 App 是否在前台运行的方法（虽然可以另外安装 <a href="https://play.google.com/store/apps/details?id=org.kc.tasker.processes" target="_blank">Tasker Process Running</a> 这类插件判断某个 App 是否在运行，但其不好区分前台后台，百度地图这种在后台运行的情况不好处理），因此这两个例子里我都是直接用 Tasker 自带的飞行模式或 GPS 当前状态判断要执行什么操作的。</p>
<p>总之使用 Tasker 配合 NFC 标签并安装需要的插件还是能实现各种特殊的功能滴，本文中使用的所有 App 的链接都是 Google Play 官方地址，国内用户可以自行访问国内各种手机市场下载安装，祝玩的开心～～～</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/tasker-nfc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
