Connect Bose SoundTouch 10 to WiFi using Linux / Telnet

Connect Bose SoundTouch 10 to WiFi using Linux / Telnet

bose-soundtouch-10-telnet-interface.png

I recently received a Bose SoundTouch 10 speaker as a gift. The speaker itself is great, but I've found some of the features of the Android app don't work very well. Specifically, it seems to have trouble detecting the speaker and connecting to a new wifi network, endlessly looping instead.

I was convinced that there must be a way to connect to the device using Linux, and doing a little research online led me to this great post revealing that you can telnet to the Bose SoundTouch, and enable a shell.

What follows is instructions on how to connect to the SoundTouch manually using Linux (or Mac, or Windows box with PuTTY), and give it the username and password for a new wifi network so that you can start using the app again. Technically, it must be possible to add login details for a Bose account and change the hardware button presets from this interface too, but I'll leave that for you to experiment with.

Connecting to the Telnet Interface

First, you must put the system in setup mode. You can do this by pressing and holding the 2and volume down keys together for 5 seconds until the wifi LED turns amber.

Then, disconnect from your current internet connection and connect your computer to the Bose access point wifi.

You can then get the IP address of the speaker using the route command on your computer. Example output:

feathers-mcgraw@Hobbs-T440s:~$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.0.2.1 0.0.0.0 UG 600 0 0 wlan0
link-local * 255.255.0.0 U 1000 0 0 wlan0
192.0.2.0 * 255.255.255.0 U 600 0 0 wlan0

In this example, the IP address is 192.0.2.1. I would expect it to be the same for all Bose speakers, but it's worth checking if you have problems connecting using this IP address.

Now you can use the telnet command to connect to the speaker. The telnet interface is served on port 17000, so the command is:

telnet 192.0.2.1 17000

Once you have connected successfully, type help to see a list of available commands. The first time I did this it didn't work, so you may have to do it more than once. If it looks barely readable here, that's because its formatting is barely readable in telnet! Here's what you should see:

feathers-mcgraw@Hobbs-T440s:~$ telnet 192.0.2.1 17000
Trying 192.0.2.1...
Connected to 192.0.2.1.
Escape character is '^]'.
->help
? : ? [List available commands( same as help )]
abl
sim
update-not-required : abl sim update-not-required [get out of software version mismatch critical error state]
update-required : abl sim update-required [simulate software version mismatch critical error state]
default
bright
get : clock default bright get [Get the default bright selection (0 - 15)]
set : clock default bright set <0 - 15> [Set the default bright selection]
enable
get : clock enable get [Is the clock display enabled]
set : clock enable set <TRUE/FALSE> [Enable the standby mode clock display]
format
get : clock time format get [Is the clock display time format in 12 Hour/24 Hour mode]
set : clock time format set <12_HOUR/24_HOUR> [Set the clock display time format either 12 Hour or 24 Hour mode]
ntp
sync
get : clock ntp sync get [Get the current state of the NTP sync token]
update : clock ntp update [Force an NTP Update that would normally come from Clock Sync.]
time : clock time [Print UTC and (Local or Offset) times.]
user
offset
time
get : clock user offset time get [Get the clock user offset time (in minutes)]
set : clock user offset time set <minutes> [Set the clock user offset time (in minutes). Cannot exceed Maximum 32-bit Linux date (i.e. 19 Jan 2038 03:14.08 UTC)]
zone
info
get : clock zone info get [Get the Time Zone Information string]
set : clock zone info set <zone info filename> [Set the Time Zone Information string]
deezer
dev : deezer dev [Set the Deezer Client URLs to point to the Deezer development servers]
dump
playqueue : deezer dump playqueue <user> [display the contents of the accounts playqueue]
geturl : deezer getURL [get the value of Deezer URL]
inject
inerror : deezer inject inerror <user> <module> <code> [<count>] [inject inbound service error code]
outerror : deezer inject outerror <user> <module> [<count>] [inject outbound access error]
reqdelay : deezer inject reqdelay <user> <module> <seconds> [delay sending http request]
respdelay : deezer inject respdelay <user> <module> <seconds> [delay http response]
loglevel : deezer loglevel [<0-7>] or loglevel [critical | error | warning | info | debug | test | verbose | insane] [set logging level]
override
options : deezer override options [<true>|<false>] [Set account availability check when logging in]
prod : deezer prod [Set the Deezer Client URLs to point to the Deezer production servers]
reseturl : deezer resetURL [reset the value of Deezer URL to the default]
seturl : deezer setURL <url> [set the value of Deezer URL]
demo
abl : demo abl [on|off|info] [Turn a BoseLink speaker package on or off, or get info about the speaker package]
ae : demo ae [Set echo state for inputs such as keys]
bt
clearpairlist : demo bt clearpairlist [Clears BT paired list]
enter
normal : demo bt enter normal: Source select the BT source. It will try to connect to the last device that played audio or it will go to pairing mode if the pairing list is empty. [Enter BT Source]
pairmode : demo bt enter pairmode: Source select the BT source and always go to pairing mode. [Enter BT Pairing mode]
exit : demo bt exit [Exit BT Source]
create
source : demo create source <source name> [iconUrl] [Adds a source and optionally an icon URL (default URL used if not specified)]
echo : demo echo [Provide an echo response based on input]
enter : demo enter [Enter Demo Mode]
exit : demo exit [Exit Demo Mode]
ig : demo ig (<button> | <device> | <all>) <0,1> [Set ignore state for inputs such as keys]
kp : demo kp [Simulate an input event such as key press]
ps
config : demo ps config <preset #> <source> <preset_name> <track_name> <album_name> <artist_name> <station> [Set data for a preset]
standby : demo standby [Enter simulated demo standby]
display : display [display demo]
set
countdown : display set countdown <msg> [upperCount] (default upperCount=5) [Set a countdown msg for OLED display]
dm870 : dm870 get <register> | dm870 set <register> <value> [DM870 commands]
envswitch
accountid
get : envswitch AccountId get [Retrieve AccountId from SystemConfiguration File]
set : envswitch AccountId set <UUID> [Put AccountId for new Environment into SystemConfiguration File]
boseurls
set : envswitch boseurls set <BoseServerURL> <SoftwareUpdateURL> [Put new Bose Server Urls into /var/lib/Bose/PersistenceDataRoot/OverrideConfigurationEFE.xml]
newenviron
activate : envswitch newenviron activate <EnvName> <UserAccountName> <AccountPassword> [Activate named environment on current server using named account ]
define : envswitch newenviron define <EnvName> <BoseServerURL> <SoftwareUpdateURL> [Define a new named environment with Bose Server Urls ]
select : envswitch newenviron select <EnvName> <ServerUrl> <UserAccountName> <AccountPassword> [Switch named environment on named account ]
swupdateurl
set : envswitch swupdateurl set <URL> [Put new SwUpdateUrl into /var/lib/Bose/PersistenceDataRoot/OverrideConfigurationEFE.xml]
testenvironments
get : envswitch testenvironments get [Get Test Environments List from Marge]
exit : quit [Exit the CLI session( same as quit )]
ext
capabilities : ext capabilities search|sort [Check search/sort capabilities]
conthist : ext conthist [list of contents]
info : ext info [Check Track Info]
list : ext list [contentid] [start_offset] [count] [List container of a Upnp Server]
loglevel : ext loglevel [<level>] [Set level]
next : ext next [Next track]
pause : ext pause [Pause]
play : ext play [contentid] [track|folder] [Play a track]
prev : ext prev [Previous track]
repeat : ext repeat [on|one|off] [Set repeat mode]
search : ext search [contentid] [start_offset] [count] [search_type] [key_word] [Search a Upnp Server]
select : ext select idx [select a stored music source]
server : ext server | ext server server_uuid [check or set current server]
servers : ext servers [List Upnp Servers]
shuffle : ext shuffle [on|off] [Set shuffle mode]
sources : ext sources [check stored music sources]
status : ext status [Check Play Status]
stop : ext stop [Stop]
tracks : ext tracks [list of play_all tracks]
force_battery : force_battery [force a battery device to be created, regardless of variant]
getpdo : getpdo <pdo_name> [Get PDO data]
getpdosize : getpdo [<pdo_name>] [Get PDO data size in bytes]
gpio : gpio <number> to read, gpio <number> [on | off] to set [Read input GPIO value or set GPIO output value]
help : help [List available commands( same as ? )]
iheart
corruptsessionid : iheart corruptsessionid <user> [Corrupt SessionID to test re-login]
inject
inerror : iheart inject inerror <user> <module> <code> [<count>] [inject inbound service error code]
outerror : iheart inject outerror <user> <module> [<count>] [inject outbound access error]
reqdelay : iheart inject reqdelay <user> <module> <seconds> [delay sending http request]
respdelay : iheart inject respdelay <user> <module> <seconds> [delay http response]
loglevel : iheart loglevel [<0-7>] or loglevel [critical | error | warning | info | debug | test | verbose | insane] [set logging level]
skipsget : iheart skipsget <user> [Get current skip count]
stagingserver : iheart stagingserver [on | off] [enable/disable use of the IHeart staging server (setting is persistent across reboots)]
test
relogin : iheart test relogin <user> [Corrupt SessionID to test re-login]
testautomationlogging : iheart testautomationlogging [on | off] [Turn on test automation logging]
ir : ir <cmd> [args]
echo [on|off] : echo keys to TAP as received; MUST run 'async_responses on' TAP cmd
in order to see the output [IR Device commands]
key : key [key_value (volume_up, volume_down, preset_1, ..., preset_6)] [P&H time out in ms] [Simulate a key press and release or press and hold]
local_services : local_services on [turn on local services (persistent)]
loglevel : loglevel [<level>] or loglevel [<facility> <on|off>] or loglevel conf [Set level, set facility on/off, generate a conf file, (current status if no args)]
logread : logread [on | off] [turn on logread (persistent)]
flush : logread flush <usb/fs> [Flushes the contents of logread to USB or File System (/var/lib/Bose/PersistenceDataRoot/BoseLog/)]
net
analysis : net analysis [Perform a network analysis]
network
ap : network ap on | off [<access point name>] [Turns the access point on and off. When using you must supply an access point name]
dhcp : network dhcp [Displays the current dhcp interface]
loglevel : network loglevel [<0-7>] or loglevel [critical | error | warning | info | debug | test | verbose | insane] [set logging level]
mode : network mode auto | wifioff | wifisetup [Sets the current network operational mode to auto: automatically connects to wired Ethernet, if not wired connects using stored wifi profiles, wifioff: turns the WiFi radio off and allows wired Ethernet connection, wifisetup: only connects to the profile supplied by addprofile and allows wired Ethernet connection]
status : network status [Displays the current network status]
wifi
log
ap : network wifi log ap error | warning | info | debug | msgdump | excessive [Set Access Point daemon logging]
sta : network wifi log sta error | warning | info | debug | msgdump | excessive [Set station mode daemon logging]
profiles
add : network wifi profiles add <ssid> <security_type> [<password>] [Attempt to add a wifi profile. The response is asynchronous so run 'async_responses on' to see the response to this command, or type 'network wifi profiles info' to check. Valid security types are none, wep, and wpa_or_wpa2. ]
clear : network wifi profiles clear [Clears all WiFi Profiles]
info : network wifi profiles info [Displays the current wifi profiles]
scan : network wifi scan [<maxresults>] [ on | off ] [Performs a site survey. The response is asynchronous so run 'async_responses on' to see the response to this command. The option on | off switch will turn on and off unsolicited asynchronous responses during wifiseup]
interval : network wifi scan interval [<interval (in seconds) ] [Sets the interval between site scans.]
status : network wifi status [Displays the current wifi status]
pandora
autocomplete : Pandora autocomplete [<off|on>] [Disable/enable autocomplete search]
explain : Pandora explain [explainTrack]
inactivity : Pandora inactivity [<time in minutes>] [Set the inactivity timeout (in minutes)]
list
accounts : Pandora list accounts [List the available accounts]
stations : Pandora list stations [<maximum stations>] [List the available stations]
tracks : Pandora list tracks [List tracks for current station]
logout : Pandora logout [Logout]
maint : Pandora maint [<off|on>] [Set the maintenance mode]
playstation : pandora playstation <station index> [Play a station]
rate_enabled : Pandora rate_enabled [<true|false>] [Set the rate enabled/allowed for the current track]
rating : Pandora rating [<DOWN|NONE|UP>] [Set the rating for the current track]
restrict : Pandora restrict [<off|on>] [Set the Restriced License mode]
select
account : Pandora select [] [Select account]
thumbs : Pandora thumbs up[down] [Thumbs up/down]
quit : quit [Quit the CLI session( same as exit )]
rhinoled
blink : rhinoled blink 0-63 [amber,white,blue] [wifi,bt,aux,shelby] [Rhino LED at blink animation]
disable : rhinoled disable [Disable PRU]
intensity : rhinoled intensity 0-63 [amber,white,blue] [wifi,bt,aux,shelby] [Rhino LED at given intensity]
off : rhinoled off [amber,white,blue] [wifi,bt,aux,shelby] [Rhino LED turned off]
pulsing : rhinoled pulsing 0-63 [amber,white,blue] [wifi,bt,aux,shelby] [Rhino LED pulsing animation]
status : rhinoled status [wifi,bt,aux,shelby] [Returns current LED status for each led or one led if specified]
update
downloading : rhinoled update downloading [Set LED for update downloading]
installing : rhinoled update installing [Set LED for update installing]
wifi
connected : rhinoled wifi connected [Set LED for wifi connected while system on]
connecting : rhinoled wifi connecting [Set LED for wifi connecting while system on]
disconnected : rhinoled wifi disconnected [Set LED for wifi disconnected while system on]
wifisetup : rhinoled wifisetup [Set LED for wifi Setup mode]
rtc : rtc [gettime, getalarm, enablealarm, disablealarm, getwk, read, settime, setalarm yyyy - mm - dd hh : mm : ss, setwk yyyy - mm - dd hh : mm : ss 1( 0 )]
scm
exp : scm exp [scm experiments]
fs_ver : scm fs_ver [display the fs version]
kill : scm kill [kill a process]
list : scm list [List processes scm manages]
log
purge : scm log purge [purge scm log file]
read : scm log read [read back scm log file]
lsusb : scm lsusb [displays any usb attached media]
mfgdata : scm mfgdata [display the manufacturing data]
per : scm per on|off [turn peri loglevel : sxm loglevel [<0-7>] or loglevel [critical | error | warning | info | debug | test | verbose | insane] [set logging level]
senderror : sxm senderror <code> [Generate and send a specific error code]
set
config : sxm set config <user> <name> [<value>] [set configuration name to override value (empty value restores default)]
id : sxm set id <user> <id> [Set registration id used for authentication]
key : sxm set key <user> <key> [Set registration key used for encrypt/decrypt]
tokentime : sxm tokentime <user> <timeout> [Set token refresh time in seconds (0 restores default)]
sys
auxkey : sys auxkey [Set the aux button]
broadcast : sys broadcast [test broadcast to external clients]
mode : sys broadcast mode [test mode broadcast to external clients]
presets : sys broadcast presets [send presets to external clients (both UI and Peers)]
recents : sys broadcast recents (deprecated) [test recents broadcast to external clients]
configuration : sys configuration <XMLTag> <Value> [Dynamically modify the current loaded configuration]
critical
error
clear : sys critical error clear [Clears the critical error PDO]
devicelist : sys devicelist [List the devices that have been discovered by UPnP]
factorydefault : sys factorydefault [Reset to Factory Default(It will remove device from Marge, clear the persistence, reset the SMSC cne settings and reboot the system)]
iconurl : sys iconurl <SoundTouch Source Type name> <url> [Set source icon url for an STS source]
list
sources : sys list sources [List the current sources]
pers : sys list sources [Lists source information from datastore/persistence]
login : sys login pandora [<username> <password>] [login a source (provide username/password)]
net
down : sys net down [Simulate network down]
up : sys net up [Simulate network up]
next : sys next [select the next track]
notify : sys notify [test notification to other Lisa devices]
pause : sys pause [pause the current station]
play : sys play [play the current station]
playpause : sys playpause [play/pause the current station]
power : sys power [issue the power key]
presetkey : sys presetkey [<number> p|ph] (p=press&release, ph=press&hold) [Set a preset button]
prev : sys prev [select the prev track]
reboot : sys reboot [Reboot the system]
remove : sys remove type name [Remove a source]
select : sys select type name [Change to new source]
selectslave : sys selectslave [Send a mesage to SysController to select the slave source]
set
language : sys set language [1-n] [Sets the system language. Displays languages if no parameters specified]
setup : sys setup [transition to setup state]
setupap : sys setupap <enable/disable> [Set whether setupap mode (auto/off)]
standby : sys standby [ |lowpower|charging] [transition to standby, low power standby or to charging standby]
stop : sys stop [stop the current station]
syncmarge : sys syncMarge [Sync with Marge]
timeout : sys timeout inactivity seconds|enable|disable or sys timeout onbattery seconds [Override the default timeout for testing purpose]
ver : sys ver [output BoseApp build version]
volkeycombo : sys volkeycombo [preset no] [Simulate volume minus and preset keypresses]
volume : sys volume [setvalue updateDisplay] [set or get the system volume, enable/disable display update]
down : sys volume down [delta] [decrease the system volume]
max : sys volume max [threshold] [set the system volume max threshold]
min : sys volume min [threshold] [set the system volume min threshold]
mute : sys volume mute (toggle|on|off) [mute the system volume]
up : sys volume up [delta] [increase the system volume]
zone : sys zone [Get zone state]
hist : sys zone hist [Get zone request history]
test
senderrornotify : test sendErrorNotify [Sends a test error notification message]
udc
dataserver : udc dataserver <url> [Redirect Data Collection to another URL.]
filterclear : udc filterclear [Clear the UDC Do Not Send filter.]
filterexcludepath : udc filterexcludepath <json-pattern-path> [Adds a Do Not Send pattern string to UDC Do Not Send filter.]
filterprint : udc filterprint [Print UDC Do Not Send filter.]
httpgetfilter : udc httpgetfilter [Get Blacklist filter from Data Server.]
httppostndc : udc httppostndc [Posts networkstatistics from NVRAM to Data Server.]
loadfilter : udc loadfilter [Load active Blacklist filter from NVRAM.]
off : udc off [Disable UDC.]
on : udc on [Enable UDC.]
set_etag : udc set_etag <etag-string> [Sets eTag for Get Blacklist Request to Data Server.]
set_noreplylimit : udc set_noreplylimit <integer count> [Set number of Replies Outstanding for suppression of an excess of events.]
set_noreplytime : udc set_noreplytime <floating point number(seconds)> [Set excess events debounce timer.]
status : udc status [Prints the status of entire UDC subsystem.]
storefilter : udc storefilter [Store active Blacklist filter to NVRAM.]
vtuner
geturls : vtuner geturls [display current vtuner urls]
home : vtuner home [List the home menu items. If is not given, then the response from vtuner server won't be printed]
inject
badtoken : vtuner inject badtoken [<number of command transactions to corrupt>] [vtuner corrupt command request with un-encrypted token]
ipaddr : vtuner inject ipaddr [<ip address to inject>] [] [vtuner augment login command with alternative ip address]
logapi : vtuner inject logapi [<number of vTuner responses to send to log>] [vtuner send dump of vTunerAPI responses to TEST_AUTO port]
naverr : vtuner inject naverr [<number of nav errors>] [set vtuner navigation error count]
playurl : vtuner setplayurl [<play url>] [<number of set requests to modify, -1 = forever>] [vtuner override play url returned from vtuner]
protohint : vtuner setprotohint [<ptoto hint>] [<number of set requests to modify, -1 = forever>] [vtuner override proto hint returned from vtuner]
srchlang : vtuner inject srchlang [<ISO language code>] [<number of search requests to modify>] [vtuner augment search request to use spelling specified by language code]
list
dir : vtuner list dir [<printlines>] [list current vtuner directory. If <printlines> is given, then only specified # of lines will be printed]
station : vtuner list station [list current vtuner station info]
localebackupurl : vtuner localebackupurl [<url>] [set or get (no argument gets) vtuner locale backup url]
localeurl : vtuner localeurl [<url>] [set or get (no argument gets) vtuner locale primary url]
location : vtuner location [set or get (no argument gets) vtuner location to use for the solr search]
loginbackupurl : vtuner loginbackupurl [<url>] [set or get (no argument gets) vtuner login backup url]
loginurl : vtuner loginurl [<url>] [set or get (no argument gets) vtuner login primary url]
logout : vtuner logout [logout of vtuner server]
open : vtuner open <index_num>/previous [<printlines>/all] [Open an entry of current directory, or open 'home', or open 'previous'. If <printlines> is not given, then the response from vtuner server won't be printed]
predictivesearchurl : vtuner prectivesearchurl [<url>] [set or get (no argument gets) vtuner predictive search primary url]
previous : vtuner previous [List the previous menu items.]
search : vtuner search [search vtuner stations]
searchbackupurl : vtuner searchbackupurl [<url>] [set or get (no argument gets) vtuner search backup url]
searchurl : vtuner searchurl [<url>] [set or get (no argument gets) vtuner search primary url]
solrsearchurl : vtuner solrsearchurl [<url>] [set or get (no argument gets) vtuner solr search url]
status : vtuner status [show vtuner current station playback status]
usesolrsearch : vtuner usesolrsearch [set or get (no argument gets) vtuner flag to force use of the solr search]
webserver
clients [Lists all connected clients via websockets]
details [Lists all connected clients via websockets and all stats associated]
reqhist [Lists all last 100 requests]
resphist [Lists all last 100 responses]
stats [List all information regarding transactions going through webserver]
ws
acctmode
get : ws AcctMode get [get AcctMode]
set : ws AcctMode set <MODE> [set a new AcctMode]
addpreset : ws AddPreset <SOURCE> <LOCATION> <LABEL> <SOURCEACCOUNT> <PRESETID> [NB: label may be quoted with " characters]
getdeviceinfo : ws GetDeviceInfo
getpresets : ws GetPresets [get presets]
pairdevicewithmargeaccount : ws PairDeviceWithMargeAccount MARGEMAIL MARGEUUID PASSWORD
removepreset : ws RemovePreset <PRESETID> [remove a preset]
renamedevice : ws RenameDevice NEWDEVICENAME
unpairdevicewithmargeaccount : ws UnPairDeviceWithMargeAccount

If you are looking for something in this list, note that it isn't sorted into order based on logical grouping (like all network related commands in the same section), it's purely alphabetical. If you're looking for something in particular, you may want to paste the output into a text editor and search that way.

Setting a new WiFi configuration

You may have seen some wifi related commands in the output from help. The one you want to use to give the speaker a new SSID and password is this one:

network wifi profiles add <ssid> <security_type> [<password>]

e.g. for a router with SSID "foobarHub", password "topsecret" and WPA2 authentication, the command would be:

network wifi profiles add foobarHub wpa_or_wpa2 topsecret

Important: the help command says that valid security types are nonewep, and wpa_or_wpa2. That isn't a typo! If your network is not password protected, use:

network wifi profiles add foobarHub none

You should now see the speaker automatically find the new network and connect to it. Once it's connected to the network, the Bose SoundTouch Controller app should be able to find it - choose the option to connect to a device that is already on the network.

Enjoy!

Other Useful Commands on the Telnet Interface

There are lots of other things you can achieve using the telnet interface. Here are just a few commands I found particularly useful.

List WiFi status

network wifi status
1
2
<?xml version="1.0" encoding="UTF-8" ?>
<WiFiStatus SSID="foobarHub" state="WIFI_STATION_CONNECTED" frequencyKHZ="2412000" signalDBM="-41" />

Show Stored WiFi username/password combinations

network wifi profiles info
1
2
3
4
<?xml version="1.0" encoding="UTF-8" ?>
<WiFiProfiles>
    <profile SSID="foobarHub" priority="1" security="wpa_or_wpa2" passphrase="hashedPW" wepKey="somestring" encrypted="true" lastConnected="1453152992" />
</WiFiProfiles>

List Current Network Status

network status
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="UTF-8" ?>
<Status primaryIsUp="false" primaryIPAddress="" primaryIsWired="false" accessPointIsUp="true" mode="wifiSetup" elapsedMs="4027">
    <interfaceInfo name="lo" type="local" state="up" macAddress="000000000000">
        <ipInfo IPAddress="127.0.0.1" SubnetMask="255.0.0.0" />
    </interfaceInfo>
    <interfaceInfo name="eth0" type="wired" state="down" macAddress="EC24B8A192FD" />
    <interfaceInfo name="wlan0" type="wireless" state="down" macAddress="7CEC79694476" />
    <interfaceInfo name="wlan1" type="wireless" state="up" macAddress="7CEC79694477">
        <ipInfo IPAddress="192.0.2.1" SubnetMask="255.255.255.0" />
    </interfaceInfo>
    <interfaceInfo name="usb0" type="wired" state="up" macAddress="FED3C97DF205">
        <ipInfo IPAddress="203.0.113.1" SubnetMask="255.255.255.252" />
    </interfaceInfo>
    <interfaceInfo name="mon.wlan1" type="wired" state="up" macAddress="7CEC79694476" />
</Status>

Notice that "usb0" is listed as an interface with an IP address - I think this is the "service" micro USB port on the back of the device. dmesgshows this output when a standard USB to micro USB cable is plugged in in to the speaker when it is on:

[14009.200800] usb 1-1: new high-speed USB device number 11 using xhci_hcd
[14009.329899] usb 1-1: New USB device found, idVendor=05a7, idProduct=0921
[14009.329906] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[14009.329910] usb 1-1: Product: Bose® SoundTouch™ System
[14009.329913] usb 1-1: Manufacturer: Linux 3.2.0 with musb-hdrc
[14009.329915] usb 1-1: SerialNumber: 0000000000
[14009.331413] cdc_ether 1-1:1.0 usb0: register 'cdc_ether' at usb-0000:00:14.0-1, CDC Ethernet Device, 16:2f:6c:bf:ff:f7
[14009.366411] cdc_ether 1-1:1.0 enx162f6cbffff7: renamed from usb0
[14009.407302] IPv6: ADDRCONF(NETDEV_UP): enx162f6cbffff7: link is not ready
[14009.407516] cdc_ether 1-1:1.0 enx162f6cbffff7: kevent 12 may have been dropped
[14009.451461] cdc_ether 1-1:1.0 enx162f6cbffff7: kevent 12 may have been dropped
[14310.111114] usb 1-1: USB disconnect, device number 11
[14310.111181] cdc_ether 1-1:1.0 enx162f6cbffff7: unregister 'cdc_ether' usb-0000:00:14.0-1, CDC Ethernet Device

I think the "link is not ready" message happens because the device is not in the right mode (maybe there is a "service mode"?). I have a feeling that it should be possible to connect with telnet over USB, but I haven't managed it yet. If you can do it, please let me know how! There is some really useful information about IP traffic over USB at linux-usb.org that might help you if you are looking into this.

Other useful information

Hardware key commands:
1 and volume down = reset system to factory defaults
2 and volume down = setup mode
3 and volume down = disable or re-enable WiFi and Bluetooth
4 and volume down = update software (if new firmware is available)

Type: 

Sam Hobbs ·