TCP远程控制命令协议
一、 概述
在无线局域网内实现可靠的网络通讯,采用基于TCP的C/S架构和UDP协议。手机及其他接入设备(简称手机)作为客户端,背景音乐网关设备(简称设备)作为服务端。
1、服务端为被动端,当接收到命令后做出相应的反应,并根据需要决定是否返回数据。
2、客户端为主动端,根据实际需要发送指令和数据,当发出命令后,服务端返回当前指令及相关数据。
3、客户端先用startBroadCast函数广播心跳包(发送心跳包时不带数据表示为客户端),当服务端收到心跳包后,返回机器型号,表示成功连接。连接成功后就可以发送其它指令的相关动作。如房间号和房间名等所有指令。
4、每条指令发出后都有返回信息,当检测到返回的的信息后,根据需要作出处理,再做后续动作。
5、本指令集支持TCP协议和UDP协议,即客户可以选择是TCP还是UDP进行通讯。
以下是播放指令示例在网络调试助手上的调试界面:
选择UDP
端口号:8080
10月13日新增指令
选择TCP
二、 数据包格式
客户端和服务端,发送的数据包格式完全相同。
通讯传输为异步方式,并以字节为单位。
格式 |
起始位 |
包长度 |
协议号 |
信息内容 |
帧序列号 |
停止位 |
长度(Byte) |
2 |
2 |
1 |
N |
1 |
2 |
固定值 |
0x7E 0x7E |
4+N |
|
|
0x01 |
0x0D 0x0A |
1. 起始位
占2个字节。固定值,统一为十六进制0x7E 0x7E。
2. 包长度
占2个字节。高位在前、低位在后。
长度=协议号+信息内容+帧序列号+停止位,共(4+N)Byte,信息内容为不定长字段。
3. 协议号
不同的功能对应相应的协议号,详见“指令集”。
协议号 |
||
值 |
预定义(别名) |
说明 |
0xC0 |
TCPCMD_PALPITANT |
心跳包,服务端收到对方的心跳包返回机器型号(如BM209) |
0xC1 |
TCPCMD_PLAY_PAUSE |
音乐播放/暂停 |
0xC2 |
TCPCMD_PRE |
音乐上一首 |
0xC3 |
TCPCMD_NEXT |
音乐下一首 |
0xC4 |
TCPCMD_LOOPMODE |
音乐循环模式 |
0xC5 |
TCPCMD_VOL_CTRL |
音乐播放声音控制 |
0XC6 |
TCPCMD_PLAYSTATUS |
音乐播放状态 |
0XC7 |
TCPCMD_SHUTDOWN |
关机 |
0xC8 |
TCPCMD_DURATION |
获取当前播放歌曲时长 |
0xC9 |
TCPCMD_POSITION |
获取进度位置 |
0xCA |
TCPCMD_SONGNAME |
获取当前播放歌曲 |
0xCB |
TCPCMD_ROOMNAME |
返回房间名号,用"::"分隔 |
0xCC |
TCPCMD_PROGRESS |
设置进度条 |
0xCD |
TCPCMD_MEDIATYPE |
1音乐,2电台, 3:视频,4:图片 |
0xCE |
TCPCMD_MEDIA_LIST_SIZE |
返回歌曲总数 |
0xCF |
TCPCMD_GET_MEDIA_LIST |
每次取一条,返回歌曲名和播放时长 |
0xD0 |
TCPCMD_PLAY_POS |
播放列表中的某一位置的歌曲 |
0xD1 |
TCPCMD_ARTIST |
获取当前歌曲艺术家,仅限音频 |
0xD2 |
TCPCMD_VOL_SET |
设置音量 |
0xD3 |
TCPCMD_VOL_GET |
获取音量 |
0xD4 |
TCPCMD_UPDATE_ROOMNAME |
修改房间名 |
0xD5 |
TCPCMD_UPDATE_ROOMNO |
修改房间号 |
0xD6 |
TCPCMD_SIWTCH_SOUND_SOURCE |
获取和设置音源 |
0xD7 |
TCPCMD_GET_TIMER_SIZE |
获取定时器列表总数,不带参数 |
0xD8 |
TCPCMD_GET_TIMER_DATA |
获取定时器数据 |
0xD9 |
TCPCMD_SET_TIMER_DATA |
设置定时器 |
0xDA |
TCPCMD_GET_TIMER_SWITCH |
获取定时器开关 |
0xDB |
TCPCMD_SET_TIMER_SWITCH |
设置定时器开关 |
0xDC |
TCPCMD_GET_SUBAREA_CONTROL |
获取分区控制,仅限机型BM209 |
0xDD |
TCPCMD_SET_SUBAREA_CONTROL |
设置分区控制,仅限机型BM209 |
0xDE |
TCPCMD_GET_EQ |
不带参数获取当前音效 |
0xDF |
TCPCMD_SET_EQ |
设置音效 |
0xE0 |
TCPCMD_GET_EQ_SWITCH |
获取音效开关 |
0xE1 |
TCPCMD_SET_EQ_SWITCH |
带参数0或1设置音效开关 |
4. 信息内容
占N个字节。
按不同的应用,对应相应的“协议号”,确定具体的内容。
5. 帧序列号
帧序列号占1个字节,默认用0x01代入。
帧序列号器端暂不做检查,可写可不写。
6. 校验码
校验码机器端暂不做检查,可写可不写。
7. 停止位
占2个字节。固定值,统一为十六进制0x0D 0x0A。
三、 指令集
public final static byte TCPCMD_PALPITANT = (byte) 0xC0;
命令示例:0x7e0x7e0x00x40xc00x10xd0xa
7e 7e 0 4 c0 1 d a
如果是服务端,返回机器型号,如"BM209"。
public final static byte TCPCMD_PLAY_PAUSE = (byte) 0xC1;
命令示例:0x7e0x7e0x00x40xc10x10xd0xa
7e 7e 0 4 c1 1 d a
不带参数返回当前指令
8月15新增说明:
1、当媒体是音频或电台时,可随时发送此指令,进行播放和暂停。
2、当媒体是视频时,且是通过TCP指令启动的,可以通过此命令进行关闭。
关闭后系统将媒体设置成音频类型。如要重启视频,需重新设置类型。
3、当媒体是图片时,且是通过TCP指令启动的,可以通过此命令进行关闭。
关闭后系统将媒体设置成音频类型。如要重启视频,需重新设置类型。
public final static byte TCPCMD_PRE = (byte) 0xC2;
命令示例:0x7e0x7e0x00x40xc20x10xd0xa
不带参数返回当前指令
8月15新增说明:仅限音频和电台。
public final static byte TCPCMD_NEXT = (byte) 0xC3;
命令示例:0x7e0x7e0x00x40xc30x10xd0xa
7e 7e 0 4 c3 1 d a
不带参数返回当前指令
8月15新增说明:仅限音频和电台。
public final static byte TCPCMD_LOOPMODE = (byte) 0xC4;
带参数'0',获取当前播放模式。
命令示例:0x7e0x7e0x00x50xc40x300x10xd0xa
带参数'1'切换当前播放模式
命令示例:0x7e0x7e0x00x50xc40x310x10xd0xa
带参数返回数字
public static final int MPM_ERROR = -1; // error
public static final int MPM_NORMAL = 0; // normal
public static final int MPM_REPEAT_ALL = 1; // repeat all
public static final int MPM_REPEAT_ONE = 2; // repeat one
public static final int MPM_SHUFFLE = 3; // shuffle
public final static byte TCPCMD_VOL_CTRL = (byte) 0xC5;
//'0'音量减,
0x7e0x7e0x00x50xc50x300x10xd0xa
//'1'音量加
0x7e0x7e0x00x50xc50x310x10xd0xa
带参数返回字符‘0’或‘1’
8月12日更正:
带参数返回数字0或1
public final static byte TCPCMD_PLAYSTATUS = (byte) 0xC6;
命令示例:0x7e0x7e0x00x40xc60x10xd0xa
返回播放状态如下:
前面是返回字符串“-1”、“0”、“1”
public static final int MPS_NOFILE = -1;// no file
public static final int MPS_INVALID = 0;// invalid
public static final int MPS_PLAYING = 1;// play
public static final int MPS_PAUSE = 2;// pause
public static final int MPS_STOP = 3; // pause
public static final int MPS_PARESYNC = 4;// paresync
public static final int MPS_PARECOMPLETE = 5;// parecomplete
public static final int MPS_COMPLETE = 6;// complete
8月12日更正:
等,现改成带参数返回数字0、1、2等
public final static byte TCPCMD_SHUTDOWN = (byte) 0xC7;//暂时无此功能
public final static byte TCPCMD_DURATION = (byte) 0xC8;
获取当前播放歌曲时长
命令示例:0x7e0x7e0x00x40xc80x10xd0xa
带参数返回毫秒级时间数字
public final static byte TCPCMD_POSITION = (byte) 0xC9;
获取进度位置
命令示例:0x7e0x7e0x00x40xc90x10xd0xa
带参数返回毫秒级时间数字
public final static byte TCPCMD_SONGNAME = (byte) 0xCA;
获取当前播放歌曲名字
命令示例:0x7e0x7e0x00x40xca0x10xd0xa
带参数返回歌曲名字
public final static byte TCPCMD_ROOMNAME = (byte) 0xCB;
命令示例:0x7e0x7e0x00x40xcb0x10xd0xa
带参数返回房间名和房间号,用"::"分隔
public final static byte TCPCMD_PROGRESS = (byte) 0xCC;
设置进度条,需带参数,参数为时间,毫秒级。
命令示例:0x7e0x7e0x00x80xcc0x750x660x00x00x10xd0xa
4字节的含义?
答:此处为毫秒级时间,需转换成十进制。低位数在前,高位数在后。
带参数以原样指令返回
public final static byte TCPCMD_MEDIATYPE = (byte) 0xCD;
设置媒体类型
参数为1是音乐
命令示例:0x7e0x7e0x00x80xcd0x10x00x00x00x10xd0xa
参数为2是电台
命令示例:0x7e0x7e0x00x80xcd0x20x00x00x00x10xd0xa
以上以BM209为例。
BM209,BM205,BM206等机器型号 参数对应
1:音频 2:电台(电台已取消) 3:视频 4:图片
public final static byte TCPCMD_MEDIA_LIST_SIZE = (byte) 0xCE;
获取媒体总数,获取前先设置媒体类型,参照设置媒体类型指令
命令示例:0x7e0x7e0x00x40xce0x10xd0xa
带数字参数返回媒体总数
public final static byte TCPCMD_GET_MEDIA_LIST = (byte) 0xCF;
获取媒体列表,获取前先获取媒体总数,参照设置指令。
范围0~size-1,每次取一条。
开始获取第一条
命令示例:0x7e0x7e0x00x80xcf0x00x00x00x00x10xd0xa
取第二条
命令示例:0x7e0x7e0x00x80xcf0x10x00x00x00x10xd0xa
返回歌曲名,播放歌曲名字、时长、艺术家、路径等,用"::"分隔
8月15日新增返回说明:
添加路径用于定时器中开机、播放设置中设置歌曲。
音频取第9条转换后的数据如下:
9::爱如潮水::275304::张信哲::/mnt/internal_sd/爱如潮水-张信哲.mp3
public final static byte TCPCMD_PLAY_POS = (byte) 0xD0;
设置前先确定是否已设置当前媒体类型,参照设置媒体类型指令
再播放列表中的某一位置的歌曲
命令示例:0x7e0x7e0x00x80xd00x90x00x00x00x10xd0xa
带参数以原指令返回
public final static byte TCPCMD_ARTIST = (byte) 0xD1;
获取当前歌曲艺术家,仅限音频
命令示例:0x7e0x7e0x00x40xd10x10xd0xa
带参数返回艺术家名字。
public final static byte T CPCMD_VOL_SET = (byte) 0xD2;
设置音量,参数为1~15。
示例:0x7e0x7e0x00x80xd20x60x00x00x00x10xd0xa
带参数以原指令返回
public final static byte TCPCMD_VOL_GET = (byte) 0xD3;
获取音量。
示例:0x7e0x7e0x00x40xd30x10xd0xa
带参数返回音量,返回范围1~15。
public final static byte TCPCMD_UPDATE_ROOMNAME = (byte) 0xD4;
修改房间名
带参数返回房间名
public final static byte TCPCMD_UPDATE_ROOMNO = (byte) 0xD5;
修改房间号
带参数返回房间号
public final static byte TCPCMD_SIWTCH_SOUND_SOURCE = (byte) 0xD6;
获取和设置音源。
1、获取时带参数-1,返回当前音源
示例:0x7e0x7e0x00x80xd60xff0xff0xff0xff0x10xd0xa
红色部分转换成整数即为-1。
2、设置时带参数0~5,需根据机型而定,返回如下数字。
public static final int AUDIO_SOURCE_LOCAL = 0;
public static final int AUDIO_SOURCE_LINEIN_1 = 1;
public static final int AUDIO_SOURCE_LINEIN_2 = 2;
public static final int AUDIO_SOURCE_BLUE = 3;
public static final int AUDIO_SOURCE_UX = 4;
public static final int AUDIO_SOURCE_Microphone = 5;
示例(BM209外部音源1):
0x7e0x7e0x00x80xd60x10x00x00x00x10xd0xa
注:外部音源2是205独有的。蓝牙是209,U6,U9才有的,话筒是U6,U9独有的。本地和外部1是所以安卓机型都有的。
public final static byte TCPCMD_GET_TIMER_SIZE = (byte) 0xD7;
获取定时器列表总数,不带参数
示例:0x7e0x7e0x00x40xd70x10xd0xa
带参数返回列表总数
public final static byte TCPCMD_GET_TIMER_DATA = (byte) 0xD8;
获取定时器数据,带参数数字0~n。
返回定时器数据,数据格式为:
"TimerBean [id=" + id + ", title=" + title + ", enable="
+ enable + ", type=" + type + ", state=" + state + ", hour="
+ hour + ", minute=" + minute + ", from=" + from
+ ", musicType=" + musicType + ", musicTitle=" + musicTitle
+ ", musicPath=" + musicPath + ", funcType=" + funcType + "]"
以下是接收到的数据示例:
TimerBean [id=1, title=, enable=false, type=timer_wake_up, state=511, hour=20, minute=22, from=0, musicType=0, musicTitle=, musicPath=, funcType=music]
public final static byte TCPCMD_SET_TIMER_DATA = (byte) 0xD9;
设置定时器:
参数格式为:
命令+数据内容:
1、命令
添加命令 "add::";
删除命令 "del::"
修改命令 "update::"
2、数据内容:
"TimerBean [id=" + id + ", title=" + title + ", enable="
+ enable + ", type=" + type + ", state=" + state + ", hour="
+ hour + ", minute=" + minute + ", from=" + from
+ ", musicType=" + musicType + ", musicTitle=" + musicTitle
+ ", musicPath=" + musicPath + ", funcType=" + funcType + "]"
3、最后合成参数,如添加:
"add::"+"TimerBean [id=" + id + ", title=" + title + ", enable="
+ enable + ", type=" + type + ", state=" + state + ", hour="
+ hour + ", minute=" + minute + ", from=" + from
+ ", musicType=" + musicType + ", musicTitle=" + musicTitle
+ ", musicPath=" + musicPath + ", funcType=" + funcType + "]"
4、返回参数为add、del或update;
以下是修改数据示例
update::TimerBean [id=2119, hostTBid=1, title=, enable=true, type=timer_wake_up, state=511, hour=20, minute=21, musicType=0, musicTitle=, musicPath=]
public final static byte TCPCMD_GET_TIMER_SWITCH = (byte) 0xDA;
获取定时器开关,带参数开关0~3,如下:
定时器类型:
0:开机
1:关机
2:播放
3:停止
示例:开机
0x7e0x7e0x00x80xda0x00x00x00x00x10xd0xa
0000表示?每字节的含义
答:此处转换成十制后,就是数字0,代表定时器类型为开机。即获取开机开关。
返回参数格式,定时类型+开关,如关机且开关开,返回1::1,关机且开关关,返回1::0。
public final static byte TCPCMD_SET_TIMER_SWITCH = (byte) 0xDB;
定时器类型:
0:开机
1:关机
2:播放
3:停止
设置定时器开关。带参数格式如下:
定时器类型+开关(1或0)
示例:开机
0x7e0x7e0x00x80xdb0x300x3a0x3a0x300x10xd0xa
0::0代表什么含义?
答:此处表示为开机类型,且开关为关,“::”为分隔符。
返回参数跟获取定时器开关返回参数一样。
public final static byte TCPCMD_GET_SUBAREA_CONTROL = (byte) 0xDC;
分区: 0~3
音量: 1~15
开关:0~1
获取分区控制,机型BM209,带参数分区0~3。机型U6,U9,带参数分区0~1.其他型号机型无分区。
示例:0分区
0x7e0x7e0x00x80xdc0x00x00x00x00x10xd0xa
4字节的含义?
答:转换成十进制后为数字0,即为0分区。
返回参数格式,分区::音量::开关。
public final static byte TCPCMD_SET_SUBAREA_CONTROL = (byte) 0xDD;
设置分区控制,仅限机型BM209,U6,U9。参数格式:分区::音量::开关。
示例:
0x7e0x7e0x00xc0xdd0x300x3a0x3a0x310x340x3a0x3a0x300x10xd0xa
带参数以原指令返回
public final static byte TCPCMD_GET_EQ = (byte) 0xDE;
不带参数获取当前音效
示例:0x7e0x7e0x00x40xde0x10xd0xa
返回当前音效
public final static byte TCPCMD_SET_EQ = (byte) 0xDF;
设置音效,参数范围0~7,生效需开启音效开关。
1->"普通/Normal"
2->"摇滚/Rock"
3->"流行/Pop"
4->"舞曲/Dance"
5->"嘻哈/Hip-Hop"
6->"古典/Classic"
7->"超重低音/Bass"
8->"人声/Vocal"
示例:舞曲/Dance
0x7e0x7e0x00x80xdf0x30x00x00x00x10xd0xa
与舞曲不对应,
答:不对,应该看成0x3,而不是0x30
带参数以原指令返回。
public final static byte TCPCMD_GET_EQ_SWITCH = (byte) 0xE0;
不带参数,获取当前音效开关
示例:0x7e0x7e0x00x40xe00x10xd0xa
带参数0或1返回,0表示关,1表示开
public final static byte TCPCMD_SET_EQ_SWITCH = (byte) 0xE1;
带参数0或1设置音效开关。
示例:关
0x7e0x7e0x00x80xe10x00x00x00x00x10xd0xa
答:需转换成十进制。转换后就是数字0,表示关。
带参数以原指令返回。
10月13日新增指令
public final static byte TCPCMD_SET_MUTE = (byte) 0xE3;
不带参数设置静音开关。
示例:0x7e0x7e0x00x40xe30x10xd0xa
带参数以原指令返回。