Browse Source

init:初始化提交

runming56 1 year ago
commit
69139018ff
100 changed files with 8141 additions and 0 deletions
  1. 20 0
      softbus-jdk/.vscode/c_cpp_properties.json
  2. 11 0
      softbus-jdk/.vscode/settings.json
  3. 832 0
      softbus-jdk/SoftbusLNN.c
  4. 254 0
      softbus-jdk/SoftbusPublish.c
  5. 1048 0
      softbus-jdk/SoftbusSession.c
  6. 642 0
      softbus-jdk/SoftbusSubscribe.c
  7. 53 0
      softbus-jdk/com_jg_softbus_naservice_LNNService.h
  8. 53 0
      softbus-jdk/com_jg_softbus_naservice_PublishService.h
  9. 109 0
      softbus-jdk/com_jg_softbus_naservice_SessionService.h
  10. 69 0
      softbus-jdk/com_jg_softbus_naservice_SubscribeService.h
  11. 149 0
      softbus-jdk/com_jg_softbus_naservice_TransService.h
  12. 8 0
      softbus-sdk/.idea/.gitignore
  13. 7 0
      softbus-sdk/.idea/codeStyles/Project.xml
  14. 5 0
      softbus-sdk/.idea/codeStyles/codeStyleConfig.xml
  15. 13 0
      softbus-sdk/.idea/compiler.xml
  16. 7 0
      softbus-sdk/.idea/encodings.xml
  17. 30 0
      softbus-sdk/.idea/jarRepositories.xml
  18. 11 0
      softbus-sdk/.idea/misc.xml
  19. 124 0
      softbus-sdk/.idea/uiDesigner.xml
  20. 58 0
      softbus-sdk/pom.xml
  21. 79 0
      softbus-sdk/src/main/java/com/jg/softbus/TestMain.java
  22. 328 0
      softbus-sdk/src/main/java/com/jg/softbus/common/SoftbusErrCode.java
  23. 154 0
      softbus-sdk/src/main/java/com/jg/softbus/device/DeviceInfo.java
  24. 39 0
      softbus-sdk/src/main/java/com/jg/softbus/device/DeviceState.java
  25. 62 0
      softbus-sdk/src/main/java/com/jg/softbus/device/DeviceType.java
  26. 29 0
      softbus-sdk/src/main/java/com/jg/softbus/discovery/CapabilityMap.java
  27. 89 0
      softbus-sdk/src/main/java/com/jg/softbus/discovery/PublishInfo.java
  28. 101 0
      softbus-sdk/src/main/java/com/jg/softbus/discovery/SubscribeInfo.java
  29. 29 0
      softbus-sdk/src/main/java/com/jg/softbus/discovery/callback/IDiscoveryCallback.java
  30. 22 0
      softbus-sdk/src/main/java/com/jg/softbus/discovery/callback/IPublishCallback.java
  31. 14 0
      softbus-sdk/src/main/java/com/jg/softbus/discovery/callback/IPublishCb.java
  32. 23 0
      softbus-sdk/src/main/java/com/jg/softbus/discovery/callback/IRefreshCallback.java
  33. 88 0
      softbus-sdk/src/main/java/com/jg/softbus/discovery/enums/DataBitMap.java
  34. 33 0
      softbus-sdk/src/main/java/com/jg/softbus/discovery/enums/DiscoverMode.java
  35. 32 0
      softbus-sdk/src/main/java/com/jg/softbus/discovery/enums/DiscoveryFailReason.java
  36. 38 0
      softbus-sdk/src/main/java/com/jg/softbus/discovery/enums/ExchangeFreq.java
  37. 39 0
      softbus-sdk/src/main/java/com/jg/softbus/discovery/enums/ExchangeMedium.java
  38. 32 0
      softbus-sdk/src/main/java/com/jg/softbus/discovery/enums/PublishFailReason.java
  39. 32 0
      softbus-sdk/src/main/java/com/jg/softbus/discovery/enums/PublishResult.java
  40. 30 0
      softbus-sdk/src/main/java/com/jg/softbus/discovery/enums/RefreshResult.java
  41. 27 0
      softbus-sdk/src/main/java/com/jg/softbus/discovery/enums/UpdateState.java
  42. 64 0
      softbus-sdk/src/main/java/com/jg/softbus/manager/SessionManager.java
  43. 59 0
      softbus-sdk/src/main/java/com/jg/softbus/model/SessionInfo.java
  44. 254 0
      softbus-sdk/src/main/java/com/jg/softbus/naservice/LNNService.java
  45. 263 0
      softbus-sdk/src/main/java/com/jg/softbus/naservice/PublishService.java
  46. 276 0
      softbus-sdk/src/main/java/com/jg/softbus/naservice/SessionService.java
  47. 315 0
      softbus-sdk/src/main/java/com/jg/softbus/naservice/SubscribeService.java
  48. 4 0
      softbus-sdk/src/main/java/com/jg/softbus/naservice/package-info.java
  49. 23 0
      softbus-sdk/src/main/java/com/jg/softbus/network/callback/ILNNCallback.java
  50. 55 0
      softbus-sdk/src/main/java/com/jg/softbus/network/callback/INodeStateCb.java
  51. 55 0
      softbus-sdk/src/main/java/com/jg/softbus/network/node/LNNResult.java
  52. 70 0
      softbus-sdk/src/main/java/com/jg/softbus/network/node/NodeBasicInfo.java
  53. 31 0
      softbus-sdk/src/main/java/com/jg/softbus/network/node/NodeBasicInfoType.java
  54. 86 0
      softbus-sdk/src/main/java/com/jg/softbus/network/node/NodeStatus.java
  55. 40 0
      softbus-sdk/src/main/java/com/jg/softbus/network/node/NodeStatusType.java
  56. 59 0
      softbus-sdk/src/main/java/com/jg/softbus/network/protocol/BleAddr.java
  57. 29 0
      softbus-sdk/src/main/java/com/jg/softbus/network/protocol/BleProtocolType.java
  58. 39 0
      softbus-sdk/src/main/java/com/jg/softbus/network/protocol/BrAddr.java
  59. 52 0
      softbus-sdk/src/main/java/com/jg/softbus/network/protocol/ConnectionAddr.java
  60. 66 0
      softbus-sdk/src/main/java/com/jg/softbus/network/protocol/ConnectionAddrInfo.java
  61. 41 0
      softbus-sdk/src/main/java/com/jg/softbus/network/protocol/ConnectionAddrType.java
  62. 48 0
      softbus-sdk/src/main/java/com/jg/softbus/network/protocol/IpAddr.java
  63. 52 0
      softbus-sdk/src/main/java/com/jg/softbus/network/protocol/SessionAddr.java
  64. 57 0
      softbus-sdk/src/main/java/com/jg/softbus/session/BandwidthDetection.java
  65. 79 0
      softbus-sdk/src/main/java/com/jg/softbus/session/FileReceiveContent.java
  66. 94 0
      softbus-sdk/src/main/java/com/jg/softbus/session/FrameStatus.java
  67. 58 0
      softbus-sdk/src/main/java/com/jg/softbus/session/JitterEstimation.java
  68. 64 0
      softbus-sdk/src/main/java/com/jg/softbus/session/QosTv.java
  69. 83 0
      softbus-sdk/src/main/java/com/jg/softbus/session/QosTvInfo.java
  70. 40 0
      softbus-sdk/src/main/java/com/jg/softbus/session/SendFileProcessResult.java
  71. 99 0
      softbus-sdk/src/main/java/com/jg/softbus/session/SessionAttribute.java
  72. 26 0
      softbus-sdk/src/main/java/com/jg/softbus/session/StreamAttr.java
  73. 32 0
      softbus-sdk/src/main/java/com/jg/softbus/session/StreamData.java
  74. 85 0
      softbus-sdk/src/main/java/com/jg/softbus/session/StreamFrameInfo.java
  75. 212 0
      softbus-sdk/src/main/java/com/jg/softbus/session/StreamStatistics.java
  76. 35 0
      softbus-sdk/src/main/java/com/jg/softbus/session/TV.java
  77. 59 0
      softbus-sdk/src/main/java/com/jg/softbus/session/WifiChannelQuality.java
  78. 39 0
      softbus-sdk/src/main/java/com/jg/softbus/session/callback/IFileReceiveListener.java
  79. 29 0
      softbus-sdk/src/main/java/com/jg/softbus/session/callback/IFileSendListener.java
  80. 55 0
      softbus-sdk/src/main/java/com/jg/softbus/session/callback/ISessionListener.java
  81. 42 0
      softbus-sdk/src/main/java/com/jg/softbus/session/enums/LinkType.java
  82. 35 0
      softbus-sdk/src/main/java/com/jg/softbus/session/enums/QosEvent.java
  83. 35 0
      softbus-sdk/src/main/java/com/jg/softbus/session/enums/SessionType.java
  84. 35 0
      softbus-sdk/src/main/java/com/jg/softbus/session/enums/StreamType.java
  85. 33 0
      softbus-sdk/src/main/java/com/jg/softbus/session/enums/TransEnumEventType.java
  86. 11 0
      softbus-sdk/src/test/java/Test.java
  87. BIN
      softbus-sdk/target/archive-tmp/softbus-sdk-0.0.1-SNAPSHOT.jar
  88. BIN
      softbus-sdk/target/classes/com/jg/softbus/TestMain.class
  89. BIN
      softbus-sdk/target/classes/com/jg/softbus/common/SoftbusErrCode.class
  90. BIN
      softbus-sdk/target/classes/com/jg/softbus/device/DeviceInfo.class
  91. BIN
      softbus-sdk/target/classes/com/jg/softbus/device/DeviceState.class
  92. BIN
      softbus-sdk/target/classes/com/jg/softbus/device/DeviceType.class
  93. BIN
      softbus-sdk/target/classes/com/jg/softbus/discovery/CapabilityMap.class
  94. BIN
      softbus-sdk/target/classes/com/jg/softbus/discovery/PublishInfo.class
  95. BIN
      softbus-sdk/target/classes/com/jg/softbus/discovery/SubscribeInfo.class
  96. BIN
      softbus-sdk/target/classes/com/jg/softbus/discovery/callback/IDiscoveryCallback.class
  97. BIN
      softbus-sdk/target/classes/com/jg/softbus/discovery/callback/IPublishCallback.class
  98. BIN
      softbus-sdk/target/classes/com/jg/softbus/discovery/callback/IPublishCb.class
  99. BIN
      softbus-sdk/target/classes/com/jg/softbus/discovery/callback/IRefreshCallback.class
  100. 0 0
      softbus-sdk/target/classes/com/jg/softbus/discovery/enums/DataBitMap.class

+ 20 - 0
softbus-jdk/.vscode/c_cpp_properties.json

@@ -0,0 +1,20 @@
+{
+    "configurations": [
+        {
+            "name": "Win32",
+            "includePath": [
+                "${workspaceFolder}/**"
+            ],
+            "defines": [
+                "_DEBUG",
+                "UNICODE",
+                "_UNICODE"
+            ],
+            "compilerPath": "D:\\msys64\\mingw64\\bin\\gcc.exe",
+            "cStandard": "c17",
+            "cppStandard": "gnu++17",
+            "intelliSenseMode": "windows-gcc-x64"
+        }
+    ],
+    "version": 4
+}

+ 11 - 0
softbus-jdk/.vscode/settings.json

@@ -0,0 +1,11 @@
+{
+    "files.associations": {
+        "com_jg_softbus_naservice_devicemanager.h": "c",
+        "com_jg_softbus_naservice_discoveryservice.h": "c",
+        "typeinfo": "c",
+        "com_jg_softbus_naservice_publishservice.h": "c",
+        "string.h": "c",
+        "com_jg_softbus_naservice_subscribeservice.h": "c",
+        "com_jg_softbus_naservice_lnnservice.h": "c"
+    }
+}

+ 832 - 0
softbus-jdk/SoftbusLNN.c

@@ -0,0 +1,832 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <jni.h>
+#include "securec.h"
+#include "softbus_bus_center.h"
+#include "com_jg_softbus_naservice_LNNService.h"
+
+static INodeStateCb g_stateCb;
+// 全局变量,用于保存Java虚拟机的引用
+JavaVM *jvm;
+//全局引用变量,用于保存java对象
+jobject lNNCallback;
+jobject leaveCallback;
+jobject nodeStateCb;
+
+int parseConnectAddr(JNIEnv *env, jobject targetAddr,  ConnectionAddr *addr) {
+    jclass addrClass = (*env)->GetObjectClass(env, targetAddr);
+    //地址类型
+    jmethodID getAddrTypeMethod = (*env)->GetMethodID(env, addrClass, "getType", "()Lcom/jg/softbus/network/protocol/ConnectionAddrType;");
+    jobject addrType = (*env)->CallObjectMethod(env, targetAddr, getAddrTypeMethod);
+    
+    jclass addrTypeClass = (*env)->GetObjectClass(env, addrType);
+    jmethodID getModeMethod = (*env)->GetMethodID(env, addrTypeClass, "valueOf", "()I");
+    jint type = (*env)->CallIntMethod(env, addrType, getModeMethod);
+    addr->type = type;
+    printf("addr->peerUid:%d\n", addr->type);
+    (*env)->DeleteLocalRef(env, addrType);
+
+    //开始解析写入info对象
+    jmethodID getInfoMethod = (*env)->GetMethodID(env, addrClass, "getInfo", "()Lcom/jg/softbus/network/protocol/ConnectionAddrInfo;");
+    jobject addrInfo = (*env)->CallObjectMethod(env, targetAddr, getInfoMethod);
+    if(addrInfo != NULL) {
+      //解析infoclass
+      jclass addrInfoClass = (*env)->GetObjectClass(env, addrInfo);
+      //获取getBr
+      jmethodID getBrMethod = (*env)->GetMethodID(env, addrInfoClass, "getBr", "()Lcom/jg/softbus/network/protocol/BrAddr;");
+      jobject brAddr = (*env)->CallObjectMethod(env, addrInfo, getBrMethod);
+      if (brAddr != NULL) {
+        jclass brAddrClass = (*env)->GetObjectClass(env, brAddr);
+        //获取getBrMac
+        jmethodID getBrMacMethod = (*env)->GetMethodID(env, brAddrClass, "getBrMac", "()Ljava/lang/String;");
+        jstring brMac = (*env)->CallObjectMethod(env, brAddr, getBrMacMethod);
+        const char *brMacStr = (*env)->GetStringUTFChars(env, brMac, 0);
+        if (brMacStr != NULL) {
+            // 获取字符串长度
+            jsize length = (*env)->GetStringUTFLength(env, brMac); 
+            // 将字符串转换为char数组
+            char brMacArray[length+1];
+            for (int i = 0; i < length; i++) {
+                brMacArray[i] = brMacStr[i];
+            }
+            // 添加字符串结束符
+            brMacArray[length] = '\0'; 
+            strcpy(addr->info.br.brMac, brMacArray);
+            printf("addr->info.br.brMac:%s\n", brMacStr);
+        } 
+        (*env)->ReleaseStringUTFChars(env, brMac, brMacStr);
+      }
+      (*env)->DeleteLocalRef(env, brAddr);
+
+      //获取BleAddr 
+      jmethodID getBleMethod = (*env)->GetMethodID(env, addrInfoClass, "getBle", "()Lcom/jg/softbus/network/protocol/BleAddr;");
+      jobject bleAddr = (*env)->CallObjectMethod(env, addrInfo, getBleMethod);
+      if(bleAddr != NULL) {
+        jclass bleAddrClass = (*env)->GetObjectClass(env, bleAddr);
+        //获取getProtocol
+        jmethodID getProtocolMethod = (*env)->GetMethodID(env, bleAddrClass, "getProtocol", "()Lcom/jg/softbus/network/protocol/BleProtocolType;");
+        // jobject protocol = (*env)->CallObjectMethod(env, bleAddr, getProtocolMethod);
+        // if(protocol != NULL) {
+        //     jclass protocolClass = (*env)->GetObjectClass(env, protocol);
+        //     jmethodID getProtocolValueMethod = (*env)->GetMethodID(env, protocolClass, "valueOf", "()I");
+        //     jint protocolValue = (*env)->CallIntMethod(env, protocol, getProtocolValueMethod);
+        //     addr->info.ble.protocol = protocolValue;
+        //     printf("addr->info.ble.protocol:%d\n", addr->info.ble.protocol);
+        // }
+        // (*env)->DeleteLocalRef(env, protocol);
+        //获取bleMac
+        jmethodID getBleMacMethod = (*env)->GetMethodID(env, bleAddrClass, "getBleMac", "()Ljava/lang/String;");
+        jstring bleMac = (*env)->CallObjectMethod(env, bleAddr, getBleMacMethod);
+        const char *bleMacStr = (*env)->GetStringUTFChars(env, bleMac, 0);
+        if (bleMac != NULL) {
+            // 获取字符串长度
+            jsize length = (*env)->GetStringUTFLength(env, bleMac); 
+            // 将字符串转换为char数组
+            char bleMacArray[length+1];
+            for (int i = 0; i < length; i++) {
+                bleMacArray[i] = bleMacStr[i];
+            }
+            // 添加字符串结束符
+            bleMacArray[length] = '\0'; 
+            strcpy(addr->info.ble.bleMac, bleMacArray);
+            printf("addr->info.ble.bleMac:%s\n", bleMacStr);
+        } 
+        (*env)->ReleaseStringUTFChars(env, bleMac, bleMacStr);
+        //获取udidHash
+        jmethodID getUdidHashMethod = (*env)->GetMethodID(env, bleAddrClass, "getUdidHash", "()[B");
+        jobject udidHashValue = (*env)->CallObjectMethod(env, bleAddr, getUdidHashMethod);
+        if(udidHashValue != NULL) {
+          jclass udidHashValueClass = (*env)->GetObjectClass(env, udidHashValue); 
+          jobject classObj = (*env)->ToReflectedMethod(env, udidHashValueClass, 0, 0);
+          jclass classClass = (*env)->GetObjectClass(env, classObj);
+          jmethodID mid = (*env)->GetMethodID(env, classClass, "getName", "()Ljava/lang/String;");
+          jstring className = (*env)->CallObjectMethod(env, classObj, mid);
+          const char *classSig = (*env)->GetStringUTFChars(env, className, NULL);
+          if (classSig[0] == '[') { 
+            jsize length = (*env)->GetArrayLength(env, udidHashValue);
+            jbyteArray array = (*env)->NewByteArray(env, length);
+            // 将数据复制到jArray中  
+            jbyte *buffer = (*env)->GetByteArrayElements(env, array, NULL);  
+            if (buffer == NULL) {  
+                return -1; // 返回null表示失败  
+            }  
+            for (jsize i = 0; i < length; i++) {  
+                // 从jobject中获取元素并复制到buffer中  
+                buffer[i] = (uint8_t)((*env)->CallIntMethod(env, udidHashValue, (*env)->GetMethodID(env, udidHashValueClass, "get", "(I)B"), i));  
+            } 
+            (*env)->ReleaseByteArrayElements(env, array, buffer, 0); // 释放本地引用   
+
+            // 获取jbyteArray的指针和长度  
+            jbyte *elements = (*env)->GetByteArrayElements(env, array, NULL);  
+            // 创建uint8_t数组  
+            uint8_t udidHash[length];
+            // 将数据复制到uint8_t数组中  
+            for (jsize i = 0; i < length; i++) {  
+                udidHash[i] =  (uint8_t)elements[i];  
+                printf("addr->info.ble.udidHash:%u", udidHash[i]);
+            }  
+            printf("\n");
+            (*env)->ReleaseByteArrayElements(env, array, elements, 0);
+            memcpy(addr->info.ble.udidHash, udidHash, sizeof(udidHash));
+            free(udidHash);
+          }
+              
+        }
+        (*env)->DeleteLocalRef(env, udidHashValue);
+        //psm处理
+        // jmethodID getPsmMethod = (*env)->GetMethodID(env, bleAddrClass, "getPsm", "()I");
+        // jint psm = (*env)->CallIntMethod(env, bleAddr, getPsmMethod);
+        // addr->info.ble.psm = psm;
+      }
+      //释放bleAddr引用
+      (*env)->DeleteLocalRef(env, bleAddr);
+
+      jmethodID getIpMethod = (*env)->GetMethodID(env, addrInfoClass, "getIp", "()Lcom/jg/softbus/network/protocol/IpAddr;");
+      jobject ipAddr = (*env)->CallObjectMethod(env, addrInfo, getIpMethod);
+      if(ipAddr != NULL) {
+        jclass ipAddrClass = (*env)->GetObjectClass(env, ipAddr);
+        //获取ip属性
+        jmethodID getIpMethod = (*env)->GetMethodID(env, ipAddrClass, "getIp", "()Ljava/lang/String;");
+        jstring ip = (*env)->CallObjectMethod(env, ipAddr, getIpMethod);
+        const char *ipStr = (*env)->GetStringUTFChars(env, ip, 0);
+        if (ip != NULL) {
+            // 获取字符串长度
+            jsize length = (*env)->GetStringUTFLength(env, ip); 
+            // 将字符串转换为char数组
+            char ipArray[length+1];
+            for (int i = 0; i < length; i++) {
+                ipArray[i] = ipStr[i];
+            }
+            // 添加字符串结束符
+            ipArray[length] = '\0'; 
+            strcpy(addr->info.ip.ip, ipArray);
+            printf("addr->info.ip.ip:%s\n", addr->info.ip.ip);
+        } 
+        (*env)->ReleaseStringUTFChars(env, ip, ipStr);
+        //获取端口port
+        jmethodID getPortMethod = (*env)->GetMethodID(env, ipAddrClass, "getPort", "()I");
+        jint port = (*env)->CallIntMethod(env, ipAddr, getPortMethod);
+        addr->info.ip.port = port;
+        printf("addr->info.ip.port:%d\n", addr->info.ip.port);
+      }
+      //释放ipAddr引用
+      (*env)->DeleteLocalRef(env, ipAddr);
+
+      //session处理
+    //   jmethodID getSessionMethod = (*env)->GetMethodID(env, addrInfoClass, "getSession", "()Lcom/jg/softbus/network/protocol/SessionAddr;");
+    //   jobject sessionAddr = (*env)->CallObjectMethod(env, addrInfo, getSessionMethod);
+    //   if(sessionAddr != NULL) {
+    //     jclass sessionClass = (*env)->GetObjectClass(env, sessionAddr);
+
+    //     //获取sessionId属性
+    //     jmethodID getSessionIdMethod = (*env)->GetMethodID(env, sessionClass, "getSessionId", "()I");
+    //     jint sessionId = (*env)->CallIntMethod(env, sessionAddr, getSessionIdMethod);
+    //     addr->info.session.sessionId = sessionId;
+    //     printf("addr->info.session.sessionId:%d\n", addr->info.session.sessionId);
+
+    //     //获取channelId
+    //     jmethodID getChannelIdMethod = (*env)->GetMethodID(env, sessionClass, "getChannelId", "()I");
+    //     jint channelId = (*env)->CallIntMethod(env, sessionAddr, getChannelIdMethod);
+    //     addr->info.session.channelId = channelId;
+    //     printf("addr->info.session.channelId:%d\n", addr->info.session.channelId);
+
+    //     //获取type属性
+    //     jmethodID getTypeMethod = (*env)->GetMethodID(env, sessionClass, "getType", "()I");
+    //     jint type = (*env)->CallIntMethod(env, sessionAddr, getTypeMethod);
+    //     addr->info.session.type = type;
+    //     printf("addr->info.session.type:%d\n", addr->info.session.type);
+    //   }
+    //   //释放sessionAddr引用
+    //   (*env)->DeleteLocalRef(env, sessionAddr);
+
+    // }
+
+    //开始解析peerUid
+    jmethodID getPeerUidMethod = (*env)->GetMethodID(env, addrClass, "getPeerUid", "()Ljava/lang/String;");
+    jstring peerUid = (*env)->CallObjectMethod(env, targetAddr, getPeerUidMethod);
+    const char *peerUidStr = (*env)->GetStringUTFChars(env, peerUid, 0);
+    if (peerUidStr != NULL) {
+        // 获取字符串长度
+        jsize length = (*env)->GetStringUTFLength(env, peerUid); 
+        // 将字符串转换为char数组
+        char cArray[length+1];
+        for (int i = 0; i < length; i++) {
+            cArray[i] = peerUidStr[i];
+        }
+        // 添加字符串结束符
+        cArray[length] = '\0'; 
+        strcpy(addr->peerUid, cArray);
+        printf("addr->peerUid:%s\n", addr->peerUid);
+    } 
+    // 释放C字符串的内存
+    (*env)->ReleaseStringUTFChars(env, peerUid, peerUidStr); 
+    return 0;
+  }
+  return -1;
+}
+/**
+ * 将c结构ConnectionAddr转换为java的object对象
+*/
+jobject parseAddrToJava(JNIEnv *env, const ConnectionAddr *addr) {
+   //发现ConnectionAddr的java类
+    jclass connectionAddrClass = (*env)->FindClass(env, "com/jg/softbus/network/protocol/ConnectionAddr");  
+    if (connectionAddrClass == NULL) {
+        // 处理错误
+        printf("Cannot found the class:com/jg/softbus/network/protocol/ConnectionAddr");
+        return NULL;
+    }
+    //发现com.jg.softbus.network.protocol.ConnectionAddrType java类,根据其提供的静态getForValue(int)方法获取ConnectionAddrType对象
+    jclass connectionAddrTypeClass = (*env)->FindClass(env, "com/jg/softbus/network/protocol/ConnectionAddrType");  
+    if (connectionAddrTypeClass == NULL) {  
+        // 处理错误  
+        printf("Cannot found the class:com/jg/softbus/network/protocol/ConnectionAddrType");
+        return NULL;
+    }
+    //查找com.jg.softbus.network.protocol.ConnectionAddrInfo
+    jclass connectionAddrInfoClass = (*env)->FindClass(env, "com/jg/softbus/network/protocol/ConnectionAddrInfo");  
+    if (connectionAddrInfoClass == NULL) {
+        // 处理错误  
+        printf("Cannot found the class:com/jg/softbus/network/protocol/ConnectionAddrInfo");
+        return NULL;
+    }
+    //查找ConnectionAddrInfo的无参构造函数
+    jmethodID connectionAddrInfoConstructor = (*env)->GetMethodID(env, connectionAddrInfoClass, "<init>", "()V");  
+    if (connectionAddrInfoConstructor == NULL) {
+        // 处理错误  
+        printf("Cannot found the constructor:com/jg/softbus/network/protocol/ConnectionAddrInfo");
+        return NULL;
+    }
+     //查找com.jg.softbus.network.protocol.IpAddr的java对象
+    jclass ipAddrClass = (*env)->FindClass(env, "com/jg/softbus/network/protocol/IpAddr");
+    if(ipAddrClass == NULL){
+        printf("Cannot found the IpAddr class.");
+        return NULL;
+    }
+    //查找IpAddr带参构造函数,函数结构为:IpAddr(String ip, int port)
+    jmethodID ipAddrConstructor = (*env)->GetMethodID(env, ipAddrClass, "<init>", "(Ljava/lang/String;I)V");
+    if(ipAddrConstructor == NULL){
+        printf("Cannot found the constructor of IpAddr.");
+        return NULL;
+    }
+
+    //查找com.jg.softbus.network.protocol.BrAddr的java对象
+    jclass brAddrClass = (*env)->FindClass(env, "com/jg/softbus/network/protocol/BrAddr");
+    if(brAddrClass == NULL){
+        printf("Cannot found the BrAddr class.");
+        return NULL;
+    }
+    //查找BrAddr带参构造函数,函数结构为:BrAddr(String brMac)
+    jmethodID brAddrConstructor = (*env)->GetMethodID(env, brAddrClass, "<init>", "(Ljava/lang/String)V");
+    if(brAddrConstructor == NULL){
+        printf("Cannot found the constructor of BrAddr.");
+        return NULL;
+    }
+
+     //查找com.jg.softbus.network.protocol.BleAddr的java对象
+    jclass bleAddrClass = (*env)->FindClass(env, "com/jg/softbus/network/protocol/BleAddr");
+    if(bleAddrClass == NULL){
+        printf("Cannot found the BleAddr class.");
+        return NULL;
+    }
+    //查找BleAddr无参构造函数,函数结构为:BleAddr()
+    jmethodID bleAddrConstructor = (*env)->GetMethodID(env, bleAddrClass, "<init>", "()V");
+    if(bleAddrConstructor == NULL){
+        printf("Cannot found the constructor of BleAddr.");
+        return NULL;
+    }
+    //查找com.jg.softbus.network.protocol.BleProtocolType的java对象
+    // jclass bleProtocolTypeClass = (*env)->FindClass(env, "com/jg/softbus/network/protocol/BleProtocolType");
+    // if(bleProtocolTypeClass == NULL){
+    //     printf("Cannot found the BleProtocolType class.");
+    //     return NULL;
+    // }
+
+    //查找com/jg/softbus/network/protocol/SessionAddr的java对象
+    // jclass sessionAddrClass = (*env)->FindClass(env, "com/jg/softbus/network/protocol/SessionAddr");
+    // if(sessionAddrClass == NULL){
+    //     printf("Cannot found the SessionAddr class.");
+    //     return NULL;
+    // }
+    //查找SessionAddr无参构造函数,函数结构为:SessionAddr()
+    // jmethodID sessionAddrConstructor = (*env)->GetMethodID(env, sessionAddrClass, "<init>", "()V");
+    // if(sessionAddrConstructor == NULL){
+    //     printf("Cannot found the constructor of SessionAddr.");
+    //     return NULL;
+    // }
+    //基于无参的构造函数创建ConnectionAddr对象
+    jmethodID connectionAddrConstructor = (*env)->GetMethodID(env, connectionAddrClass, "<init>", "()V");
+    jobject addrObj = (*env)->NewObject(env, connectionAddrClass, connectionAddrConstructor);
+    //获取ConnectionAddrType对象
+    jmethodID getForValueMethod = (*env)->GetStaticMethodID(env, connectionAddrTypeClass, "getForValue", "(I)Lcom/jg/softbus/network/protocol/ConnectionAddrType;");  
+    if (getForValueMethod == NULL) {  
+        // 处理错误  
+        printf("Cannot found the method:getForValue(int)");
+        return NULL;
+    }
+    //根据device提供的地址类型获取ConnectionAddrType对象
+    jobject addrTypeObj = (*env)->CallStaticObjectMethod(env, connectionAddrTypeClass, getForValueMethod, addr->type);
+    if(addrTypeObj == NULL) {
+        // 处理错误  
+        printf("Cannot found the ConnectionAddrType. type info: %d", addr->type);
+        return NULL;
+    }
+    //查找ConnectionAddr的setType(ConnectionAddrType type)方法
+    jmethodID setTypeMethod = (*env)->GetMethodID(env, connectionAddrClass, "setType", "(Lcom/jg/softbus/network/protocol/ConnectionAddrType;)V");
+    //设置地址类型到地址对象中
+    (*env)->CallVoidMethod(env, addrObj, setTypeMethod, addrTypeObj);  
+    (*env)->DeleteLocalRef(env, addrTypeObj); 
+    //无参创建ConnectionAddrInfo的java对象
+    jobject infoObj = (*env)->NewObject(env, connectionAddrInfoClass, connectionAddrInfoConstructor);
+    //判断addr->type的类型,可参考下面代码的Switch方式
+    switch (addr->type) {
+        case CONNECTION_ADDR_WLAN: {
+            printf("ip=%s,port=%d,", addr->info.ip.ip, addr->info.ip.port);
+        }
+        case CONNECTION_ADDR_ETH: {
+            jstring ipstr = (*env)->NewStringUTF(env, addr->info.ip.ip);
+            //并使用有参构造函数进行初始化
+            jobject ipAddrObj = (*env)->NewObject(env, ipAddrClass, ipAddrConstructor, ipstr, addr->info.ip.port);
+            //将地址对象写入ConnectionAddrInfo对象中
+            jmethodID setIpMethod = (*env)->GetMethodID(env, connectionAddrClass, "setIp", "(Lcom/jg/softbus/network/protocol/IpAddr;)V");
+            //设置地址类型到地址对象中
+            (*env)->CallVoidMethod(env, addrObj, setIpMethod, ipAddrObj);  
+            (*env)->DeleteLocalRef(env, ipAddrObj); 
+            break;
+        }
+        case CONNECTION_ADDR_BR: {
+            jstring brMacStr = (*env)->NewStringUTF(env, addr->info.br.brMac);
+            //并使用有参构造函数进行初始化
+            jobject brAddrObj = (*env)->NewObject(env, brAddrClass, brAddrConstructor,  brMacStr);
+            //将地址对象写入ConnectionAddrInfo对象中
+            jmethodID setBrMethod = (*env)->GetMethodID(env, connectionAddrClass, "setBr", "(Lcom/jg/softbus/network/protocol/BrAddr;)V");
+            //设置地址类型到地址对象中
+            (*env)->CallVoidMethod(env, addrObj, setBrMethod, brAddrObj);  
+            (*env)->DeleteLocalRef(env, brAddrObj); 
+            (*env)->DeleteLocalRef(env, brMacStr);
+            break;
+        }
+        case CONNECTION_ADDR_BLE: {
+              //并使用构造函数进行初始化
+            jobject bleAddrObj = (*env)->NewObject(env, bleAddrClass, bleAddrConstructor);
+            // //获取BleProtocolType对象
+            // jmethodID getForValueMethod2 = (*env)->GetStaticMethodID(env, bleProtocolTypeClass, "getForValue", "(I)Lcom/jg/softbus/network/protocol/BleProtocolType;");  
+            // if (getForValueMethod2 == NULL) {  
+            //     // 处理错误  
+            //     printf("Cannot found the method:getForValue(int)");
+            //     return NULL;
+            // }
+            // //根据device提供的bleprotocol类型获取BleProtocolType对象
+            // jobject bleProtocolTypeObj = (*env)->CallStaticObjectMethod(env, bleProtocolTypeClass, getForValueMethod2, addr->info.ble.protocol);
+            // if(bleProtocolTypeObj == NULL) {
+            //     // 处理错误  
+            //     printf("Cannot found the BleProtocolType. type info: %d", addr->info.ble.protocol);
+            //     return NULL;
+            // }
+            // //将地址对象写入ConnectionAddrInfo对象中
+            // jmethodID setProtocolMethod = (*env)->GetMethodID(env, bleAddrClass, "setProtocol", "(Lcom/jg/softbus/network/protocol/BleProtocolType;)V");
+            // (*env)->CallVoidMethod(env, bleAddrObj, setProtocolMethod, bleProtocolTypeObj);
+            // (*env)->DeleteLocalRef(env, bleProtocolTypeObj); 
+            //setbleMac
+            jmethodID setBleMacMethod = (*env)->GetMethodID(env, bleAddrClass, "setBleMac", "(Ljava/lang/String)V");
+            jstring bleMac = (*env)->NewStringUTF(env, addr->info.ble.bleMac);
+            (*env)->CallVoidMethod(env, bleAddrObj, setBleMacMethod, bleMac);
+            (*env)->DeleteLocalRef(env, bleMac);
+            //setUdidHash
+            jmethodID setUdidHashMethod = (*env)->GetMethodID(env, bleAddrClass, "setUdidHash", "([B)V");
+            size_t len = UDID_HASH_LEN / sizeof(uint8_t);  
+            jbyteArray byteArray = (*env)->NewByteArray(env, len);
+              (*env)->SetByteArrayRegion(env, byteArray, 0, len, (const jbyte*)addr->info.ble.udidHash);
+            // 将udidHash转换为整数  
+            // int hash_value = 0;  
+            // for (int k = 0; k < UDID_HASH_LEN; k++) {  
+            //     hash_value = (hash_value << 8) + addr->info.ble.udidHash[k];  
+            // }
+            (*env)->CallVoidMethod(env, bleAddrObj, setUdidHashMethod, byteArray);
+            (*env)->DeleteLocalRef(env, byteArray);
+
+            // //setPsm
+            // jmethodID setPsmMethod = (*env)->GetMethodID(env, bleAddrClass, "setPsm", "(I)V");
+            // (*env)->CallVoidMethod(env, bleAddrObj, setPsmMethod, addr->info.ble.psm);
+            
+            //将地址对象写入ConnectionAddrInfo对象中
+            jmethodID setBleMethod = (*env)->GetMethodID(env, connectionAddrClass, "setBle", "(Lcom/jg/softbus/network/protocol/BrAddr;)V");
+            (*env)->CallVoidMethod(env, addrObj, setBleMethod, bleAddrObj);  
+            (*env)->DeleteLocalRef(env, bleAddrObj); 
+            printf("bleMac=%s,", addr->info.ble.bleMac);
+            break;
+        }
+        // case CONNECTION_ADDR_SESSION:
+        //     //创建SessionAddr对象
+        //     jobject sessionAddrObj = (*env)->NewObject(env, sessionAddrClass, sessionAddrConstructor);
+        //     //获取void setSessionId(Integer sessionId)方法
+        //     jmethodID setSessionIdMethod = (*env)->GetMethodID(env, sessionAddrClass, "setSessionId", "(I)V");
+        //     //将device中的sessionId调用方法设置到sessionAddrObj中
+        //     (*env)->CallVoidMethod(env, sessionAddrObj, setSessionIdMethod, addr->info.session.sessionId);
+        //     //获取void setChannelId(Integer channelId)方法
+        //     jmethodID setChannelIdMethod = (*env)->GetMethodID(env, sessionAddrClass, "setChannelId", "(I)V");
+        //     //将device中的channelId调用方法设置到sessionAddrObj中
+        //     (*env)->CallVoidMethod(env, sessionAddrObj, setChannelIdMethod, addr->info.session.channelId);
+        //     //获取void setType(String type)方法
+        //     jmethodID setTypeMethod = (*env)->GetMethodID(env, sessionAddrClass, "setType", "(Ljava/lang/String;)V");
+        //     //将device中的type调用方法设置到sessionAddrObj中
+        //     jstring sessionTypeStr = (*env)->NewStringUTF(env, addr->info.session.type);
+        //     (*env)->CallVoidMethod(env, sessionAddrObj, setTypeMethod, sessionTypeStr);
+        //     jmethodID setSessionMethod = (*env)->GetMethodID(env, connectionAddrClass, "setSession", "(Lcom/jg/softbus/network/protocol/SessionAddr;)V");   
+        //     (*env)->CallVoidMethod(env, addrObj, setSessionMethod, sessionAddrObj);
+        //     (*env)->DeleteLocalRef(env, sessionTypeStr);
+        //     (*env)->DeleteLocalRef(env, sessionAddrObj);
+        //     printf("sessionId=%d, channelId=%d, type=%d", addr->info.session.sessionId, addr->info.session.channelId, addr->info.session.type);
+        //     break;
+        default:
+            break;
+    }
+    //获取ConnectionAddr中的void setPeerUid(String peerUid)方法,将device中的peerUid放入到addrObj中
+    jmethodID setPeerUidMethod = (*env)->GetMethodID(env, connectionAddrClass, "setPeerUid", "(Ljava/lang/String;)V");  
+    jstring peerUidStr = (*env)->NewStringUTF(env, addr->peerUid);  
+    (*env)->CallVoidMethod(env, addrObj, setPeerUidMethod, peerUidStr);  
+    (*env)->DeleteLocalRef(env, peerUidStr);
+    return addrObj;
+}
+
+
+void onJoinLNNResult(ConnectionAddr *addr, const char *networkId, int32_t retCode)
+{
+  // 获取JNIEnv环境
+  JNIEnv *env;
+  // 将当前线程附加到Java虚拟机
+  (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL);
+  // 获取当前对象的类引用
+  jclass nativeLibClass = (*env)->GetObjectClass(env, lNNCallback);
+  // 获取当前对象的publishSuccess方法的ID
+  jmethodID callbackMethod = (*env)->GetMethodID(env, nativeLibClass, "onJoinLNNResult", "(Lcom/jg/softbus/network/protocol/ConnectionAddr;Ljava/lang/String;I)V");
+  //将ConnectionAddr转换为java对应的对象
+  jobject addrObj = parseAddrToJava(env, addr);
+  if(addrObj == NULL) {
+    return;
+  }
+  jstring networkIdStr = (*env)->NewStringUTF(env, networkId); 
+  printf("callback the join event. networkId:%s", networkId);
+  //调用回调方法执行
+  (*env)->CallVoidMethod(env, lNNCallback, callbackMethod, addrObj, networkIdStr, retCode);
+  printf("callback the join event completed. networkId:%s", networkId);
+  //删除本地对象
+  (*env)->DeleteLocalRef(env, addrObj);
+  //将当前线程从java虚拟机中移除
+  (*jvm)->DetachCurrentThread(jvm);
+}
+
+/*
+ * Class:     com_jg_softbus_naservice_LNNService
+ * Method:    joinLNN
+ * Signature: (Ljava/lang/String;Lcom/jg/softbus/network/protocol/ConnectionAddr;Lcom/jg/softbus/network/callback/ILNNCallback;)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_LNNService_joinLNN
+  (JNIEnv *env, jobject obj, jstring pkgName, jobject targetAddr, jobject callback) {
+    // 保存Java虚拟机的引用
+    (*env)->GetJavaVM(env, &jvm);
+    lNNCallback = (*env)->NewGlobalRef(env, callback); 
+     //包名处理
+    const char *pkgNameStr = (*env)->GetStringUTFChars(env, pkgName, NULL);
+    ConnectionAddr addr;
+    int ret = parseConnectAddr(env, targetAddr, &addr);
+    if(ret !=0) {
+      // 尝试进行一些可能会抛出异常的操作  
+        jclass exceptionClass = (*env)->FindClass(env, "java/lang/Exception"); // 获取异常类 
+        // 如果找不到异常类,则抛出异常  
+        jmethodID exceptionConstructor = (*env)->GetMethodID(env, exceptionClass, "<init>", "()V");  
+        jthrowable exception = (*env)->NewObject(env, exceptionClass, exceptionConstructor);  
+         // 抛出异常 
+        (*env)->ThrowNew(env, exceptionClass, "ConnectionAddr object error."); 
+        //解析失败无法继续操作
+        return -1;
+    }
+    printf("joinLNN start...");
+    ret = JoinLNN(pkgNameStr, &addr, onJoinLNNResult);
+    printf("joinLNN completed...");
+    (*env)->ReleaseStringUTFChars(env, pkgName, pkgNameStr);
+    return ret;
+  }
+/**
+ * 离开网络回调函数
+*/
+void onLeaveLNNResult(const char *networkId, int32_t retCode)
+{
+  // 获取JNIEnv环境
+  JNIEnv *env;
+  // 将当前线程附加到Java虚拟机
+  (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL);
+  // 获取当前对象的类引用
+  jclass nativeLibClass = (*env)->GetObjectClass(env, leaveCallback);
+  // 获取当前对象的publishSuccess方法的ID
+  jmethodID callbackMethod = (*env)->GetMethodID(env, nativeLibClass, "onLeaveLNNResult", "(Ljava/lang/String;I)V");
+  jstring networkIdStr = (*env)->NewStringUTF(env, networkId); 
+  printf("callback the leave event. networkId:%s", networkId);
+  //调用回调方法执行
+  (*env)->CallVoidMethod(env, lNNCallback, callbackMethod, networkIdStr, retCode);
+  printf("callback the leave event completed. networkId:%s", networkId);
+  //将当前线程从java虚拟机中移除
+  (*jvm)->DetachCurrentThread(jvm);
+}
+/*
+ * Class:     com_jg_softbus_naservice_LNNService
+ * Method:    leaveLNN
+ * Signature: (Ljava/lang/String;Ljava/lang/String;Lcom/jg/softbus/network/callback/ILNNCallback;)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_LNNService_leaveLNN
+  (JNIEnv *env, jobject obj, jstring pkgName, jstring networkId, jobject callback) {
+    // 保存Java虚拟机的引用
+    (*env)->GetJavaVM(env, &jvm);
+    leaveCallback = (*env)->NewGlobalRef(env, callback); 
+     //包名处理
+    const char *pkgNameStr = (*env)->GetStringUTFChars(env, pkgName, NULL);
+    const char *networkIdStr = (*env)->GetStringUTFChars(env, networkId, NULL);
+    printf("leave start.");
+    int ret = LeaveLNN(pkgNameStr, networkIdStr, onLeaveLNNResult);
+    printf("leave completed.");
+    (*env)->ReleaseStringUTFChars(env, networkId, networkIdStr);
+    (*env)->ReleaseStringUTFChars(env, pkgName, pkgNameStr);
+    return ret;
+}
+/**
+ * 转换NodeBasicInfo对象为java的对象
+*/
+jobject parseNodeBasicInfoToJava(JNIEnv *env, NodeBasicInfo *info) {
+  //创建java的DeviceInfo对象
+  jclass nodeBasicInfoClass = (*env)->FindClass(env, "com/jg/softbus/network/node/NodeBasicInfo");
+  if (nodeBasicInfoClass == NULL) {  
+      // 处理错误
+      printf("Cannot found the java class:com/jg/softbus/network/node/NodeBasicInfo");
+      return NULL;
+  }
+  jmethodID constructor = (*env)->GetMethodID(env, nodeBasicInfoClass, "<init>", "(Ljava/lang/String;Ljava/lang/String;S)V");  
+  if (constructor == NULL) {
+      // 处理错误
+      printf("Cannot found the default constructor of NodeBasicInfo.");
+      return NULL;
+  }
+  jstring networkId = (*env)->NewStringUTF(env, info->networkId);
+  jstring deviceName = (*env)->NewStringUTF(env, info->deviceName);
+  jobject nbInfoObj = (*env)->NewObject(env, nodeBasicInfoClass, constructor, networkId, deviceName, info->deviceTypeId);  
+  return nbInfoObj;
+}
+/**
+ * 节点上线事件回调
+*/
+void onNodeOnline(NodeBasicInfo *info) {
+  // 获取JNIEnv环境
+  JNIEnv *env;
+  // 将当前线程附加到Java虚拟机
+  (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL);
+
+  // 获取当前对象的类引用
+  jclass nativeLibClass = (*env)->GetObjectClass(env, nodeStateCb);
+  // 获取当前对象的publishSuccess方法的ID
+  jmethodID callbackMethod = (*env)->GetMethodID(env, nativeLibClass, "onNodeOnline", "(Lcom/jg/softbus/network/node/NodeBasicInfo;)V");
+  //将NodeBasicInfo转换为java对应的对象
+  jobject nodeBasicInfoObj = parseNodeBasicInfoToJava(env, info);
+  if(nodeBasicInfoObj == NULL) {
+    return;
+  }
+  printf("listen the node online.");
+  //调用回调方法执行
+  (*env)->CallVoidMethod(env, nodeStateCb, callbackMethod, nodeBasicInfoObj);
+  printf("java listen node online completed.");
+  //删除本地对象
+  (*env)->DeleteLocalRef(env, nodeBasicInfoObj);
+  //将当前线程从java虚拟机中移除
+  (*jvm)->DetachCurrentThread(jvm);
+
+}
+/**
+ * 节点下线事件回调
+*/
+void onNodeOffline(NodeBasicInfo *info) {
+  // 获取JNIEnv环境
+  JNIEnv *env;
+  // 将当前线程附加到Java虚拟机
+  (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL);
+
+  // 获取当前对象的类引用
+  jclass nativeLibClass = (*env)->GetObjectClass(env, nodeStateCb);
+  // 获取当前对象的publishSuccess方法的ID
+  jmethodID callbackMethod = (*env)->GetMethodID(env, nativeLibClass, "onNodeOffline", "(Lcom/jg/softbus/network/node/NodeBasicInfo;)V");
+  //将NodeBasicInfo转换为java对应的对象
+  jobject nodeBasicInfoObj = parseNodeBasicInfoToJava(env, info);
+  if(nodeBasicInfoObj == NULL) {
+    return;
+  }
+  printf("listen the node offline.");
+  //调用回调方法执行
+  (*env)->CallVoidMethod(env, nodeStateCb, callbackMethod, nodeBasicInfoObj);
+  printf("java listen node offline completed.");
+  //删除本地对象
+  (*env)->DeleteLocalRef(env, nodeBasicInfoObj);
+  //将当前线程从java虚拟机中移除
+  (*jvm)->DetachCurrentThread(jvm);
+}
+/**
+ * 节点信息变化事件回调
+*/
+void onNodeBasicInfoChanged(NodeBasicInfoType type, NodeBasicInfo *info) {
+  // 获取JNIEnv环境
+  JNIEnv *env;
+  // 将当前线程附加到Java虚拟机
+  (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL);
+
+  // 获取当前对象的类引用
+  jclass nativeLibClass = (*env)->GetObjectClass(env, nodeStateCb);
+  // 获取当前对象的publishSuccess方法的ID
+  jmethodID callbackMethod = (*env)->GetMethodID(env, nativeLibClass, "onNodeBasicInfoChanged", "(Lcom/jg/softbus/network/node/NodeBasicInfoType;Lcom/jg/softbus/network/node/NodeBasicInfo;)V");
+  //将NodeBasicInfo转换为java对应的对象
+  jobject nodeBasicInfoObj = parseNodeBasicInfoToJava(env, info);
+  if(nodeBasicInfoObj == NULL) {
+    return;
+  }
+  //创建java的NodeBasicInfoType对象
+  jclass nodeBasicInfoTypeClass = (*env)->FindClass(env, "com/jg/softbus/network/node/NodeBasicInfoType");
+  if (nodeBasicInfoTypeClass == NULL) {  
+      // 处理错误
+      printf("Cannot found the java class:com/jg/softbus/network/node/NodeBasicInfoType");
+      return;
+  }
+  jmethodID getForValueMethod = (*env)->GetStaticMethodID(env, nodeBasicInfoTypeClass, "getForValue", "(I)Lcom/jg/softbus/network/node/NodeBasicInfoType;");  
+  if (getForValueMethod == NULL) {
+      // 处理错误
+      printf("Cannot found the static method:getForValue(int)");
+      return;
+  }
+  jobject nodeBasicInfoTypeObj = (*env)->CallStaticObjectMethod(env, nodeBasicInfoTypeClass, getForValueMethod, (int)type);  
+  if (nodeBasicInfoTypeObj == NULL) {
+      // 处理错误
+      printf("Cannot found NodeBasicInfoType. the type is: %d", type);
+      return;
+  }
+  
+  printf("listen the node change.");
+  //调用回调方法执行
+  (*env)->CallVoidMethod(env, nodeStateCb, callbackMethod, nodeBasicInfoTypeObj, nodeBasicInfoObj);
+  printf("java listen node chagned completed.");
+  //删除本地对象
+  (*env)->DeleteLocalRef(env, nodeBasicInfoObj);
+    //删除本地对象
+  (*env)->DeleteLocalRef(env, nodeBasicInfoTypeObj);
+  //将当前线程从java虚拟机中移除
+  (*jvm)->DetachCurrentThread(jvm);
+}
+/**
+ * 将c的NodeStatus结构转换为java对应的对象
+*/
+// jobject parseNodeStatusToJava(JNIEnv *env, NodeStatus *status) {
+//   //创建java的NodeStatusType对象
+//   jclass nodeStatusClass = (*env)->FindClass(env, "com/jg/softbus/network/node/NodeStatus");
+//   if(nodeStatusClass == NULL) {
+//     printf("Cannot found the java class:com/jg/softbus/network/node/NodeStatus");
+//     return NULL;
+//   }
+//   jmethodID constructor = (*env)->GetMethodID(env, nodeStatusClass, "<init>", "()V");  
+//   if (constructor == NULL) {
+//       // 处理错误
+//       printf("Cannot found the default constructor of NodeStatus.");
+//       return NULL;
+//   }  
+//   jobject obj = (*env)->NewObject(env, nodeStatusClass, constructor);  
+//   if (obj == NULL) {
+//       // 处理错误
+//       printf("Cannot create the NodeStatus object.");
+//       return NULL;
+//   }
+//   //设置basicInfo
+//   jmethodID setBasicInfoMethod = (*env)->GetMethodID(env, nodeStatusClass, "setBasicInfo", "(Lcom/jg/softbus/network/node/NodeBasicInfo;)V");
+//   jobject nodeBasicInfoObj = parseNodeBasicInfoToJava(env, status->basicInfo);
+//   (*env)->CallVoidMethod(env, obj, setBasicInfoMethod, nodeBasicInfoObj);
+//   (*env)->DeleteLocalRef(env, nodeBasicInfoObj);
+//   //authStatus
+//   jmethodID setAuthStatusMethod = (*env)->GetMethodID(env, nodeStatusClass, "setAuthStatus", "(S)V");
+//   (*env)->CallVoidMethod(env, obj, setAuthStatusMethod, status->authStatus);
+//   //dataBaseStatus
+//   jmethodID setDataBaseStatusMethod = (*env)->GetMethodID(env, nodeStatusClass, "setDataBaseStatus", "(S)V");
+//   (*env)->CallVoidMethod(env, obj, setDataBaseStatusMethod, status->dataBaseStatus);
+//   //meshType
+//   jmethodID setMeshTypeMethod = (*env)->GetMethodID(env, nodeStatusClass, "setMeshType", "(S)V");
+//   (*env)->CallVoidMethod(env, obj, setMeshTypeMethod, status->meshType);
+//   //reserved
+//   jmethodID setReservedMethod = (*env)->GetMethodID(env, nodeStatusClass, "setReserved", "([S)V");
+//   (*env)->CallVoidMethod(env, obj, setReservedMethod, (jshort*)status->meshType);
+//   reutrn obj;
+// }
+/**
+ * 设备运行状态变化事件回调
+*/
+// void onNodeStatusChanged(NodeStatusType type, NodeStatus *status) {
+//   // 获取JNIEnv环境
+//   JNIEnv *env;
+//   // 将当前线程附加到Java虚拟机
+//   (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL);
+
+//   // 获取当前对象的类引用
+//   jclass nativeLibClass = (*env)->GetObjectClass(env, nodeStateCb);
+//   // 获取当前对象的publishSuccess方法的ID
+//   jmethodID callbackMethod = (*env)->GetMethodID(env, nativeLibClass, "onNodeStatusChanged", "(Lcom/jg/softbus/network/node/NodeStatusType;Lcom/jg/softbus/network/node/status;)V");
+//   //将NodeBasicInfo转换为java对应的对象
+//   jobject nodeStatusObj = parseNodeStatusToJava(status);
+//   if(nodeStatusObj == NULL) {
+//     return;
+//   }
+//   //创建java的NodeStatusType对象
+//   jclass nodeStatusTypeClass = (*env)->FindClass(env, "com/jg/softbus/network/node/NodeStatusType");
+//   if (nodeStatusTypeClass == NULL) {  
+//       // 处理错误
+//       printf("Cannot found the java class:com/jg/softbus/network/node/NodeStatusType");
+//       return;
+//   }
+//   jmethodID getForValueMethod = (*env)->GetStaticMethodID(env, nodeBasicInfoTypeClass, "getForValue", "(I)Lcom/jg/softbus/network/node/nodeStatusTypeClass;");  
+//   if (getForValueMethod == NULL) {
+//       // 处理错误
+//       printf("Cannot found the static method:getForValue(int)");
+//       return;
+//   }
+//   jobject nodeStatusTypeObj = (*env)->CallStaticObjectMethod(env, nodeStatusTypeClass, getForValueMethod, (int)type);  
+//   if (nodeStatusTypeObj == NULL) {
+//     // 处理错误
+//     printf("Cannot found NodeStatusType. the type is: %d", type);
+//     return;
+//   }
+  
+//   printf("listen the node status change.");
+//   //调用回调方法执行
+//   (*env)->CallVoidMethod(env, nodeStateCb, callbackMethod, nodeStatusTypeObj, nodeStatusObj);
+//   printf("java listen node status chagned completed.");
+//   //删除本地对象
+//   (*env)->DeleteLocalRef(env, nodeStatusObj);
+//   //删除本地对象
+//   (*env)->DeleteLocalRef(env, nodeStatusTypeObj);
+//   //将当前线程从java虚拟机中移除
+//   (*jvm)->DetachCurrentThread(jvm);
+// }
+
+/**
+ * 创建全局回调对象
+*/
+void createGlobalStateCb(JNIEnv *env, jobject nodeStateCallback)
+{
+  //获取当前对象的类引用
+  jclass nscbClass = (*env)->GetObjectClass(env, nodeStateCallback);
+  // 获取当前对象的getEvents方法的ID
+  jmethodID getEventsMethod = (*env)->GetMethodID(env, nscbClass, "getEvents", "()I");
+  jint events = (*env)->CallIntMethod(env, nodeStateCallback, getEventsMethod);
+  //监听有关所有事件
+  g_stateCb.events = events;
+  g_stateCb.onNodeOffline = onNodeOffline;
+  g_stateCb.onNodeOnline = onNodeOnline;
+  g_stateCb.onNodeBasicInfoChanged = onNodeBasicInfoChanged;
+  // g_stateCb.onNodeStatusChanged = onNodeStatusChanged;
+}
+/*
+ * Class:     com_jg_softbus_naservice_LNNService
+ * Method:    regNodeDeviceStateCb
+ * Signature: (Ljava/lang/String;Lcom/jg/softbus/network/callback/INodeStateCb;)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_LNNService_regNodeDeviceStateCb
+  (JNIEnv *env, jobject obj, jstring pkgName, jobject nodeStateCallback) {
+    // 保存Java虚拟机的引用
+    (*env)->GetJavaVM(env, &jvm);
+    nodeStateCb = (*env)->NewGlobalRef(env, nodeStateCallback); 
+     //包名处理
+    const char *pkgNameStr = (*env)->GetStringUTFChars(env, pkgName, NULL);
+    createGlobalStateCb(env, nodeStateCallback);
+    int ret = RegNodeDeviceStateCb(pkgNameStr, &g_stateCb);
+    (*env)->ReleaseStringUTFChars(env, pkgName, pkgNameStr);
+    return ret;
+  }
+
+/*
+ * Class:     com_jg_softbus_naservice_LNNService
+ * Method:    unRegNodeDeviceStateCb
+ * Signature: (Lcom/jg/softbus/network/callback/INodeStateCb;)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_LNNService_unRegNodeDeviceStateCb
+  (JNIEnv *env, jobject obj, jobject nodeStateCallback) {
+    // 保存Java虚拟机的引用
+    (*env)->GetJavaVM(env, &jvm);
+    int ret = 0x00;
+    if (&g_stateCb != NULL) {
+      //注销事件
+      ret = UnregNodeDeviceStateCb(&g_stateCb);
+    }
+    return ret;
+  }
+
+/*
+ * Class:     com_jg_softbus_naservice_LNNService
+ * Method:    destroy
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_com_jg_softbus_naservice_LNNService_destroy
+  (JNIEnv *env, jobject obj) {
+    // 删除全局引用
+    (*env)->DeleteGlobalRef(env, lNNCallback);
+    (*env)->DeleteGlobalRef(env, leaveCallback);
+    (*env)->DeleteGlobalRef(env, nodeStateCb);
+    free(jvm);
+  }

+ 254 - 0
softbus-jdk/SoftbusPublish.c

@@ -0,0 +1,254 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <jni.h>
+#include "securec.h"
+#include "discovery_service.h"
+#include "softbus_bus_center.h"
+#include "com_jg_softbus_naservice_PublishService.h"
+
+// 全局变量,用于保存Java虚拟机的引用
+JavaVM *jvm;
+//全局引用变量,用于保存java对象
+jobject globalRef;
+
+/**
+   * 解析对象为c的PublishInfo结构
+  */
+  int ParsePublishInfo(JNIEnv *env, jobject pInfo, PublishInfo *info) {
+    jclass infoClass = (*env)->GetObjectClass(env, pInfo);
+    // 获取publishId
+    jmethodID getPublishIdMethod = (*env)->GetMethodID(env, infoClass, "getPublishId", "()I");
+    jint publishId = (*env)->CallIntMethod(env, pInfo, getPublishIdMethod);
+    info->publishId = publishId;
+    printf("PublishInfo->publishId:%d\n", publishId);
+    //获取mode
+    jmethodID getDiscoverModeMethod = (*env)->GetMethodID(env, infoClass, "getMode", "()Lcom/jg/softbus/discovery/enums/DiscoverMode;");
+    jobject modeInfo = (*env)->CallObjectMethod(env, pInfo, getDiscoverModeMethod);
+    jclass modeClass = (*env)->GetObjectClass(env, modeInfo);
+    jmethodID getModeMethod = (*env)->GetMethodID(env, modeClass, "valueOf", "()I");
+    jint mode = (*env)->CallIntMethod(env, modeInfo, getModeMethod);
+    info->mode = mode;
+    (*env)->DeleteLocalRef(env,modeInfo);
+    printf("PublishInfo->mode:%d\n", mode);
+    //获取medium
+    jmethodID getMediumMethod = (*env)->GetMethodID(env, infoClass, "getMedium", "()Lcom/jg/softbus/discovery/enums/ExchangeMedium;");
+    jobject mediumInfo = (*env)->CallObjectMethod(env, pInfo, getMediumMethod);
+    jclass mediumClass = (*env)->GetObjectClass(env, mediumInfo);
+    jmethodID getMediumMethod2 = (*env)->GetMethodID(env, mediumClass, "valueOf", "()I");
+    jint medium = (*env)->CallIntMethod(env, mediumInfo, getMediumMethod2);
+    info->medium = medium;
+    (*env)->DeleteLocalRef(env, mediumInfo);
+    printf("PublishInfo->medium:%d\n", medium);
+    //获取freq频次
+    jmethodID getFreqMethod = (*env)->GetMethodID(env, infoClass, "getFreq", "()Lcom/jg/softbus/discovery/enums/ExchangeFreq;");
+    jobject freqInfo = (*env)->CallObjectMethod(env, pInfo, getFreqMethod);
+    jclass freqClass = (*env)->GetObjectClass(env, freqInfo);
+    jmethodID getFreqMethod2 = (*env)->GetMethodID(env, freqClass, "valueOf", "()I");
+    jint freq = (*env)->CallIntMethod(env, freqInfo, getFreqMethod2);
+    info->freq = freq;
+    (*env)->DeleteLocalRef(env, freqInfo);
+    printf("PublishInfo->freq:%d\n", freq);
+    //获取capability
+    jmethodID getCapabilityMethod = (*env)->GetMethodID(env, infoClass, "getCapability", "()Ljava/lang/String;");
+    jstring capability = (*env)->CallObjectMethod(env, pInfo, getCapabilityMethod);
+    const char *capabilityStr = (*env)->GetStringUTFChars(env, capability, 0);
+    info->capability=capabilityStr;
+    if(info->capability == NULL) {
+        info->capability = "osdCapability";
+    }
+    (*env)->ReleaseStringUTFChars(env, capability, capabilityStr);
+    printf("PublishInfo->capability:%s\n", capabilityStr);
+    //获取capabilityData
+    jmethodID getCapabilityDataMethod = (*env)->GetMethodID(env, infoClass, "getCapabilityData", "()Ljava/lang/String;");
+    jstring capabilityData = (*env)->CallObjectMethod(env, pInfo, getCapabilityDataMethod);
+    const char *capabilityDataStr = (*env)->GetStringUTFChars(env, capabilityData, 0);
+    strcpy(info->capabilityData, capabilityDataStr);
+
+    if(info->capabilityData == NULL) {
+        info->capabilityData = NULL;
+    }
+    (*env)->ReleaseStringUTFChars(env, capabilityData, capabilityDataStr);
+    printf("PublishInfo->capabilityData:%s\n", capabilityDataStr);
+    //获取数据长度
+    jmethodID getDataLenMethod = (*env)->GetMethodID(env, infoClass, "getDataLen", "()I");
+    info->dataLen = (*env)->CallIntMethod(env, pInfo, getDataLenMethod);
+    printf("PublishInfo->dataLen:%d\n", info->dataLen);
+    //获取ranging bool类型
+    //jmethodID getRangingMethod = (*env)->GetMethodID(env, infoClass, "getRanging", "()Z");
+    //info->ranging = (*env)->CallBooleanMethod(env, pInfo, getRangingMethod);
+    //printf("PublishInfo->ranging:%d\n", info->ranging);
+    return 0;
+  }
+ /**
+   * 发布成功回调处理
+  */
+  void PublishSuc(int publishId)
+  {
+    // 获取JNIEnv环境
+    JNIEnv *env;
+    // 将当前线程附加到Java虚拟机
+    (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL);
+    // 获取当前对象的类引用
+    jclass nativeLibClass = (*env)->GetObjectClass(env, globalRef);
+    // 获取当前对象的publishSuccess方法的ID
+    jmethodID callbackMethod = (*env)->GetMethodID(env, nativeLibClass, "onPublishSuccess", "(I)V");
+    // 调用当前对象的非静态方法
+    (*env)->CallVoidMethod(env, globalRef, callbackMethod, publishId);
+
+    // 将当前线程从Java虚拟机分离
+    (*jvm)->DetachCurrentThread(jvm);
+
+     printf("<PublishSuc>CB: publish %d done\n", publishId);
+  }
+
+  /**
+   * 发布失败回调处理
+  */
+  void PublishFailed(int publishId, PublishFailReason reason)
+  {
+    // 获取JNIEnv环境
+    JNIEnv *env;
+    // 将当前线程附加到Java虚拟机
+    (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL);
+    // 获取当前对象的类引用
+    jclass nativeLibClass = (*env)->GetObjectClass(env, globalRef);
+    // 获取当前对象的publishSuccess方法的ID
+    jmethodID callbackMethod = (*env)->GetMethodID(env, nativeLibClass, "onPublishFail", "(II)V");
+    // 调用当前对象的非静态方法
+    (*env)->CallVoidMethod(env, globalRef, callbackMethod, publishId, (int)reason);
+    // 将当前线程从Java虚拟机分离
+    (*jvm)->DetachCurrentThread(jvm);
+
+     printf("<PublishFailed>CB: publish %d failed, reason=%d\n", publishId, (int)reason);
+  }
+
+/**
+ * 发布服务
+*/
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_PublishService_publishService
+  (JNIEnv *env, jobject obj, jstring pkgName, jobject publishInfo, jobject callback) {
+    // 保存Java虚拟机的引用
+    (*env)->GetJavaVM(env, &jvm);
+    globalRef = (*env)->NewGlobalRef(env, callback); 
+    //包名处理
+    const char *pkgNameStr = (*env)->GetStringUTFChars(env, pkgName, NULL);
+    PublishInfo info;
+    int ret = ParsePublishInfo(env, publishInfo, &info);
+    if(ret != 0) {
+        // 尝试进行一些可能会抛出异常的操作  
+        jclass exceptionClass = (*env)->FindClass(env, "java/lang/Exception"); // 获取异常类 
+        // 如果找不到异常类,则抛出异常  
+        jmethodID exceptionConstructor = (*env)->GetMethodID(env, exceptionClass, "<init>", "()V");  
+        jthrowable exception = (*env)->NewObject(env, exceptionClass, exceptionConstructor);  
+         // 抛出异常 
+        (*env)->ThrowNew(env, exceptionClass, "PublishInfo object error."); 
+        //解析失败无法继续操作
+        return -1;
+    }
+    IPublishCallback cb = {
+        .OnPublishSuccess = PublishSuc,
+        .OnPublishFail = PublishFailed,
+    };
+    //将当前的publishId维护进pkgName关系中,方便后期管理
+    // addPublishIdToPkgName(pkgNameStr, info.publishId);
+    //发布服务
+    ret = PublishService(pkgNameStr, &info, &cb);
+    (*env)->ReleaseStringUTFChars(env, pkgName, pkgNameStr); 
+    return ret;
+  }
+/**
+ * 停止发布
+*/
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_PublishService_unPublishService
+  (JNIEnv *env, jobject obj, jstring pkgName, jint publishId) {
+    const char *pkgNameStr = (*env)->GetStringUTFChars(env, pkgName, NULL);
+    int ret = UnPublishService(pkgNameStr, publishId);
+    if (ret != 0) {
+        // 尝试进行一些可能会抛出异常的操作  
+        jclass exceptionClass = (*env)->FindClass(env, "java/lang/Exception"); // 获取异常类 
+        // 如果找不到异常类,则抛出异常  
+        jmethodID exceptionConstructor = (*env)->GetMethodID(env, exceptionClass, "<init>", "()V");  
+        jthrowable exception = (*env)->NewObject(env, exceptionClass, exceptionConstructor);  
+         // 抛出异常 
+        (*env)->ThrowNew(env, exceptionClass, "stop publish failed!"); 
+        printf("UnPublishService fail:%d\n", ret);
+    }
+    (*env)->ReleaseStringUTFChars(env, pkgName, pkgNameStr);
+    (*env)->DeleteGlobalRef(env, globalRef);
+  }
+/**
+ * publishLNN回调方法
+*/
+void PublishResultHandle(int publishId, PublishResult reason) {
+     // 获取JNIEnv环境
+    JNIEnv *env;
+    // 将当前线程附加到Java虚拟机
+    (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL);
+    // 获取当前对象的类引用
+    jclass nativeLibClass = (*env)->GetObjectClass(env, globalRef);
+    // 获取当前对象的publishSuccess方法的ID
+    jmethodID callbackMethod = (*env)->GetMethodID(env, nativeLibClass, "onPublishResult", "(II)V");
+    // 调用当前对象的非静态方法
+    (*env)->CallVoidMethod(env, globalRef, callbackMethod, publishId, (int)reason);
+    // 将当前线程从Java虚拟机分离
+    (*jvm)->DetachCurrentThread(jvm);
+
+     printf("<PublishFailed>CB: publish %d failed, reason=%d\n", publishId, (int)reason);
+ }
+
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_PublishService_publishLNN
+  (JNIEnv *env, jobject obj, jstring pkgName, jobject publishInfo, jobject callback) {
+        // 保存Java虚拟机的引用
+    (*env)->GetJavaVM(env, &jvm);
+    globalRef = (*env)->NewGlobalRef(env, callback); 
+    //包名处理
+    const char *pkgNameStr = (*env)->GetStringUTFChars(env, pkgName, NULL);
+     PublishInfo info;
+    int ret = ParsePublishInfo(env, publishInfo, &info);
+    if(ret != 0) {
+        // 尝试进行一些可能会抛出异常的操作  
+        jclass exceptionClass = (*env)->FindClass(env, "java/lang/Exception"); // 获取异常类 
+        // 如果找不到异常类,则抛出异常  
+        jmethodID exceptionConstructor = (*env)->GetMethodID(env, exceptionClass, "<init>", "()V");  
+        jthrowable exception = (*env)->NewObject(env, exceptionClass, exceptionConstructor);  
+         // 抛出异常 
+        (*env)->ThrowNew(env, exceptionClass, "PublishInfo object error."); 
+        //解析失败无法继续操作
+        return -1;
+    }
+    IPublishCb cb = {
+        .OnPublishResult = PublishResultHandle,
+    };
+    //将当前的publishId维护进pkgName关系中,方便后期管理
+    // addPublishIdToPkgName(pkgNameStr, info.publishId);
+    //发布服务
+    ret = PublishLNN(pkgNameStr, &info, &cb);
+    (*env)->ReleaseStringUTFChars(env, pkgName, pkgNameStr); 
+    return ret;
+  }
+
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_PublishService_stopPublishLNN
+  (JNIEnv *env, jobject obj, jstring pkgName, jint publishId) {
+      const char *pkgNameStr = (*env)->GetStringUTFChars(env, pkgName, NULL);
+      int ret = StopPublishLNN(pkgNameStr, publishId);
+      if (ret != 0) {
+          // 尝试进行一些可能会抛出异常的操作  
+          jclass exceptionClass = (*env)->FindClass(env, "java/lang/Exception"); // 获取异常类 
+          // 如果找不到异常类,则抛出异常  
+          jmethodID exceptionConstructor = (*env)->GetMethodID(env, exceptionClass, "<init>", "()V");  
+          jthrowable exception = (*env)->NewObject(env, exceptionClass, exceptionConstructor);  
+          // 抛出异常 
+          (*env)->ThrowNew(env, exceptionClass, "stop publish failed!"); 
+          printf("StopPublishLNN fail:%d\n", ret);
+      }
+      (*env)->ReleaseStringUTFChars(env, pkgName, pkgNameStr);
+      (*env)->DeleteGlobalRef(env, globalRef);
+  }
+
+JNIEXPORT void JNICALL Java_com_jg_softbus_naservice_PublishService_destroy
+  (JNIEnv *env, jobject obj) {
+     // 删除全局引用
+    (*env)->DeleteGlobalRef(env, globalRef);
+    free(jvm);
+  }

File diff suppressed because it is too large
+ 1048 - 0
softbus-jdk/SoftbusSession.c


+ 642 - 0
softbus-jdk/SoftbusSubscribe.c

@@ -0,0 +1,642 @@
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <jni.h>
+#include "securec.h"
+#include "discovery_service.h"
+#include "softbus_bus_center.h"
+#include "com_jg_softbus_naservice_SubscribeService.h"
+// 全局变量,用于保存Java虚拟机的引用
+JavaVM *jvm;
+//全局引用变量,用于保存java对象
+jobject globalRef;
+
+/**
+   * 解析java对象为c的SubscribeInfo结构
+  */
+  int ParseSubscribeInfo(JNIEnv *env, jobject subscribeInfo, SubscribeInfo *info) {
+    jclass infoClass = (*env)->GetObjectClass(env, subscribeInfo);
+    //读取subscribeId
+    jmethodID getSubscribeIdMethod = (*env)->GetMethodID(env, infoClass, "getSubscribeId", "()I");
+    jint subscribeId = (*env)->CallIntMethod(env, subscribeInfo, getSubscribeIdMethod);
+    info->subscribeId = subscribeId;
+    printf("SubscribeInfo->subscribeId:%d\n", subscribeId);
+    //获取mode
+    jmethodID getDiscoverModeMethod = (*env)->GetMethodID(env, infoClass, "getMode", "()Lcom/jg/softbus/discovery/enums/DiscoverMode;");
+    jobject modeInfo = (*env)->CallObjectMethod(env, subscribeInfo, getDiscoverModeMethod);
+    jclass modeClass = (*env)->GetObjectClass(env, modeInfo);
+    jmethodID getModeMethod = (*env)->GetMethodID(env, modeClass, "valueOf", "()I");
+    jint mode = (*env)->CallIntMethod(env, modeInfo, getModeMethod);
+    info->mode = mode;
+    (*env)->DeleteLocalRef(env, modeInfo);
+    printf("SubscribeInfo->mode:%d\n", mode);
+    //获取medium
+    jmethodID getMediumMethod = (*env)->GetMethodID(env, infoClass, "getMedium", "()Lcom/jg/softbus/discovery/enums/ExchangeMedium;");
+    jobject mediumInfo = (*env)->CallObjectMethod(env, subscribeInfo, getMediumMethod);
+    jclass mediumClass = (*env)->GetObjectClass(env, mediumInfo);
+    jmethodID getMediumMethod2 = (*env)->GetMethodID(env, mediumClass, "valueOf", "()I");
+    jint medium = (*env)->CallIntMethod(env, mediumInfo, getMediumMethod2);
+    info->medium = medium;
+    (*env)->DeleteLocalRef(env, mediumInfo);
+    printf("SubscribeInfo->medium:%d\n", medium);
+    //获取freq频次
+    jmethodID getFreqMethod = (*env)->GetMethodID(env, infoClass, "getFreq", "()Lcom/jg/softbus/discovery/enums/ExchangeFreq;");
+    jobject freqInfo = (*env)->CallObjectMethod(env, subscribeInfo, getFreqMethod);
+    jclass freqClass = (*env)->GetObjectClass(env, freqInfo);
+    jmethodID getFreqMethod2 = (*env)->GetMethodID(env, freqClass, "valueOf", "()I");
+    jint freq = (*env)->CallIntMethod(env, freqInfo, getFreqMethod2);
+    info->freq = freq;
+    (*env)->DeleteLocalRef(env, freqInfo);
+    printf("SubscribeInfo->freq:%d\n", freq);
+
+    //获取isSameAccount bool类型
+    jmethodID getIsSameAccountMethod = (*env)->GetMethodID(env, infoClass, "getIsSameAccount", "()Z");
+    info->isSameAccount = (*env)->CallBooleanMethod(env, subscribeInfo, getIsSameAccountMethod);
+    printf("SubscribeInfo->isSameAccount:%d\n", info->isSameAccount);
+
+    //获取isWakeRemote bool类型
+    jmethodID getIsWakeRemoteMethod = (*env)->GetMethodID(env, infoClass, "getIsWakeRemote", "()Z");
+    info->isWakeRemote = (*env)->CallBooleanMethod(env, subscribeInfo, getIsWakeRemoteMethod);
+    printf("SubscribeInfo->isWakeRemote:%d\n", info->isWakeRemote);
+
+    //获取capability
+    jmethodID getCapabilityMethod = (*env)->GetMethodID(env, infoClass, "getCapability", "()Ljava/lang/String;");
+    jstring capability = (*env)->CallObjectMethod(env, subscribeInfo, getCapabilityMethod);
+    const char *capabilityStr = (*env)->GetStringUTFChars(env, capability, 0);
+    info->capability = capabilityStr;
+    if(info->capability == NULL) {
+        info->capability = "osdCapability";
+    }
+    (*env)->ReleaseStringUTFChars(env, capability, capabilityStr);
+    printf("SubscribeInfo->capability:%s\n", capabilityStr);
+    //获取capabilityData
+    jmethodID getCapabilityDataMethod = (*env)->GetMethodID(env, infoClass, "getCapabilityData", "()Ljava/lang/String;");
+    jstring capabilityData = (*env)->CallObjectMethod(env, subscribeInfo, getCapabilityDataMethod);
+    const char *capabilityDataStr = (*env)->GetStringUTFChars(env, capabilityData, 0);
+    strcpy(info->capabilityData, capabilityDataStr);
+    if(info->capabilityData == NULL) {
+        info->capabilityData = NULL;
+    }
+    (*env)->ReleaseStringUTFChars(env, capabilityData, capabilityDataStr);
+    printf("SubscribeInfo->capabilityData:%s\n", capabilityDataStr);
+    //获取数据长度
+    jmethodID getDataLenMethod = (*env)->GetMethodID(env, infoClass, "getDataLen", "()I");
+    info->dataLen = (*env)->CallIntMethod(env, subscribeInfo, getDataLenMethod);
+    printf("SubscribeInfo->dataLen:%d\n", info->dataLen);
+  }
+
+/**
+  * 将c的DeviceInfo对象转换为java的object对象
+ */
+ jobject DeviceInfoToJavaObject(JNIEnv *env, const DeviceInfo *device) {
+    //创建java的DeviceInfo对象
+    jclass deviceInfoClass = (*env)->FindClass(env, "com/jg/softbus/device/DeviceInfo");
+    if (deviceInfoClass == NULL) {  
+        // 处理错误
+        printf("Cannot found the java class:com/jg/softbus/device/DeviceInfo");
+        return NULL;
+    }  
+    jmethodID constructor = (*env)->GetMethodID(env, deviceInfoClass, "<init>", "()V");  
+    if (constructor == NULL) {
+        // 处理错误
+        printf("Cannot found the default constructor of DeviceInfo.");
+        return NULL;
+    }  
+    jobject obj = (*env)->NewObject(env, deviceInfoClass, constructor);  
+    if (obj == NULL) {
+        // 处理错误
+        printf("Cannot create the DeviceInfo object.");
+        return NULL;
+    }
+    //设置devId
+    jmethodID setDevIdMethod = (*env)->GetMethodID(env, deviceInfoClass, "setDevId", "(Ljava/lang/String;)V");
+    jstring devIdStr = (*env)->NewStringUTF(env, device->devId);
+    (*env)->CallVoidMethod(env, obj, setDevIdMethod, devIdStr);
+    (*env)->DeleteLocalRef(env, devIdStr);
+    //设置devName
+    jmethodID setDevNameMethod = (*env)->GetMethodID(env, deviceInfoClass, "setDevName", "(Ljava/lang/String;)V"); 
+    jstring devNameStr = (*env)->NewStringUTF(env, device->devName);
+    (*env)->CallVoidMethod(env, obj, setDevNameMethod, devNameStr);
+    (*env)->DeleteLocalRef(env, devNameStr);
+    //发现DeviceType java类,根据其提供的静态getForValue(int)方法获取DeviceType对象
+    jclass deviceTypeClass = (*env)->FindClass(env, "com/jg/softbus/device/DeviceType");  
+    if (deviceTypeClass == NULL) {
+        // 处理错误
+        printf("Cannot found the java class:com/jg/softbus/device/DeviceType");
+        return NULL;
+    }
+    jmethodID getForValueMethod = (*env)->GetStaticMethodID(env, deviceTypeClass, "getForValue", "(I)Lcom/jg/softbus/device/DeviceType;");  
+    if (getForValueMethod == NULL) {
+        // 处理错误
+        printf("Cannot found the static method:getForValue(int)");
+        return NULL;
+    }
+    jobject deviceTypeObj = (*env)->CallStaticObjectMethod(env, deviceTypeClass, getForValueMethod, (int)(device->devType));  
+    if (deviceTypeObj == NULL) {
+        // 处理错误
+        printf("Cannot found DeviceType. the devType is: %d", device->devType);
+        return NULL;
+    }
+    //设置devType
+    jmethodID setDevTypeMethod = (*env)->GetMethodID(env, deviceInfoClass, "setDevType", "(Lcom/jg/softbus/device/DeviceType;)V");
+    (*env)->CallVoidMethod(env, obj, setDevTypeMethod, deviceTypeObj);
+    (*env)->DeleteLocalRef(env, deviceTypeObj);
+    //设置在线状态isOnline
+    // jmethodID setIsOnlineMethod = (*env)->GetMethodID(env, deviceInfoClass, "setOnline", "(Z)V");
+    // (*env)->CallVoidMethod(env, obj, setIsOnlineMethod, device->isOnline);
+    //设置地址数addrNum
+    jmethodID setAddrNumMethod = (*env)->GetMethodID(env, deviceInfoClass, "setAddrNum", "(I)V");
+    (*env)->CallVoidMethod(env, obj, setAddrNumMethod, device->addrNum);
+    //发现ConnectionAddr的java类
+    jclass connectionAddrClass = (*env)->FindClass(env, "com/jg/softbus/network/protocol/ConnectionAddr");  
+    if (connectionAddrClass == NULL) {
+        // 处理错误
+        printf("Cannot found the class:com/jg/softbus/network/protocol/ConnectionAddr");
+        return NULL;
+    }
+    //构建一个java ConnectionAddr的数组,数组长度为addrNum
+    jobjectArray addrArray = (*env)->NewObjectArray(env, device->addrNum, connectionAddrClass, NULL);  
+    //发现com.jg.softbus.network.protocol.ConnectionAddrType java类,根据其提供的静态getForValue(int)方法获取ConnectionAddrType对象
+    jclass connectionAddrTypeClass = (*env)->FindClass(env, "com/jg/softbus/network/protocol/ConnectionAddrType");  
+    if (connectionAddrTypeClass == NULL) {  
+        // 处理错误  
+        printf("Cannot found the class:com/jg/softbus/network/protocol/ConnectionAddrType");
+        return NULL;
+    }
+    
+    //查找com.jg.softbus.network.protocol.ConnectionAddrInfo
+    jclass connectionAddrInfoClass = (*env)->FindClass(env, "com/jg/softbus/network/protocol/ConnectionAddrInfo");  
+    if (connectionAddrInfoClass == NULL) {
+        // 处理错误  
+        printf("Cannot found the class:com/jg/softbus/network/protocol/ConnectionAddrInfo");
+        return NULL;
+    }
+    //查找ConnectionAddrInfo的无参构造函数
+    jmethodID connectionAddrInfoConstructor = (*env)->GetMethodID(env, connectionAddrInfoClass, "<init>", "()V");  
+    if (connectionAddrInfoConstructor == NULL) {
+        // 处理错误  
+        printf("Cannot found the constructor:com/jg/softbus/network/protocol/ConnectionAddrInfo");
+        return NULL;
+    }
+     //查找com.jg.softbus.network.protocol.IpAddr的java对象
+    jclass ipAddrClass = (*env)->FindClass(env, "com/jg/softbus/network/protocol/IpAddr");
+    if(ipAddrClass == NULL){
+        printf("Cannot found the IpAddr class.");
+        return NULL;
+    }
+    //查找IpAddr带参构造函数,函数结构为:IpAddr(String ip, int port)
+    jmethodID ipAddrConstructor = (*env)->GetMethodID(env, ipAddrClass, "<init>", "(Ljava/lang/String;I)V");
+    if(ipAddrConstructor == NULL){
+        printf("Cannot found the constructor of IpAddr.");
+        return NULL;
+    }
+
+    //查找com.jg.softbus.network.protocol.BrAddr的java对象
+    jclass brAddrClass = (*env)->FindClass(env, "com/jg/softbus/network/protocol/BrAddr");
+    if(brAddrClass == NULL){
+        printf("Cannot found the BrAddr class.");
+        return NULL;
+    }
+    //查找BrAddr带参构造函数,函数结构为:BrAddr(String brMac)
+    jmethodID brAddrConstructor = (*env)->GetMethodID(env, brAddrClass, "<init>", "(Ljava/lang/String)V");
+    if(brAddrConstructor == NULL){
+        printf("Cannot found the constructor of BrAddr.");
+        return NULL;
+    }
+
+     //查找com.jg.softbus.network.protocol.BleAddr的java对象
+    jclass bleAddrClass = (*env)->FindClass(env, "com/jg/softbus/network/protocol/BleAddr");
+    if(bleAddrClass == NULL){
+        printf("Cannot found the BleAddr class.");
+        return NULL;
+    }
+    //查找BleAddr无参构造函数,函数结构为:BleAddr()
+    jmethodID bleAddrConstructor = (*env)->GetMethodID(env, bleAddrClass, "<init>", "()V");
+    if(bleAddrConstructor == NULL){
+        printf("Cannot found the constructor of BleAddr.");
+        return NULL;
+    }
+    //查找com.jg.softbus.network.protocol.BleProtocolType的java对象
+    // jclass bleProtocolTypeClass = (*env)->FindClass(env, "com/jg/softbus/network/protocol/BleProtocolType");
+    // if(bleProtocolTypeClass == NULL){
+    //     printf("Cannot found the BleProtocolType class.");
+    //     return NULL;
+    // }
+
+    //查找com/jg/softbus/network/protocol/SessionAddr的java对象
+    // jclass sessionAddrClass = (*env)->FindClass(env, "com/jg/softbus/network/protocol/SessionAddr");
+    // if(sessionAddrClass == NULL){
+    //     printf("Cannot found the SessionAddr class.");
+    //     return NULL;
+    // }
+    //查找SessionAddr无参构造函数,函数结构为:SessionAddr()
+    // jmethodID sessionAddrConstructor = (*env)->GetMethodID(env, sessionAddrClass, "<init>", "()V");
+    // if(sessionAddrConstructor == NULL){
+    //     printf("Cannot found the constructor of SessionAddr.");
+    //     return NULL;
+    // }
+
+    for (int i = 0; i < device->addrNum; i++) {
+        //基于无参的构造函数创建ConnectionAddr对象
+        jmethodID connectionAddrConstructor = (*env)->GetMethodID(env, connectionAddrClass, "<init>", "()V");
+        jobject addrObj = (*env)->NewObject(env, connectionAddrClass, connectionAddrConstructor);
+        //获取ConnectionAddrType对象
+        jmethodID getForValueMethod = (*env)->GetStaticMethodID(env, connectionAddrTypeClass, "getForValue", "(I)Lcom/jg/softbus/network/protocol/ConnectionAddrType;");  
+        if (getForValueMethod == NULL) {  
+            // 处理错误  
+            printf("Cannot found the method:getForValue(int)");
+            return NULL;
+        }
+        //根据device提供的地址类型获取ConnectionAddrType对象
+        jobject addrTypeObj = (*env)->CallStaticObjectMethod(env, connectionAddrTypeClass, getForValueMethod, device->addr[i].type);
+        if(addrTypeObj == NULL) {
+            // 处理错误  
+            printf("Cannot found the ConnectionAddrType. type info: %d", device->addr[i].type);
+            return NULL;
+        }
+        //查找ConnectionAddr的setType(ConnectionAddrType type)方法
+        jmethodID setTypeMethod = (*env)->GetMethodID(env, connectionAddrClass, "setType", "(Lcom/jg/softbus/network/protocol/ConnectionAddrType;)V");
+        //设置地址类型到地址对象中
+        (*env)->CallVoidMethod(env, addrObj, setTypeMethod, addrTypeObj);  
+        (*env)->DeleteLocalRef(env, addrTypeObj); 
+        //无参创建ConnectionAddrInfo的java对象
+        jobject infoObj = (*env)->NewObject(env, connectionAddrInfoClass, connectionAddrInfoConstructor);
+        //判断device->addr[i].type的类型,可参考下面代码的Switch方式
+        switch (device->addr[i].type) {
+            case CONNECTION_ADDR_WLAN: {
+                printf("ip=%s,port=%d,", device->addr[i].info.ip.ip, device->addr[i].info.ip.port);
+            }
+            case CONNECTION_ADDR_ETH: {
+                jstring ipstr = (*env)->NewStringUTF(env, device->addr[i].info.ip.ip);
+                //并使用有参构造函数进行初始化
+                jobject ipAddrObj = (*env)->NewObject(env, ipAddrClass, ipAddrConstructor, ipstr, device->addr[i].info.ip.port);
+                //将地址对象写入ConnectionAddrInfo对象中
+                jmethodID setIpMethod = (*env)->GetMethodID(env, connectionAddrClass, "setIp", "(Lcom/jg/softbus/network/protocol/IpAddr;)V");
+                //设置地址类型到地址对象中
+                (*env)->CallVoidMethod(env, addrObj, setIpMethod, ipAddrObj);  
+                (*env)->DeleteLocalRef(env, ipAddrObj); 
+                break;
+            }
+            case CONNECTION_ADDR_BR: {
+                jstring brMacStr = (*env)->NewStringUTF(env, device->addr[i].info.br.brMac);
+                //并使用有参构造函数进行初始化
+                jobject brAddrObj = (*env)->NewObject(env, brAddrClass, brAddrConstructor,  brMacStr);
+                //将地址对象写入ConnectionAddrInfo对象中
+                jmethodID setBrMethod = (*env)->GetMethodID(env, connectionAddrClass, "setBr", "(Lcom/jg/softbus/network/protocol/BrAddr;)V");
+                //设置地址类型到地址对象中
+                (*env)->CallVoidMethod(env, addrObj, setBrMethod, brAddrObj);  
+                (*env)->DeleteLocalRef(env, brAddrObj); 
+                (*env)->DeleteLocalRef(env, brMacStr);
+                break;
+            }
+            case CONNECTION_ADDR_BLE: {
+                 //并使用构造函数进行初始化
+                jobject bleAddrObj = (*env)->NewObject(env, bleAddrClass, bleAddrConstructor);
+                // //获取BleProtocolType对象
+                // jmethodID getForValueMethod2 = (*env)->GetStaticMethodID(env, bleProtocolTypeClass, "getForValue", "(I)Lcom/jg/softbus/network/protocol/BleProtocolType;");  
+                // if (getForValueMethod2 == NULL) {  
+                //     // 处理错误  
+                //     printf("Cannot found the method:getForValue(int)");
+                //     return NULL;
+                // }
+                // //根据device提供的bleprotocol类型获取BleProtocolType对象
+                // jobject bleProtocolTypeObj = (*env)->CallStaticObjectMethod(env, bleProtocolTypeClass, getForValueMethod2, device->addr[i].info.ble.protocol);
+                // if(bleProtocolTypeObj == NULL) {
+                //     // 处理错误  
+                //     printf("Cannot found the BleProtocolType. type info: %d", device->addr[i].info.ble.protocol);
+                //     return NULL;
+                // }
+                // //将地址对象写入ConnectionAddrInfo对象中
+                // jmethodID setProtocolMethod = (*env)->GetMethodID(env, bleAddrClass, "setProtocol", "(Lcom/jg/softbus/network/protocol/BleProtocolType;)V");
+                // (*env)->CallVoidMethod(env, bleAddrObj, setProtocolMethod, bleProtocolTypeObj);
+                // (*env)->DeleteLocalRef(env, bleProtocolTypeObj); 
+                //setbleMac
+                jmethodID setBleMacMethod = (*env)->GetMethodID(env, bleAddrClass, "setBleMac", "(Ljava/lang/String)V");
+                jstring bleMac = (*env)->NewStringUTF(env, device->addr[i].info.ble.bleMac);
+                (*env)->CallVoidMethod(env, bleAddrObj, setBleMacMethod, bleMac);
+                (*env)->DeleteLocalRef(env, bleMac);
+                //setUdidHash
+                jmethodID setUdidHashMethod = (*env)->GetMethodID(env, bleAddrClass, "setUdidHash", "([B)V");
+                size_t len = UDID_HASH_LEN / sizeof(uint8_t);  
+                jbyteArray byteArray = (*env)->NewByteArray(env, len);
+                 (*env)->SetByteArrayRegion(env, byteArray, 0, len, (const jbyte*)device->addr[i].info.ble.udidHash);
+                // 将udidHash转换为整数  
+                // int hash_value = 0;  
+                // for (int k = 0; k < UDID_HASH_LEN; k++) {  
+                //     hash_value = (hash_value << 8) + device->addr[i].info.ble.udidHash[k];  
+                // }
+                (*env)->CallVoidMethod(env, bleAddrObj, setUdidHashMethod, byteArray);
+                (*env)->DeleteLocalRef(env, byteArray);
+
+                // //setPsm
+                // jmethodID setPsmMethod = (*env)->GetMethodID(env, bleAddrClass, "setPsm", "(I)V");
+                // (*env)->CallVoidMethod(env, bleAddrObj, setPsmMethod, device->addr[i].info.ble.psm);
+                
+                //将地址对象写入ConnectionAddrInfo对象中
+                jmethodID setBleMethod = (*env)->GetMethodID(env, connectionAddrClass, "setBle", "(Lcom/jg/softbus/network/protocol/BrAddr;)V");
+                (*env)->CallVoidMethod(env, addrObj, setBleMethod, bleAddrObj);  
+                (*env)->DeleteLocalRef(env, bleAddrObj); 
+                printf("bleMac=%s,", device->addr[i].info.ble.bleMac);
+                break;
+            }
+            // case CONNECTION_ADDR_SESSION:
+            //     //创建SessionAddr对象
+            //     jobject sessionAddrObj = (*env)->NewObject(env, sessionAddrClass, sessionAddrConstructor);
+            //     //获取void setSessionId(Integer sessionId)方法
+            //     jmethodID setSessionIdMethod = (*env)->GetMethodID(env, sessionAddrClass, "setSessionId", "(I)V");
+            //     //将device中的sessionId调用方法设置到sessionAddrObj中
+            //     (*env)->CallVoidMethod(env, sessionAddrObj, setSessionIdMethod, device->addr[i].info.session.sessionId);
+            //     //获取void setChannelId(Integer channelId)方法
+            //     jmethodID setChannelIdMethod = (*env)->GetMethodID(env, sessionAddrClass, "setChannelId", "(I)V");
+            //     //将device中的channelId调用方法设置到sessionAddrObj中
+            //     (*env)->CallVoidMethod(env, sessionAddrObj, setChannelIdMethod, device->addr[i].info.session.channelId);
+            //     //获取void setType(String type)方法
+            //     jmethodID setTypeMethod = (*env)->GetMethodID(env, sessionAddrClass, "setType", "(Ljava/lang/String;)V");
+            //     //将device中的type调用方法设置到sessionAddrObj中
+            //     jstring sessionTypeStr = (*env)->NewStringUTF(env, device->addr[i].info.session.type);
+            //     (*env)->CallVoidMethod(env, sessionAddrObj, setTypeMethod, sessionTypeStr);
+            //     jmethodID setSessionMethod = (*env)->GetMethodID(env, connectionAddrClass, "setSession", "(Lcom/jg/softbus/network/protocol/SessionAddr;)V");   
+            //     (*env)->CallVoidMethod(env, addrObj, setSessionMethod, sessionAddrObj);
+            //     (*env)->DeleteLocalRef(env, sessionTypeStr);
+            //     (*env)->DeleteLocalRef(env, sessionAddrObj);
+            //     printf("sessionId=%d, channelId=%d, type=%d", device->addr[i].info.session.sessionId, device->addr[i].info.session.channelId,device->addr[i].info.session.type);
+            //     break;
+            default:
+                break;
+        }
+        //获取ConnectionAddr中的void setPeerUid(String peerUid)方法,将device中的peerUid放入到addrObj中
+        jmethodID setPeerUidMethod = (*env)->GetMethodID(env, connectionAddrClass, "setPeerUid", "(Ljava/lang/String;)V");  
+        jstring peerUidStr = (*env)->NewStringUTF(env, device->addr[i].peerUid);  
+        (*env)->CallVoidMethod(env, addrObj, setPeerUidMethod, peerUidStr);  
+        (*env)->DeleteLocalRef(env, peerUidStr);
+        (*env)->SetObjectArrayElement(env, addrArray, i, addrObj);  
+        (*env)->DeleteLocalRef(env, addrObj);  
+    }
+    //查找void setAddr(ConnectionAddr[] addr)方法并将addrArray对象设置到obj对象中
+    jmethodID setAddrMethod = (*env)->GetMethodID(env, deviceInfoClass, "setAddr", "([Lcom/jg/softbus/network/protocol/ConnectionAddr;)V");
+    (*env)->CallVoidMethod(env, obj, setAddrMethod, addrArray); 
+    (*env)->DeleteLocalRef(env, addrArray);
+    //查找void setCapabilityBitmapNum(Integer capabilityBitmapNum)方法
+    jmethodID setCapabilityBitmapNumMethod = (*env)->GetMethodID(env, deviceInfoClass, "setCapabilityBitmapNum", "(I)V");
+    (*env)->CallVoidMethod(env, obj, setCapabilityBitmapNumMethod, device->capabilityBitmapNum);
+    //查找void setCapabilityBitmap(String[] capabilityBitmap)方法
+    jmethodID setCapabilityBitmapMethod = (*env)->GetMethodID(env, deviceInfoClass, "setCapabilityBitmap", "([Ljava/lang/String;)V");
+    //构建jstring的数组对象,长度为addrNum的数值
+    jobjectArray sArray = (*env)->NewObjectArray(env, device->addrNum, (*env)->FindClass(env, "java/lang/String"), NULL);
+    for (int i = 0; i < device->addrNum; i++) {
+        char* cbitmap_str;
+        sprintf(cbitmap_str, "0x%x", device->capabilityBitmap[i]);
+        //将cbitmap_str放入到jstringArray中
+        jstring addrObj = (*env)->NewStringUTF(env, cbitmap_str);
+        (*env)->SetObjectArrayElement(env, sArray, i, addrObj);
+        (*env)->DeleteLocalRef(env, addrObj);
+        printf("\t\tcapabilityBitmap[%d]=0x%x\n", i + 1, device->capabilityBitmap[i]);
+    }
+    (*env)->CallVoidMethod(env, obj, setCapabilityBitmapMethod, sArray);
+    (*env)->DeleteLocalRef(env, sArray);
+    //查找void setCustData(String custData)方法
+    jmethodID setCustDataMethod = (*env)->GetMethodID(env, deviceInfoClass, "setCustData", "(Ljava/lang/String;)V");
+    //获取device的custData放入到obj中
+    jstring custDataObj = (*env)->NewStringUTF(env, device->custData);
+    (*env)->CallVoidMethod(env, obj, setCustDataMethod, custDataObj);
+    (*env)->DeleteLocalRef(env, custDataObj);
+    //获取void setRange(Integer range)方法
+    // jmethodID setRangeMethod = (*env)->GetMethodID(env, deviceInfoClass, "setRange", "(I)V");
+    // (*env)->CallVoidMethod(env, obj, setRangeMethod, device->range);
+ }
+ 
+/**
+ * 设备发现回调
+ */
+void DeviceFound(const DeviceInfo *device)
+{
+    // 获取JNIEnv环境
+    JNIEnv *env;
+    // 将当前线程附加到Java虚拟机
+    (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL);
+    // 获取当前对象的类引用
+    jclass nativeLibClass = (*env)->GetObjectClass(env, globalRef);
+    // 获取当前对象的publishSuccess方法的ID
+    jmethodID callbackMethod = (*env)->GetMethodID(env, nativeLibClass, "onDeviceFound", "(Lcom/jg/softbus/device/DeviceInfo;)V");
+    //转换DeviceInfo为java对应的对象
+    jobject deviceObj = DeviceInfoToJavaObject(env, device);
+    if(deviceObj == NULL) {
+        return;
+    }
+    //调用回调方法执行
+    (*env)->CallVoidMethod(env, globalRef, callbackMethod, deviceObj);
+    //删除本地对象
+    (*env)->DeleteLocalRef(env, deviceObj);
+    //将当前线程从java虚拟机中移除
+    (*jvm)->DetachCurrentThread(jvm);
+}
+/**
+  * 发现成功回调
+ */
+ static void DiscoverySuccess(int subscribeId)
+ {
+     // 获取JNIEnv环境
+    JNIEnv *env;
+    // 将当前线程附加到Java虚拟机
+    (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL);
+    // 获取当前对象的类引用
+    jclass nativeLibClass = (*env)->GetObjectClass(env, globalRef);
+    // 获取当前对象的publishSuccess方法的ID
+    jmethodID callbackMethod = (*env)->GetMethodID(env, nativeLibClass, "onDiscoverySuccess", "(I)V");
+    //调用回调方法执行
+    (*env)->CallVoidMethod(env, globalRef, callbackMethod, subscribeId);
+    //将当前线程从java虚拟机中移除
+    (*jvm)->DetachCurrentThread(jvm);
+
+    printf("<DiscoverySuccess>CB: discover subscribeId=%d\n", subscribeId);
+ }
+ /**
+  * 发现失败回调
+ */
+ static void DiscoveryFailed(int subscribeId, DiscoveryFailReason reason)
+ {
+         // 获取JNIEnv环境
+    JNIEnv *env;
+    // 将当前线程附加到Java虚拟机
+    (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL);
+    // 获取当前对象的类引用
+    jclass nativeLibClass = (*env)->GetObjectClass(env, globalRef);
+    // 获取当前对象的publishSuccess方法的ID
+    jmethodID callbackMethod = (*env)->GetMethodID(env, nativeLibClass, "onDiscoverFailed", "(II)V");
+        // 调用当前对象的非静态方法
+    (*env)->CallVoidMethod(env, globalRef, callbackMethod, subscribeId, (int)reason);
+    //将当前线程从java虚拟机中移除
+    (*jvm)->DetachCurrentThread(jvm);
+
+    printf("<DiscoveryFailed>CB: discover subscribeId=%d failed, reason=%d\n", subscribeId, (int)reason);
+ }
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_SubscribeService_discoveryStart
+  (JNIEnv *env, jobject obj, jstring pkgName, jobject subscribeInfo, jobject callback) {
+    // 保存Java虚拟机的引用
+    (*env)->GetJavaVM(env, &jvm);
+    globalRef = (*env)->NewGlobalRef(env, callback); 
+    const char *pkgNameStr = (*env)->GetStringUTFChars(env, pkgName, NULL);
+    
+    SubscribeInfo info;
+    int ret = ParseSubscribeInfo(env, subscribeInfo, &info);
+    if(ret != 0) {
+        // 尝试进行一些可能会抛出异常的操作  
+        jclass exceptionClass = (*env)->FindClass(env, "java/lang/Exception"); // 获取异常类 
+        // 如果找不到异常类,则抛出异常  
+        jmethodID exceptionConstructor = (*env)->GetMethodID(env, exceptionClass, "<init>", "()V");  
+        jthrowable exception = (*env)->NewObject(env,exceptionClass, exceptionConstructor);  
+         // 抛出异常 
+        (*env)->ThrowNew(env, exceptionClass, "SubscribeInfo object error."); 
+        //解析失败无法继续操作
+        return -1;
+    }
+    IDiscoveryCallback cb = {
+        .OnDeviceFound = DeviceFound,
+        .OnDiscoverFailed = DiscoveryFailed,
+        .OnDiscoverySuccess = DiscoverySuccess
+    };
+    
+    ret = StartDiscovery(pkgNameStr, &info, &cb);
+    (*env)->ReleaseStringUTFChars(env, pkgName, pkgNameStr);
+    return ret;
+  }
+  
+
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_SubscribeService_stopDiscovery
+  (JNIEnv * env, jobject obj, jstring pkgName, jint subscribeId) {
+    const char* pkgName_str = (*env)->GetStringUTFChars(env, pkgName, NULL);
+    int ret = StopDiscovery(pkgName_str, subscribeId);
+    if (ret) {
+       // 尝试进行一些可能会抛出异常的操作  
+       jclass exceptionClass = (*env)->FindClass(env, "java/lang/Exception"); // 获取异常类 
+       // 如果找不到异常类,则抛出异常  
+       jmethodID exceptionConstructor = (*env)->GetMethodID(env, exceptionClass, "<init>", "()V");  
+       jthrowable exception = (*env)->NewObject(env, exceptionClass, exceptionConstructor);  
+       // 抛出异常 
+       (*env)->ThrowNew(env, exceptionClass, "stop discovery error."); 
+       printf("StopDiscovery fail:%d\n", ret);
+    }
+    printf("<stopDiscovery>stop discover pkgName=%s, subscribeId=%d\n", pkgName_str, subscribeId);
+    (*env)->ReleaseStringUTFChars(env, pkgName, pkgName_str);
+    return 0;
+  }
+  static void discoverResult(int32_t refreshId, RefreshResult reason) {
+   // 获取JNIEnv环境
+    JNIEnv *env;
+    // 将当前线程附加到Java虚拟机
+    (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL);
+    // 获取当前对象的类引用
+    jclass nativeLibClass = (*env)->GetObjectClass(env, globalRef);
+    // 获取当前对象的publishSuccess方法的ID
+    jmethodID callbackMethod = (*env)->GetMethodID(env, nativeLibClass, "onDiscoverResult", "(II)V");
+    // 调用当前对象的非静态方法
+    (*env)->CallVoidMethod(env, globalRef, callbackMethod, refreshId, (int)reason);
+    // 将当前线程从Java虚拟机分离
+    (*jvm)->DetachCurrentThread(jvm);
+
+    printf("<DiscoveryResult>CB: discover subscribeId=%d failed, reason=%d\n", refreshId, (int)reason);
+  }
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_SubscribeService_refreshLNN
+  (JNIEnv *env, jobject obj, jstring pkgName, jobject subscribeInfo, jobject callback){
+     // 保存Java虚拟机的引用
+    (*env)->GetJavaVM(env, &jvm);
+    globalRef = (*env)->NewGlobalRef(env, callback); 
+    const char *pkgNameStr = (*env)->GetStringUTFChars(env, pkgName, NULL);
+    SubscribeInfo info;
+    int ret = ParseSubscribeInfo(env, subscribeInfo, &info);
+    if(ret != 0) {
+        // 尝试进行一些可能会抛出异常的操作  
+        jclass exceptionClass = (*env)->FindClass(env, "java/lang/Exception"); // 获取异常类 
+        // 如果找不到异常类,则抛出异常  
+        jmethodID exceptionConstructor = (*env)->GetMethodID(env, exceptionClass, "<init>", "()V");  
+        jthrowable exception = (*env)->NewObject(env, exceptionClass, exceptionConstructor);  
+         // 抛出异常 
+        (*env)->ThrowNew(env, exceptionClass, "SubscribeInfo object error."); 
+        //解析失败无法继续操作
+        return -1;
+    }
+    IRefreshCallback cb = {
+        .OnDeviceFound = DeviceFound,
+        .OnDiscoverResult = discoverResult,
+    };
+    
+    ret = RefreshLNN(pkgNameStr, &info, &cb);
+    (*env)->ReleaseStringUTFChars(env, pkgName, pkgNameStr);
+    return ret;
+  }
+
+  
+
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_SubscribeService_stopRefreshLNN
+  (JNIEnv * env, jobject obj, jstring pkgName, jint refreshId) {
+    const char* pkgNameStr = (*env)->GetStringUTFChars(env, pkgName, NULL);
+    // 停止刷新LNN
+    int ret = StopRefreshLNN(pkgNameStr, refreshId);
+    if (ret) {
+       // 尝试进行一些可能会抛出异常的操作  
+       jclass exceptionClass = (*env)->FindClass(env, "java/lang/Exception"); // 获取异常类 
+       // 如果找不到异常类,则抛出异常  
+       jmethodID exceptionConstructor = (*env)->GetMethodID(env, exceptionClass, "<init>", "()V");  
+       jthrowable exception = (*env)->NewObject(env, exceptionClass, exceptionConstructor);  
+       // 抛出异常 
+       (*env)->ThrowNew(env, exceptionClass, "stop refreshLNN error."); 
+       printf("stop refreshLNN fail:%d\n", ret);
+    }
+    // 释放pkgNameStr
+    (*env)->ReleaseStringUTFChars(env, pkgName, pkgNameStr);
+    return ret;
+  }
+
+  JNIEXPORT jobjectArray JNICALL Java_com_jg_softbus_naservice_SubscribeService_findDeviceNodes
+  (JNIEnv *env, jobject obj, jstring pkgName) {
+    const char* pkgNameStr = (*env)->GetStringUTFChars(env, pkgName, NULL);
+    NodeBasicInfo **dev = NULL;
+    int ret, num;
+    ret = GetAllNodeDeviceInfo(pkgNameStr, dev, &num);
+    if (ret) {
+        // 尝试进行一些可能会抛出异常的操作  
+       jclass exceptionClass = (*env)->FindClass(env, "java/lang/Exception"); // 获取异常类 
+       // 如果找不到异常类,则抛出异常  
+       jmethodID exceptionConstructor = (*env)->GetMethodID(env, exceptionClass, "<init>", "()V");  
+       jthrowable exception = (*env)->NewObject(env, exceptionClass, exceptionConstructor);  
+       // 抛出异常 
+       (*env)->ThrowNew(env, exceptionClass, "get online device error."); 
+        printf("GetAllNodeDeviceInfo fail:%d\n", ret);
+        return NULL;
+    }
+    jclass nodeClass = (*env)->FindClass(env, "com/jg/softbus/network/node/NodeBasicInfo");
+    // 获取构造函数
+    jmethodID nodeConstructor = (*env)->GetMethodID(env, nodeClass, "<init>", "(Ljava/lang/String;Ljava/lang/String;S)V");
+    jobjectArray json_nodes = (*env)->NewObjectArray(env, num, nodeClass, NULL);
+    printf("<GetAllNodeDeviceInfo>return %d Node\n", num);
+    for (int i = 0; i < num; i++) {
+        jstring networkId = (*env)->NewStringUTF(env, dev[i]->networkId);
+        jstring deviceName = (*env)->NewStringUTF(env, dev[i]->deviceName);
+        //构造node对象
+        jobject node = (*env)->NewObject(env, nodeClass, nodeConstructor, networkId, deviceName, dev[i]->deviceTypeId);
+        (*env)->SetObjectArrayElement(env, json_nodes, i, node);    
+        //释放字符串资源
+        (*env)->DeleteLocalRef(env, networkId);  
+        (*env)->DeleteLocalRef(env, deviceName);
+        (*env)->DeleteLocalRef(env, node);
+        printf("<num %d>deviceName=%s\n", i + 1, dev[i]->deviceName);
+        printf("\tnetworkId=%s\n", dev[i]->networkId);
+        printf("\tdeviceTypeId=%d\n", dev[i]->deviceTypeId);
+    }
+    // 释放pkgNameStr
+    (*env)->ReleaseStringUTFChars(env, pkgName, pkgNameStr);
+    return json_nodes;
+  }
+
+JNIEXPORT void JNICALL Java_com_jg_softbus_naservice_SubscribeService_releaseDeviceNodes
+  (JNIEnv *env, jobject obj, jobjectArray nodes) {
+     // 释放创建的节点集合对象
+    (*env)->DeleteLocalRef(env, nodes);
+  }
+
+  JNIEXPORT void JNICALL Java_com_jg_softbus_naservice_SubscribeService_destroy
+  (JNIEnv *env, jobject obj) {
+     // 删除全局引用
+    (*env)->DeleteGlobalRef(env, globalRef);
+    free(jvm);
+  }

+ 53 - 0
softbus-jdk/com_jg_softbus_naservice_LNNService.h

@@ -0,0 +1,53 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class com_jg_softbus_naservice_LNNService */
+
+#ifndef _Included_com_jg_softbus_naservice_LNNService
+#define _Included_com_jg_softbus_naservice_LNNService
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     com_jg_softbus_naservice_LNNService
+ * Method:    joinLNN
+ * Signature: (Ljava/lang/String;Lcom/jg/softbus/network/protocol/ConnectionAddr;Lcom/jg/softbus/network/callback/ILNNCallback;)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_LNNService_joinLNN
+  (JNIEnv *, jobject, jstring, jobject, jobject);
+
+/*
+ * Class:     com_jg_softbus_naservice_LNNService
+ * Method:    leaveLNN
+ * Signature: (Ljava/lang/String;Ljava/lang/String;Lcom/jg/softbus/network/callback/ILNNCallback;)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_LNNService_leaveLNN
+  (JNIEnv *, jobject, jstring, jstring, jobject);
+
+/*
+ * Class:     com_jg_softbus_naservice_LNNService
+ * Method:    regNodeDeviceStateCb
+ * Signature: (Ljava/lang/String;Lcom/jg/softbus/network/callback/INodeStateCb;)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_LNNService_regNodeDeviceStateCb
+  (JNIEnv *, jobject, jstring, jobject);
+
+/*
+ * Class:     com_jg_softbus_naservice_LNNService
+ * Method:    unRegNodeDeviceStateCb
+ * Signature: (Lcom/jg/softbus/network/callback/INodeStateCb;)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_LNNService_unRegNodeDeviceStateCb
+  (JNIEnv *, jobject, jobject);
+
+/*
+ * Class:     com_jg_softbus_naservice_LNNService
+ * Method:    destroy
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_com_jg_softbus_naservice_LNNService_destroy
+  (JNIEnv *, jobject);
+
+#ifdef __cplusplus
+}
+#endif
+#endif

+ 53 - 0
softbus-jdk/com_jg_softbus_naservice_PublishService.h

@@ -0,0 +1,53 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class com_jg_softbus_naservice_PublishService */
+
+#ifndef _Included_com_jg_softbus_naservice_PublishService
+#define _Included_com_jg_softbus_naservice_PublishService
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     com_jg_softbus_naservice_PublishService
+ * Method:    publishService
+ * Signature: (Ljava/lang/String;Lcom/jg/softbus/discovery/PublishInfo;Lcom/jg/softbus/discovery/callback/IPublishCallback;)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_PublishService_publishService
+  (JNIEnv *, jobject, jstring, jobject, jobject);
+
+/*
+ * Class:     com_jg_softbus_naservice_PublishService
+ * Method:    unPublishService
+ * Signature: (Ljava/lang/String;I)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_PublishService_unPublishService
+  (JNIEnv *, jobject, jstring, jint);
+
+/*
+ * Class:     com_jg_softbus_naservice_PublishService
+ * Method:    publishLNN
+ * Signature: (Ljava/lang/String;Lcom/jg/softbus/discovery/PublishInfo;Lcom/jg/softbus/discovery/callback/IPublishCb;)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_PublishService_publishLNN
+  (JNIEnv *, jobject, jstring, jobject, jobject);
+
+/*
+ * Class:     com_jg_softbus_naservice_PublishService
+ * Method:    stopPublishLNN
+ * Signature: (Ljava/lang/String;I)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_PublishService_stopPublishLNN
+  (JNIEnv *, jobject, jstring, jint);
+
+/*
+ * Class:     com_jg_softbus_naservice_PublishService
+ * Method:    destroy
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_com_jg_softbus_naservice_PublishService_destroy
+  (JNIEnv *, jobject);
+
+#ifdef __cplusplus
+}
+#endif
+#endif

+ 109 - 0
softbus-jdk/com_jg_softbus_naservice_SessionService.h

@@ -0,0 +1,109 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class com_jg_softbus_naservice_SessionService */
+
+#ifndef _Included_com_jg_softbus_naservice_SessionService
+#define _Included_com_jg_softbus_naservice_SessionService
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     com_jg_softbus_naservice_SessionService
+ * Method:    createSessionServer
+ * Signature: (Ljava/lang/String;Ljava/lang/String;Lcom/jg/softbus/session/callback/ISessionListener;)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_SessionService_createSessionServer
+  (JNIEnv *, jobject, jstring, jstring, jobject);
+
+/*
+ * Class:     com_jg_softbus_naservice_SessionService
+ * Method:    openSession
+ * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/jg/softbus/session/SessionAttribute;)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_SessionService_openSession
+  (JNIEnv *, jobject, jstring, jstring, jstring, jstring, jobject);
+
+/*
+ * Class:     com_jg_softbus_naservice_SessionService
+ * Method:    sendBytes
+ * Signature: (I[BI)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_SessionService_sendBytes
+  (JNIEnv *, jobject, jint, jbyteArray, jint);
+
+/*
+ * Class:     com_jg_softbus_naservice_SessionService
+ * Method:    sendMessage
+ * Signature: (ILjava/lang/String;I)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_SessionService_sendMessage
+  (JNIEnv *, jobject, jint, jstring, jint);
+
+/*
+ * Class:     com_jg_softbus_naservice_SessionService
+ * Method:    sendStream
+ * Signature: (ILcom/jg/softbus/session/StreamData;Lcom/jg/softbus/session/StreamData;Lcom/jg/softbus/session/StreamFrameInfo;)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_SessionService_sendStream
+  (JNIEnv *, jobject, jint, jobject, jobject, jobject);
+
+/*
+ * Class:     com_jg_softbus_naservice_SessionService
+ * Method:    sendFile
+ * Signature: (I[Ljava/lang/String;[Ljava/lang/String;I)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_SessionService_sendFile
+  (JNIEnv *, jobject, jint, jobjectArray, jobjectArray, jint);
+
+/*
+ * Class:     com_jg_softbus_naservice_SessionService
+ * Method:    setFileSendListener
+ * Signature: (Ljava/lang/String;Ljava/lang/String;Lcom/jg/softbus/session/callback/IFileSendListener;)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_SessionService_setFileSendListener
+  (JNIEnv *, jobject, jstring, jstring, jobject);
+
+/*
+ * Class:     com_jg_softbus_naservice_SessionService
+ * Method:    setFileReceiveListener
+ * Signature: (Ljava/lang/String;Ljava/lang/String;Lcom/jg/softbus/session/callback/IFileReceiveListener;Ljava/lang/String;)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_SessionService_setFileReceiveListener
+  (JNIEnv *, jobject, jstring, jstring, jobject, jstring);
+
+/*
+ * Class:     com_jg_softbus_naservice_SessionService
+ * Method:    closeSession
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL Java_com_jg_softbus_naservice_SessionService_closeSession
+  (JNIEnv *, jobject, jint);
+
+/*
+ * Class:     com_jg_softbus_naservice_SessionService
+ * Method:    removeSessionServer
+ * Signature: (Ljava/lang/String;Ljava/lang/String;)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_SessionService_removeSessionServer
+  (JNIEnv *, jobject, jstring, jstring);
+
+/*
+ * Class:     com_jg_softbus_naservice_SessionService
+ * Method:    getPeerSessionName
+ * Signature: (I)Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_com_jg_softbus_naservice_SessionService_getPeerSessionName
+  (JNIEnv *, jobject, jint);
+
+/*
+ * Class:     com_jg_softbus_naservice_SessionService
+ * Method:    destroy
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_com_jg_softbus_naservice_SessionService_destroy
+  (JNIEnv *, jobject);
+
+#ifdef __cplusplus
+}
+#endif
+#endif

+ 69 - 0
softbus-jdk/com_jg_softbus_naservice_SubscribeService.h

@@ -0,0 +1,69 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class com_jg_softbus_naservice_SubscribeService */
+
+#ifndef _Included_com_jg_softbus_naservice_SubscribeService
+#define _Included_com_jg_softbus_naservice_SubscribeService
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     com_jg_softbus_naservice_SubscribeService
+ * Method:    discoveryStart
+ * Signature: (Ljava/lang/String;Lcom/jg/softbus/discovery/SubscribeInfo;Lcom/jg/softbus/discovery/callback/IDiscoveryCallback;)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_SubscribeService_discoveryStart
+  (JNIEnv *, jobject, jstring, jobject, jobject);
+
+/*
+ * Class:     com_jg_softbus_naservice_SubscribeService
+ * Method:    refreshLNN
+ * Signature: (Ljava/lang/String;Lcom/jg/softbus/discovery/SubscribeInfo;Lcom/jg/softbus/discovery/callback/IRefreshCallback;)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_SubscribeService_refreshLNN
+  (JNIEnv *, jobject, jstring, jobject, jobject);
+
+/*
+ * Class:     com_jg_softbus_naservice_SubscribeService
+ * Method:    stopDiscovery
+ * Signature: (Ljava/lang/String;I)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_SubscribeService_stopDiscovery
+  (JNIEnv *, jobject, jstring, jint);
+
+/*
+ * Class:     com_jg_softbus_naservice_SubscribeService
+ * Method:    stopRefreshLNN
+ * Signature: (Ljava/lang/String;I)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_SubscribeService_stopRefreshLNN
+  (JNIEnv *, jobject, jstring, jint);
+
+/*
+ * Class:     com_jg_softbus_naservice_SubscribeService
+ * Method:    findDeviceNodes
+ * Signature: (Ljava/lang/String;)[Lcom/jg/softbus/network/node/NodeBasicInfo;
+ */
+JNIEXPORT jobjectArray JNICALL Java_com_jg_softbus_naservice_SubscribeService_findDeviceNodes
+  (JNIEnv *, jobject, jstring);
+
+/*
+ * Class:     com_jg_softbus_naservice_SubscribeService
+ * Method:    releaseDeviceNodes
+ * Signature: ([Lcom/jg/softbus/network/node/NodeBasicInfo;)V
+ */
+JNIEXPORT void JNICALL Java_com_jg_softbus_naservice_SubscribeService_releaseDeviceNodes
+  (JNIEnv *, jobject, jobjectArray);
+
+/*
+ * Class:     com_jg_softbus_naservice_SubscribeService
+ * Method:    destroy
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_com_jg_softbus_naservice_SubscribeService_destroy
+  (JNIEnv *, jobject);
+
+#ifdef __cplusplus
+}
+#endif
+#endif

+ 149 - 0
softbus-jdk/com_jg_softbus_naservice_TransService.h

@@ -0,0 +1,149 @@
+/* DO NOT EDIT THIS FILE - it is machine generated */
+#include <jni.h>
+/* Header for class com_jg_softbus_naservice_TransService */
+
+#ifndef _Included_com_jg_softbus_naservice_TransService
+#define _Included_com_jg_softbus_naservice_TransService
+#ifdef __cplusplus
+extern "C" {
+#endif
+/*
+ * Class:     com_jg_softbus_naservice_TransService
+ * Method:    registerNatives
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_com_jg_softbus_naservice_TransService_registerNatives
+  (JNIEnv *, jclass);
+
+/*
+ * Class:     com_jg_softbus_naservice_TransService
+ * Method:    createSessionServer
+ * Signature: (Ljava/lang/String;Ljava/lang/String;)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_TransService_createSessionServer
+  (JNIEnv *, jclass, jstring, jstring);
+
+/*
+ * Class:     com_jg_softbus_naservice_TransService
+ * Method:    openSession
+ * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/jg/softbus/session/SessionAttribute;)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_TransService_openSession
+  (JNIEnv *, jclass, jstring, jstring, jstring, jstring, jobject);
+
+/*
+ * Class:     com_jg_softbus_naservice_TransService
+ * Method:    sendBytes
+ * Signature: (ILjava/lang/Object;)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_TransService_sendBytes
+  (JNIEnv *, jclass, jint, jobject);
+
+/*
+ * Class:     com_jg_softbus_naservice_TransService
+ * Method:    sendMessage
+ * Signature: (ILjava/lang/Object;)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_TransService_sendMessage
+  (JNIEnv *, jclass, jint, jobject);
+
+/*
+ * Class:     com_jg_softbus_naservice_TransService
+ * Method:    sendStream
+ * Signature: (ILcom/jg/softbus/session/StreamData;Lcom/jg/softbus/session/StreamData;Lcom/jg/softbus/session/StreamFrameInfo;)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_TransService_sendStream
+  (JNIEnv *, jclass, jint, jobject, jobject, jobject);
+
+/*
+ * Class:     com_jg_softbus_naservice_TransService
+ * Method:    setFileSendListener
+ * Signature: (Ljava/lang/String;Ljava/lang/String;)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_TransService_setFileSendListener
+  (JNIEnv *, jclass, jstring, jstring);
+
+/*
+ * Class:     com_jg_softbus_naservice_TransService
+ * Method:    readSendFileProcess
+ * Signature: (I)Lcom/jg/softbus/session/SendFileProcessResult;
+ */
+JNIEXPORT jobject JNICALL Java_com_jg_softbus_naservice_TransService_readSendFileProcess
+  (JNIEnv *, jclass, jint);
+
+/*
+ * Class:     com_jg_softbus_naservice_TransService
+ * Method:    isSendFileCompleted
+ * Signature: (I)Z
+ */
+JNIEXPORT jboolean JNICALL Java_com_jg_softbus_naservice_TransService_isSendFileCompleted
+  (JNIEnv *, jclass, jint);
+
+/*
+ * Class:     com_jg_softbus_naservice_TransService
+ * Method:    sendFileResult
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_TransService_sendFileResult
+  (JNIEnv *, jclass, jint);
+
+/*
+ * Class:     com_jg_softbus_naservice_TransService
+ * Method:    sendFile
+ * Signature: (I[Ljava/lang/String;[Ljava/lang/String;I)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_TransService_sendFile
+  (JNIEnv *, jclass, jint, jobjectArray, jobjectArray, jint);
+
+/*
+ * Class:     com_jg_softbus_naservice_TransService
+ * Method:    setFileReceiveListener
+ * Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_TransService_setFileReceiveListener
+  (JNIEnv *, jclass, jstring, jstring, jstring);
+
+/*
+ * Class:     com_jg_softbus_naservice_TransService
+ * Method:    readFileReceiveProcess
+ * Signature: (I)Lcom/jg/softbus/session/FileReceiveContent;
+ */
+JNIEXPORT jobject JNICALL Java_com_jg_softbus_naservice_TransService_readFileReceiveProcess
+  (JNIEnv *, jclass, jint);
+
+/*
+ * Class:     com_jg_softbus_naservice_TransService
+ * Method:    isFileReceiveCompleted
+ * Signature: (I)Z
+ */
+JNIEXPORT jboolean JNICALL Java_com_jg_softbus_naservice_TransService_isFileReceiveCompleted
+  (JNIEnv *, jclass, jint);
+
+/*
+ * Class:     com_jg_softbus_naservice_TransService
+ * Method:    FileReceivedResult
+ * Signature: (I)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_TransService_FileReceivedResult
+  (JNIEnv *, jclass, jint);
+
+/*
+ * Class:     com_jg_softbus_naservice_TransService
+ * Method:    closeSession
+ * Signature: (I)V
+ */
+JNIEXPORT void JNICALL Java_com_jg_softbus_naservice_TransService_closeSession
+  (JNIEnv *, jclass, jint);
+
+/*
+ * Class:     com_jg_softbus_naservice_TransService
+ * Method:    removeSessionServer
+ * Signature: (Ljava/lang/String;Ljava/lang/String;)I
+ */
+JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_TransService_removeSessionServer
+  (JNIEnv *, jclass, jstring, jstring);
+
+#ifdef __cplusplus
+}
+#endif
+#endif

+ 8 - 0
softbus-sdk/.idea/.gitignore

@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml

+ 7 - 0
softbus-sdk/.idea/codeStyles/Project.xml

@@ -0,0 +1,7 @@
+<component name="ProjectCodeStyleConfiguration">
+  <code_scheme name="Project" version="173">
+    <ScalaCodeStyleSettings>
+      <option name="MULTILINE_STRING_CLOSING_QUOTES_ON_NEW_LINE" value="true" />
+    </ScalaCodeStyleSettings>
+  </code_scheme>
+</component>

+ 5 - 0
softbus-sdk/.idea/codeStyles/codeStyleConfig.xml

@@ -0,0 +1,5 @@
+<component name="ProjectCodeStyleConfiguration">
+  <state>
+    <option name="PREFERRED_PROJECT_CODE_STYLE" value="Default" />
+  </state>
+</component>

+ 13 - 0
softbus-sdk/.idea/compiler.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <annotationProcessing>
+      <profile name="Maven default annotation processors profile" enabled="true">
+        <sourceOutputDir name="target/generated-sources/annotations" />
+        <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
+        <outputRelativeToContentRoot value="true" />
+        <module name="softbus-sdk" />
+      </profile>
+    </annotationProcessing>
+  </component>
+</project>

+ 7 - 0
softbus-sdk/.idea/encodings.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Encoding">
+    <file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
+    <file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
+  </component>
+</project>

+ 30 - 0
softbus-sdk/.idea/jarRepositories.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RemoteRepositoriesConfiguration">
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="https://repo.maven.apache.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Maven Central repository" />
+      <option name="url" value="https://repo1.maven.org/maven2" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="http://maven.aliyun.com/nexus/content/groups/public" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="central" />
+      <option name="name" value="Central Repository" />
+      <option name="url" value="https://nexus.runming56.com.cn/repository/maven-public/" />
+    </remote-repository>
+    <remote-repository>
+      <option name="id" value="jboss.community" />
+      <option name="name" value="JBoss Community repository" />
+      <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
+    </remote-repository>
+  </component>
+</project>

+ 11 - 0
softbus-sdk/.idea/misc.xml

@@ -0,0 +1,11 @@
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/pom.xml" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK" />
+</project>

+ 124 - 0
softbus-sdk/.idea/uiDesigner.xml

@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="Palette2">
+    <group name="Swing">
+      <item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
+      </item>
+      <item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
+        <default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
+        <initial-values>
+          <property name="text" value="Button" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="RadioButton" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="CheckBox" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
+        <initial-values>
+          <property name="text" value="Label" />
+        </initial-values>
+      </item>
+      <item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
+          <preferred-size width="150" height="-1" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
+          <preferred-size width="150" height="50" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
+          <preferred-size width="200" height="200" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
+      </item>
+      <item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
+      </item>
+      <item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
+          <preferred-size width="-1" height="20" />
+        </default-constraints>
+      </item>
+      <item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
+        <default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
+      </item>
+      <item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
+        <default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
+      </item>
+    </group>
+  </component>
+</project>

+ 58 - 0
softbus-sdk/pom.xml

@@ -0,0 +1,58 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>com.jg</groupId>
+	<artifactId>softbus-sdk</artifactId>
+	<version>0.0.1-SNAPSHOT</version>
+	<name>softbus-sdk</name>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+		<java.version>1.8</java.version>
+	</properties>
+	<dependencies>
+	</dependencies>
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>3.8.1</version>
+				<configuration>
+					<target>${java.version}</target>
+					<source>${java.version}</source>
+					<encoding>UTF-8</encoding>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-assembly-plugin</artifactId>
+				<version>3.0.0</version>
+				<executions>
+					<execution>
+						<id>make-assembly</id>
+						<phase>package</phase>
+						<goals>
+							<goal>single</goal>
+						</goals>
+						<configuration>
+							<!-- not append assembly id in release file name -->
+							<appendAssemblyId>false</appendAssemblyId>
+							<archive>
+								<manifest>
+									<mainClass>com.jg.softbus.TestMain</mainClass>
+								</manifest>
+							</archive>
+							<descriptorRefs>
+								<descriptorRef>jar-with-dependencies</descriptorRef>
+							</descriptorRefs>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+
+		</plugins>
+	</build>
+</project>

+ 79 - 0
softbus-sdk/src/main/java/com/jg/softbus/TestMain.java

@@ -0,0 +1,79 @@
+package com.jg.softbus;
+
+import com.jg.softbus.discovery.PublishInfo;
+import com.jg.softbus.discovery.SubscribeInfo;
+import com.jg.softbus.discovery.enums.DataBitMap;
+import com.jg.softbus.discovery.enums.DiscoverMode;
+import com.jg.softbus.discovery.enums.ExchangeFreq;
+import com.jg.softbus.discovery.enums.ExchangeMedium;
+import com.jg.softbus.naservice.PublishService;
+import com.jg.softbus.naservice.SessionService;
+import com.jg.softbus.naservice.SubscribeService;
+
+import java.io.IOException;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+
+public class TestMain {
+    public static void main(String[] args)
+    {
+        //创建server
+        SessionService sessionService = new SessionService("com.jg", "test-softbus");
+        CompletableFuture.runAsync(()->{
+            try {
+                sessionService.createSessionServer();
+            } catch (Exception ex) {
+                ex.printStackTrace();
+                System.out.println("发生异常,异常原因:"+ex.getMessage());
+            }
+        });
+        PublishService publishService = new PublishService("com.jg");
+        //发布服务
+        CompletableFuture.runAsync(()->{
+            try {
+                PublishInfo publishInfo = new PublishInfo();
+                publishInfo.setPublishId(1);
+                publishInfo.setMode(DiscoverMode.DISCOVER_MODE_PASSIVE);
+                publishInfo.setMedium(ExchangeMedium.COAP);
+                publishInfo.setFreq(ExchangeFreq.LOW);
+                publishInfo.setCapability(DataBitMap.OSD_CAPABILITY_BITMAP.getAbbr());
+                publishInfo.setDataLen(0);
+                publishService.publishService(publishInfo);
+            } catch (Exception ex) {
+                ex.printStackTrace();
+            }
+        });
+        //发现服务
+        SubscribeService subscribeService = new SubscribeService("com.jg");
+        CompletableFuture.runAsync(()->{
+            try {
+                SubscribeInfo info = new SubscribeInfo();
+                info.setSubscribeId(1);
+                info.setMode(DiscoverMode.DISCOVER_MODE_ACTIVE);
+                info.setMedium(ExchangeMedium.COAP);
+                info.setFreq(ExchangeFreq.LOW);
+                info.setIsSameAccount(false);
+                info.setIsWakeRemote(false);
+                info.setCapability(DataBitMap.OSD_CAPABILITY_BITMAP.getAbbr());
+                info.setCapabilityData(null);
+                info.setDataLen(0);
+                subscribeService.discoveryStart(info);
+            } catch (Exception ex) {
+                ex.printStackTrace();
+            }
+        });
+        //消息处理
+        try {
+            TimeUnit.SECONDS.sleep(30L);
+            //停止发现服务
+            subscribeService.close();
+            //停止发布服务
+            publishService.close();
+            //移除server
+            sessionService.close();
+            System.out.println("关闭session服务成功");
+        } catch (IOException | InterruptedException ex) {
+            ex.printStackTrace();
+        }
+    }
+}

+ 328 - 0
softbus-sdk/src/main/java/com/jg/softbus/common/SoftbusErrCode.java

@@ -0,0 +1,328 @@
+package com.jg.softbus.common;
+
+/**
+ * softbus返回异常码说明
+ */
+public enum SoftbusErrCode {
+    /* errno begin: 0xF0010000 */
+    SOFTBUS_COMMOM_ERR_BASE(0xF0010000, "通用错误基础值"),
+    SOFTBUS_TIMOUT(0xF0010001, "超时错误"),
+    SOFTBUS_INVALID_PARAM(0xF0010002, "无效参数错误"),
+    SOFTBUS_MEM_ERR(0xF0010003, "内存错误"),
+    SOFTBUS_NOT_IMPLEMENT(0xF0010004, "未实现错误"),
+    SOFTBUS_NO_URI_QUERY_KEY(0xF0010005, "缺少URI查询键错误"),
+    SOFTBUS_NO_INIT(0xF0010006, "未初始化错误"),
+    SOFTBUS_CREATE_JSON_ERR(0xF0010007, "创建JSON错误"),
+    SOFTBUS_PARSE_JSON_ERR(0xF0010008, "解析JSON错误"),
+    SOFTBUS_PERMISSION_DENIED(0xF0010009, "权限被拒绝错误"),
+    SOFTBUS_ACCESS_TOKEN_DENIED(0xF001000A, "访问令牌被拒绝错误"),
+    SOFTBUS_MALLOC_ERR(0xF001000B, "内存分配错误"),
+    SOFTBUS_STRCPY_ERR(0xF001000C, "字符串拷贝错误"),
+    SOFTBUS_ENCRYPT_ERR(0xF001000D, "加密错误"),
+    SOFTBUS_DECRYPT_ERR(0xF001000E, "解密错误"),
+    SOFTBUS_INVALID_SESS_OPCODE(0xF001000F, "无效会话操作码错误"),
+    SOFTBUS_INVALID_NUM(0xF0010010, "无效数字错误"),
+    SOFTBUS_SERVER_NAME_REPEATED(0xF0010011, "服务器名称重复错误"),
+    SOFTBUS_TCP_SOCKET_ERR(0xF0010012, "TCP套接字错误"),
+    SOFTBUS_LOCK_ERR(0xF0010013, "锁错误"),
+    SOFTBUS_GET_REMOTE_UUID_ERR(0xF0010014, "获取远程UUID错误"),
+    SOFTBUS_NO_ENOUGH_DATA(0xF0010015, "数据不足错误"),
+    SOFTBUS_INVALID_DATA_HEAD(0xF0010016, "无效数据头错误"),
+    SOFTBUS_INVALID_FD(0xF0010017, "无效文件描述符错误"),
+    SOFTBUS_FILE_ERR(0xF0010018, "文件错误"),
+    SOFTBUS_DATA_NOT_ENOUGH(0xF0010019, "数据不足错误"),
+    SOFTBUS_SLICE_ERROR(0xF001001A, "切片错误"),
+    SOFTBUS_ALREADY_EXISTED(0xF001001B, "已存在错误"),
+    SOFTBUS_GET_CONFIG_VAL_ERR(0xF001001C, "获取配置值错误"),
+    SOFTBUS_PEER_PROC_ERR(0xF001001D, "对等进程错误"),
+    SOFTBUS_NOT_FIND(0xF001001E, "未找到错误"),
+    SOFTBUS_ALREADY_TRIGGERED(0xF001001F, "已触发错误"),
+    SOFTBUS_FILE_BUSY(0xF0010020, "文件忙错误"),
+    SOFTBUS_IPC_ERR(0xF0010021, "IPC错误"),
+
+    SOFTBUS_INVALID_PKGNAME(0xF0010022, "无效的包名错误"),
+
+    SOFTBUS_FUNC_NOT_SUPPORT(0xF0010023, "不支持的功能错误"),
+
+    SOFTBUS_SERVER_NOT_INIT(0xF0010024, "服务器未初始化错误"),
+
+    SOFTBUS_SERVER_NAME_USED(0xF0010025, "服务器名称已被使用错误"),
+
+    SOFTBUS_PLUGIN_ERR_BASE(0xF0020000, "插件错误基础值"),
+
+    /* errno begin: 0xF0040000 */
+    SOFTBUS_TRANS_ERR_BASE(0xF0040000, "传输错误基础值"),
+    SOFTBUS_TRANS_INVALID_SESSION_ID(0xF0040001, "无效的会话ID错误"),
+    SOFTBUS_TRANS_INVALID_SESSION_NAME(0xF0040002, "无效的会话名称错误"),
+    SOFTBUS_TRANS_INVALID_CHANNEL_TYPE(0xF0040003, "无效的通道类型错误"),
+    SOFTBUS_TRANS_INVALID_CLOSE_CHANNEL_ID(0xF0040004, "无效的关闭通道ID错误"),
+    SOFTBUS_TRANS_BUSINESS_TYPE_NOT_MATCH(0xF0040005, "业务类型不匹配错误"),
+    SOFTBUS_TRANS_SESSION_REPEATED(0xF0040006, "会话重复错误"),
+    SOFTBUS_TRANS_SESSION_CNT_EXCEEDS_LIMIT(0xF0040007, "会话数超过限制错误"),
+    SOFTBUS_TRANS_SESSIONSERVER_NOT_CREATED(0xF0040008, "会话服务器未创建错误"),
+    SOFTBUS_TRANS_SESSION_OPENING(0xF0040009, "会话正在打开错误"),
+    SOFTBUS_TRANS_GET_LANE_INFO_ERR(0xF004000A, "获取通道信息错误"),
+    SOFTBUS_TRANS_CREATE_CHANNEL_ERR(0xF004000B, "创建通道错误"),
+    SOFTBUS_TRANS_INVALID_DATA_LENGTH(0xF004000C, "无效的数据长度错误"),
+    SOFTBUS_TRANS_FUNC_NOT_SUPPORT(0xF004000D, "不支持的功能错误"),
+    SOFTBUS_TRANS_OPEN_AUTH_CHANNANEL_FAILED(0xF004000E, "打开授权通道失败错误"),
+    SOFTBUS_TRANS_GET_P2P_INFO_FAILED(0xF004000F, "获取P2P信息失败错误"),
+    SOFTBUS_TRANS_OPEN_AUTH_CONN_FAILED(0xF0040010, "打开授权连接失败错误"),
+    SOFTBUS_TRANS_PROXY_PACKMSG_ERR(0xF0040011, "代理打包消息错误"),
+    SOFTBUS_TRANS_PROXY_SENDMSG_ERR(0xF0040012, "代理发送消息错误"),
+    SOFTBUS_TRANS_PROXY_SEND_CHANNELID_INVALID(0xF0040013, "无效的代理发送通道ID错误"),
+    SOFTBUS_TRANS_PROXY_CHANNLE_STATUS_INVALID(0xF0040014, "无效的代理通道状态错误"),
+    SOFTBUS_TRANS_PROXY_DEL_CHANNELID_INVALID(0xF0040015, "无效的代理删除通道ID错误"),
+    SOFTBUS_TRANS_PROXY_SESS_ENCRYPT_ERR(0xF0040016, "代理会话加密错误"),
+    SOFTBUS_TRANS_PROXY_INVALID_SLICE_HEAD(0xF0040017, "无效的代理切片头错误"),
+    SOFTBUS_TRANS_PROXY_ASSEMBLE_PACK_NO_INVALID(0xF0040018, "无效的代理组装包编号错误"),
+    SOFTBUS_TRANS_PROXY_ASSEMBLE_PACK_EXCEED_LENGTH(0xF0040019, "代理组装包长度超过限制错误"),
+    SOFTBUS_TRANS_PROXY_ASSEMBLE_PACK_DATA_NULL(0xF004001A, "代理组装包数据为空错误"),
+
+    SOFTBUS_TRANS_UDP_CLOSE_CHANNELID_INVALID(0xF004001B, "无效的UDP关闭通道ID错误"),
+    SOFTBUS_TRANS_UDP_SERVER_ADD_CHANNEL_FAILED(0xF004001C, "UDP服务器添加通道失败错误"),
+    SOFTBUS_TRANS_UDP_CLIENT_ADD_CHANNEL_FAILED(0xF004001D, "UDP客户端添加通道失败错误"),
+    SOFTBUS_TRANS_UDP_SERVER_NOTIFY_APP_OPEN_FAILED(0xF004001E, "UDP服务器通知应用程序打开失败错误"),
+    SOFTBUS_TRANS_UDP_CLIENT_NOTIFY_APP_OPEN_FAILED(0xF004001F, "UDP客户端通知应用程序打开失败错误"),
+    SOFTBUS_TRANS_UDP_START_STREAM_SERVER_FAILED(0xF0040020, "UDP启动流服务器失败错误"),
+    SOFTBUS_TRANS_UDP_START_STREAM_CLIENT_FAILED(0xF0040021, "UDP启动流客户端失败错误"),
+    SOFTBUS_TRANS_UDP_SEND_STREAM_FAILED(0xF0040022, "UDP发送流失败错误"),
+    SOFTBUS_TRANS_UDP_GET_CHANNEL_FAILED(0xF0040023, "UDP获取通道失败错误"),
+    SOFTBUS_TRANS_UDP_CHANNEL_DISABLE(0xF0040024, "UDP通道禁用错误"),
+    SOFTBUS_TRANS_QOS_REPORT_FAILED(0xF0040025, "QoS上报失败错误"),
+    SOFTBUS_TRANS_QOS_REPORT_TOO_FREQUENT(0xF0040026, "QoS上报过于频繁错误"),
+    SOFTBUS_TRANS_SESSION_SERVER_NOINIT(0xF0040027, "会话服务器未初始化错误"),
+    SOFTBUS_TRANS_SESSION_INFO_NOT_FOUND(0xF0040028, "未找到会话信息错误"),
+    SOFTBUS_TRANS_SESSION_CREATE_FAILED(0xF0040029, "会话创建失败错误"),
+    SOFTBUS_TRANS_SESSION_ADDPKG_FAILED(0xF004002A, "会话添加包失败错误"),
+    SOFTBUS_TRANS_SESSION_SET_CHANNEL_FAILED(0xF004002B, "会话设置通道失败错误"),
+    SOFTBUS_TRANS_SESSION_NO_ENABLE(0xF004002C, "会话未启用错误"),
+    SOFTBUS_TRANS_SESSION_GROUP_INVALID(0xF004002D, "无效的会话组错误"),
+    SOFTBUS_TRANS_SESSION_NAME_NO_EXIST(0xF004002E, "会话名称不存在错误"),
+    SOFTBUS_TRANS_SESSION_GET_CHANNEL_FAILED(0xF004002F, "会话获取通道失败错误"),
+
+    SOFTBUS_TRANS_PROXY_REMOTE_NULL(0xF0040030, "远程代理为空错误"),
+    SOFTBUS_TRANS_PROXY_WRITETOKEN_FAILED(0xF0040031, "写入令牌失败错误"),
+    SOFTBUS_TRANS_PROXY_WRITECSTRING_FAILED(0xF0040032, "写入C字符串失败错误"),
+    SOFTBUS_TRANS_PROXY_WRITERAWDATA_FAILED(0xF0040033, "写入原始数据失败错误"),
+    SOFTBUS_TRANS_PROXY_READRAWDATA_FAILED(0xF0040034, "读取原始数据失败错误"),
+    SOFTBUS_TRANS_PROXY_SEND_REQUEST_FAILED(0xF0040035, "发送请求失败错误"),
+    SOFTBUS_TRANS_PROXY_INVOKE_FAILED(0xF0040036, "调用失败错误"),
+    SOFTBUS_TRANS_PROXY_CHANNEL_NOT_FOUND(0xF0040037, "未找到代理通道错误"),
+    SOFTBUS_TRANS_SEND_LEN_BEYOND_LIMIT(0xF0040038, "发送长度超出限制错误"),
+    SOFTBUS_TRANS_FILE_LISTENER_NOT_INIT(0xF0040039, "文件监听器未初始化错误"),
+    SOFTBUS_TRANS_STREAM_ONLY_UDP_CHANNEL(0xF004003A, "仅支持UDP通道的流错误"),
+    SOFTBUS_TRANS_CHANNEL_TYPE_INVALID(0xF004003B, "无效的通道类型错误"),
+    SOFTBUS_TRANS_TDC_CHANNEL_NOT_FOUND(0xF004003C, "未找到TDC通道错误"),
+    SOFTBUS_TRANS_TDC_CHANNEL_ALREADY_PENDING(0xF004003D, "TDC通道已经处于挂起状态错误"),
+    SOFTBUS_TRANS_TDC_PENDINGLIST_NOT_FOUND(0xF004003E, "未找到TDC挂起列表错误"),
+    SOFTBUS_TRANS_AUTH_CHANNEL_NOT_FOUND(0xF004003F, "未找到认证通道错误"),
+    SOFTBUS_TRANS_NET_STATE_CHANGED(0xF0040040, "网络状态已更改错误"),
+    SOFTBUS_TRANS_HANDSHAKE_TIMEOUT(0xF0040041, "握手超时错误"),
+    SOFTBUS_TRANS_HANDSHAKE_ERROR(0xF0040042, "握手错误错误"),
+    SOFTBUS_TRANS_PEER_SESSION_NOT_CREATED(0xF0040043, "对等会话未创建错误"),
+    SOFTBUS_TRANS_PROXY_DISCONNECTED(0xF0040044, "代理断开连接错误"),
+    SOFTBUS_TRANS_AUTH_NOTALLOW_OPENED(0xF0040045, "认证未允许打开错误"),
+    SOFTBUS_TRANS_PROXY_ERROR_APP_TYPE(0xF0040046, "代理应用程序类型错误"),
+    SOFTBUS_TRANS_PROXY_CONN_REPEAT(0xF0040047, "代理连接重复错误"),
+    SOFTBUS_TRANS_PROXY_CONN_ADD_REF_FAILED(0xF0040048, "代理连接添加引用失败错误"),
+
+    /* errno begin: 0xF0080000 */
+    SOFTBUS_AUTH_ERR_BASE(0xF0080000, "认证错误基础值"),
+    SOFTBUS_AUTH_INIT_FAIL(0xF0080001, "认证初始化失败错误"),
+    SOFTBUS_AUTH_CONN_FAIL(0xF0080002, "认证连接失败错误"),
+    SOFTBUS_AUTH_CONN_TIMEOUT(0xF0080003, "认证连接超时错误"),
+    SOFTBUS_AUTH_DEVICE_DISCONNECTED(0xF0080004, "设备已断开连接错误"),
+    SOFTBUS_AUTH_SYNC_DEVID_FAIL(0xF0080005, "同步设备ID失败错误"),
+    SOFTBUS_AUTH_UNPACK_DEVID_FAIL(0xF0080006, "解包设备ID失败错误"),
+    SOFTBUS_AUTH_HICHAIN_AUTH_FAIL(0xF0080007, "HiChain认证失败错误"),
+    SOFTBUS_AUTH_HICHAIN_PROCESS_FAIL(0xF0080008, "HiChain处理失败错误"),
+    SOFTBUS_AUTH_HICHAIN_TRANSMIT_FAIL(0xF0080009, "HiChain传输失败错误"),
+    SOFTBUS_AUTH_HICHAIN_AUTH_ERROR(0xF008000A, "HiChain认证错误错误"),
+    SOFTBUS_AUTH_HICHAIN_NOT_TRUSTED(0xF008000B, "HiChain不被信任错误"),
+    SOFTBUS_AUTH_SYNC_DEVINFO_FAIL(0xF008000C, "同步设备信息失败错误"),
+    SOFTBUS_AUTH_UNPACK_DEVINFO_FAIL(0xF008000D, "解包设备信息失败错误"),
+    SOFTBUS_AUTH_SEND_FAIL(0xF008000E, "发送认证请求失败错误"),
+    SOFTBUS_AUTH_TIMEOUT(0xF008000F, "认证超时错误"),
+    SOFTBUS_AUTH_NOT_FOUND(0xF0080010, "未找到认证错误"),
+    SOFTBUS_AUTH_INNER_ERR(0xF0080011, "内部认证错误"),
+
+    /* errno begin: 0xF0100000 */
+    SOFTBUS_NETWORK_ERR_BASE(0xF0100000, "网络错误基础值"),
+    SOFTBUS_NETWORK_CONN_FSM_DEAD(0xF0100001, "连接状态机已停止错误"),
+    SOFTBUS_NETWORK_JOIN_CANCELED(0xF0100002, "加入网络已取消错误"),
+    SOFTBUS_NETWORK_JOIN_LEAVING(0xF0100003, "加入网络正在离开错误"),
+    SOFTBUS_NETWORK_JOIN_TIMEOUT(0xF0100004, "加入网络超时错误"),
+    SOFTBUS_NETWORK_UNPACK_DEV_INFO_FAILED(0xF0100005, "解包设备信息失败错误"),
+    SOFTBUS_NETWORK_DEV_NOT_TRUST(0xF0100006, "设备不被信任错误"),
+    SOFTBUS_NETWORK_LEAVE_OFFLINE(0xF0100007, "离开网络离线错误"),
+    SOFTBUS_NETWORK_AUTH_DISCONNECT(0xF0100008, "认证断开连接错误"),
+    SOFTBUS_NETWORK_TIME_SYNC_HANDSHAKE_ERR(0xF0100009, "时间同步握手错误"),
+    SOFTBUS_NETWORK_TIME_SYNC_HANDSHAKE_TIMEOUT(0xF010000A, "时间同步握手超时错误"),
+    SOFTBUS_NETWORK_TIME_SYNC_TIMEOUT(0xF010000B, "时间同步超时错误"),
+    SOFTBUS_NETWORK_TIME_SYNC_INTERFERENCE(0xF010000C, "时间同步干扰错误"),
+    SOFTBUS_NETWORK_HEARTBEAT_REPEATED(0xF010000D, "心跳重复错误"),
+    SOFTBUS_NETWORK_HEARTBEAT_UNTRUSTED(0xF010000E, "心跳不被信任错误"),
+    SOFTBUS_NETWORK_HEARTBEAT_EMPTY_LIST(0xF010000F, "心跳列表为空错误"),
+    SOFTBUS_NETWORK_NODE_OFFLINE(0xF0100010, "节点离线错误"),
+    SOFTBUS_NETWORK_NODE_DIRECT_ONLINE(0xF0100011, "直连节点在线错误"),
+    SOFTBUS_NETWORK_NOT_INIT(0xF0100012, "网络未初始化错误"),
+    SOFTBUS_NETWORK_LOOPER_ERR(0xF0100013, "网络循环错误"),
+    SOFTBUS_NETWORK_AUTH_TCP_ERR(0xF0100014, "TCP认证错误"),
+    SOFTBUS_NETWORK_AUTH_BLE_ERR(0xF0100015, "BLE认证错误"),
+    SOFTBUS_NETWORK_AUTH_BR_ERR(0xF0100016, "BR认证错误"),
+    SOFTBUS_NETWORK_GET_ALL_NODE_INFO_ERR(0xF0100017, "获取所有节点信息错误"),
+    SOFTBUS_NETWORK_GET_LOCAL_NODE_INFO_ERR(0xF0100018, "获取本地节点信息错误"),
+    SOFTBUS_NETWORK_NODE_KEY_INFO_ERR(0xF0100019, "节点密钥信息错误"),
+    SOFTBUS_NETWORK_ACTIVE_META_NODE_ERR(0xF010001A, "激活元节点错误"),
+    SOFTBUS_NETWORK_DEACTIVE_META_NODE_ERR(0xF010001B, "去激活元节点错误"),
+    SOFTBUS_NETWORK_GET_META_NODE_INFO_ERR(0xF010001C, "获取元节点信息错误"),
+
+    /* errno begin: 0xF0200000 */
+    SOFTBUS_CONN_ERR_BASE(0xF0200000, "连接错误基础"),
+    SOFTBUS_CONN_FAIL(0xF0200001, "连接失败"),
+    SOFTBUS_CONN_MANAGER_TYPE_NOT_SUPPORT(0xF0200002, "连接管理器类型不支持"),
+    SOFTBUS_CONN_MANAGER_OP_NOT_SUPPORT(0xF0200003, "连接管理器操作不支持"),
+    SOFTBUS_CONN_MANAGER_PKT_LEN_INVALID(0xF0200004, "连接管理器数据包长度无效"),
+    SOFTBUS_CONN_MANAGER_LIST_NOT_INIT(0xF0200005, "连接管理器列表未初始化"),
+    SOFTBUS_CONN_INVALID_CONN_TYPE(0xF0200006, "无效的连接类型"),
+    SOFTBUS_CONNECTION_BASE(0xF0200007, "连接基础错误"),
+    SOFTBUS_CONNECTION_ERR_CLOSED(0xF0200008, "连接已关闭错误"),
+    SOFTBUS_CONNECTION_ERR_DRIVER_CONGEST(0xF0200009, "驱动拥塞错误"),
+    SOFTBUS_CONNECTION_ERR_SOFTBUS_CONGEST(0xF020000A, "SoftBus拥塞错误"),
+    SOFTBUS_CONNECTION_ERR_CONNID_INVALID(0xF020000B, "无效的连接ID错误"),
+    SOFTBUS_CONNECTION_ERR_SENDQUEUE_FULL(0xF020000C, "发送队列已满错误"),
+
+    /* common error for bluetooth medium */
+    SOFTBUS_CONN_BLUETOOTH_OFF(0xF020000D, "蓝牙已关闭错误"),
+    SOFTBUS_CONN_BR_INTERNAL_ERR(0xF020000E, "蓝牙连接内部错误"),
+    SOFTBUS_CONN_BR_INVALID_ADDRESS_ERR(0xF020000F, "无效的蓝牙地址错误"),
+    SOFTBUS_CONN_BR_CONNECT_TIMEOUT_ERR(0xF0200010, "蓝牙连接超时错误"),
+    SOFTBUS_CONN_BR_CONNECTION_NOT_EXIST_ERR(0xF0200011, "蓝牙连接不存在错误"),
+    SOFTBUS_CONN_BR_CONNECTION_NOT_READY_ERR(0xF0200012, "蓝牙连接未准备好错误"),
+    SOFTBUS_CONN_BR_CONNECTION_INVALID_SOCKET(0xF0200013, "蓝牙连接无效套接字错误"),
+    SOFTBUS_CONN_BR_UNDERLAY_CONNECT_FAIL(0xF0200014, "蓝牙底层连接失败"),
+    SOFTBUS_CONN_BR_UNDERLAY_WRITE_FAIL(0xF0200015, "蓝牙底层写入失败"),
+    SOFTBUS_CONN_BR_UNDERLAY_SOCKET_CLOSED(0xF0200016, "蓝牙底层套接字已关闭"),
+    SOFTBUS_CONN_BR_UNDERLAY_READ_FAIL(0xF0200017, "蓝牙底层读取失败"),
+    SOFTBUS_CONN_BLE_INTERNAL_ERR(0xF0200018, "BLE连接内部错误"),
+    SOFTBUS_CONN_BLE_CONNECT_PREVENTED_ERR(0xF0200019, "BLE连接被阻止错误"),
+    SOFTBUS_CONN_BLE_DISCONNECT_DIRECTLY_ERR(0xF020001A, "BLE直接断开连接错误"),
+    SOFTBUS_CONN_BLE_DISCONNECT_WAIT_TIMEOUT_ERR(0xF020001B, "BLE断开连接超时错误"),
+    SOFTBUS_CONN_BLE_CONNECT_TIMEOUT_ERR(0xF020001C, "BLE连接超时错误"),
+    SOFTBUS_CONN_BLE_EXCHANGE_BASIC_INFO_TIMEOUT_ERR(0xF020001D, "BLE交换基本信息超时错误"),
+    SOFTBUS_CONN_BLE_CONNECTION_NOT_EXIST_ERR(0xF020001D, "BLE连接不存在错误"),
+    SOFTBUS_CONN_BLE_CONNECTION_NOT_READY_ERR(0xF020001F, "BLE连接未就绪错误"),
+    SOFTBUS_CONN_BLE_CLIENT_STATE_UNEXPECTED_ERR(0xF0200020, "BLE客户端状态异常错误"),
+    SOFTBUS_CONN_BLE_SERVER_STATE_UNEXPECTED_ERR(0xF0200021, "BLE服务器状态异常错误"),
+    SOFTBUS_CONN_BLE_SERVER_START_SERVER_TIMEOUT_ERR(0xF0200022, "BLE服务器启动超时错误"),
+    SOFTBUS_CONN_BLE_SERVER_STOP_SERVER_TIMEOUT_ERR(0xF0200023, "BLE服务器停止超时错误"),
+    SOFTBUS_CONN_BLE_UNDERLAY_DISCONNECT_TIMEOUT_ERR(0xF0200024, "BLE底层断开连接超时错误"),
+    SOFTBUS_CONN_BLE_UNDERLAY_CLIENT_REGISTER_ERR(0xF0200025, "BLE底层客户端注册错误"),
+    SOFTBUS_CONN_BLE_UNDERLAY_CLIENT_CONNECT_ERR(0xF0200026, "BLE底层客户端连接错误"),
+    SOFTBUS_CONN_BLE_UNDERLAY_CLIENT_CONNECT_FAIL(0xF0200027, "BLE底层客户端连接失败"),
+    SOFTBUS_CONN_BLE_UNDERLAY_CLIENT_DISCONNECT_ERR(0xF0200028, "BLE底层客户端断开连接错误"),
+    SOFTBUS_CONN_BLE_UNDERLAY_CLIENT_DISCONNECT_FAIL(0xF0200029, "BLE底层客户端断开连接失败"),
+    SOFTBUS_CONN_BLE_UNDERLAY_CLIENT_SEARCH_SERVICE_ERR(0xF020002A, "BLE底层客户端搜索服务错误"),
+    SOFTBUS_CONN_BLE_UNDERLAY_CLIENT_SEARCH_SERVICE_FAIL(0xF020002B, "BLE底层客户端搜索服务失败"),
+    SOFTBUS_CONN_BLE_UNDERLAY_CLIENT_GET_SERVICE_ERR(0xF020002C, "BLE底层客户端获取服务错误"),
+    SOFTBUS_CONN_BLE_UNDERLAY_CLIENT_REGISTER_NOTIFICATION_ERR(0xF020002D, "BLE底层客户端注册通知错误"),
+    SOFTBUS_CONN_BLE_UNDERLAY_CLIENT_REGISTER_NOTIFICATION_FAIL(0xF020002E, "BLE底层客户端注册通知失败"),
+    SOFTBUS_CONN_BLE_UNDERLAY_CLIENT_CONFIGURE_MTU_ERR(0xF020002F, "BLE底层客户端配置MTU错误"),
+    SOFTBUS_CONN_BLE_UNDERLAY_CLIENT_CONFIGURE_MTU_FAIL(0xF0200030, "BLE底层客户端配置MTU失败"),
+    SOFTBUS_CONN_BLE_UNDERLAY_CLIENT_WRITE_ERR(0xF0200031, "BLE底层客户端写入错误"),
+    SOFTBUS_CONN_BLE_UNDERLAY_SERVER_REGISTER_CALLBACK_ERR(0xF0200032, "BLE底层服务器注册回调错误"),
+    SOFTBUS_CONN_BLE_UNDERLAY_SERVER_ADD_SERVICE_ERR(0xF0200033, "BLE底层服务器添加服务错误"),
+    SOFTBUS_CONN_BLE_UNDERLAY_SERVER_ADD_SERVICE_FAIL(0xF0200034, "BLE底层服务器添加服务失败"),
+    SOFTBUS_CONN_BLE_UNDERLAY_CHARACTERISTIC_ADD_ERR(0xF0200035, "BLE底层特征添加错误"),
+    SOFTBUS_CONN_BLE_UNDERLAY_CHARACTERISTIC_ADD_FAIL(0xF0200036, "BLE底层特征添加失败"),
+    SOFTBUS_CONN_BLE_UNDERLAY_DESCRIPTOR_ADD_ERR(0xF0200037, "BLE底层描述符添加错误"),
+    SOFTBUS_CONN_BLE_UNDERLAY_DESCRIPTOR_ADD_FAIL(0xF0200038, "BLE底层描述符添加失败"),
+    SOFTBUS_CONN_BLE_UNDERLAY_SERVICE_START_ERR(0xF0200039, "BLE底层服务启动错误"),
+    SOFTBUS_CONN_BLE_UNDERLAY_SERVICE_START_FAIL(0xF020003A, "BLE底层服务启动失败"),
+    SOFTBUS_CONN_BLE_UNDERLAY_SERVICE_STOP_ERR(0xF020003B, "BLE底层服务停止错误"),
+    SOFTBUS_CONN_BLE_UNDERLAY_SERVICE_STOP_FAIL(0xF020003C, "BLE底层服务停止失败"),
+    SOFTBUS_CONN_BLE_UNDERLAY_SERVICE_DELETE_ERR(0xF020003D, "BLE底层服务删除错误"),
+    SOFTBUS_CONN_BLE_UNDERLAY_SERVICE_DELETE_FAIL(0xF020003E, "BLE底层服务删除失败"),
+    SOFTBUS_CONN_BLE_UNDERLAY_UNKNOWN_SERVICE_ERR(0xF020003F, "BLE底层未知服务错误"),
+    SOFTBUS_CONN_BLE_UNDERLAY_UNKNOWN_CHARACTERISTIC_ERR(0xF0200040, "BLE底层未知特征错误"),
+    SOFTBUS_CONN_BLE_UNDERLAY_UNKNOWN_DESCRIPTOR_ERR(0xF0200041, "BLE底层未知描述符错误"),
+    SOFTBUS_CONN_BLE_UNDERLAY_SERVICE_HANDLE_MISMATCH_ERR(0xF0200042, "BLE底层服务句柄不匹配错误"),
+    SOFTBUS_CONN_BLE_UNDERLAY_CHARACTERISTIC_HANDLE_MISMATCH_ERR(0xF0200043, "BLE底层特征句柄不匹配错误"),
+    SOFTBUS_CONN_BLE_UNDERLAY_DESCRIPTOR_HANDLE_MISMATCH_ERR(0xF0200044, "BLE底层描述符句柄不匹配错误"),
+    SOFTBUS_CONN_BLE_COC_INTERNAL_ERR(0xF0200045, "BLE COC内部错误"),
+    SOFTBUS_CONN_BLE_COC_INVALID_ADDRESS_ERR(0xF0200046, "BLE COC无效地址错误"),
+    SOFTBUS_CONN_BLE_COC_CONNECT_TIMEOUT_ERR(0xF0200047, "BLE COC连接超时错误"),
+    SOFTBUS_CONN_BLE_COC_CONNECTION_NOT_EXIST_ERR(0xF0200048, "BLE COC连接不存在错误"),
+    SOFTBUS_CONN_BLE_COC_CONNECTION_NOT_READY_ERR(0xF0200049, "BLE COC连接未准备好错误"),
+    SOFTBUS_CONN_BLE_COC_CONNECTION_INVALID_SOCKET(0xF020004A, "BLE COC连接无效套接字"),
+    SOFTBUS_CONN_BLE_COC_UNDERLAY_CONNECT_FAIL(0xF020004B, "BLE COC底层连接失败"),
+    SOFTBUS_CONN_BLE_COC_UNDERLAY_WRITE_FAIL(0xF020004C, "BLE COC底层写入失败"),
+    SOFTBUS_CONN_BLE_COC_UNDERLAY_SOCKET_CLOSED(0xF020004D, "BLE COC底层套接字已关闭"),
+    SOFTBUS_CONN_BLE_COC_UNDERLAY_READ_FAIL(0xF020004E, "BLE COC底层读取失败"),
+    SOFTBUS_BLECONNECTION_REG_GATTS_CALLBACK_FAIL(0xF020004F, "BLE连接注册GATTS回调失败"),
+    SOFTBUS_GATTC_INTERFACE_FAILED(0xF0200050, "GATTC接口失败"),
+    SOFTBUS_TCPCONNECTION_SOCKET_ERR(0xF0200051, "TCP连接套接字错误"),
+    SOFTBUS_TCPFD_NOT_IN_TRIGGER(0xF0200052, "TCP FD不在触发器中"),
+
+    /* errno begin: 0xF0400000 */
+    SOFTBUS_DISCOVER_ERR_BASE(0xF0400000, "发现异常信息"),
+    SOFTBUS_DISCOVER_NOT_INIT(0xF0400001, "发现模块未初始化错误"),
+    SOFTBUS_DISCOVER_INVALID_PKGNAME(0xF0400002, "无效的包名错误"),
+    SOFTBUS_DISCOVER_SERVER_NO_PERMISSION(0xF0400003, "发现服务无权限错误"),
+    SOFTBUS_DISCOVER_MANAGER_NOT_INIT(0xF0400004, "发现管理器未初始化错误"),
+    SOFTBUS_DISCOVER_MANAGER_ITEM_NOT_CREATE(0xF0400005, "发现管理器项未创建错误"),
+    SOFTBUS_DISCOVER_MANAGER_INFO_NOT_CREATE(0xF0400006, "发现管理器信息未创建错误"),
+    SOFTBUS_DISCOVER_MANAGER_INFO_NOT_DELETE(0xF0400007, "发现管理器信息未删除错误"),
+    SOFTBUS_DISCOVER_MANAGER_INNERFUNCTION_FAIL(0xF0400008, "发现管理器内部函数失败错误"),
+    SOFTBUS_DISCOVER_MANAGER_CAPABILITY_INVALID(0xF0400009, "发现管理器能力无效错误"),
+    SOFTBUS_DISCOVER_MANAGER_DUPLICATE_PARAM(0xF040000A, "发现管理器重复参数错误"),
+    SOFTBUS_DISCOVER_MANAGER_INVALID_PARAM(0xF040000B, "发现管理器无效参数错误"),
+    SOFTBUS_DISCOVER_MANAGER_INVALID_MEDIUM(0xF040000C, "发现管理器无效介质错误"),
+    SOFTBUS_DISCOVER_MANAGER_INVALID_PKGNAME(0xF040000D, "发现管理器无效包名错误"),
+    SOFTBUS_DISCOVER_MANAGER_INVALID_MODULE(0xF040000E, "发现管理器无效模块错误"),
+    SOFTBUS_DISCOVER_COAP_NOT_INIT(0xF040000F, "COAP发现未初始化错误"),
+    SOFTBUS_DISCOVER_COAP_INIT_FAIL(0xF0400010, "COAP发现初始化失败错误"),
+    SOFTBUS_DISCOVER_COAP_MERGE_CAP_FAIL(0xF0400011, "COAP发现合并能力失败错误"),
+    SOFTBUS_DISCOVER_COAP_CANCEL_CAP_FAIL(0xF0400012, "COAP发现取消能力失败错误"),
+    SOFTBUS_DISCOVER_COAP_REGISTER_CAP_FAIL(0xF0400013, "COAP发现注册能力失败错误"),
+    SOFTBUS_DISCOVER_COAP_SET_FILTER_CAP_FAIL(0xF0400014, "COAP发现设置过滤器失败错误"),
+    SOFTBUS_DISCOVER_COAP_REGISTER_DEVICE_FAIL(0xF0400015, "COAP发现注册设备失败错误"),
+    SOFTBUS_DISCOVER_COAP_START_PUBLISH_FAIL(0xF0400016, "COAP发现开始发布失败错误"),
+    SOFTBUS_DISCOVER_COAP_STOP_PUBLISH_FAIL(0xF0400017, "COAP发现停止发布失败错误"),
+    SOFTBUS_DISCOVER_COAP_START_DISCOVER_FAIL(0xF0400018, "COAP发现开始发现失败错误"),
+    SOFTBUS_DISCOVER_COAP_STOP_DISCOVER_FAIL(0xF0400019, "COAP发现停止发现失败错误"),
+
+    /* errno begin: 0xF0800000 */
+    SOFTBUS_PUBLIC_ERR_BASE(-13000, "公共异常信息"),
+
+    /* internal error */
+    SOFTBUS_ERR(-1, "softbus异常"),
+    /* softbus ok */
+    SOFTBUS_OK(0,"ok");
+
+    private final Integer errCode;
+
+    private final String errMsg;
+    SoftbusErrCode(int errCode, String errMsg) {
+        this.errCode = errCode;
+        this.errMsg = errMsg;
+    }
+
+    public Integer getErrCode() {
+        return this.errCode;
+    }
+
+    public String getErrMsg() {
+        return this.errMsg;
+    }
+
+    public static SoftbusErrCode getByErrCode(int errCode) {
+        for (SoftbusErrCode softbusErrCode : SoftbusErrCode.values()) {
+            if (softbusErrCode.getErrCode().equals(errCode)) {
+                return softbusErrCode;
+            }
+        }
+        return null;
+    }
+}

+ 154 - 0
softbus-sdk/src/main/java/com/jg/softbus/device/DeviceInfo.java

@@ -0,0 +1,154 @@
+/** 
+* Copyright (c) 2022-2024. jinggezhihui. All rights reserved.  
+* FileName: DeviceInfo.java 
+* Author: marunming
+* Email: runming56@163.com
+* Date: 2023年10月26日 下午3:05:40
+* version: V1.0
+* LastModified: 2023年10月26日 下午3:05:40   
+*/ 
+
+
+package com.jg.softbus.device;
+
+import com.jg.softbus.network.protocol.ConnectionAddr;
+
+import java.io.Serializable;
+import java.util.Objects;
+
+/** 
+* 设备信息
+*
+* @Author marunming
+* @ClassName: DeviceInfo 
+* @Email runming56@163.com
+* @Date 2023年10月26日 下午3:05:40 
+*/
+public class DeviceInfo implements Serializable {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 2026921411515550451L;
+	/** Device ID. Its maximum length is 96. */
+	private String devId;
+	/** Account hash code. Its maximum length is 96. */
+	private String accountHash;
+	/** Device type. For details, see {@link DeviceType}. */
+	private DeviceType devType;
+	/** Device name. Its maximum length is 65. */
+	private String devName;
+	/** Device Online Status **/
+	private boolean isOnline;
+	/** Number of available connections */
+	private int addrNum;
+	/** Connection information. For details, see {@link ConnectionAddr}. */
+	private ConnectionAddr[] addr;
+	/** Number of capabilities */
+	private int capabilityBitmapNum;
+	/** Device capability bitmap.
+	 * The maximum number of capabilities in the bitmap is 2.
+	 */
+	private String[] capabilityBitmap;
+	/** Custom data. Its length is DISC_MAX_CUST_DATA_LEN. */
+	private String custData;
+	/** The distance of discovered device, in centimeters(cm)*/
+	private int range;
+
+	public String getDevId() {
+		return devId;
+	}
+
+	public void setDevId(String devId) {
+		this.devId = devId;
+	}
+
+	public String getAccountHash() {
+		return accountHash;
+	}
+
+	public void setAccountHash(String accountHash) {
+		this.accountHash = accountHash;
+	}
+
+	public DeviceType getDevType() {
+		return devType;
+	}
+
+	public void setDevType(DeviceType devType) {
+		this.devType = devType;
+	}
+
+	public String getDevName() {
+		return devName;
+	}
+
+	public void setDevName(String devName) {
+		this.devName = devName;
+	}
+
+	public boolean getOnline() {
+		return isOnline;
+	}
+
+	public void setOnline(boolean online) {
+		isOnline = online;
+	}
+
+	public int getAddrNum() {
+		return addrNum;
+	}
+
+	public void setAddrNum(int addrNum) {
+		this.addrNum = addrNum;
+	}
+
+	public ConnectionAddr[] getAddr() {
+		return addr;
+	}
+
+	public void setAddr(ConnectionAddr[] addr) {
+		this.addr = addr;
+	}
+
+	public int getCapabilityBitmapNum() {
+		return capabilityBitmapNum;
+	}
+
+	public void setCapabilityBitmapNum(int capabilityBitmapNum) {
+		this.capabilityBitmapNum = capabilityBitmapNum;
+	}
+
+	public String[] getCapabilityBitmap() {
+		return capabilityBitmap;
+	}
+
+	public void setCapabilityBitmap(String[] capabilityBitmap) {
+		this.capabilityBitmap = capabilityBitmap;
+	}
+
+	public String getCustData() {
+		return custData;
+	}
+
+	public void setCustData(String custData) {
+		this.custData = custData;
+	}
+
+	public int getRange() {
+		return range;
+	}
+
+	public void setRange(int range) {
+		this.range = range;
+	}
+
+	@Override
+	public boolean equals(Object o) {
+		if (this == o) return true;
+		if (o == null || getClass() != o.getClass()) return false;
+		DeviceInfo that = (DeviceInfo) o;
+		return Objects.equals(devId, that.devId);
+	}
+
+}

+ 39 - 0
softbus-sdk/src/main/java/com/jg/softbus/device/DeviceState.java

@@ -0,0 +1,39 @@
+/** 
+* Copyright (c) 2022-2024. jinggezhihui. All rights reserved.  
+* FileName: DeviceState.java 
+* Author: marunming
+* Email: runming56@163.com
+* Date: 2023年10月26日 下午3:28:34
+* version: V1.0
+* LastModified: 2023年10月26日 下午3:28:34   
+*/ 
+
+
+package com.jg.softbus.device;
+
+/** 
+* 设备状态
+*
+* @Author marunming
+* @ClassName: DeviceState 
+* @Email runming56@163.com
+* @Date 2023年10月26日 下午3:28:34 
+*/
+public enum DeviceState {
+	/**
+	 * 位置状态
+	 */
+	UNKNOWN,
+	/**
+	 * 在线
+	 */
+    ONLINE,
+    /**
+     * 离线
+     */
+    OFFLINE;
+
+    private DeviceState() {
+    }
+	
+}

+ 62 - 0
softbus-sdk/src/main/java/com/jg/softbus/device/DeviceType.java

@@ -0,0 +1,62 @@
+/** 
+* Copyright (c) 2022-2024. jinggezhihui. All rights reserved.  
+* FileName: DeviceType.java 
+* Author: marunming
+* Email: runming56@163.com
+* Date: 2023年10月26日 下午3:25:52
+* version: V1.0
+* LastModified: 2023年10月26日 下午3:25:52   
+*/ 
+
+
+package com.jg.softbus.device;
+
+import java.util.Arrays;
+import java.util.Optional;
+
+/**
+* 设备类型
+*
+* @Author marunming
+* @ClassName: DeviceType 
+* @Email runming56@163.com
+* @Date 2023年10月26日 下午3:25:52 
+*/
+public enum DeviceType {
+
+    /* Smart speaker */
+    SMART_SPEAKER(0x00),
+    /* PC */
+    DESKTOP_PC(0x01),
+    /* Laptop */
+    LAPTOP(0x02),
+    /* Mobile phone */
+    SMART_PHONE(0x03),
+    /* Tablet */
+    SMART_PAD(0x04),
+    /* Smart watch */
+    SMART_WATCH(0x05),
+    /* Smart car */
+    SMART_CAR(0x06),
+    /* Kids' watch */
+    CHILDREN_WATCH(0x07),
+    /* Smart TV */
+    SMART_TV(0x08);
+
+    private final int value;
+     private DeviceType(int value) {
+    	 this.value = value;
+     }
+
+     public int valueOf(){
+         return this.value;
+     }
+
+     public static DeviceType getForValue(int value) {
+         Optional<DeviceType> rs =
+             Arrays.stream(DeviceType.values())
+             .filter(v -> v.value == value)
+             .findFirst();
+         return rs.orElse(null);
+     }
+}

+ 29 - 0
softbus-sdk/src/main/java/com/jg/softbus/discovery/CapabilityMap.java

@@ -0,0 +1,29 @@
+package com.jg.softbus.discovery;
+
+import com.jg.softbus.discovery.enums.DataBitMap;
+
+/**
+ *  Defines the mapping between supported capabilities and bitmaps.
+ */
+public class CapabilityMap {
+    /** Bitmaps. For details, see {@link DataBitMap}. */
+    private DataBitMap bitmap;
+    /** Capability. For details, see {@link DataBitMap}. */
+    private String capability;
+
+    public DataBitMap getBitmap() {
+        return bitmap;
+    }
+
+    public void setBitmap(DataBitMap bitmap) {
+        this.bitmap = bitmap;
+    }
+
+    public String getCapability() {
+        return capability;
+    }
+
+    public void setCapability(String capability) {
+        this.capability = capability;
+    }
+}

+ 89 - 0
softbus-sdk/src/main/java/com/jg/softbus/discovery/PublishInfo.java

@@ -0,0 +1,89 @@
+package com.jg.softbus.discovery;
+
+import com.jg.softbus.discovery.enums.DataBitMap;
+import com.jg.softbus.discovery.enums.DiscoverMode;
+import com.jg.softbus.discovery.enums.ExchangeFreq;
+import com.jg.softbus.discovery.enums.ExchangeMedium;
+
+public class PublishInfo {
+    /** Service ID */
+    private int publishId;
+    /** Discovery mode for service publishing. For details, see {@link Discovermode}. */
+    private DiscoverMode mode;
+    /** Service publishing medium. For details, see {@link ExchangeMedium}. */
+    private ExchangeMedium medium;
+    /** Service publishing frequency. For details, see {@link ExchangeFreq}. */
+    private ExchangeFreq freq;
+    /** Service publishing capabilities. For details, see {@link DataBitMap}. */
+    private String capability;
+    /** Capability data for service publishing, MUST be c-string format. */
+    private String capabilityData;
+    /** Maximum length of the capability data for service publishing (512 bytes) */
+    private int dataLen;
+    /** Whether the device should be ranged  by discoverers.*/
+    private boolean ranging;
+
+    public int getPublishId() {
+        return publishId;
+    }
+
+    public void setPublishId(int publishId) {
+        this.publishId = publishId;
+    }
+
+    public DiscoverMode getMode() {
+        return mode;
+    }
+
+    public void setMode(DiscoverMode mode) {
+        this.mode = mode;
+    }
+
+    public ExchangeMedium getMedium() {
+        return medium;
+    }
+
+    public void setMedium(ExchangeMedium medium) {
+        this.medium = medium;
+    }
+
+    public ExchangeFreq getFreq() {
+        return freq;
+    }
+
+    public void setFreq(ExchangeFreq freq) {
+        this.freq = freq;
+    }
+
+    public String getCapability() {
+        return capability;
+    }
+
+    public void setCapability(String capability) {
+        this.capability = capability;
+    }
+
+    public String getCapabilityData() {
+        return capabilityData;
+    }
+
+    public void setCapabilityData(String capabilityData) {
+        this.capabilityData = capabilityData;
+    }
+
+    public int getDataLen() {
+        return dataLen;
+    }
+
+    public void setDataLen(int dataLen) {
+        this.dataLen = dataLen;
+    }
+
+    public boolean getRanging() {
+        return ranging;
+    }
+
+    public void setRanging(Boolean ranging) {
+        this.ranging = ranging;
+    }
+}

+ 101 - 0
softbus-sdk/src/main/java/com/jg/softbus/discovery/SubscribeInfo.java

@@ -0,0 +1,101 @@
+package com.jg.softbus.discovery;
+
+import com.jg.softbus.discovery.enums.DiscoverMode;
+import com.jg.softbus.discovery.enums.ExchangeFreq;
+import com.jg.softbus.discovery.enums.ExchangeMedium;
+
+/**
+ * Defines service subscription information.
+ */
+public class SubscribeInfo {
+    /** Service ID */
+    private int subscribeId;
+    /** Discovery mode for service subscription. For details, see {@link Discovermode}. */
+    private DiscoverMode mode;
+    /** Service subscription medium. For details, see {@link ExchangeMedium}. */
+    private ExchangeMedium medium;
+    /** Service subscription frequency. For details, see {@link ExchangeFreq}. */
+    private ExchangeFreq freq;
+    /** only find the device with the same account */
+    private boolean isSameAccount;
+    /** find the sleeping devices */
+    private boolean isWakeRemote;
+    /** Service subscription capability. For details, see {@link g_capabilityMap}. */
+    private String capability;
+    /** Capability data for service subscription, MUST be c-string format. */
+    private String capabilityData;
+    /** Maximum length of the capability data for service subscription (512 bytes) */
+    private int dataLen;
+
+    public int getSubscribeId() {
+        return subscribeId;
+    }
+
+    public void setSubscribeId(int subscribeId) {
+        this.subscribeId = subscribeId;
+    }
+
+    public DiscoverMode getMode() {
+        return mode;
+    }
+
+    public void setMode(DiscoverMode mode) {
+        this.mode = mode;
+    }
+
+    public ExchangeMedium getMedium() {
+        return medium;
+    }
+
+    public void setMedium(ExchangeMedium medium) {
+        this.medium = medium;
+    }
+
+    public ExchangeFreq getFreq() {
+        return freq;
+    }
+
+    public void setFreq(ExchangeFreq freq) {
+        this.freq = freq;
+    }
+
+    public boolean getIsSameAccount() {
+        return isSameAccount;
+    }
+
+    public void setIsSameAccount(boolean sameAccount) {
+        isSameAccount = sameAccount;
+    }
+
+    public boolean getIsWakeRemote() {
+        return isWakeRemote;
+    }
+
+    public void setIsWakeRemote(boolean wakeRemote) {
+        isWakeRemote = wakeRemote;
+    }
+
+    public String getCapability() {
+        return capability;
+    }
+
+    public void setCapability(String capability) {
+        this.capability = capability;
+    }
+
+    public String getCapabilityData() {
+        return capabilityData;
+    }
+
+    public void setCapabilityData(String capabilityData) {
+        this.capabilityData = capabilityData;
+    }
+
+    public int getDataLen() {
+        return dataLen;
+    }
+
+    public void setDataLen(int dataLen) {
+        this.dataLen = dataLen;
+    }
+}

+ 29 - 0
softbus-sdk/src/main/java/com/jg/softbus/discovery/callback/IDiscoveryCallback.java

@@ -0,0 +1,29 @@
+package com.jg.softbus.discovery.callback;
+
+import com.jg.softbus.device.DeviceInfo;
+import com.jg.softbus.discovery.enums.DiscoveryFailReason;
+
+/**
+ * 发现回调接口
+ * 参见 {@link com.jg.softbus.naservice.SubscribeService} 使用
+ */
+public interface IDiscoveryCallback {
+    /**
+     * 发现设备回调接口
+     * @param info
+     */
+    void onDeviceFound(DeviceInfo info);
+
+    /**
+     * 失败回调接口
+     * @param subscribeId
+     * @param reason see {@link DiscoveryFailReason}
+     */
+    void onDiscoverFailed(int subscribeId, int reason);
+
+    /**
+     * 成功回调接口
+     * @param subscribeId
+     */
+    void onDiscoverySuccess(int subscribeId);
+}

+ 22 - 0
softbus-sdk/src/main/java/com/jg/softbus/discovery/callback/IPublishCallback.java

@@ -0,0 +1,22 @@
+package com.jg.softbus.discovery.callback;
+
+import com.jg.softbus.discovery.enums.PublishFailReason;
+
+/**
+ * 发布回调接口
+ * 具体参见 {@link com.jg.softbus.naservice.PublishService}
+ */
+public interface IPublishCallback {
+    /**
+     * 发布成功时回调
+     * @param publishId 发布id
+     */
+    void onPublishSuccess(int publishId);
+
+    /**
+     * 发布失败时回调
+     * @param publishId 发布id
+     * @param reason 失败原因 see {@link PublishFailReason}
+     */
+    void onPublishFail(int publishId, int reason);
+}

+ 14 - 0
softbus-sdk/src/main/java/com/jg/softbus/discovery/callback/IPublishCb.java

@@ -0,0 +1,14 @@
+package com.jg.softbus.discovery.callback;
+
+/**
+ * 发布回调接口,针对新版本pulishLNN方式
+ * 具体参见{@link com.jg.softbus.naservice.PublishService}
+ */
+public interface IPublishCb {
+    /**
+     *
+     * @param publishId
+     * @param reason see {@link com.jg.softbus.discovery.enums.PublishResult}
+     */
+    void onPublishResult(int publishId, int reason);
+}

+ 23 - 0
softbus-sdk/src/main/java/com/jg/softbus/discovery/callback/IRefreshCallback.java

@@ -0,0 +1,23 @@
+package com.jg.softbus.discovery.callback;
+
+import com.jg.softbus.device.DeviceInfo;
+import com.jg.softbus.discovery.enums.RefreshResult;
+
+/**
+ * 发现回调,针对新版RefreshLNN
+ * 具体参见 {@link com.jg.softbus.naservice.SubscribeService}
+ */
+public interface IRefreshCallback {
+    /**
+     * 发现设备回调
+     * @param device
+     */
+    void onDeviceFound(DeviceInfo device);
+
+    /**
+     * 订阅结果回调
+     * @param refreshId
+     * @param reason 错误类型,具体参见 {@link RefreshResult}
+     */
+    void onDiscoverResult(int refreshId, int reason);
+}

+ 88 - 0
softbus-sdk/src/main/java/com/jg/softbus/discovery/enums/DataBitMap.java

@@ -0,0 +1,88 @@
+package com.jg.softbus.discovery.enums;
+
+/**
+ * Enumerates supported capabilities published by a device.
+ */
+public enum DataBitMap {
+    /**
+     * HiCall能力位图,
+     * HiCall是一种通信存储解决方案,它可以用于电话录音、语音存储和呼叫中心等场景
+     */
+    HICALL_CAPABILITY_BITMAP(0, "hicall"),
+    /**
+     * Profile能力位图,
+     * 它可以用于存储和管理用户的个人配置文件,包括个人设置、偏好和应用程序数据等
+     */
+    PROFILE_CAPABILITY_BITMAP(1, "profile"),
+    /**
+     * HomeVisionPic能力位图
+     * HomeVisionPic是一种家庭视觉存储解决方案,用于存储和管理家庭照片、视频和其他多媒体内容
+     */
+    HOMEVISIONPIC_CAPABILITY_BITMAP(2, "homevisionPic"),
+    /**
+     * CastPlus能力位图
+     * CastPlus是一种广播存储解决方案,用于存储和管理广播内容,包括音频、视频和广播节目等
+     */
+    CASTPLUS_CAPABILITY_BITMAP(3, "castPlus"),
+    /**
+     * AA能力位图
+     * 它可以用于自动化地存储和管理数据归档,包括备份、归档和长期存储等
+     */
+    AA_CAPABILITY_BITMAP(4, "aaCapability"),
+    /**
+     * DVKIT能力位图
+     * DVKIT是一种开发工具包,用于构建和管理存储解决方案,包括数据管理、存储管理和访问控制等
+     */
+    DVKIT_CAPABILITY_BITMAP(5, "dvKit"),
+    /**
+     * DDMP能力位图
+     * DDMP是一种分布式数据管理平台,用于存储和管理大规模分布式数据,包括数据存储、数据访问和数据处理等
+     */
+    DDMP_CAPABILITY_BITMAP(6, "ddmpCapability"),
+    /**
+     * OSD能力位图
+     *
+     * 它表示OSD支持的各种功能和特性,如数据加密、数据压缩、数据去重、快照、复制等
+     */
+    OSD_CAPABILITY_BITMAP(7, "osdCapability"),
+    /**
+     * Share能力位图
+     * 它可以用于多用户或多应用程序之间共享存储资源,实现数据共享和协作
+     */
+    SHARE_CAPABILITY_BITMAP(8, "share"),
+    /**
+     * Approach能力位图
+     * 它表示存储系统或软件所支持的功能和特性,
+     * 如存储资源管理、数据迁移、性能优化、容错机制等。
+     * 它是用于确定整个存储系统的能力,并根据需要进行相应的配置和操作
+     */
+    APPROACH_CAPABILITY_BITMAP(9, "approach");
+
+    private final int value;
+
+    private final String abbr;
+
+    DataBitMap(int value, String abbr) {
+        this.value = value;
+        this.abbr = abbr;
+    }
+
+    public int valueOf() {
+        return value;
+    }
+
+    public String getAbbr() {
+        return abbr;
+    }
+
+    public static DataBitMap getForValue(int value) {
+        //根据值返回枚举
+        for (DataBitMap dataBitMap : DataBitMap.values()) {
+            if (dataBitMap.valueOf() == value) {
+                return dataBitMap;
+            }
+        }
+        return null;
+    }
+
+}

+ 33 - 0
softbus-sdk/src/main/java/com/jg/softbus/discovery/enums/DiscoverMode.java

@@ -0,0 +1,33 @@
+package com.jg.softbus.discovery.enums;
+
+/**
+ * Enumerates the modes in which services are published.
+ */
+public enum DiscoverMode {
+    /* Passive */
+    DISCOVER_MODE_PASSIVE(0x55),
+    /* Proactive */
+    DISCOVER_MODE_ACTIVE(0xAA);
+
+    private final int value;
+    DiscoverMode(int value) {
+        this.value = value;
+    }
+
+    public int valueOf(){
+        return this.value;
+    }
+
+    /**
+     * 基于value获取值
+     * @param value
+     * @return
+     */
+    public static DiscoverMode getForValue(int value){
+        switch (value) {
+            case 0x55: return DISCOVER_MODE_PASSIVE;
+            case 0xAA: return DISCOVER_MODE_ACTIVE;
+            default: return null;
+        }
+    }
+}

+ 32 - 0
softbus-sdk/src/main/java/com/jg/softbus/discovery/enums/DiscoveryFailReason.java

@@ -0,0 +1,32 @@
+package com.jg.softbus.discovery.enums;
+
+import java.util.Arrays;
+import java.util.Optional;
+
+public enum DiscoveryFailReason {
+    /* Unsupported medium */
+    DISCOVERY_FAIL_REASON_NOT_SUPPORT_MEDIUM(1),
+    /* internal error */
+    DISCOVERY_FAIL_REASON_INTERNAL(2),
+    /* Unknown error */
+    DISCOVERY_FAIL_REASON_UNKNOWN(0xFF);
+
+    private final int value;
+    DiscoveryFailReason(int value) {
+        this.value = value;
+    }
+
+    public int valueOf(){
+        return this.value;
+    }
+
+    /**
+     * 基于value获取值
+     * @param value
+     * @return
+     */
+    public static DiscoveryFailReason getForValue(int value){
+       Optional<DiscoveryFailReason> rs = Arrays.stream(DiscoveryFailReason.values()).filter(v -> v.value == value).findAny();
+       return rs.orElse(DISCOVERY_FAIL_REASON_UNKNOWN);
+    }
+}

+ 38 - 0
softbus-sdk/src/main/java/com/jg/softbus/discovery/enums/ExchangeFreq.java

@@ -0,0 +1,38 @@
+package com.jg.softbus.discovery.enums;
+
+/**
+ *  Enumerates frequencies for publishing services.
+ *  This enumeration applies only to Bluetooth and is not supported currently.
+ */
+public enum ExchangeFreq {
+    /** Low */
+    LOW(0),
+    /** Medium */
+    MID(1),
+    /** High */
+    HIGH(2),
+    /** Super-high */
+    SUPER_HIGH(3),
+    FREQ_BUTT(4);
+
+    private final int value;
+
+    ExchangeFreq(int value) {
+        this.value = value;
+    }
+
+    public int valueOf(){
+        return this.value;
+    }
+    /**
+     * 根据值获取ExchageFreq对象
+     */
+    public static ExchangeFreq getForValue(int value) {
+        for (ExchangeFreq freq : ExchangeFreq.values()) {
+            if (freq.value == value) {
+                return freq;
+            }
+        }
+        return null;
+    }
+}

+ 39 - 0
softbus-sdk/src/main/java/com/jg/softbus/discovery/enums/ExchangeMedium.java

@@ -0,0 +1,39 @@
+package com.jg.softbus.discovery.enums;
+
+import java.util.Arrays;
+import java.util.Optional;
+
+/**
+ * Enumerates media, such as Bluetooth, Wi-Fi, and USB, used for publishing services.
+ * Currently, only <b>COAP</b> is supported.
+ * When <b>AUTO</b> is selected, all the supported media will be called automatically.
+ */
+public enum ExchangeMedium {
+    /** Automatic medium selection */
+    AUTO(0),
+    /** Bluetooth */
+    BLE(1),
+    /** Wi-Fi */
+    COAP(2),
+    /** USB */
+    USB(3),
+    /** HiLink */
+    COAP1(4),
+    MEDIUM_BUTT(5);
+
+    private final int value;
+
+    ExchangeMedium(int value) {
+        this.value = value;
+    }
+
+    public int valueOf() {
+        return value;
+    }
+
+    public static ExchangeMedium getForValue(int value) {
+        Optional<ExchangeMedium> rs =
+                Arrays.stream(ExchangeMedium.values()).filter(e -> e.value == value).findAny();
+        return rs.orElse(null);
+    }
+}

+ 32 - 0
softbus-sdk/src/main/java/com/jg/softbus/discovery/enums/PublishFailReason.java

@@ -0,0 +1,32 @@
+package com.jg.softbus.discovery.enums;
+
+import java.util.Arrays;
+import java.util.Optional;
+
+public enum PublishFailReason {
+    /* Unsupported medium */
+    PUBLISH_FAIL_REASON_NOT_SUPPORT_MEDIUM(1),
+    /* internal error */
+    PUBLISH_FAIL_REASON_INTERNAL(2),
+    /* Unknown reason */
+    PUBLISH_FAIL_REASON_UNKNOWN(0xFF);
+
+    private final int value;
+    PublishFailReason(int value) {
+        this.value = value;
+    }
+
+    public int valueOf(){
+        return this.value;
+    }
+
+    /**
+     * 基于value获取值
+     * @param value
+     * @return
+     */
+    public static PublishFailReason getForValue(int value){
+        Optional<PublishFailReason> rs = Arrays.stream(PublishFailReason.values()).filter(v -> v.value == value).findAny();
+        return rs.orElse(PUBLISH_FAIL_REASON_UNKNOWN);
+    }
+}

+ 32 - 0
softbus-sdk/src/main/java/com/jg/softbus/discovery/enums/PublishResult.java

@@ -0,0 +1,32 @@
+package com.jg.softbus.discovery.enums;
+
+import java.util.Arrays;
+import java.util.Optional;
+
+public enum PublishResult {
+    /**< Publish success */
+    PUBLISH_LNN_SUCCESS(0),
+    /**< Unsupported medium */
+    PUBLISH_LNN_NOT_SUPPORT_MEDIUM(1),
+    /**< Internal error */
+    PUBLISH_LNN_INTERNAL(2),
+    /**< Unknown reason */
+    PUBLISH_LNN_UNKNOWN(0xFF);
+
+    private final int value;
+    PublishResult(int value){
+        this.value = value;
+    }
+
+    public int valueOf() {
+        return value;
+    }
+
+    public static PublishResult getForValue(int value){
+        Optional<PublishResult> rs =
+                Arrays.stream(PublishResult.values())
+                .filter(v -> v.value == value)
+                .findFirst();
+        return rs.orElse(PUBLISH_LNN_UNKNOWN);
+    }
+}

+ 30 - 0
softbus-sdk/src/main/java/com/jg/softbus/discovery/enums/RefreshResult.java

@@ -0,0 +1,30 @@
+package com.jg.softbus.discovery.enums;
+
+import java.util.Arrays;
+import java.util.Optional;
+
+public enum RefreshResult {
+    /**< Refresh success */
+    REFRESH_LNN_SUCCESS(0),
+    /**< Unsupported medium */
+    REFRESH_LNN_NOT_SUPPORT_MEDIUM(1),
+    /**< Internal error */
+    REFRESH_LNN_INTERNAL(2),
+    /**< Unknown error */
+    REFRESH_LNN_UNKNOWN(0xFF);
+
+    private final int value;
+
+    RefreshResult(int value) {
+        this.value = value;
+    }
+
+    public int valueOf() {
+        return value;
+    }
+
+    public static RefreshResult getForValue(int value) {
+        Optional<RefreshResult> rs = Arrays.stream(RefreshResult.values()).filter(r->r.value == value).findFirst();
+        return rs.orElse(REFRESH_LNN_UNKNOWN);
+    }
+}

+ 27 - 0
softbus-sdk/src/main/java/com/jg/softbus/discovery/enums/UpdateState.java

@@ -0,0 +1,27 @@
+package com.jg.softbus.discovery.enums;
+
+/**
+ * 设备更新状态
+ */
+public enum UpdateState {
+    /**
+     * 空
+     */
+    DFINDER_UPDATE_STATE_NULL,
+    /**
+     * 广播查找
+     */
+    DFINDER_UPDATE_STATE_BROADCAST,
+    /**
+     * 单播查找
+     */
+    DFINDER_UPDATE_STATE_UNICAST,
+    /**
+     * 全部查找
+     */
+    DFINDER_UPDATE_STATE_ALL,
+    /**
+     * 结束查找
+     */
+    DFINDER_UPDATE_STATE_END,
+}

+ 64 - 0
softbus-sdk/src/main/java/com/jg/softbus/manager/SessionManager.java

@@ -0,0 +1,64 @@
+package com.jg.softbus.manager;
+
+import com.jg.softbus.model.SessionInfo;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.stream.Collectors;
+
+public class SessionManager {
+    /**
+     * 连接的session管理
+     */
+    private CopyOnWriteArrayList<SessionInfo> sessions = new CopyOnWriteArrayList<>();
+
+    /**
+     * 添加session
+     * @param info
+     */
+    public void addSession(SessionInfo info) {
+        if(!sessions.contains(info)) {
+            sessions.add(info);
+        }
+    }
+
+    /**
+     * 移除session
+     * @param sessionId
+     */
+    public void remove(Integer sessionId) {
+        Optional<SessionInfo> rs = sessions.stream().filter(session->session.getSessionId().equals(sessionId)).findAny();
+        rs.ifPresent(sessionInfo -> sessions.remove(sessionInfo));
+    }
+
+    public void remove(SessionInfo info) {
+        sessions.remove(info);
+    }
+
+    /**
+     * 获取session信息
+     * @param sessionId
+     * @return
+     */
+    public SessionInfo getSession(Integer sessionId) {
+        Optional<SessionInfo> rs = sessions.stream().filter(session->session.getSessionId().equals(sessionId)).findAny();
+        return rs.orElse(null);
+    }
+
+    /**
+     * 获取列表
+     * @return
+     */
+    public List<SessionInfo> getSessions() {
+        return new ArrayList<>(sessions);
+    }
+
+    /**
+     * 清空数据
+     */
+    public void clear(){
+        sessions.clear();
+    }
+}

+ 59 - 0
softbus-sdk/src/main/java/com/jg/softbus/model/SessionInfo.java

@@ -0,0 +1,59 @@
+package com.jg.softbus.model;
+
+import java.util.Objects;
+
+public class SessionInfo {
+    /**
+     * sessionId
+     */
+    private Integer sessionId;
+    /**
+     * sessionName
+     */
+    private String sessionName;
+
+    public SessionInfo() {
+    }
+
+    public SessionInfo(Integer sessionId, String sessionName) {
+        this.sessionId = sessionId;
+        this.sessionName = sessionName;
+    }
+
+    public Integer getSessionId() {
+        return sessionId;
+    }
+
+    public void setSessionId(Integer sessionId) {
+        this.sessionId = sessionId;
+    }
+
+    public String getSessionName() {
+        return sessionName;
+    }
+
+    public void setSessionName(String sessionName) {
+        this.sessionName = sessionName;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        SessionInfo that = (SessionInfo) o;
+        return Objects.equals(sessionId, that.sessionId) && Objects.equals(sessionName, that.sessionName);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(sessionId, sessionName);
+    }
+
+    @Override
+    public String toString() {
+        return "SessionInfo{" +
+                "sessionId=" + sessionId +
+                ", sessionName='" + sessionName + '\'' +
+                '}';
+    }
+}

+ 254 - 0
softbus-sdk/src/main/java/com/jg/softbus/naservice/LNNService.java

@@ -0,0 +1,254 @@
+package com.jg.softbus.naservice;
+
+import com.jg.softbus.common.SoftbusErrCode;
+import com.jg.softbus.network.callback.ILNNCallback;
+import com.jg.softbus.network.callback.INodeStateCb;
+import com.jg.softbus.network.node.*;
+import com.jg.softbus.network.protocol.ConnectionAddr;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * 组网逻辑
+ */
+public class LNNService implements ILNNCallback, INodeStateCb, Closeable {
+    /**
+     * 是否出于停止状态,处于停止状态将不再接收外部调用处理
+     */
+    private AtomicBoolean isStop = new AtomicBoolean(false);
+    /**
+     * 包名
+     */
+    private final String pkgName;
+    /**
+     * 获取包名
+     * @return
+     */
+    public String getPkgName() {
+        return pkgName;
+    }
+
+    /**
+     * 组网状态
+     */
+    private ConcurrentHashMap<ConnectionAddr, LNNResult> addrLNNResult = new ConcurrentHashMap<>(8);
+
+    public void addLNNResult(ConnectionAddr addr, LNNResult result) {
+        addrLNNResult.put(addr, result);
+    }
+
+    public LNNResult getLNNResult(ConnectionAddr addr) {
+        return addrLNNResult.get(addr);
+    }
+
+    public ConnectionAddr tryFindConnectAddr(String networkId) {
+        for(Map.Entry<ConnectionAddr, LNNResult> entry: addrLNNResult.entrySet()) {
+            ConnectionAddr addr = entry.getKey();
+            LNNResult rs = entry.getValue();
+            if(rs.getNetworkId().equals(networkId)) {
+                return addr;
+            }
+        }
+        return null;
+    }
+
+    public boolean isStop() {
+        return isStop.get();
+    }
+
+    public LNNService(String pkgName) {
+        this.pkgName = pkgName;
+    }
+
+    static {
+        System.loadLibrary("SoftbusLNN");
+    }
+
+    /**
+     * 发起组网
+     * @param targetAddr
+     * @throws Exception
+     */
+    public void joinLNN(ConnectionAddr targetAddr) throws Exception {
+        joinLNN(targetAddr, this);
+    }
+
+    /**
+     * 发起组网
+     * @param targetAddr
+     * @param callback
+     * @throws Exception
+     */
+    public void joinLNN(ConnectionAddr targetAddr, ILNNCallback callback) throws Exception {
+        if(isStop.get()) {
+            throw new Exception("LNN service is stop");
+        }
+        int ret = joinLNN(pkgName, targetAddr, this);
+        if(ret != 0){
+            throw new Exception(SoftbusErrCode.getByErrCode(ret).getErrMsg());
+        }
+    }
+    /**
+     * 发起组网
+     * @param targetAddr see {@link ConnectionAddr}
+     * @param callback
+     * @return
+     */
+    private native int joinLNN(String pkgName, ConnectionAddr targetAddr, ILNNCallback callback);
+
+    /**
+     * 离开网络
+     * @param networkId
+     * @throws Exception
+     */
+    public void leaveLNN(String networkId) throws Exception {
+        leaveLNN(networkId, this);
+    }
+
+    /**
+     * 离开网络
+     * @param networkId
+     * @param callback
+     * @throws Exception
+     */
+    public void leaveLNN(String networkId, ILNNCallback callback) throws Exception {
+        if(isStop.get()) {
+            throw new Exception("LNN service is stop");
+        }
+        int ret = leaveLNN(pkgName, networkId, callback);
+        if(ret != 0){
+            throw new Exception(SoftbusErrCode.getByErrCode(ret).getErrMsg());
+        }
+    }
+    /**
+     * 离开网络
+     * @param networkId
+     * @return
+     */
+    private native int leaveLNN(String packageName, String networkId, ILNNCallback callback);
+
+    public void registerNodeStateListener() throws Exception {
+        registerNodeStateListener(this);
+    }
+    public void registerNodeStateListener(INodeStateCb callback) throws Exception {
+        if(isStop.get()) {
+            throw new Exception("LNN service is stop");
+        }
+        int ret = regNodeDeviceStateCb(pkgName, callback);
+        if(ret != 0){
+            throw new Exception(SoftbusErrCode.getByErrCode(ret).getErrMsg());
+        }
+    }
+    /**
+     * 查询组网状态
+     * @param packageName
+     * @return
+     */
+    private native int regNodeDeviceStateCb(String packageName, INodeStateCb callback);
+
+    /**
+     * 注销监听事件
+     * @throws Exception
+     */
+    public void unRegisterNodeStateListener() throws Exception {
+        unRegisterNodeStateListener(this);
+    }
+
+    /**
+     * 注销监听事件
+     * @param callback
+     * @throws Exception
+     */
+    public void unRegisterNodeStateListener(INodeStateCb callback) throws Exception {
+        if(isStop.get()) {
+            throw new Exception("LNN service is stop");
+        }
+        int ret = unRegNodeDeviceStateCb(callback);
+        if(ret != 0){
+            throw new Exception(SoftbusErrCode.getByErrCode(ret).getErrMsg());
+        }
+    }
+    /**
+     * 注销节点状态事件回调
+     * @param callback
+     * @return
+     */
+    private native int unRegNodeDeviceStateCb(INodeStateCb callback);
+
+    @Override
+    public void onJoinLNNResult(ConnectionAddr addr, String networkId, int retCode) {
+        //参与的网络
+        if(retCode == 0){
+            //组网成功
+            System.out.println("组网成功,组网的网络id:"+networkId);
+        } else {
+            System.out.println("组网失败,失败原因:"+SoftbusErrCode.getByErrCode(retCode).getErrMsg());
+        }
+        addLNNResult(addr, new LNNResult(networkId, retCode));
+    }
+
+    @Override
+    public void onLeaveLNNResult(String networkId, int retCode) {
+        if(retCode == 0) {
+            System.out.println("退出网络:"+networkId+"成功");
+        } else {
+            System.out.println("退出网络:"+networkId+"失败,失败代码:"+retCode);
+        }
+        ConnectionAddr addr = tryFindConnectAddr(networkId);
+        if(addr != null){
+            addrLNNResult.remove(addr);
+        }
+    }
+
+    @Override
+    public void onNodeOnline(NodeBasicInfo info) {
+        System.out.println(String.format("设备%s连接上网络%s", info.getDeviceName(), info.getNetworkId()));
+    }
+
+    @Override
+    public void onNodeOffline(NodeBasicInfo info) {
+        System.out.println(String.format("设备%s离开网络%s", info.getDeviceName(), info.getNetworkId()));
+    }
+
+    @Override
+    public void onNodeBasicInfoChanged(NodeBasicInfoType type, NodeBasicInfo info) {
+        System.out.println(String.format("设备%s在网络%s上发生类型变更,当前类型%s", info.getDeviceName(), info.getNetworkId(), type.name()));
+    }
+
+    @Override
+    public void onNodeStatusChanged(NodeStatusType type, NodeStatus status) {
+        System.out.println(String.format("节点%s发生变化,当前节点状态:%s", type.name(), status.toString()));
+    }
+
+    @Override
+    public int getEvents() {
+        return EVENT_NODE_STATE_ONLINE | EVENT_NODE_STATE_OFFLINE;
+    }
+
+    @Override
+    public void close() throws IOException {
+        if(isStop.compareAndSet(false, true)) {
+            if(!addrLNNResult.isEmpty()) {
+                for(Map.Entry<ConnectionAddr, LNNResult> entry: addrLNNResult.entrySet()) {
+                    ConnectionAddr addr = entry.getKey();
+                    LNNResult rs = entry.getValue();
+                    try {
+                        leaveLNN(rs.getNetworkId());
+                    } catch (Exception e) {
+                    }
+                }
+            }
+            destroy();
+            addrLNNResult.clear();
+        }
+    }
+
+    /**
+     * 销毁对象
+     */
+    private native void destroy();
+}

+ 263 - 0
softbus-sdk/src/main/java/com/jg/softbus/naservice/PublishService.java

@@ -0,0 +1,263 @@
+/** 
+* Copyright (c) 2022-2024. jinggezhihui. All rights reserved.  
+* FileName: Discovery.java 
+* Author: marunming
+* Email: runming56@163.com
+* Date: 2023年10月26日 下午2:05:19
+* version: V1.0
+* LastModified: 2023年10月26日 下午2:05:19   
+*/ 
+
+
+package com.jg.softbus.naservice;
+
+import com.jg.softbus.common.SoftbusErrCode;
+import com.jg.softbus.discovery.PublishInfo;
+import com.jg.softbus.discovery.callback.IPublishCallback;
+import com.jg.softbus.discovery.callback.IPublishCb;
+import com.jg.softbus.discovery.enums.PublishResult;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+* 发布服务
+*
+* @Author marunming
+* @ClassName: PublishService
+* @Email runming56@163.com
+* @Date 2023年10月26日 下午2:05:19 
+*/
+public class PublishService implements IPublishCallback, IPublishCb, Closeable {
+	/**
+	 * 包名
+	 */
+	private final String pkgName;
+
+	private AtomicBoolean isStop = new AtomicBoolean(false);
+	/**
+	 * 发布id及其状态维护
+	 */
+	private ConcurrentHashMap<Integer, PublishResult> publishIdState = new ConcurrentHashMap<>(16);
+
+	public PublishService(String pkgName) {
+		this.pkgName = pkgName;
+	}
+
+	/**
+	 * 包名
+	 * @return
+	 */
+	public String getPkgName() {
+		return pkgName;
+	}
+
+	/**
+	 * 更新publishId对应的发布状态
+	 * @param publishId 发布id
+	 * @param reason 当前状态
+	 */
+	public void updateState(Integer publishId, int reason) {
+		publishIdState.put(publishId, PublishResult.getForValue(reason));
+	}
+
+	/**
+	 * 查询publishId的发布状态
+	 * @param publishId
+	 * @return -1表示未找到可能在处理中未回调告知也可能是已经被注销了;0-成功,其他为异常
+	 */
+	public int getPublishIdState(Integer publishId) {
+		if(publishIdState.containsKey(publishId)) {
+			return publishIdState.get(publishId).valueOf();
+		}
+		return -1;
+	}
+
+	static {
+		System.loadLibrary("SoftbusPublish");
+	}
+	/**
+	 * 发布服务
+	 * @param publishInfo
+	 * @return
+	 * @throws Exception
+	 */
+	@Deprecated
+	public void publishService(PublishInfo publishInfo) throws Exception {
+		publishService(publishInfo, this);
+	}
+
+	/**
+	 * 发布服务
+	 * @param publishInfo
+	 * @return
+	 * @throws Exception
+	 */
+	@Deprecated
+	public void publishService(PublishInfo publishInfo, IPublishCallback callback) throws Exception {
+		if(isStop.get()) {
+			throw new Exception("publish service is stop");
+		}
+		//提交发布请求
+		int rs = publishService(pkgName, publishInfo, callback);
+		if(rs!= 0){
+			//抛出异常
+			throw new Exception(SoftbusErrCode.getByErrCode(rs).getErrMsg());
+		}
+	}
+
+	private void stopPublishByPublishId(int publishId) {
+		try {
+			stopPublish(publishId);
+		} catch (Exception e) {
+			//不做任何处理
+		}
+		try {
+			stopPublishLNN(publishId);
+		} catch (Exception e) {
+			//不做任何处理
+		}
+	}
+
+	/**
+	 * 发布服务
+	 * @param packageName
+	 * @param info
+	 * @throws Exception
+	 *
+	 */
+	@Deprecated
+	private native int publishService(String packageName, PublishInfo info, IPublishCallback callback) throws Exception;
+
+	/**
+	 *
+	 * @param publishId
+	 * @throws Exception
+	 *
+	 */
+	@Deprecated
+	public void stopPublish(Integer publishId) throws Exception {
+		//停止发布程序
+		int res = unPublishService(pkgName, publishId);
+		publishIdState.remove(publishId);
+		if(res!= 0){
+			//抛出异常
+			throw new Exception(SoftbusErrCode.getByErrCode(res).getErrMsg());
+		}
+	}
+	/**
+	 * 注销服务
+	 * @param packageName 包名
+	 * @param publishId
+	 *
+	 */
+	@Deprecated
+	private native int unPublishService(String packageName, int publishId) throws Exception;
+	/**
+	 * 发布服务
+	 * @param publishInfo
+	 * @return
+	 */
+	public void publishLNN(PublishInfo publishInfo) throws Exception {
+		publishLNN(publishInfo, this);
+	}
+
+	/**
+	 * 发布服务
+	 * @param publishInfo
+	 * @return
+	 */
+	public void publishLNN(PublishInfo publishInfo, IPublishCb callback) throws Exception {
+		if(isStop.get()) {
+			throw new Exception("publish service is stop");
+		}
+		int rs = publishLNN(pkgName, publishInfo, callback);
+		if(rs!= 0) {
+			//抛出异常
+			throw new Exception(SoftbusErrCode.getByErrCode(rs).getErrMsg());
+		}
+	}
+
+	/**
+	 * 发布服务
+	 * @param packageName
+	 * @param info
+	 * @return
+	 * @throws Exception
+	 */
+	private native int publishLNN(String packageName, PublishInfo info, IPublishCb callback) throws Exception;
+
+	/**
+	 * 停止服务发布
+	 * @param publishId
+	 * @throws Exception
+	 */
+	public void stopPublishLNN(Integer publishId) throws Exception {
+		//停止发布程序
+		int res = stopPublishLNN(pkgName, publishId);
+		publishIdState.remove(publishId);
+		if(res!= 0){
+			//抛出异常
+			throw new Exception(SoftbusErrCode.getByErrCode(res).getErrMsg());
+		}
+	}
+
+	/**
+	 * 停止发布服务
+	 * @param packageName
+	 * @param publishId
+	 * @return
+	 * @throws Exception
+	 *
+	 */
+	private native int stopPublishLNN(String packageName, int publishId) throws Exception;
+
+	@Override
+	public void close() throws IOException {
+		if(isStop.compareAndSet(false, true)){
+			//迭代循环关闭所有发布通道
+			for(Map.Entry<Integer, PublishResult> entry : publishIdState.entrySet()) {
+				Integer publishId = entry.getKey();
+				stopPublishByPublishId(publishId);
+			}
+			destroy();
+			if(!publishIdState.isEmpty()) {
+				publishIdState.clear();
+			}
+		}
+
+	}
+	private native void destroy();
+
+	@Override
+	public void onPublishSuccess(int publishId) {
+		if(isStop.get()) {
+			return;
+		}
+		//更新发布状态
+		this.updateState(publishId, 0);
+		System.out.println("发布成功");
+	}
+
+	@Override
+	public void onPublishFail(int publishId, int reason) {
+		if(isStop.get()) {
+			return;
+		}
+		//发布失败
+		this.updateState(publishId, reason);
+		System.out.println("服务发布失败,发布id:"+publishId+",失败返回信息:");
+	}
+
+	@Override
+	public void onPublishResult(int publishId, int reason) {
+		if(isStop.get()) {
+			return;
+		}
+		this.updateState(publishId, reason);
+		System.out.println("服务发布完成,发布id:"+publishId+", 返回状态:"+reason);
+	}
+}

+ 276 - 0
softbus-sdk/src/main/java/com/jg/softbus/naservice/SessionService.java

@@ -0,0 +1,276 @@
+package com.jg.softbus.naservice;
+
+import com.jg.softbus.common.SoftbusErrCode;
+import com.jg.softbus.discovery.enums.PublishResult;
+import com.jg.softbus.manager.SessionManager;
+import com.jg.softbus.model.SessionInfo;
+import com.jg.softbus.session.*;
+import com.jg.softbus.session.callback.IFileReceiveListener;
+import com.jg.softbus.session.callback.IFileSendListener;
+import com.jg.softbus.session.callback.ISessionListener;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * session传输处理
+ */
+public class SessionService implements ISessionListener, Closeable {
+
+    private final String pkgName;
+    /**
+     * 自由sessionName
+     */
+    private final String sessionName;
+    /**
+     * 维护连接的session信息
+     */
+    private final SessionManager connSessions;
+    /**
+     * groupId
+     */
+    private final String groupId;
+
+
+    private AtomicBoolean isStop = new AtomicBoolean(false);
+
+    public boolean isStop() {
+        return isStop.get();
+    }
+
+    public SessionService(String pkgName, String sessionName) {
+        this(pkgName, sessionName, UUID.randomUUID().toString().replaceAll("-",""));
+    }
+    public SessionService(String pkgName, String sessionName, String groupId) {
+        this.pkgName = pkgName;
+        this.sessionName = sessionName;
+        this.groupId = groupId;
+        this.connSessions = new SessionManager();
+    }
+
+    static {
+        System.loadLibrary("SoftbusSession");
+    }
+
+    /**
+     * 获取session信息
+      * @return
+     */
+    public SessionManager getSessionManager(){
+        return connSessions;
+    }
+    /**
+     * 创建session服务,调用类自己维护session名称
+     * 基于包名构建session服务
+     */
+    public void createSessionServer() throws Exception {
+        createSessionServer(this);
+    }
+    /**
+     * 创建session服务,调用类自己维护session名称
+     * 基于包名构建session服务
+     */
+    public void createSessionServer(ISessionListener listener) throws Exception {
+        int rs = createSessionServer(pkgName, sessionName, listener);
+        if(rs !=0 ) {
+            throw new Exception("create session server failed!");
+        }
+    }
+
+    /**
+     * 创建会话服务
+     * @param packageName
+     * @param sessionName
+     * @return 返回sessionId
+     */
+    private native int createSessionServer(String packageName, String sessionName, ISessionListener listener);
+
+    /**
+     * 打开会话服务
+     * @param targetSessionId
+     * @param targetNetworkId
+     * @param attr
+     * @throws Exception
+     */
+    public void openSession(int targetSessionId, String targetNetworkId, SessionAttribute attr) throws Exception {
+        if (Objects.isNull(connSessions.getSession(targetSessionId))) {
+            throw new Exception("sessionId error.");
+        }
+        int rs = openSession(sessionName, connSessions.getSession(targetSessionId).getSessionName(), targetNetworkId, groupId, attr);
+        if (rs != 0 ) {
+            throw new Exception(Objects.requireNonNull(SoftbusErrCode.getByErrCode(rs)).getErrMsg());
+        }
+    }
+
+    /**
+     * 创建会话
+     * @param sessionName
+     * @param targetSessionName
+     * @param targetNetworkId
+     * @param groupId
+     * @param attr session属性字符串,具体类型参见:{@link SessionAttribute}
+     * @return
+     */
+    private native int openSession(String sessionName, String targetSessionName, String targetNetworkId, String groupId, SessionAttribute attr);
+
+    /**
+     * 发送字节数据
+     * @param sessionId
+     * @param data
+     * @param len
+     * @return
+     */
+    public native int sendBytes(int sessionId, byte[] data, int len);
+
+    /**
+     * 发送消息数据
+     * @param sessionId
+     * @param data
+     * @param len
+     * @return
+     */
+    public native int sendMessage(int sessionId, String data, int len);
+
+    /**
+     * 发送流数据
+     * @param sessionId
+     * @param data
+     * @param ext
+     * @param param
+     * @return
+     */
+    public native int sendStream(int sessionId, StreamData data, StreamData ext, StreamFrameInfo param);
+
+
+    /**
+     * 发送文件
+     * @param sessionId
+     * @param sFileList
+     * @param dFileList
+     * @param fileCnt
+     * @return
+     */
+    public native int sendFile(int sessionId, String[] sFileList, String[] dFileList, int fileCnt);
+
+    /**
+     * 设置文件发送监听器
+     * @param fileSendListener
+     * @throws Exception
+     */
+    public void setFileSendListener(IFileSendListener fileSendListener) throws Exception {
+        int rs = setFileSendListener(pkgName, sessionName, fileSendListener);
+        if(rs !=0 ) {
+            throw new Exception(Objects.requireNonNull(SoftbusErrCode.getByErrCode(rs)).getErrMsg());
+        }
+    }
+    /**
+     * 注册文件发送回调
+     * @param packageName
+     * @param sessionName
+     * @return
+     */
+    private native int setFileSendListener(String packageName, String sessionName, IFileSendListener fileSendListener);
+
+    /**
+     * 注册接收文件监听器
+     * @param fileReceiveListener 文件接收监听器
+     * @param directory 文件根目录
+     * @throws Exception
+     */
+    public void setFileReceiveListener(IFileReceiveListener fileReceiveListener, String directory) throws Exception {
+        int rs = setFileReceiveListener(pkgName, sessionName, fileReceiveListener, directory);
+        if(rs !=0 ) {
+            throw new Exception(Objects.requireNonNull(SoftbusErrCode.getByErrCode(rs)).getErrMsg());
+        }
+    }
+
+    /**
+     * 注册文件接收回调
+     * @param packageName
+     * @param sessionName
+     * @param fileReceiveListener 文件接收监听器
+     * @return
+     */
+    private native int setFileReceiveListener(String packageName, String sessionName, IFileReceiveListener fileReceiveListener, String rootDir);
+
+    /**
+     * 关闭会话
+     * @param sessionId
+     */
+    private native void closeSession(int sessionId);
+
+    /**
+     * 删除会话服务
+     * @param packageName
+     * @param sessionName
+     * @return
+     */
+    public native int removeSessionServer(String packageName, String sessionName);
+
+    @Override
+    public int onSessionOpened(int sessionId, int result) {
+        if(result == 0) {
+           String sessionName = getPeerSessionName(sessionId);
+           connSessions.addSession(new SessionInfo(sessionId, sessionName));
+        }
+        return 0;
+    }
+
+    public String getSessionName() {
+        return sessionName;
+    }
+
+    private native String getPeerSessionName(int sessionId);
+
+    @Override
+    public void onSessionClosed(int sessionId) {
+        connSessions.remove(sessionId);
+    }
+
+    @Override
+    public void onBytesReceived(int sessionId, byte[] data, int dataLen) {
+        System.out.printf("接收到来源于%s的消息,消息内容:%s%n", connSessions.getSession(sessionId).toString(), new String(data, StandardCharsets.UTF_8));
+    }
+
+    @Override
+    public void onMessageReceived(int sessionId, String data, int dataLen) {
+        System.out.printf("接收到来源于%s的消息,消息内容:%s%n", connSessions.getSession(sessionId).toString(), data);
+    }
+
+    @Override
+    public void onStreamReceived(int sessionId, StreamData data, StreamData ext, StreamFrameInfo param) {
+        //TODO 接收数据流处理
+    }
+
+    @Override
+    public void onQosEvent(int sessionId, int eventId, int tvCount, QosTv[] tvList) {
+        System.out.printf("出发qos事件:sessionId: %d, eventId: %d, tvCount: %d, tvList: %s", sessionId, eventId, tvCount, Arrays.toString(tvList));
+    }
+
+    @Override
+    public void close() throws IOException {
+        if(isStop.compareAndSet(false, true)) {
+            //销毁session信息
+            if(connSessions.getSessions()!=null && !connSessions.getSessions().isEmpty()) {
+                System.out.println("关闭session连接");
+                connSessions.getSessions().forEach(session -> closeSession(session.getSessionId()));
+            }
+            System.out.println("移除session服务");
+            //移除session服务
+            removeSessionServer(pkgName, sessionName);
+            destroy();
+            connSessions.clear();
+        } else {
+            System.out.println("状态关闭中....");
+        }
+    }
+
+    /**
+     * 销毁对象
+     */
+    private native void destroy();
+}

+ 315 - 0
softbus-sdk/src/main/java/com/jg/softbus/naservice/SubscribeService.java

@@ -0,0 +1,315 @@
+package com.jg.softbus.naservice;
+
+import com.jg.softbus.common.SoftbusErrCode;
+import com.jg.softbus.device.DeviceInfo;
+import com.jg.softbus.discovery.SubscribeInfo;
+import com.jg.softbus.discovery.callback.IDiscoveryCallback;
+import com.jg.softbus.discovery.callback.IRefreshCallback;
+import com.jg.softbus.discovery.enums.RefreshResult;
+import com.jg.softbus.network.node.NodeBasicInfo;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.stream.Collectors;
+
+/**
+ * 订阅服务
+ */
+public class SubscribeService implements IDiscoveryCallback, IRefreshCallback, Closeable {
+    /**
+     * 包名
+     */
+    private final String pkgName;
+    /**
+     * 是否出于停止状态,处于停止状态将不再接收外部调用处理
+     */
+    private AtomicBoolean isStop = new AtomicBoolean(false);
+    /**
+     * 发现的设备列表
+     */
+    private CopyOnWriteArrayList<DeviceInfo> devices = new CopyOnWriteArrayList<>();
+    /**
+     * 订阅状态
+     */
+    private ConcurrentHashMap<Integer, RefreshResult> refreshIdState = new ConcurrentHashMap<>(8);
+
+    /**
+     * 获取包名
+     * @return
+     */
+    public String getPkgName() {
+        return pkgName;
+    }
+
+    /**
+     * 更新订阅id的状态
+     * @param refreshId
+     * @param reason
+     */
+    public void updateState(Integer refreshId, int reason) {
+        refreshIdState.put(refreshId, RefreshResult.getForValue(reason));
+    }
+
+    /**
+     * 获取订阅id的状态
+     * @param refreshId
+     * @return -1-未找到可能在进行中可能已经被移除了;0-成功状态;其他为异常
+     */
+    public int getRefreshIdState(Integer refreshId) {
+        if(refreshIdState.containsKey(refreshId)) {
+            return  refreshIdState.get(refreshId).valueOf();
+        } else {
+            return -1;
+        }
+    }
+
+    public SubscribeService(String pkgName) {
+        this.pkgName = pkgName;
+    }
+    static {
+        System.loadLibrary("SoftbusSubscribe");
+    }
+
+    /**
+     * 发现服务请求
+     * @param subscribeInfo
+     * @return
+     * @throws Exception
+     * @deprecated please use {@link #refreshLNN(SubscribeInfo)}
+     */
+    @Deprecated
+    public void discoveryStart(SubscribeInfo subscribeInfo) throws Exception {
+        discoveryStart(subscribeInfo, this);
+    }
+
+    /**
+     * 发现服务请求
+     * @param subscribeInfo
+     * @param callback
+     * @return
+     * @throws Exception
+     * @deprecated please use {@link #refreshLNN(SubscribeInfo, IRefreshCallback)}
+     */
+    @Deprecated
+    public void discoveryStart(SubscribeInfo subscribeInfo, IDiscoveryCallback callback) throws Exception {
+        if(isStop.get()) {
+            throw new Exception("subscribe service has stop");
+        }
+        int ret = discoveryStart(pkgName, subscribeInfo, callback);
+        if (ret != 0) {
+            throw new Exception(SoftbusErrCode.getByErrCode(ret).getErrMsg());
+        }
+    }
+
+    /**
+     *  发现服务请求
+     * @param packageName
+     * @param subscribeInfo
+     * @param callback
+     * @return
+     * @throws Exception
+     * @deprecated please use {@link #refreshLNN(String, SubscribeInfo, IRefreshCallback)}
+     */
+    @Deprecated
+    private native int discoveryStart(String packageName, SubscribeInfo subscribeInfo, IDiscoveryCallback callback) throws Exception;
+    /**
+     * 发现设备
+     * @param subscribeInfo
+     * @return
+     */
+    public void refreshLNN(SubscribeInfo subscribeInfo) throws Exception {
+        refreshLNN(subscribeInfo, this);
+    }
+
+    /**
+     * 发现设备
+     * @param subscribeInfo
+     * @return
+     */
+    public void refreshLNN(SubscribeInfo subscribeInfo, IRefreshCallback callback) throws Exception {
+        if(isStop.get()) {
+            throw new Exception("subscribe service has stop");
+        }
+        int res = refreshLNN(pkgName, subscribeInfo, callback);
+        if (res != 0) {
+            throw new Exception(SoftbusErrCode.getByErrCode(res).getErrMsg());
+        }
+    }
+
+    /**
+     * 发现服务请求
+     * @param packageName 应用包名
+     * @param subscribeInfo json字符串,参见{@link SubscribeInfo}
+     * @param callback 回调对象
+     * @return
+     */
+    private native int refreshLNN(String packageName, SubscribeInfo subscribeInfo, IRefreshCallback callback) throws Exception;
+
+    /**
+     * 停止订阅
+     * @param refreshId 同SubscribeInfo中的subcribeId
+     * @throws Exception
+     * @deprecated please use {@link #stopRefreshLNN(int)}
+     */
+    public void stopDiscovery(int refreshId) throws Exception {
+        int res = stopDiscovery(pkgName, refreshId);
+        refreshIdState.remove(refreshId);
+        if (res != 0) {
+            throw new Exception(SoftbusErrCode.getByErrCode(res).getErrMsg());
+        }
+    }
+    /**
+     * 停止发现服务
+     * @param packageName
+     * @param refreshId 同SubscribeInfo中的subcribeId
+     * @throws Exception
+     * @return
+     * @deprecated please use {@link #stopRefreshLNN(String, int)}
+     */
+    @Deprecated
+    private native int stopDiscovery(String packageName, int refreshId) throws Exception;
+
+    /**
+     * 停止发现服务
+     * @param refreshId 同SubscribeInfo中的subcribeId
+     * @throws Exception
+     */
+    public void stopRefreshLNN(int refreshId) throws Exception {
+        int res = stopRefreshLNN(pkgName, refreshId);
+        refreshIdState.remove(refreshId);
+        if (res != 0) {
+            throw new Exception(SoftbusErrCode.getByErrCode(res).getErrMsg());
+        }
+    }
+    /**
+     * 停止发现服务
+     * @param packageName
+     * @param refreshId 同SubscribeInfo中的subcribeId
+     * @return
+     */
+    private native int stopRefreshLNN(String packageName, int refreshId) throws Exception;
+
+    @Override
+    public void close() throws IOException {
+        if(isStop.compareAndSet(false, true)) {
+            //停止状态
+            for (Map.Entry<Integer, RefreshResult> entry : refreshIdState.entrySet()) {
+                stopSubscribeByRefreshId(entry.getKey());
+            }
+            destroy();
+            if (!refreshIdState.isEmpty()) {
+                refreshIdState.clear();
+            }
+            devices.clear();
+        }
+    }
+
+    /**
+     * 销毁指定连接
+     * @param refreshId
+     */
+    private void stopSubscribeByRefreshId(int refreshId) {
+        try {
+            stopDiscovery(refreshId);
+        } catch (Exception e) {
+            //不做任何处理
+        }
+        try {
+            stopRefreshLNN(refreshId);
+        } catch (Exception e) {
+            //不做任何处理
+        }
+    }
+
+    /**
+     * 发现在线网络节点信息
+     * @return
+     */
+    public List<NodeBasicInfo> getOnlineDeviceNodeInfo() throws Exception {
+        if(isStop.get()) {
+            throw new Exception("subscribe service has stop");
+        }
+        NodeBasicInfo[] deviceNodes = findDeviceNodes(pkgName);
+        try {
+            if (deviceNodes != null && deviceNodes.length > 0) {
+                return Arrays.stream(deviceNodes).collect(Collectors.toList());
+            }
+            return Collections.emptyList();
+        } finally {
+            releaseDeviceNodes(deviceNodes);
+        }
+    }
+
+    /**
+     * 查找在线网络节点
+     * @param pkgName
+     * @return
+     */
+    private native NodeBasicInfo[] findDeviceNodes(String pkgName);
+
+    /**
+     *  释放设备节点数据
+     * @param nodes
+     */
+    private native void releaseDeviceNodes(NodeBasicInfo[] nodes);
+
+    /**
+     * 销毁对象
+     */
+    private native void destroy();
+
+    @Override
+    public void onDeviceFound(DeviceInfo info) {
+        if(isStop.get()) {
+            //服务停止拒绝接受其他更新处理
+            return;
+        }
+        //自定义存储设备信息
+        if(!devices.contains(info)){
+            devices.add(info);
+        } else {
+            //使用最新的状态信息
+            devices.remove(info);
+            devices.add(info);
+        }
+    }
+
+    @Override
+    public void onDiscoverResult(int refreshId, int reason) {
+        if(isStop.get()) {
+            //服务停止拒绝接受其他更新处理
+            return;
+        }
+        updateState(refreshId, reason);
+        System.out.println("服务订阅结果通知,订阅id:"+refreshId+",返回状态码:"+reason);
+    }
+
+    @Override
+    public void onDiscoverFailed(int subscribeId, int reason) {
+        if(isStop.get()) {
+            //服务停止拒绝接受其他更新处理
+            return;
+        }
+        updateState(subscribeId, reason);
+        //更新发布状态
+        System.out.println("服务订阅失败,订阅id:"+subscribeId+",失败返回状态码:"+reason);
+    }
+
+    @Override
+    public void onDiscoverySuccess(int subscribeId) {
+        if(isStop.get()) {
+            //服务停止拒绝接受其他更新处理
+            return;
+        }
+        //更新发布状态
+        updateState(subscribeId, 0);
+        System.out.println("订阅成功");
+    }
+}

+ 4 - 0
softbus-sdk/src/main/java/com/jg/softbus/naservice/package-info.java

@@ -0,0 +1,4 @@
+/**
+ * 本地服务类包
+ */
+package com.jg.softbus.naservice;

+ 23 - 0
softbus-sdk/src/main/java/com/jg/softbus/network/callback/ILNNCallback.java

@@ -0,0 +1,23 @@
+package com.jg.softbus.network.callback;
+
+import com.jg.softbus.network.protocol.ConnectionAddr;
+
+/**
+ *  网络连接回调接口
+ */
+public interface ILNNCallback {
+    /**
+     * 加入网络回调返回
+     * @param addr
+     * @param networkId
+     * @param retCode
+     */
+    void onJoinLNNResult(ConnectionAddr addr, String networkId, int retCode);
+
+    /**
+     * 离开网络回调
+     * @param networkId
+     * @param retCode
+     */
+    void onLeaveLNNResult(String networkId, int retCode);
+}

+ 55 - 0
softbus-sdk/src/main/java/com/jg/softbus/network/callback/INodeStateCb.java

@@ -0,0 +1,55 @@
+package com.jg.softbus.network.callback;
+
+import com.jg.softbus.network.node.NodeBasicInfo;
+import com.jg.softbus.network.node.NodeBasicInfoType;
+import com.jg.softbus.network.node.NodeStatus;
+import com.jg.softbus.network.node.NodeStatusType;
+
+/**
+ * 网络节点变化监听接口
+ */
+public interface INodeStateCb {
+    // 事件掩码
+    static final int EVENT_NODE_STATE_ONLINE = 0x1;
+    static final int EVENT_NODE_STATE_OFFLINE = 0x02;
+    static final int EVENT_NODE_STATE_INFO_CHANGED = 0x04;
+    /**
+     * 3.2以上版本启用
+     * @since 3.2
+     */
+    static final int EVENT_NODE_STATUS_CHANGED = 0x08;
+    /**
+     * EVENT_NODE_STATE_MASK 3.2以后为0xF
+     */
+    static final int EVENT_NODE_STATE_MASK = 0x07;
+
+    default int getEvents() {
+        return EVENT_NODE_STATE_MASK;
+    }
+
+    /**
+     * 节点上线事件回调
+     * @param info
+     */
+    void onNodeOnline(NodeBasicInfo info);
+
+    /**
+     * 节点下线事件回调
+     * @param info
+     */
+    void onNodeOffline(NodeBasicInfo info);
+
+    /**
+     * 节点信息变化事件回调
+     * @param type
+     * @param info
+     */
+    void onNodeBasicInfoChanged(NodeBasicInfoType type, NodeBasicInfo info);
+
+    /**
+     * 设备运行状态变化事件回调
+     * @param type
+     * @since 3.2
+     */
+    void onNodeStatusChanged(NodeStatusType type, NodeStatus status);
+}

+ 55 - 0
softbus-sdk/src/main/java/com/jg/softbus/network/node/LNNResult.java

@@ -0,0 +1,55 @@
+package com.jg.softbus.network.node;
+
+import java.util.Objects;
+
+/**
+ * 组网结果类型
+ */
+public class LNNResult {
+    /**
+     * 网络id,仅当state=0时networkId有效
+     */
+    private String networkId;
+    /**
+     * 组装状态,0-为组网成功;其他为失败
+     */
+    private int state;
+
+    public LNNResult() {
+
+    }
+
+    public LNNResult(String networkId, int state) {
+        this.networkId = networkId;
+        this.state = state;
+    }
+
+    public String getNetworkId() {
+        return networkId;
+    }
+
+    public void setNetworkId(String networkId) {
+        this.networkId = networkId;
+    }
+
+    public int getState() {
+        return state;
+    }
+
+    public void setState(int state) {
+        this.state = state;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        LNNResult lnnResult = (LNNResult) o;
+        return Objects.equals(networkId, lnnResult.networkId) && Objects.equals(state, lnnResult.state);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(networkId, state);
+    }
+}

+ 70 - 0
softbus-sdk/src/main/java/com/jg/softbus/network/node/NodeBasicInfo.java

@@ -0,0 +1,70 @@
+package com.jg.softbus.network.node;
+
+import javax.xml.soap.Node;
+import java.util.Objects;
+
+/**
+ * 设备所在网络节点的基础信息
+ */
+public class NodeBasicInfo {
+    /**< Device network id */
+    private String networkId;
+    /**< Device name */
+    private String deviceName;
+    /**< Device type id */
+    private Short deviceTypeId;
+
+    public NodeBasicInfo(){
+
+    }
+    public NodeBasicInfo(String networkId, String deviceName, Short deviceTypeId) {
+        this.networkId = networkId;
+        this.deviceName = deviceName;
+        this.deviceTypeId = deviceTypeId;
+    }
+    public String getNetworkId() {
+        return networkId;
+    }
+
+    public void setNetworkId(String networkId) {
+        this.networkId = networkId;
+    }
+
+    public String getDeviceName() {
+        return deviceName;
+    }
+
+    public void setDeviceName(String deviceName) {
+        this.deviceName = deviceName;
+    }
+
+    public Short getDeviceTypeId() {
+        return deviceTypeId;
+    }
+
+    public void setDeviceTypeId(Short deviceTypeId) {
+        this.deviceTypeId = deviceTypeId;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        NodeBasicInfo that = (NodeBasicInfo) o;
+        return Objects.equals(networkId, that.networkId) && Objects.equals(deviceName, that.deviceName) && Objects.equals(deviceTypeId, that.deviceTypeId);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(networkId, deviceName, deviceTypeId);
+    }
+
+    @Override
+    public String toString() {
+        return "NodeBasicInfo{" +
+                "networkId='" + networkId + '\'' +
+                ", deviceName='" + deviceName + '\'' +
+                ", deviceTypeId=" + deviceTypeId +
+                '}';
+    }
+}

+ 31 - 0
softbus-sdk/src/main/java/com/jg/softbus/network/node/NodeBasicInfoType.java

@@ -0,0 +1,31 @@
+package com.jg.softbus.network.node;
+
+/**
+ * 网络节点基础类型
+ */
+public enum NodeBasicInfoType {
+    /**< Network ID change */
+    TYPE_NETWORK_ID(0),
+    /**< Device name change */
+    TYPE_DEVICE_NAME(1),
+    /**< Device network info change */
+    TYPE_NETWORK_INFO(2);
+
+    private final Integer value;
+    NodeBasicInfoType(Integer value){
+        this.value = value;
+    }
+
+    public Integer valueOf(){
+        return this.value;
+    }
+
+    public static NodeBasicInfoType getForValue(int value){
+        switch (value){
+            case 0: return TYPE_NETWORK_ID;
+            case 1: return TYPE_DEVICE_NAME;
+            case 2: return TYPE_NETWORK_INFO;
+            default: return null;
+        }
+    }
+}

+ 86 - 0
softbus-sdk/src/main/java/com/jg/softbus/network/node/NodeStatus.java

@@ -0,0 +1,86 @@
+package com.jg.softbus.network.node;
+
+import java.util.Arrays;
+import java.util.Objects;
+
+/**
+ * Defines the running status about a device.
+ */
+public class NodeStatus {
+    /**< The basic info of device */
+    private NodeBasicInfo basicInfo;
+    /**< The auth state of device */
+    private Short authStatus;
+    /**< The data base state of device */
+    private Short dataBaseStatus;
+    /**< The mesh type of device */
+    private Short meshType;
+    /**< The reserved data of device */
+    private Short[] reserved;
+
+    public NodeBasicInfo getBasicInfo() {
+        return basicInfo;
+    }
+
+    public void setBasicInfo(NodeBasicInfo basicInfo) {
+        this.basicInfo = basicInfo;
+    }
+
+    public Short getAuthStatus() {
+        return authStatus;
+    }
+
+    public void setAuthStatus(Short authStatus) {
+        this.authStatus = authStatus;
+    }
+
+    public Short getDataBaseStatus() {
+        return dataBaseStatus;
+    }
+
+    public void setDataBaseStatus(Short dataBaseStatus) {
+        this.dataBaseStatus = dataBaseStatus;
+    }
+
+    public Short getMeshType() {
+        return meshType;
+    }
+
+    public void setMeshType(Short meshType) {
+        this.meshType = meshType;
+    }
+
+    public Short[] getReserved() {
+        return reserved;
+    }
+
+    public void setReserved(Short[] reserved) {
+        this.reserved = reserved;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        NodeStatus that = (NodeStatus) o;
+        return Objects.equals(basicInfo, that.basicInfo) && Objects.equals(authStatus, that.authStatus) && Objects.equals(dataBaseStatus, that.dataBaseStatus) && Objects.equals(meshType, that.meshType) && Arrays.equals(reserved, that.reserved);
+    }
+
+    @Override
+    public int hashCode() {
+        int result = Objects.hash(basicInfo, authStatus, dataBaseStatus, meshType);
+        result = 31 * result + Arrays.hashCode(reserved);
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        return "NodeStatus{" +
+                "basicInfo=" + basicInfo.toString() +
+                ", authStatus=" + authStatus +
+                ", dataBaseStatus=" + dataBaseStatus +
+                ", meshType=" + meshType +
+                ", reserved=" + Arrays.toString(reserved) +
+                '}';
+    }
+}

+ 40 - 0
softbus-sdk/src/main/java/com/jg/softbus/network/node/NodeStatusType.java

@@ -0,0 +1,40 @@
+package com.jg.softbus.network.node;
+
+/**
+ * Enumerates device information change types. For details, see {@link INodeStateCb.onNodeStatusChanged}.
+ */
+public enum NodeStatusType {
+    /**< Certify status change */
+    TYPE_AUTH_STATUS(2),
+    /**< Database  change */
+    TYPE_DATABASE_STATUS(3),
+    /**< Lnn mesh typechange */
+    TYPE_MESH_TYPE(4),
+    /**< Max num */
+    TYPE_STATUS_MAX(5);
+
+    private final Integer value;
+
+    NodeStatusType(Integer value){
+        this.value = value;
+    }
+
+    public Integer valueOf(){
+        return this.value;
+    }
+
+    /**
+     * 根据值获取类型
+     * @param value
+     * @return
+     */
+    public static NodeStatusType getForValue(int value){
+        switch (value) {
+            case 2: return TYPE_AUTH_STATUS;
+            case 3: return TYPE_DATABASE_STATUS;
+            case 4: return TYPE_MESH_TYPE;
+            case 5: return TYPE_STATUS_MAX;
+            default: return null;
+        }
+    }
+}

+ 59 - 0
softbus-sdk/src/main/java/com/jg/softbus/network/protocol/BleAddr.java

@@ -0,0 +1,59 @@
+package com.jg.softbus.network.protocol;
+
+import java.util.Objects;
+
+/**< BLE address */
+public class BleAddr {
+    /**< BLE protocol */
+    private BleProtocolType protocol;
+    /**< BLE MAC address in string format */
+    private String bleMac;
+    /**< udid hash value */
+    private byte[] udidHash;
+    private int psm;
+
+    public BleProtocolType getProtocol() {
+        return protocol;
+    }
+
+    public void setProtocol(BleProtocolType protocol) {
+        this.protocol = protocol;
+    }
+
+    public String getBleMac() {
+        return bleMac;
+    }
+
+    public void setBleMac(String bleMac) {
+        this.bleMac = bleMac;
+    }
+
+    public byte[] getUdidHash() {
+        return udidHash;
+    }
+
+    public void setUdidHash(byte[] udidHash) {
+        this.udidHash = udidHash;
+    }
+
+    public int getPsm() {
+        return psm;
+    }
+
+    public void setPsm(int psm) {
+        this.psm = psm;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        BleAddr bleAddr = (BleAddr) o;
+        return protocol == bleAddr.protocol && Objects.equals(bleMac, bleAddr.bleMac) && Objects.equals(udidHash, bleAddr.udidHash) && Objects.equals(psm, bleAddr.psm);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(protocol, bleMac, udidHash, psm);
+    }
+}

+ 29 - 0
softbus-sdk/src/main/java/com/jg/softbus/network/protocol/BleProtocolType.java

@@ -0,0 +1,29 @@
+package com.jg.softbus.network.protocol;
+
+import java.util.Arrays;
+import java.util.Optional;
+
+/**
+ * Enumerates {@link BleProtocolType} types of ble connection type
+ */
+public enum BleProtocolType {
+    BLE_PROTOCOL_ANY(-1),
+    BLE_GATT(0),
+    BLE_COC(1),
+    BLE_PROTOCOL_MAX(2);
+
+    private final int value;
+
+    BleProtocolType(int value) {
+        this.value = value;
+    }
+
+    public int valueOf(){
+        return this.value;
+    }
+
+    public static BleProtocolType getForValue(int value) {
+       Optional<BleProtocolType> rs = Arrays.stream(BleProtocolType.values()).filter(item->item.valueOf()==value).findAny();
+        return rs.orElse(null);
+    }
+}

+ 39 - 0
softbus-sdk/src/main/java/com/jg/softbus/network/protocol/BrAddr.java

@@ -0,0 +1,39 @@
+package com.jg.softbus.network.protocol;
+
+import java.util.Objects;
+
+/**
+ * 桥接网络信息
+ */
+public class BrAddr {
+    /**< BR MAC address in string format */
+    private String brMac;
+
+    public BrAddr(){
+
+    }
+    public BrAddr(String brMac) {
+        this.brMac = brMac;
+    }
+
+    public String getBrMac() {
+        return brMac;
+    }
+
+    public void setBrMac(String brMac) {
+        this.brMac = brMac;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        BrAddr brAddr = (BrAddr) o;
+        return Objects.equals(brMac, brAddr.brMac);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(brMac);
+    }
+}

+ 52 - 0
softbus-sdk/src/main/java/com/jg/softbus/network/protocol/ConnectionAddr.java

@@ -0,0 +1,52 @@
+package com.jg.softbus.network.protocol;
+
+import java.util.Objects;
+
+/**
+ * Defines the address of a device that is added to a LNN.
+ */
+public class ConnectionAddr {
+    /**< Address type. This field is used to explain the <b>info</b> field. */
+    private ConnectionAddrType type;
+    /**< Connection address information */
+    private ConnectionAddrInfo info;
+
+    private String peerUid;
+
+    public ConnectionAddrType getType() {
+        return type;
+    }
+
+    public void setType(ConnectionAddrType type) {
+        this.type = type;
+    }
+
+    public ConnectionAddrInfo getInfo() {
+        return info;
+    }
+
+    public void setInfo(ConnectionAddrInfo info) {
+        this.info = info;
+    }
+
+    public String getPeerUid() {
+        return peerUid;
+    }
+
+    public void setPeerUid(String peerUid) {
+        this.peerUid = peerUid;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        ConnectionAddr that = (ConnectionAddr) o;
+        return type == that.type && Objects.equals(info, that.info) && Objects.equals(peerUid, that.peerUid);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(type, info, peerUid);
+    }
+}

+ 66 - 0
softbus-sdk/src/main/java/com/jg/softbus/network/protocol/ConnectionAddrInfo.java

@@ -0,0 +1,66 @@
+package com.jg.softbus.network.protocol;
+
+import java.util.Objects;
+
+/**
+ * 连接地址信息
+ */
+public class ConnectionAddrInfo {
+    /**
+     * < BR address
+     */
+    private BrAddr br;
+    /**
+     * < BLE address
+     */
+    private BleAddr ble;
+    /**< IPv4 or IPv6 address */
+    private IpAddr ip;
+    /**< Session address */
+    private SessionAddr session;
+
+    public BrAddr getBr() {
+        return br;
+    }
+
+    public void setBr(BrAddr br) {
+        this.br = br;
+    }
+
+    public BleAddr getBle() {
+        return ble;
+    }
+
+    public void setBle(BleAddr ble) {
+        this.ble = ble;
+    }
+
+    public IpAddr getIp() {
+        return ip;
+    }
+
+    public void setIp(IpAddr ip) {
+        this.ip = ip;
+    }
+
+    public SessionAddr getSession() {
+        return session;
+    }
+
+    public void setSession(SessionAddr session) {
+        this.session = session;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        ConnectionAddrInfo that = (ConnectionAddrInfo) o;
+        return Objects.equals(br, that.br) && Objects.equals(ble, that.ble) && Objects.equals(ip, that.ip) && Objects.equals(session, that.session);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(br, ble, ip, session);
+    }
+}

+ 41 - 0
softbus-sdk/src/main/java/com/jg/softbus/network/protocol/ConnectionAddrType.java

@@ -0,0 +1,41 @@
+package com.jg.softbus.network.protocol;
+
+/**
+ * Enumerates {@link ConnectionAddrType} types of a device that is added to a LNN.
+ */
+public enum ConnectionAddrType {
+    /**< WLAN */
+    CONNECTION_ADDR_WLAN(0),
+    /**< BR */
+    CONNECTION_ADDR_BR(1),
+    /**< BLE */
+    CONNECTION_ADDR_BLE(2),
+    /**< Ethernet */
+    CONNECTION_ADDR_ETH(3),
+    /**< SESSION */
+    CONNECTION_ADDR_SESSION(4),
+    /**< Invalid type */
+    CONNECTION_ADDR_MAX(5);
+
+    private final int value;
+
+    ConnectionAddrType(int value){
+        this.value = value;
+    }
+
+    public int valueOf(){
+        return this.value;
+    }
+
+    public static ConnectionAddrType getForValue(int value){
+        switch (value){
+            case 0: return CONNECTION_ADDR_WLAN;
+            case 1: return CONNECTION_ADDR_BR;
+            case 2: return CONNECTION_ADDR_BLE;
+            case 3: return CONNECTION_ADDR_ETH;
+            case 4: return CONNECTION_ADDR_SESSION;
+            case 5: return CONNECTION_ADDR_MAX;
+            default: return null;
+        }
+    }
+}

+ 48 - 0
softbus-sdk/src/main/java/com/jg/softbus/network/protocol/IpAddr.java

@@ -0,0 +1,48 @@
+package com.jg.softbus.network.protocol;
+
+import java.util.Objects;
+
+/**< IPv4 or IPv6 address */
+public class IpAddr {
+    private String ip;
+    /**< Port number represented by the host byte order */
+    private int port;
+
+    public IpAddr() {
+
+    }
+
+    public IpAddr(String ip, int port) {
+        this.ip = ip;
+        this.port = port;
+    }
+
+    public String getIp() {
+        return ip;
+    }
+
+    public void setIp(String ip) {
+        this.ip = ip;
+    }
+
+    public int getPort() {
+        return port;
+    }
+
+    public void setPort(int port) {
+        this.port = port;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        IpAddr ipAddr = (IpAddr) o;
+        return Objects.equals(ip, ipAddr.ip) && Objects.equals(port, ipAddr.port);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(ip, port);
+    }
+}

+ 52 - 0
softbus-sdk/src/main/java/com/jg/softbus/network/protocol/SessionAddr.java

@@ -0,0 +1,52 @@
+package com.jg.softbus.network.protocol;
+
+import java.util.Objects;
+
+/**
+ * Session address
+ */
+public class SessionAddr {
+    /**< Session Id in int format */
+    private int sessionId;
+    /**< Channel Id in int format */
+    private int channelId;
+    /**< Session type in int format */
+    private int type;
+
+    public int getSessionId() {
+        return sessionId;
+    }
+
+    public void setSessionId(int sessionId) {
+        this.sessionId = sessionId;
+    }
+
+    public int getChannelId() {
+        return channelId;
+    }
+
+    public void setChannelId(int channelId) {
+        this.channelId = channelId;
+    }
+
+    public int getType() {
+        return type;
+    }
+
+    public void setType(int type) {
+        this.type = type;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        SessionAddr that = (SessionAddr) o;
+        return Objects.equals(sessionId, that.sessionId) && Objects.equals(channelId, that.channelId) && Objects.equals(type, that.type);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(sessionId, channelId, type);
+    }
+}

+ 57 - 0
softbus-sdk/src/main/java/com/jg/softbus/session/BandwidthDetection.java

@@ -0,0 +1,57 @@
+package com.jg.softbus.session;
+
+import java.util.Objects;
+
+/**
+ *  Defines the bandwidth detection information.
+ */
+public class BandwidthDetection {
+    /**< Bandwidth change trend */
+    private int trend;
+    /**< Bandwidth rate */
+    private int rate;
+    public BandwidthDetection() {
+
+    }
+    public BandwidthDetection(int trend, int rate) {
+        this.trend = trend;
+        this.rate = rate;
+    }
+
+    public Integer getTrend() {
+        return trend;
+    }
+
+    public void setTrend(Integer trend) {
+        this.trend = trend;
+    }
+
+    public Integer getRate() {
+        return rate;
+    }
+
+    public void setRate(Integer rate) {
+        this.rate = rate;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        BandwidthDetection that = (BandwidthDetection) o;
+        return Objects.equals(trend, that.trend) && Objects.equals(rate, that.rate);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(trend, rate);
+    }
+
+    @Override
+    public String toString() {
+        return "BandwidthDetection{" +
+                "trend=" + trend +
+                ", rate=" + rate +
+                '}';
+    }
+}

+ 79 - 0
softbus-sdk/src/main/java/com/jg/softbus/session/FileReceiveContent.java

@@ -0,0 +1,79 @@
+package com.jg.softbus.session;
+
+/**
+ * 接收文件内容
+ */
+public class FileReceiveContent {
+    /**
+     *
+     */
+    private int sessionId;
+    /**
+     * 文件路径
+     */
+    private String files;
+    /**
+     * 文件数量
+     */
+    private int fileCnt;
+    /**
+     * 已接收文件数
+     */
+    private int receivedFiles;
+    /**
+     * 当前接收文件字节数
+     */
+    private long bytesUpload;
+    /**
+     * 当前接收文件的总字节数
+     */
+    private long bytesTotal;
+
+    public int getSessionId() {
+        return sessionId;
+    }
+
+    public void setSessionId(int sessionId) {
+        this.sessionId = sessionId;
+    }
+
+    public String getFiles() {
+        return files;
+    }
+
+    public void setFiles(String files) {
+        this.files = files;
+    }
+
+    public int getFileCnt() {
+        return fileCnt;
+    }
+
+    public void setFileCnt(int fileCnt) {
+        this.fileCnt = fileCnt;
+    }
+
+    public int getReceivedFiles() {
+        return receivedFiles;
+    }
+
+    public void setReceivedFiles(int receivedFiles) {
+        this.receivedFiles = receivedFiles;
+    }
+
+    public long getBytesUpload() {
+        return bytesUpload;
+    }
+
+    public void setBytesUpload(long bytesUpload) {
+        this.bytesUpload = bytesUpload;
+    }
+
+    public long getBytesTotal() {
+        return bytesTotal;
+    }
+
+    public void setBytesTotal(long bytesTotal) {
+        this.bytesTotal = bytesTotal;
+    }
+}

+ 94 - 0
softbus-sdk/src/main/java/com/jg/softbus/session/FrameStatus.java

@@ -0,0 +1,94 @@
+package com.jg.softbus.session;
+
+import java.util.Objects;
+
+/**
+ * Defines the frame information.
+ */
+public class FrameStatus {
+    /**< Stream ID */
+    private int streamId;
+    /**< Sequence number of the frame */
+    private int seqNum;
+    /**< Frame layer number */
+    private int level;
+    /**< Frame status */
+    private int transStatus;
+    /**< Duration that unsent frames in the queue are cached */
+    private int interval;
+
+    public FrameStatus() {
+
+    }
+
+    public FrameStatus(int streamId, int seqNum, int level, int transStatus, int interval) {
+        this.streamId = streamId;
+        this.seqNum = seqNum;
+        this.level = level;
+        this.transStatus = transStatus;
+        this.interval = interval;
+    }
+    public int getStreamId() {
+        return streamId;
+    }
+
+    public void setStreamId(Integer streamId) {
+        this.streamId = streamId;
+    }
+
+    public Integer getSeqNum() {
+        return seqNum;
+    }
+
+    public void setSeqNum(Integer seqNum) {
+        this.seqNum = seqNum;
+    }
+
+    public Integer getLevel() {
+        return level;
+    }
+
+    public void setLevel(Integer level) {
+        this.level = level;
+    }
+
+    public Integer getTransStatus() {
+        return transStatus;
+    }
+
+    public void setTransStatus(Integer transStatus) {
+        this.transStatus = transStatus;
+    }
+
+    public Integer getInterval() {
+        return interval;
+    }
+
+    public void setInterval(Integer interval) {
+        this.interval = interval;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        FrameStatus that = (FrameStatus) o;
+        return Objects.equals(streamId, that.streamId) && Objects.equals(seqNum, that.seqNum) && Objects.equals(level, that.level) && Objects.equals(transStatus, that.transStatus) && Objects.equals(interval, that.interval);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(streamId, seqNum, level, transStatus, interval);
+    }
+
+    @Override
+    public String toString() {
+        return "FrameStatus{" +
+                "streamId=" + streamId +
+                ", seqNum=" + seqNum +
+                ", level=" + level +
+                ", transStatus=" + transStatus +
+                ", interval=" + interval +
+                '}';
+    }
+}

+ 58 - 0
softbus-sdk/src/main/java/com/jg/softbus/session/JitterEstimation.java

@@ -0,0 +1,58 @@
+package com.jg.softbus.session;
+
+import java.util.Objects;
+
+/**
+ * Defines the jitter estimation information.
+ */
+public class JitterEstimation {
+    /**< Estimated network status */
+    private int jitterLevel;
+    /**< Required buffer time */
+    private int bufferTime;
+
+    public JitterEstimation() {
+
+    }
+    public JitterEstimation(int jitterLevel, int bufferTime) {
+        this.jitterLevel = jitterLevel;
+        this.bufferTime = bufferTime;
+    }
+
+    public int getJitterLevel() {
+        return jitterLevel;
+    }
+
+    public void setJitterLevel(int jitterLevel) {
+        this.jitterLevel = jitterLevel;
+    }
+
+    public int getBufferTime() {
+        return bufferTime;
+    }
+
+    public void setBufferTime(int bufferTime) {
+        this.bufferTime = bufferTime;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        JitterEstimation that = (JitterEstimation) o;
+        return Objects.equals(jitterLevel, that.jitterLevel) && Objects.equals(bufferTime, that.bufferTime);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(jitterLevel, bufferTime);
+    }
+
+    @Override
+    public String toString() {
+        return "JitterEstimation{" +
+                "jitterLevel=" + jitterLevel +
+                ", bufferTime=" + bufferTime +
+                '}';
+    }
+}

+ 64 - 0
softbus-sdk/src/main/java/com/jg/softbus/session/QosTv.java

@@ -0,0 +1,64 @@
+package com.jg.softbus.session;
+
+import com.jg.softbus.session.enums.TransEnumEventType;
+
+import java.util.Objects;
+
+/**
+ *  Defines the video stream transmission QoS.
+ */
+public class QosTv {
+    /**
+     * Stream transmission QoS event type {@link TransEnumEventType}
+     */
+    private TransEnumEventType type;
+    /**
+     * 质量信息
+     */
+    private QosTvInfo info;
+
+    public QosTv() {
+
+    }
+    public QosTv(TransEnumEventType type, QosTvInfo info) {
+        this.type = type;
+        this.info = info;
+    }
+
+    public TransEnumEventType getType() {
+        return type;
+    }
+
+    public void setType(TransEnumEventType type) {
+        this.type = type;
+    }
+
+    public QosTvInfo getInfo() {
+        return info;
+    }
+
+    public void setInfo(QosTvInfo info) {
+        this.info = info;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        QosTv qosTv = (QosTv) o;
+        return type == qosTv.type && Objects.equals(info, qosTv.info);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(type, info);
+    }
+
+    @Override
+    public String toString() {
+        return "QosTv{" +
+                "type=" + type +
+                ", info=" + info +
+                '}';
+    }
+}

+ 83 - 0
softbus-sdk/src/main/java/com/jg/softbus/session/QosTvInfo.java

@@ -0,0 +1,83 @@
+package com.jg.softbus.session;
+
+import java.util.Objects;
+
+/**
+ * tv的有关网络信息
+ */
+public class QosTvInfo {
+    /**< Wi-Fi channel quality {@link WifiChannelQuality} */
+    private WifiChannelQuality wifiChannelInfo;
+    /**< Frame information {@link FrameStatus} */
+    private FrameStatus frameStatusInfo;
+    /**< Bandwidth detection {@link BandwidthDetection} */
+   private BandwidthDetection bandwidthInfo;
+    /**< Network jitter estimation {@link JitterEstimation} */
+    private JitterEstimation jitterInfo;
+    /**< Stream transmission statistics {@link StreamStatistics} */
+    private StreamStatistics appStatistics;
+
+    public WifiChannelQuality getWifiChannelInfo() {
+        return wifiChannelInfo;
+    }
+
+    public void setWifiChannelInfo(WifiChannelQuality wifiChannelInfo) {
+        this.wifiChannelInfo = wifiChannelInfo;
+    }
+
+    public FrameStatus getFrameStatusInfo() {
+        return frameStatusInfo;
+    }
+
+    public void setFrameStatusInfo(FrameStatus frameStatusInfo) {
+        this.frameStatusInfo = frameStatusInfo;
+    }
+
+    public BandwidthDetection getBandwidthInfo() {
+        return bandwidthInfo;
+    }
+
+    public void setBandwidthInfo(BandwidthDetection bandwidthInfo) {
+        this.bandwidthInfo = bandwidthInfo;
+    }
+
+    public JitterEstimation getJitterInfo() {
+        return jitterInfo;
+    }
+
+    public void setJitterInfo(JitterEstimation jitterInfo) {
+        this.jitterInfo = jitterInfo;
+    }
+
+    public StreamStatistics getAppStatistics() {
+        return appStatistics;
+    }
+
+    public void setAppStatistics(StreamStatistics appStatistics) {
+        this.appStatistics = appStatistics;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        QosTvInfo qosTvInfo = (QosTvInfo) o;
+        return Objects.equals(wifiChannelInfo, qosTvInfo.wifiChannelInfo) && Objects.equals(frameStatusInfo, qosTvInfo.frameStatusInfo) && Objects.equals(bandwidthInfo, qosTvInfo.bandwidthInfo) && Objects.equals(jitterInfo, qosTvInfo.jitterInfo) && Objects.equals(appStatistics, qosTvInfo.appStatistics);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(wifiChannelInfo, frameStatusInfo, bandwidthInfo, jitterInfo, appStatistics);
+    }
+
+    @Override
+    public String toString() {
+        return "QosTvInfo{" +
+                "wifiChannelInfo=" + wifiChannelInfo +
+                ", frameStatusInfo=" + frameStatusInfo +
+                ", bandwidthInfo=" + bandwidthInfo +
+                ", jitterInfo=" + jitterInfo +
+                ", appStatistics=" + appStatistics +
+                '}';
+    }
+}

+ 40 - 0
softbus-sdk/src/main/java/com/jg/softbus/session/SendFileProcessResult.java

@@ -0,0 +1,40 @@
+package com.jg.softbus.session;
+
+public class SendFileProcessResult {
+    /**
+     * sessionId
+     */
+    private int sessionId;
+    /**
+     * 已上传字节数
+     */
+    private long bytesUpload;
+    /**
+     * 总字节数
+     */
+    private long bytesTotal;
+
+    public int getSessionId() {
+        return sessionId;
+    }
+
+    public void setSessionId(int sessionId) {
+        this.sessionId = sessionId;
+    }
+
+    public long getBytesUpload() {
+        return bytesUpload;
+    }
+
+    public void setBytesUpload(long bytesUpload) {
+        this.bytesUpload = bytesUpload;
+    }
+
+    public long getBytesTotal() {
+        return bytesTotal;
+    }
+
+    public void setBytesTotal(long bytesTotal) {
+        this.bytesTotal = bytesTotal;
+    }
+}

+ 99 - 0
softbus-sdk/src/main/java/com/jg/softbus/session/SessionAttribute.java

@@ -0,0 +1,99 @@
+package com.jg.softbus.session;
+
+import com.jg.softbus.session.enums.LinkType;
+import com.jg.softbus.session.enums.SessionType;
+
+import java.util.Arrays;
+import java.util.Objects;
+
+public class SessionAttribute {
+    /**
+     * < Session type {@link SessionType}
+     */
+    private int dataType;
+    /**< Number of link types */
+    int linkTypeNum;
+    /**< Link type {@link LinkType} */
+    private LinkType[] linkType;
+    /**属性**/
+    private StreamAttr attr;
+   // 快速传输数据
+    private byte[] fastTransData;
+    // 快速传输数据大小
+    private short fastTransDataSize;
+
+    public int getDataType() {
+        return dataType;
+    }
+
+    public void setDataType(int dataType) {
+        this.dataType = dataType;
+    }
+
+    public int getLinkTypeNum() {
+        return linkTypeNum;
+    }
+
+    public void setLinkTypeNum(int linkTypeNum) {
+        this.linkTypeNum = linkTypeNum;
+    }
+
+    public LinkType[] getLinkType() {
+        return linkType;
+    }
+
+    public void setLinkType(LinkType[] linkType) {
+        this.linkType = linkType;
+    }
+
+    public StreamAttr getAttr() {
+        return attr;
+    }
+
+    public void setAttr(StreamAttr attr) {
+        this.attr = attr;
+    }
+
+    public byte[] getFastTransData() {
+        return fastTransData;
+    }
+
+    public void setFastTransData(byte[] fastTransData) {
+        this.fastTransData = fastTransData;
+    }
+
+    public short getFastTransDataSize() {
+        return fastTransDataSize;
+    }
+
+    public void setFastTransDataSize(short fastTransDataSize) {
+        this.fastTransDataSize = fastTransDataSize;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        SessionAttribute that = (SessionAttribute) o;
+        return linkTypeNum == that.linkTypeNum && Objects.equals(dataType, that.dataType) && Arrays.equals(linkType, that.linkType) && Objects.equals(attr, that.attr) && Objects.equals(fastTransData, that.fastTransData) && Objects.equals(fastTransDataSize, that.fastTransDataSize);
+    }
+
+    @Override
+    public int hashCode() {
+        int result = Objects.hash(dataType, linkTypeNum, attr, fastTransData, fastTransDataSize);
+        result = 31 * result + Arrays.hashCode(linkType);
+        return result;
+    }
+
+    @Override
+    public String toString() {
+        return "SessionAttribute{" +
+                "dataType=" + dataType +
+                ", linkTypeNum=" + linkTypeNum +
+                ", linkType=" + Arrays.toString(linkType) +
+                ", attr=" + attr +
+                ", fastTransData=" + fastTransData +
+                ", fastTransDataSize=" + fastTransDataSize +
+                '}';
+    }
+}

+ 26 - 0
softbus-sdk/src/main/java/com/jg/softbus/session/StreamAttr.java

@@ -0,0 +1,26 @@
+package com.jg.softbus.session;
+
+import com.jg.softbus.session.enums.StreamType;
+
+/**
+ * Defines the stream attributes.
+ */
+public class StreamAttr {
+    /**< Stream type {@link StreamType} */
+    private int streamType;
+
+    public StreamAttr(){
+
+    }
+    public StreamAttr(int streamType) {
+        this.streamType = streamType;
+    }
+
+    public int getStreamType() {
+        return streamType;
+    }
+
+    public void setStreamType(int streamType) {
+        this.streamType = streamType;
+    }
+}

+ 32 - 0
softbus-sdk/src/main/java/com/jg/softbus/session/StreamData.java

@@ -0,0 +1,32 @@
+package com.jg.softbus.session;
+
+public class StreamData {
+    /**< Pointer to the buffer for storing the stream data */
+    private byte[] buf;
+    /**< Length of the buffer */
+    private int bufLen;
+
+    public StreamData(){
+
+    }
+    public StreamData(byte[] buf, int bufLen) {
+        this.buf = buf;
+        this.bufLen = bufLen;
+    }
+
+    public byte[] getBuf() {
+        return buf;
+    }
+
+    public void setBuf(byte[] buf) {
+        this.buf = buf;
+    }
+
+    public int getBufLen() {
+        return bufLen;
+    }
+
+    public void setBufLen(int bufLen) {
+        this.bufLen = bufLen;
+    }
+}

+ 85 - 0
softbus-sdk/src/main/java/com/jg/softbus/session/StreamFrameInfo.java

@@ -0,0 +1,85 @@
+package com.jg.softbus.session;
+
+public class StreamFrameInfo {
+    /**< Frame type, which can be I-frame or P-frame. */
+    private int frameType;
+    /**< Timestamp. */
+    private long timeStamp;
+    /**< Sequence number. */
+    private int seqNum;
+    /**< Sequence number of the slice. */
+    private int seqSubNum;
+    /**< Scalable video coding level. <b>0</b> stands for the base level,
+     <b>1</b> for level 1, and <b>2</b> for level 2. */
+    private int level;
+    /**< Bitmap, which indicates the start or end slice of a frame. */
+    private int bitMap;
+    /**< Number of scalable tag-values (TVs). */
+    private int tvCount;
+    /**< Pointer to the TV list. */
+    private TV[] tvList;
+
+    public int getFrameType() {
+        return frameType;
+    }
+
+    public void setFrameType(int frameType) {
+        this.frameType = frameType;
+    }
+
+    public long getTimeStamp() {
+        return timeStamp;
+    }
+
+    public void setTimeStamp(long timeStamp) {
+        this.timeStamp = timeStamp;
+    }
+
+    public int getSeqNum() {
+        return seqNum;
+    }
+
+    public void setSeqNum(int seqNum) {
+        this.seqNum = seqNum;
+    }
+
+    public int getSeqSubNum() {
+        return seqSubNum;
+    }
+
+    public void setSeqSubNum(int seqSubNum) {
+        this.seqSubNum = seqSubNum;
+    }
+
+    public int getLevel() {
+        return level;
+    }
+
+    public void setLevel(int level) {
+        this.level = level;
+    }
+
+    public int getBitMap() {
+        return bitMap;
+    }
+
+    public void setBitMap(int bitMap) {
+        this.bitMap = bitMap;
+    }
+
+    public int getTvCount() {
+        return tvCount;
+    }
+
+    public void setTvCount(int tvCount) {
+        this.tvCount = tvCount;
+    }
+
+    public TV[] getTvList() {
+        return tvList;
+    }
+
+    public void setTvList(TV[] tvList) {
+        this.tvList = tvList;
+    }
+}

File diff suppressed because it is too large
+ 212 - 0
softbus-sdk/src/main/java/com/jg/softbus/session/StreamStatistics.java


+ 35 - 0
softbus-sdk/src/main/java/com/jg/softbus/session/TV.java

@@ -0,0 +1,35 @@
+package com.jg.softbus.session;
+
+import com.jg.softbus.session.enums.TransEnumEventType;
+
+public class TV {
+    /**< Extended data type {@link TransEnumEventType} */
+    private int type;
+    /**< Value of the extended data */
+    private long value;
+
+    public TV() {
+
+    }
+
+    public TV(int type, long value) {
+        this.type = type;
+        this.value = value;
+    }
+
+    public int getType() {
+        return type;
+    }
+
+    public void setType(int type) {
+        this.type = type;
+    }
+
+    public long getValue() {
+        return value;
+    }
+
+    public void setValue(long value) {
+        this.value = value;
+    }
+}

+ 59 - 0
softbus-sdk/src/main/java/com/jg/softbus/session/WifiChannelQuality.java

@@ -0,0 +1,59 @@
+package com.jg.softbus.session;
+
+import java.util.Objects;
+
+/**
+ * Defines the Wi-Fi channel quality.
+ */
+public class WifiChannelQuality {
+    /**< Wi-Fi channel */
+    private int channel;
+    /**< Wi-Fi channel score */
+    private int score;
+
+    public WifiChannelQuality() {
+
+    }
+
+    public WifiChannelQuality(int channel, int score) {
+        this.channel = channel;
+        this.score = score;
+    }
+
+    public int getChannel() {
+        return channel;
+    }
+
+    public void setChannel(int channel) {
+        this.channel = channel;
+    }
+
+    public int getScore() {
+        return score;
+    }
+
+    public void setScore(int score) {
+        this.score = score;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        WifiChannelQuality that = (WifiChannelQuality) o;
+        return Objects.equals(channel, that.channel) && Objects.equals(score, that.score);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(channel, score);
+    }
+
+    @Override
+    public String toString() {
+        return "WifiChannelQuality{" +
+                "channel=" + channel +
+                ", score=" + score +
+                '}';
+    }
+}

+ 39 - 0
softbus-sdk/src/main/java/com/jg/softbus/session/callback/IFileReceiveListener.java

@@ -0,0 +1,39 @@
+package com.jg.softbus.session.callback;
+
+/**
+ * 文件接收回调
+ */
+public interface IFileReceiveListener {
+    /**
+     * 开始接收文件
+     * @param sessionId
+     * @param files
+     * @param fileCnt
+     * @return
+     */
+    int onReceiveFileStarted(int sessionId, String files, int fileCnt);
+
+    /**
+     * 接收文件进度
+     * @param sessionId
+     * @param firstFile
+     * @param bytesUpload
+     * @param bytesTotal
+     * @return
+     */
+    int onReceiveFileProcess(int sessionId, String firstFile, long bytesUpload, long bytesTotal);
+
+    /**
+     * 接收文件完成回调
+     * @param sessionId
+     * @param files
+     * @param fileCnt
+     */
+    void onReceiveFileFinished(int sessionId, String files, int fileCnt);
+
+    /**
+     * 文件接收错误回调
+     * @param sessionId
+     */
+    void onFileTransError(int sessionId);
+}

+ 29 - 0
softbus-sdk/src/main/java/com/jg/softbus/session/callback/IFileSendListener.java

@@ -0,0 +1,29 @@
+package com.jg.softbus.session.callback;
+
+/**
+ * 文件发送回调
+ */
+public interface IFileSendListener {
+    /**
+     * 发送进度回调
+     * @param sessionId
+     * @param bytesUpload
+     * @param bytesTotal
+     * @return
+     */
+    int onSendFileProcess(int sessionId, long bytesUpload, long bytesTotal);
+
+    /**
+     * 文件发送完成回调
+     * @param sessionId
+     * @param firstFile
+     * @return
+     */
+    int onSendFileFinished(int sessionId, String firstFile);
+
+    /**
+     * 发送错误回调
+     * @param sessionId
+     */
+    void onFileTransError(int sessionId);
+}

+ 55 - 0
softbus-sdk/src/main/java/com/jg/softbus/session/callback/ISessionListener.java

@@ -0,0 +1,55 @@
+package com.jg.softbus.session.callback;
+
+import com.jg.softbus.session.QosTv;
+import com.jg.softbus.session.StreamData;
+import com.jg.softbus.session.StreamFrameInfo;
+
+public interface ISessionListener {
+    /**
+     * 打开session
+     * @param sessionId
+     * @param result
+     * @return
+     */
+    int onSessionOpened(int sessionId, int result);
+
+    /**
+     * session关闭
+     * @param sessionId
+     */
+    void onSessionClosed(int sessionId);
+
+    /**
+     * 接收到字节
+     * @param sessionId
+     * @param data
+     * @param dataLen
+     */
+    void onBytesReceived(int sessionId, byte[] data, int dataLen);
+
+    /**
+     * 接收到消息
+     * @param sessionId
+     * @param data
+     * @param dataLen
+     */
+    void onMessageReceived(int sessionId, String data, int dataLen);
+
+    /**
+     * 流数据接收
+     * @param sessionId
+     * @param data
+     * @param ext
+     * @param param
+     */
+    void onStreamReceived(int sessionId, StreamData data, StreamData ext, StreamFrameInfo param);
+
+    /**
+     * qosEvent处理
+     * @param sessionId
+     * @param eventId
+     * @param tvCount
+     * @param tvList
+     */
+    void onQosEvent(int sessionId, int eventId, int tvCount, QosTv[] tvList);
+}

+ 42 - 0
softbus-sdk/src/main/java/com/jg/softbus/session/enums/LinkType.java

@@ -0,0 +1,42 @@
+package com.jg.softbus.session.enums;
+
+import java.util.Arrays;
+import java.util.Optional;
+
+/**
+ * Enumerates the link types.
+ */
+public enum LinkType {
+    /**< 5 GHz Wi-Fi link */
+    LINK_TYPE_WIFI_WLAN_5G(1),
+    /**< 2.4 GHz Wi-Fi link */
+    LINK_TYPE_WIFI_WLAN_2G(2),
+    /**< P2P link */
+    LINK_TYPE_WIFI_P2P(3),
+    /**< BR link */
+    LINK_TYPE_BR(4),
+    LINK_TYPE_BLE(5),
+    LINK_TYPE_WIFI_P2P_REUSE(6),
+    LINK_TYPE_BLE_DIRECT(7),
+    LINK_TYPE_COC(8),
+    LINK_TYPE_COC_DIRECT(9),
+    LINK_TYPE_MAX(9);
+
+    private final int value;
+
+    LinkType(int value){
+        this.value = value;
+    }
+
+    public Integer valueOf() {
+        return value;
+    }
+
+    public static LinkType getForValue(int value){
+        Optional<LinkType> rs = Arrays.stream(LinkType.values()).filter(type->type.valueOf() == value).findAny();
+        if(rs.isPresent()){
+            return rs.get();
+        }
+        return null;
+    }
+}

+ 35 - 0
softbus-sdk/src/main/java/com/jg/softbus/session/enums/QosEvent.java

@@ -0,0 +1,35 @@
+package com.jg.softbus.session.enums;
+
+import java.util.Arrays;
+import java.util.Optional;
+
+/**
+ * Enumerates the QoS feedback types.
+ */
+public enum QosEvent {
+    /**< Feedback on stream transmission quality */
+    TRANS_STREAM_QUALITY_EVENT(1),
+    /**< Feedback on transmission channel quality */
+    TRANS_CHANNEL_QUALITY_EVENT(2),
+    /**< Feedback on deferrable transmission */
+    TRANS_CAN_DELAY_EVENT(3),
+    /**< Feedback on non-deferrable transmission */
+    TRANS_CANT_DELAY_EVENT(4),
+    /**< Invalid feedback */
+    QOS_EVENT_MAX(5);
+
+    private final Integer value;
+
+    QosEvent(int value) {
+        this.value = value;
+    }
+
+    public int valueOf(){
+        return this.value;
+    }
+
+    public static QosEvent getForValue(int value) {
+        Optional<QosEvent> rs = Arrays.stream(QosEvent.values()).filter(event-> event.valueOf()==value).findAny();
+        return rs.orElse(null);
+    }
+}

+ 35 - 0
softbus-sdk/src/main/java/com/jg/softbus/session/enums/SessionType.java

@@ -0,0 +1,35 @@
+package com.jg.softbus.session.enums;
+
+import java.util.Arrays;
+import java.util.Optional;
+
+/**
+ * Enumerates the session types.
+ */
+public enum SessionType {
+    /**< Message */
+    TYPE_MESSAGE(1),
+    /**< Bytes */
+    TYPE_BYTES(2),
+    /**< File */
+    TYPE_FILE(3),
+    /**< Stream */
+    TYPE_STREAM(4),
+    TYPE_BUTT(5);
+
+    private final int value;
+    SessionType(int value) {
+        this.value = value;
+    }
+
+    public Integer valueOf(){
+        return this.value;
+    }
+
+    public static SessionType getForValue(int value){
+        Optional<SessionType> rs = Arrays.stream(SessionType.values()).filter(type->type.valueOf()==value).findAny();
+        return rs.orElse(null);
+    }
+
+
+}

+ 35 - 0
softbus-sdk/src/main/java/com/jg/softbus/session/enums/StreamType.java

@@ -0,0 +1,35 @@
+package com.jg.softbus.session.enums;
+
+import java.util.Arrays;
+import java.util.Optional;
+
+/**
+ * Enumerates the stream types.
+ */
+public enum StreamType {
+    /**< Invalid stream type. */
+    INVALID(-1),
+    /**< Send any segment of a frame each time. */
+    RAW_STREAM(0),
+    /**< Send a whole video frame each time. */
+    COMMON_VIDEO_STREAM(1),
+    /**< Send a whole audio frame each time. */
+    COMMON_AUDIO_STREAM(2),
+    /**< Slice frame mode. */
+    VIDEO_SLICE_STREAM(3);
+
+    private final int value;
+
+    StreamType(int value){
+        this.value = value;
+    }
+
+    public Integer valueOf() {
+        return this.value;
+    }
+
+    public static StreamType getForValue(int value) {
+        Optional<StreamType> rs = Arrays.stream(StreamType.values()).filter(type->type.valueOf() == value).findAny();
+        return rs.orElse(null);
+    }
+}

+ 33 - 0
softbus-sdk/src/main/java/com/jg/softbus/session/enums/TransEnumEventType.java

@@ -0,0 +1,33 @@
+package com.jg.softbus.session.enums;
+
+import java.util.Arrays;
+import java.util.Optional;
+
+/**
+ * Enumerates the stream transmission QoS event types.
+ */
+public enum TransEnumEventType {
+    /**< Wi-Fi channel quality */
+    WIFI_CHANNEL_QUALITY(1),
+    /**< Real-time status of frame transmission */
+    FRAME_REALTIME_STATUS(2),
+    /**< Bandwidth estimation */
+    BANDWIDTH_ESTIMATE_VALUE(3),
+    /**< Jitter detection */
+    JITTER_DETECTION_VALUE(4),
+    /**< Stream traffic statistics */
+    STREAM_TRAFFIC_STASTICS(5);
+
+    private final int value;
+    TransEnumEventType(int value) {
+        this.value = value;
+    }
+    public Integer valueOf() {
+        return this.value;
+    }
+
+    public static TransEnumEventType getForValue(int value) {
+        Optional<TransEnumEventType> rs = Arrays.stream(TransEnumEventType.values()).filter(type->type.valueOf()==value).findAny();
+        return rs.orElse(null);
+    }
+}

+ 11 - 0
softbus-sdk/src/test/java/Test.java

@@ -0,0 +1,11 @@
+public class Test {
+
+    public static void main(String[] args) {
+//        PublishInfo info = new PublishInfo();
+//        info.setCapability(DataBitMap.OSD_CAPABILITY_BITMAP.getAbbr());
+//        info.setFreq(ExchangeFreq.LOW);
+//        info.setMode(DiscoverMode.DISCOVER_MODE_PASSIVE);
+//        info.setPublishId(123212);
+//        System.out.println(JsonHelper.toJSONString(info));
+    }
+}

BIN
softbus-sdk/target/archive-tmp/softbus-sdk-0.0.1-SNAPSHOT.jar


BIN
softbus-sdk/target/classes/com/jg/softbus/TestMain.class


BIN
softbus-sdk/target/classes/com/jg/softbus/common/SoftbusErrCode.class


BIN
softbus-sdk/target/classes/com/jg/softbus/device/DeviceInfo.class


BIN
softbus-sdk/target/classes/com/jg/softbus/device/DeviceState.class


BIN
softbus-sdk/target/classes/com/jg/softbus/device/DeviceType.class


BIN
softbus-sdk/target/classes/com/jg/softbus/discovery/CapabilityMap.class


BIN
softbus-sdk/target/classes/com/jg/softbus/discovery/PublishInfo.class


BIN
softbus-sdk/target/classes/com/jg/softbus/discovery/SubscribeInfo.class


BIN
softbus-sdk/target/classes/com/jg/softbus/discovery/callback/IDiscoveryCallback.class


BIN
softbus-sdk/target/classes/com/jg/softbus/discovery/callback/IPublishCallback.class


BIN
softbus-sdk/target/classes/com/jg/softbus/discovery/callback/IPublishCb.class


BIN
softbus-sdk/target/classes/com/jg/softbus/discovery/callback/IRefreshCallback.class


+ 0 - 0
softbus-sdk/target/classes/com/jg/softbus/discovery/enums/DataBitMap.class


Some files were not shown because too many files changed in this diff