Yamaha MusicCast Protocol
This post will be updated over time
I bought a WX-030 Yamaha MusicCast speaker and am impressed with its capabilities. It would be nice though to be able to stream the MusicCast app to my PC speakers in another room to the WX-030 so I have been using Wireshark to investigate the protocol to see if I could emulate it.
The physical Yamaha device
- Listens on multiple ports for HTTP requests
- Uses multicast UDP
- Uses DLNA
My ASP.NET Core project Swimbait
to emulate the device resides on GitHub.
Device Discovery
The first thing an emulator must do is emulate the connect
button on the physical device.
This is done via a UDP multicast containing JSON data with the devices address:
{
"location":"http://192.168.1.213:49154/MediaRenderer/desc.xml",
"ack":"http://192.168.1.213:51000/MusicCastNetwork/InitialJoinComplete"
}
Discovery Handshake
Once that is done, the MusicCast application will initiate a series of HTTP queries to discover the device and give it a name. A listing of URI’s that the emulator must respond to are as follows
/MediaRenderer/desc.xml
/MusicCastNetwork/InitialJoinComplete
/YamahaExtendedControl/secure/v1/netusb/getAccountStatus
/YamahaExtendedControl/secure/v1/system/getNetworkStatus
/YamahaExtendedControl/v1/dist/getDistributionInfo
/YamahaExtendedControl/v1/main/getSignalInfo
/YamahaExtendedControl/v1/main/getStatus
/YamahaExtendedControl/v1/main/prepareInputChange?input=airplay
/YamahaExtendedControl/v1/main/setInput?input=airplay
/YamahaExtendedControl/v1/netusb/getPlayInfo
/YamahaExtendedControl/v1/netusb/getPresetInfo
/YamahaExtendedControl/v1/system/getDeviceInfo
/YamahaExtendedControl/v1/system/getFeatures
/YamahaExtendedControl/v1/system/getFuncStatus
/YamahaExtendedControl/v1/system/getLocationInfo
/YamahaExtendedControl/v1/system/getNameText
/YamahaExtendedControl/v1/system/getNameText?id=main
/YamahaExtendedControl/v1/system/getNetworkStandby
/YamahaExtendedControl/v1/system/getTag
/YamahaExtendedControl/v1/system/getTag?id=main
/YamahaExtendedControl/v1/system/isNewFirmwareAvailable?type=network
/YamahaExtendedControl/v1/system/setLocationId
/YamahaExtendedControl/v1/system/setLocationName
/YamahaExtendedControl/v1/system/setNameText
/YamahaExtendedControl/v1/system/setTag?id=main&tag=3
/YamahaExtendedControl/v1/system/stopInitialJoin
Secure Responses
Several calls in the above list are on a secure
route. It is unknown whether the responses are ROT-13 or AES.
Swimbait
handles these calls by man in the middling the requests - forwarding the same request to a real MusicCast speaker and then responding with the reply from the real speaker.
NetUSB, Server Play Commands
The remote control browsers available content for NetRadio
and Server
music sources via getListInfo
and SetListControl
methods. The former enumerates the list of options - for example - lists of radio stations and the SetListControl
selects an option - including the commencement of playback.
This means the MusicCast speaker is the entire server for these commands. The remote control cannot send it’s own URL for playback (ie: file:///mysan/rick/never-gonna-give-you-up.mp3
)
Examples of interaction between the remote and speaker can be found here.