From e58d82af99403d8dea51015b9914d98ab5d77646 Mon Sep 17 00:00:00 2001 From: acgist <289547414@qq.com> Date: Tue, 28 Nov 2023 17:20:39 +0800 Subject: [PATCH] =?UTF-8?q?[+]=20=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../taoyao/AppScope/app.json5 | 6 +- .../resources/base/element/string.json | 4 +- .../resources/base/media/app_icon.png | Bin 6790 -> 6477 bytes .../taoyao/build-profile.json5 | 12 +- .../taoyao/media/build-profile.json5 | 7 +- .../taoyao/media/oh-package.json5 | 6 +- .../taoyao/media/src/main/cpp/CMakeLists.txt | 11 +- .../taoyao/media/src/main/cpp/bind.cpp | 86 +++++++ .../taoyao/media/src/main/cpp/hello.cpp | 54 ----- .../media/src/main/cpp/include/Client.hpp | 2 +- .../src/main/cpp/include/LocalClient.hpp | 2 +- .../src/main/cpp/include/MediaManager.hpp | 2 +- .../src/main/cpp/include/RemoteClient.hpp | 2 +- .../media/src/main/cpp/include/Room.hpp | 14 +- .../media/src/main/cpp/include/RoomClient.hpp | 2 +- .../src/main/cpp/include/SessionClient.hpp | 10 +- .../src/main/cpp/types/libtaoyao/index.d.ts | 19 +- .../src/main/ets/entryability/EntryAbility.ts | 26 +-- .../taoyao/media/src/main/ets/pages/Index.ets | 26 ++- .../media/src/main/ets/signal/Signal.ets | 18 -- .../src/main/ets/taoyao/MediaManager.ets | 0 .../media/src/main/ets/taoyao/Setting.ets | 35 +++ .../src/main/ets/taoyao/TaoyaoSignal.ets | 210 ++++++++++++++++++ .../taoyao/media/src/main/module.json5 | 30 ++- .../main/resources/base/element/color.json | 2 +- .../main/resources/base/element/string.json | 6 +- .../src/main/resources/base/media/icon.png | Bin 6790 -> 6477 bytes .../taoyao/oh-package.json5 | 6 +- 28 files changed, 458 insertions(+), 140 deletions(-) create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/cpp/bind.cpp delete mode 100644 taoyao-client-openharmony/taoyao/media/src/main/cpp/hello.cpp delete mode 100644 taoyao-client-openharmony/taoyao/media/src/main/ets/signal/Signal.ets create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/MediaManager.ets create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/Setting.ets create mode 100644 taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/TaoyaoSignal.ets diff --git a/taoyao-client-openharmony/taoyao/AppScope/app.json5 b/taoyao-client-openharmony/taoyao/AppScope/app.json5 index 1c1cac2..8101b7c 100644 --- a/taoyao-client-openharmony/taoyao/AppScope/app.json5 +++ b/taoyao-client-openharmony/taoyao/AppScope/app.json5 @@ -1,10 +1,10 @@ { "app": { - "bundleName": "com.acgist.taoyao", + "icon" : "$media:app_icon", + "label" : "$string:app_name", "vendor": "acgist", + "bundleName" : "com.acgist.taoyao", "versionCode": 1000000, "versionName": "1.0.0", - "icon": "$media:app_icon", - "label": "$string:app_name" } } diff --git a/taoyao-client-openharmony/taoyao/AppScope/resources/base/element/string.json b/taoyao-client-openharmony/taoyao/AppScope/resources/base/element/string.json index d28be99..6b6c1b7 100644 --- a/taoyao-client-openharmony/taoyao/AppScope/resources/base/element/string.json +++ b/taoyao-client-openharmony/taoyao/AppScope/resources/base/element/string.json @@ -1,8 +1,8 @@ { "string": [ { - "name": "app_name", - "value": "taoyao" + "name" : "app_name", + "value": "桃夭" } ] } diff --git a/taoyao-client-openharmony/taoyao/AppScope/resources/base/media/app_icon.png b/taoyao-client-openharmony/taoyao/AppScope/resources/base/media/app_icon.png index ce307a8827bd75456441ceb57d530e4c8d45d36c..002ccf8ff5710c5f3352c68c526a320b015c8d2e 100644 GIT binary patch literal 6477 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 literal 6790 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 +#include + +#include "hilog/log.h" +#include "napi/native_api.h" + +#include "./include/Room.hpp" +#include "./include/MediaManager.hpp" +#include "./include/SessionClient.hpp" + +namespace acgist { + +acgist::MediaManager* mediaManager; +std::map roomMap; +std::map sessionMap; + +static void init() { +// OH_LOG_INFO(LOG_APP, "加载bind"); +} + +static napi_value sessionCall(napi_env env, napi_callback_info info) { return 0; } +static napi_value sessionPause(napi_env env, napi_callback_info info) { return 0; } +static napi_value sessionResume(napi_env env, napi_callback_info info) { return 0; } +static napi_value sessionExchange(napi_env env, napi_callback_info info) { return 0; } +static napi_value sessionClose(napi_env env, napi_callback_info info) { return 0; } +static napi_value mediaConsume(napi_env env, napi_callback_info info) { return 0; } +static napi_value mediaConsumerClose(napi_env env, napi_callback_info info) { return 0; } +static napi_value mediaConsumerPause(napi_env env, napi_callback_info info) { return 0; } +static napi_value mediaConsumerResume(napi_env env, napi_callback_info info) { return 0; } +static napi_value mediaProducerClose(napi_env env, napi_callback_info info) { return 0; } +static napi_value mediaProducerPause(napi_env env, napi_callback_info info) { return 0; } +static napi_value mediaProducerResume(napi_env env, napi_callback_info info) { return 0; } +static napi_value roomClientList(napi_env env, napi_callback_info info) { return 0; } +static napi_value roomClose(napi_env env, napi_callback_info info) { return 0; } +static napi_value roomEnter(napi_env env, napi_callback_info info) { return 0; } +static napi_value roomExpel(napi_env env, napi_callback_info info) { return 0; } +static napi_value roomInvite(napi_env env, napi_callback_info info) { return 0; } +static napi_value roomLeave(napi_env env, napi_callback_info info) { return 0; } + +} + +EXTERN_C_START +static napi_value Init(napi_env env, napi_value exports) { + napi_property_descriptor desc[] = { + { "sessionCall", nullptr, acgist::sessionCall, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "sessionPause", nullptr, acgist::sessionPause, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "sessionResume", nullptr, acgist::sessionResume, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "sessionExchange", nullptr, acgist::sessionExchange, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "sessionClose", nullptr, acgist::sessionClose, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "mediaConsume", nullptr, acgist::mediaConsume, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "mediaConsumerClose", nullptr, acgist::mediaConsumerClose, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "mediaConsumerPause", nullptr, acgist::mediaConsumerPause, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "mediaConsumerResume", nullptr, acgist::mediaConsumerResume, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "mediaProducerClose", nullptr, acgist::mediaProducerClose, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "mediaProducerPause", nullptr, acgist::mediaProducerPause, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "mediaProducerResume", nullptr, acgist::mediaProducerResume, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "roomClientList", nullptr, acgist::roomClientList, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "roomClose", nullptr, acgist::roomClose, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "roomEnter", nullptr, acgist::roomEnter, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "roomExpel", nullptr, acgist::roomExpel, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "roomInvite", nullptr, acgist::roomInvite, nullptr, nullptr, nullptr, napi_default, nullptr }, + { "roomLeave", nullptr, acgist::roomLeave, nullptr, nullptr, nullptr, napi_default, nullptr }, + }; + napi_define_properties(env, exports, sizeof(desc) / sizeof(napi_property_descriptor), desc); + return exports; +} +EXTERN_C_END + +static napi_module demoModule = { + .nm_version = 1, + .nm_flags = 0, + .nm_filename = nullptr, + .nm_register_func = Init, + .nm_modname = "taoyao", + .nm_priv = ((void*) 0), + .reserved = { 0 }, +}; + +extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { + napi_module_register(&demoModule); + acgist::init(); +} diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/hello.cpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/hello.cpp deleted file mode 100644 index 330a2c1..0000000 --- a/taoyao-client-openharmony/taoyao/media/src/main/cpp/hello.cpp +++ /dev/null @@ -1,54 +0,0 @@ -#include "napi/native_api.h" - -static napi_value Add(napi_env env, napi_callback_info info) -{ - size_t requireArgc = 2; - size_t argc = 2; - napi_value args[2] = {nullptr}; - - napi_get_cb_info(env, info, &argc, args , nullptr, nullptr); - - napi_valuetype valuetype0; - napi_typeof(env, args[0], &valuetype0); - - napi_valuetype valuetype1; - napi_typeof(env, args[1], &valuetype1); - - double value0; - napi_get_value_double(env, args[0], &value0); - - double value1; - napi_get_value_double(env, args[1], &value1); - - napi_value sum; - napi_create_double(env, value0 + value1, &sum); - - return sum; - -} - -EXTERN_C_START -static napi_value Init(napi_env env, napi_value exports) -{ - napi_property_descriptor desc[] = { - { "add", nullptr, Add, nullptr, nullptr, nullptr, napi_default, nullptr } - }; - napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc); - return exports; -} -EXTERN_C_END - -static napi_module demoModule = { - .nm_version = 1, - .nm_flags = 0, - .nm_filename = nullptr, - .nm_register_func = Init, - .nm_modname = "taoyao", - .nm_priv = ((void*)0), - .reserved = { 0 }, -}; - -extern "C" __attribute__((constructor)) void RegisterEntryModule(void) -{ - napi_module_register(&demoModule); -} diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/Client.hpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/Client.hpp index 8091a8c..4c63735 100644 --- a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/Client.hpp +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/Client.hpp @@ -16,4 +16,4 @@ public: } -#endif taoyao_Client_HPP +#endif // taoyao_Client_HPP diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/LocalClient.hpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/LocalClient.hpp index 96b0ac5..f9d734c 100644 --- a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/LocalClient.hpp +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/LocalClient.hpp @@ -7,4 +7,4 @@ #ifndef taoyao_LocalClient_HPP #define taoyao_LocalClient_HPP -#endif taoyao_LocalClient_HPP +#endif // taoyao_LocalClient_HPP diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/MediaManager.hpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/MediaManager.hpp index daed635..1650abc 100644 --- a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/MediaManager.hpp +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/MediaManager.hpp @@ -26,4 +26,4 @@ public: } -#endif taoyao_MediaManager_HPP +#endif // taoyao_MediaManager_HPP diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/RemoteClient.hpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/RemoteClient.hpp index a35447d..ee18992 100644 --- a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/RemoteClient.hpp +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/RemoteClient.hpp @@ -7,4 +7,4 @@ #ifndef taoyao_RemoteClient_HPP #define taoyao_RemoteClient_HPP -#endif taoyao_RemoteClient_HPP +#endif // taoyao_RemoteClient_HPP diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/Room.hpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/Room.hpp index b42f2ff..5316e03 100644 --- a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/Room.hpp +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/Room.hpp @@ -4,7 +4,15 @@ * @author acgist */ -#ifndef taoyao_Room.cpp_HPP -#define taoyao_Room.cpp_HPP +#ifndef taoyao_Room_HPP +#define taoyao_Room_HPP -#endif taoyao_Room.cpp_HPP +namespace acgist { + +class Room { + +}; + +} + +#endif // taoyao_Room_HPP diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/RoomClient.hpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/RoomClient.hpp index f6c51dd..415c970 100644 --- a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/RoomClient.hpp +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/RoomClient.hpp @@ -7,4 +7,4 @@ #ifndef taoyao_RoomClient_HPP #define taoyao_RoomClient_HPP -#endif taoyao_RoomClient_HPP +#endif // taoyao_RoomClient_HPP diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/SessionClient.hpp b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/SessionClient.hpp index 91b542c..c7e37db 100644 --- a/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/SessionClient.hpp +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/include/SessionClient.hpp @@ -7,4 +7,12 @@ #ifndef taoyao_SessionClient_HPP #define taoyao_SessionClient_HPP -#endif taoyao_SessionClient_HPP +namespace acgist { + +class SessionClient { + +}; + +} + +#endif // taoyao_SessionClient_HPP diff --git a/taoyao-client-openharmony/taoyao/media/src/main/cpp/types/libtaoyao/index.d.ts b/taoyao-client-openharmony/taoyao/media/src/main/cpp/types/libtaoyao/index.d.ts index e44f361..4615052 100644 --- a/taoyao-client-openharmony/taoyao/media/src/main/cpp/types/libtaoyao/index.d.ts +++ b/taoyao-client-openharmony/taoyao/media/src/main/cpp/types/libtaoyao/index.d.ts @@ -1 +1,18 @@ -export const add: (a: number, b: number) => number; \ No newline at end of file +export const sessionCall: () => void; +export const sessionPause: () => void; +export const sessionResume: () => void; +export const sessionExchange: () => void; +export const sessionClose: () => void; +export const mediaConsume: () => void; +export const mediaConsumerClose: () => void; +export const mediaConsumerPause: () => void; +export const mediaConsumerResume: () => void; +export const mediaProducerClose: () => void; +export const mediaProducerPause: () => void; +export const mediaProducerResume: () => void; +export const roomClientList: () => void; +export const roomClose: () => void; +export const roomEnter: () => void; +export const roomExpel: () => void; +export const roomInvite: () => void; +export const roomLeave: () => void; diff --git a/taoyao-client-openharmony/taoyao/media/src/main/ets/entryability/EntryAbility.ts b/taoyao-client-openharmony/taoyao/media/src/main/ets/entryability/EntryAbility.ts index 1d53c83..7bb3d5c 100644 --- a/taoyao-client-openharmony/taoyao/media/src/main/ets/entryability/EntryAbility.ts +++ b/taoyao-client-openharmony/taoyao/media/src/main/ets/entryability/EntryAbility.ts @@ -1,41 +1,33 @@ -import UIAbility from '@ohos.app.ability.UIAbility'; import hilog from '@ohos.hilog'; import window from '@ohos.window'; +import UIAbility from '@ohos.app.ability.UIAbility'; export default class EntryAbility extends UIAbility { + onCreate(want, launchParam) { - hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate'); + hilog.info(0x0000, 'EntryAbility', 'onCreate'); } onDestroy() { - hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy'); + hilog.info(0x0000, 'EntryAbility', 'onDestroy'); } onWindowStageCreate(windowStage: window.WindowStage) { - // Main window is created, set main page for this ability - hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate'); - + hilog.info(0x0000, 'EntryAbility', 'onWindowStageCreate'); windowStage.loadContent('pages/Index', (err, data) => { - if (err.code) { - hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? ''); - return; - } - hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? ''); }); } onWindowStageDestroy() { - // Main window is destroyed, release UI related resources - hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy'); + hilog.info(0x0000, 'EntryAbility', 'onWindowStageDestroy'); } onForeground() { - // Ability has brought to foreground - hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground'); + hilog.info(0x0000, 'EntryAbility', 'onForeground'); } onBackground() { - // Ability has back to background - hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground'); + hilog.info(0x0000, 'EntryAbility', 'onBackground'); } + }; diff --git a/taoyao-client-openharmony/taoyao/media/src/main/ets/pages/Index.ets b/taoyao-client-openharmony/taoyao/media/src/main/ets/pages/Index.ets index 3093b4c..86b2498 100644 --- a/taoyao-client-openharmony/taoyao/media/src/main/ets/pages/Index.ets +++ b/taoyao-client-openharmony/taoyao/media/src/main/ets/pages/Index.ets @@ -1,25 +1,31 @@ -import hilog from '@ohos.hilog'; -// import testNapi from 'libtaoyao.so' +import { signal } from "../taoyao/TaoyaoSignal"; @Entry @Component struct Index { - @State message: string = 'Hello World' - build() { Row() { Column() { - Text(this.message) - .fontSize(50) + Button("连接信令") + .fontSize(20) .fontWeight(FontWeight.Bold) .onClick(() => { - // hilog.info(0x0000, 'testTag', 'Test NAPI 2 + 3 = %{public}d', testNapi.add(2, 3)); - }) + signal.connect(); + }); } - .width('100%') + .width('50%'); + Column() { + Button("断开信令") + .fontSize(20) + .fontWeight(FontWeight.Bold) + .onClick(() => { + signal.close(); + }); + } + .width('50%'); } - .height('100%') + .height('100%'); } } diff --git a/taoyao-client-openharmony/taoyao/media/src/main/ets/signal/Signal.ets b/taoyao-client-openharmony/taoyao/media/src/main/ets/signal/Signal.ets deleted file mode 100644 index 44ebcfd..0000000 --- a/taoyao-client-openharmony/taoyao/media/src/main/ets/signal/Signal.ets +++ /dev/null @@ -1,18 +0,0 @@ -/** - * 信令连接 - * - * @author acgist - */ - -// import { BusinessError } from '@ohos.base'; -import webSocket from '@ohos.net.webSocket'; - -export default class TaoyaoSignal { - - // const socket; - // - // void connect(address) { - // - // } - -} diff --git a/taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/MediaManager.ets b/taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/MediaManager.ets new file mode 100644 index 0000000..e69de29 diff --git a/taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/Setting.ets b/taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/Setting.ets new file mode 100644 index 0000000..cae4582 --- /dev/null +++ b/taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/Setting.ets @@ -0,0 +1,35 @@ +/** + * 配置 + * + * @author acgist + */ + +class Signal { + // 终端名称 + name: string = "鸿蒙"; + // 终端ID + clientId: string = "harmony"; + // 终端类型 + clientType: string = "MOBILE"; + // 信令账号 + username: string = "taoyao"; + // 信令密码 + password: string = "taoyao"; +}; + +class Setting { + + // 信令地址 + signalAddress: string = "wss://192.168.8.204:8888/websocket.signal"; + // 信令版本 + version: string = "1.0.0"; + // 信令配置 + signal: Signal = new Signal(); + +}; + +const setting = new Setting(); + +export { + setting +} diff --git a/taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/TaoyaoSignal.ets b/taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/TaoyaoSignal.ets new file mode 100644 index 0000000..6989f46 --- /dev/null +++ b/taoyao-client-openharmony/taoyao/media/src/main/ets/taoyao/TaoyaoSignal.ets @@ -0,0 +1,210 @@ +/** + * 信令连接 + * + * @author acgist + */ + +import hilog from '@ohos.hilog'; +import webSocket from '@ohos.net.webSocket'; + +import { setting } from './Setting'; + +interface BusinessError extends Error { + code: number; + data?: T; +} + +class TaoyaoSignal { + + // WebSocket信令连接 + socket: webSocket.WebSocket; + // 是否关闭 + closed: boolean = false; + // 是否连接成功 + connected: boolean = false; + // 心跳定时 + heartbeatTimer: number; + // 同步请求 + callbackMapping = new Map(); + // 当前消息索引 + index: number = 0; + // 最大消息索引 + maxIndex: number = 999; + // 当前终端索引 + clientIndex: number = 99999; + + connect() { + if(this.socket) { + this.socket.close(); + } + this.connected = false; + hilog.info(0x0000, 'TaoyaoSignal', '连接信令:%s', setting.signalAddress); + this.socket = webSocket.createWebSocket(); + this.socket.on('open', (err: BusinessError, value: Object) => { + hilog.info(0x0000, 'TaoyaoSignal', '打开信令:%s', setting.signalAddress); + this.register(); + this.connected = true; + }); + this.socket.on('message', (err: BusinessError, value: string | ArrayBuffer) => { + hilog.debug(0x0000, 'TaoyaoSignal', '信令消息:%s', value); + try { + this.onMessage(value); + } catch (error) { + hilog.error(0x0000, 'TaoyaoSignal', '处理信令消息异常:%s', value, error); + } + }); + this.socket.on('close', (err: BusinessError, value: Object) => { + hilog.error(0x0000, 'TaoyaoSignal', '关闭信令:%s', setting.signalAddress, err); + this.reconnect(); + }); + this.socket.on('error', (err: BusinessError) => { + hilog.error(0x0000, 'TaoyaoSignal', '信令异常:%s', setting.signalAddress, err); + this.reconnect(); + }); + this.socket.connect(setting.signalAddress, (err: BusinessError, value: boolean) => { + hilog.info(0x0000, 'TaoyaoSignal', '信令连接成功:%s', setting.signalAddress); + }); + }; + + reconnect() { + if(!this.closed) { + setTimeout(() => this.connect(), 5000); + } + } + + close() { + hilog.info(0x0000, 'TaoyaoSignal', '关闭信令:%s', setting.signalAddress); + this.closed = true; + this.connected = false; + if(this.socket) { + this.socket.close(); + } + } + + async register() { + const response: any = await this.request("client::register", { + name : setting.signal.name, + clientId : setting.signal.clientId, + clientType: setting.signal.clientType, + username : setting.signal.username, + password : setting.signal.password, + battery : 100, + charging : true, + }); + const { body } = response; + const { index } = body; + this.clientIndex = index; + hilog.info(0x0000, "TaoyaoSignal", "信令注册成功:%d", index); + this.heartbeat(); + } + + heartbeat() { + if(this.heartbeatTimer) { + clearInterval(this.heartbeatTimer); + } + this.heartbeatTimer = setInterval(() => { + this.send("client::heartbeat", { + battery : 100, + charging: true, + }); + }, 30 * 1000); + }; + + buildId() { + if (++this.index > this.maxIndex) { + this.index = 0; + } + const date = new Date(); + return ( + 100000000000000 * date.getDate() + + 1000000000000 * date.getHours() + + 10000000000 * date.getMinutes() + + 100000000 * date.getSeconds() + + 1000 * this.clientIndex + + this.index + ); + } + + send(signal, body) { + const header = { + v: setting.version, + id: this.buildId(), + signal + }; + const message = { + header, + body + }; + try { + this.socket.send(JSON.stringify(message)); + } catch (error) { + hilog.error(0x0000, 'TaoyaoSignal', '发送消息异常:%o', message, error); + } + } + + async request(signal, body) { + const id = this.buildId(); + return new Promise((resolve, reject) => { + const header = { + v: setting.version, + id, + signal + }; + const message = { + header, + body + }; + // 设置超时 + const rejectTimeout = setTimeout(() => { + this.callbackMapping.delete(id); + reject("请求超时"); + }, 5000); + // 请求回调 + this.callbackMapping.set(id, (response) => { + resolve(response); + clearTimeout(rejectTimeout); + // 默认不用继续处理 + return true; + }); + // 发送消息 + try { + this.socket.send(JSON.stringify(message)); + } catch (error) { + hilog.error(0x0000, 'TaoyaoSignal', '发送消息异常:%o', message, error); + reject(error); + } + }); + } + + onMessage(message) { + const json = JSON.parse(message); + const { + header, + body, + } = json; + const { + id + } = header; + if (this.callbackMapping.has(id)) { + hilog.info(0x0000, "TaoyaoSignal", "处理同步消息:%s", message); + try { + if( + this.callbackMapping.get(id)(json) + ) { + return; + } + } finally { + this.callbackMapping.delete(id); + } + } + hilog.info(0x0000, "TaoyaoSignal", "处理异步消息:%s", message); + // TODO + } + +} + +const signal = new TaoyaoSignal(); + +export { + signal +} diff --git a/taoyao-client-openharmony/taoyao/media/src/main/module.json5 b/taoyao-client-openharmony/taoyao/media/src/main/module.json5 index f12f0f2..8f5afd9 100644 --- a/taoyao-client-openharmony/taoyao/media/src/main/module.json5 +++ b/taoyao-client-openharmony/taoyao/media/src/main/module.json5 @@ -1,11 +1,11 @@ { "module": { - "name": "media", - "type": "entry", + "name" : "media", + "type" : "entry", "pages": "$profile:main_pages", "description": "$string:module_desc", "mainElement": "EntryAbility", - "installationFree": false, + "installationFree" : false, "deliveryWithInstall": true, "deviceTypes": [ "phone", @@ -13,8 +13,8 @@ ], "abilities": [ { - "name": "EntryAbility", - "icon": "$media:icon", + "name" : "EntryAbility", + "icon" : "$media:icon", "label": "$string:EntryAbility_label", "exported": true, "srcEntry": "./ets/entryability/EntryAbility.ts", @@ -32,6 +32,26 @@ } ] } + ], + "requestPermissions": [ + { + "name": "ohos.permission.CAMERA", + "usedScene": { + "when": "always" + } + }, + { + "name": "ohos.permission.INTERNET", + "usedScene": { + "when": "always" + } + }, + { + "name": "ohos.permission.MICROPHONE", + "usedScene": { + "when": "always" + } + } ] } } diff --git a/taoyao-client-openharmony/taoyao/media/src/main/resources/base/element/color.json b/taoyao-client-openharmony/taoyao/media/src/main/resources/base/element/color.json index 3c71296..162a7b6 100644 --- a/taoyao-client-openharmony/taoyao/media/src/main/resources/base/element/color.json +++ b/taoyao-client-openharmony/taoyao/media/src/main/resources/base/element/color.json @@ -5,4 +5,4 @@ "value": "#FFFFFF" } ] -} \ No newline at end of file +} diff --git a/taoyao-client-openharmony/taoyao/media/src/main/resources/base/element/string.json b/taoyao-client-openharmony/taoyao/media/src/main/resources/base/element/string.json index 1ce3ce9..9caab5d 100644 --- a/taoyao-client-openharmony/taoyao/media/src/main/resources/base/element/string.json +++ b/taoyao-client-openharmony/taoyao/media/src/main/resources/base/element/string.json @@ -6,11 +6,11 @@ }, { "name": "EntryAbility_desc", - "value": "主界面" + "value": "桃夭媒体服务" }, { "name": "EntryAbility_label", - "value": "主界面" + "value": "桃夭" } ] -} \ No newline at end of file +} diff --git a/taoyao-client-openharmony/taoyao/media/src/main/resources/base/media/icon.png b/taoyao-client-openharmony/taoyao/media/src/main/resources/base/media/icon.png index ce307a8827bd75456441ceb57d530e4c8d45d36c..002ccf8ff5710c5f3352c68c526a320b015c8d2e 100644 GIT binary patch literal 6477 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 literal 6790 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