server/platform/src/main/java/com/doumee/service/impl/MqttSubServiceImpl.java
@@ -32,6 +32,6 @@ @PostConstruct public void startSubcribe() { mqttToolService.subscribe( new String[]{ Constants.MqttTopic.sub_lockInfo, Constants.MqttTopic.sub_closeLock}); new String[]{ Constants.MqttTopic.sub_lockInfo, Constants.MqttTopic.sub_closeLock,Constants.MqttTopic.sub_health}); } } server/platform/src/main/java/com/doumee/task/ScheduleTool.java
@@ -77,9 +77,9 @@ */ @Scheduled(cron = "0/30 * * * * ? ") public void autoRefreshLockStatus() throws Exception { log.info("=====================å¼å§æ¯å¤©èªå¨ç»ç®======================="); log.info("=====================å¼å§å·æ°éªè¡ä¸çæ°å 弿ªå¼é失败======================="); memberRidesService.autoRefreshLockStatus(); log.info("=====================ç»ææ¯å¤©èªå¨ç»ç®======================="); log.info("=====================å¼å§å·æ°éªè¡ä¸çæ°å 弿ªå¼é失败======================="); } @@ -87,7 +87,7 @@ * ç«ç¹è½¦è¾æ»¡æ¶çé¢è¦ * @throws Exception */ @Scheduled(fixedDelay = 1000L * 60L * 3L) @Scheduled(fixedDelay = 1000L * 60L * 10L) public void siteReserves() throws Exception { log.info("=====================å¼å§ ç«ç¹è½¦è¾æ»¡æ¶çé¢è¦======================="); sitesService.siteReservesNotice();; server/services/src/main/java/com/doumee/core/constants/Constants.java
@@ -49,6 +49,9 @@ String sub_lockInfo = "device/lock/+/+/info"; //è¿è½¦é头ï¼è®¢é ï¼ String sub_closeLock = "device/lock/+/+/bike"; String sub_health= "device/lock/+/health"; String sub_brokers = "$SYS/brokers/+/clients/#"; //宿¶è·åéä¿¡æ¯ï¼åå¸ï¼ String pub_getLockInfo = "device/lock/{siteId}/{lockId}/getInfo"; } @@ -63,11 +66,12 @@ int partful = 3; } public interface LockStatus{ // //ç¶æï¼0éå, 1æå¼ï¼2è¿è¡ä¸, 3å¼å¸¸ // //ç¶æï¼0éå, 1æå¼ï¼2è¿è¡ä¸, 3å¼å¸¸ -1èªæ£ int closed =0; int open =1; int running =2; int error= 3; int checking= -1; } public interface goodsorderStatus{ int waitPay =0; server/services/src/main/java/com/doumee/core/model/api/WebLoginUserInfo.java
@@ -46,6 +46,6 @@ @ApiModelProperty(value = "æ»ç§¯å") private Integer total_integral ;// @ApiModelProperty(value = "æ»æäº¤æ°é") private Integer submission_number ;// private Integer submission_number ;// } server/services/src/main/java/com/doumee/core/mqtt/service/MqttPushCallback.java
@@ -20,7 +20,6 @@ //æ¥æ¶æ¶æ¯åè° @Override public void connectionLost(Throwable cause) { // è¿æ¥ä¸¢å¤±åï¼ä¸è¬å¨è¿éé¢è¿è¡éè¿ System.out.println("è¿æ¥æå¼ï¼éè¿ä¸"); try { server/services/src/main/java/com/doumee/core/mqtt/service/MqttToolService.java
@@ -14,7 +14,6 @@ private MqttConfig config; @Autowired private MqttPushCallback callBack ; /** * è®¢é æ¶æ¯ï¼å¯å¨å è½½ä¸æ¬¡ * @param topics @@ -25,6 +24,11 @@ int[] Qos = new int[topics.length];//0ï¼æå¤ä¸æ¬¡ ã1ï¼æå°ä¸æ¬¡ ã2ï¼åªæä¸æ¬¡ for (int i = 0; i < Qos.length; i++) { Qos[i] = 1; /*if(i ==2){ Qos[i] = 2; }else{ Qos[i] = 1; }*/ } MqttClientInit.getSubInstance(config,callBack).subscribe(topics, Qos); } catch (Exception e) { @@ -39,7 +43,7 @@ public int pubMessage(String message,String topic){ MqttMessage mess = new MqttMessage(); mess.setQos(1); mess.setRetained(true); mess.setRetained(false); mess.setPayload(message.getBytes()); try { MqttClientInit.getInstance(config).publish(topic, mess); server/services/src/main/java/com/doumee/dao/business/model/Sites.java
@@ -37,6 +37,10 @@ @ExcelColumn(name="ç¼è¾æ¶é´") //@JsonFormat(pattern = "yyyy-MM-dd") private Date editDate; @ApiModelProperty(value = "æåé讯æ¶é´") @ExcelColumn(name="æåé讯æ¶é´") //@JsonFormat(pattern = "yyyy-MM-dd") private Date lastLinkDate; @ApiModelProperty(value = "ç¼è¾äºº") @ExcelColumn(name="ç¼è¾äºº") @@ -59,9 +63,12 @@ @ExcelColumn(name="ç¼å·") private String code; @ApiModelProperty(value = "ç¶æ 0æ£å¸¸ 1ç¦ç¨", example = "1") @ApiModelProperty(value = "ç¶æ 0æ£å¸¸ 1ç¦ç¨ ", example = "1") @ExcelColumn(name="ç¶æ 0æ£å¸¸ 1ç¦ç¨") private Integer status; @ApiModelProperty(value = "ç¶æ 0å¨çº¿ 1离线 ", example = "1") @ExcelColumn(name="ç¶æ 0å¨çº¿ 1离线") private Integer online; @ApiModelProperty(value = "é头æ°é", example = "1") @ExcelColumn(name="é头æ°é") server/services/src/main/java/com/doumee/service/business/DeviceSubcribeService.java
@@ -1,14 +1,11 @@ package com.doumee.service.business; import com.doumee.dao.business.model.Locks; /** * ä¸ç¡¬ä»¶å¯¹æ¥æå¡ * @author æ±è¹è¹ * @date 2023/10/09 18:06 */ public interface DeviceSubcribeService { /** * 设å¤ä¸æ¥æ°æ®ï¼ä¸æ¥ï¼ * @param param 䏿¥åæ° server/services/src/main/java/com/doumee/service/business/impl/DeviceSubscribeServiceImpl.java
@@ -6,11 +6,10 @@ import com.doumee.core.exception.BusinessException; import com.doumee.core.mqtt.config.MqttConfig; import com.doumee.core.mqtt.service.MqttToolService; import com.doumee.dao.business.MemberRidesMapper; import com.doumee.dao.business.MqttLogMapper; import com.doumee.dao.business.model.Bikes; import com.doumee.dao.business.model.Locks; import com.doumee.dao.business.model.MemberRides; import com.doumee.dao.business.model.MqttLog; import com.doumee.dao.business.SitesMapper; import com.doumee.dao.business.model.*; import com.doumee.service.business.*; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -32,6 +31,9 @@ @Autowired @Lazy MemberRidesService memberRidesService; @Lazy @Autowired SitesMapper sitesMapper; @Autowired private MqttLogMapper mqttLogMapper; @Autowired @@ -41,24 +43,21 @@ log.info("mqttæ¶æ¯è®¢é ==================="+param); String info = Constants.MqttTopic.sub_lockInfo.substring(Constants.MqttTopic.sub_lockInfo.lastIndexOf("/")+1) ; String closeLock = Constants.MqttTopic.sub_closeLock.substring(Constants.MqttTopic.sub_closeLock.lastIndexOf("/")+1) ; if(topic.indexOf(Constants.MqttTopic.topic_index)!=0 ||topic.split("/").length < 5 || (!StringUtils.contains(topic, info) &&!StringUtils.contains(topic,closeLock))){ log.error("mqttæ¶æ¯è®¢é ===========æ ææ°æ®========"+param); return; } String[] ss = topic.split("/"); String siteid = ss[2];//ç«ç¹ç¼ç String lockid = ss[3];//é头ç¼ç if(StringUtils.isBlank(siteid)||StringUtils.isBlank(lockid)){ //妿é头ç¼ç 为空 log.error("mqttæ¶æ¯è®¢é ==============æ ææ°æ®====="+param); return; String health = Constants.MqttTopic.sub_health.substring(Constants.MqttTopic.sub_health.lastIndexOf("/")+1) ; String brokers = "brokers"; if(!StringUtils.contains(topic, brokers)){ if(topic.indexOf(Constants.MqttTopic.topic_index)!=0 ||topic.split("/").length < 4 || (!StringUtils.contains(topic, info) &&!StringUtils.contains(topic, health) &&!StringUtils.contains(topic,closeLock))){ log.error("mqttæ¶æ¯è®¢é ===========æ ææ°æ®========"+param); return; } } MqttLog mqttLog = new MqttLog(); mqttLog.setMsgId(msgId); mqttLog.setTopic(topic); int msgCount =mqttLogMapper.selectCount(new QueryWrapper<MqttLog>().lambda().eq(MqttLog::getMsg, param).eq(MqttLog::getType, Constants.ZERO)); if(msgCount>0){ log.error("mqttæ¶æ¯è®¢é ==============å·²æ¶è´¹æ°æ®====="+param); @@ -68,27 +67,86 @@ String logInfo = ""; int result =0; try { if(StringUtils.contains(topic, info)){ //妿é头信æ¯ä¸æ¥ Locks locks = JSONObject.parseObject(param, Locks.class); locks.setSiteId(siteid); locks.setCode(lockid); locks.setInfo(logId); result = memberRidesService.mqttLockInfoEvent(locks); logInfo = "mqttæ¶æ¯è®¢é é头信æ¯"; log.info("mqttæ¶æ¯è®¢é =========éä¿¡æ¯==========æå"); } if(StringUtils.contains(topic, closeLock)){ //妿è¿è½¦ä¸æ¥ JSONObject pjson = JSONObject.parseObject(param); MemberRides bikes = new MemberRides(); bikes.setBikeCode(pjson.getString("bikeCode")); bikes.setBackLockId( lockid); bikes.setBackSiteId( siteid); bikes.setBackCommondId(logId); result = memberRidesService.mqttCloseBikeEvent(bikes); logInfo = "mqttæ¶æ¯è®¢é è¿è½¦æ¶æ¯"; log.info("mqttæ¶æ¯è®¢é =========è¿è½¦==========æå"); if(!topic.contains(brokers)){ String[] ss = topic.split("/"); String siteid = ss[2];//ç«ç¹ç¼ç if(StringUtils.isBlank(siteid) ){ //妿é头ç¼ç 为空 log.error("mqttæ¶æ¯è®¢é ==============æ ææ°æ®====="+topic+param); return; } if(StringUtils.contains(topic, info)){ //妿é头信æ¯ä¸æ¥ String lockid = ss[3];//é头ç¼ç if( StringUtils.isBlank(lockid)){ //妿é头ç¼ç 为空 log.error("mqttæ¶æ¯è®¢é ==============æ ææ°æ®====="+topic+param); return; } Locks locks = JSONObject.parseObject(param, Locks.class); locks.setSiteId(siteid); locks.setCode(lockid); locks.setInfo(logId); result = memberRidesService.mqttLockInfoEvent(locks); logInfo = "mqttæ¶æ¯è®¢é é头信æ¯"; log.info("mqttæ¶æ¯è®¢é =========éä¿¡æ¯==========æå"); }else if(StringUtils.contains(topic, closeLock)){ //妿è¿è½¦ä¸æ¥ String lockid = ss[3];//é头ç¼ç if( StringUtils.isBlank(lockid)){ //妿é头ç¼ç 为空 log.error("mqttæ¶æ¯è®¢é ==============æ ææ°æ®====="+topic+param); return; } JSONObject pjson = JSONObject.parseObject(param); MemberRides bikes = new MemberRides(); bikes.setBikeCode(pjson.getString("bikeCode")); bikes.setBackLockId( lockid); bikes.setBackSiteId( siteid); bikes.setBackCommondId(logId); result = memberRidesService.mqttCloseBikeEvent(bikes); logInfo = "mqttæ¶æ¯è®¢é è¿è½¦æ¶æ¯"; log.info("mqttæ¶æ¯è®¢é =========è¿è½¦==========æå"); }else if(StringUtils.contains(topic, health)){ //å¿è·³æ¶æ¯= Sites site = new Sites(); site.setId(siteid); site.setOnline(Constants.ZERO); site.setLastLinkDate(new Date()); sitesMapper.updateById(site);//æ´æ°ç«ç¹ç¶æ logInfo = "mqttæ¶æ¯è®¢é å¿è·³æ¶æ¯"; log.info("mqttæ¶æ¯è®¢é =========å¿è·³æ¶æ¯==========æå"); } }else { //妿ç«ç¹ä¸ä¸çº¿æ¶æ¯ JSONObject pjson = JSONObject.parseObject(param); String clientId = String.valueOf(pjson.get("clientid")); if(clientId.contains("doumee")){ log.error("mqttæ¶æ¯è®¢é ==============æ æè®¢é ç¶æ====="+topic+param); return; } Sites site = sitesMapper.selectById(clientId); if(site == null){ log.error("mqttæ¶æ¯è®¢é ==============æ æè®¢é ç¶æ====="+topic+param); return; } if (topic.endsWith("disconnected")) { if(Constants.formatIntegerNum(site.getOnline()) == Constants.ONE){ log.error("mqttæ¶æ¯è®¢é ==============已订é ç¶ææçº¿====="+param); return; } site.setOnline(Constants.ONE); } else { if(Constants.formatIntegerNum(site.getOnline()) == Constants.ZERO){ log.error("mqttæ¶æ¯è®¢é ==============已订é ç¶æä¸çº¿====="+param); return; } site.setOnline(Constants.ZERO); } site.setLastLinkDate(new Date()); sitesMapper.updateById(site);//æ´æ°ç«ç¹ç¶æ log.info("mqttæ¶æ¯è®¢é =========ç«ç¹ä¸ä¸çº¿==========æå"); } }catch (BusinessException e){ e.printStackTrace(); server/services/src/main/java/com/doumee/service/business/impl/MemberRidesServiceImpl.java
@@ -449,14 +449,26 @@ .eq(Locks::getIsdeleted, Constants.ZERO) .last("limit 1")); if (Objects.isNull(locks)) { throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "æ«ç æ æï¼æªæ¥è¯¢å°é头信æ¯"); // locks =new Locks(); // locks.setCode(codes[1]); // locks.setSiteId(codes[0]); // deviceService.getLockInfo(locks); throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "æ«ç æ æï¼è¯¥ç«ç¹é头æä¸æ¯æååºä¸å¡å¦ï¼"); } //æ¥è¯¢é头æ¯å¦åå¨è½¦è¾ 以忝妿£å¸¸ if (Constants.formatIntegerNum(locks.getStatus())!=Constants.ZERO) { throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "å½åæ«ç éå¤´ç¶æéè¯¯ï¼æ æ³è¿è¡å¼é"); locks =new Locks(); locks.setCode(codes[1]); locks.setSiteId(codes[0]); deviceService.getLockInfo(locks); throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "å½åæ«ç éå¤´ç¶æé误ï¼å·²å°è¯æ´æ°éå¤´ç¶æï¼è¯·ç¨åéè¯ï¼"); } if (StringUtils.isBlank(locks.getBikeCode())) { throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "å½åæ«ç é头æ 车è¾ä¿¡æ¯ï¼æ æ³è¿è¡å¼é"); locks =new Locks(); locks.setCode(codes[1]); locks.setSiteId(codes[0]); deviceService.getLockInfo(locks); throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "å½åæ«ç é头æ 车è¾ä¿¡æ¯ï¼å·²å°è¯æ´æ°éå¤´ç¶æï¼è¯·ç¨åéè¯ï¼"); } MemberRides memberRides = new MemberRides(); //æ ¹æ®è½¦åæ¥è¯¢è®¡ä»·æ¹æ¡ @@ -698,6 +710,7 @@ sites.setStatus(Constants.ZERO); sites.setEditDate(date); sites.setLockNum(1); sites.setLastLinkDate(date); //æ°å¢é头 sitesMapper.insert(sites); } @@ -751,13 +764,23 @@ @Override @Transactional(rollbackFor = {BusinessException.class,Exception.class}) public int mqttCloseBikeEvent(MemberRides bikes){ Locks locks = new Locks(); locks.setSiteId(bikes.getBackSiteId()); locks.setCode(bikes.getBackLockId()); locks.setBikeCode(bikes.getBikeCode()); locks.setInfo(bikes.getBackCommondId()); //å¤çéå¤´æ°æ® mqttLockInfoEvent(locks); //å è´¹éªè¡æ¶é¿æ¥è¯¢ï¼æ°æ®åå ¸é ç½® if(StringUtils.isBlank(bikes.getBikeCode()) ||StringUtils.isBlank(bikes.getBackLockId())||StringUtils.isBlank(bikes.getBackSiteId())){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"è¿è½¦ä¸æ¥åæ°é误ï¼"); } QueryWrapper<MemberRides> wrapper = new QueryWrapper<>(); List<Integer> statusList = new ArrayList<>(); statusList.add(Constants.MEMBER_RIDES_STATUS.RIDES_RUNNING.getKey()); statusList.add(Constants.MEMBER_RIDES_STATUS.LOCKING.getKey()); wrapper.lambda().eq(MemberRides::getBikeCode, bikes.getBikeCode()); wrapper.lambda().eq(MemberRides::getStatus, Constants.MEMBER_RIDES_STATUS.RIDES_RUNNING.getKey()); wrapper.lambda().in(MemberRides::getStatus, statusList); wrapper.lambda().eq(MemberRides::getIsdeleted, Constants.ZERO); //æ ¹æ®è½¦è¾ç¼ç æ¥è¯¢éªè¡ä¸çéªè¡è®°å½ä¿¡æ¯ï¼å¦ææè¿è¡è¿è½¦æä½ MemberRides memberRides = memberRidesMapper.selectOne(wrapper.last("limit 1")); server/×ÔÐгµmqttÐÒé.md
@@ -3,47 +3,49 @@ ## sub: device/lock/{siteId}/{lockId}/info {"bikeCode":"1234567890","lockId":"kjflksjlkfsjdlk","siteId": 456,"status":0,"code":"789"} ## sub: device/lock/{siteId}/{lockId}/bike {"bikeCode":"1234567890","lockId":789,"siteId": 456,"time":"2023-10-13 10:12:90"} # èªè¡è½¦ mqtt åè®®ææ¡£ ## éä¿¡è§è - æ¯ä¸ªç«ç¹ä¸ä¸ª mqtt è¿æ¥ï¼clientId 为 SITE_ç«ç¹ç¼å· - ä¸ä¸ªç«ç¹ç±é¨ç½²å¨ä¸ä½æºä¸ç软件éè¿canæ»çº¿ä¸å¤ä¸ªééä¿¡ï¼å¹¶ä¸æå¡å¨éè¿mqttåæ¶æ¯è½¬å - siteId + lockId 为éçå¯ä¸ç´¢å¼ï¼å¨åä¸ç«ç¹ä¸ï¼lockIdä¸éå¤ ## sub: device/lock/{siteId}/{lockId}/info > **éä¿¡æ¯ï¼å¨åå§åãç¶æåæ´æ¶ä¼æ¨ééç宿´ç¶æ** ## sub: device/lock/{siteId}/{lockId}/info qos=1 > **éä¿¡æ¯ï¼å¨ç«ç¹è½¯ä»¶å¯å¨åå§åãgetInfo主é¢ï¼unlock䏻颿¶æ¶ä¼æ¨ééç宿´ç¶æ** - æ°æ® ```json { "siteId": "1015", // ç«ç¹ç¼å·,å主é¢{siteId} "lockId": 2, // éç¼å·,å主é¢{lockId} "status": 1, // ç¶æï¼0éå, 1æå¼ï¼2è¿è¡ä¸, 3å¼å¸¸, -1èªæ£ä¸ "bikeCode": "12345678" // èªè¡è½¦icå¡å·ï¼8使°å,å¦ï¼10000012ï¼æ 车为空 "bikeCode": "12345678", // èªè¡è½¦icå¡å·ï¼8使°å,å¦ï¼10000012ï¼æ 车为空 "timestamp": 1234567823423 // æ¶é´æ³ï¼ mså¼ } ``` ## pub: device/lock/{siteId}/{lockId}/getInfo > 宿¶è·åéä¿¡æ¯ ## pub: device/lock/{siteId}/{lockId}/getInfo qos=0 > 宿¶è·åéä¿¡æ¯, ç«ç¹å¨æ¶å°æ¤æ¶æ¯æ¶ï¼åéæå®è·åå°éç宿¶æ¶æ¯ï¼å¹¶åå¸å°infoä¸»é¢ - æ°æ® ```json {} ``` ## pub: device/lock/{siteId}/{lockId}/unlock ## pub: device/lock/{siteId}/{lockId}/unlock qos=0 > å¼éï¼æå失败å¯å ³æ³¨infoæ¶æ¯æ¨é - æ°æ® ```json {} ``` ## sub: device/lock/{siteId}/{lockId}/bike ## sub: device/lock/{siteId}/{lockId}/bike qos=1 > è¿è½¦, è¿è½¦æåæ¶ï¼è·å¾æè¿è½¦è¾icå¡å·æ¨é - æ°æ® ```json { "bikeCode": "12345678", "lockId": 2, "siteId": "1050", "time": "2023-10-13 10:12:90" // ç«ç¹ä¸ä½æºæ¶å°è¿è½¦æä»¤çæ¶é´ï¼ä» ååèï¼è¯·ä»¥æå¡å¨æ¶é´ä¸ºå "siteId": "1015", // ç«ç¹ç¼å·,å主é¢{siteId} "lockId": 2, // éç¼å·,å主é¢{lockId} "status": 1, // ç¶æï¼0éå, 1æå¼ï¼2è¿è¡ä¸, 3å¼å¸¸, -1èªæ£ä¸ "bikeCode": "12345678", // èªè¡è½¦icå¡å·ï¼8使°å,å¦ï¼10000012ï¼æ 车为空 "timestamp": 1234567823423 // æ¶é´æ³ï¼ mså¼ï¼ç«ç¹ä¸ä½æºæ¶å°è¿è½¦æä»¤çæ¶é´ï¼ä» ååèï¼è¯·ä»¥æå¡å¨æ¶é´ä¸ºå } ``` ```