From 8c3c71309c7e965339193a5b6ad65d9a1dc14db6 Mon Sep 17 00:00:00 2001 From: wulin Date: Tue, 24 Oct 2023 10:36:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E9=98=BF=E9=87=8Ctoken?= =?UTF-8?q?=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 6148 -> 6148 bytes .../iot/base/constans/HttpHeaderConstans.java | 26 ++++ .../iot/base/constans/RedisConstans.java | 4 + .../service/device/DeviceInfoService.java | 3 + iot-modules/.DS_Store | Bin 0 -> 6148 bytes .../src/main/resources/bootstrap-prod.yml | 7 - iot-modules/iot-box-websocket-api/.DS_Store | Bin 0 -> 6148 bytes iot-modules/iot-box-websocket-api/pom.xml | 13 ++ .../iot-box-websocket-api/src/.DS_Store | Bin 0 -> 6148 bytes .../iot-box-websocket-api/src/main/.DS_Store | Bin 0 -> 6148 bytes .../src/main/java/.DS_Store | Bin 0 -> 6148 bytes .../src/main/java/com/.DS_Store | Bin 0 -> 6148 bytes .../src/main/java/com/qiuguo/.DS_Store | Bin 0 -> 6148 bytes .../src/main/java/com/qiuguo/iot/.DS_Store | Bin 0 -> 6148 bytes .../main/java/com/qiuguo/iot/box/.DS_Store | Bin 0 -> 6148 bytes .../com/qiuguo/iot/box/websocket/.DS_Store | Bin 0 -> 6148 bytes .../qiuguo/iot/box/websocket/api/.DS_Store | Bin 0 -> 6148 bytes .../api/controller/WebsocketController.java | 125 ++++++++++++++++++ .../websocket/api/domain/box/BoxSession.java | 4 + .../api/domain/user/UserSession.java | 13 ++ .../api/handler/BaseWebSocketProcess.java | 15 ++- .../api/handler/BoxWebSocketHandler.java | 15 ++- .../api/handler/CustomerWebSocketHandler.java | 30 ++--- .../iot/box/websocket/api/service/.DS_Store | Bin 0 -> 6148 bytes .../websocket/api/service/IActionService.java | 4 - .../impl/QianWenActionServiceImpl.java | 6 - .../src/main/resources/bootstrap-dev.yml | 4 +- 27 files changed, 223 insertions(+), 46 deletions(-) create mode 100644 iot-common/iot-base/src/main/java/com/qiuguo/iot/base/constans/HttpHeaderConstans.java create mode 100644 iot-modules/.DS_Store create mode 100644 iot-modules/iot-box-websocket-api/.DS_Store create mode 100644 iot-modules/iot-box-websocket-api/src/.DS_Store create mode 100644 iot-modules/iot-box-websocket-api/src/main/.DS_Store create mode 100644 iot-modules/iot-box-websocket-api/src/main/java/.DS_Store create mode 100644 iot-modules/iot-box-websocket-api/src/main/java/com/.DS_Store create mode 100644 iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/.DS_Store create mode 100644 iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/.DS_Store create mode 100644 iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/.DS_Store create mode 100644 iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/.DS_Store create mode 100644 iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/.DS_Store create mode 100644 iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/domain/user/UserSession.java create mode 100644 iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/service/.DS_Store delete mode 100644 iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/service/IActionService.java delete mode 100644 iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/service/impl/QianWenActionServiceImpl.java diff --git a/.DS_Store b/.DS_Store index c3c62275a9450203642b573c2c6fa01926ae250c..2ca9dd2696a8ca9ea709237640c29ddf20a82781 100644 GIT binary patch delta 205 zcmZoMXfc=|#>B)qu~2NHo}wrV0|Nsi1A_nqLoP!;LkdGFLk>ggW=5vvjOrjMZiY;t za0!DhvNS_+Qh9MfQcivnP{sDiDvX6{;?>m#Itu1SwK@vbhUS(=ItqpcM#iB`mu~2NHo}wrd0|Nsi1A_oVQh9MfQcivnkiTPM;qu7_A}pJQn7^`Y k7GPm!+RV{WlrKk<8< zNm8*?4;~aNGcb9R$xPC`Dai%^M0?z80@MJ&K_x6yu=zx2oOD47)G7==mNXuOI-v9z*U zcFIoGx$^E*=B0i*PTKzHf_kS)MZwJWgR`)ob!+QKDo*_{?vHdr*z04+<#`zQRMuAG zxR>Z$&kQ&fr_!x$P9}}I+;2_ma?;#CXw_x2(b}6%E6&FD?%_#y5Z%Y>$*?T&52Z1c2`h2AE5+MoN^p+r$7F~=AgC-q>UK!`HD+~KV z5qfp>OC1ivHOMV9zzobYP&C~d-T%j5zyIfxxW^1I1OJKvQR;Y|Hg3t@tqYr@yH=uJ rqmocuZty(?4Sf}3EM3K0s9Ml3$v|{1<_6J&!XE;f25y*vUuED8t|?Vo literal 0 HcmV?d00001 diff --git a/iot-modules/iot-box-user-api/src/main/resources/bootstrap-prod.yml b/iot-modules/iot-box-user-api/src/main/resources/bootstrap-prod.yml index d68207d..6d97184 100644 --- a/iot-modules/iot-box-user-api/src/main/resources/bootstrap-prod.yml +++ b/iot-modules/iot-box-user-api/src/main/resources/bootstrap-prod.yml @@ -3,17 +3,10 @@ spring: nacos: discovery: # 服务注册地址 -<<<<<<< HEAD - server-addr: 8.139.5.211:30731 - config: - # 配置中心地址 - server-addr: 8.139.5.211:30731 -======= server-addr: qiuguo-nacos.qiuguo-cloud:8848 config: # 配置中心地址 server-addr: qiuguo-nacos.qiuguo-cloud:8848 ->>>>>>> 64da585a2f5a786febdbeaafd130d2fd086ee8e1 # 配置文件格式 file-extension: yml # 共享配置 diff --git a/iot-modules/iot-box-websocket-api/.DS_Store b/iot-modules/iot-box-websocket-api/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..18ab244c83b068aaa4c2dc0597b7839946547bb6 GIT binary patch literal 6148 zcmeHKPfNov6i?iA8AIqn(PO~tz-}Ifcqw&$0V{e?nXMgKtj%aUcNl|S^$Yn;{5-yw zq~O@jBJMp%e(!J6{Gj>67~}pl?lI;t#soA(j>;NA_u9~wO-AH6Mlp#}6@m2`O>FG1 z1Acph6)b0u(d_5=u4LXFmN9^)Ik%Ms6(D-u`-CGpkJ2* P(nUZMLLD*i3k-Y%T)#;| literal 0 HcmV?d00001 diff --git a/iot-modules/iot-box-websocket-api/pom.xml b/iot-modules/iot-box-websocket-api/pom.xml index 89905c4..4d4361d 100644 --- a/iot-modules/iot-box-websocket-api/pom.xml +++ b/iot-modules/iot-box-websocket-api/pom.xml @@ -88,6 +88,19 @@ 3.1.8 + + com.alibaba.nls + nls-sdk-common + 2.2.10 + + + + + com.aliyun + aliyun-java-sdk-core + 4.6.4 + + diff --git a/iot-modules/iot-box-websocket-api/src/.DS_Store b/iot-modules/iot-box-websocket-api/src/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..1f65106194bbcfe428a945d29d9173252727a044 GIT binary patch literal 6148 zcmeHK%}T>S5Z<-XrW7FuMUM+!3#Ro@#7l_v1&ruHr6#0kFwK@GHHT8jRbR+A@p+ut z-H64UMeGdhe)GGV{UH0p7~}pT?la~v#%ySa9F+z^cVlSFBqMShBP#P*l*$O~cN6>T zfZuMhDGOP`vhUv?&C(<aq%b*C0Mec|5TePmEOru&4qw8c+ zj-9=8nH6D@P3Ec~i6@Y9cavnXEPc7i;#}1RI$(F~&e%CvF5R9O4pu#}><>=|J<)du zC#zM*-ak4%yBt5K(@efWY=H~Z=ifF=OvhDsmvb1SLfGxgv0b3jWc28e-X25^56&=5U?l}5F7K!?|7j9Z8(pyOKtQ5f_LRvIA!!gVR2F6HKl z!F4(Kg~{^_RvL9V<7#FY$IM(mUbvba{6eKO?rEf+7$64L8E9$K!SnwDewoHc{(1>n z!~iky&lup=C>Z&$D08;{SRS6W0@?#K6wIqo0ResO5&#D7BZn%e;{tWa^9)uRaTN5c QazMHWC_<S5Z-O0O({YSiXIod7EJ4*h?fxS3mDOZN=-=7Xv~%-Z4af8tGl-IVv@R?%GhpBqMShBUD3uY|?3mc7AAzbkrf z|9G`(+k1ycrx&B=^d*z8nokaNE7>tv!5b)F%b5q$ES1><_^SLWkB}H328aP-V1pSj zhl1VNU=C>M!~ii+&j9WZ0ve)cu+*rw4(RaujByJQ1$2B%APR$?!BQhcK)5ai)TP`! zF}N-Vzc6{8!BV3xXI#w;`+sedIs|bzGnhd7i;iBaVW8 RRSrlO0YwOP#K12w@Cl8JN&f%< literal 0 HcmV?d00001 diff --git a/iot-modules/iot-box-websocket-api/src/main/java/.DS_Store b/iot-modules/iot-box-websocket-api/src/main/java/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..08d758b8c5c6f9e85d3436b7587eaffc729e56ae GIT binary patch literal 6148 zcmeHKPfNov6i>G4GKSEDqQ`*Of!#a|@lxvi0#@{(GFv;e*fnGA++hrQ)i2~X@$>jz zl7eG9i@5h7`MtkM^MmFOV~qQ=xXYNs7!%MCIVu|j-5WzSn~cbDjC>NMDgx^>n%LN1 z2mJOrdt!=>qxsM8Pm{cG-7j9NH+FWLqAA+qA$U>qpa_du?uXMmw62v(qe>5>n`AT} zI{OzYE5aljO?5#Mk09m#HpyZ&_th+mb6p#lfM|)<&^cTz+>Y$`mL0k1_Ro49*>!uT z%VkR(9G{$D4PVo7rrr&k9LUzPXR(40Q0!vff@zkj>=`^&c9lg)3=jjv05P!T4A_G~ zw6~lGT0SvA46HMN`-6mr=vgcc>a7Dhygp;RfrtV+z9kT)MbBbs5F#MllmePkZl4(3 zl!IT|JkMfj(3CT-XNGa?%+=$C>)F9CbvomoLF$PCVqlelx-lI*|1aT}+4#s`Eg_2- zAO`*!1H3T^20kpxo~>)k!?RXGdxVC9c_k_!ps!p4z`%XvNC!<^q7HeU#nK>-f__~N PNEZQ32zA83FEH>8#(YUI literal 0 HcmV?d00001 diff --git a/iot-modules/iot-box-websocket-api/src/main/java/com/.DS_Store b/iot-modules/iot-box-websocket-api/src/main/java/com/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..899f1104947e7e93ae875d7f07cd9c3f775908a3 GIT binary patch literal 6148 zcmeHK%}T>S5Z<-5O({YSiXIod7EJ4*h?fxS3mDOZN=-*>84!cC#O3e;8xj%cDMHHe<{JMdWDI2)b)STP7Kit1)sW!y=o7i41E7 z`in07_7;0)G0WK$^y~M(hqENk7LN15w;IjuR@-V@UF*(&kcGbp7J23c^Be44N|}U} z9fVi$q!`<~XEI#`aXOi+f;gH$%I$TWMzZi^o<^Cf^>x7NSe>!Gzg#*!F&wOVV%Z;_ z40@vP431Z;jG4GKSEDqQ`*Of!#a|@lxvi0#@{(GFv*dSevnS_Amy$>KF2x_<4LU zNx`w5McjLk{NCTB`9brCF~OM2 z1AcpxB}}m*Dt~@|n&gG+e(^@LwX@q6ZP67E!LurZA}r>)AI|R3x>hQUYCVi@l1Vvs z_AgXcgh@7;>4GGlK+64XlEtd@)jW%HT^pEy=!nkPIb1B&FY%vx8sibjCe{)Dr{5z$ybxV>)>LU&1f5@sYn;LKZPV z4E!?&cxx1ld{~q{Ti2F{XRUWG0~VBi}Nwn<6= literal 0 HcmV?d00001 diff --git a/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/.DS_Store b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..76e7b73ce6a8bef187599e85fde2e54beab05980 GIT binary patch literal 6148 zcmeHK-AcnS6i(c98AIrWqL%@02X^yfh&QFq7qFriDzl|Si?tbRXN587t-g?N;`4Y; zl7eHq7IEi5@}1wL`Jnk>jB$S!_ZV{+V*(l?M`ewmdu?dTCL?kjBcDX6iop7eCN}oh z0l&S$BBt0|RQ~+_G|3Cs{o-4V=JrlYv_wbT2T!UDim;gFemK2F>q@CKs`W6sPR8ZP z**jNR5hmGqstb~M3@LXvNfxWpSFN9bmhD^IPG_3&+VTq z7HzSAbbNL>dQM+5^={bYK(>}$i#2?JVi)roOtVyFkKn1Z>nuWIfEXYKh=C1fz#a^u zv*A3@@`(XrV3h&fA0#wH&thdzZynI#^%>($L=@2RErBR4dKN2#5CP$)6ws7%`^4a; z9Q@Mec@`^!rkrs-GmK+rt{*R4&kla6(;4>+QcnyJ1Ir9FjOpO{e*wSD+DHC!30cGd zG4RhA;LTw$^kGrvK7HsRGh?k|-7jQ)nDs|TuUAk_hyLAtxuvdK{-^Ax} zCP~H83Z6vl3{1Xcem3OGl1TtSbSHxrKpg-aRKk*r%?cqu>5`PJg;3~kD7b?W3?U2i zrD!(%MFwc^T*z_HLP+7u{-sZ0tU~m@g->ymX3gfiD3vQ4n^mXk)SMgtLFIlHWRtWT zjIU^Pu2dY(`$2dS4fB3|`$Q#K5GBL0PKX9W47t9Hl7Y&*YLX06o$DKi<2r7?zB`>Z z8?w`$HRQC_Ichg#tJyxB&0J?^|KRwnKZ+j{^L=TEEsfZ?3*e8ZC>1dZW&a+q;H0dDp%=jHUv#>7|p=U?C)ZrjJgWNI$%)lZ8 zWizZ({XhNw{lA#RBW8dZ_*V>wO3&|gaY?qeE-j8~twg;=C84;&;AaYUbScJID#d%K aTF@@3gXmc-459^vF9MndZkT~zW#9wY_f0bZ literal 0 HcmV?d00001 diff --git a/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/.DS_Store b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..ba569dc9b4213a3ed99de04d3e4a15d01d75d946 GIT binary patch literal 6148 zcmeHKPfNov6i>G4GKSEDqQ`*Of!#a|@lxvi0#@{(GFv*dSevnS_Amy$>KF2x_<4LU zNx`w5McjLk{NCTB`9brCF~OM2 z1Acpxg>1@_sQmf;X_6PN`^6j0*3NEQv_)4u1kb7rim;gHemJ{B>sqNas`W6sNhamk z*}qU(5hmGWrVEmI0x9>mNfxWpSMw~+b!}h*q9ZzE=WwxbdvZ8f_T-{JJR9_6-yNJT zmmP6%d~$v@eo0?5^={bYK(>}Wi#2?JVi)rk%(7HvPvEJu>nuWIfEXYKh=DC(WL=@2RErBR4dKN2#5CP$)6ws7%`^4a; z9Q@Mec@`^!rkrs-GmK+rt{*R4&kla6(;4>+QcnyJ1FH-)jp^X|e+j?L#z+2Y30cGd zG4RhA;H^S5T0$TO({YT3WApfuNB)0E#f8A`T|Dupi&zfG#Im`X`4eSZErsBwAyuf z&}_FBbvbW#j$3uvY_yIRi;Aa7Dix;~S?L`Z@RVE8{$N<^1s?^y+ArIvj*+kb7o;8CYhZ zXofX9|IhH3S^3CcPT>(VzzqB|21Kdn^}1M;JzKw(M`x|Xc886G;xbZDP+z(P;DGj# fUF|e}Njk>47Bho13)yu#B3}eFA>1(ozrer;cMeS` literal 0 HcmV?d00001 diff --git a/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/controller/WebsocketController.java b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/controller/WebsocketController.java index 969c9bf..ebd83e6 100644 --- a/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/controller/WebsocketController.java +++ b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/controller/WebsocketController.java @@ -1,17 +1,35 @@ 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.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.third.nlp.Nlp; import com.qiuguo.iot.third.service.LacNlpService; import lombok.extern.slf4j.Slf4j; 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.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Mono; +import javax.annotation.Resource; +import java.time.Duration; + @RestController @Slf4j @RequestMapping("/websocket") @@ -25,6 +43,25 @@ public class WebsocketController { @Autowired 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") public Mono pushMessage(@RequestParam String message, @RequestParam String id, @RequestParam Integer type) { @@ -43,4 +80,92 @@ public class WebsocketController { return lacNlpService.geSingletNlp(value); } + + private Mono 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 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异常"); + }); + + } + }); + } + } diff --git a/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/domain/box/BoxSession.java b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/domain/box/BoxSession.java index dc11e4a..f7b20e4 100644 --- a/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/domain/box/BoxSession.java +++ b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/domain/box/BoxSession.java @@ -10,4 +10,8 @@ public class BoxSession extends BaseSession { * TTS合成声音的声音标识 */ String ttsId; + /** + * 阿里token + */ + String aliToken; } diff --git a/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/domain/user/UserSession.java b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/domain/user/UserSession.java new file mode 100644 index 0000000..51839cb --- /dev/null +++ b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/domain/user/UserSession.java @@ -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 { + +} diff --git a/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/handler/BaseWebSocketProcess.java b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/handler/BaseWebSocketProcess.java index 87d9561..1440d26 100644 --- a/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/handler/BaseWebSocketProcess.java +++ b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/handler/BaseWebSocketProcess.java @@ -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.DateTimeResp; 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.entity.device.DeviceUserBindEntity; import com.qiuguo.iot.data.entity.device.DeviceUserTalkRecordEntity; @@ -106,12 +107,11 @@ public class BaseWebSocketProcess { protected SystemTalkBindU3dService systemTalkBindU3dService; - protected static ConcurrentHashMap userGroup = new ConcurrentHashMap<>(); + protected static ConcurrentHashMap userGroup = new ConcurrentHashMap<>(); protected static ConcurrentHashMap boxGroup = new ConcurrentHashMap<>(); - protected static String apiType = "api-type"; - protected static String apiToken = "api-token"; + private String getSendStr(StringBuilder sb, String message){ String old = sb.toString() + message; @@ -194,7 +194,7 @@ public class BaseWebSocketProcess { return Mono.empty(); }); } - })/*.subscribeOn(Schedulers.boundedElastic()).subscribe()*/; + }); } private Mono saveTalkRecord(BaseSession baseSession, Action action, String text){ @@ -333,8 +333,9 @@ public class BaseWebSocketProcess { } return weatherService.tianqiApi(req).flatMap(t ->{ if(t.getData() == null){ - return sendMessage(action, baseSession, "该城市不支持天气查询", action.getSystemTalkAnswerConfigEntity().getAnswerType()); - //return Mono.empty(); + return sendMessage(action, baseSession, + "该城市不支持天气查询", + action.getSystemTalkAnswerConfigEntity().getAnswerType()); } TianqiapiItemResp item = null; @@ -856,7 +857,7 @@ public class BaseWebSocketProcess { return null; } - public BaseSession getUserSessionWithUserId(Long userId) { + public UserSession getUserSessionWithUserId(Long userId) { if(userGroup.containsKey(userId)){ return userGroup.get(userId); } diff --git a/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/handler/BoxWebSocketHandler.java b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/handler/BoxWebSocketHandler.java index ae6aeb3..65aea1e 100644 --- a/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/handler/BoxWebSocketHandler.java +++ b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/handler/BoxWebSocketHandler.java @@ -3,6 +3,7 @@ package com.qiuguo.iot.box.websocket.api.handler; import cn.hutool.crypto.digest.MD5; import com.alibaba.fastjson.JSONObject; 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.enums.*; import com.qiuguo.iot.base.model.UserDeviceInfoModel; @@ -31,6 +32,7 @@ import reactor.util.context.Context; import javax.annotation.Resource; import java.time.Duration; + @Component @WebSocketMapping("/websocket/box") @Slf4j @@ -51,14 +53,13 @@ public class BoxWebSocketHandler extends BaseWebSocketProcess implements WebSock private NlpService nlpService; - @Override public Mono handle(WebSocketSession session) { // 在生产环境中,需对url中的参数进行检验,如token,不符合要求的连接的直接关闭 HandshakeInfo handshakeInfo = session.getHandshakeInfo(); HttpHeaders headers = handshakeInfo.getHeaders(); - String sn = headers.get("sn").get(0); - Long linkTime = Long.parseLong(headers.get("time").get(0)); + String sn = headers.get(HttpHeaderConstans.BOX_SN).get(0); + Long linkTime = Long.parseLong(headers.get(HttpHeaderConstans.TIME).get(0)); if(checkTimeout && System.currentTimeMillis() - linkTime > timeOut){ //关闭连接 log.info("设备{},请求数据已超时", sn); @@ -72,9 +73,9 @@ public class BoxWebSocketHandler extends BaseWebSocketProcess implements WebSock log.info("局域网IP替换成杭州ip:115.205.2.137"); ip = "115.205.2.137"; } - String signature = headers.get("signature").get(0); - Long userId = Long.parseLong(headers.get("userId").get(0)); - Integer isBind = Integer.parseInt(headers.get("isBind").get(0)); + String signature = headers.get(HttpHeaderConstans.BOX_SIGNATURE).get(0); + Long userId = Long.parseLong(headers.get(HttpHeaderConstans.USER_ID).get(0)); + Integer isBind = Integer.parseInt(headers.get(HttpHeaderConstans.BOX_BIND).get(0)); // BoxSession boxSession = new BoxSession(); @@ -268,6 +269,8 @@ public class BoxWebSocketHandler extends BaseWebSocketProcess implements WebSock }else{ boxSession.setTtsId(entity.getTts()); + + if(entity.getIsBind().equals(YesNo.YES.getCode())){ //通知用户端设备绑定成功 sendNoticeToUser(userId, "设备联网成功,设备序列号:" + dv.getSn(), AskTypeEnum.BOX_ON_LINE.getCode()); diff --git a/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/handler/CustomerWebSocketHandler.java b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/handler/CustomerWebSocketHandler.java index 27fed7c..d80030f 100644 --- a/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/handler/CustomerWebSocketHandler.java +++ b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/handler/CustomerWebSocketHandler.java @@ -2,13 +2,13 @@ package com.qiuguo.iot.box.websocket.api.handler; import com.alibaba.fastjson.JSONObject; 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.DeviceTypeEnum; import com.qiuguo.iot.base.enums.ResponeEnum; import com.qiuguo.iot.base.enums.YesNo; import com.qiuguo.iot.base.utils.WebClientUtils; -import com.qiuguo.iot.box.websocket.api.domain.BaseSession; -import com.qiuguo.iot.box.websocket.api.domain.box.BoxSession; +import com.qiuguo.iot.box.websocket.api.domain.user.UserSession; 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.LogWebFilter; @@ -58,17 +58,17 @@ public class CustomerWebSocketHandler extends BaseWebSocketProcess implements We HandshakeInfo handshakeInfo = session.getHandshakeInfo(); HttpHeaders headers = handshakeInfo.getHeaders(); //List tokens = headers.get("token"); - String type = headers.get(apiType).get(0); - String token = headers.get(apiToken).get(0); - Long userId = Long.valueOf(headers.get("userId").get(0)); - Long linkTime = Long.parseLong(headers.get("time").get(0)); + String type = headers.get(HttpHeaderConstans.API_TYPE).get(0); + String token = headers.get(HttpHeaderConstans.API_TOKEN).get(0); + Long userId = Long.valueOf(headers.get(HttpHeaderConstans.USER_ID).get(0)); + Long linkTime = Long.parseLong(headers.get(HttpHeaderConstans.TIME).get(0)); if(checkTimeout && System.currentTimeMillis() - linkTime > timeOut){ //关闭连接 log.info("用户{},请求数据已超时", userId); return session.close(); } String ip = headers.get(LogWebFilter.HEAD_IP).get(0); - BaseSession userSession = new BaseSession(); + UserSession userSession = new UserSession(); userSession.setUserId(userId); userSession.setSession(session); userSession.setCustomerIP(ip); @@ -105,12 +105,12 @@ public class CustomerWebSocketHandler extends BaseWebSocketProcess implements We }).then(); } - private Mono newMessage(WebSocketMessage webSocketMessage, BaseSession userSession){ + private Mono newMessage(WebSocketMessage webSocketMessage, UserSession userSession){ MDC.put(LogMdcConfiguration.PRINT_LOG_ID, userSession.getLogId()); String text = webSocketMessage.getPayloadAsText(); log.info("收到用户消息:{}", text); UserTalkMessage userTalkMessage = JSONObject.parseObject(text, UserTalkMessage.class); - BaseSession userSession1 = getUserSessionWithUserId(userTalkMessage.getUserId()); + UserSession userSession1 = getUserSessionWithUserId(userTalkMessage.getUserId()); if(!userSession.equals(userSession1)){ log.info("消息发送异常,或者未验签就收到信息不是同一个链接。可能传错用户ID"); return closeSendMsg(userSession, "请等待验签结束或者用户ID可能错误", AskTypeEnum.TTS.getCode()).flatMap(b -> { @@ -127,8 +127,8 @@ public class CustomerWebSocketHandler extends BaseWebSocketProcess implements We } - private Mono disconnect(BaseSession userSession){ - BaseSession userSession1 = getUserSessionWithUserId(userSession.getUserId()); + private Mono disconnect(UserSession userSession){ + UserSession userSession1 = getUserSessionWithUserId(userSession.getUserId()); if(userSession == userSession1){ userGroup.remove(userSession.getUserId());//断链后及时移除 log.info("用户断开连接userId:{}", userSession.getUserId()); @@ -136,10 +136,10 @@ public class CustomerWebSocketHandler extends BaseWebSocketProcess implements We return Mono.empty(); } - private Mono checkToken(BaseSession userSession, String type, String token, Long userId){ + private Mono checkToken(UserSession userSession, String type, String token, Long userId){ Map reqHead = new HashMap<>(); - reqHead.put(apiType, type); - reqHead.put(apiToken, token); + reqHead.put(HttpHeaderConstans.API_TYPE, type); + reqHead.put(HttpHeaderConstans.API_TOKEN, token); return WebClientUtils.get(checkTokenUrl, reqHead).defaultIfEmpty(new JSONObject()).flatMap(jsonObject -> { log.info("验签获取的数据{}", jsonObject); if(jsonObject.getInteger("code").equals(ResponeEnum.SUCESS.getCode())){ @@ -165,7 +165,7 @@ public class CustomerWebSocketHandler extends BaseWebSocketProcess implements We }else{ normalSendMsg(userSession, "您暂未绑定果宝儿Box,快去绑定吧", AskTypeEnum.TTS.getCode()); } - BaseSession oldUserSession = getUserSessionWithUserId(userId); + UserSession oldUserSession = getUserSessionWithUserId(userId); userGroup.put(userId, userSession); if(oldUserSession != null){ return closeSendMsg(oldUserSession, "您在其他地方登录", AskTypeEnum.TTS.getCode()); diff --git a/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/service/.DS_Store b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/service/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0