diff --git a/build-repo/demo/dsoftbus/docker_img_build.sh b/build-repo/demo/dsoftbus/docker_img_build.sh new file mode 100644 index 0000000000000000000000000000000000000000..c77fd875e9190f840a955979b2da0051022978c3 --- /dev/null +++ b/build-repo/demo/dsoftbus/docker_img_build.sh @@ -0,0 +1,4 @@ +dnf install docker wget -y +wget https://repo.openeuler.org/openEuler-22.03-LTS-SP2/docker_img/aarch64/openEuler-docker.aarch64.tar.xz +docker load -i openEuler-docker.aarch64.tar.xz +docker build -f dockerfile -t softbus_client_image . diff --git a/build-repo/demo/dsoftbus/dockerfile b/build-repo/demo/dsoftbus/dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..9ab72c30a48e3b7afed49a34aa2be39cc8f802b4 --- /dev/null +++ b/build-repo/demo/dsoftbus/dockerfile @@ -0,0 +1,2 @@ +FROM openeuler-22.03-lts-sp2 +COPY softbus_client /home \ No newline at end of file diff --git a/build-repo/demo/dsoftbus/softbus_adapter.cpp b/build-repo/demo/dsoftbus/softbus_adapter.cpp index 2015108f8081cda28e561524300ffacc18483525..631ef784947676f26073da9037d2bd63f37ff29a 100644 --- a/build-repo/demo/dsoftbus/softbus_adapter.cpp +++ b/build-repo/demo/dsoftbus/softbus_adapter.cpp @@ -8,8 +8,11 @@ #include #include +#include #include #include +#include +#include #ifdef ACCESS_TOKEN #include "nativetoken_kit.h" @@ -43,6 +46,9 @@ static inline OHOS::HiviewDFX::HiLogLabel LogLabel() { } \ } while (0) +#define SESSION_ID_FILE "/etc/SI" +#define SESSION_ID_LEN 65 + const std::string PACKAGE_NAME = "softbus_sample"; const std::string LOCAL_SESSION_NAME = "session_test"; const std::string TARGET_SESSION_NAME = "session_test"; @@ -89,13 +95,35 @@ static void DeviceFoundCallback(const DeviceInfo *device) } SoftbusAdapter::SoftbusAdapter() - : _packName(PACKAGE_NAME), - _sessionName(LOCAL_SESSION_NAME), - _capability(DEFAULT_CAPABILITY), - _sessionGroup(DEFAULT_SESSION_GROUP), - _publishId(DEFAULT_PUBLISH_ID) { - + _capability = DEFAULT_CAPABILITY; + std::ifstream fin; + fin.open(SESSION_ID_FILE, std::ios::in); + if (!fin.is_open()) { + MY_LOGE("file %s open failed", SESSION_ID_FILE); + _packName = PACKAGE_NAME; + _sessionName = LOCAL_SESSION_NAME; + _sessionGroup = DEFAULT_SESSION_GROUP; + _publishId = DEFAULT_PUBLISH_ID; + fin.close(); + return; + } + char si[SESSION_ID_LEN] = {0}; + fin >> si; + MY_LOGE("file %s read %s", SESSION_ID_FILE, si); + _packName = si; + _sessionName = si; + _sessionGroup = si; + _publishId = GetRandPublishID(); + fin.close(); +} + +int SoftbusAdapter::GetRandPublishID() { + int publishId; + srand((unsigned)time(nullptr)); + publishId = SESSION_ID_LEN * 2 + rand() % SESSION_ID_LEN; + MY_LOGE("_publishId %d", publishId); + return publishId; } SoftbusAdapter::~SoftbusAdapter() @@ -308,7 +336,7 @@ int SoftbusAdapter::CreateSessionServerAdapt(ISessionListener *cb) MY_LOGE("Session %d opened failed, ret is %d.", sessionId, result); return result; } - MY_LOGI("Session %d opened, ret is %d.", sessionId, result); + MY_LOGI("Sessionid [%d] opened, ret is %d.", sessionId, result); char *networkId = new char[DISC_MAX_DEVICE_ID_LEN]; if (GetPeerDeviceId(sessionId, networkId, DISC_MAX_DEVICE_ID_LEN) == SOFTBUS_OK) { MY_LOGI("Success get peer(%s) device id.", networkId); diff --git a/build-repo/demo/dsoftbus/softbus_adapter.h b/build-repo/demo/dsoftbus/softbus_adapter.h index 0020eab07a659c02c1943e4a69a75e98d46c3c40..1ada6a6bf7547a2c7ab39055b4ebda54e752c3b9 100644 --- a/build-repo/demo/dsoftbus/softbus_adapter.h +++ b/build-repo/demo/dsoftbus/softbus_adapter.h @@ -18,6 +18,9 @@ private: int _publishId; static std::unordered_map sessionNetMap; static std::unordered_map netSessionMap; + + int GetRandPublishID(); + public: SoftbusAdapter(); ~SoftbusAdapter(); diff --git a/build-repo/demo/dsoftbus/softbus_client.cpp b/build-repo/demo/dsoftbus/softbus_client.cpp index 6c7d552aa35bfe1885bd43f6e54571c7308f105f..a772a9ba71243f187b604485c21fb25928b9c3e1 100644 --- a/build-repo/demo/dsoftbus/softbus_client.cpp +++ b/build-repo/demo/dsoftbus/softbus_client.cpp @@ -5,11 +5,42 @@ const std::string TARGET_SESSION_NAME = "session_test"; +void printUsage() { + std::string usage = "\ +\n\ +\n\ +Usage:\ +\n\ +\n\ +usage usage\n\ +openAll/openA 打开所有设备连接\n\ +open 打开指定设备连接\n\ +openWS 打开指定session连接\n\ +openStream/openS 打开指定设备流连接\n\ +openFile/openF 打开指定设备文件连接\n\ +close 关闭指定设备连接\n\ +sendAll/sendA 向所有已打开连接的设备发送字符串消息\n\ +sendAllS/sendAS 向所有已打开连接的设备发送流消息\n\ +send 向指定sessionID发送字符串消息\n\ +sendStream/sendS 向指定sessionID发送流消息\n\ +sendFile/sendF 向指定sessionID发送文件\n\ +allDevices/aD 查看局域网中所有设备信息\n\ +conDevices 查看局域网中所有已连接的设备信息\n\ +localNetId 查看本机net id\n\ +netId 查看打开了sessionid设备的netID\n\ +ip 查看指定设备(netId)的IP\n\ +quit 本机退出组网\ +\n\ +\n\ +"; + std::cout << usage << std::endl; +} + int main(int argc, char const *argv[]) { SoftbusAdapter adpter; adpter.Init(); - + printUsage(); std::string input; while (std::getline(std::cin, input)) { std::string cmd; @@ -17,6 +48,14 @@ int main(int argc, char const *argv[]) iss >> cmd; if (cmd == "openAll" || cmd == "openA") { adpter.OpenSessionWithAllDevice(); + } else if (cmd == "usage") { + printUsage(); + } else if (cmd == "openWithSessionName") { + std::string peerNetId; + iss >> peerNetId; + std::string sessionName; + iss >> sessionName; + adpter.OpenSessionAdapt(peerNetId.c_str(), sessionName.c_str(), TYPE_BYTES); } else if (cmd == "open") { std::string peerNetId; iss >> peerNetId; diff --git a/build-repo/demo/dsoftbus/tutorial.md b/build-repo/demo/dsoftbus/tutorial.md index 8125535309c678ae50fc6e135bde362ba892abe0..8fdf88e3d581831a34ddd82285cba9ab2d9d4801 100644 --- a/build-repo/demo/dsoftbus/tutorial.md +++ b/build-repo/demo/dsoftbus/tutorial.md @@ -154,18 +154,121 @@ gif图 int SetFileReceiveListener(const char *pkgName, const char *sessionName,const IFileReceiveListener *recvListener, const char *rootDir); ``` -### 代码目录结构 +## client使用指导 -参见: +以下操作在设备A/B上都需要操作 -### 接口列表 +1. 物理机环境安装openEuler LTS SP2以上版本,环境需要准备好binder驱动 [binder驱动安装指导](https://gitee.com/src-openeuler/communication_ipc/blob/openEuler-22.03-LTS-SP2/README.md "binder") -参见: +2. 编译softbus_client +``` +bash build-repo/demo/dsoftbus/build.sh +``` + +3. 安装softbus_server +``` +dnf install dsoftbus -y +``` + +4. 启动softbus_server +``` +/system/bin/start_services.sh all +``` + +#### 物理机单client场景:物理机上server与client一一对应 +1. 在物理机A、物理机B上分别启动softbus_client二进制文件 +``` +./softbus_client +``` + +2. 在物理机A上打开session +``` +openA +``` -## 虚拟化测试 +3. 在A上执行命令发送消息给B +``` +sendAll "hello" +``` + +4. 此时在B上的softbus_client看到字符串"hello"说明消息通信成功 + +#### 容器多client场景 +1. 执行脚本在物理机A打包加载容器镜像,[base镜像链接](https://repo.openeuler.org/openEuler-22.03-LTS-SP2/docker_img/aarch64/openEuler-docker.aarch64.tar.xz "img") +``` +bash build-repo/demo/dsoftbus/docker_img_build.sh +``` + +2. 在物理机A启动容器镜像softbus_client,并将相关SDK、binder驱动映射到容器中 +``` +docker run -it --privileged --net=host --name=softbus -v /dev/binderfs/binder:/dev/binder -v /system:/system -v /usr/lib64:/usr/lib64 -p 5684:5684/udp softbus_client bash +``` -## 常见问题 +3. 镜像中写/etc/SI文件,作为该容器中softclient的标志,注意需要和组网中其他client的不一致避免冲突 +``` +echo 123 > /etc/SI +``` + +4. 容器中启动softbus_client +``` +./home/softbus_client +``` + +5. 在本节点上可重复步骤1-3启动不同的client + +6. 在物理机B启动softbus +``` +./build-repo/demo/dsoftbus/softbus_client +``` + +7. 在设备A中的各个中client分别执行命令打开所有连接 +``` +openA +``` + +8. 在设备B中client查看所有已经打开的session +``` +conDevices +``` +回显说明,已经打开了两个session,id分别是4、3,此sessionid是本机的softbus_server分配的,后续发送消息需要用到该id +``` +conDevices +12-11 20:18:58.350 2780335 2780335 I A0fffe/SOFTBUS_DEMO: [SOFTBUS_DEMO]::PrintConnectedDevicesInfo: sessionId:4, networkId: 3c95f61941b81c48ecd73fef881262b82fcbc58e9b1f545e2097b0dc6fecea37 +12-11 20:18:58.350 2780335 2780335 I A0fffe/SOFTBUS_DEMO: [SOFTBUS_DEMO]::PrintConnectedDevicesInfo: sessionId:3, networkId: 3c95f61941b81c48ecd73fef881262b82fcbc58e9b1f545e2097b0dc6fecea37 +``` + +9. 设备B发送使用“session 4”消息至设备A的client +``` +send 4 "hello4" +12-11 20:19:14.975 2780335 2780335 I C015c0/dsoftbus: [TRAN]SendBytes: sessionId=4 +``` +观察设备A中哪个client有回显,说明设备B使用session 4与该client通信,同理可以使用session 3发送消息至另一个client + +10. 设备A容器中client发送使用消息至设备B的client,查看打开的session id +``` +conDevices +12-11 20:25:48.995 344047 344047 I A0fffe/SOFTBUS_DEMO: [SOFTBUS_DEMO]::PrintConnectedDevicesInfo: sessionId:1, networkId: e69eab4e2d657264dfbb2006fdfa15524f4a27edeff0baa26d5d2a2b9502f300 +``` +说明使用session 1通信 + +11. 发送消息测试,在设备B中接受到该字段说明消息接收成功 +``` +send 1 "hello1" +``` + +12. 设备A物理机上client发送使用消息至设备B的client,查看打开的session id +``` +conDevices +12-11 20:37:24.823 3512580 3512580 I A0fffe/SOFTBUS_DEMO: [SOFTBUS_DEMO]::PrintConnectedDevicesInfo: sessionId:1, networkId: e69eab4e2d657264dfbb2006fdfa15524f4a27edeff0baa26d5d2a2b9502f300 +``` +说明使用session 1通信 + +13. 发送消息测试,在设备B中接受到该字段说明消息接收成功 +``` +send 1 "hello1" +``` +#### session id 说明 +在上个章节的测试中,发现两个client之间通信使用的session id不一样。原因是session id是本机server分配的,只需要在本机范围内互斥。同样容器与虚机也做了session name,group name的隔离,所以本机容器与虚机上client的session id是一致的 -## 分布式中间件Sig相关软件仓 \ No newline at end of file