|
@@ -1,29 +1,249 @@
|
|
|
package com.jg.softbus.service;
|
|
|
|
|
|
-import com.jg.softbus.discovery.PublishInfo;
|
|
|
-import com.jg.softbus.discovery.SubscribeInfo;
|
|
|
+import com.jg.softbus.manager.SessionManager;
|
|
|
+import com.jg.softbus.model.SessionInfo;
|
|
|
+import com.jg.softbus.naservice.LNNService;
|
|
|
+import com.jg.softbus.naservice.PublishService;
|
|
|
+import com.jg.softbus.naservice.SessionService;
|
|
|
+import com.jg.softbus.naservice.SubscribeService;
|
|
|
+import com.jg.softbus.session.SessionAttribute;
|
|
|
+import com.jg.softbus.session.StreamAttr;
|
|
|
+import com.jg.softbus.session.StreamData;
|
|
|
+import com.jg.softbus.session.StreamFrameInfo;
|
|
|
+import com.jg.softbus.session.callback.IFileReceiveListener;
|
|
|
+import com.jg.softbus.session.callback.IFileSendListener;
|
|
|
+import com.jg.softbus.session.enums.LinkType;
|
|
|
+import com.jg.softbus.session.enums.SessionType;
|
|
|
+import com.jg.softbus.session.enums.StreamType;
|
|
|
+
|
|
|
+import java.io.IOException;
|
|
|
+import java.nio.charset.StandardCharsets;
|
|
|
+import java.util.Objects;
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
+import java.util.concurrent.atomic.AtomicBoolean;
|
|
|
|
|
|
public class SoftbusService implements ISoftbusService {
|
|
|
/**
|
|
|
- * 服务包名
|
|
|
+ * 启动参数
|
|
|
+ */
|
|
|
+ private final SoftbusServiceStartParam startParam;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * session服务
|
|
|
+ */
|
|
|
+ private SessionService sessionService;
|
|
|
+ /**
|
|
|
+ * 发布服务
|
|
|
+ */
|
|
|
+ private PublishService publishService;
|
|
|
+ /**
|
|
|
+ * 订阅服务
|
|
|
*/
|
|
|
- private final String pkgName;
|
|
|
+ private SubscribeService subscribeService;
|
|
|
/**
|
|
|
- * session名称
|
|
|
+ * 组网服务
|
|
|
*/
|
|
|
- private final String sessionName;
|
|
|
+ private LNNService lnnService;
|
|
|
+ /**
|
|
|
+ * 启动标识
|
|
|
+ */
|
|
|
+ private AtomicBoolean started = new AtomicBoolean(false);
|
|
|
|
|
|
- public SoftbusService(String pkgName, String sessionName) {
|
|
|
- this.pkgName = pkgName;
|
|
|
- this.sessionName = sessionName;
|
|
|
+ public SoftbusService(SoftbusServiceStartParam startParam) {
|
|
|
+ this.startParam = startParam;
|
|
|
}
|
|
|
@Override
|
|
|
- public boolean start(PublishInfo publishInfo, SubscribeInfo subscribeInfo) {
|
|
|
+ public boolean start() throws Exception {
|
|
|
+ if (started.compareAndSet(false, true)) {
|
|
|
+ startSessionServer();
|
|
|
+ publishService = new PublishService(startParam.getPkgName());
|
|
|
+ if(Objects.nonNull(startParam.getPublishCallback())) {
|
|
|
+ publishService.publishService(startParam.getPublishInfo(), startParam.getPublishCallback());
|
|
|
+ } else {
|
|
|
+ publishService.publishService(startParam.getPublishInfo());
|
|
|
+ }
|
|
|
+ subscribeService = new SubscribeService(startParam.getPkgName());
|
|
|
+ if(Objects.nonNull(startParam.getDiscoveryCallback())) {
|
|
|
+ subscribeService.discoveryStart(startParam.getSubscribeInfo(), startParam.getDiscoveryCallback());
|
|
|
+ } else {
|
|
|
+ subscribeService.discoveryStart(startParam.getSubscribeInfo());
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ return started.get();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean startNew() throws Exception {
|
|
|
+ if (started.compareAndSet(false, true)) {
|
|
|
+ startSessionServer();
|
|
|
+ publishService = new PublishService(startParam.getPkgName());
|
|
|
+ if(Objects.nonNull(startParam.getPublishCb())) {
|
|
|
+ publishService.publishLNN(startParam.getPublishInfo(), startParam.getPublishCb());
|
|
|
+ } else {
|
|
|
+ publishService.publishLNN(startParam.getPublishInfo());
|
|
|
+ }
|
|
|
+ subscribeService = new SubscribeService(startParam.getPkgName());
|
|
|
+ if(Objects.nonNull(startParam.getRefreshCallback())) {
|
|
|
+ subscribeService.refreshLNN(startParam.getSubscribeInfo(), startParam.getRefreshCallback());
|
|
|
+ } else {
|
|
|
+ subscribeService.refreshLNN(startParam.getSubscribeInfo());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return started.get();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public SessionManager getSessionManager() {
|
|
|
+ if(sessionService.getSessionManager()!=null) {
|
|
|
+ return sessionService.getSessionManager();
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean sendMsg(String message) throws Exception {
|
|
|
+ if(message == null || message.isEmpty()) {
|
|
|
+ throw new Exception("message cannot be null, invalid param.");
|
|
|
+ }
|
|
|
+ if(started.get()) {
|
|
|
+ byte[] data = message.getBytes(StandardCharsets.UTF_8);
|
|
|
+ if(sessionService.getSessionManager()!=null && sessionService.getSessionManager().getSessions() != null
|
|
|
+ && !sessionService.getSessionManager().getSessions().isEmpty()) {
|
|
|
+ boolean rs = true;
|
|
|
+ for (SessionInfo session: sessionService.getSessionManager().getSessions()){
|
|
|
+ rs = sessionService.sendMessage(session.getSessionId(), message, message.length()) == 0;
|
|
|
+ }
|
|
|
+ return rs;
|
|
|
+ }
|
|
|
+ }
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 发送消息
|
|
|
+ * @param data
|
|
|
+ * @param session
|
|
|
+ * @return
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
@Override
|
|
|
- public boolean stopService() {
|
|
|
+ public boolean sendMsg(byte[] data, SessionInfo session) throws Exception {
|
|
|
+ return sendMsg(data, session, defaultSessionAttr());
|
|
|
+ }
|
|
|
+
|
|
|
+ private SessionAttribute defaultSessionAttr() {
|
|
|
+ SessionAttribute attr = new SessionAttribute();
|
|
|
+ attr.setDataType(SessionType.TYPE_BYTES.valueOf());
|
|
|
+ attr.setLinkType(new LinkType[]{LinkType.LINK_TYPE_WIFI_WLAN_2G});
|
|
|
+ attr.setLinkTypeNum(attr.getLinkType().length);
|
|
|
+ attr.setAttr(new StreamAttr(StreamType.RAW_STREAM.valueOf()));
|
|
|
+ return attr;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 开启session
|
|
|
+ * @param session
|
|
|
+ * @param attr
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ private void openSession(SessionInfo session, SessionAttribute attr) throws Exception {
|
|
|
+ sessionService.openSession(session.getSessionId(), session.getNetworkId(), attr);
|
|
|
+ try {
|
|
|
+ TimeUnit.MILLISECONDS.sleep(300);
|
|
|
+ } catch (InterruptedException ignored) {
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 关闭session
|
|
|
+ */
|
|
|
+ private void closeSession(int sessionId) {
|
|
|
+ sessionService.closeSession(sessionId);
|
|
|
+ try {
|
|
|
+ TimeUnit.MILLISECONDS.sleep(300);
|
|
|
+ } catch (InterruptedException ignored) {
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean sendMsg(byte[] data, SessionInfo session, SessionAttribute attr) throws Exception {
|
|
|
+ boolean rs = true;
|
|
|
+ if(!session.isOpen()) {
|
|
|
+ openSession(session, attr);
|
|
|
+ }
|
|
|
+ int ret = sessionService.sendBytes(session.getSessionId(), data, data.length);
|
|
|
+ rs = ret == 0;
|
|
|
+ if (!rs) {
|
|
|
+ System.out.println("message send failed.");
|
|
|
+ throw new Exception(String.format("the message send to %s failed!", session.getNetworkId()));
|
|
|
+ }
|
|
|
+ return rs;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean sendStream(int sessionId, StreamData data, StreamData ext, StreamFrameInfo param) throws Exception {
|
|
|
+ if(Objects.nonNull(getSessionManager()) && Objects.nonNull(getSessionManager().getSession(sessionId))) {
|
|
|
+ return sessionService.sendStream(sessionId, data, ext, param) == 0;
|
|
|
+ }
|
|
|
+ throw new Exception("SessionId is valid.");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void setFileSendListener(IFileSendListener fileSendListener) throws Exception {
|
|
|
+ sessionService.setFileSendListener(fileSendListener);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean sendFile(int sessionId, String[] sFileList, String[] dFileList, int fileCnt) throws Exception {
|
|
|
+ if(Objects.nonNull(getSessionManager()) && Objects.nonNull(getSessionManager().getSession(sessionId))) {
|
|
|
+ return sessionService.sendFile(sessionId, sFileList, dFileList, fileCnt) == 0;
|
|
|
+ }
|
|
|
+ throw new Exception("SessionId is valid.");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void setFileReceiveListener(IFileReceiveListener fileReceiveListener, String directory) throws Exception {
|
|
|
+ sessionService.setFileReceiveListener(fileReceiveListener, directory);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean sendMsg(String message, int sessionId) throws Exception {
|
|
|
+ if(message == null || message.isEmpty()) {
|
|
|
+ throw new Exception("message cannot be null, invalid param.");
|
|
|
+ }
|
|
|
+ if(sessionService.getSessionManager()!=null && sessionService.getSessionManager().getSessions() != null
|
|
|
+ && !sessionService.getSessionManager().getSessions().isEmpty()) {
|
|
|
+ SessionInfo session = sessionService.getSessionManager().getSession(sessionId);
|
|
|
+ if(Objects.isNull(session)) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ return sendMsg(message.getBytes(StandardCharsets.UTF_8), session);
|
|
|
+ }
|
|
|
return false;
|
|
|
}
|
|
|
+
|
|
|
+ private void startSessionServer() throws Exception {
|
|
|
+ sessionService = new SessionService(startParam.getPkgName(), startParam.getSessionName());
|
|
|
+ sessionService.createSessionServer();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public boolean stopService() throws IOException {
|
|
|
+ if (started.compareAndSet(true, false)) {
|
|
|
+ //停止处理有关业务逻辑
|
|
|
+ if(Objects.nonNull(subscribeService)) {
|
|
|
+ subscribeService.close();
|
|
|
+ }
|
|
|
+ if(Objects.nonNull(publishService)) {
|
|
|
+ publishService.close();
|
|
|
+ }
|
|
|
+ if(Objects.nonNull(sessionService)) {
|
|
|
+ sessionService.close();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
}
|