package com.fastbee.data.controller.netty; import com.fastbee.base.service.ISessionStore; import com.fastbee.base.session.Session; import com.fastbee.common.core.controller.BaseController; import com.fastbee.common.core.domain.AjaxResult; import com.fastbee.common.utils.StringUtils; import com.fastbee.common.utils.gateway.mq.Topics; import com.fastbee.mqtt.manager.ClientManager; import com.fastbee.mqtt.manager.SessionManger; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; /** * NETTY客户端可视化 * * @author gsb * @date 2023/3/23 14:51 */ @RestController @RequestMapping("/iot/mqtt") @Api(tags = "Netty可视化") @Slf4j public class NettyManagerController extends BaseController { @Resource private ISessionStore sessionStore; /** * 客户端管理列表 * @param pageSize 分页大小 * @param pageNum 页数 * @param clientId 查询客户端id * @param serverCode 服务端类型编码 MQTT/TCP/UDP * @param isClient 是否只显示设备端 1-是/0或null-否 * @return 客户端列表 */ @GetMapping("/clients") @ApiOperation("netty客户端列表") public AjaxResult clients(Integer pageSize, Integer pageNum, String clientId, String serverCode,Integer isClient) { List list = new ArrayList<>(); if (StringUtils.isEmpty(clientId)) { ConcurrentHashMap sourceMap = sessionStore.getSessionMap(); ConcurrentHashMap selectMap = new ConcurrentHashMap<>(); sourceMap.forEach((key, value) -> { if (serverCode.equals(value.getServerType().getCode())) { if (null != isClient && isClient == 1){ if (!key.startsWith("server") && !key.startsWith("web") && !key.startsWith("phone") && !key.startsWith("test")){ selectMap.put(key,value); } }else { selectMap.put(key, value); } } }); Map sessionMap = sessionStore.listPage(selectMap, pageSize, pageNum); List result = new ArrayList<>(sessionMap.values()); for (Session session : result) { Map topicMap = ClientManager.clientTopicMap.get(session.getClientId()); if (topicMap != null) { List topicsList = new ArrayList<>(); topicMap.keySet().forEach(topic -> { Topics tBo = new Topics(); tBo.setTopicName(topic); topicsList.add(tBo); }); session.setTopics(topicsList); session.setTopicCount(topicMap.size()); } else { session.setTopicCount(0); } list.add(session); } return AjaxResult.success(list, selectMap.size()); } else { List result = new ArrayList<>(); Session session = sessionStore.getSession(clientId); if (session != null) { Map topicMap = ClientManager.clientTopicMap.get(session.getClientId()); if (topicMap != null) { List topicsList = new ArrayList<>(); topicMap.keySet().forEach(topic -> { Topics tBo = new Topics(); tBo.setTopicName(topic); topicsList.add(tBo); }); session.setTopics(topicsList); session.setTopicCount(topicMap.size()); } else { session.setTopicCount(0); } if (serverCode.equals(session.getServerType().getCode())) { result.add(session); } } return AjaxResult.success(result, result.size()); } } @GetMapping("/client/out") @ApiOperation("netty客户端踢出") public AjaxResult clientOut(String clientId){ Session session = sessionStore.getSession(clientId); Optional.ofNullable(session).orElseThrow(() -> new SecurityException("客户端不存在")); SessionManger.removeClient(clientId); return AjaxResult.success(); } }