• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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