├── AndroidReadme.md ├── JdMusicAndVoiceSdk.md ├── JdPlayOpenSdkAndroid.md ├── JdPlaySS.md ├── JdRS485.md ├── JdSmartOpenSdk.md ├── README.md ├── files ├── 485CtrlBackMusicSysWithAIS.pdf ├── 485CtrlBackMusicSysWithHES.pdf ├── 485CtrlDev.pdf ├── 485CtrlSceneMusic.pdf ├── 485ExampleCode.xlsx ├── 485PlayTTS.pdf ├── JdPlayOpenSdkIOS.pdf └── protocolDocument.pdf └── pic ├── PuTTY_11.png ├── PuTTY_22.png ├── dockTree1.png ├── dockTree2.png ├── ios1.png ├── smart-home.jpg ├── smarthome_a.png ├── smarthome_b.png ├── smarthome_c.png └── sound.jpg /AndroidReadme.md: -------------------------------------------------------------------------------- 1 | ## App常期运行不退出 2 | 低内存时,不kill应用,最多只能写3个包名(注意格式,从包名尾部开始,每个包最多16个字符) 3 | ``` 4 | 例如, 5 | 有以下这些包不希望低内存时被kill, com.tianqiao.luo.launcher3,com.cyj.wifigateway,com.cyj.voicerobotsbk 6 | 从包名尾部开始,每个包最多16个字符,在应用启动后写入。 7 | writeFile("/sys/xfocus/debug/lowmem_app", "luo.launcher3,voicerobotsbk,wifigateway"); 8 | 9 | private void writeFile(String filePath, String data){ 10 | try { 11 | File f = new File(filePath); 12 | FileOutputStream fos = new FileOutputStream(f); 13 | byte bytes[] = data.getBytes(); 14 | fos.write(bytes); 15 | fos.close(); 16 | } catch (IOException e){ 17 | Log.d(TAG, e.toString()); 18 | } 19 | } 20 | ``` 21 | 22 | ## 获取设备名称 23 | 设备名称即是手机端连接设备时,呈现的名称,在背景音乐主机端可以使用如下属性获取 24 | ``` 25 | SystemProperties.get("persist.sys.jd.name") 26 | ``` 27 | ## 获取设备UUID 28 | 设备名称即是手机端连接设备时,呈现的名称,在背景音乐主机端可以使用如下属性获取 29 | ``` 30 | AccountManager accountManager = (AccountManager) getSystemService(ACCOUNT_SERVICE); 31 | Account[] accounts = accountManager.getAccountsByType("com.judian.jdmediarender.account"); 32 | for(Account a : accounts){ 33 | Log.d(TAG, "name=" + a.name + ",type=" + a.name); 34 | } 35 | ``` 36 | -------------------------------------------------------------------------------- /JdMusicAndVoiceSdk.md: -------------------------------------------------------------------------------- 1 | 修订记录 2 | -------- 3 | 4 | | 版本 | 日期 | 修改记录 | 修改人 | 5 | |--------|----------|------------------|--------| 6 | | V1.2.48 | 20171224 | 初始版本 | randychen | 7 | |V1.2.52 | 20180326 | 语义理解与语音合成 | randychen | 8 | |V1.2.60 | 20190313 | 为2.0版语音增加热词功能 | Luke | 9 | | | | | | 10 | 11 | 概述 12 | ---- 13 | SDK包含以下功能模块 14 | 1. 获取主机在线音乐内容 15 | 2. 获取主机推荐歌单 16 | 3. 获取主机本地音乐和扫描本地场景文件夹 17 | 4. 语音合成和拦截语义自行处理 18 | 5. 获取主机接受的485数据与主机发送485数据 19 | 6. 主机模式切换 20 | 21 | 集成可以根据自己的需求选择功能 22 | 23 | 公共接入配置 24 | ------------ 25 | ### 下载demo 26 | 百度网盘下载链接: 链接: https://pan.baidu.com/s/179xcJ6HirWoDVofAcsJN5A 密码: 3vix
27 | 路径:JdRelease/jd_music_and_voice_open_sdk
28 | demo需安装并运行于背景音乐主机中 29 | 30 | ### 导入核心包 31 | 将demo内部两个核心包导入:jdbase-release.aar 和 jdmusic-release-X.X.XX.aar 导入项目 32 | ``` xml 33 | repositories{ 34 | flatDir{ 35 | dirs'libs' 36 | } 37 | } 38 | dependencies { 39 | compile fileTree(include: ['*.jar'], dir: 'libs') 40 | compile(name: 'jdbase-release', ext: 'aar') 41 | compile(name: 'jdmusic-release-X.X.XX', ext: 'aar') 42 | } 43 | ``` 44 | 45 | ### 添加权限 46 | 在AndroidManifest.xml中添加如下权限 47 | 48 | ``` xml 49 | 50 | 51 | 52 | ``` 53 | 54 | ### 初始化 55 | ``` java 56 | public class App extends Application{ 57 | @Override 58 | public void onCreate() { 59 | super.onCreate(); 60 | JdPlayPresenter.getInstance().init(this); 61 | } 62 | } 63 | ``` 64 | 65 | 基于开放SDK接入 66 | ------------------ 67 | 68 | ### 关键类说明 69 | 70 | | 类 | 说明 | 71 | |---------------------------|--------------------------| 72 | | JdOnlineMusicPresenter | 获取主机在线音乐 | 73 | | JdRecommendMusicPresenter | 获取主机推荐音乐 | 74 | | JdPlayPresenter | 播放控制与播放状态监听 | 75 | | JdLocalMusicPresenter | 获取主机本地歌曲列表,扫描场景歌曲文件夹 | 76 | | JdVoicePresenter | 语音合成和语义识别 | 77 | | TTS | 语音合成实体类 | 78 | 79 | 80 | ### 关键类接口使用说明 81 | 82 | #### TTS 83 | ``` java 84 | public class TTS { 85 | //不操作 86 | public static final int TYPE_NONE = 0; 87 | //进入识别 88 | public static final int TYPE_ASR = 1; 89 | //进入唤醒 90 | public static final int TYPE_WAKE_UP = 2; 91 | //TTS 内容 92 | private String tts; 93 | //是否打断当前播放的 94 | private boolean canInterrupt; 95 | //TTS类型 96 | private int ttsType; 97 | } 98 | ``` 99 | 100 | #### JdOnlineMusicPresenter 101 | ##### 回调函数 102 | ``` java 103 | public interface IOnlineCallBack { 104 | void setMusicResource(List var1, boolean var2, boolean var3); 105 | void onOperationFail(int var1, String var2); 106 | } 107 | 108 | void setMusicResource(List var1, boolean var2, boolean var3) 109 | 参数 110 | * var1 歌单类型实体类 111 | * var2 是否为最后一级目录歌单 112 | * var3 是否能够加载更多 113 | 114 | void onOperationFail(int var1, String var2) 115 | 参数 116 | * var1 错误类型 117 | * var2 错误提示 118 | ``` 119 | 120 | ##### 主要方法 121 | ``` java 122 | int getMusicResource(BCategory category) 123 | 获取下一级歌单 124 | 参数 125 | * category 如果第一级 参数传 null 后面传请求返回的实体类 126 | 127 | int getMusicResourceMore() 128 | 返回参数表示有下一级列表时调用 129 | ``` 130 | 131 | #### JdRecommendMusicPresenter 132 | ##### 回调函数 133 | ``` java 134 | public interface IRecommendCallBack { 135 | void onQuerySceneMusic(List var1); 136 | } 137 | 138 | void onQuerySceneMusic(List var1) 139 | 参数 140 | * var1 主机推荐音乐集合 141 | ``` 142 | 143 | ##### 主要方法 144 | ``` java 145 | void querySceneMusic() 146 | 查询主机推荐音乐集合 147 | ``` 148 | 149 | #### JdPlayPresenter 150 | ##### 回调函数 151 | ``` java 152 | public interface IPlayCallBack { 153 | void onProgress(int var1, int var2); 154 | void onSongChange(EglSong var1); 155 | void onPlayStatus(int var1); 156 | void onListModeChange(String var1); 157 | void onPlaylist(List var1); 158 | void onPlaylistPosition(int var1); 159 | } 160 | public interface I485DataCallBack { 161 | void onReceiverData(String var1); 162 | } 163 | 164 | void onProgress(int var1, int var2) 165 | 参数 166 | * var1 Progress 167 | * var2 Max_Progress 168 | 169 | void onSongChange(EglSong var1) 170 | 参数 171 | * var1 改变后的歌曲 172 | 173 | void onPlayStatus(int var1) 174 | 参数 175 | * var1 播放状态 176 | 177 | void onListModeChange(String var1) 178 | 参数 179 | * var1 改变后的mode 180 | 181 | void onPlaylist(List var1) 182 | 参数 183 | * var1 歌曲集合 184 | 185 | void onPlaylistPosition(int var1) 186 | 参数 187 | * var1 播放歌曲在歌曲集合中的位置 188 | 189 | void onReceiverData(String var1) 190 | 参数 191 | * var1 485收到的数据 192 | ``` 193 | 194 | ##### 主要方法 195 | ``` java 196 | void queryMediaInfo() 197 | 查询当前歌曲状态 198 | 199 | void queryPlayList(final JdCallBack var1) 200 | 获取播放列表 201 | 参数 202 | * var1 获取播放列表成功与失败的回调 203 | 204 | void clearPlayList(final JdCallBack var1) 205 | 清空播放列表 206 | 参数 207 | * var1 清空播放列表成功与失败的回调 208 | 209 | void deletePlayListByPos(int var1, final JdCallBack var2) 210 | 删除播放列表指定位置的歌曲 211 | 参数 212 | * var1 删除播放列表指定位置 213 | * var2 删除播放列表指定位置的歌曲成功与失败的回调 214 | 215 | void editPlaylist(final String var1, final JdCallBack var2) 216 | 编辑播放列表歌曲 217 | 参数 218 | * var1 编辑播放列表歌曲指定位置 219 | * var2 编辑播放列表歌曲成功与失败的回调 220 | 221 | void refreshListAndPos(JdPlayList var1) 222 | 刷新播放列表和播放位置 223 | 参数 224 | * var1 播放列表 225 | 226 | void clearMediaData() 227 | 清空数据 228 | 229 | void updatePlaylistPosition(EglSong var1) 230 | 更新播放位置 231 | 参数 232 | * var1 歌曲 233 | 234 | void togglePlay() 235 | 播放状态切换 236 | 237 | void play() 238 | 播放 239 | 240 | void pause() 241 | 暂停 242 | 243 | void next() 244 | 下一首 245 | 246 | void prev() 247 | 上一首 248 | 249 | void switchListMode() 250 | 切换播放mode 251 | 252 | String queryListMode() 253 | * 查询播放mode 254 | 255 | void seekTo(long var1) 256 | 改变播放进度 257 | 参数 258 | * var1 进度值 259 | 260 | void release() 261 | 释放资源 262 | 263 | void playLocalSceneMusic(int var1, int var2) 264 | 根据位置编号播放 265 | 参数 266 | * var1 编号位置 267 | * var2 歌曲位置 268 | 269 | void playLocalSceneMusic(String var1, String var2) 270 | 根据文件标识码播放 md5 271 | 参数 272 | * var1 文件标识码 273 | * var2 歌曲md5 274 | 275 | void playSceneMusic(List var1, String var2) 276 | 播放场景推荐列表指定歌曲 277 | 参数 278 | * var1 场景推荐列表集合 279 | * var2 场景id 280 | 281 | void playSceneMusic(JDMusicChannel var1) 282 | 播放推荐歌单 283 | 参数 284 | * var1 推荐歌单 285 | 286 | void playMusic(EglSong var1) 287 | 播放单首音乐 288 | 参数 289 | * var1 歌曲 290 | 291 | void playMusicByIndex(List var1, int var2) 292 | 播放播放列表指定位置歌曲 293 | 参数 294 | * var1 播放列表 295 | * var2 播放列表指定位置 296 | 297 | void playOnlineMusic(BCategory var1) 298 | 播放在线音乐 299 | 参数 300 | * var1 播放歌曲类型 301 | 302 | void playSongByIndex(int var1) 303 | 播放指定位置歌曲 304 | 参数 305 | * var1 指定位置 306 | 307 | void playTTS(String var1, boolean var2) 此方法已过时 308 | 播放TTS 309 | 参数 310 | * var1 播放文本 311 | * var2 是否打断当前播放的TTS 312 | 313 | void playTTS(String var1) 此方法已过时 314 | 播放TTS 315 | 参数 316 | * var1 播放文本 317 | 318 | void playTTS(TTS var1) 319 | 播放TTS 320 | 参数 321 | * var1 播放TTS 类型数据 322 | 323 | void send485Data(String var1) 324 | 发送485控制指令 325 | 参数 326 | * var1 485控制指令 327 | 328 | void set485ReceiverListener(I485DataCallBack callBack) 329 | 设置485数据接受回调 330 | 参数 331 | * callBack I485DataCallBack 回调接口 332 | 333 | void enableSmartDeviceGrammar(boolean var1) 334 | 禁用本地语法 335 | 参数 336 | * var1是否禁用 337 | 338 | void switchDeviceMode(String var1) 339 | 切换模式接口 340 | 参数 341 | * var1模式 342 | ``` 343 | 344 | #### JdLocalMusicPresenter 345 | ##### 回调函数 346 | ``` java 347 | public interface ILocalMusicCallBack { 348 | void onGetSdSongsSuccess(List var1); 349 | void onQueryLocalSceneMusic(List var1); 350 | } 351 | 352 | void onGetSdSongsSuccess(List var1) 353 | 参数 354 | * var1 Sd歌曲集合 355 | 356 | 357 | void onQueryLocalSceneMusic(List var1) 358 | 参数 359 | * var1 本地场景歌曲集合 360 | ``` 361 | 362 | ##### 主要方法 363 | ``` java 364 | void querySdCardSongs() 365 | 查询sdcard歌曲 366 | 367 | void queryLocalSceneMusic() 368 | 查询本地场景歌曲 369 | ``` 370 | 371 | #### JdVoicePresenter 372 | ##### 回调函数 373 | ``` java 374 | public interface IVoiceCallBack { 375 | boolean onAsrResult(String var1, VoiceExeBack var2); 376 | void onVoiceState(int var1); 377 | interface VoiceExeBack{ 378 | @Deprecated 379 | void onSuccess(String var1); 380 | @Deprecated 381 | void onFail(String var1); 382 | void onSuccess(TTS var1); 383 | void onFail(TTS var1); 384 | } 385 | } 386 | 387 | boolean onAsrResult(String var1, VoiceExeBack var2) 388 | 参数 389 | * var1 识别内容 390 | * var2 拦截语义处理成功或者失败后回调 (处理完成后通过 VoiceExeBack 的onSuccess(TTS tts) 或者 onFail(TTS tts) 返回自行处理需要播放的TTS) 391 | 返回值 392 | * true 拦截语义自己处理 393 | * false 不拦截交给主机处理 394 | 注意,有两种情况下背景音乐会处理语义 395 | 1. onAsrResult返回false时 396 | 2. onAsrResult返回true时, VoiceExeBack最终回调是onFail(TTS tts) 397 | 398 | void onVoiceState(int var1) 399 | 参数 400 | * var1 voice_state 状态回调 状态对应如下: 401 | //语音对话开始 402 | public static final int VOICE_STATE_SESSION_START = 10001; 403 | //识别开始录音 404 | public static final int VOICE_STATE_ASR_START_SPEECH = 10003; 405 | //识别录音结束 406 | public static final int VOICE_STATE_ASR_END_SPEECH = 10004; 407 | //开始语义识别 408 | public static final int VOICE_STATE_ASR_RECOGNITION = 10005; 409 | //语音对话结束 410 | public static final int VOICE_STATE_SESSION_END = 10008; 411 | //TTS 播放开始 412 | public static final int VOICE_STATE_TTS_START = 10006; 413 | //TTS 播放结束 414 | public static final int VOICE_STATE_TTS_FINISH = 10007; 415 | ``` 416 | 417 | ##### 主要方法 418 | ``` java 419 | void setIVoiceCallBack(IVoiceCallBack callBack) 420 | 设置语音处理回调 421 | 参数 422 | * callBack 回调方法 423 | ``` 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | -------------------------------------------------------------------------------- /JdPlayOpenSdkAndroid.md: -------------------------------------------------------------------------------- 1 | 修订记录 2 | -------- 3 | 4 | | 版本 | 日期 | 修改记录 | 修改人 | 5 | |--------|----------|------------------|--------| 6 | | V1.0.0 | 20160819 | 初始版本 | yeslee | 7 | | V1.1.0 | 20161117 | 开放音乐资源请求 | yeslee | 8 | | | | | | 9 | 10 | 概述 11 | ---- 12 | 13 | JdPlay局域网媒体控制协议,可用于局域网内媒体发现和媒体控制。第三方可以采用两种方式接入 14 | 15 | 1. 基于开放Sample接入:**推荐方式**, 接入简单,10分钟可以接入完成 16 | 2. 基于开放SDK接口接入:采用MVP模式开发 17 | 18 | 公共接入配置 19 | ------------ 20 | 21 | ### 添加包引用 22 | 23 | 1. jdplay开放sdk jdplay-x.x.xx.aar包依赖fastjson库,需要将jdplay和fastjson库添加到你的工程,如果你的工程也引用了fastjson库,可以使用其中一个即可。 24 | 2. 在Android Studio添加本地jdplay-x.x.xx.aar包引用。参考链接 25 | 3. 添加fastjson-1.2.20.jar 到 libs 目录 26 | 4. 添加aar到 libs 目录,在build.gradle 中参考加入: 27 | 28 | ``` xml 29 | repositories{ 30 | flatDir{ 31 | dirs'libs' 32 | } 33 | } 34 | dependencies { 35 | compile fileTree(include: ['*.jar'], dir: 'libs') 36 | compile(name: 'jdplay-x.x.xx', ext: 'aar') 37 | compile files('libs/fast-json-judian.jar') 可能需要添加 38 | } 39 | ``` 40 | 41 | ### 添加权限 42 | 43 | 在AndroidManifest.xml中添加如下权限 44 | 45 | ``` xml 46 | 47 | 48 | 49 | ``` 50 | 51 | ### 混淆配置 52 | 53 | ``` xml 54 | #jdplay && judian-fastjson 55 | -dontwarn com.judian.support.jdplay.** 56 | -keep class com.judian.support.jdplay.**{*;} 57 | -dontwarn com.judian.fastjson.** 58 | -keep class com.judian.fastjson.** { *; } 59 | ``` 60 | 61 | 基于开放Sample接入 62 | ------------------ 63 | 64 | ### 类说明 65 | 66 | | 类 | 说明 | 67 | |---------------------------|--------------------------| 68 | | JdDeviceListActivity | 设备列表选择界面 | 69 | | JdPlayControlActivity | 播放控制界面 | 70 | | JdPlayPlaylistPopupWindow | 播放列表界面 | 71 | | JdPlayImageUtils | 用于显示专辑图片的工具类 | 72 | | CircleImageView | 圆形图片类 | 73 | 74 | ### 接入步骤 75 | 76 | 1. 合并res资源到APP工程 77 | 2. 合并AndroidManifest.xml Activity定义到APP工程 78 | 3. 添加依赖库jdplay-x.x.xx.aar和fast-json-judian.jar(为避免fastjson库版本冲突,我司修改了fastjson原生包名), 参考 **添加包引用** 79 | 4. 修改资源文件以适配你的APP主题风格 80 | 5. 在Application中初始化,参考App.java 81 | ``` xml 82 | JdPlayManager.getInstance().initialize(this); 83 | ``` 84 | 6. 如果是运行在Android 6.0系统中,需要请求”存储“权限 85 | 86 | 基于开放SDK接口接入 87 | ------------------- 88 | 89 | ### JdPlayManager 90 | 91 | #### getInstance 92 | 93 | public static JdPlayManager getInstance() 94 | 95 | 获取JdPlayManager实例 96 | 97 | **参数** 98 | 99 | - 无 100 | 101 | **返回值** 102 | 103 | - 返回JdPlayManager单例。 104 | 105 | #### initialize 106 | 107 | public void initialize(Context context) 108 | 109 | JdPlayManager初始化,需要在Application里面调用,参考Demo中的App.java 110 | 111 | **参数** 112 | 113 | - **context** Android的ApplicationContext 114 | 115 | **返回值** 116 | 117 | - 初始化成功返回0,非0: 其他错误. 118 | 119 | #### setDebugLevel 120 | 121 | void setDebugLevel(int level) 122 | 123 | 设置调试级别 124 | 125 | **参数** 126 | 127 | - **level** 调试级别 0: 必要信息打印(默认) 1:详细打印 128 | 129 | **返回值** 130 | 131 | - 无. 132 | 133 | ### JdDeviceListContract接口 134 | 135 | JdDeviceListContract定义了JdPlay设备信息View层与Presenter层交互接口 136 | 137 | ``` java 138 | public interface JdDeviceListContract { 139 | interface View { 140 | void onJdDeviceInfoChange(List infos); 141 | } 142 | 143 | interface Presenter { 144 | void selectDevice(String uuid); 145 | String getSelectedDeviceUuid(); 146 | } 147 | } 148 | ``` 149 | 150 | #### View层接口 151 | 152 | ##### onJdDeviceInfoChange 153 | 154 | void onJdDeviceInfoChange(List infos) 155 | 156 | 当JdPlay设备状态发生改变时回调,设备状态包括设备发现、上线、离线等 157 | 158 | **参数** 159 | 160 | - **infos** JdPlay设备信息列表 161 | 162 | **返回值** 163 | 164 | - 无。 165 | 166 | #### Presenter层接口 167 | 168 | ##### selectDevice 169 | 170 | void selectDevice(String uuid) 171 | 172 | 选中JdPlay设备为当前操作的设备,因为局域网内可能存在多个JdPlay设备 173 | 174 | **参数** 175 | 176 | - **uuid** JdPlay设备ID 177 | 178 | **返回值** 179 | 180 | - 无。 181 | 182 | ##### getSelectedDeviceUuid 183 | 184 | String getSelectedDeviceUuid() 185 | 186 | 获取当前选中JdPlay设备的id 187 | 188 | **参数** 189 | 190 | - 无。 191 | 192 | **返回值** 193 | 194 | - JdPlay设备ID 195 | 196 | ### JdPlayControlContract接口 197 | 198 | JdPlayControlContract定义了JdPlay播放控制View层与Presenter层交互接口 199 | 200 | ``` java 201 | public interface JdPlayControlContract { 202 | 203 | interface View { 204 | void setVolume(int percent); 205 | void setPosition(int position); 206 | void setSeekProgress(int percent); 207 | void setDuration(int duration); 208 | void setPlayOrPause(boolean isPlay); 209 | void setPlayMode(String mode); 210 | void setSongName(String name); 211 | void setSingerName(String name); 212 | void setAlbumPic(String url); 213 | void setPlaylist(List songs); 214 | void setPlaylistPosition(int position); 215 | } 216 | 217 | interface Presenter { 218 | void togglePlay(); 219 | void next(); 220 | void prev(); 221 | void changePlayMode(); 222 | void setVolume(int percent); 223 | void seekTo(int percent); 224 | void getPlayList(); 225 | void playPlaylistWithPos(int pos); 226 | } 227 | } 228 | ``` 229 | 230 | #### View层接口 231 | 232 | ##### setVolume 233 | 234 | void setVolume(int percent) 235 | 236 | 设置音量百分比 237 | 238 | **参数** 239 | 240 | - **percent** 0-100 音量百分比 241 | 242 | **返回值** 243 | 244 | - 无。 245 | 246 | ##### setPosition 247 | 248 | void setPosition(int position) 249 | 250 | 设置当前播放时间 251 | 252 | **参数** 253 | 254 | - **position** 时间,单位秒 255 | 256 | **返回值** 257 | 258 | - 无。 259 | 260 | ##### setDuration 261 | 262 | void setDuration(int duration) 263 | 264 | 设置总时间 265 | 266 | **参数** 267 | 268 | - **duration** 时间,单位秒 269 | 270 | **返回值** 271 | 272 | - 无。 273 | 274 | ##### setPlayOrPause 275 | 276 | void setPlayOrPause(boolean isPlay) 277 | 278 | 设置播放或暂停状态 279 | 280 | **参数** 281 | 282 | - **isPlay** 0:暂停 1:播放 283 | 284 | **返回值** 285 | 286 | - 无。 287 | 288 | ##### setPlayMode 289 | 290 | void setPlayMode(String mode) 291 | 292 | 设置播放模式 293 | 294 | **参数** 295 | 296 | - **mode** 播放模式 297 | 298 | | mode | 说明 | 299 | |-------------|----------| 300 | | REPEAT\_ONE | 单曲循环 | 301 | | SHUFFLE | 随机播放 | 302 | | REPEAT\_ALL | 全部循环 | 303 | 304 | **返回值** 305 | 306 | - 无。 307 | 308 | ##### setSongName 309 | 310 | void setSongName(String name) 311 | 312 | 设置歌曲名称 313 | 314 | **参数** 315 | 316 | - **name** 歌曲名称 317 | 318 | **返回值** 319 | 320 | - 无。 321 | 322 | ##### setSingerName 323 | 324 | void setSingerName(String name) 325 | 326 | 设置歌手名称 327 | 328 | **参数** 329 | 330 | - **name** 歌手名称 331 | 332 | **返回值** 333 | 334 | - 无。 335 | 336 | ##### setAlbumPic 337 | 338 | void setAlbumPic(String url) 339 | 340 | 设置专辑图片链接 341 | 342 | **参数** 343 | 344 | - **url** 专辑图片链接 345 | 346 | **返回值** 347 | 348 | - 无。 349 | 350 | ##### setPlaylist 351 | 352 | void setPlaylist(List songs) 353 | 354 | 设置播放列表 355 | 356 | **参数** 357 | 358 | - **songs** 播放列表 359 | 360 | **返回值** 361 | 362 | - 无。 363 | 364 | ##### setPlaylistPosition 365 | 366 | void setPlaylistPosition(int position) 367 | 368 | 设置播放列表的当前播放歌曲的位置 369 | 370 | **参数** 371 | 372 | - **position** 位置 373 | 374 | **返回值** 375 | 376 | - 无。 377 | 378 | #### Presenter层接口 379 | 380 | ##### togglePlay 381 | 382 | void togglePlay() 383 | 384 | 播放暂停切换 385 | 386 | **参数** 387 | 388 | - 无。 389 | 390 | **返回值** 391 | 392 | - 无。 393 | 394 | ##### next 395 | 396 | void next() 397 | 398 | 下一首 399 | 400 | **参数** 401 | 402 | - 无。 403 | 404 | **返回值** 405 | 406 | - 无。 407 | 408 | ##### prev 409 | 410 | void prev() 411 | 412 | 上一首 413 | 414 | **参数** 415 | 416 | - 无。 417 | 418 | **返回值** 419 | 420 | - 无。 421 | 422 | ##### changePlayMode 423 | 424 | void changePlayMode() 425 | 426 | 改变播放模式 427 | 428 | **参数** 429 | 430 | - 无。 431 | 432 | **返回值** 433 | 434 | - 无。 435 | 436 | ##### setVolume 437 | 438 | setVolume(int percent) 439 | 440 | 设置音量 441 | 442 | **参数** 443 | 444 | - **percent** 0-100 音量百分比 445 | 446 | **返回值** 447 | 448 | - 无。 449 | 450 | ##### seekTo 451 | 452 | void seekTo(int percent) 453 | 454 | 跳转 455 | 456 | **参数** 457 | 458 | - **percent** 跳转百分比 459 | 460 | **返回值** 461 | 462 | - 无。 463 | 464 | ##### getPlayList 465 | 466 | void getPlayList() 467 | 468 | 获取播放列表 469 | 470 | **参数** 471 | 472 | - 无。 473 | 474 | **返回值** 475 | 476 | - 无。 477 | 478 | ##### playPlaylistWithPos 479 | 480 | void playPlaylistWithPos(int pos) 481 | 482 | 播放播放列表中点击的歌曲 483 | 484 | **参数** 485 | 486 | - **pos** 选中的歌曲位置 487 | 488 | **返回值** 489 | 490 | - 无。 491 | -------------------------------------------------------------------------------- /JdPlaySS.md: -------------------------------------------------------------------------------- 1 | # JdPlaySS协议 V1.0 2 | 3 | 标签(空格分隔): 网络通信 ServerSocket 局域网 4 | 5 | --- 6 | 7 | ## 概述 8 | 9 | JdPlaySS是JdPlay Server Socket的缩写,参考了mqtt、DLNA协议的思想,是基于TCP协议的简易Server Socket,可用于非Android/iOS系统(如Linux网关)下的局域网背景音系统控制,并可支持多个客户端同时连接。 10 | 11 | ## 条件&约束 12 | 13 | C/S传输数据格式采用json, 且以换行符作为消息分割符。因此不允许消息中存在实际的换行符,但可以存在转义换行符。 14 | 15 | ## 发现协议 16 | 17 | 设备发现采用DLNA的设备发现机制。Client加入组播组并发送SSDP M-SEARCH包到组播地址239.255.255.250:1900端口,也可以直接对当前局域网的广播地址(如192.168.1.255)直接发送SSDP M-SEARCH广播包。参考M-SEARCH包数据如下: 18 | ``` 19 | M-SEARCH * HTTP/1.1 20 | MX: 2 21 | ST: upnp:rootdevice 22 | MAN: "ssdp:discover" 23 | User-Agent: UPnP/1.0 DLNADOC/1.50 JdPlay/1.0.0 24 | Connection: close 25 | Host: 239.255.255.250:1900 26 | ``` 27 | 28 | Client监听到SSDP NOTIFY包,解析包如果含有EXT字段并该字段含有`JDPLAY`关键字,则发现背景音系统,如果版本号大于XXX,则可以通过本协议来控制。 参考NOTIFY包数据如下: 29 | ``` 30 | NOTIFY * HTTP/1.1 31 | Host: 239.255.255.250:1900 32 | Location: http://192.168.1.154:1500/ 33 | Cache-Control: max-age=100 34 | Server: UPnP/1.0 DLNADOC/1.50 EglPlay/1.0.0 35 | BOOTID.UPNP.ORG: 1490004021 36 | EXT: JDPLAY/2.1.1 37 | NTS: ssdp:alive 38 | USN: uuid:10000003816::urn:schemas-upnp-org:device:MediaRenderer:1 39 | NT: urn:schemas-upnp-org:device:MediaRenderer:1 40 | ``` 41 | 42 | ## 控制协议 43 | 44 | ### 消息格式 45 | 46 | C/S直接数据传递采用如下字段,注意seq=0保留给服务器端消息的主动反馈。 47 | 48 | ``` 49 | { 50 | "type": [int][必选]控制包类型, 51 | "seq": [int][可选] 控制包序号, 52 | "s0": [string][可选] 字符串参数0, 53 | "s1": [string][可选] 字符串参数1, 54 | "i0": [int][可选] 整形参数0, 55 | "i1": [int)[可选] 整形参数1, 56 | } 57 | ``` 58 | 59 | #### 消息类型 60 | 61 | 消息包类型有如下几种 62 | 63 | |type类型值| 传输方向 | 描述 | 64 | |------------|------------|------------| 65 | |1 | C->S |CONNECT: 连接请求 | 66 | |2 | S->C |CONNACK: 连接应答 | 67 | |3 | C->S
S->C|PUBLISH: 发布消息 | 68 | |4 | C->S
S->C|PUBACK: 发布消息确认 | 69 | |12| C->S |PINGREQ: 心跳请求 | 70 | |13| S->C |PINGRESP: 心跳反馈 | 71 | |14| C->S |DISCONNECT: 断开请求 | 72 | 73 | ### 消息描述 74 | 75 | #### CONNECT 76 | i0: version 客户端协议版本,本协议为1
77 | i1: keepalive 心跳包时间,单位秒,范围(10~600秒),建议值300, 客户端每隔240秒,发一次心跳包或者传输一次数据。 78 | 79 | #### CONNACK 80 | 81 | i0: version 服务器端协议版本,本协议为1
82 | i1: 0:成功 -1:失败
83 | s0: 反馈的消息字符串,用于调试 84 | 85 | #### PUBLISH 86 | 87 | 用于C/S之间消息传递,目前支持2种消息,控制消息(C->S)和状态主动(S->C)反馈的消息。Client发送消息给Server时,Server会回复PUBACK消息;Server主动反馈消息给Client时,Client端无需回复PUBACK消息。 88 | 89 | seq: [必选] 消息序号,从1开始递增(0:保留给Server消息主动发送)
90 | i0: [必选] cmd命令,支持的命令及参数设置如下。 91 | 92 | |命令值|命令名 | 方向 | 功能| 请求参数 | PubAck回复参数| 93 | |--------|--------|--------|--------|--------|--------| 94 | |100|MEDIA_GET_METADATA | C->S| 获取元数据 | 无 | s0:参考元数据 | 95 | |101|MEDIA_PLAY | C->S| 播放 | 无 | 无参数 | 96 | |102|MEDIA_PAUSE | C->S| 暂停 | 无 | 无参数 | 97 | |103|MEDIA_NEXT | C->S|下一首 | 无 | 无参数 | 98 | |104|MEDIA_PREV | C->S|上一首 | 无 | 无参数 | 99 | |105|MEDIA_SEEK | C->S|跳播 | i1: 跳播位置,单位秒 | 无参数 | 100 | |106|MEDIA_GET_POSITION | C->S|获取播放位置 | 无 | s0: 当前时间(秒):总时间(秒) | 101 | |107|MEDIA_SET_VOLUME | C->S| 设置音量 | i1: 音量值(0~100) | 无参数 | 102 | |108|MEDIA_GET_VOLUME | C->S| 获取音量 | 无 | i1: 音量值(0~100) | 103 | |109|MEDIA_GET_ALL_LOCAL_MEDIA | C->S| 获取所有本地歌曲信息 | 无 | s0:简单音乐元数据数组 | 104 | |110|MEDIA_PLAY_LOCAL_SONG | C->S| 播放本地歌曲 | s0:简单音乐元数据数组 i1:开始播放索引 | 无参数 | 105 | |111|MEDIA_SWITCH_PLAY_MODE | C->S| 切换播放模式,如果是电台类,会提示不支持电台类模式切换 | 无 | 无参数 | 106 | |112|MEDIA_GET_SCENE_MUSICS | C->S| 获取所有场景音乐 | 无 | s0: 简单音乐元数据数组,场景音乐有效字段只有songId, songTitle | 107 | |113|MEDIA_PLAY_SCENE_MUSIC | C->S| 播放场景音乐 | i1:场景音乐id,即元数据中的songId字段 | 无参数 | 108 | |114|MEDIA_PLAY_LOCAL_ONE_SONG | C->S| 播放本地单首歌曲,单曲不循环 | s0:仅一个简单音乐元数据,非数组 | 无参数 | 109 | |115|MEDIA_GET_PLAY_MODE | C->S| 获取当前播放模式 | 无 |
i1: 播放模式
0:重复所有
1:单曲循环
2:随机播放
 | 110 | |116|MEDIA_PLAY_TTS | C->S| 用语音播放TTS文本 | s0:TTS文本 | 无参数 | 111 | |118|MEDIA_PLAY_HINT_PATH | C->S| 播放提示音 | s0:完整的提示音路径 | 无参数 | 112 | |119|MEDIA_GET_AUDIO_SOURCE | C->S| 获取当前的音源 | 无 | s0: 当前的音源 | 113 | |120|MEDIA_SET_AUDIO_SOURCE | C->S| 切换音源 | s0:目标音源 | 无参数 | 114 | |150|MEDIA_REPORT_METADATA | S->C| 反馈元数据 | s0:参考元数据 | Client无需回复 | 115 | |151|MEDIA_REPORT_PlAY_STATE | S->C| 反馈播放状态 | i1: 播放状态
0:暂停
1:正在播放
2:缓冲结束
| Client无需回复 | 116 | |152|MEDIA_REPORT_VOLUME | S->C| 反馈音量 | i1:音量值(0~100) | Client无需回复 | 117 | |153|MEDIA_REPORT_PLAY_MODE | S->C| 反馈当前的播放模式 | i1: 播放模式
0:重复所有
1:单曲循环
2:随机播放
| Client无需回复 | 118 | |154|MEDIA_REPORT_AUDIO_SOURCE | S->C| 反馈当前的音源 | 无 | s0:当前音源
sdcard:本地
bt:蓝牙
online:在线
auxin:外部音频 | 119 | |200|DEVICE_POWER_ON | C->S| 开机 | 无 | 无参数 | 120 | |201|DEVICE_POWER_OFF | C->S| 关机 | 无 | 无参数 | 121 | |202|DEVICE_POWER_REBOOT | C->S| 重启 | 无 | 无参数 | 122 | |203|DEVICE_GET_POWER_STATUS | C->S| 获取开机状态 | 无 | i1: 0表示关机,1表示开机 | 123 | 124 | ##### 元数据 125 | ```json 126 | { 127 | "playState": 1, 128 | "singer": "刘德华", 129 | "songId": "548408", 130 | "songTitle": "爱你一万年", 131 | "songUrl": "http://www.xxx.com/1.mp3", 132 | "volume": 80 133 | } 134 | ``` 135 | ##### 简单音乐元数据 136 | ```json 137 | { 138 | "songId": "548408", 139 | "songTitle": "爱你一万年", 140 | } 141 | ``` 142 | 143 | #### PUBACK 144 | 145 | i0: 跟PUBLISH cmd命令值一致
146 | i1,s0: [可选],如果需要反馈消息 147 | 148 | 回复参数如上表格 149 | 150 | #### PINGREQ 151 | 152 | 无参数 153 | 154 | #### PINGRESP 155 | 156 | 无参数 157 | 158 | #### DISCONNECT 159 | 无参数 160 | 161 | ## 集成&开发 162 | 163 | ### Client端流程 164 | 1. 通过DLNA设备发现发现背景音主机设备 165 | 2. 建立socket链接,TCP连接到设备IP地址的8000端口, 开始socket收发数据,并以换行符作为包分隔符。 166 | 3. 发送CONNECT请求,参考发送数据 `{"type":1,"i0":1,"i1":240}` 167 | 等待Server端反馈连接成功。 参考接收到的数据`{"i0":1,"i1":0,"s0":"OK","seq":0,"type":2}` 168 | 4. 如果连接成功,发送 PUBLISH/MEDIA_GET_METADATA 请求,获取元数据。 参考发送数据`{"type":3,"i0":100,"seq":1}` 169 | 5. 根据播放状态决定是否周期性读取播放位置,如果 s0.playState=1, 发送获取播放位置请求,参考发送数据 `{"type":3,"i0":106,"seq":1}` 170 | 6. 客户端需要在KeepAlive时间周期内发送数据给服务端以维持长连接,否则服务器端超时会主动断开连接。客户端也需要检测PINGREQ/PINGRESP消息或ACK消息是否收到,如果客户端检测到通信链路异常,则需要跟服务端重连。 171 | 7. 接收线程可能监听到元数据、播放状态以及音量改变的消息。 172 | 173 | ### 测试&调试方法 174 | 175 | 1. 进入背景音系统 “设置>网络设置”, 查看ip地址,通过telnet连接背景音系统 176 | > telnet ip地址 8000 177 | 178 | 2. 根据如上"Client端流程",在telnet终端通过命令测试交互 179 | ```c 180 | => telnet 192.168.1.154 8000 181 | Trying 192.168.1.154... 182 | Connected to 192.168.1.154. 183 | Escape character is '^]'. 184 | {"type":1,"i0":1,"i1":240} 185 | {"i0":1,"i1":0,"s0":"OK","seq":0,"type":2} 186 | {"type":3,"i0":101,"seq":1} 187 | {"i0":101,"i1":0,"seq":1,"type":4} 188 | {"i0":150,"i1":0,"s0":"{\"playState\":0,\"singer\":\"Brooke White\",\"songId\":\"1552954\",\"songTitle\":\"Let It Be\",\"songUrl\":\"http://mr3.doubanio.com/87b89194e8858151bf1375eb17c96878/0/fm/song/p1552954_128k.mp3\",\"volume\":40}","seq":0,"type":3} 189 | {"i0":151,"i1":2,"seq":0,"type":3} 190 | {"type":3,"i0":102,"seq":1} 191 | {"i0":151,"i1":0,"seq":0,"type":3} 192 | {"i0":102,"i1":0,"seq":1,"type":4} 193 | ``` 194 | 发送”连接请求“命令 195 | ```c 196 | {"type":1,"i0":1,"i1":240} 197 | ``` 198 | 背景音系统返回 199 | ```c 200 | {"i0":1,"i1":0,"s0":"OK","seq":0,"type":2} 201 | ``` 202 | 发送”播放“命令 203 | ```c 204 | {"type":3,"i0":101,"seq":1} 205 | ``` 206 | 背景音系统返回 207 | ```c 208 | {"i0":101,"i1":0,"seq":1,"type":4} 209 | {"i0":150,"i1":0,"s0":"{\"playState\":0,\"singer\":\"Brooke White\",\"songId\":\"1552954\",\"songTitle\":\"Let It Be\",\"songUrl\":\"http://mr3.doubanio.com/87b89194e8858151bf1375eb17c96878/0/fm/song/p1552954_128k.mp3\",\"volume\":40}","seq":0,"type":3} 210 | {"i0":151,"i1":2,"seq":0,"type":3} 211 | ``` 212 | 发送”暂停“命令 213 | ```c 214 | {"type":3,"i0":102,"seq":1} 215 | ``` 216 | 背景音系统返回 217 | ```c 218 | {"i0":151,"i1":0,"seq":0,"type":3} 219 | {"i0":102,"i1":0,"seq":1,"type":4} 220 | ``` 221 | ## 参考 222 | 223 | ### 常量定义 224 | 为简化开发者工作量,常量定义如下: 225 | ```java 226 | public class JSSSConstant { 227 | public static final int VERSION = 1; 228 | 229 | //JSSS协议命令,type字段 230 | public static final int CONNECT = 1; 231 | public static final int CONNACK = 2; 232 | public static final int PUBLISH = 3; 233 | public static final int PUBACK = 4; 234 | public static final int PINGREQ = 12; 235 | public static final int PINGRESP = 13; 236 | public static final int DISCONNECT = 14; 237 | 238 | //JSSS协议媒体控制命令 239 | public static final int MEDIA_GET_METADATA = 100; 240 | public static final int MEDIA_PLAY = 101; 241 | public static final int MEDIA_PAUSE = 102; 242 | public static final int MEDIA_NEXT = 103; 243 | public static final int MEDIA_PREV = 104; 244 | public static final int MEDIA_SEEK = 105; 245 | public static final int MEDIA_GET_POSITION = 106; 246 | public static final int MEDIA_SET_VOLUME = 107; 247 | public static final int MEDIA_GET_VOLUME = 108; 248 | public static final int MEDIA_GET_ALL_LOCAL_MEDIA = 109; 249 | public static final int MEDIA_PLAY_LOCAL_SONG = 110; 250 | public static final int MEDIA_SWITCH_PLAY_MODE = 111; 251 | public static final int MEDIA_GET_SCENE_MUSICS = 112; 252 | public static final int MEDIA_PLAY_SCENE_MUSIC = 113; 253 | public static final int MEDIA_PLAY_ONCE_LOCAL_SONG = 114; 254 | public static final int MEDIA_GET_PLAY_MODE = 115; 255 | public static final int MEDIA_PLAY_TTS = 116; 256 | public static final int MEDIA_PLAY_HINT_PATH = 118; 257 | public static final int MEDIA_GET_AUDIO_SOURCE = 119; 258 | public static final int MEDIA_SET_AUDIO_SOURCE = 120; 259 | 260 | //JSSS协议媒体状态反馈命令 261 | public static final int MEDIA_REPORT_METADATA = 150; 262 | public static final int MEDIA_REPORT_PlAY_STATE = 151; 263 | public static final int MEDIA_REPORT_VOLUME = 152; 264 | public static final int MEDIA_REPORT_PLAY_MODE = 153; 265 | 266 | //JSSS协议设备控制命令 267 | public static final int DEVICE_POWER_ON = 200; 268 | public static final int DEVICE_POWER_OFF = 201; 269 | public static final int DEVICE_POWER_REBOOT = 202; 270 | public static final int DEVICE_GET_POWER_STATUS = 203; 271 | //JSSS 状态码 272 | public static final int FAIL = -1; 273 | public static final int OK = 0; 274 | } 275 | ``` 276 | 277 | ### 常用命令 278 | 279 | |命令|转换后命令 | 280 | |--------|--------| 281 | |连接请求|{"type":1,"i0":1,"i1":240} | 282 | |播放|{"type":3,"i0":101,"seq":1} | 283 | |暂停|{"type":3,"i0":102,"seq":1} | 284 | |获取元数据|{"type":3,"i0":100,"seq":1} | 285 | |获取播放位置|{"type":3,"i0":106,"seq":1}| 286 | 287 | ## FAQ 288 | 289 | Q: 为什么Server端Socket连接会主动断开
290 | A: 请检查是否在KeepAlive时间内发送过PING或者PUBLISH命令 291 | 292 | Q: 为什么Client发布消息不成功
293 | A: 请检查seq字段是否设置为非0值,并主动递增 294 | 295 | Q: Window 使用 PuTTY 进行测试
296 | A: ![配置连接ip和端口](./pic/PuTTY_11.png)
297 | 发送连接请求{"type":1,"i0":1,"i1":240}
298 | ![发送连接请求](./pic/PuTTY_22.png) 299 | 300 | Q: 获取当前播放的歌曲信息策略
301 | A: Socket连接上之后,只需要发送一次命令 MEDIA_GET_METADATA 获取当前播放的歌曲信息,只要Socket连接一直不断,以后都通过MEDIA_REPORT_PlAY_STATE主动反馈歌曲信息即可。 302 | -------------------------------------------------------------------------------- /JdRS485.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # RS485方式控制背景音主机 4 | 分以下两种方式 5 | - 使用485线连接,发送指令 6 | - 使用udp无线,发送指令 7 | 8 | ``` 9 | 注意:这两种方式都需要去桌面- 设置 - 通用设置 - 485控制设置这里,将485控制开关打开。 10 | ``` 11 | 12 | ## 485指令、udp使用的是一样的协议 13 | 支持以下两种协议 14 | 15 | [声必可智能语控背景音乐系统RS485控制协议](./files/485CtrlBackMusicSysWithAIS.pdf) 16 | - 协议中ID号即房间号,房间号对应的是 "背景音乐主机 桌面设置(齿轮图标)---》通用设置---》485控制设置" 17 | - 协议中组ID为00,不用修改 18 | - [常用0到6号房间485码表](./files/485ExampleCode.xlsx) 19 | 20 | [兼容华尔思背景音乐系统RS485控制协议](./files/485CtrlBackMusicSysWithHES.pdf) 21 | 22 | 23 | 24 | 25 | ## 使用udp无线,发送指令 26 | ### 1. 通过DLNA设备发现发现背景音主机设备, 获得背景音主机IP地址。或者通过其它方式获取背景音主机IP地址 27 | ### 发现协议 28 | 29 | 设备发现采用DLNA的设备发现机制。Client加入组播组并发送SSDP M-SEARCH包到组播地址239.255.255.250:1900端口,也可以直接对当前局域网的广播地址(如192.168.1.255)直接发送SSDP M-SEARCH广播包。参考M-SEARCH包数据如下: 30 | ``` 31 | M-SEARCH * HTTP/1.1 32 | MX: 2 33 | ST: upnp:rootdevice 34 | MAN: "ssdp:discover" 35 | User-Agent: UPnP/1.0 DLNADOC/1.50 JdPlay/1.0.0 36 | Connection: close 37 | Host: 239.255.255.250:1900 38 | ``` 39 | 40 | Client监听到SSDP NOTIFY包,解析包如果含有EXT字段并该字段含有`JDPLAY`关键字,则发现背景音系统,如果版本号大于XXX,则可以通过本协议来控制。 参考NOTIFY包数据如下: 41 | ``` 42 | NOTIFY * HTTP/1.1 43 | Host: 239.255.255.250:1900 44 | Location: http://192.168.1.154:1500/ 45 | Cache-Control: max-age=100 46 | Server: UPnP/1.0 DLNADOC/1.50 EglPlay/1.0.0 47 | BOOTID.UPNP.ORG: 1490004021 48 | EXT: JDPLAY/2.1.1 49 | NTS: ssdp:alive 50 | USN: uuid:10000003816::urn:schemas-upnp-org:device:MediaRenderer:1 51 | NT: urn:schemas-upnp-org:device:MediaRenderer:1 52 | ``` 53 | ### 2. 同背景音乐主机在同一网段, 获得背景音乐主机IP地址, 同此IP地址固定端口28998, 建立udp socket链接并发送485指令 54 | -------------------------------------------------------------------------------- /JdSmartOpenSdk.md: -------------------------------------------------------------------------------- 1 | 2 | # JdSmart设备端智能家居控制接入 3 | * [目录] 4 | * [修订记录](#修订记录) 5 | * [概述](#概述) 6 | * [接入操作指南](#接入操作指南) 7 | * [重点说明](#重点说明) 8 | * [主要类介绍](#主要类介绍) 9 | * [参考示例说明](#参考示例说明) 10 | * [设备命令与设备状态说明](#设备命令与设备状态说明) 11 | * [流程图](#流程图) 12 | 13 | 14 | ## 修订记录 15 | -------- 16 | 17 | | 版本 | 日期 | 修改记录 | 修改人 | 18 | |--------|----------|------------------|--------| 19 | | V1.0.00 | 20161208 | 初始版本 | Luke | 20 | | V1.0.07 | 20170328 | 增加新的设备类型,温湿一体sensor,烟感,CO2 sensor, 无进度窗帘 | Luke | 21 | | V1.1.08 | 20170504 | 支持Bugly升级 | Luke | 22 | | V1.1.09 | 20170515 | 更新混淆文件proguard-rules.pro
支持raw语音,直接将用户语音输出到接口函数 | Luke | 23 | | V1.2.13 | 20170810 | 支持播放TTS文本内容, playTTS(String tts)
新增一些设备类型
修改buggly升级
setFilterVoiceMode 和setVoiceTex被禁用 | Luke | 24 | | V1.2.20 | 20171109 | 重新导入时调用refeshDevice()接口
增加 notifyDevicesChange()通知上层调用getAlldevice接口
增加风扇类型
空调增加左右扫风,上下扫风,除湿模式 | Luke | 25 | | V1.2.21 | 20171118 |
增加摄像头,投影仪,猫眼,晾衣架,扫地机器人| Luke | 26 | | V1.5.08 | 20180129 |
增加彩灯类型
扩充空气净化器和地暖类型指令 | Luke | 27 | | V1.5.11 | 20180815 |
增加一些设备类型
更新android buildtool版本
更多信息请看sdk中changelog | Luke | 28 | | V1.6.0 | 20181223 |
增加选择家庭接口
增加获取当前登录状态接口| MuYang | 29 | 30 | ## 概述 31 | 32 | ### SDK 功能 33 | - 支持各种智能设备开关,普通灯,调光灯,窗帘,插座,空调,空气净化器,开窗器,温控器,各种传感器等 34 | - 获取主机信息,例如主机名称定义 35 | - 支持登入登出智能网关主机 36 | - 控制智能设备 37 | - 创建,编辑,删除场景 38 | - 创建,编辑,删除设备与场景绑定 39 | - 控制场景 40 | 41 | ### 可对接的设备 42 | 43 | * 智能设备:普通灯,调光灯(可调亮度),RGB灯,色温CW灯, RGB+CW灯,开关,插座,窗帘(分为精确获取移动位置和不能获得移动位置两种),空调(红外类型和非红外类型),空气净化器,开窗器,温控器,红外转发器,电视(红外类型),机顶盒(红外类型),多功能控制盒,猫眼,摄像头,投影仪,抽风机,风扇,机械手,新风,地暖,晾衣架,扫地机 44 | * 传感器:温度传感器,湿度传感器,温度湿度一体传感器,紧急按钮,红外入侵检测传感器,门窗磁传感器,水浸传感器,可燃气体传感器,CO监测器,CO2监测器,PM2.5,烟雾传感器 45 | 46 | 47 | ### 智能家居管理界面 48 | 1. 从网盘下载demo, 编译demo, 并在背景音乐主机上安装demo,首次安装完成后需重启一次背景音乐主机。 49 | 2. 进入桌面 → 设置 → 通用设置 → 智能家居设置 → 智能家居管理,在弹出框中输入密码:admin。进入登录界面,如下: 50 | ![智能家居管理](./pic/smarthome_b.png)
51 | 该界面用于第三方智能家居对接平台的网关登录。使用测试demo程序,可输入任意账号和密码。对接工作中,需修改为登录自己网关,以便获取网关上相应的设备和场景等信息。 52 | 3. 登录成功后,进入“智能家居管理”界面,有两种方式导入设备, 分别是“自动获取方式” 和 “自行编辑方式”, 如下图: 53 | ![智能家居管理](./pic/smarthome_a.png)
54 | * 选择“自动获取方式”,点击导入,将网关中的设备按照楼层和房间在界面中显示出来。若设备信息中不包含楼层和房间信息,设备将被放置在默认楼层(一楼)和默认房间(客厅)中。`<建议使用这种方式导入设备>`
55 | 下图展示的是demo中的虚拟设备: 56 | ![智能家居管理](./pic/smarthome_c.png)
57 | * 选择“自行编辑方式”,点击导入,进入房间管理页面,点击右上角 + 图标,添加楼层。点击任意房间,进入设备管理页面,点击右上角 + 图标,添加智能设备。在“添加设备”页面,点击智能设备,会要求选择设备名字,选择后即可添加设备成功,可以在此页面多次添加设备。`该操作将网关中已存在的设备重新分配到不同楼层和房间。`
58 | 房间及设备管理完成后,切换到桌面,右滑到左屏,会显示已添加的智能设备。 59 | ## 接入操作指南 60 | 1. 关注两个类`CustomSmartService` 和 `CustomSmartHost`。
61 | 背景音乐主机内部通过启动CustomSmartService服务来调用CustomSmartHost中的方法,实现对第三方智能家居平台设备信息的读取及控制。 62 | 63 | 2. 对接工作
64 | 智能家居厂商需把控制网关设备与场景的代码,集成到demo中。仅修改CustomSmartHost类,其他的类可不做更改。
65 | initDemoDevices 添加虚拟智能设备、initScenes 添加虚拟场景、initSOSSensorRecord添加虚拟报警记录。 这些数据是为了演示背景音乐智能家居控制流程而专门添加的,可将这三个方法删除,通过你方SDK,获取真正的智能设备和场景。
66 | 根据需求实现CustomSmartHost类中的相关接口,设备类型、场景、控制指令等数据结构需要做相应转化。
67 | 以设备为例,假设你方设备数据结构是AppDevice类,那么要将AppDevice转化为JdSmartDevice,这样在主机上才能显示出来。 68 | 69 | 3. 设备和场景添加成功后,即可进行语音控制,支持的语音参考命令为: 70 | * 开灯: 显示所有的灯设备,供用户选择默认设备 71 | * 打开一楼主卧灯:如果一楼主卧只有一个灯,不管什么名字,直接打开。 72 | * 打开主卧灯:如果默认楼层的主卧里面只有一个灯,不管什么名字,直接打开。 73 | * 打开顶灯:打开默认房间的顶灯 74 | * 执行 xx 场景  (xx表示场景名称) 75 | * xx (xx表示场景名称) 76 | 77 | ## 重点说明 78 | 79 | 1. 通过IJdSmartHost.java接口,JdSmartHostInfo getHostInfo() 可配置主机的能力是否支持登陆,登陆提示信息,是否支持raw语音,是否支持全部场景功能(详情见 getHostInfo函数) 80 | ``` java 81 | mJdSmartHostInfo.setEnableSceneEdit(true);//默认为true
82 | //如果设为false, 则只支持获取场景名,和执行场景,仅需实现getScenes和controlScene两个接口
83 | //如果设为true, 则支持场景所有功能,包括场景编辑,执行,场景绑定编辑,需要实现所有场景相关接口
84 | ``` 85 | 86 | 2. 实现IJdSmartHost.java不同的接口函数,需要将JdSmartScene,JdSmartCtrlCmd,JdSmartDevice这些类转化为你的智能家居对应的类类型。例如, 87 | ``` java 88 | getAllDevices(JdbaseCallback callback)接口中需要将智能家居设备转化为JdSmartDevices  89 | controlDevice(JdSmartCtrlCmd cmd, JdbaseCallback callback) 接口中需要将JdSmartCtrlCmd转化为智能家居设备的执行指令  90 | ``` 91 | 92 | 3. 为简化第三方JdSmartOpen App后续升级及设备管理,第三方App需要通过getAppId()接口设置appId,为简化appid管理,我司不分配具体appid,为保证全球唯一,建议设置为贵司的域名。例如:美的集团设置appid值为 midea.com
93 | 注意每个设备仅能绑定一次,并存入我司后台服务器。   94 | 95 | 4. 可支持bugly升级demo。 要配置升级,不支持热更新 96 | - 请详细查看 https://bugly.qq.com/v2/ 使用帮助,配置自己的版本升级 97 | - 修改MyApplication.java 中APP_ID为自己的APP_ID 98 | 99 | 100 | 5. 为了支持设备一键导入功能, 需要填写zoonID, roomId值, 对应函数为setZoneId(),setRoomId() 101 | ``` java 102 | public class JdSmartDevice { 103 | String deviceType; 104 | String deviceSubType; 105 | String deviceId; 106 | String deviceId2; 107 | String uid; 108 | String deviceName; 109 | String zoneId; //楼层名, 强调说明,这个字段不是id,是楼层名,楼层名(只能是一楼,二楼类似这样的名字) 110 | String roomId; //房间名, 强调说明,这个字段不是id,是房间名 111 | ... 112 | ``` 113 | 6. 一键导入功能的管理界面有个“重新导入”,它会首先调用CustomSmartHost.java 中的refeshDevice()接口, 再调用getAlldevices()接口 114 | 7. notifyDevicesChange 回调,如果设备初始化时间比较长,可以等待设备初始化完成后,调用这个接口,上层将会再次调用getAlldevices()接口去获取新设备 115 | 8. notifySceneChange 回调, 如果场景准备好,或场景名有变化,调用这个接口,上层将会再次调用getScenes()接口去获取最新的场景信息 116 | 9. 设备状态发生改变调用sendUpdateDeviceMessage方法上报UI层刷新状态 117 | 10. 一些设备类型有子类型,像空调,多功能控制盒,灯等,注意区分 118 | 11.mJdSmartHostInfo.setSupportLogin(false) 或 mJdSmartHostInfo.setLoginType(JdSmartLoginConstant.LOGIN_TYPE_DIRECT) 会直接跳过登录页 119 | 120 | ## 主要类介绍 121 | 122 | 123 | ### JdSmartAccount类 124 | 125 | 提供用户登陆智能主机使用。 setName()表示当前登陆的用户名,如果登陆成功,则赋值,如果退出登陆,则设为空字串"" 126 | 127 | ### JdSmartHostInfo类 128 | 129 | ``` java 130 | public void setSupportLogin(boolean supportLogin) 设定是否支持用户登陆 131 | public void setLoginPrompt(String loginPrompt) 设定登陆时显示的品牌名 132 | public void setEnableSceneEdit(boolean enable) 设定是否使能场景编辑,如果false,则仅支持获取和执行场景。如果为true,则是支持全部场景功能 133 | ``` 134 | ~~public void setFilterVoiceMode(String filterVoiceMode) 设定支持raw语音的模式,如果客户想自己处理语音结果,可以设置合适值~~ 135 | 136 | ### JdSmartDevice类 137 | 138 | 抽像表示一个智能设备 139 | 140 | ``` java 141 | setDeviceId() //唯一表示此设备 142 | setDeviceType() //设备类型 143 | //设备子类型 如果设备是红外设备,需要另外设置为子类型JdSmartDeviceType.DEVICE_SUB_TYPE_IR 144 | //如果是多功能控制盒设备,需要另外设置为子类型JdSmartDeviceType.DEVICE_SUB_TYPE_CONTROL_BOX 145 | setDeviceSubType() 146 | //如果是红外设备,设置此设备已学过的红外键列表,键值分隔符为"," 147 | //例如,电视机已经学习了开关,静音键 148 | //则这样调用setJdIRkeyList(JdSmartIRConstant.IR_KEY_TV_ON+"," + JdSmartIRConstant.IR_KEY_TV_OFF+"," + JdSmartIRConstant.IR_KEY_TV_MUTE +","); 149 | setJdIRkeyList() 150 | setDeviceName() //设备名称 151 | getJdSmartCtrlCmd() //会返回一个JdSmartCtrlCmd变量,表示设备当前的状态,详情见JdSmartCtrlCmd类 152 | ``` 153 | 154 | ### JdSmartCtrlCmd类 155 | 156 | 通过deviceId与具体JdSmartDevice设备关联,JdSmartDevice类中同时包含JdSmartCtrlCmd类
157 | 此类包含order,value1,value2,value3,value4,groupData等变量
158 | 有两个含义, 159 | 160 | 1. 智能设备的命令,一般指接收到设备控制命令或场景执行命令时 161 | 2. 设备当前状态,当向UI端更新设备的最新状态时,表示当前状态。 162 | 163 | 更详细信息,见demo 代码CustomSmartHost.java 代码中函数 164 | 165 | ``` java 166 | void controlDevice(JdSmartCtrlCmd cmd, JdbaseCallback callback) 167 | void changeDeviceStatus(JdSmartCtrlCmd cmd, JdSmartDevice dev) 168 | ``` 169 | 170 | 1.如果接收到设备控制命令或场景执行命令时,表示如下
171 | order表示命令,详情见JdSmartDeviceOrder类
172 | value1, value2, value3, value4 表示此命令所带的参数
173 | groupData 是jason字符串,如果设备的命令较复杂,用groupData一次传递传多个参数值
174 | 例如:
175 | 收到开灯命令: 176 | 177 | ``` java 178 | JdSmartCtrlCmd.getOrder()将等于JdSmartDeviceOrder.ON 179 | JdSmartCtrlCmd.getValue1(),因为开灯命令简单不用带参数,不必关注 180 | ``` 181 | 182 | 收到设置空调到下一个模式命令: 183 | 184 | ``` java 185 | JdSmartCtrlCmd.getOrder()将等于JdSmartDeviceOrder.NEXT 186 | JdSmartCtrlCmd.getValue1()将等于AIRCONDITION_MODE_TYPE 187 | ``` 188 | 189 | 2.更新设备最新状态给UI,可以不必处理JdSmartCtrlCmd.order成员变量,表示如下:
190 | value1- value4 表示此设备的当前状态是什么
191 | groupData 是jason字符串,如果设备的命令较复杂,用groupData一次传递传多个值
192 | 例如: 更新灯的当前状态为打开: 193 | 194 | ``` java 195 | JdSmartCtrlCmd.setValue1("0") 196 | ``` 197 | 198 | 更新空调的状态为制冷模式,风速高,左右扫风前,温度28: 199 | 200 | ``` java 201 | JSONObject jobj = new JSONObject(); 202 | jobj.put(JdSmartDeviceOrder.AIRCONDITION_MODE_TYPE, JdSmartDeviceOrder.AIRCONDITION_MODE_COOL); 203 | jobj.put(JdSmartDeviceOrder.AIRCONDITION_WIND_RATE_TYPE, JdSmartDeviceOrder.AIRCONDITION_WIND_RATE_LOW); 204 | jobj.put(JdSmartDeviceOrder.AIRCONDITION_WIND_DIRECTION_TYPE, JdSmartDeviceOrder.AIRCONDITION_WIND_DIRECTION_LEFT_RIGHT); 205 | jobj.put(JdSmartDeviceOrder.TEMPERATURE, "28"); 206 | airConditionCmd.setGroupData(jobj.toJSONString()); 207 | ``` 208 | 209 | ### JdSmartDeviceType类 210 | 211 | 包括开关,普通灯,调光灯,窗帘,插座,空调,电视,空气净化器,开窗器,温控器,多功能控制盒,各种传感器
212 | **注意:**
213 | DEVICE_TYPE_CURTAINS 表示可以精确获取移动位置的窗帘
214 | DEVICE_TYPE_CURTAINS_NO_POSITION 表示不能精确获取移动位置的窗帘 215 | 216 | ### JdSmartDeviceOrder类 217 | 218 | - ON,OFF,灯,开关,插座等简单设备的开与关 219 | - OPEN,CLOSE,MOVE\_TO\_LEVEL窗帘,空调,空气净化器,开窗器,温控器的开与关 220 | - MOVE\_TO\_LEVEL, PAUSE,STOP 表示移动位置,总比是100,例如并开窗帘,则是50,对于空调来说,MOVE\_TO\_LEVEL调整温度 221 | - NEXT 切换到设备的下一个模式。空调设备是直接切换到下一个工作模式,风速等级或风向 222 | - SET 设定设备的某个属性值 223 | - MUTE 静音正在报警的设备 224 | 225 | ### JdSmartScene类 226 | 227 | 表示场景类,有一个唯一sceneNo,标识场景 228 | * getSceneNo()和setSceneNo() //获得和设置场景号 229 | * getSceneId()和setSceneId() //已过时,不建议使用 230 | 231 | ### JdSmartSceneBind类 232 | 233 | 表示场景绑定,它的成员变量sceneNo与JdSmartScene类的sceneNo关联
234 | 场景绑定的含义是,场景中包含哪些设备命令。
235 | 例如,假设有一个回家场景,里面包含动作,当主人回家后,开客厅灯,开电视,开主卧房间空间
236 | 那么将包含4条指令,List getCmdList()将返回4条数据命令 237 | 238 | ## 参考示例说明 239 | ### CustomSmartService.java 240 | 241 | CustomSmartService.java是与其他Jd软件服务通信的服务类, 不需要做任何修改。
242 | 首先在AndroidManifest.xml 中配置启动CustomSmartService.java服务的action名
243 | 244 | ``` java 245 |  //请不要更改这个,因为SDK端依赖这个 246 | ``` 247 | 248 | ``` java 249 | 252 | 253 | 254 | 255 | 256 | ``` 257 | 258 | ### CustomSmartHost.java 259 | 260 | - CustomSmartHost.java是最终实现的类,实现IJdSmartHost.java接口,客户根据自己的SDK实现相应的接口方法,重点在这个文件 261 | - 控制设备接口函数是controlDevice,根据传入的cmd, 智能主机应该控制真正设备。 控制完设备后,设备状态改变,需要更新设备的状态 262 | 263 | ``` java 264 | 265 | public void controlDevice(JdSmartCtrlCmd cmd, JdbaseCallback callback) { 266 | Log.d(TAG, "debug cmd=" + cmd); 267 | if (callback != null) { 268 | callback.onResult(JdbaseContant.RESULT_SUCCESS, "success", ""); 269 | } 270 | changeDeviceStatus(cmd, dev); //更新设备的状态 271 | } 272 | ``` 273 | 274 | IJdSmartHost.java接口 275 | 276 | 主机相关接口 277 | 278 | ``` java 279 |   JdSmartHostInfo getHostInfo() 获取主机信息 280 |   void searchAndBindHost(boolean isSearch, JdbaseCallback callback) 搜索并绑定主机 281 |   void unbindHost(JdbaseCallback callback) 解除绑定  282 | 283 | ``` 284 | 285 | 登录相关接口 286 | 287 | ``` java 288 | JdSmartAccount getAccount()     获取登录的帐户信息 289 |   void login(String name, String pwd, JdbaseCallback callback) 登录 290 |   void logout(JdbaseCallback callback) 退出登录 291 | String getLoginState() 获取当前登录状态 292 | setLoginState(int state, String msg) 设置当前登录状态 293 | ``` 294 | 295 | 场景相关 296 | 297 | ``` java 298 | void controlScene(JdSmartScene jdsmartScene, JdbaseCallback callback)  执行场景 299 | void getScenes(JdbaseCallback callback)      获得所有场景 300 | void createScene(JdSmartScene jdsmartScene, JdbaseCallback callback)   创建场景 301 | void deleteScene(JdSmartScene jdsmartScene, JdbaseCallback callback)   删除场景 302 | void updateScene(JdSmartScene jdsmartScene, JdbaseCallback callback)   修改场景 303 | 304 | ``` 305 | 306 | 场景音乐相关 307 | 308 | ``` java 309 | 使用场景是这样的, 手机端执行场景时,背景音需要播放相对应的场景音乐。 如果背景音乐可以收到手机场景执行的通知,可以在对接包中,调用此接口来播放场景号对应的场景音乐 310 | void playSceneMusicFromSys(String sceneNo) 根据场景id,播放相应的场景音乐 311 | 312 | ``` 313 | 314 | 场景绑定相关 315 | 316 | ``` java 317 | void getSceneBind(JdSmartScene jdsmartScene, JdbaseCallback callback) 获得某个场景的场景绑定 318 | void createSceneBind(List cmds, JdbaseCallback callback) 创建场景绑定 319 | void deleteSceneBind(List cmds, JdbaseCallback callback) 删除场景绑定 320 | void updateSceneBind(List cmds, JdbaseCallback callback) 修改场景绑定 321 | 322 | ``` 323 | 324 | 设备相关 325 | 326 | ``` java 327 | void refeshDevice() 自动导入接口中,重新导入时,会首先调用这个接口 328 | void controlDevice(JdSmartCtrlCmd cmd, JdbaseCallback callback) 执行设备指令 329 | void getAllDevices(JdbaseCallback callback) 获得所有设备信息 330 | void getDeviceDetail(final String deviceID, final JdbaseCallback callback) 获得指定设备信息 331 | JdSmartDevices getDevicesByType(int deviceType) 获得同类型所有设备 332 | void registerDeviceChange(JdbaseCallback callback) 更新设备状态 333 | void getSensorRecord(String deviceid, int pageIndex, int pageSize, JdbaseCallback callback) 获得sensor类型设备的存储记录 334 |    335 | ``` 336 | 337 | ``` java 338 | public interface IJdSmartHost { 339 | void init(Context context); 340 | 341 | JdSmartHostInfo getHostInfo(); 342 | 343 | void login(String name, String pwd, JdbaseCallback callback); 344 | 345 | JdSmartAccount getAccount(); 346 | 347 | void logout(JdbaseCallback callback); 348 | 349 | void searchAndBindHost(boolean isSearch, JdbaseCallback callback); 350 | 351 | void unbindHost(JdbaseCallback callback); 352 | 353 | void getScenes(JdbaseCallback callback); 354 | 355 | void createScene(JdSmartScene jdSmartScene, JdbaseCallback callback); 356 | 357 | void deleteScene(JdSmartScene jdSmartScene, JdbaseCallback callback); 358 | 359 | void updateScene(JdSmartScene jdSmartScene, JdbaseCallback callback); 360 | 361 | void createSceneBind(List cmdList, JdbaseCallback callback); 362 | 363 | void deleteSceneBind(List cmdList, JdbaseCallback callback); 364 | 365 | void updateSceneBind(List cmdList, JdbaseCallback callback); 366 | 367 | void getSceneBind(JdSmartScene jdSmartScene, JdbaseCallback callback); 368 | 369 | void getAllDevices(JdbaseCallback callback); 370 | 371 | void getAllDeviceType(JdbaseCallback callback); 372 | 373 | void getDeviceDetail(String deviceID, JdbaseCallback callback); 374 | 375 | JdSmartDevices getDevicesByType(int type); 376 | 377 | void controlDevice(JdSmartCtrlCmd jdSmartCtrlCmd, JdbaseCallback callback); 378 | 379 | void controlScene(JdSmartScene jdSmartScene, JdbaseCallback callback); 380 | 381 | void getSensorRecord(String deviceid, int pageIndex, int pageSize, JdbaseCallback callback); 382 | 383 | void registerDeviceChange(JdbaseCallback callback); 384 | 385 | String getLoginState() 386 | } 387 | ``` 388 | 389 | ### void init(Context context) 390 | 391 | 当程序运行后,将调用init,可将初始化代码搜索主机,第二次登陆主机(第一次成功登陆,并保存用户名,再次开机后登陆)的代码写此处 392 | 当成功登陆主机后,为了减少网络延时,建议立即获取设备列表 393 | 394 | ``` java 395 | /** 396 | * 初始化部分,当程序运行后,将调用 397 | * 398 | * @param context android上下文 399 | */ 400 | void init(Context context); 401 | ``` 402 | 403 | ### JdSmartHostInfo getHostInfo() 404 | 405 | 返回一个JdSmartHostInfo,表示主机支持的功能 406 | mJdSmartHostInfo = new JdSmartHostInfo(); 407 | mJdSmartHostInfo.setSupportLogin(false); //是否支持用户登陆认证,如果支持则写true, 否则false 408 | mJdSmartHostInfo.setLoginPrompt(“Login”);//登陆提示信息,如果支持登陆,则生效。建议写品牌名 409 | mJdSmartHostInfo.setEnableSceneEdit(true);//默认为true 410 | //如果设为false, 则只支持获取场景名,和执行场景,仅需实现getScenes和controlScene两个接口 411 | //如果设为true, 则支持场景所有功能,包括场景编辑,执行,场景绑定编辑,需要实现所有场景相关接口
412 | mJdSmartHostInfo.setVersion(1);//version不设置,默认是0; 413 | //设为1表示支持在进入房间管理页前显示登录状态页(如果已登录成功,会跳过登录状态页,直接进入房间管理页) 414 | mJdSmartHostInfo.setLoginType(JdSmartLoginConstant.LOGIN_TYPE_ACCOUNT);//设置登录类型 415 | ~~mJdSmartHostInfo.setFilterVoiceMode(JdSmartConstant.FILTER_VOICE_MODE_NONE);//默认为true~~ 416 | ~~//如果设为FILTER_VOICE_MODE_NONE, 则用户不能自己处理语音,setVoiceText()接口将接收不到任何信息~~ 417 | ~~//如果设为FILTER_VOICE_MODE_CONTROL, 则用户仅能处理控制设备的语音,setVoiceText()接口将接收到控制设备的文本~~ 418 | ~~//如果设为FILTER_VOICE_MODE_ALL, 则用户能处理所有语音,setVoiceText()接口将接收所有信息~~ 419 | 420 | ``` java 421 | /** 422 | * 获取主机信息,需要配置JdSmartHostInfo类 423 | * 424 | * @return JdSmartHostInfo 返回主机信息 425 | */ 426 | JdSmartHostInfo getHostInfo(); 427 | ``` 428 | 429 | ### void login(String name, String pwd, JdbaseCallback callback) 430 | 431 | 支持登陆,则需要用户实现,否则直接返回成功,callback.onResult(JdbaseContant.RESULT\_SUCCESS, “success”, ""); 432 | 433 | ``` java 434 | /** 435 | * 用户认证登陆 436 | *
 437 |      * 例如|
 438 |      *    成功 callback.onResult(JdbaseContant.RESULT_SUCCESS, "success", "");
 439 |      *    失败 callback.onResult(JdbaseContant.RESULT_FAIL, "fail", "");
 440 |      *
441 | * @param name 用户名 442 | * @param pwd 密码 443 | * @param callback 回调登陆结果 444 | */ 445 | void login(String name, String pwd, JdbaseCallback callback); 446 | ``` 447 | 448 | ### JdSmartAccount getAccount() 449 | 450 | 返回JdSmartAccount信息 451 | 如果不支持登陆,则JdSmartAccount.name 应该设为““ 452 | 如果未登陆,则JdSmartAccount.name 应该设为””,否则设为当前登陆的用户名,代表已登陆 453 | 454 | ``` java 455 | /** 456 | * 获得已登陆的账户信息 457 | * 458 | * @return 如果未登陆,则JdSmartAccount.name 应该设为"",否则设为当前登陆的用户名,代表已登陆 459 | */ 460 | JdSmartAccount getAccount(); 461 | ``` 462 | 463 | 464 | ### private void setLoginState(int state, String msg) 465 | 466 | 设置当前登录状态 467 | 468 | 469 | ### void logout(JdbaseCallback callback) 470 | 471 | 支持登陆,则需要用户实现,否则直接返回成功,callback.onResult(JdbaseContant.RESULT\_SUCCESS, “success”, ""); 472 | 473 | ``` java 474 | 475 | /** 476 | * 退出登陆 477 | *
 478 |      *例如|
 479 |      *    成功 callback.onResult(JdbaseContant.RESULT_SUCCESS, "success", "");
 480 |      *    失败 callback.onResult(JdbaseContant.RESULT_FAIL, "fail", "");
 481 |      *
482 | * @param callback 回调退出信息 483 | * 484 | */ 485 | void logout(JdbaseCallback callback); 486 | ``` 487 | 488 | ### void searchAndBindHost(boolean isSearch, JdbaseCallback callback) 489 | 490 | 一般不用实现,请不要改动 491 | 支持搜索主机时,实现此接口,如果不支持,直接返回成功,callback.onResult(JdbaseContant.RESULT\_SUCCESS, “success”, ""); 492 | 493 | ``` java 494 | /** 495 | * 搜索,并绑定主机网关 496 | *
 497 |      *例如|
 498 |      *    callback.onResult(JdbaseContant.RESULT_SUCCESS, "网关信息", "");
 499 |      * 
500 | * @param isSearch 是否动态搜索 501 | * @param callback 回调搜索结果 502 | */ 503 | void searchAndBindHost(boolean isSearch, JdbaseCallback callback); 504 | ``` 505 | 506 | ### void unbindHost(JdbaseCallback callback) 507 | 508 | 从主机网关解除所有设备与场景,这是危险操作,建议不实现,callback.onResult(JdbaseContant.RESULT\_SUCCESS, “success”, ""); 509 | 510 | ``` java 511 | /** 512 | * 从主机网关解除所有设备与场景,危险操作 513 | *
 514 |      * 例如|
 515 |      *     callback.onResult(JdbaseContant.RESULT_SUCCESS, "success", "");
 516 |      * 
517 | * @param callback 回调结果 518 | */ 519 | void unbindHost(JdbaseCallback callback); 520 | ``` 521 | 522 | ### public void selectFamily(String familyID, JdbaseCallback callback) 523 | 524 | 选择家庭,以显示该家庭下的所有设备 525 | 526 | 527 | ### void getScenes(JdbaseCallback callback) 528 | 529 | 获取所有场景信息,场景信息通过json字符串返回。 530 | 531 | ``` java 532 | /** 533 | * 获取所有场景 534 | *
 535 |      * 例如|
 536 |      * JdSmartScenes jss = new JdSmartScenes();
 537 |      * for(Scenexxxx s| list){
 538 |      *      JdSmartScene js = new JdSmartScene();
 539 |      *      js.setSceneNo(s.getNo());
 540 |      *      js.setSceneId(s.getId()+"");
 541 |      *      js.setSceneName(s.getName());
 542 |      *      js.setVendor(xxxxx);
 543 |      *      jss.addScene(js);
 544 |      * }
 545 |      * callback.onResult(JdbaseContant.RESULT_SUCCESS, JSON.toJSONString(jss), "");
 546 |      * 
547 | * @param callback 回调结果 548 | * 549 | */ 550 | void getScenes(JdbaseCallback callback); 551 | ``` 552 | 553 | ### void createScene(JdSmartScene jdsmartScene, JdbaseCallback callback) 554 | 555 | 创建一个场景,传入的仅是一个jdsmartScene,里面包含新场景名。 556 | 实现时,注意检查是否存在相同的场景名。  557 | 558 | ``` java 559 | /** 560 | * 创建场景 561 | *
 562 |      * 例如|
 563 |      *     JdSmartScene js = new JdSmartScene();
 564 |      *     js.setSceneName("xxx"); //与传入的场景名一致
 565 |      *     js.setSceneNO(xxxxId() + "");
 566 |      *     callback.onResult(JdbaseContant.RESULT_SUCCESS, JSON.toJSONString(js), "");
 567 |      * 
568 | * @param jdsmartScene 创建的场景, 根据场景的名字screneName创建 569 | * @param callback 回调创建结果 570 | */ 571 | void createScene(JdSmartScene jdsmartScene, JdbaseCallback callback); 572 | ``` 573 | 574 | ### void deleteScene(JdSmartScene jdsmartScene, JdbaseCallback callback) 575 | 576 | 根据场景号或场景名删除一个场景 577 | 578 | ``` java 579 | /** 580 | * 删除场景 581 | *
 582 |      * 例如|
 583 |      *     callback.onResult(JdbaseContant.RESULT_SUCCESS, "success", "");
 584 |      *     callback.onResult(JdbaseContant.RESULT_FAIL, "fail", "");
 585 |      * 
586 | * @param jdsmartScene 删除的场景, 需要根据jdsmartScene.getSceneNo()删除场景 587 | * @param callback 回调删除结果 588 | */ 589 | void deleteScene(JdSmartScene jdsmartScene, JdbaseCallback callback); 590 | ``` 591 | 592 | ### void updateScene(JdSmartScene jdsmartScene, JdbaseCallback callback) 593 | 594 | 更改场景名字 595 | 596 | ``` java 597 | /** 598 | * 修改场景 599 | *
 600 |      * 例如|
 601 |      *    callback.onResult(JdbaseContant.RESULT_SUCCESS, "success", "");
 602 |      *    callback.onResult(JdbaseContant.RESULT_FAIL, "fail", "");
 603 |      * 
604 | * @param jdsmartScene 修改的场景, 需要根据jdsmartScene.getSceneNo()删除场景 605 | * @param callback 回调修改的结果 606 | */ 607 | void updateScene(JdSmartScene jdsmartScene, JdbaseCallback callback); 608 | ``` 609 | 610 | ### void createSceneBind(List cmds, JdbaseCallback callback) 611 | 612 | 创建一个场景绑定。 “场景绑定”是一个名词,表示一些设备与某个场景结合在一起。 613 | JdSmartCtrlCmd 表示一个设备的指令操作,就是将这些设备的指令操作与场景结合在一起。 614 | 615 | ``` java 616 | /** 617 | * 创建场景绑定 618 | *
 619 |      * 例如|
 620 |      *     callback.onResult(JdbaseContant.RESULT_SUCCESS, "success", "");
 621 |      *     callback.onResult(JdbaseContant.RESULT_FAIL, "fail", "");
 622 |      * 
623 | * @param cmds 绑定到场景的命令列表 624 | * @param callback 回调绑定结果 625 | */ 626 | void createSceneBind(List cmds, JdbaseCallback callback); 627 | ``` 628 | 629 | ### void deleteSceneBind(List cmds, JdbaseCallback callback) 630 | 631 | 删除场景绑定 632 | 633 | ``` java 634 | /** 635 | * 删除场景绑定 636 | *
 637 |      * 例如|
 638 |      *    callback.onResult(JdbaseContant.RESULT_SUCCESS, "success", "");
 639 |      *    callback.onResult(JdbaseContant.RESULT_FAIL, "fail", "");
 640 |      * 
641 | * @param cmds 删除的场景的命令列表 642 | * @param callback 回调删除结果 643 | */ 644 | void deleteSceneBind(List cmds, JdbaseCallback callback); 645 | ``` 646 | 647 | ### void updateSceneBind(List cmds, JdbaseCallback callback) 648 | 649 | 修改场景绑定 650 | 651 | ``` java 652 | /** 653 | * 修改场景绑定 654 | *
 655 |      * 例如:
 656 |      *     callback.onResult(JdbaseContant.RESULT_FAIL, "fail", "");
 657 |      *     callback.onResult(JdbaseContant.RESULT_SUCCESS, "success", "");
 658 |      * 
659 | * @param cmds 修改的场景的命令列表 660 | * @param callback 回调删除结果 661 | */ 662 | void updateSceneBind(List cmds, JdbaseCallback callback); 663 | ``` 664 | 665 | ### void getSceneBind(JdSmartScene jdsmartScene, JdbaseCallback callback) 666 | 667 | 获得场景的所有场景绑定信息 668 | 669 | ``` java 670 | /** 671 | * 获取场景绑定 672 | *
 673 |      * 例如|
 674 |      *     JdSmartDevices jds = new JdSmartDevices();
 675 |      *     JdSmartDevice device1 = new JdSmartDevice();
 676 |      *     JdSmartDevice device2 = new JdSmartDevice();
 677 |      *     jds.addDevice(device1);
 678 |      *     jds.addDevice(device2);
 679 |      *     callback.onResult(JdbaseContant.RESULT_SUCCESS, JSON.toJSONString(jds), "");
 680 |      * 
681 | * @param jdsmartScene 场景 682 | * @param callback 回调结果 683 | */ 684 | void getSceneBind(JdSmartScene jdsmartScene, JdbaseCallback callback); 685 | ``` 686 | 687 | ### void getAllDevices(JdbaseCallback callback) 688 | 689 | 获取所有设备 690 | 691 | ``` java 692 | 693 | /** 694 | * 获取所有设备列表 695 | *
 696 |      * 例如|
 697 |      *    JdSmartDevices jds = new JdSmartDevices();
 698 |      *    JdSmartDevice device1 = new JdSmartDevice();
 699 |      *    JdSmartDevice device2 = new JdSmartDevice();
 700 |      *    jds.addDevice(device1);
 701 |      *    jds.addDevice(device2);
 702 |      *    callback.onResult(JdbaseContant.RESULT_SUCCESS, JSON.toJSONString(jds), "");
 703 |      * 
704 | * @param callback 回调结果 705 | */ 706 | void getAllDevices(JdbaseCallback callback); 707 | ``` 708 | 709 | ### void getAllDeviceType(JdbaseCallback callback) 710 | 711 | 获得所有的设备类型值,注意是所有在线的设备类型值 712 | 713 | ``` java 714 | /** 715 | * 得到所有的设备类型值 716 | *
 717 |      * 例如|
 718 |      *    List result = new ArrayList();
 719 |      *    JdSmartDevice device1 = new JdSmartDevice();
 720 |      *    JdSmartDevice device2 = new JdSmartDevice();
 721 |      *    result.add(device1.getDeviceType());
 722 |      *    result.add(device2.getDeviceType());
 723 |      *    callback.onResult(JdbaseContant.RESULT_SUCCESS, JSON.toJSONString(result), "");
 724 |      * 
725 | * @param callback 回调类型列表 726 | */ 727 | void getAllDeviceType(JdbaseCallback callback); 728 | ``` 729 | 730 | ### JdSmartDevices getDevicesByType(int deviceType) 731 | 732 | 获取同类型的所有设备 733 | 734 | ``` java 735 | /** 736 | * 获取同类型的所有设备 737 | * @param deviceType 设备类型值, 来自于JdSmartDevice.getDeviceType() 738 | * @return JdSmartDevices 直接返回相同类型所有设备 739 | */ 740 | JdSmartDevices getDevicesByType(int deviceType); 741 | ``` 742 | 743 | ### void getDeviceDetail(String deviceID, JdbaseCallback callback) 744 | 745 | 获取某个指定devId的设备 746 | 747 | ``` java 748 | /** 749 | * 获取某个指定devId的设备 750 | *
 751 |      * 例如|
 752 |      *     callback.onResult(JdSmartConstant.RESULT_SUCCESS, JSON.toJSONString(jdSmartDevice), "")
 753 |      * 
754 | * @param deviceID 设备的devId, 或者 JdSmartDevice的json字符串 755 | * @param callback 回调结果 756 | */ 757 | void getDeviceDetail(String deviceID, JdbaseCallback callback); 758 | ``` 759 | 760 | ### void controlDevice(JdSmartCtrlCmd cmd, JdbaseCallback callback) 761 | 762 | 控制设备,cmd里order表示要执行的操作指令, value1, value2, value3, value4表示命令参数 763 | 764 | ``` java 765 | /** 766 | * 控制设备 767 | *
 768 |      * 例如|
 769 |      *     callback.onResult(JdbaseContant.RESULT_SUCCESS, "success", "");
 770 |      *     callback.onResult(JdbaseContant.RESULT_FAIL, "fail", "");
 771 |      * 
772 | * @param cmd 设备命令 773 | * @param callback 回调控制结果 774 | */ 775 | void controlDevice(JdSmartCtrlCmd cmd, JdbaseCallback callback); 776 | ``` 777 | 778 | ### void controlScene(JdSmartScene jdsmartScene, JdbaseCallback callback) 779 | 780 | 控制场景 781 | 782 | ``` java 783 | /** 784 | * 控制场景 785 | *
 786 |      * 例如:
 787 |      *     callback.onResult(JdbaseContant.RESULT_SUCCESS, "success", "");
 788 |      *     callback.onResult(JdbaseContant.RESULT_FAIL, "fail", "");
 789 |      * 
790 | * @param jdsmartScene 场景 791 | * @param callback 负责回调新的设备信息给上层 792 | */ 793 | void controlScene(JdSmartScene jdsmartScene, JdbaseCallback callback); 794 | ``` 795 | 796 | ### void getSensorRecord(String deviceid, int pageIndex, int pageSize, JdbaseCallback callback) 797 | 798 | 获取感应器记录的内容,因为内容可能很多,所以根据页索引,页大小返回数据 799 | 800 | ``` java 801 | /** 802 | * 获取感应器记录的内容 803 | *
 804 |      * 例如:
 805 |      *     List result = new ArrayList();
 806 |      *     JdSmartSensorRecord record1 = new JdSmartSensorRecord();
 807 |      *     JdSmartSensorRecord record2 = new JdSmartSensorRecord();
 808 |      *     result.add(record1);
 809 |      *     result.add(record2);
 810 |      *     callback.onResult(JdbaseContant.RESULT_SUCCESS,  JSON.toJSONString(result), "");
 811 |      * 
812 | * @param deviceid 设备ID 813 | * @param pageIndex 页码,从1开始 814 | * @param pageSize 每页的数量 815 | * @param callback 回调信息给上层 816 | */ 817 | void getSensorRecord(String deviceid, int pageIndex, int pageSize, JdbaseCallback callback); 818 | ``` 819 | 820 | ### void registerDeviceChange(JdbaseCallback callback) 821 | 822 | 当设备信息有变化时,通过callback上传设备信息 823 | 824 | ``` java 825 | /** 826 | * 当设备信息有变化时,应该调用回调 827 | *
 828 |      * 例如|
 829 |      *     callback.onResult(JdSmartConstant.ACTION_REPORT_DEVICE_STATUS, JSON.toJSONString(jdSmartDevice), "")
 830 |      * 
831 | * @param callback 负责回调新的设备信息给上层 832 | */ 833 | void registerDeviceChange(JdbaseCallback callback); 834 | ``` 835 | 836 | 837 | 838 | ## 设备命令与设备状态说明 839 | 840 | ### 设备命令 841 | 开关类型设备(灯,开关,插座,电视,机顶盒,机械手) 842 | 843 | | 操作 | order | value1| value2 | value3 | value4 | groupData | 844 | | :----: | :----: | :----: | :----: | :----: | :----: | :----: | 845 | | 打开 | ON | | | | | | 846 | | 关闭 | OFF | | | | | | 847 | 848 | 调光灯 849 | 850 | | 操作 | order | value1| value2 | value3 | value4 | groupData | 851 | | :----: | :----: | :----: | :----: | :----: | :----: | :----: | 852 | | 打开 | ON | | | | | | 853 | | 关闭 | OFF | | | | | | 854 | | 移动 | MOVE_TO_LEVEL | |亮度值,最高值255 || | | 855 | 856 | 857 | 调色灯(RGB灯,色温CW灯, RGB+CW灯) 858 | 859 | | 操作 | order | value1| value2 | value3 | value4 | groupData | 860 | | :----: | :----: | :----: | :----: | :----: | :----: | :----: | 861 | | 打开 | ON | | | | | | 862 | | 关闭 | OFF | | | | | | 863 | | 闪光变色模式 | SET | COLOR_LAMP_MODE_FLASH | | | | | 864 | | RGB模式 | SET | COLOR_LAMP_MODE_RGB | rgb颜色值 | 亮度值 | 饱和度值 | | 865 | | CW模式 | SET | COLOR_LAMP_MODE_CW | cw色温值 | 亮度值 | | | 866 | 867 | 风扇 868 | 869 | | 操作 | order | value1| value2 | value3 | value4 | groupData | 870 | | :----: | :----: | :----: | :----: | :----: | :----: | :----: | 871 | | 打开 | OPEN | | | | | | 872 | | 关闭 | CLOSE | | | | | | 873 | | 开始摇头  | SET   | FAN_START_PIVOT   |       |       | |       | 874 | | 停止摇头  | SET   | FAN_STOP_PIVOT   |       |       | |       | 875 | 876 | 新风/热水器/投影仪 877 | 878 | | 操作 | order | value1| value2 | value3 | value4 | groupData | 879 | | :----: | :----: | :----: | :----: | :----: | :----: | :----: | 880 | | 打开 | OPEN | | | | | | 881 | | 关闭 | CLOSE | | | | | | 882 | 883 | 884 | 多功能控制盒/无进度窗帘/开窗器 885 | 886 | | 操作 | order | value1| value2 | value3 | value4 | groupData | 887 | | :----: | :----: | :----: | :----: | :----: | :----: | :----: | 888 | | 打开 | OPEN | | | | | | 889 | | 关闭 | CLOSE | | | | | | 890 | | 暂停 | STOP | | | | | | 891 | 892 | 有开关和一个进度属性的设备(有进度窗帘,温控器等) 893 | 894 | | 操作 | order | value1| value2 | value3 | value4 | groupData | 895 | | :----: | :----: | :----: | :----: | :----: | :----: | :----: | 896 | | 打开 | OPEN | | | | | | 897 | | 关闭 | CLOSE | | | | | | 898 | | 移动 | MOVE_TO_LEVEL| 移动比例,例如10, 表示移动10% | | | | | 899 | | 停止移动| STOP | | | | | | 900 | 901 | 警报设备 902 | 903 | | 操作 | order | value1| value2 | value3 | value4 | groupData | 904 | | :----: | :----: | :----: | :----: | :----: | :----: | :----: | 905 | | 关闭警报 | MUTE | | | | | | 906 | 907 | 猫眼和摄像头
908 | 当打开猫眼设备时,会发送intent, action为"com.judian.action.goto.cat.camera"
909 | 当打开摄像头设备时,会发送intent, action为"com.judian.action.goto.camera"
910 | 并且都带有扩展参数"camera_id" 包含设备的id信息
911 | 912 | | 操作 | order | value1| value2 | value3 | value4 | groupData | 913 | | :----: | :----: | :----: | :----: | :----: | :----: | :----: | 914 | | 打开 | ON | | | | | | 915 | | 关闭 | OFF | | | | | | 916 | 917 | 扫地机器人 918 | 919 | 920 | | 操作 | order | value1| value2 | value3 | value4 | groupData | 921 | | :----: | :----: | :----: | :----: | :----: | :----: | :----: | 922 | | 打开 | OPEN | | | | | | 923 | | 关闭 | CLOSE | | | | | | 924 | | 清扫模式|SET|SWEEPER_MACHINE_SWEEPER_MODE | | | | | 925 | | 自动模式|SET|SWEEPER_MACHINE_AUTO_MODE||||| 926 | | 强力模式|SET|SWEEPER_MACHINE_FORCE_MODE|| | | | 927 | | 静音模式|SET|SWEEPER_MACHINE_MUTE_MODE | | | | | 928 | | 标准模式|SET|SWEEPER_MACHINE_NORMAL_MODE | | | | | 929 | | 回充模式|SET|SWEEPER_MACHINE_CHARGE_MODE | | | || 930 | 931 | 空气净化器 932 | 933 | 934 | | 操作 | order | value1| value2 | value3 | value4 | groupData | 935 | | :----: | :----: | :----: | :----: | :----: | :----: | :----: | 936 | | 打开 | OPEN | | | | | | 937 | | 关闭 | CLOSE | | | | | | 938 | | 自动模式|SET|AIRPURIFIER_ORDER_MODE_AUTO||||| 939 | | 手动模式|SET|AIRPURIFIER_ORDER_MODE_MANUAL|| | | | 940 | | 休眠模式|SET|AIRPURIFIER_ORDER_MODE_SLEEP | | | | | 941 | | 设为高风|SET|AIRPURIFIER_ORDER_WIND_HIGHT | | | | | 942 | | 设为中风|SET|AIRPURIFIER_ORDER_WIND_MID | | | || 943 | | 设为低风|SET|AIRPURIFIER_ORDER_WIND_LOW | | | | | 944 | 945 | 地暖 946 | 947 | | 操作 | order | value1| value2 | value3 | value4 | groupData | 948 | | :----: | :----: | :----: | :----: | :----: | :----: | :----: | 949 | | 打开 | OPEN | | | | | | 950 | | 关闭 | CLOSE | | | | | | 951 | | 移动 | MOVE_TO_LEVEL| 温度值 | | | | | 952 | | 自动模式|SET|FLOOR_HEATING_ORDER_MODE_AUTO||||| 953 | | 手动模式|SET|FLOOR_HEATING_ORDER_MODE_MANUAL|| | | | 954 | | 休眠模式|SET|FLOOR_HEATING_ORDER_MODE_SLEEP | | | | | 955 | 956 | 957 | 智能晾衣架 958 | 959 | 960 | | 操作 | order | value1| value2 | value3 | value4 | groupData | 961 | | :----: | :----: | :----: | :----: | :----: | :----: | :----: | 962 | | 打开 | OPEN | | | | | | 963 | | 关闭 | CLOSE|| | | | | 964 | | 上升|SET|CLOTHES_HANGER_ORDER_MOVE_UP ||||| 965 | | 停止|SET|CLOTHES_HANGER_ORDER_MOVE_STOP||||| 966 | | 下降|SET|CLOTHES_HANGER_ORDER_MOVE_DOWN ||||| 967 | | 开灯|SET|CLOTHES_HANGER_ORDER_LIGHT_ON || | || 968 | | 关灯|SET| CLOTHES_HANGER_ORDER_LIGHT_OFF ||| | | 969 | | 烘干开|SET| CLOTHES_HANGER_ORDER_HEAT_ON |||| | 970 | | 烘干关|SET| CLOTHES_HANGER_ORDER_HEAT_OFF| || || 971 | | 风干开|SET| CLOTHES_HANGER_ORDER_WIND_ON| || || 972 | | 风干关|SET| CLOTHES_HANGER_ORDER_WIND_OFF| || || 973 | | 消毒开|SET| CLOTHES_HANGER_ORDER_DESINFECTION_ON ||| || 974 | | 消毒关|SET| CLOTHES_HANGER_ORDER_DESINFECTION_OFF||| || 975 | 976 | 空调设备 977 | 978 | 979 | | 操作 | order | value1| value2 | value3 | value4 | groupData | 980 | | :----: | :----: | :----: | :----: | :----: | :----: | :----: | 981 | | 打开 | OPEN | | | | | | 982 | | 关闭 | CLOSE | | | | | | 983 | | 调整温度|MOVE_TO_LEVEL| 温度值,例如26,
表示调置为26度| | | | | 984 | | 切换到指定工作模式|SET|AIRCONDITION_
MODE_TYPE|工作模式值,例如,
AIRCONDITION_
MODE_COOL|||| 985 | | 切换到指定风速模式|SET|AIRCONDITION_
WIND_RATE_TYPE |风速模式,例如,
AIRCONDITION_
WIND_RATE
_MIDDLE| | | | 986 | | 切换到指定扫风模式|SET|AIRCONDITION_
WIND_DIRECTION
_TYPE |扫风模式,例如,
AIRCONDITION_WIND
_DIRECTION_
LEFT_RIGHT| | | | 987 | | 直接切换到下一个工作模式| NEXT | AIRCONDITION_
MODE_TYPE | | | | | 988 | | 直接切换到下一个风速模式| NEXT | AIRCONDITION_
WIND_RATE_TYPE | | | | | 989 | | 直接切换到下一个扫风模式| NEXT | AIRCONDITION_
WIND_DIRECTION
_TYPE | | | || 990 | 991 | 992 | ### 设备状态 993 | 开关类型设备(灯,开关,插座,电视,机顶盒,新风,热水器,投影仪) 994 | 995 | | value1| value2| value3| value4| groupData| 996 | |:----:| :----:|:----:|:----: |:----: | 997 | |0: 表示打开
-1:表示关闭||||| 998 | 999 | 风扇 1000 | 1001 | | value1| value2| value3| value4| groupData| 1002 | |:----:| :----:|:----:|:----: |:----: | 1003 | |0: 表示打开
-1:表示关闭|填写开始摇头/停止摇头|||| 1004 | 1005 | 调光灯 1006 | 1007 | | value1| value2| value3| value4| groupData| 1008 | |:----:| :----:|:----:|:----: |:----: | 1009 | |0: 表示打开
-1:表示关闭|填写亮度值,最高值255|||| 1010 | 1011 | 调色灯(RGB灯,色温CW灯, RGB+CW灯) 1012 | 1013 | | value1| value2| value3| value4| groupData| 1014 | |:----:| :----:|:----:|:----: |:---- | 1015 | | 填写0表示打开
填写-1表示关闭 |||| json 字符串,依据不同模式类型,键值各不相同。
JSONObject jobj = new JSONObject()
jobj.put(JdSmartDeviceOrder.COLOR_LAMP_MODE,JdSmartDeviceOrder.COLOR_LAMP_MODE_RGB)//RGB模式
jobj.put(JdSmartDeviceOrder.COLOR_LAMP_RGB_VALUE, "#0a0b0c")//颜色值为#0a0b0c
jobj.put(JdSmartDeviceOrder.COLOR_LAMP_RGB_BRIGHT, "250") //亮度为250
jobj.put(JdSmartDeviceOrder.COLOR_LAMP_RGB_SATURATION, "10") //饱和度为10

JSONObject jobj = new JSONObject()
jobj.put(JdSmartDeviceOrder.COLOR_LAMP_MODE,JdSmartDeviceOrder.COLOR_LAMP_MODE_CW)//cw模式
jobj.put(JdSmartDeviceOrder.COLOR_LAMP_CW_VALUE, "50")//色值为50
jobj.put(JdSmartDeviceOrder.COLOR_LAMP_CW_BRIGHT, "250") //亮度为250

JSONObject jobj = new JSONObject()
jobj.put(JdSmartDeviceOrder.COLOR_LAMP_MODE,JdSmartDeviceOrder.COLOR_LAMP_MODE_FLASH)//闪光自动变色模式| 1016 | 1017 | 多功能控制盒/无进度窗帘 1018 | 1019 | | value1| value2| value3| value4| groupData| 1020 | |:----:| :----:|:----:|:----: |:----: | 1021 | |当前移动位置(只有0和100两个进度值)
0:表示关闭,100:表示打开,
50或其它值表示中途暂停 ||||| 1022 | 1023 | 1024 | 有开关和一个进度属性的设备(有进度窗帘,有进度开窗器等) 1025 | 1026 | | value1| value2| value3| value4| groupData| 1027 | |:----:| :----:|:----:|:----: |:----: | 1028 | |当前移动位置(0~100)
例如填写10, 表示移动10%, 0表示关闭,100表示打开||||| 1029 | 1030 | 1031 | 门磁、窗磁、水浸 1032 | 1033 | | value1| value2| value3| value4| groupData| 1034 | |:----:| :----:|:----:|:----: |:----: | 1035 | | 填写0表示关闭,不需要报警
填写1表示打开,需要报警||填写0表示低电量
填写1表示正常电量 | 填写电量值| 1036 | 1037 | 烟感 1038 | 1039 | | value1| value2| value3| value4| groupData| 1040 | |:----:| :----:|:----:|:----: |:----: | 1041 | | 填写0表示不报警
填写1表示报警 | | 填写0表示低电量
填写1表示正常电量 | 填写电量值 | 1042 | 1043 | 人体红外 1044 | 1045 | | value1| value2| value3| value4| groupData| 1046 | |:----:| :----:|:----:|:----: |:----: | 1047 | |填写0表示没有报警
填写1表示检测到入侵,需要报警 |填写1表示入侵的人一直存在
填写0表示没有检测到入侵持续存在|填写0表示低电量
填写1表示正常电量| 填写电量值 | 1048 | 1049 | 温度或湿度传感器 1050 | 1051 | | value1| value2| value3| value4| groupData| 1052 | |:----:| :----:|:----:|:----: |:----: | 1053 | |填写温度,乘以100值| 填写湿度值,乘以100 | |填写电量值(-1表示此设备不是电池供电的设备) | 1054 | 1055 | 照度 1056 | 1057 | | value1| value2| value3| value4| groupData| 1058 | |:----:| :----:|:----:|:----: |:----: | 1059 | |填写传感器上报的测量值MeasuredValue ||| 填写电量值 | 1060 | 1061 | 1062 | 扫地机器人 1063 | 1064 | | value1| value2| value3| value4| groupData| 1065 | |:----:| :----:|:----:|:----: |:---- | 1066 | | 填写0表示打开
填写-1表示关闭 |||| json 字符串,键值分别为工作状态值
JSONObject jobj = new JSONObject()
//工作于清扫模式
jobj.put(JdSmartDeviceOrder.SWEEPER_MACHINE_STATUS, JdSmartDeviceOrder.SWEEPER_MACHINE_SWEEPER_MODE)
| 1067 | 1068 | 空气净化器 1069 | 1070 | | value1| value2| value3| value4| groupData| 1071 | |:----:| :----:|:----:|:----: |:---- | 1072 | | 填写0表示打开
填写-1表示关闭 |||| json 字符串,键值分别为工作模式,风速等级,PM25,温度,湿度,空气质量等级
JSONObject jobj = new JSONObject()
//工作模式
jobj.put(JdSmartDeviceOrder.AIRPURIFIER_STATUS_MODE, JdSmartDeviceOrder.AIRPURIFIER_ORDER_MODE_AUTO)
//自动工作模式
jobj.put(JdSmartDeviceOrder.AIRPURIFIER_STATUS_WIND,
JdSmartDeviceOrder.AIRPURIFIER_ORDER_WIND_MID)
//中风
jobj.put(JdSmartDeviceOrder.AIRPURIFIER_STATUS_PM25,"50")
//PM2.5 50
jobj.put(JdSmartDeviceOrder.AIRPURIFIER_STATUS_TEMP, "26")
//温度26度
jobj.put(JdSmartDeviceOrder.AIRPURIFIER_STATUS_HUMIDITY,"60")//湿度60
jobj.put(JdSmartDeviceOrder.AIRPURIFIER_STATUS_AQI,"一级(优)")//空气质量等级 | 1073 | 1074 | 地暖 1075 | 1076 | | value1| value2| value3| value4| groupData| 1077 | |:----:| :----:|:----:|:----: |:---- | 1078 | | 填写0表示打开
填写-1表示关闭 |||| json 字符串,键值分别为工作模式,当前温度
JSONObject jobj = new JSONObject()
jobj.put(JdSmartDeviceOrder.FLOOR_HEATING_STATUS_MODE, JdSmartDeviceOrder.FLOOR_HEATING_ORDER_MODE_AUTO) //工作于自动模式
jobj.put(JdSmartDeviceOrder.FLOOR_HEATING_STATUS_TEMP, "26")//当前温度26
| 1079 | 1080 | 智能晾衣架 1081 | 1082 | | value1| value2| value3| value4| groupData| 1083 | |:----:| :----:|:----:|:----: |:---- | 1084 | | 填写0表示打开
填写-1表示关闭 |||| json 字符串,键值分别为移动状态,消毒状态,烘干状态,灯状态,风状态
JSONObject jobj = new JSONObject()
//移动状态
jobj.put(JdSmartDeviceOrder.CLOTHES_HANGER_STATUS_MOVE, JdSmartDeviceOrder.CLOTHES_HANGER_ORDER_MOVE_STOP)
//消毒状态
jobj.put(JdSmartDeviceOrder.CLOTHES_HANGER_STATUS_DESINFECTION,
JdSmartDeviceOrder.CLOTHES_HANGER_ORDER_DESINFECTION_OFF)
//烘干状态
jobj.put(JdSmartDeviceOrder.CLOTHES_HANGER_STATUS_HEAT,
JdSmartDeviceOrder.CLOTHES_HANGER_ORDER_HEAT_OFF)
//灯状态
jobj.put(JdSmartDeviceOrder.CLOTHES_HANGER_STATUS_LIGHT,
JdSmartDeviceOrder.CLOTHES_HANGER_ORDER_LIGHT_OFF)
//风状态
jobj.put(JdSmartDeviceOrder.CLOTHES_HANGER_STATUS_WIND,
JdSmartDeviceOrder.CLOTHES_HANGER_ORDER_WIND_OFF)| 1085 | 1086 | 空调设备 1087 | 1088 | | value1| value2| value3| value4| groupData| 1089 | |:----:| :----:|:----:|:----: |:---- | 1090 | | 填写0表示打开
填写-1表示关闭 |||| json 字符串,键值分别为温度,空调模式,风速,风向
JSONObject jobj = new JSONObject()
//空调温度
jobj.put(JdSmartDeviceOrder.TEMPERATURE, "26")
//空调模式
jobj.put(JdSmartDeviceOrder.AIRCONDITION_MODE_TYPE,
JdSmartDeviceOrder.AIRCONDITION_MODE_COOL)
//空调风速
jobj.put(JdSmartDeviceOrder.AIRCONDITION_WIND_RATE_TYPE,
JdSmartDeviceOrder.AIRCONDITION_WIND_RATE_AUTO)
//空调风向
jobj.put(JdSmartDeviceOrder.AIRCONDITION_WIND_DIRECTION_TYPE,
JdSmartDeviceOrder.AIRCONDITION_WIND_DIRECTION__UP_DOWN)| 1091 | 1092 | 1093 | ### 普通灯,开关,插座 1094 | 1095 | 命令 1096 | 1097 | ``` java 1098 | cmd.setOrder(JdSmartDeviceOrder.ON), value1不用设置 1099 | ``` 1100 | 1101 | 状态: 1102 | 1103 | ``` java 1104 | cmd.value1("0") //表示状态是开 1105 | ``` 1106 | 1107 | ### 风扇 1108 | 1109 | 命令 1110 | 1111 | ``` java 1112 | cmd.setOrder(JdSmartDeviceOrder.OPEN) //OPEN开,CLOSE关 1113 | ``` 1114 | 1115 | ``` java 1116 | cmd.setOrder(JdSmartDeviceOrder.SET) //设置开始摇头FAN_START_PIVOT或停止摇头FAN_STOP_PIVOT 1117 | cmd.setValue2("FAN_START_PIVOT") 1118 | ``` 1119 | 1120 | 状态 1121 | 1122 | ``` java 1123 | cmd.value1("0") // value1表示开关状态 "0"表示状态打开,否则为关闭状态 1124 | cmd.value2("FAN_START_PIVOT") // value2表示是否摇头 1125 | ``` 1126 | 1127 | ### 调光灯 1128 | 1129 | 命令 1130 | 1131 | ``` java 1132 | cmd.setOrder(JdSmartDeviceOrder.ON) //ON开,OFF关 1133 | ``` 1134 | 1135 | ``` java 1136 | cmd.setOrder(JdSmartDeviceOrder.MOVE_TO_LEVEL) //亮度比例 1137 | cmd.setValue2("30") //最高亮度255 1138 | ``` 1139 | 1140 | 状态 1141 | 1142 | ``` java 1143 | cmd.value1("0") // value1表示开关状态 "0"表示状态打开,否则为关闭状态 1144 | cmd.value2("30") // value2表示亮度,最高亮度255 1145 | ``` 1146 | 1147 | ### 窗帘/开窗器/温控器 1148 | 1149 | 命令 1150 | 1151 | ``` java 1152 | cmd.setOrder(JdSmartDeviceOrder.OPEN) //OPEN开,CLOSE关, STOP暂停移动 1153 | ``` 1154 | 1155 | ``` java 1156 | cmd.setOrder(JdSmartDeviceOrder.MOVE_TO_LEVEL) //移动比例 1157 | cmd.setValue1("30") //百分比为30% 1158 | ``` 1159 | 1160 | 状态 1161 | 1162 | ``` java 1163 | cmd.value1("10") //表示状态是10%,如果是100,则设备是全开状态 1164 | ``` 1165 | 1166 | ### 空调 1167 | 1168 | 命令 1169 | 1170 | - 打开空调 1171 | 1172 | ``` java 1173 | cmd.setOrder(JdSmartDeviceOrder.OPEN) 1174 | ``` 1175 | 1176 | - 切换空调到下一个工作模式 1177 | 1178 | ``` java 1179 | cmd.setOrder(JdSmartDeviceOrder.NEXT) 1180 | cmd.setValue1(JdSmartDeviceOrder.AIRCONDITION_MODE_TYPE) 1181 | ``` 1182 | 1183 | - 设置制冷模式 1184 | 1185 | ``` java 1186 | cmd.setOrder(JdSmartDeviceOrder.SET) 1187 | cmd.setValue1(JdSmartDeviceOrder.AIRCONDITION_MODE_TYPE) 1188 | cmd.setVvalue2(JdSmartDeviceOrder.AIRCONDITION_MODE_COOL) 1189 | ``` 1190 | 1191 | - 设置中风 1192 | 1193 | ``` java 1194 | cmd.setOrder(JdSmartDeviceOrder.SET) 1195 | cmd.setValue1(JdSmartDeviceOrder.AIRCONDITION_WIND_RATE_TYPE) 1196 | cmd.setValue2(JdSmartDeviceOrder.AIRCONDITION_WIND_RATE_MIDDLE) 1197 | ``` 1198 | 1199 | - 设置温度26度 1200 | 1201 | ``` java 1202 | cmd.setOrder(JdSmartDeviceOrder.MOVE_TO_LEVEL) 1203 | cmd.setValue1("26") 1204 | ``` 1205 | 1206 | 状态 1207 | 1208 | ``` java 1209 | JSONObject jobj = new JSONObject(); 1210 | jobj.put(JdSmartDeviceOrder.AIRCONDITION_MODE_TYPE, JdSmartDeviceOrder.AIRCONDITION_MODE_COOL); 1211 | jobj.put(JdSmartDeviceOrder.AIRCONDITION_WIND_RATE_TYPE, JdSmartDeviceOrder.AIRCONDITION_WIND_RATE_LOW); 1212 | jobj.put(JdSmartDeviceOrder.AIRCONDITION_WIND_DIRECTION_TYPE, JdSmartDeviceOrder.AIRCONDITION_WIND_DIRECTION_LEFT_RIGHT); 1213 | jobj.put(JdSmartDeviceOrder.TEMPERATURE, "28"); 1214 | cmd.setGroupData(jobj.toJSONString()); 1215 | ``` 1216 | 1217 | ### Sensor传感器 1218 | 1219 | 命令 1220 | 1221 | - 关闭正在发声的警报 1222 | 1223 | ``` java 1224 | cmd.setOrder(JdSmartDeviceOrder.MUTE) 1225 | ``` 1226 | 1227 | 状态 1228 | 1229 | 1230 | | 类别 | 参数 | 描述 | 1231 | |-----------|-----------|-----------| 1232 | |门磁、窗磁、水浸 | value1 | 填写0表示关闭,不需要报警,填写1表示打开,需要报警 1233 | | |value3 | 填写0表示低电量,填写1表示正常电量 1234 | | |value4| 填写电量值 1235 | |烟感/可燃气体 |value1| 填写0表示不报警,填写1表示报警 1236 | | |value3| 填写0表示低电量,填写1表示正常电量 1237 | | |value4| 填写电量值 1238 | |人体红外/SOS |value1| 填写0表示没有报警,填写1表示检测到入侵,需要报警 1239 | | |value2| 填写1表示入侵的人一直存在,填写0表示没有检测到入侵持续存在 1240 | | |value3| 填写0表示低电量,填写1表示正常电量; 1241 | | |value4 |填写电量值 1242 | |温度传感器 |value1| 填写温度值 ,例如正常温度值是26.331, 需要写成2633.1(乘以100) 1243 | | |value4| 填写电量值(-1表示此设备不是电池供电的设备) 1244 | |湿度传感器 |value1| 填写湿度值 ,例如正常湿度值是30.212, 需要写成3021.2(乘以100) 1245 | | |value4| 填写电量值(-1表示此设备不是电池供电的设备) 1246 | |温湿度传感器 |value1| 填写温度值 ,例如正常温度值是26.331, 需要写成2633.1(乘以100) 1247 | | |value2| 填写湿度值 ,例如正常湿度值是30.212, 需要写成3021.2(乘以100) 1248 | | |value4| 填写电量值(-1表示此设备不是电池供电的设备) 1249 | |照度 |value1| 填写传感器上报的测量值Measured value 1250 | | |value4| 填写电量值 1251 | |PM2.5 / 二氧化碳 |value1| 当前测量值 1252 | |一氧化碳 |value1| 填写0表示关闭,不需要报警,填写1表示打开,需要报警 1253 | 1254 | 1255 | ## 流程图 1256 | 1257 | ![流程图1](./pic/dockTree1.png)
1258 | ![流程图2](./pic/dockTree2.png)
1259 | 1260 | 1261 | 1262 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # 一、背景音乐主机控制智能家居 3 | ![智能家居](./pic/smart-home.jpg) 4 | ### [Smart sdk 智能家居控制](JdSmartOpenSdk.md) 5 | 安卓sdk开发包, 运行于Android背景音乐主机端,方便对接局域网和云端网关 6 | 7 | ### [对接协议](./files/protocolDocument.pdf) 8 | 网络对接协议实现智能家居网关对接,控制智能家居 9 | 10 | ### Smart 485、udp、tcp 11 | 1. [485、udp、tcp控制智能家居内置于Android系统中, 通过界面配置智能设备与场景指令](./files/485CtrlDev.pdf)
12 | 2. [485、udp、tcp实现场景音乐播控](./files/485CtrlSceneMusic.pdf)
13 | 3. [485、udp、tcp实现播放语音](./files/485PlayTTS.pdf)
14 | 15 | 16 | # 二、控制背景音乐主机 17 | ![音乐](./pic/sound.jpg) 18 | ### JMV sdk([Jd_music_and_voice sdk](JdMusicAndVoiceSdk.md)) 19 | 运行于背景音主机端,语音语义处理,音乐控制, 485控制(请到网盘下载) 20 | 21 | ### JdPlay sdk([JdPlay安卓移动端接入](JdPlayOpenSdkAndroid.md)、 [JdPlay苹果移动端接入](./files/JdPlayOpenSdkIOS.pdf)) 22 | 运行于Android手机端和苹果手机端,开放音乐资源及控制 23 | 24 | ### [JdPlaySS协议(原JSSS)](JdPlaySS.md) 25 | 使用网络协议控制背景音主机,支持局域网发现和控制背景音主机,开放音乐资源及控制,主要用于Linux/RTOS的网关 26 | 27 | ### [485协议及UDP协议](./JdRS485.md) 28 | 通过传统485总线或UDP控制背景音乐主机,开放音乐资源及控制 29 | 30 | # 三、 Android开发 31 | ### [Android开发注意要点](AndroidReadme.md) 32 | 33 | 35 | 36 | 44 | 82 | 83 | -------------------------------------------------------------------------------- /files/485CtrlBackMusicSysWithAIS.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/szjd/docs/690e08a8eca469869234b547c39dea8dc87edc95/files/485CtrlBackMusicSysWithAIS.pdf -------------------------------------------------------------------------------- /files/485CtrlBackMusicSysWithHES.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/szjd/docs/690e08a8eca469869234b547c39dea8dc87edc95/files/485CtrlBackMusicSysWithHES.pdf -------------------------------------------------------------------------------- /files/485CtrlDev.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/szjd/docs/690e08a8eca469869234b547c39dea8dc87edc95/files/485CtrlDev.pdf -------------------------------------------------------------------------------- /files/485CtrlSceneMusic.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/szjd/docs/690e08a8eca469869234b547c39dea8dc87edc95/files/485CtrlSceneMusic.pdf -------------------------------------------------------------------------------- /files/485ExampleCode.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/szjd/docs/690e08a8eca469869234b547c39dea8dc87edc95/files/485ExampleCode.xlsx -------------------------------------------------------------------------------- /files/485PlayTTS.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/szjd/docs/690e08a8eca469869234b547c39dea8dc87edc95/files/485PlayTTS.pdf -------------------------------------------------------------------------------- /files/JdPlayOpenSdkIOS.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/szjd/docs/690e08a8eca469869234b547c39dea8dc87edc95/files/JdPlayOpenSdkIOS.pdf -------------------------------------------------------------------------------- /files/protocolDocument.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/szjd/docs/690e08a8eca469869234b547c39dea8dc87edc95/files/protocolDocument.pdf -------------------------------------------------------------------------------- /pic/PuTTY_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/szjd/docs/690e08a8eca469869234b547c39dea8dc87edc95/pic/PuTTY_11.png -------------------------------------------------------------------------------- /pic/PuTTY_22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/szjd/docs/690e08a8eca469869234b547c39dea8dc87edc95/pic/PuTTY_22.png -------------------------------------------------------------------------------- /pic/dockTree1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/szjd/docs/690e08a8eca469869234b547c39dea8dc87edc95/pic/dockTree1.png -------------------------------------------------------------------------------- /pic/dockTree2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/szjd/docs/690e08a8eca469869234b547c39dea8dc87edc95/pic/dockTree2.png -------------------------------------------------------------------------------- /pic/ios1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/szjd/docs/690e08a8eca469869234b547c39dea8dc87edc95/pic/ios1.png -------------------------------------------------------------------------------- /pic/smart-home.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/szjd/docs/690e08a8eca469869234b547c39dea8dc87edc95/pic/smart-home.jpg -------------------------------------------------------------------------------- /pic/smarthome_a.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/szjd/docs/690e08a8eca469869234b547c39dea8dc87edc95/pic/smarthome_a.png -------------------------------------------------------------------------------- /pic/smarthome_b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/szjd/docs/690e08a8eca469869234b547c39dea8dc87edc95/pic/smarthome_b.png -------------------------------------------------------------------------------- /pic/smarthome_c.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/szjd/docs/690e08a8eca469869234b547c39dea8dc87edc95/pic/smarthome_c.png -------------------------------------------------------------------------------- /pic/sound.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/szjd/docs/690e08a8eca469869234b547c39dea8dc87edc95/pic/sound.jpg --------------------------------------------------------------------------------