1 /*
2 * Copyright (c) 2022-2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "softbus_connector.h"
17
18 #include <securec.h>
19 #include <unistd.h>
20
21 #include "dm_anonymous.h"
22 #include "dm_constants.h"
23 #include "dm_crypto.h"
24 #include "dm_device_info.h"
25 #include "dm_log.h"
26 #include "dm_radar_helper.h"
27 #include "dm_softbus_cache.h"
28 #include "json_object.h"
29 #include "parameter.h"
30 #include "system_ability_definition.h"
31
32 namespace OHOS {
33 namespace DistributedHardware {
34 const int32_t SOFTBUS_SUBSCRIBE_ID_MASK = 0x0000FFFF;
35 const int32_t SOFTBUS_DISCOVER_DEVICE_INFO_MAX_SIZE = 100;
36 const int32_t SOFTBUS_TRUSTDEVICE_UUIDHASH_INFO_MAX_SIZE = 100;
37
38 constexpr const char* WIFI_IP = "WIFI_IP";
39 constexpr const char* WIFI_PORT = "WIFI_PORT";
40 constexpr const char* BR_MAC = "BR_MAC";
41 constexpr const char* BLE_MAC = "BLE_MAC";
42 constexpr const char* ETH_IP = "ETH_IP";
43 constexpr const char* ETH_PORT = "ETH_PORT";
44
45 std::string SoftbusConnector::remoteUdidHash_ = "";
46 std::map<std::string, std::shared_ptr<DeviceInfo>> SoftbusConnector::discoveryDeviceInfoMap_ = {};
47 std::unordered_map<std::string, std::string> SoftbusConnector::deviceUdidMap_ = {};
48 std::vector<ProcessInfo> SoftbusConnector::processInfoVec_ = {};
49 std::mutex SoftbusConnector::discoveryDeviceInfoMutex_;
50 std::mutex SoftbusConnector::deviceUdidLocks_;
51 std::mutex SoftbusConnector::processInfoVecMutex_;
52 std::shared_ptr<ISoftbusConnectorCallback> SoftbusConnector::connectorCallback_ = nullptr;
53
SoftbusConnector()54 SoftbusConnector::SoftbusConnector()
55 {
56 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
57 softbusSession_ = std::make_shared<SoftbusSession>();
58 #endif
59 LOGD("SoftbusConnector constructor.");
60 }
61
~SoftbusConnector()62 SoftbusConnector::~SoftbusConnector()
63 {
64 LOGD("SoftbusConnector destructor.");
65 }
66
RegisterConnectorCallback(std::shared_ptr<ISoftbusConnectorCallback> callback)67 int32_t SoftbusConnector::RegisterConnectorCallback(std::shared_ptr<ISoftbusConnectorCallback> callback)
68 {
69 connectorCallback_ = callback;
70 return DM_OK;
71 }
72
UnRegisterConnectorCallback()73 int32_t SoftbusConnector::UnRegisterConnectorCallback()
74 {
75 connectorCallback_ = nullptr;
76 return DM_OK;
77 }
78
RegisterSoftbusStateCallback(const std::shared_ptr<ISoftbusStateCallback> callback)79 int32_t SoftbusConnector::RegisterSoftbusStateCallback(const std::shared_ptr<ISoftbusStateCallback> callback)
80 {
81 deviceStateManagerCallback_ = callback;
82 return DM_OK;
83 }
84
UnRegisterSoftbusStateCallback()85 int32_t SoftbusConnector::UnRegisterSoftbusStateCallback()
86 {
87 deviceStateManagerCallback_ = nullptr;
88 return DM_OK;
89 }
90
JoinLnn(const std::string & deviceId,bool isForceJoin)91 void SoftbusConnector::JoinLnn(const std::string &deviceId, bool isForceJoin)
92 {
93 std::string connectAddr;
94 LOGI("start, deviceId: %{public}s.", GetAnonyString(deviceId).c_str());
95 ConnectionAddr *addrInfo = GetConnectAddr(deviceId, connectAddr);
96 if (addrInfo == nullptr) {
97 LOGE("addrInfo is nullptr.");
98 return;
99 }
100 if (Crypto::ConvertHexStringToBytes(addrInfo->info.ble.udidHash, UDID_HASH_LEN,
101 remoteUdidHash_.c_str(), remoteUdidHash_.length()) != DM_OK) {
102 LOGE("convert remoteUdid hash failed, remoteUdidHash_: %{public}s.", GetAnonyString(remoteUdidHash_).c_str());
103 return;
104 }
105 int32_t ret = ::JoinLNN(DM_PKG_NAME, addrInfo, OnSoftbusJoinLNNResult, isForceJoin);
106 if (ret != DM_OK) {
107 LOGE("[SOFTBUS]JoinLNN failed, ret: %{public}d.", ret);
108 }
109 return;
110 }
111
JoinLnnByHml(int32_t sessionId,int32_t sessionKeyId,int32_t remoteSessionKeyId)112 void SoftbusConnector::JoinLnnByHml(int32_t sessionId, int32_t sessionKeyId, int32_t remoteSessionKeyId)
113 {
114 LOGI("start, JoinLnnByHml sessionId: %{public}d.", sessionId);
115 ConnectionAddr addrInfo;
116 addrInfo.type = CONNECTION_ADDR_SESSION_WITH_KEY;
117 addrInfo.info.session.sessionId = sessionId;
118 if (sessionKeyId > 0 && remoteSessionKeyId > 0) {
119 addrInfo.info.session.localDeviceKeyId = sessionKeyId;
120 addrInfo.info.session.remoteDeviceKeyId = remoteSessionKeyId;
121 LOGI("sessionKeyId valid");
122 } else {
123 addrInfo.info.session.localDeviceKeyId = 0;
124 addrInfo.info.session.remoteDeviceKeyId = 0;
125 }
126 int32_t ret = ::JoinLNN(DM_PKG_NAME, &addrInfo, OnSoftbusJoinLNNResult, false);
127 if (ret != DM_OK) {
128 LOGE("[SOFTBUS]JoinLNN failed, ret: %{public}d.", ret);
129 }
130 }
131
GetUdidByNetworkId(const char * networkId,std::string & udid)132 int32_t SoftbusConnector::GetUdidByNetworkId(const char *networkId, std::string &udid)
133 {
134 LOGI("start, networkId: %{public}s.", GetAnonyString(std::string(networkId)).c_str());
135 return SoftbusCache::GetInstance().GetUdidFromCache(networkId, udid);
136 }
137
GetUuidByNetworkId(const char * networkId,std::string & uuid)138 int32_t SoftbusConnector::GetUuidByNetworkId(const char *networkId, std::string &uuid)
139 {
140 LOGI("start, networkId: %{public}s.", GetAnonyString(std::string(networkId)).c_str());
141 return SoftbusCache::GetInstance().GetUuidFromCache(networkId, uuid);
142 }
143
144 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
GetSoftbusSession()145 std::shared_ptr<SoftbusSession> SoftbusConnector::GetSoftbusSession()
146 {
147 return softbusSession_;
148 }
149 #endif
150
HaveDeviceInMap(std::string deviceId)151 bool SoftbusConnector::HaveDeviceInMap(std::string deviceId)
152 {
153 std::lock_guard<std::mutex> lock(discoveryDeviceInfoMutex_);
154 auto iter = discoveryDeviceInfoMap_.find(deviceId);
155 if (iter == discoveryDeviceInfoMap_.end()) {
156 LOGE("deviceInfo not found by deviceId: %{public}s.", GetAnonyString(deviceId).c_str());
157 return false;
158 }
159 return true;
160 }
161
GetConnectAddrByType(DeviceInfo * deviceInfo,ConnectionAddrType type)162 ConnectionAddr *SoftbusConnector::GetConnectAddrByType(DeviceInfo *deviceInfo, ConnectionAddrType type)
163 {
164 if (deviceInfo == nullptr) {
165 return nullptr;
166 }
167 for (uint32_t i = 0; i < deviceInfo->addrNum; ++i) {
168 if (deviceInfo->addr[i].type == type) {
169 return &deviceInfo->addr[i];
170 }
171 }
172 return nullptr;
173 }
174
GetConnectAddr(const std::string & deviceId,std::string & connectAddr)175 ConnectionAddr *SoftbusConnector::GetConnectAddr(const std::string &deviceId, std::string &connectAddr)
176 {
177 DeviceInfo *deviceInfo = nullptr;
178 {
179 std::lock_guard<std::mutex> lock(discoveryDeviceInfoMutex_);
180 auto iter = discoveryDeviceInfoMap_.find(deviceId);
181 if (iter == discoveryDeviceInfoMap_.end()) {
182 LOGE("deviceInfo not found by deviceId: %{public}s.", GetAnonyString(deviceId).c_str());
183 return nullptr;
184 }
185 deviceInfo = iter->second.get();
186 }
187 if (deviceInfo->addrNum <= 0 || deviceInfo->addrNum >= CONNECTION_ADDR_MAX) {
188 LOGE("deviceInfo addrNum not valid, addrNum: %{public}d.", deviceInfo->addrNum);
189 return nullptr;
190 }
191 JsonObject jsonPara;
192 ConnectionAddr *addr = GetConnectAddrByType(deviceInfo, ConnectionAddrType::CONNECTION_ADDR_ETH);
193 if (addr != nullptr) {
194 LOGI("[SOFTBUS]get ETH ConnectionAddr for deviceId: %{public}s.", GetAnonyString(deviceId).c_str());
195 jsonPara[ETH_IP] = addr->info.ip.ip;
196 jsonPara[ETH_PORT] = addr->info.ip.port;
197 connectAddr = SafetyDump(jsonPara);
198 return addr;
199 }
200 addr = GetConnectAddrByType(deviceInfo, ConnectionAddrType::CONNECTION_ADDR_WLAN);
201 if (addr != nullptr) {
202 jsonPara[WIFI_IP] = addr->info.ip.ip;
203 jsonPara[WIFI_PORT] = addr->info.ip.port;
204 LOGI("[SOFTBUS]get WLAN ConnectionAddr for deviceId: %{public}s.", GetAnonyString(deviceId).c_str());
205 connectAddr = SafetyDump(jsonPara);
206 return addr;
207 }
208 addr = GetConnectAddrByType(deviceInfo, ConnectionAddrType::CONNECTION_ADDR_BR);
209 if (addr != nullptr) {
210 jsonPara[BR_MAC] = addr->info.br.brMac;
211 LOGI("[SOFTBUS]get BR ConnectionAddr for deviceId: %{public}s.", GetAnonyString(deviceId).c_str());
212 connectAddr = SafetyDump(jsonPara);
213 return addr;
214 }
215 addr = GetConnectAddrByType(deviceInfo, ConnectionAddrType::CONNECTION_ADDR_BLE);
216 if (addr != nullptr) {
217 jsonPara[BLE_MAC] = addr->info.ble.bleMac;
218 connectAddr = SafetyDump(jsonPara);
219 addr->info.ble.priority = BLE_PRIORITY_HIGH;
220 return addr;
221 }
222 LOGE("[SOFTBUS]failed to get ConnectionAddr for deviceId: %{public}s.", GetAnonyString(deviceId).c_str());
223 return nullptr;
224 }
225
ConvertDeviceInfoToDmDevice(const DeviceInfo & deviceInfo,DmDeviceInfo & dmDeviceInfo)226 void SoftbusConnector::ConvertDeviceInfoToDmDevice(const DeviceInfo &deviceInfo, DmDeviceInfo &dmDeviceInfo)
227 {
228 if (memset_s(&dmDeviceInfo, sizeof(DmDeviceInfo), 0, sizeof(DmDeviceInfo)) != EOK) {
229 LOGE("ConvertDeviceInfoToDmDevice memset_s failed.");
230 return;
231 }
232
233 if (memcpy_s(dmDeviceInfo.deviceId, sizeof(dmDeviceInfo.deviceId), deviceInfo.devId,
234 std::min(sizeof(dmDeviceInfo.deviceId), sizeof(deviceInfo.devId))) != EOK) {
235 LOGE("ConvertDeviceInfoToDmDevice copy deviceId data failed.");
236 return;
237 }
238
239 if (memcpy_s(dmDeviceInfo.deviceName, sizeof(dmDeviceInfo.deviceName), deviceInfo.devName,
240 std::min(sizeof(dmDeviceInfo.deviceName), sizeof(deviceInfo.devName))) != EOK) {
241 LOGE("ConvertDeviceInfoToDmDevice copy deviceName data failed.");
242 return;
243 }
244
245 dmDeviceInfo.deviceTypeId = deviceInfo.devType;
246 dmDeviceInfo.range = deviceInfo.range;
247 }
248
ConvertDeviceInfoToDmDevice(const DeviceInfo & deviceInfo,DmDeviceBasicInfo & dmDeviceBasicInfo)249 void SoftbusConnector::ConvertDeviceInfoToDmDevice(const DeviceInfo &deviceInfo, DmDeviceBasicInfo &dmDeviceBasicInfo)
250 {
251 if (memset_s(&dmDeviceBasicInfo, sizeof(DmDeviceBasicInfo), 0, sizeof(DmDeviceBasicInfo)) != EOK) {
252 LOGE("ConvertDeviceInfoToDmDevice memset_s failed.");
253 return;
254 }
255
256 if (memcpy_s(dmDeviceBasicInfo.deviceId, sizeof(dmDeviceBasicInfo.deviceId), deviceInfo.devId,
257 std::min(sizeof(dmDeviceBasicInfo.deviceId), sizeof(deviceInfo.devId))) != EOK) {
258 LOGE("ConvertDeviceInfoToDmDevice copy deviceId data failed.");
259 return;
260 }
261
262 if (memcpy_s(dmDeviceBasicInfo.deviceName, sizeof(dmDeviceBasicInfo.deviceName), deviceInfo.devName,
263 std::min(sizeof(dmDeviceBasicInfo.deviceName), sizeof(deviceInfo.devName))) != EOK) {
264 LOGE("ConvertDeviceInfoToDmDevice copy deviceName data failed.");
265 return;
266 }
267
268 dmDeviceBasicInfo.deviceTypeId = deviceInfo.devType;
269 }
270
OnSoftbusJoinLNNResult(ConnectionAddr * addr,const char * networkId,int32_t result)271 void SoftbusConnector::OnSoftbusJoinLNNResult(ConnectionAddr *addr, const char *networkId, int32_t result)
272 {
273 (void)networkId;
274 LOGI("[SOFTBUS]OnSoftbusJoinLNNResult, result: %{public}d.", result);
275 #if !(defined(__LITEOS_M__) || defined(LITE_DEVICE))
276 if (addr == nullptr) {
277 LOGE("addr is null.");
278 return;
279 }
280 if (addr->type != CONNECTION_ADDR_SESSION_WITH_KEY) {
281 LOGI("addr type is not session.");
282 return;
283 }
284 int32_t sessionId = addr->info.session.sessionId;
285 CHECK_NULL_VOID(connectorCallback_);
286 connectorCallback_->OnSoftbusJoinLNNResult(sessionId, networkId, result);
287 #endif
288 }
289
GetDeviceUdidByUdidHash(const std::string & udidHash)290 std::string SoftbusConnector::GetDeviceUdidByUdidHash(const std::string &udidHash)
291 {
292 std::lock_guard<std::mutex> lock(deviceUdidLocks_);
293 for (auto &iter : deviceUdidMap_) {
294 if (iter.second == udidHash) {
295 return iter.first;
296 }
297 }
298 LOGE("fail to GetUdidByUdidHash, udidHash: %{public}s", GetAnonyString(udidHash).c_str());
299 return udidHash;
300 }
301
GetDeviceUdidHashByUdid(const std::string & udid)302 std::string SoftbusConnector::GetDeviceUdidHashByUdid(const std::string &udid)
303 {
304 {
305 std::lock_guard<std::mutex> lock(deviceUdidLocks_);
306 auto iter = deviceUdidMap_.find(udid);
307 if (iter != deviceUdidMap_.end()) {
308 return deviceUdidMap_[udid];
309 }
310 }
311
312 char udidHash[DM_MAX_DEVICE_ID_LEN] = {0};
313 if (Crypto::GetUdidHash(udid, reinterpret_cast<uint8_t *>(udidHash)) != DM_OK) {
314 LOGE("get udidhash by udid: %{public}s failed.", GetAnonyString(udid).c_str());
315 return "";
316 }
317 LOGI("get udidhash: %{public}s by udid: %{public}s.", GetAnonyString(udidHash).c_str(),
318 GetAnonyString(udid).c_str());
319 std::lock_guard<std::mutex> lock(deviceUdidLocks_);
320 deviceUdidMap_[udid] = udidHash;
321 return udidHash;
322 }
323
EraseUdidFromMap(const std::string & udid)324 void SoftbusConnector::EraseUdidFromMap(const std::string &udid)
325 {
326 std::lock_guard<std::mutex> lock(deviceUdidLocks_);
327 auto iter = deviceUdidMap_.find(udid);
328 if (iter == deviceUdidMap_.end()) {
329 return;
330 }
331 size_t mapSize = deviceUdidMap_.size();
332 if (mapSize >= SOFTBUS_TRUSTDEVICE_UUIDHASH_INFO_MAX_SIZE) {
333 deviceUdidMap_.erase(udid);
334 }
335 }
336
GetLocalDeviceName()337 std::string SoftbusConnector::GetLocalDeviceName()
338 {
339 NodeBasicInfo nodeBasicInfo;
340 int32_t ret = GetLocalNodeDeviceInfo(DM_PKG_NAME, &nodeBasicInfo);
341 if (ret != DM_OK) {
342 LOGE("[SOFTBUS]GetLocalNodeDeviceInfo failed, ret: %{public}d.", ret);
343 return "";
344 }
345 return nodeBasicInfo.deviceName;
346 }
347
GetLocalDeviceTypeId()348 int32_t SoftbusConnector::GetLocalDeviceTypeId()
349 {
350 NodeBasicInfo nodeBasicInfo;
351 int32_t ret = GetLocalNodeDeviceInfo(DM_PKG_NAME, &nodeBasicInfo);
352 if (ret != DM_OK) {
353 LOGE("[SOFTBUS]GetLocalNodeDeviceInfo failed, ret: %{public}d.", ret);
354 return DmDeviceType::DEVICE_TYPE_UNKNOWN;
355 }
356 return nodeBasicInfo.deviceTypeId;
357 }
358
GetLocalDeviceNetworkId()359 std::string SoftbusConnector::GetLocalDeviceNetworkId()
360 {
361 NodeBasicInfo nodeBasicInfo;
362 int32_t ret = GetLocalNodeDeviceInfo(DM_PKG_NAME, &nodeBasicInfo);
363 if (ret != DM_OK) {
364 LOGE("[SOFTBUS]GetLocalDeviceNetworkId failed, ret: %{public}d.", ret);
365 return "";
366 }
367 return nodeBasicInfo.networkId;
368 }
369
AddMemberToDiscoverMap(const std::string & deviceId,std::shared_ptr<DeviceInfo> deviceInfo)370 int32_t SoftbusConnector::AddMemberToDiscoverMap(const std::string &deviceId, std::shared_ptr<DeviceInfo> deviceInfo)
371 {
372 if (deviceId.empty()) {
373 LOGE("AddMemberToDiscoverMap failed, deviceId is empty.");
374 return ERR_DM_INPUT_PARA_INVALID;
375 }
376 std::lock_guard<std::mutex> lock(discoveryDeviceInfoMutex_);
377 discoveryDeviceInfoMap_[deviceId] = std::move(deviceInfo);
378 deviceInfo = nullptr;
379 return DM_OK;
380 }
381
GetNetworkIdByDeviceId(const std::string & deviceId)382 std::string SoftbusConnector::GetNetworkIdByDeviceId(const std::string &deviceId)
383 {
384 LOGI("SoftbusConnector::GetNetworkIdByDeviceId");
385 int32_t deviceCount = 0;
386 NodeBasicInfo *nodeInfo = nullptr;
387 if (GetAllNodeDeviceInfo(DM_PKG_NAME, &nodeInfo, &deviceCount) != DM_OK) {
388 LOGE("[SOFTBUS]GetAllNodeDeviceInfo failed.");
389 return "";
390 }
391 for (int32_t i = 0; i < deviceCount; ++i) {
392 NodeBasicInfo *nodeBasicInfo = nodeInfo + i;
393 uint8_t mUdid[UDID_BUF_LEN] = {0};
394 if (GetNodeKeyInfo(DM_PKG_NAME, reinterpret_cast<char *>(nodeBasicInfo->networkId),
395 NodeDeviceInfoKey::NODE_KEY_UDID, mUdid, sizeof(mUdid)) != DM_OK) {
396 LOGE("[SOFTBUS]GetNodeKeyInfo failed.");
397 }
398 if (reinterpret_cast<char *>(mUdid) == deviceId) {
399 FreeNodeInfo(nodeInfo);
400 return static_cast<std::string>(nodeBasicInfo->networkId);
401 }
402 }
403 FreeNodeInfo(nodeInfo);
404 return "";
405 }
406
SetProcessInfo(ProcessInfo processInfo)407 void SoftbusConnector::SetProcessInfo(ProcessInfo processInfo)
408 {
409 LOGI("SoftbusConnector::SetProcessInfo");
410 std::lock_guard<std::mutex> lock(processInfoVecMutex_);
411 processInfoVec_.push_back(processInfo);
412 }
413
SetProcessInfoVec(std::vector<ProcessInfo> processInfoVec)414 void SoftbusConnector::SetProcessInfoVec(std::vector<ProcessInfo> processInfoVec)
415 {
416 LOGI("SoftbusConnector::SetProcessInfoVec");
417 std::lock_guard<std::mutex> lock(processInfoVecMutex_);
418 processInfoVec_ = processInfoVec;
419 }
420
GetProcessInfo()421 std::vector<ProcessInfo> SoftbusConnector::GetProcessInfo()
422 {
423 LOGI("In");
424 std::lock_guard<std::mutex> lock(processInfoVecMutex_);
425 return processInfoVec_;
426 }
427
ClearProcessInfo()428 void SoftbusConnector::ClearProcessInfo()
429 {
430 LOGI("In");
431 std::lock_guard<std::mutex> lock(processInfoVecMutex_);
432 processInfoVec_.clear();
433 }
434
HandleDeviceOnline(std::string deviceId,int32_t authForm)435 void SoftbusConnector::HandleDeviceOnline(std::string deviceId, int32_t authForm)
436 {
437 LOGI("SoftbusConnector::HandleDeviceOnline");
438 deviceStateManagerCallback_->OnDeviceOnline(deviceId, authForm);
439 return;
440 }
441
HandleDeviceOffline(std::string deviceId)442 void SoftbusConnector::HandleDeviceOffline(std::string deviceId)
443 {
444 LOGI("SoftbusConnector::HandleDeviceOffline");
445 deviceStateManagerCallback_->OnDeviceOffline(deviceId);
446 return;
447 }
448
DeleteOffLineTimer(std::string & udidHash)449 void SoftbusConnector::DeleteOffLineTimer(std::string &udidHash)
450 {
451 LOGI("SoftbusConnector::DeleteOffLineTimer");
452 remoteUdidHash_ = udidHash;
453 if (deviceStateManagerCallback_ != nullptr) {
454 deviceStateManagerCallback_->DeleteOffLineTimer(udidHash);
455 }
456 }
457
CheckIsOnline(const std::string & targetDeviceId)458 bool SoftbusConnector::CheckIsOnline(const std::string &targetDeviceId)
459 {
460 LOGI("Check the device is online.");
461 int32_t deviceCount = 0;
462 NodeBasicInfo *nodeInfo = nullptr;
463 if (GetAllNodeDeviceInfo(DM_PKG_NAME, &nodeInfo, &deviceCount) != DM_OK) {
464 LOGE("[SOFTBUS]GetAllNodeDeviceInfo failed.");
465 return false;
466 }
467 for (int32_t i = 0; i < deviceCount; ++i) {
468 NodeBasicInfo *nodeBasicInfo = nodeInfo + i;
469 uint8_t mUdid[UDID_BUF_LEN] = {0};
470 if (GetNodeKeyInfo(DM_PKG_NAME, reinterpret_cast<char *>(nodeBasicInfo->networkId),
471 NodeDeviceInfoKey::NODE_KEY_UDID, mUdid, sizeof(mUdid)) != DM_OK) {
472 LOGE("[SOFTBUS]GetNodeKeyInfo failed.");
473 }
474 std::string udid = reinterpret_cast<char *>(mUdid);
475 if (udid == targetDeviceId) {
476 LOGI("The device is online.");
477 FreeNodeInfo(nodeInfo);
478 return true;
479 }
480 }
481 LOGI("The device is not online.");
482 FreeNodeInfo(nodeInfo);
483 return false;
484 }
485
GetDeviceInfoByDeviceId(const std::string & deviceId)486 DmDeviceInfo SoftbusConnector::GetDeviceInfoByDeviceId(const std::string &deviceId)
487 {
488 LOGI("SoftbusConnector::GetDeviceInfoBydeviceId");
489 DmDeviceInfo info;
490 int32_t deviceCount = 0;
491 NodeBasicInfo *nodeInfo = nullptr;
492 if (GetAllNodeDeviceInfo(DM_PKG_NAME, &nodeInfo, &deviceCount) != DM_OK) {
493 LOGE("[SOFTBUS]GetAllNodeDeviceInfo failed.");
494 return info;
495 }
496 char deviceIdHash[DM_MAX_DEVICE_ID_LEN] = {0};
497 if (Crypto::GetUdidHash(deviceId, reinterpret_cast<uint8_t *>(deviceIdHash)) != DM_OK) {
498 LOGE("get deviceIdHash by deviceId: %{public}s failed.", GetAnonyString(deviceId).c_str());
499 FreeNodeInfo(nodeInfo);
500 return info;
501 }
502 for (int32_t i = 0; i < deviceCount; ++i) {
503 NodeBasicInfo *nodeBasicInfo = nodeInfo + i;
504 uint8_t mUdid[UDID_BUF_LEN] = {0};
505 if (GetNodeKeyInfo(DM_PKG_NAME, nodeBasicInfo->networkId, NodeDeviceInfoKey::NODE_KEY_UDID,
506 mUdid, sizeof(mUdid)) != DM_OK) {
507 LOGE("[SOFTBUS]GetNodeKeyInfo failed.");
508 FreeNodeInfo(nodeInfo);
509 return info;
510 }
511 std::string udid = reinterpret_cast<char *>(mUdid);
512 if (udid != deviceId) {
513 continue;
514 } else {
515 ConvertNodeBasicInfoToDmDevice(*nodeBasicInfo, info);
516 if (memcpy_s(info.deviceId, DM_MAX_DEVICE_ID_LEN, deviceIdHash, DM_MAX_DEVICE_ID_LEN) != 0) {
517 LOGE("Get deviceId: %{public}s failed.", GetAnonyString(deviceId).c_str());
518 }
519 break;
520 }
521 }
522 FreeNodeInfo(nodeInfo);
523 return info;
524 }
525
ConvertNodeBasicInfoToDmDevice(const NodeBasicInfo & nodeBasicInfo,DmDeviceInfo & dmDeviceInfo)526 void SoftbusConnector::ConvertNodeBasicInfoToDmDevice(const NodeBasicInfo &nodeBasicInfo, DmDeviceInfo &dmDeviceInfo)
527 {
528 if (memset_s(&dmDeviceInfo, sizeof(DmDeviceInfo), 0, sizeof(DmDeviceInfo)) != EOK) {
529 LOGE("ConvertNodeBasicInfoToDmDevice memset_s failed.");
530 return;
531 }
532
533 if (memcpy_s(dmDeviceInfo.networkId, sizeof(dmDeviceInfo.networkId), nodeBasicInfo.networkId,
534 std::min(sizeof(dmDeviceInfo.networkId), sizeof(nodeBasicInfo.networkId))) != EOK) {
535 LOGE("ConvertNodeBasicInfoToDmDevice copy deviceId data failed.");
536 return;
537 }
538
539 if (memcpy_s(dmDeviceInfo.deviceName, sizeof(dmDeviceInfo.deviceName), nodeBasicInfo.deviceName,
540 std::min(sizeof(dmDeviceInfo.deviceName), sizeof(nodeBasicInfo.deviceName))) != EOK) {
541 LOGE("ConvertDeviceInfoToDmDevice copy deviceName data failed.");
542 return;
543 }
544
545 dmDeviceInfo.deviceTypeId = nodeBasicInfo.deviceTypeId;
546 std::string extraData = dmDeviceInfo.extraData;
547 JsonObject extraJson;
548 if (!extraData.empty()) {
549 extraJson.Parse(extraData);
550 }
551 if (!extraJson.IsDiscarded()) {
552 extraJson[PARAM_KEY_OS_TYPE] = nodeBasicInfo.osType;
553 extraJson[PARAM_KEY_OS_VERSION] = std::string(nodeBasicInfo.osVersion);
554 dmDeviceInfo.extraData = ToString(extraJson);
555 }
556 }
557 } // namespace DistributedHardware
558 } // namespace OHOS
559