完成阿里token获取
This commit is contained in:
parent
942e911f02
commit
8c3c71309c
@ -0,0 +1,26 @@
|
|||||||
|
package com.qiuguo.iot.base.constans;
|
||||||
|
|
||||||
|
public class HttpHeaderConstans {
|
||||||
|
public static String API_TYPE = "api-type";
|
||||||
|
public static String API_TOKEN = "api-token";
|
||||||
|
|
||||||
|
public static String BOX_SIGNATURE = "signature";
|
||||||
|
|
||||||
|
public static String FIRMWARE_VERSION = "firmwareVersion";
|
||||||
|
|
||||||
|
public static String DEVICT_TYPE = "deviceType";
|
||||||
|
|
||||||
|
public static String OS_VERSION = "osVersion";
|
||||||
|
|
||||||
|
public static String OS = "os";
|
||||||
|
|
||||||
|
public static String USER_ID = "userId";
|
||||||
|
|
||||||
|
public static String BOX_BIND = "isBind";
|
||||||
|
|
||||||
|
public static String BOX_SN = "sn";
|
||||||
|
|
||||||
|
public static String TIME = "time";
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -29,4 +29,8 @@ public class RedisConstans {
|
|||||||
public static String USER_BOX_INFO = "user_box_info:";
|
public static String USER_BOX_INFO = "user_box_info:";
|
||||||
|
|
||||||
public static String TY_QUEUE_LIST = "ty_queue_list:"; //通义千问的前缀
|
public static String TY_QUEUE_LIST = "ty_queue_list:"; //通义千问的前缀
|
||||||
|
/**
|
||||||
|
* 阿里语音合成token
|
||||||
|
*/
|
||||||
|
public static String ALI_TTS_TOKEN = "ali_tts_token";
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,6 +2,8 @@ package com.qiuguo.iot.data.service.device;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import com.qiuguo.iot.base.constans.RedisConstans;
|
||||||
import com.qiuguo.iot.base.enums.YesNo;
|
import com.qiuguo.iot.base.enums.YesNo;
|
||||||
import com.qiuguo.iot.base.utils.StringUtils;
|
import com.qiuguo.iot.base.utils.StringUtils;
|
||||||
import com.qiuguo.iot.data.entity.device.DeviceInfoEntity;
|
import com.qiuguo.iot.data.entity.device.DeviceInfoEntity;
|
||||||
@ -17,6 +19,7 @@ import org.hswebframework.web.crud.service.GenericReactiveCrudService;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import reactor.core.publisher.Mono;
|
import reactor.core.publisher.Mono;
|
||||||
|
|
||||||
|
import java.time.Duration;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
|
|||||||
BIN
iot-modules/.DS_Store
vendored
Normal file
BIN
iot-modules/.DS_Store
vendored
Normal file
Binary file not shown.
@ -3,17 +3,10 @@ spring:
|
|||||||
nacos:
|
nacos:
|
||||||
discovery:
|
discovery:
|
||||||
# 服务注册地址
|
# 服务注册地址
|
||||||
<<<<<<< HEAD
|
|
||||||
server-addr: 8.139.5.211:30731
|
|
||||||
config:
|
|
||||||
# 配置中心地址
|
|
||||||
server-addr: 8.139.5.211:30731
|
|
||||||
=======
|
|
||||||
server-addr: qiuguo-nacos.qiuguo-cloud:8848
|
server-addr: qiuguo-nacos.qiuguo-cloud:8848
|
||||||
config:
|
config:
|
||||||
# 配置中心地址
|
# 配置中心地址
|
||||||
server-addr: qiuguo-nacos.qiuguo-cloud:8848
|
server-addr: qiuguo-nacos.qiuguo-cloud:8848
|
||||||
>>>>>>> 64da585a2f5a786febdbeaafd130d2fd086ee8e1
|
|
||||||
# 配置文件格式
|
# 配置文件格式
|
||||||
file-extension: yml
|
file-extension: yml
|
||||||
# 共享配置
|
# 共享配置
|
||||||
|
|||||||
BIN
iot-modules/iot-box-websocket-api/.DS_Store
vendored
Normal file
BIN
iot-modules/iot-box-websocket-api/.DS_Store
vendored
Normal file
Binary file not shown.
@ -88,6 +88,19 @@
|
|||||||
<version>3.1.8</version>
|
<version>3.1.8</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.alibaba.nls</groupId>
|
||||||
|
<artifactId>nls-sdk-common</artifactId>
|
||||||
|
<version>2.2.10</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- for token -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.aliyun</groupId>
|
||||||
|
<artifactId>aliyun-java-sdk-core</artifactId>
|
||||||
|
<version>4.6.4</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|||||||
BIN
iot-modules/iot-box-websocket-api/src/.DS_Store
vendored
Normal file
BIN
iot-modules/iot-box-websocket-api/src/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
iot-modules/iot-box-websocket-api/src/main/.DS_Store
vendored
Normal file
BIN
iot-modules/iot-box-websocket-api/src/main/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
iot-modules/iot-box-websocket-api/src/main/java/.DS_Store
vendored
Normal file
BIN
iot-modules/iot-box-websocket-api/src/main/java/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
iot-modules/iot-box-websocket-api/src/main/java/com/.DS_Store
vendored
Normal file
BIN
iot-modules/iot-box-websocket-api/src/main/java/com/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/.DS_Store
vendored
Normal file
BIN
iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/.DS_Store
vendored
Normal file
BIN
iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/.DS_Store
vendored
Normal file
BIN
iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/.DS_Store
vendored
Normal file
BIN
iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/.DS_Store
vendored
Normal file
Binary file not shown.
BIN
iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/.DS_Store
vendored
Normal file
BIN
iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/.DS_Store
vendored
Normal file
Binary file not shown.
@ -1,17 +1,35 @@
|
|||||||
package com.qiuguo.iot.box.websocket.api.controller;
|
package com.qiuguo.iot.box.websocket.api.controller;
|
||||||
|
|
||||||
|
import cn.hutool.crypto.digest.MD5;
|
||||||
|
import com.alibaba.fastjson.JSONObject;
|
||||||
|
import com.alibaba.nls.client.AccessToken;
|
||||||
|
import com.qiuguo.iot.base.constans.HttpHeaderConstans;
|
||||||
|
import com.qiuguo.iot.base.constans.RedisConstans;
|
||||||
|
import com.qiuguo.iot.base.enums.AskTypeEnum;
|
||||||
|
import com.qiuguo.iot.base.utils.StringUtils;
|
||||||
|
import com.qiuguo.iot.box.websocket.api.domain.box.BoxSession;
|
||||||
import com.qiuguo.iot.box.websocket.api.service.WebsocketService;
|
import com.qiuguo.iot.box.websocket.api.service.WebsocketService;
|
||||||
|
import com.qiuguo.iot.data.entity.device.DeviceInfoEntity;
|
||||||
|
import com.qiuguo.iot.data.request.device.DeviceInfoRequest;
|
||||||
|
import com.qiuguo.iot.data.service.device.DeviceInfoService;
|
||||||
import com.qiuguo.iot.data.service.system.SystemTalkAnswerConfigService;
|
import com.qiuguo.iot.data.service.system.SystemTalkAnswerConfigService;
|
||||||
import com.qiuguo.iot.third.nlp.Nlp;
|
import com.qiuguo.iot.third.nlp.Nlp;
|
||||||
import com.qiuguo.iot.third.service.LacNlpService;
|
import com.qiuguo.iot.third.service.LacNlpService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
|
import org.springframework.data.redis.core.ReactiveStringRedisTemplate;
|
||||||
|
import org.springframework.http.server.reactive.ServerHttpRequest;
|
||||||
|
import org.springframework.web.HttpRequestHandler;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import reactor.core.publisher.Mono;
|
import reactor.core.publisher.Mono;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import java.time.Duration;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@RequestMapping("/websocket")
|
@RequestMapping("/websocket")
|
||||||
@ -25,6 +43,25 @@ public class WebsocketController {
|
|||||||
@Autowired
|
@Autowired
|
||||||
SystemTalkAnswerConfigService systemTalkAnswerConfigService;
|
SystemTalkAnswerConfigService systemTalkAnswerConfigService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ReactiveStringRedisTemplate reactiveStringRedisTemplate;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private DeviceInfoService deviceInfoService;
|
||||||
|
|
||||||
|
@Value("${device.checkTimeout}")
|
||||||
|
private Boolean checkTimeout;
|
||||||
|
|
||||||
|
@Value("${device.timeout}")
|
||||||
|
private Long timeOut;//2分钟
|
||||||
|
|
||||||
|
@Value("${Ali.accesskeId}")
|
||||||
|
private String aliAccessKeyId;
|
||||||
|
|
||||||
|
@Value("${Ali.accesskeySecret}")
|
||||||
|
private String aliAccessSecret;
|
||||||
|
|
||||||
|
|
||||||
@GetMapping("/push/message")
|
@GetMapping("/push/message")
|
||||||
public Mono<String> pushMessage(@RequestParam String message, @RequestParam String id, @RequestParam Integer type) {
|
public Mono<String> pushMessage(@RequestParam String message, @RequestParam String id, @RequestParam Integer type) {
|
||||||
|
|
||||||
@ -43,4 +80,92 @@ public class WebsocketController {
|
|||||||
|
|
||||||
return lacNlpService.geSingletNlp(value);
|
return lacNlpService.geSingletNlp(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Mono<DeviceInfoEntity> getDeviceInfo(String sn){
|
||||||
|
DeviceInfoRequest request = new DeviceInfoRequest();
|
||||||
|
request.setSn(sn);
|
||||||
|
return deviceInfoService.selectDeviceInfoByRequest(request).defaultIfEmpty(new DeviceInfoEntity()).map(dv -> {
|
||||||
|
if(dv.getId() != null){
|
||||||
|
String redis = JSONObject.toJSONString(dv);
|
||||||
|
reactiveStringRedisTemplate.opsForValue().set(RedisConstans.DEVICE_INFO + dv.getSn(), redis, Duration.ofHours(1)).subscribe();//直接提交订阅
|
||||||
|
}
|
||||||
|
|
||||||
|
return dv;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/tts/token")
|
||||||
|
public Mono<String> getTtsToken(ServerHttpRequest serverHttpRequest) {
|
||||||
|
serverHttpRequest.getHeaders();
|
||||||
|
|
||||||
|
Long linkTime = Long.valueOf(serverHttpRequest.getHeaders().get(HttpHeaderConstans.TIME).get(0));
|
||||||
|
String sn = serverHttpRequest.getHeaders().get(HttpHeaderConstans.BOX_SN).get(0);
|
||||||
|
String signature = serverHttpRequest.getHeaders().get(HttpHeaderConstans.BOX_SIGNATURE).get(0);
|
||||||
|
if(checkTimeout && System.currentTimeMillis() - linkTime > timeOut){
|
||||||
|
//关闭连接
|
||||||
|
log.info("设备{},请求数据已超时", sn);
|
||||||
|
return Mono.just("请求超时");
|
||||||
|
}
|
||||||
|
|
||||||
|
return reactiveStringRedisTemplate.opsForValue()
|
||||||
|
.get(RedisConstans.DEVICE_INFO + sn).defaultIfEmpty("")
|
||||||
|
.flatMap(s -> {
|
||||||
|
if(com.qiuguo.iot.base.utils.StringUtils.isNotBlank(s)){
|
||||||
|
try{
|
||||||
|
DeviceInfoEntity dv = JSONObject.parseObject(s, DeviceInfoEntity.class);
|
||||||
|
if(dv.getId() == null){
|
||||||
|
log.info("redis设备缓存异常,清楚");
|
||||||
|
return getDeviceInfo(sn);
|
||||||
|
}
|
||||||
|
return Mono.just(dv);
|
||||||
|
}catch (Exception e){
|
||||||
|
log.info("转换异常,清除redis。下次连接成功{}", e);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return getDeviceInfo(sn);
|
||||||
|
|
||||||
|
}).flatMap(dv ->{
|
||||||
|
String snMd5 = MD5.create().digestHex(sn).toUpperCase();
|
||||||
|
String wifiMd5 = MD5.create().digestHex(dv.getWifiMac()).toUpperCase();
|
||||||
|
String btMd5 = MD5.create().digestHex(dv.getBtMac()).toUpperCase();
|
||||||
|
String signalMd5 = MD5.create().digestHex(snMd5 + wifiMd5 + btMd5 + linkTime + dv.getKey()).toUpperCase();
|
||||||
|
if(!signalMd5.equals(signature)){
|
||||||
|
log.info("设备{},验签失败。正常签:{}", sn, signalMd5);
|
||||||
|
|
||||||
|
return Mono.just("验签失败");
|
||||||
|
}else{
|
||||||
|
log.info("设备{},验签成功", sn);
|
||||||
|
return reactiveStringRedisTemplate.opsForValue()
|
||||||
|
.get(RedisConstans.ALI_TTS_TOKEN).defaultIfEmpty("")
|
||||||
|
.flatMap(toen -> {
|
||||||
|
if(StringUtils.isNotBlank(toen)){
|
||||||
|
return Mono.just(toen);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
AccessToken accessToken = new AccessToken(aliAccessKeyId, aliAccessSecret);
|
||||||
|
|
||||||
|
|
||||||
|
accessToken.apply();
|
||||||
|
|
||||||
|
String token = accessToken.getToken();
|
||||||
|
long expireTime = accessToken.getExpireTime() - 600000L;//提前10分钟更新
|
||||||
|
//return Mono.just(token);
|
||||||
|
return reactiveStringRedisTemplate.opsForValue().set(RedisConstans.ALI_TTS_TOKEN,
|
||||||
|
token, Duration.ofMillis(expireTime)).flatMap(t -> {
|
||||||
|
return Mono.just(token);
|
||||||
|
});
|
||||||
|
|
||||||
|
}catch (Exception e){
|
||||||
|
log.info("获取阿里Token异常{}", e);
|
||||||
|
}
|
||||||
|
return Mono.just("获取token异常");
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10,4 +10,8 @@ public class BoxSession extends BaseSession {
|
|||||||
* TTS合成声音的声音标识
|
* TTS合成声音的声音标识
|
||||||
*/
|
*/
|
||||||
String ttsId;
|
String ttsId;
|
||||||
|
/**
|
||||||
|
* 阿里token
|
||||||
|
*/
|
||||||
|
String aliToken;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,13 @@
|
|||||||
|
package com.qiuguo.iot.box.websocket.api.domain.user;
|
||||||
|
|
||||||
|
import com.qiuguo.iot.box.websocket.api.domain.BaseSession;
|
||||||
|
import com.qiuguo.iot.data.resp.third.MusicResp;
|
||||||
|
import lombok.Data;
|
||||||
|
import org.springframework.web.reactive.socket.WebSocketMessage;
|
||||||
|
import org.springframework.web.reactive.socket.WebSocketSession;
|
||||||
|
import reactor.core.publisher.FluxSink;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
public class UserSession extends BaseSession {
|
||||||
|
|
||||||
|
}
|
||||||
@ -11,6 +11,7 @@ import com.qiuguo.iot.box.websocket.api.domain.box.resp.ActionResp;
|
|||||||
import com.qiuguo.iot.box.websocket.api.domain.box.resp.BoxMessageResp;
|
import com.qiuguo.iot.box.websocket.api.domain.box.resp.BoxMessageResp;
|
||||||
import com.qiuguo.iot.box.websocket.api.domain.box.resp.DateTimeResp;
|
import com.qiuguo.iot.box.websocket.api.domain.box.resp.DateTimeResp;
|
||||||
import com.qiuguo.iot.box.websocket.api.domain.box.resp.WeatherResp;
|
import com.qiuguo.iot.box.websocket.api.domain.box.resp.WeatherResp;
|
||||||
|
import com.qiuguo.iot.box.websocket.api.domain.user.UserSession;
|
||||||
import com.qiuguo.iot.data.constants.YunxiRabbitConst;
|
import com.qiuguo.iot.data.constants.YunxiRabbitConst;
|
||||||
import com.qiuguo.iot.data.entity.device.DeviceUserBindEntity;
|
import com.qiuguo.iot.data.entity.device.DeviceUserBindEntity;
|
||||||
import com.qiuguo.iot.data.entity.device.DeviceUserTalkRecordEntity;
|
import com.qiuguo.iot.data.entity.device.DeviceUserTalkRecordEntity;
|
||||||
@ -106,12 +107,11 @@ public class BaseWebSocketProcess {
|
|||||||
protected SystemTalkBindU3dService systemTalkBindU3dService;
|
protected SystemTalkBindU3dService systemTalkBindU3dService;
|
||||||
|
|
||||||
|
|
||||||
protected static ConcurrentHashMap<Long, BaseSession> userGroup = new ConcurrentHashMap<>();
|
protected static ConcurrentHashMap<Long, UserSession> userGroup = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
protected static ConcurrentHashMap<String, BoxSession> boxGroup = new ConcurrentHashMap<>();
|
protected static ConcurrentHashMap<String, BoxSession> boxGroup = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
protected static String apiType = "api-type";
|
|
||||||
protected static String apiToken = "api-token";
|
|
||||||
|
|
||||||
private String getSendStr(StringBuilder sb, String message){
|
private String getSendStr(StringBuilder sb, String message){
|
||||||
String old = sb.toString() + message;
|
String old = sb.toString() + message;
|
||||||
@ -194,7 +194,7 @@ public class BaseWebSocketProcess {
|
|||||||
return Mono.empty();
|
return Mono.empty();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
})/*.subscribeOn(Schedulers.boundedElastic()).subscribe()*/;
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private Mono<Integer> saveTalkRecord(BaseSession baseSession, Action action, String text){
|
private Mono<Integer> saveTalkRecord(BaseSession baseSession, Action action, String text){
|
||||||
@ -333,8 +333,9 @@ public class BaseWebSocketProcess {
|
|||||||
}
|
}
|
||||||
return weatherService.tianqiApi(req).flatMap(t ->{
|
return weatherService.tianqiApi(req).flatMap(t ->{
|
||||||
if(t.getData() == null){
|
if(t.getData() == null){
|
||||||
return sendMessage(action, baseSession, "该城市不支持天气查询", action.getSystemTalkAnswerConfigEntity().getAnswerType());
|
return sendMessage(action, baseSession,
|
||||||
//return Mono.empty();
|
"该城市不支持天气查询",
|
||||||
|
action.getSystemTalkAnswerConfigEntity().getAnswerType());
|
||||||
}
|
}
|
||||||
|
|
||||||
TianqiapiItemResp item = null;
|
TianqiapiItemResp item = null;
|
||||||
@ -856,7 +857,7 @@ public class BaseWebSocketProcess {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public BaseSession getUserSessionWithUserId(Long userId) {
|
public UserSession getUserSessionWithUserId(Long userId) {
|
||||||
if(userGroup.containsKey(userId)){
|
if(userGroup.containsKey(userId)){
|
||||||
return userGroup.get(userId);
|
return userGroup.get(userId);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -3,6 +3,7 @@ package com.qiuguo.iot.box.websocket.api.handler;
|
|||||||
import cn.hutool.crypto.digest.MD5;
|
import cn.hutool.crypto.digest.MD5;
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.qiuguo.iot.base.annotation.WebSocketMapping;
|
import com.qiuguo.iot.base.annotation.WebSocketMapping;
|
||||||
|
import com.qiuguo.iot.base.constans.HttpHeaderConstans;
|
||||||
import com.qiuguo.iot.base.constans.RedisConstans;
|
import com.qiuguo.iot.base.constans.RedisConstans;
|
||||||
import com.qiuguo.iot.base.enums.*;
|
import com.qiuguo.iot.base.enums.*;
|
||||||
import com.qiuguo.iot.base.model.UserDeviceInfoModel;
|
import com.qiuguo.iot.base.model.UserDeviceInfoModel;
|
||||||
@ -31,6 +32,7 @@ import reactor.util.context.Context;
|
|||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
|
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@WebSocketMapping("/websocket/box")
|
@WebSocketMapping("/websocket/box")
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@ -51,14 +53,13 @@ public class BoxWebSocketHandler extends BaseWebSocketProcess implements WebSock
|
|||||||
private NlpService nlpService;
|
private NlpService nlpService;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Mono<Void> handle(WebSocketSession session) {
|
public Mono<Void> handle(WebSocketSession session) {
|
||||||
// 在生产环境中,需对url中的参数进行检验,如token,不符合要求的连接的直接关闭
|
// 在生产环境中,需对url中的参数进行检验,如token,不符合要求的连接的直接关闭
|
||||||
HandshakeInfo handshakeInfo = session.getHandshakeInfo();
|
HandshakeInfo handshakeInfo = session.getHandshakeInfo();
|
||||||
HttpHeaders headers = handshakeInfo.getHeaders();
|
HttpHeaders headers = handshakeInfo.getHeaders();
|
||||||
String sn = headers.get("sn").get(0);
|
String sn = headers.get(HttpHeaderConstans.BOX_SN).get(0);
|
||||||
Long linkTime = Long.parseLong(headers.get("time").get(0));
|
Long linkTime = Long.parseLong(headers.get(HttpHeaderConstans.TIME).get(0));
|
||||||
if(checkTimeout && System.currentTimeMillis() - linkTime > timeOut){
|
if(checkTimeout && System.currentTimeMillis() - linkTime > timeOut){
|
||||||
//关闭连接
|
//关闭连接
|
||||||
log.info("设备{},请求数据已超时", sn);
|
log.info("设备{},请求数据已超时", sn);
|
||||||
@ -72,9 +73,9 @@ public class BoxWebSocketHandler extends BaseWebSocketProcess implements WebSock
|
|||||||
log.info("局域网IP替换成杭州ip:115.205.2.137");
|
log.info("局域网IP替换成杭州ip:115.205.2.137");
|
||||||
ip = "115.205.2.137";
|
ip = "115.205.2.137";
|
||||||
}
|
}
|
||||||
String signature = headers.get("signature").get(0);
|
String signature = headers.get(HttpHeaderConstans.BOX_SIGNATURE).get(0);
|
||||||
Long userId = Long.parseLong(headers.get("userId").get(0));
|
Long userId = Long.parseLong(headers.get(HttpHeaderConstans.USER_ID).get(0));
|
||||||
Integer isBind = Integer.parseInt(headers.get("isBind").get(0));
|
Integer isBind = Integer.parseInt(headers.get(HttpHeaderConstans.BOX_BIND).get(0));
|
||||||
|
|
||||||
//
|
//
|
||||||
BoxSession boxSession = new BoxSession();
|
BoxSession boxSession = new BoxSession();
|
||||||
@ -268,6 +269,8 @@ public class BoxWebSocketHandler extends BaseWebSocketProcess implements WebSock
|
|||||||
|
|
||||||
}else{
|
}else{
|
||||||
boxSession.setTtsId(entity.getTts());
|
boxSession.setTtsId(entity.getTts());
|
||||||
|
|
||||||
|
|
||||||
if(entity.getIsBind().equals(YesNo.YES.getCode())){
|
if(entity.getIsBind().equals(YesNo.YES.getCode())){
|
||||||
//通知用户端设备绑定成功
|
//通知用户端设备绑定成功
|
||||||
sendNoticeToUser(userId, "设备联网成功,设备序列号:" + dv.getSn(), AskTypeEnum.BOX_ON_LINE.getCode());
|
sendNoticeToUser(userId, "设备联网成功,设备序列号:" + dv.getSn(), AskTypeEnum.BOX_ON_LINE.getCode());
|
||||||
|
|||||||
@ -2,13 +2,13 @@ package com.qiuguo.iot.box.websocket.api.handler;
|
|||||||
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.qiuguo.iot.base.annotation.WebSocketMapping;
|
import com.qiuguo.iot.base.annotation.WebSocketMapping;
|
||||||
|
import com.qiuguo.iot.base.constans.HttpHeaderConstans;
|
||||||
import com.qiuguo.iot.base.enums.AskTypeEnum;
|
import com.qiuguo.iot.base.enums.AskTypeEnum;
|
||||||
import com.qiuguo.iot.base.enums.DeviceTypeEnum;
|
import com.qiuguo.iot.base.enums.DeviceTypeEnum;
|
||||||
import com.qiuguo.iot.base.enums.ResponeEnum;
|
import com.qiuguo.iot.base.enums.ResponeEnum;
|
||||||
import com.qiuguo.iot.base.enums.YesNo;
|
import com.qiuguo.iot.base.enums.YesNo;
|
||||||
import com.qiuguo.iot.base.utils.WebClientUtils;
|
import com.qiuguo.iot.base.utils.WebClientUtils;
|
||||||
import com.qiuguo.iot.box.websocket.api.domain.BaseSession;
|
import com.qiuguo.iot.box.websocket.api.domain.user.UserSession;
|
||||||
import com.qiuguo.iot.box.websocket.api.domain.box.BoxSession;
|
|
||||||
import com.qiuguo.iot.box.websocket.api.domain.user.UserTalkMessage;
|
import com.qiuguo.iot.box.websocket.api.domain.user.UserTalkMessage;
|
||||||
import com.qiuguo.iot.box.websocket.api.filter.LogMdcConfiguration;
|
import com.qiuguo.iot.box.websocket.api.filter.LogMdcConfiguration;
|
||||||
import com.qiuguo.iot.box.websocket.api.filter.LogWebFilter;
|
import com.qiuguo.iot.box.websocket.api.filter.LogWebFilter;
|
||||||
@ -58,17 +58,17 @@ public class CustomerWebSocketHandler extends BaseWebSocketProcess implements We
|
|||||||
HandshakeInfo handshakeInfo = session.getHandshakeInfo();
|
HandshakeInfo handshakeInfo = session.getHandshakeInfo();
|
||||||
HttpHeaders headers = handshakeInfo.getHeaders();
|
HttpHeaders headers = handshakeInfo.getHeaders();
|
||||||
//List<String> tokens = headers.get("token");
|
//List<String> tokens = headers.get("token");
|
||||||
String type = headers.get(apiType).get(0);
|
String type = headers.get(HttpHeaderConstans.API_TYPE).get(0);
|
||||||
String token = headers.get(apiToken).get(0);
|
String token = headers.get(HttpHeaderConstans.API_TOKEN).get(0);
|
||||||
Long userId = Long.valueOf(headers.get("userId").get(0));
|
Long userId = Long.valueOf(headers.get(HttpHeaderConstans.USER_ID).get(0));
|
||||||
Long linkTime = Long.parseLong(headers.get("time").get(0));
|
Long linkTime = Long.parseLong(headers.get(HttpHeaderConstans.TIME).get(0));
|
||||||
if(checkTimeout && System.currentTimeMillis() - linkTime > timeOut){
|
if(checkTimeout && System.currentTimeMillis() - linkTime > timeOut){
|
||||||
//关闭连接
|
//关闭连接
|
||||||
log.info("用户{},请求数据已超时", userId);
|
log.info("用户{},请求数据已超时", userId);
|
||||||
return session.close();
|
return session.close();
|
||||||
}
|
}
|
||||||
String ip = headers.get(LogWebFilter.HEAD_IP).get(0);
|
String ip = headers.get(LogWebFilter.HEAD_IP).get(0);
|
||||||
BaseSession userSession = new BaseSession();
|
UserSession userSession = new UserSession();
|
||||||
userSession.setUserId(userId);
|
userSession.setUserId(userId);
|
||||||
userSession.setSession(session);
|
userSession.setSession(session);
|
||||||
userSession.setCustomerIP(ip);
|
userSession.setCustomerIP(ip);
|
||||||
@ -105,12 +105,12 @@ public class CustomerWebSocketHandler extends BaseWebSocketProcess implements We
|
|||||||
}).then();
|
}).then();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Mono<Void> newMessage(WebSocketMessage webSocketMessage, BaseSession userSession){
|
private Mono<Void> newMessage(WebSocketMessage webSocketMessage, UserSession userSession){
|
||||||
MDC.put(LogMdcConfiguration.PRINT_LOG_ID, userSession.getLogId());
|
MDC.put(LogMdcConfiguration.PRINT_LOG_ID, userSession.getLogId());
|
||||||
String text = webSocketMessage.getPayloadAsText();
|
String text = webSocketMessage.getPayloadAsText();
|
||||||
log.info("收到用户消息:{}", text);
|
log.info("收到用户消息:{}", text);
|
||||||
UserTalkMessage userTalkMessage = JSONObject.parseObject(text, UserTalkMessage.class);
|
UserTalkMessage userTalkMessage = JSONObject.parseObject(text, UserTalkMessage.class);
|
||||||
BaseSession userSession1 = getUserSessionWithUserId(userTalkMessage.getUserId());
|
UserSession userSession1 = getUserSessionWithUserId(userTalkMessage.getUserId());
|
||||||
if(!userSession.equals(userSession1)){
|
if(!userSession.equals(userSession1)){
|
||||||
log.info("消息发送异常,或者未验签就收到信息不是同一个链接。可能传错用户ID");
|
log.info("消息发送异常,或者未验签就收到信息不是同一个链接。可能传错用户ID");
|
||||||
return closeSendMsg(userSession, "请等待验签结束或者用户ID可能错误", AskTypeEnum.TTS.getCode()).flatMap(b -> {
|
return closeSendMsg(userSession, "请等待验签结束或者用户ID可能错误", AskTypeEnum.TTS.getCode()).flatMap(b -> {
|
||||||
@ -127,8 +127,8 @@ public class CustomerWebSocketHandler extends BaseWebSocketProcess implements We
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Mono<Void> disconnect(BaseSession userSession){
|
private Mono<Void> disconnect(UserSession userSession){
|
||||||
BaseSession userSession1 = getUserSessionWithUserId(userSession.getUserId());
|
UserSession userSession1 = getUserSessionWithUserId(userSession.getUserId());
|
||||||
if(userSession == userSession1){
|
if(userSession == userSession1){
|
||||||
userGroup.remove(userSession.getUserId());//断链后及时移除
|
userGroup.remove(userSession.getUserId());//断链后及时移除
|
||||||
log.info("用户断开连接userId:{}", userSession.getUserId());
|
log.info("用户断开连接userId:{}", userSession.getUserId());
|
||||||
@ -136,10 +136,10 @@ public class CustomerWebSocketHandler extends BaseWebSocketProcess implements We
|
|||||||
return Mono.empty();
|
return Mono.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
private Mono<Void> checkToken(BaseSession userSession, String type, String token, Long userId){
|
private Mono<Void> checkToken(UserSession userSession, String type, String token, Long userId){
|
||||||
Map<String, String> reqHead = new HashMap<>();
|
Map<String, String> reqHead = new HashMap<>();
|
||||||
reqHead.put(apiType, type);
|
reqHead.put(HttpHeaderConstans.API_TYPE, type);
|
||||||
reqHead.put(apiToken, token);
|
reqHead.put(HttpHeaderConstans.API_TOKEN, token);
|
||||||
return WebClientUtils.get(checkTokenUrl, reqHead).defaultIfEmpty(new JSONObject()).flatMap(jsonObject -> {
|
return WebClientUtils.get(checkTokenUrl, reqHead).defaultIfEmpty(new JSONObject()).flatMap(jsonObject -> {
|
||||||
log.info("验签获取的数据{}", jsonObject);
|
log.info("验签获取的数据{}", jsonObject);
|
||||||
if(jsonObject.getInteger("code").equals(ResponeEnum.SUCESS.getCode())){
|
if(jsonObject.getInteger("code").equals(ResponeEnum.SUCESS.getCode())){
|
||||||
@ -165,7 +165,7 @@ public class CustomerWebSocketHandler extends BaseWebSocketProcess implements We
|
|||||||
}else{
|
}else{
|
||||||
normalSendMsg(userSession, "您暂未绑定果宝儿Box,快去绑定吧", AskTypeEnum.TTS.getCode());
|
normalSendMsg(userSession, "您暂未绑定果宝儿Box,快去绑定吧", AskTypeEnum.TTS.getCode());
|
||||||
}
|
}
|
||||||
BaseSession oldUserSession = getUserSessionWithUserId(userId);
|
UserSession oldUserSession = getUserSessionWithUserId(userId);
|
||||||
userGroup.put(userId, userSession);
|
userGroup.put(userId, userSession);
|
||||||
if(oldUserSession != null){
|
if(oldUserSession != null){
|
||||||
return closeSendMsg(oldUserSession, "您在其他地方登录", AskTypeEnum.TTS.getCode());
|
return closeSendMsg(oldUserSession, "您在其他地方登录", AskTypeEnum.TTS.getCode());
|
||||||
|
|||||||
BIN
iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/service/.DS_Store
vendored
Normal file
BIN
iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/service/.DS_Store
vendored
Normal file
Binary file not shown.
@ -1,4 +0,0 @@
|
|||||||
package com.qiuguo.iot.box.websocket.api.service;
|
|
||||||
|
|
||||||
public interface IActionService {
|
|
||||||
}
|
|
||||||
@ -1,6 +0,0 @@
|
|||||||
package com.qiuguo.iot.box.websocket.api.service.impl;
|
|
||||||
|
|
||||||
import com.qiuguo.iot.box.websocket.api.service.IActionService;
|
|
||||||
|
|
||||||
public class QianWenActionServiceImpl implements IActionService {
|
|
||||||
}
|
|
||||||
@ -52,4 +52,6 @@ lac:
|
|||||||
url: http://192.168.8.211:6000/qg_human/lac_word
|
url: http://192.168.8.211:6000/qg_human/lac_word
|
||||||
|
|
||||||
Ali:
|
Ali:
|
||||||
qianwen: 'sk-8d64677afaf6404cb83ce1910b5b2558'
|
qianwen: 'sk-8d64677afaf6404cb83ce1910b5b2558'
|
||||||
|
accesskeId: 'LTAI5t7d1iZb18SvGQhtDnyN'
|
||||||
|
accesskeySecret: 'j2Cp3uCDGuiA7xZIJmYOCmDhJl9HuJ'
|
||||||
Loading…
x
Reference in New Issue
Block a user