{"id":7476,"date":"2026-07-23T16:40:34","date_gmt":"2026-07-23T08:40:34","guid":{"rendered":"https:\/\/i007.cc\/wordpress\/?p=7476"},"modified":"2026-07-23T19:07:11","modified_gmt":"2026-07-23T11:07:11","slug":"bose-soundtouch-30-ii-%e8%bf%81%e7%a7%bb%e8%87%b3-aftertouch-%e5%ae%8c%e6%95%b4%e6%8c%87%e5%8d%97","status":"publish","type":"post","link":"https:\/\/i007.cc\/wordpress\/archives\/7476","title":{"rendered":"Bose SoundTouch 30 II \u8fc1\u79fb\u81f3 AfterTouch \u5b8c\u6574\u6307\u5357"},"content":{"rendered":"<h2 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u73af\u5883\u4fe1\u606f<\/span><\/h2>\n<figure class=\"md-table-fig table-figure\">\n<table class=\"md-table\">\n<thead>\n<tr class=\"md-end-block\">\n<th><span class=\"td-span\"><span class=\"md-plain\">\u9879\u76ee<\/span><\/span><\/th>\n<th><span class=\"td-span\"><span class=\"md-plain\">\u8bf4\u660e<\/span><\/span><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr class=\"md-end-block\">\n<td><span class=\"td-span\"><span class=\"md-plain\">\u97f3\u7bb1\u578b\u53f7<\/span><\/span><\/td>\n<td><span class=\"td-span\"><span class=\"md-plain\">Bose SoundTouch 30 Series II<\/span><\/span><\/td>\n<\/tr>\n<tr class=\"md-end-block\">\n<td><span class=\"td-span\"><span class=\"md-plain\">\u97f3\u7bb1\u56fa\u4ef6<\/span><\/span><\/td>\n<td><span class=\"td-span\"><span class=\"md-plain\">27.0.6\uff08\u4ece 7.2.21 \u5347\u7ea7\uff09<\/span><\/span><\/td>\n<\/tr>\n<tr class=\"md-end-block\">\n<td><span class=\"td-span\"><span class=\"md-plain\">\u97f3\u7bb1 IP<\/span><\/span><\/td>\n<td><span class=\"td-span\"><span class=\"md-plain\">10.0.0.249<\/span><\/span><\/td>\n<\/tr>\n<tr class=\"md-end-block\">\n<td><span class=\"td-span\"><span class=\"md-plain\">AfterTouch \u670d\u52a1\u5668<\/span><\/span><\/td>\n<td><span class=\"td-span\"><span class=\"md-plain\">Debian 12\uff0cIP: 10.0.0.6<\/span><\/span><\/td>\n<\/tr>\n<tr class=\"md-end-block\">\n<td><span class=\"td-span\"><span class=\"md-plain\">\u4e3b\u8def\u7531<\/span><\/span><\/td>\n<td><span class=\"td-span\"><span class=\"md-plain\">MikroTik RouterOS\uff0cIP: 10.0.0.1<\/span><\/span><\/td>\n<\/tr>\n<tr class=\"md-end-block\">\n<td><span class=\"td-span\"><span class=\"md-plain\">\u65c1\u8def\u7531<\/span><\/span><\/td>\n<td><span class=\"td-span\"><span class=\"md-plain\">iStoreOS\uff08v2rayA\uff09\uff0cIP: 10.0.0.251<\/span><\/span><\/td>\n<\/tr>\n<tr class=\"md-end-block\">\n<td><span class=\"td-span\"><span class=\"md-plain\">\u65e0\u7ebf AP<\/span><\/span><\/td>\n<td><span class=\"td-span\"><span class=\"md-plain\">Netgear Orbi\uff0cIP: 10.0.0.200\uff08WAN\uff09\uff0c192.168.88.1\uff08LAN\uff09<\/span><\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<div class=\"md-hr md-end-block\" tabindex=\"-1\">\n<hr \/>\n<\/div>\n<h2 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u524d\u7f6e\u6761\u4ef6<\/span><\/h2>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u5347\u7ea7\u97f3\u7bb1\u56fa\u4ef6<\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u97f3\u7bb1\u51fa\u5382\u56fa\u4ef6\u4e3a 7.2.21\uff082014\u5e74\uff09\uff0c\u8be5\u7248\u672c\u592a\u8001\uff0c\u65e0\u6cd5\u901a\u8fc7\u7f51\u9875\u754c\u9762\u6216 AfterTouch \u542f\u7528 SSH\u3002\u9700\u8981\u5148\u901a\u8fc7 USB \u65b9\u5f0f\u5347\u7ea7\u5230 27.x\u3002<\/span><\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-pair-s \"><strong><span class=\"md-plain\">USB \u5347\u7ea7\u6b65\u9aa4\uff1a<\/span><\/strong><\/span><\/p>\n<ol class=\"ol-list\" start=\"\">\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p md-focus\"><span class=\"md-plain\">\u5728 <\/span><span class=\"md-meta-i-c md-link\"><a href=\"https:\/\/archive.org\/details\/bose-soundtouch-software-and-firmware\"><span class=\"md-plain\">archive.org<\/span><\/a><\/span><span class=\"md-plain\"> \u4e0b\u8f7d\u56fa\u4ef6\uff0c\u9009\u62e9 <\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>Firmware\/Non-Bluetooth\/<\/code><\/span><span class=\"md-plain\"> \u76ee\u5f55\u4e0b\u7684\u6700\u65b0\u7248\u672c\uff0827.x\uff09<\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5c06 <\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>Update.stu<\/code><\/span><span class=\"md-plain\"> \u6587\u4ef6\u590d\u5236\u5230 FAT32 \u683c\u5f0f\u7684 U \u76d8\u6839\u76ee\u5f55<\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u97f3\u7bb1\u65ad\u7535\uff0c\u540c\u65f6\u6309\u4f4f\u9876\u90e8 <\/span><span class=\"md-pair-s \"><strong><span class=\"md-plain\">4 \u952e + Volume-<\/span><\/strong><\/span><span class=\"md-plain\">\uff0c\u63d2\u7535<\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u7b49\u5f85\u97f3\u7bb1\u5b8c\u6210\u66f4\u65b0\u5e76\u91cd\u542f<\/span><\/p>\n<\/li>\n<\/ol>\n<h3>\u547d\u4ee4\u884c\u5347\u7ea7\uff1a<\/h3>\n<p><strong>\u00a0\uff01\uff017.2\u56fa\u4ef6\u592a\u8fc7\u9648\u65e7\uff0c\u7f51\u9875\u7aef\u603b\u662f\u5347\u7ea7\u5931\u8d25\uff0c\u6211\u7528\u7684\u662fcurl\u547d\u4ee4\u884c\u628a\u56fa\u4ef6\u4f20\u5230\u97f3\u7bb1\u5347\u7ea7\u6210\u529f\u7684\uff0c\u5347\u7ea7\u56fa\u4ef6\u4e4b\u540e\u6700\u597d\u6062\u590d\u51fa\u5382\u8bbe\u7f6e\u4e00\u4e0b\uff0c\u6211\u5c31\u662f\u56e0\u4e3a\u6ca1\u6709\u6062\u590d\u51fa\u5382\u8bbe\u7f6e\u800c\u51fa\u73b0\u4e00\u4e9b\u95ee\u9898\u7684\u3002<\/strong><\/p>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u542f\u7528\u97f3\u7bb1 SSH<\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u56fa\u4ef6\u5347\u7ea7\u5230 27.x \u540e\uff0c\u901a\u8fc7 AfterTouch CLI \u542f\u7528 SSH\uff1a<\/span><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\"># \u5b89\u88c5 soundtouch-cli\r\ngo install github.com\/gesellix\/bose-soundtouch\/cmd\/soundtouch-cli@latest\r\n\r\n# \u542f\u7528 SSH\uff08\u901a\u8fc7 17000 \u7aef\u53e3\uff09\r\nSOUNDTOUCH_HOST=&lt;\u97f3\u7bb1IP&gt; soundtouch-cli setup enable-ssh<\/pre>\n<p>&nbsp;<\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u6210\u529f\u540e\u53ef\u65e0\u5bc6\u7801 SSH \u767b\u5f55\uff1a<\/span><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">ssh -o HostKeyAlgorithms=+ssh-rsa,ssh-dss root@&lt;\u97f3\u7bb1IP&gt;<\/pre>\n<div class=\"md-hr md-end-block\" tabindex=\"-1\"><\/div>\n<div tabindex=\"-1\"><\/div>\n<div tabindex=\"-1\">\u8003\u8651\u5230\u97f3\u7bb1\u7684WIFI\u662f2.4G\uff0c\u4e3a\u4e86Airplay\u8fde\u63a5\u66f4\u7a33\u5b9a\uff0c\u6211\u4f7f\u7528\u7684\u662f\u6709\u7ebf\u4ee5\u592a\u7f51\u8fde\u63a5\u97f3\u7bb1\uff0c\u8fde\u63a5\u4e4b\u540e\u5728ROS\u4e2d\u56fa\u5b9aIP\u5730\u5740\uff1a<\/div>\n<div tabindex=\"-1\">\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u5728 RouterOS \u91cc\u901a\u8fc7 DHCP \u9759\u6001\u79df\u7ea6\u7ed1\u5b9a IP \u548c MAC\u3002\u5728 RouterOS \u7ec8\u7aef\u6267\u884c\uff1a<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"Code\">\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\/ip dhcp-server lease print<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u627e\u5230\u97f3\u7bb1\u7684\u79df\u7ea6\u540e\uff1a<\/p>\n<div class=\"relative group\/copy bg-bg-000\/50 border-0.5 border-border-400 rounded-lg focus:outline-none focus-visible:ring-2 focus-visible:ring-accent-100\" tabindex=\"0\" role=\"group\" aria-label=\"Code\">\n<div class=\"overflow-x-auto\">\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\/ip dhcp-server lease make-static [find mac-address=08:DF:1F:0C:B0:D2]\r\n\/ip dhcp-server lease set [find mac-address=08:DF:1F:0C:B0:D2] address=10.0.0.249<\/pre>\n<p>&nbsp;<\/p>\n<\/div>\n<\/div>\n<p class=\"font-claude-response-body break-words whitespace-normal\" dir=\"ltr\">\u6216\u8005\u5728 Winbox \u91cc\uff1a<strong>IP \u2192 DHCP Server \u2192 Leases<\/strong>\uff0c\u627e\u5230\u97f3\u7bb1\u7684 MAC\uff0c\u53f3\u952e <strong>Make Static<\/strong>\uff0c\u7136\u540e\u4fee\u6539 IP \u4e3a <code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">10.0.0.249<\/code>\u3002<\/p>\n<\/div>\n<div class=\"md-hr md-end-block\" tabindex=\"-1\">\n<hr \/>\n<\/div>\n<h2 class=\"md-end-block md-heading\"><span class=\"md-plain\">AfterTouch \u5b89\u88c5\uff08Docker\uff09<\/span><\/h2>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">docker-compose.yml<\/span><\/h3>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">services:\r\n  soundtouch-service:\r\n    image: ghcr.io\/gesellix\/bose-soundtouch:${SOUNDTOUCH_VERSION:-latest}\r\n    container_name: soundtouch-service\r\n    network_mode: host          # Linux \u5fc5\u987b\u5f00\u542f\uff0c\u7528\u4e8e UPnP \u8bbe\u5907\u53d1\u73b0\r\n    environment:\r\n      - PORT=8000\r\n      - HTTPS_PORT=8443\r\n      - DATA_DIR=\/app\/data\r\n      - LOG_PROXY_BODY=false\r\n      - REDACT_PROXY_LOGS=true\r\n      - RECORD_INTERACTIONS=true\r\n      - DISCOVERY_INTERVAL=5m\r\n      - SERVER_URL=http:\/\/${SOUNDTOUCH_HOSTNAME:-soundtouch.local}:8000\r\n      - HTTPS_SERVER_URL=https:\/\/${SOUNDTOUCH_HOSTNAME:-soundtouch.local}:8443\r\n      - HTTPS_PROXY=http:\/\/10.0.0.251:20171    # v2rayA \u4ee3\u7406\uff0c\u7528\u4e8e\u8bbf\u95ee\u88ab\u5899\u57df\u540d\r\n      - https_proxy=http:\/\/10.0.0.251:20171\r\n      - NO_PROXY=localhost,127.0.0.1,10.0.0.0\/8,*.bose.com,aftertouch.lan\r\n      - no_proxy=localhost,127.0.0.1,10.0.0.0\/8,*.bose.com,aftertouch.lan\r\n    volumes:\r\n      - .\/data:\/app\/data\r\n    restart: unless-stopped<\/pre>\n<p><strong>\uff01\uff01\u6ce8\u610f\uff1a\u8fd9\u91cc\u7528\u4e86\u4ee3\u7406\uff0c\u56e0\u4e3abrows\u548csearch\u529f\u80fd\u88ab\u5899\uff0c\u7528\u4ee3\u7406\u8ba9\u8fd9\u4e24\u4e2a\u529f\u80fd\u6062\u590d<\/strong><\/p>\n<p>&nbsp;<\/p>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">.env<\/span><\/h3>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">SOUNDTOUCH_HOSTNAME=aftertouch.lan\r\nSOUNDTOUCH_VERSION=latest\r\nPREFERRED_DEVICES=\"SoundTouch 30@10.0.0.249\"<\/pre>\n<p>&nbsp;<\/p>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u542f\u52a8\u670d\u52a1<\/span><\/h3>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">docker compose up -d\r\ndocker compose logs -f<\/pre>\n<p>&nbsp;<\/p>\n<div class=\"md-hr md-end-block\" tabindex=\"-1\">\n<hr \/>\n<\/div>\n<h2 class=\"md-end-block md-heading\"><span class=\"md-plain\">AfterTouch \u914d\u7f6e<\/span><\/h2>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">Settings \u914d\u7f6e<\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u6253\u5f00 <\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>http:\/\/10.0.0.6:8000\/admin<\/code><\/span><span class=\"md-plain\">\uff0c\u8fdb\u5165 <\/span><span class=\"md-pair-s \"><strong><span class=\"md-plain\">1. Settings<\/span><\/strong><\/span><span class=\"md-plain\">\uff1a<\/span><\/p>\n<ul class=\"ul-list\" data-mark=\"-\">\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-pair-s \"><strong><span class=\"md-plain\">Target Domain<\/span><\/strong><\/span><span class=\"md-plain\">: <\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>http:\/\/aftertouch.lan:8000<\/code><\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-pair-s \"><strong><span class=\"md-plain\">DNS Discovery Server<\/span><\/strong><\/span><span class=\"md-plain\">: \u542f\u7528<\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-pair-s \"><strong><span class=\"md-plain\">DNS Bind Address<\/span><\/strong><\/span><span class=\"md-plain\">: <\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>0.0.0.0:53<\/code><\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-pair-s \"><strong><span class=\"md-plain\">Upstream DNS<\/span><\/strong><\/span><span class=\"md-plain\">: <\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>10.0.0.251:53<\/code><\/span><\/p>\n<\/li>\n<\/ul>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">aftertouch.lan \u57df\u540d\u89e3\u6790<\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5728 iStoreOS \u7684 DHCP\/DNS \u91cc\u6dfb\u52a0\u9759\u6001\u89e3\u6790\uff1a<\/span><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">uci add_list dhcp.@dnsmasq[0].address='\/aftertouch.lan\/10.0.0.6'\r\nuci commit dhcp\r\n\/etc\/init.d\/dnsmasq restart<\/pre>\n<p>&nbsp;<\/p>\n<div class=\"md-hr md-end-block\" tabindex=\"-1\">\n<hr \/>\n<\/div>\n<h2 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u97f3\u7bb1\u8fc1\u79fb<\/span><\/h2>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u901a\u8fc7 AfterTouch \u5411\u5bfc\u8fc1\u79fb<\/span><\/h3>\n<ol class=\"ol-list\" start=\"\">\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u6253\u5f00 <\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>http:\/\/10.0.0.6:8000\/admin<\/code><\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u8fdb\u5165 <\/span><span class=\"md-pair-s \"><strong><span class=\"md-plain\">2. Devices<\/span><\/strong><\/span><span class=\"md-plain\">\uff0c\u70b9 <\/span><span class=\"md-pair-s \"><strong><span class=\"md-plain\">Sync Data<\/span><\/strong><\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u70b9 <\/span><span class=\"md-pair-s \"><strong><span class=\"md-plain\">Migrate<\/span><\/strong><\/span><span class=\"md-plain\">\uff0c\u67e5\u770b\u8fc1\u79fb\u6458\u8981<\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u5728 Plan \u90e8\u5206\u786e\u8ba4 Target service URL \u4e3a <\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>http:\/\/aftertouch.lan:8000<\/code><\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u70b9 <\/span><span class=\"md-pair-s \"><strong><span class=\"md-plain\">Apply Custom Plan<\/span><\/strong><\/span><span class=\"md-plain\">\uff08\u9009\u62e9 XML over SSH\uff09<\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u6309\u63d0\u793a\u91cd\u542f\u97f3\u7bb1<\/span><\/p>\n<\/li>\n<\/ol>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u8fc1\u79fb\u6210\u529f\u540e\u72b6\u6001\u5e94\u4e3a\uff1a<\/span><\/p>\n<ul class=\"ul-list\" data-mark=\"-\">\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u2705 URL Configuration: AfterTouch URLs<\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u2705 DNS Interception: \/etc\/resolv.conf hook active<\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u2705 CA \/ TLS: Local root CA installed<\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u2705 SSH enabled (persistent)<\/span><\/p>\n<\/li>\n<\/ul>\n<div class=\"md-hr md-end-block\" tabindex=\"-1\">\n<hr \/>\n<\/div>\n<h2 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u97f3\u7bb1\u7aef\u914d\u7f6e<\/span><\/h2>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\/etc\/hosts\uff08\u6301\u4e45\u5316\uff0c\u91cd\u542f\u4e0d\u4e22\u5931\uff09<\/span><\/h3>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">SSH \u8fdb\u97f3\u7bb1\u540e\u6dfb\u52a0\u4ee5\u4e0b\u8bb0\u5f55\uff1a<\/span><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">mount -o remount,rw \/\r\ncat &gt;&gt; \/etc\/hosts &lt;&lt; 'EOF'\r\n10.0.0.6 marge.bose.com\r\n10.0.0.6 updates.bose.com\r\n10.0.0.6 bmx.bose.com\r\n10.0.0.6 streaming.bose.com\r\n10.0.0.6 worldwide.bose.com\r\n10.0.0.6 music.api.bose.com\r\n10.0.0.6 stats.bose.com\r\n10.0.0.6 content.api.bose.io\r\n10.0.0.6 bosecm.com\r\n10.0.0.6 events.api.bosecm.com\r\n10.0.0.6 downloads.bose.com\r\n10.0.0.6 streamingoauth.bose.com\r\n10.0.0.6 bose-prod.apigee.net\r\n10.0.0.6 bose-test.apigee.net\r\n10.0.0.6 all.api.radio-browser.info\r\n10.0.0.6 aftertouch.lan\r\nEOF<\/pre>\n<p>&nbsp;<\/p>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">CA \u8bc1\u4e66\u5b89\u88c5<\/span><\/h3>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\"># \u5728 Debian \u4e0a\u4e0b\u8f7d AfterTouch CA \u8bc1\u4e66\r\ncurl -k https:\/\/10.0.0.6:8443\/api\/setup\/ca.crt -o \/tmp\/aftertouch-ca.crt\r\n\r\n# \u4f20\u5230\u97f3\u7bb1\u5e76\u5b89\u88c5\r\ncat \/tmp\/aftertouch-ca.crt | ssh -o HostKeyAlgorithms=+ssh-rsa,ssh-dss root@10.0.0.249 \\\r\n  \"mount -o remount,rw \/ &amp;&amp; cat &gt;&gt; \/etc\/pki\/tls\/certs\/ca-bundle.crt\"<\/pre>\n<p>&nbsp;<\/p>\n<div class=\"md-hr md-end-block\" tabindex=\"-1\">\n<hr \/>\n<\/div>\n<h2 class=\"md-end-block md-heading\"><span class=\"md-plain\">RadioBrowser \u4ee3\u7406\u914d\u7f6e<\/span><\/h2>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">RadioBrowser \u7684\u57df\u540d <\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>all.api.radio-browser.info<\/code><\/span><span class=\"md-plain\"> \u5728\u56fd\u5185\u88ab\u5899\uff0c\u9700\u8981\u901a\u8fc7 nginx \u4ee3\u7406\u8f6c\u53d1\u5230\u53ef\u7528\u8282\u70b9\u3002<\/span><\/p>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u751f\u6210\u81ea\u7b7e\u540d\u8bc1\u4e66<\/span><\/h3>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">sudo mkdir -p \/etc\/nginx\/ssl\r\nsudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \\\r\n  -keyout \/etc\/nginx\/ssl\/radiobrowser.key \\\r\n  -out \/etc\/nginx\/ssl\/radiobrowser.crt \\\r\n  -subj \"\/CN=all.api.radio-browser.info\" \\\r\n  -addext \"subjectAltName=DNS:all.api.radio-browser.info\"<\/pre>\n<p>&nbsp;<\/p>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">nginx \u914d\u7f6e<\/span><\/h3>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">sudo vim \/etc\/nginx\/sites-available\/radiobrowser<\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">server {\r\n    listen 80;\r\n    server_name all.api.radio-browser.info;\r\n\r\n    location \/soundtouch\/ {\r\n        proxy_pass https:\/\/de1.api.radio-browser.info\/soundtouch\/;\r\n        proxy_ssl_server_name on;\r\n        proxy_set_header Host de1.api.radio-browser.info;\r\n        proxy_ssl_verify off;\r\n    }\r\n}\r\n\r\nserver {\r\n    listen 8444 ssl;\r\n    server_name all.api.radio-browser.info;\r\n\r\n    ssl_certificate \/etc\/nginx\/ssl\/radiobrowser.crt;\r\n    ssl_certificate_key \/etc\/nginx\/ssl\/radiobrowser.key;\r\n\r\n    location \/soundtouch\/ {\r\n        proxy_pass https:\/\/de1.api.radio-browser.info\/soundtouch\/;\r\n        proxy_ssl_server_name on;\r\n        proxy_set_header Host de1.api.radio-browser.info;\r\n        proxy_ssl_verify off;\r\n    }\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">sudo ln -s \/etc\/nginx\/sites-available\/radiobrowser \/etc\/nginx\/sites-enabled\/\r\nsudo nginx -t &amp;&amp; sudo systemctl reload nginx<\/pre>\n<p>&nbsp;<\/p>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u628a nginx \u8bc1\u4e66\u5b89\u88c5\u5230\u97f3\u7bb1<\/span><\/h3>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">cat \/etc\/nginx\/ssl\/radiobrowser.crt | ssh -o HostKeyAlgorithms=+ssh-rsa,ssh-dss root@10.0.0.249 \\\r\n  \"mount -o remount,rw \/ &amp;&amp; cat &gt;&gt; \/etc\/pki\/tls\/certs\/ca-bundle.crt\"<\/pre>\n<p>&nbsp;<\/p>\n<h3 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u628a AfterTouch CA \u8bc1\u4e66\u5b89\u88c5\u5230 Debian\uff08\u907f\u514d nginx \u81ea\u8fde\u63a5\u5931\u8d25\uff09<\/span><\/h3>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">curl -k https:\/\/aftertouch.lan:8443\/api\/setup\/ca.crt -o \/tmp\/aftertouch-ca-docker.crt\r\nsudo cp \/tmp\/aftertouch-ca-docker.crt \/usr\/local\/share\/ca-certificates\/aftertouch-ca.crt\r\nsudo update-ca-certificates\r\nsudo systemctl reload nginx<\/pre>\n<p>&nbsp;<\/p>\n<div class=\"md-hr md-end-block\" tabindex=\"-1\">\n<hr \/>\n<\/div>\n<h2 class=\"md-end-block md-heading\"><span class=\"md-plain\">iptables \u89c4\u5219<\/span><\/h2>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u97f3\u7bb1\u7684 443 \u6d41\u91cf\u9700\u8981\u6839\u636e\u76ee\u6807\u5730\u5740\u5206\u522b\u8f6c\u53d1\uff1a<\/span><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\"># all.api.radio-browser.info(10.0.0.6) \u7684 443 \u8f6c\u5230 nginx 8444\r\nsudo iptables -t nat -A PREROUTING -s 10.0.0.249 -d 10.0.0.6 -p tcp --dport 443 -j REDIRECT --to-port 8444\r\n\r\n# \u5176\u4ed6 443 \u6d41\u91cf\uff08Bose \u57df\u540d\uff09\u8f6c\u5230 AfterTouch 8443\r\nsudo iptables -t nat -A PREROUTING -s 10.0.0.249 -p tcp --dport 443 -j REDIRECT --to-port 8443\r\n\r\n# \u6301\u4e45\u5316\u4fdd\u5b58\r\nsudo netfilter-persistent save<\/pre>\n<p>&nbsp;<\/p>\n<div class=\"md-hr md-end-block\" tabindex=\"-1\">\n<hr \/>\n<\/div>\n<h2 class=\"md-end-block md-heading\"><span class=\"md-plain\">v2rayA \u4ee3\u7406\u914d\u7f6e<\/span><\/h2>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">AfterTouch \u8bbf\u95ee RadioBrowser API \u9700\u8981\u4ee3\u7406\u3002\u5728 iStoreOS \u7684 v2rayA \u754c\u9762\uff1a<\/span><\/p>\n<ol class=\"ol-list\" start=\"\">\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-pair-s \"><strong><span class=\"md-plain\">Address and Ports<\/span><\/strong><\/span><span class=\"md-plain\"> \u2192 <\/span><span class=\"md-pair-s \"><strong><span class=\"md-plain\">Port of HTTP<\/span><\/strong><\/span><span class=\"md-plain\">: <\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>20171<\/code><\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u542f\u7528 <\/span><span class=\"md-pair-s \"><strong><span class=\"md-plain\">Port Sharing<\/span><\/strong><\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-pair-s \"><strong><span class=\"md-plain\">Transparent Proxy<\/span><\/strong><\/span><span class=\"md-plain\">: <\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>On: Proxy only GFWList<\/code><\/span><\/p>\n<\/li>\n<li class=\"md-list-item\">\n<p class=\"md-end-block md-p\"><span class=\"md-pair-s \"><strong><span class=\"md-plain\">Save and Apply<\/span><\/strong><\/span><\/p>\n<\/li>\n<\/ol>\n<div class=\"md-hr md-end-block\" tabindex=\"-1\">\n<hr \/>\n<\/div>\n<h2 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u529f\u80fd\u72b6\u6001<\/span><\/h2>\n<figure class=\"md-table-fig table-figure\">\n<table class=\"md-table\">\n<thead>\n<tr class=\"md-end-block\">\n<th><span class=\"td-span\"><span class=\"md-plain\">\u529f\u80fd<\/span><\/span><\/th>\n<th><span class=\"td-span\"><span class=\"md-plain\">\u72b6\u6001<\/span><\/span><\/th>\n<th><span class=\"td-span\"><span class=\"md-plain\">\u8bf4\u660e<\/span><\/span><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr class=\"md-end-block\">\n<td><span class=\"td-span\"><span class=\"md-plain\">RadioBrowser \u641c\u7d22<\/span><\/span><\/td>\n<td><span class=\"td-span\"><span class=\"md-plain\">\u2705<\/span><\/span><\/td>\n<td><span class=\"td-span\"><span class=\"md-plain\">\u901a\u8fc7\u4ee3\u7406\u8bbf\u95ee API<\/span><\/span><\/td>\n<\/tr>\n<tr class=\"md-end-block\">\n<td><span class=\"td-span\"><span class=\"md-plain\">RadioBrowser \u64ad\u653e<\/span><\/span><\/td>\n<td><span class=\"td-span\"><span class=\"md-plain\">\u2705<\/span><\/span><\/td>\n<td><span class=\"td-span\"><span class=\"md-plain\">nginx \u4ee3\u7406 + iptables<\/span><\/span><\/td>\n<\/tr>\n<tr class=\"md-end-block\">\n<td><span class=\"td-span\"><span class=\"md-plain\">\u76f4\u63a5 URL \u64ad\u653e<\/span><\/span><\/td>\n<td><span class=\"td-span\"><span class=\"md-plain\">\u2705<\/span><\/span><\/td>\n<td><span class=\"td-span\"><span class=\"md-plain\">\u5b8c\u5168\u6b63\u5e38<\/span><\/span><\/td>\n<\/tr>\n<tr class=\"md-end-block\">\n<td><span class=\"td-span\"><span class=\"md-plain\">\u9884\u8bbe\u6309\u94ae<\/span><\/span><\/td>\n<td><span class=\"td-span\"><span class=\"md-plain\">\u2705<\/span><\/span><\/td>\n<td><span class=\"td-span\"><span class=\"md-plain\">\u5b8c\u5168\u6b63\u5e38<\/span><\/span><\/td>\n<\/tr>\n<tr class=\"md-end-block\">\n<td><span class=\"td-span\"><span class=\"md-plain\">TuneIn \u641c\u7d22<\/span><\/span><\/td>\n<td><span class=\"td-span\"><span class=\"md-plain\">\u2705<\/span><\/span><\/td>\n<td><span class=\"td-span\"><span class=\"md-plain\">\u53ef\u4ee5\u641c\u7d22<\/span><\/span><\/td>\n<\/tr>\n<tr class=\"md-end-block\">\n<td><span class=\"td-span\"><span class=\"md-plain\">TuneIn \u64ad\u653e<\/span><\/span><\/td>\n<td><span class=\"td-span\"><span class=\"md-plain\">\u274c<\/span><\/span><\/td>\n<td><span class=\"td-span\"><span class=\"md-plain\">TuneIn \u5173\u95ed\u4e86\u514d\u8d39\u6d41\u5730\u5740 API<\/span><\/span><\/td>\n<\/tr>\n<tr class=\"md-end-block\">\n<td><span class=\"td-span\"><span class=\"md-plain\">AirPlay<\/span><\/span><\/td>\n<td><span class=\"td-span\"><span class=\"md-plain\">\u2705<\/span><\/span><\/td>\n<td><span class=\"td-span\"><span class=\"md-plain\">\u4e0d\u4f9d\u8d56\u4e91\u670d\u52a1<\/span><\/span><\/td>\n<\/tr>\n<tr class=\"md-end-block\">\n<td><span class=\"td-span\"><span class=\"md-plain\">Bluetooth<\/span><\/span><\/td>\n<td><span class=\"td-span\"><span class=\"md-plain\">\u2705<\/span><\/span><\/td>\n<td><span class=\"td-span\"><span class=\"md-plain\">\u4e0d\u4f9d\u8d56\u4e91\u670d\u52a1<\/span><\/span><\/td>\n<\/tr>\n<tr class=\"md-end-block\">\n<td><span class=\"td-span\"><span class=\"md-plain\">Spotify Connect<\/span><\/span><\/td>\n<td><span class=\"td-span\"><span class=\"md-plain\">\u2705<\/span><\/span><\/td>\n<td><span class=\"td-span\"><span class=\"md-plain\">\u4e0d\u4f9d\u8d56\u4e91\u670d\u52a1<\/span><\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<div class=\"md-hr md-end-block\" tabindex=\"-1\">\n<hr \/>\n<\/div>\n<h2 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u64ad\u653e\u6d41\u7a0b\u8bf4\u660e<\/span><\/h2>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">\u7528\u6237\u9009\u62e9\u7535\u53f0\r\n    \u2193\r\nAfterTouch \u901a\u8fc7\u4ee3\u7406(v2rayA) \u67e5\u8be2 RadioBrowser API \u83b7\u53d6\u6d41\u5730\u5740\r\n    \u2193\r\nAfterTouch \u901a\u77e5\u97f3\u7bb1\u64ad\u653e\r\n    \u2193\r\n\u97f3\u7bb1\u76f4\u63a5\u8fde\u63a5\u7535\u53f0\u670d\u52a1\u5668\u64ad\u653e\u97f3\u9891\uff08\u4e0d\u7ecf\u8fc7\u4ee3\u7406\uff09<\/pre>\n<p>&nbsp;<\/p>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u97f3\u9891\u6d41\u7531\u97f3\u7bb1\u76f4\u63a5\u4ece\u7535\u53f0\u670d\u52a1\u5668\u83b7\u53d6\uff0c\u4ee3\u7406\u53ea\u7528\u4e8e AfterTouch \u67e5\u8be2\u7535\u53f0\u4fe1\u606f\uff0c\u5e26\u5bbd\u5360\u7528\u6781\u5c0f\u3002<\/span><\/p>\n<div class=\"md-hr md-end-block\" tabindex=\"-1\">\n<hr \/>\n<\/div>\n<h2 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u6570\u636e\u5907\u4efd<\/span><\/h2>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">AfterTouch \u6240\u6709\u6570\u636e\u5b58\u50a8\u5728 <\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>.\/data\/<\/code><\/span><span class=\"md-plain\"> \u76ee\u5f55\uff0c\u5b9a\u671f\u5907\u4efd\u5373\u53ef\uff1a<\/span><\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\">tar -czf aftertouch-backup-$(date +%Y%m%d).tar.gz \/home\/will\/AfterTouch\/data\/<\/pre>\n<p>&nbsp;<\/p>\n<div class=\"md-hr md-end-block\" tabindex=\"-1\">\n<hr \/>\n<\/div>\n<h2 class=\"md-end-block md-heading\"><span class=\"md-plain\">\u91cd\u542f\u6062\u590d\u6e05\u5355<\/span><\/h2>\n<p class=\"md-end-block md-p\"><span class=\"md-plain\">\u7cfb\u7edf\u91cd\u542f\u540e\u9700\u8981\u786e\u8ba4\u4ee5\u4e0b\u5185\u5bb9\u81ea\u52a8\u6062\u590d\uff1a<\/span><\/p>\n<ul class=\"ul-list\" data-mark=\"-\">\n<li class=\"md-list-item task-list-item md-task-list-item task-list-done \"><input checked=\"checked\" type=\"checkbox\" \/> <span class=\"md-plain\">AfterTouch Docker \u5bb9\u5668\uff08<\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>restart: unless-stopped<\/code><\/span><span class=\"md-plain\">\uff09<\/span><\/li>\n<li class=\"md-list-item task-list-item md-task-list-item task-list-done \"><input checked=\"checked\" type=\"checkbox\" \/> <span class=\"md-plain\">iptables \u89c4\u5219\uff08<\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>netfilter-persistent<\/code><\/span><span class=\"md-plain\">\uff09<\/span><\/li>\n<li class=\"md-list-item task-list-item md-task-list-item task-list-done \"><input checked=\"checked\" type=\"checkbox\" \/> <span class=\"md-plain\">nginx \u670d\u52a1\uff08<\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>systemctl enable nginx<\/code><\/span><span class=\"md-plain\">\uff09<\/span><\/li>\n<li class=\"md-list-item task-list-item md-task-list-item task-list-done \"><input checked=\"checked\" type=\"checkbox\" \/> <span class=\"md-plain\">\u97f3\u7bb1 <\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>\/etc\/hosts<\/code><\/span><span class=\"md-plain\"> \u914d\u7f6e\uff08\u56fa\u4ef6 27.x \u6301\u4e45\u5316\uff09<\/span><\/li>\n<li class=\"md-list-item task-list-item md-task-list-item task-list-done md-focus-container\"><input checked=\"checked\" type=\"checkbox\" \/> <span class=\"md-plain\">\u97f3\u7bb1 <\/span><span class=\"md-pair-s\" spellcheck=\"false\"><code>\/etc\/resolv.conf<\/code><\/span><span class=\"md-plain md-expand\">\uff08AfterTouch \u8fc1\u79fb\u5199\u5165\uff0c\u6301\u4e45\u5316\uff09<\/span><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u73af\u5883\u4fe1\u606f \u9879\u76ee \u8bf4\u660e \u97f3\u7bb1\u578b\u53f7 Bose<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[24],"tags":[],"class_list":["post-7476","post","type-post","status-publish","format-standard","hentry","category-value_docs"],"_links":{"self":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/7476","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/comments?post=7476"}],"version-history":[{"count":5,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/7476\/revisions"}],"predecessor-version":[{"id":7481,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/posts\/7476\/revisions\/7481"}],"wp:attachment":[{"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/media?parent=7476"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/categories?post=7476"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i007.cc\/wordpress\/wp-json\/wp\/v2\/tags?post=7476"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}