Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
I
iot-service
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Container Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
SuperHive
back-end
iot-service
Commits
ecdf0715
Commit
ecdf0715
authored
Aug 13, 2020
by
huangcb
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
增加设备实例mqtt topic权限管理功能
parent
a3e9907f
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
390 additions
and
18 deletions
+390
-18
MqttAcl.java
...java/com/esv/datacenter/iot/common/component/MqttAcl.java
+49
-0
MqttClientAuthComponent.java
...acenter/iot/common/component/MqttClientAuthComponent.java
+148
-0
TimescaleComponent.java
...v/datacenter/iot/common/component/TimescaleComponent.java
+5
-6
DeviceInstanceDao.java
...acenter/iot/module/devicemodel/dao/DeviceInstanceDao.java
+3
-2
DeviceInstanceDto.java
...acenter/iot/module/devicemodel/dto/DeviceInstanceDto.java
+4
-0
DeviceInstanceService.java
...iot/module/devicemodel/service/DeviceInstanceService.java
+12
-1
DeviceDataMapServiceImpl.java
...le/devicemodel/service/impl/DeviceDataMapServiceImpl.java
+42
-1
DeviceInstanceServiceImpl.java
...e/devicemodel/service/impl/DeviceInstanceServiceImpl.java
+49
-4
DeviceTypeServiceImpl.java
...odule/devicemodel/service/impl/DeviceTypeServiceImpl.java
+1
-1
application-dev.yml
src/main/resources/application-dev.yml
+18
-1
application-local.yml
src/main/resources/application-local.yml
+14
-1
DeviceInstanceDao.xml
src/main/resources/mapper/devicemodel/DeviceInstanceDao.xml
+5
-1
MqttClientAuthComponentTest.java
...ter/iot/common/component/MqttClientAuthComponentTest.java
+40
-0
No files found.
src/main/java/com/esv/datacenter/iot/common/component/MqttAcl.java
0 → 100644
View file @
ecdf0715
package
com
.
esv
.
datacenter
.
iot
.
common
.
component
;
import
lombok.Data
;
import
org.apache.commons.lang3.builder.ToStringBuilder
;
import
org.apache.commons.lang3.builder.ToStringStyle
;
/**
* @description:
* @author: huangchaobin@esvtek.com
* @createTime: 2020/08/13 15:39
* @version:1.0
*/
@Data
public
class
MqttAcl
{
/**
*
*/
private
Integer
id
;
/**
* 0: deny, 1: allow
*/
private
Integer
allow
;
/**
* IpAddress
*/
private
String
ipAddr
;
/**
* Username
*/
private
String
username
;
/**
* ClientId
*/
private
String
clientId
;
/**
* 1: subscribe, 2: publish, 3: pubsub
*/
private
Integer
access
;
/**
* Topic Filter
*/
private
String
topic
;
@Override
public
String
toString
()
{
return
ToStringBuilder
.
reflectionToString
(
this
,
ToStringStyle
.
JSON_STYLE
);
}
}
src/main/java/com/esv/datacenter/iot/common/component/MqttClientAuthComponent.java
0 → 100644
View file @
ecdf0715
package
com
.
esv
.
datacenter
.
iot
.
common
.
component
;
import
com.zaxxer.hikari.HikariDataSource
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.cloud.context.config.annotation.RefreshScope
;
import
org.springframework.jdbc.core.JdbcTemplate
;
import
org.springframework.stereotype.Component
;
import
java.util.List
;
import
java.util.Objects
;
/**
* @description:
* @author: huangchaobin@esvtek.com
* @createTime: 2020/08/13 15:36
* @version:1.0
*/
@Component
@RefreshScope
@Slf4j
public
class
MqttClientAuthComponent
{
@Value
(
"${emq.data-source.jdbc-url}"
)
private
String
jdbcUrl
;
@Value
(
"${emq.data-source.driver-class-name}"
)
private
String
driverClassName
;
@Value
(
"${emq.data-source.validation-query}"
)
private
String
validationQuery
;
@Value
(
"${emq.data-source.username}"
)
private
String
username
;
@Value
(
"${emq.data-source.password}"
)
private
String
password
;
@Value
(
"${emq.data-source.connection-timeout}"
)
private
Long
connectionTimeout
;
@Value
(
"${emq.data-source.minimum-idle}"
)
private
Integer
minimumIdle
;
@Value
(
"${emq.data-source.maximum-pool-size}"
)
private
Integer
maximumPoolSize
;
@Value
(
"${emq.data-source.max-lifetime}"
)
private
Long
maxLifetime
;
@Value
(
"${emq.client-auth.table-name}"
)
private
String
tableName
;
@Value
(
"${emq.client-auth.username}"
)
private
String
clientAuthUserName
;
@Autowired
private
DynamicDataSource
dynamicDataSource
;
/**
* @description 保存client Topic发布/订阅权限
* @param mqttAclList:
* @return void
* @author huangChaobin@esvtek.com
* @createTime 2020/08/13 16:06
**/
public
void
saveClientAcl
(
List
<
MqttAcl
>
mqttAclList
)
{
HikariDataSource
dataSource
=
this
.
getHikariDataSource4Transaction
();
String
clientId
=
mqttAclList
.
get
(
0
).
getClientId
();
try
{
JdbcTemplate
jdbcTemplate
=
new
JdbcTemplate
(
dataSource
);
// 删除clientId原有记录
StringBuffer
sb
=
new
StringBuffer
();
sb
.
append
(
"delete from "
).
append
(
tableName
).
append
(
" where clientid='"
).
append
(
clientId
).
append
(
"';"
);
String
deleteSql
=
sb
.
toString
();
log
.
info
(
"删除clientId原有记录SQL:{}"
,
deleteSql
);
jdbcTemplate
.
execute
(
deleteSql
);
// 新增clientId记录
for
(
MqttAcl
mqttAcl
:
mqttAclList
)
{
sb
=
new
StringBuffer
();
sb
.
append
(
"INSERT INTO "
).
append
(
tableName
)
.
append
(
"(allow, username, clientid, access, topic) VALUES("
)
.
append
(
mqttAcl
.
getAllow
())
.
append
(
",'"
).
append
(
clientAuthUserName
).
append
(
"'"
)
.
append
(
",'"
).
append
(
mqttAcl
.
getClientId
()).
append
(
"'"
)
.
append
(
","
).
append
(
mqttAcl
.
getAccess
())
.
append
(
",'"
).
append
(
mqttAcl
.
getTopic
()).
append
(
"'"
)
.
append
(
");"
);
String
insertSql
=
sb
.
toString
();
log
.
info
(
"新增clientId记录SQL:{}"
,
insertSql
);
jdbcTemplate
.
execute
(
insertSql
);
}
}
catch
(
Exception
e
)
{
log
.
error
(
"保存[clientId={}]Topic发布/订阅权限失败"
,
clientId
);
log
.
error
(
e
.
getMessage
(),
e
);
throw
e
;
}
finally
{
// 关闭数据源
if
(
Objects
.
nonNull
(
dataSource
)
&&
!
dataSource
.
isClosed
())
{
dataSource
.
close
();
}
}
}
/**
* @description 删除clientId记录
* @param clientId:
* @return void
* @author huangChaobin@esvtek.com
* @createTime 2020/08/13 16:54
**/
public
void
deleteClientAcl
(
String
clientId
)
{
HikariDataSource
dataSource
=
this
.
getHikariDataSource4Transaction
();
try
{
JdbcTemplate
jdbcTemplate
=
new
JdbcTemplate
(
dataSource
);
// 删除clientId原有记录
StringBuffer
sb
=
new
StringBuffer
();
sb
.
append
(
"delete from "
).
append
(
tableName
).
append
(
" where clientid='"
).
append
(
clientId
).
append
(
"';"
);
String
deleteSql
=
sb
.
toString
();
log
.
info
(
"删除clientId记录SQL:{}"
,
deleteSql
);
jdbcTemplate
.
execute
(
deleteSql
);
}
catch
(
Exception
e
)
{
log
.
error
(
"删除[clientId={}]Topic发布/订阅权限失败"
,
clientId
);
log
.
error
(
e
.
getMessage
(),
e
);
throw
e
;
}
finally
{
// 关闭数据源
if
(
Objects
.
nonNull
(
dataSource
)
&&
!
dataSource
.
isClosed
())
{
dataSource
.
close
();
}
}
}
private
HikariDataSource
getHikariDataSource4Transaction
()
{
HikariDataSource
dataSource
=
this
.
dynamicDataSource
.
getDynamicDataSource4Transaction
(
initDataSourceConfig
());
return
dataSource
;
}
private
DataSourceConfig
initDataSourceConfig
()
{
DataSourceConfig
dataSourceConfig
=
new
DataSourceConfig
(
jdbcUrl
,
driverClassName
,
username
,
password
,
validationQuery
,
connectionTimeout
,
minimumIdle
,
maximumPoolSize
,
maxLifetime
);
return
dataSourceConfig
;
}
}
src/main/java/com/esv/datacenter/iot/common/component/TimescaleComponent.java
View file @
ecdf0715
...
@@ -81,8 +81,9 @@ public class TimescaleComponent {
...
@@ -81,8 +81,9 @@ public class TimescaleComponent {
String
table
=
tablePrefix
+
modelId
;
String
table
=
tablePrefix
+
modelId
;
try
{
try
{
JdbcTemplate
jdbcTemplate
=
new
JdbcTemplate
(
dataSource
);
// 校验表名是否已存在
// 校验表名是否已存在
if
(
checkTableExits
(
dataSourc
e
,
table
))
{
if
(
checkTableExits
(
jdbcTemplat
e
,
table
))
{
log
.
warn
(
"创建表失败,表[{}]已存在"
,
table
);
log
.
warn
(
"创建表失败,表[{}]已存在"
,
table
);
return
false
;
return
false
;
}
}
...
@@ -96,7 +97,6 @@ public class TimescaleComponent {
...
@@ -96,7 +97,6 @@ public class TimescaleComponent {
log
.
info
(
"超表SQL:{}"
,
hyperSql
);
log
.
info
(
"超表SQL:{}"
,
hyperSql
);
// 使用jdbcTemplate来执行sql
// 使用jdbcTemplate来执行sql
JdbcTemplate
jdbcTemplate
=
new
JdbcTemplate
(
dataSource
);
jdbcTemplate
.
execute
(
tableSql
);
jdbcTemplate
.
execute
(
tableSql
);
jdbcTemplate
.
execute
(
indexSql
);
jdbcTemplate
.
execute
(
indexSql
);
jdbcTemplate
.
execute
(
hyperSql
);
jdbcTemplate
.
execute
(
hyperSql
);
...
@@ -128,7 +128,8 @@ public class TimescaleComponent {
...
@@ -128,7 +128,8 @@ public class TimescaleComponent {
try
{
try
{
// 校验表名是否已存在
// 校验表名是否已存在
if
(!
checkTableExits
(
dataSource
,
table
))
{
JdbcTemplate
jdbcTemplate
=
new
JdbcTemplate
(
dataSource
);
if
(!
checkTableExits
(
jdbcTemplate
,
table
))
{
log
.
warn
(
"删除表失败,表[{}]不存在"
,
table
);
log
.
warn
(
"删除表失败,表[{}]不存在"
,
table
);
return
false
;
return
false
;
}
}
...
@@ -138,7 +139,6 @@ public class TimescaleComponent {
...
@@ -138,7 +139,6 @@ public class TimescaleComponent {
log
.
info
(
"删除表SQL:{}"
,
deleteTableSql
);
log
.
info
(
"删除表SQL:{}"
,
deleteTableSql
);
// 使用jdbcTemplate来执行sql
// 使用jdbcTemplate来执行sql
JdbcTemplate
jdbcTemplate
=
new
JdbcTemplate
(
dataSource
);
jdbcTemplate
.
execute
(
deleteTableSql
);
jdbcTemplate
.
execute
(
deleteTableSql
);
log
.
info
(
"删除表[{}]成功"
,
table
);
log
.
info
(
"删除表[{}]成功"
,
table
);
}
catch
(
Exception
e
)
{
}
catch
(
Exception
e
)
{
...
@@ -228,7 +228,7 @@ public class TimescaleComponent {
...
@@ -228,7 +228,7 @@ public class TimescaleComponent {
return
sb
.
toString
();
return
sb
.
toString
();
}
}
private
Boolean
checkTableExits
(
HikariDataSource
dataSourc
e
,
String
table
)
{
private
Boolean
checkTableExits
(
JdbcTemplate
jdbcTemplat
e
,
String
table
)
{
StringBuffer
sb
=
new
StringBuffer
();
StringBuffer
sb
=
new
StringBuffer
();
sb
.
append
(
"select t1.tablename"
)
sb
.
append
(
"select t1.tablename"
)
.
append
(
" from pg_tables t1, pg_class t2"
)
.
append
(
" from pg_tables t1, pg_class t2"
)
...
@@ -239,7 +239,6 @@ public class TimescaleComponent {
...
@@ -239,7 +239,6 @@ public class TimescaleComponent {
String
sql
=
sb
.
toString
();
String
sql
=
sb
.
toString
();
// 使用jdbcTemplate来执行sql
// 使用jdbcTemplate来执行sql
JdbcTemplate
jdbcTemplate
=
new
JdbcTemplate
(
dataSource
);
List
<
Map
<
String
,
Object
>>
resultMapList
=
jdbcTemplate
.
queryForList
(
sql
);
List
<
Map
<
String
,
Object
>>
resultMapList
=
jdbcTemplate
.
queryForList
(
sql
);
if
(
null
!=
resultMapList
&&
0
<
resultMapList
.
size
())
{
if
(
null
!=
resultMapList
&&
0
<
resultMapList
.
size
())
{
return
true
;
return
true
;
...
...
src/main/java/com/esv/datacenter/iot/module/devicemodel/dao/DeviceInstanceDao.java
View file @
ecdf0715
...
@@ -41,10 +41,11 @@ public interface DeviceInstanceDao extends BaseMapper<DeviceInstanceEntity> {
...
@@ -41,10 +41,11 @@ public interface DeviceInstanceDao extends BaseMapper<DeviceInstanceEntity> {
/**
/**
* @description 查询设备列表
* @description 查询设备列表
* @param dto:
* @return java.util.List<com.esv.datacenter.iot.module.devicemodel.dto.DeviceInstanceDto>
* @return java.util.List<com.esv.datacenter.iot.module.devicemodel.dto.DeviceInstanceDto>
* @author huangChaobin@esvtek.com
* @author huangChaobin@esvtek.com
* @createTime 2020/08/1
2 15:33
* @createTime 2020/08/1
3 16:58
**/
**/
List
<
DeviceInstanceDto
>
select4List
();
List
<
DeviceInstanceDto
>
select4List
(
DeviceInstanceDto
dto
);
}
}
src/main/java/com/esv/datacenter/iot/module/devicemodel/dto/DeviceInstanceDto.java
View file @
ecdf0715
...
@@ -43,6 +43,10 @@ public class DeviceInstanceDto {
...
@@ -43,6 +43,10 @@ public class DeviceInstanceDto {
* 设备型号
* 设备型号
*/
*/
private
String
deviceModel
;
private
String
deviceModel
;
/**
* 通信ID
**/
private
String
communicationId
;
/**
/**
* 创建者
* 创建者
*/
*/
...
...
src/main/java/com/esv/datacenter/iot/module/devicemodel/service/DeviceInstanceService.java
View file @
ecdf0715
...
@@ -115,7 +115,7 @@ public interface DeviceInstanceService extends IService<DeviceInstanceEntity> {
...
@@ -115,7 +115,7 @@ public interface DeviceInstanceService extends IService<DeviceInstanceEntity> {
* @author huangChaobin@esvtek.com
* @author huangChaobin@esvtek.com
* @createTime 2020/08/12 15:34
* @createTime 2020/08/12 15:34
**/
**/
List
<
DeviceInstanceDto
>
get4List
();
List
<
DeviceInstanceDto
>
get4List
(
DeviceInstanceDto
dto
);
/**
/**
* description 根据通信id更新设备在线状态
* description 根据通信id更新设备在线状态
...
@@ -126,5 +126,16 @@ public interface DeviceInstanceService extends IService<DeviceInstanceEntity> {
...
@@ -126,5 +126,16 @@ public interface DeviceInstanceService extends IService<DeviceInstanceEntity> {
**/
**/
void
changeDeviceOnlineState
(
List
<
String
>
communicationIdList
);
void
changeDeviceOnlineState
(
List
<
String
>
communicationIdList
);
/**
* @description 保存client Mqtt Topic发布/订阅权限
* @param deviceTypeId:
* @param deviceInstanceId:
* @param clientId:
* @return void
* @author huangChaobin@esvtek.com
* @createTime 2020/08/13 16:44
**/
void
saveInstanceMqttTopicAuth
(
Long
deviceTypeId
,
Long
deviceInstanceId
,
String
clientId
);
}
}
src/main/java/com/esv/datacenter/iot/module/devicemodel/service/impl/DeviceDataMapServiceImpl.java
View file @
ecdf0715
...
@@ -2,14 +2,20 @@ package com.esv.datacenter.iot.module.devicemodel.service.impl;
...
@@ -2,14 +2,20 @@ package com.esv.datacenter.iot.module.devicemodel.service.impl;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.esv.datacenter.iot.common.component.MqttAcl
;
import
com.esv.datacenter.iot.common.component.MqttClientAuthComponent
;
import
com.esv.datacenter.iot.module.datamodel.entity.DataModelEntity
;
import
com.esv.datacenter.iot.module.datamodel.entity.DataModelEntity
;
import
com.esv.datacenter.iot.module.devicemodel.dao.DeviceDataMapDao
;
import
com.esv.datacenter.iot.module.devicemodel.dao.DeviceDataMapDao
;
import
com.esv.datacenter.iot.module.devicemodel.dto.DeviceInstanceDto
;
import
com.esv.datacenter.iot.module.devicemodel.entity.DeviceDataMapEntity
;
import
com.esv.datacenter.iot.module.devicemodel.entity.DeviceDataMapEntity
;
import
com.esv.datacenter.iot.module.devicemodel.service.DeviceDataMapService
;
import
com.esv.datacenter.iot.module.devicemodel.service.DeviceDataMapService
;
import
com.esv.datacenter.iot.module.devicemodel.service.DeviceInstanceService
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Objects
;
import
java.util.Objects
;
...
@@ -17,6 +23,12 @@ import java.util.Objects;
...
@@ -17,6 +23,12 @@ import java.util.Objects;
@Service
(
"deviceDataMapService"
)
@Service
(
"deviceDataMapService"
)
public
class
DeviceDataMapServiceImpl
extends
ServiceImpl
<
DeviceDataMapDao
,
DeviceDataMapEntity
>
implements
DeviceDataMapService
{
public
class
DeviceDataMapServiceImpl
extends
ServiceImpl
<
DeviceDataMapDao
,
DeviceDataMapEntity
>
implements
DeviceDataMapService
{
@Autowired
MqttClientAuthComponent
mqttClientAuthComponent
;
@Autowired
DeviceInstanceService
deviceInstanceService
;
@Override
@Override
public
int
getCountByDataModelId
(
Long
dataModelId
)
{
public
int
getCountByDataModelId
(
Long
dataModelId
)
{
return
this
.
getBaseMapper
().
selectCount
(
new
LambdaQueryWrapper
<
DeviceDataMapEntity
>()
return
this
.
getBaseMapper
().
selectCount
(
new
LambdaQueryWrapper
<
DeviceDataMapEntity
>()
...
@@ -34,8 +46,9 @@ public class DeviceDataMapServiceImpl extends ServiceImpl<DeviceDataMapDao, Devi
...
@@ -34,8 +46,9 @@ public class DeviceDataMapServiceImpl extends ServiceImpl<DeviceDataMapDao, Devi
public
void
saveDeviceDataMap
(
Long
deviceTypeId
,
String
dataModelIds
)
{
public
void
saveDeviceDataMap
(
Long
deviceTypeId
,
String
dataModelIds
)
{
this
.
getBaseMapper
().
delete
(
new
LambdaQueryWrapper
<
DeviceDataMapEntity
>().
eq
(
DeviceDataMapEntity:
:
getDeviceTypeId
,
deviceTypeId
));
this
.
getBaseMapper
().
delete
(
new
LambdaQueryWrapper
<
DeviceDataMapEntity
>().
eq
(
DeviceDataMapEntity:
:
getDeviceTypeId
,
deviceTypeId
));
String
[]
dataModelIdList
=
null
;
if
(
Objects
.
nonNull
(
StringUtils
.
trimToNull
(
dataModelIds
)))
{
if
(
Objects
.
nonNull
(
StringUtils
.
trimToNull
(
dataModelIds
)))
{
String
[]
dataModelIdList
=
dataModelIds
.
split
(
","
);
dataModelIdList
=
dataModelIds
.
split
(
","
);
for
(
String
dataModelId
:
dataModelIdList
)
{
for
(
String
dataModelId
:
dataModelIdList
)
{
DeviceDataMapEntity
entity
=
new
DeviceDataMapEntity
();
DeviceDataMapEntity
entity
=
new
DeviceDataMapEntity
();
entity
.
setDeviceTypeId
(
deviceTypeId
);
entity
.
setDeviceTypeId
(
deviceTypeId
);
...
@@ -43,6 +56,33 @@ public class DeviceDataMapServiceImpl extends ServiceImpl<DeviceDataMapDao, Devi
...
@@ -43,6 +56,33 @@ public class DeviceDataMapServiceImpl extends ServiceImpl<DeviceDataMapDao, Devi
this
.
getBaseMapper
().
insert
(
entity
);
this
.
getBaseMapper
().
insert
(
entity
);
}
}
}
}
// 更新设备实例的Mqtt Topic权限
DeviceInstanceDto
deviceInstanceDto
=
new
DeviceInstanceDto
();
deviceInstanceDto
.
setDeviceTypeId
(
deviceTypeId
);
List
<
DeviceInstanceDto
>
dtoList
=
deviceInstanceService
.
get4List
(
deviceInstanceDto
);
String
communicationId
;
Long
deviceInstanceId
;
for
(
DeviceInstanceDto
dto
:
dtoList
)
{
communicationId
=
dto
.
getCommunicationId
();
mqttClientAuthComponent
.
deleteClientAcl
(
communicationId
);
deviceInstanceId
=
dto
.
getId
();
if
(
Objects
.
nonNull
(
dataModelIdList
))
{
List
<
MqttAcl
>
mqttAclList
=
new
ArrayList
<>();
for
(
String
dataModelId
:
dataModelIdList
)
{
MqttAcl
mqttAcl
=
new
MqttAcl
();
mqttAcl
.
setAllow
(
1
);
mqttAcl
.
setClientId
(
communicationId
);
mqttAcl
.
setAccess
(
2
);
StringBuffer
sb
=
new
StringBuffer
();
sb
.
append
(
"$esv/iot/"
).
append
(
dataModelId
).
append
(
deviceTypeId
).
append
(
deviceInstanceId
).
append
(
"/data/upload"
);
mqttAcl
.
setTopic
(
sb
.
toString
());
mqttAclList
.
add
(
mqttAcl
);
}
mqttClientAuthComponent
.
saveClientAcl
(
mqttAclList
);
}
}
}
}
@Override
@Override
...
@@ -51,4 +91,5 @@ public class DeviceDataMapServiceImpl extends ServiceImpl<DeviceDataMapDao, Devi
...
@@ -51,4 +91,5 @@ public class DeviceDataMapServiceImpl extends ServiceImpl<DeviceDataMapDao, Devi
entity
.
setDeviceTypeId
(
deviceTypeId
);
entity
.
setDeviceTypeId
(
deviceTypeId
);
return
this
.
getBaseMapper
().
selectDataModelByDeviceTypeId
(
entity
);
return
this
.
getBaseMapper
().
selectDataModelByDeviceTypeId
(
entity
);
}
}
}
}
\ No newline at end of file
src/main/java/com/esv/datacenter/iot/module/devicemodel/service/impl/DeviceInstanceServiceImpl.java
View file @
ecdf0715
...
@@ -5,18 +5,24 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
...
@@ -5,18 +5,24 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.core.metadata.IPage
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
com.baomidou.mybatisplus.extension.plugins.pagination.Page
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.esv.datacenter.iot.common.component.MqttAcl
;
import
com.esv.datacenter.iot.common.component.MqttClientAuthComponent
;
import
com.esv.datacenter.iot.common.exception.EException
;
import
com.esv.datacenter.iot.common.exception.EException
;
import
com.esv.datacenter.iot.common.response.ECode
;
import
com.esv.datacenter.iot.common.response.ECode
;
import
com.esv.datacenter.iot.common.vo.PageResultVO
;
import
com.esv.datacenter.iot.common.vo.PageResultVO
;
import
com.esv.datacenter.iot.module.datamodel.entity.DataModelEntity
;
import
com.esv.datacenter.iot.module.devicemodel.dao.DeviceInstanceDao
;
import
com.esv.datacenter.iot.module.devicemodel.dao.DeviceInstanceDao
;
import
com.esv.datacenter.iot.module.devicemodel.dto.DeviceInstanceDto
;
import
com.esv.datacenter.iot.module.devicemodel.dto.DeviceInstanceDto
;
import
com.esv.datacenter.iot.module.devicemodel.entity.DeviceInstanceEntity
;
import
com.esv.datacenter.iot.module.devicemodel.entity.DeviceInstanceEntity
;
import
com.esv.datacenter.iot.module.devicemodel.form.DeviceInstanceForm
;
import
com.esv.datacenter.iot.module.devicemodel.form.DeviceInstanceForm
;
import
com.esv.datacenter.iot.module.devicemodel.service.DeviceDataMapService
;
import
com.esv.datacenter.iot.module.devicemodel.service.DeviceInstanceService
;
import
com.esv.datacenter.iot.module.devicemodel.service.DeviceInstanceService
;
import
com.esv.datacenter.iot.module.devicemodel.vo.DeviceInstanceVO
;
import
com.esv.datacenter.iot.module.devicemodel.vo.DeviceInstanceVO
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.util.*
;
import
java.util.*
;
import
java.util.ArrayList
;
import
java.util.ArrayList
;
...
@@ -28,6 +34,12 @@ import java.util.Objects;
...
@@ -28,6 +34,12 @@ import java.util.Objects;
@Service
(
"deviceInstanceService"
)
@Service
(
"deviceInstanceService"
)
public
class
DeviceInstanceServiceImpl
extends
ServiceImpl
<
DeviceInstanceDao
,
DeviceInstanceEntity
>
implements
DeviceInstanceService
{
public
class
DeviceInstanceServiceImpl
extends
ServiceImpl
<
DeviceInstanceDao
,
DeviceInstanceEntity
>
implements
DeviceInstanceService
{
@Autowired
MqttClientAuthComponent
mqttClientAuthComponent
;
@Autowired
DeviceDataMapService
deviceDataMapService
;
@Override
@Override
public
int
getInstanceCountByTypeId
(
Long
deviceTypeId
)
{
public
int
getInstanceCountByTypeId
(
Long
deviceTypeId
)
{
return
this
.
getBaseMapper
().
selectCount
(
new
LambdaQueryWrapper
<
DeviceInstanceEntity
>()
return
this
.
getBaseMapper
().
selectCount
(
new
LambdaQueryWrapper
<
DeviceInstanceEntity
>()
...
@@ -35,6 +47,7 @@ public class DeviceInstanceServiceImpl extends ServiceImpl<DeviceInstanceDao, De
...
@@ -35,6 +47,7 @@ public class DeviceInstanceServiceImpl extends ServiceImpl<DeviceInstanceDao, De
}
}
@Override
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
Long
insertDeviceInstance
(
DeviceInstanceForm
form
)
{
public
Long
insertDeviceInstance
(
DeviceInstanceForm
form
)
{
int
count
=
this
.
getBaseMapper
().
selectCount
(
new
LambdaQueryWrapper
<
DeviceInstanceEntity
>()
int
count
=
this
.
getBaseMapper
().
selectCount
(
new
LambdaQueryWrapper
<
DeviceInstanceEntity
>()
.
eq
(
DeviceInstanceEntity:
:
getName
,
form
.
getName
()));
.
eq
(
DeviceInstanceEntity:
:
getName
,
form
.
getName
()));
...
@@ -44,15 +57,25 @@ public class DeviceInstanceServiceImpl extends ServiceImpl<DeviceInstanceDao, De
...
@@ -44,15 +57,25 @@ public class DeviceInstanceServiceImpl extends ServiceImpl<DeviceInstanceDao, De
DeviceInstanceEntity
entity
=
new
DeviceInstanceEntity
();
DeviceInstanceEntity
entity
=
new
DeviceInstanceEntity
();
BeanUtils
.
copyProperties
(
form
,
entity
);
BeanUtils
.
copyProperties
(
form
,
entity
);
entity
.
setCommunicationId
(
UUID
.
randomUUID
().
toString
().
replaceAll
(
"-"
,
""
));
String
communicationId
=
UUID
.
randomUUID
().
toString
().
replaceAll
(
"-"
,
""
);
entity
.
setCommunicationId
(
communicationId
);
this
.
getBaseMapper
().
insert
(
entity
);
this
.
getBaseMapper
().
insert
(
entity
);
Long
deviceInstanceId
=
entity
.
getId
();
// 保存client Mqtt Topic发布/订阅权限
this
.
saveInstanceMqttTopicAuth
(
form
.
getDeviceTypeId
(),
deviceInstanceId
,
communicationId
);
return
entity
.
getId
()
;
return
deviceInstanceId
;
}
}
@Override
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
void
deleteInstance
(
Long
id
)
{
public
void
deleteInstance
(
Long
id
)
{
this
.
getBaseMapper
().
deleteById
(
id
);
this
.
getBaseMapper
().
deleteById
(
id
);
// 删除设备Mqtt Topic权限记录
DeviceInstanceEntity
deviceInstanceEntity
=
this
.
getInstanceById
(
id
);
mqttClientAuthComponent
.
deleteClientAcl
(
deviceInstanceEntity
.
getCommunicationId
());
}
}
@Override
@Override
...
@@ -145,8 +168,8 @@ public class DeviceInstanceServiceImpl extends ServiceImpl<DeviceInstanceDao, De
...
@@ -145,8 +168,8 @@ public class DeviceInstanceServiceImpl extends ServiceImpl<DeviceInstanceDao, De
}
}
@Override
@Override
public
List
<
DeviceInstanceDto
>
get4List
()
{
public
List
<
DeviceInstanceDto
>
get4List
(
DeviceInstanceDto
dto
)
{
return
this
.
getBaseMapper
().
select4List
();
return
this
.
getBaseMapper
().
select4List
(
dto
);
}
}
@Override
@Override
...
@@ -164,4 +187,26 @@ public class DeviceInstanceServiceImpl extends ServiceImpl<DeviceInstanceDao, De
...
@@ -164,4 +187,26 @@ public class DeviceInstanceServiceImpl extends ServiceImpl<DeviceInstanceDao, De
baseMapper
.
update
(
entity
,
updateWrapper
);
baseMapper
.
update
(
entity
,
updateWrapper
);
}
}
@Override
public
void
saveInstanceMqttTopicAuth
(
Long
deviceTypeId
,
Long
deviceInstanceId
,
String
clientId
)
{
// 获取设备对应的数据模型
List
<
DataModelEntity
>
dataModelEntityList
=
deviceDataMapService
.
getDataModelByDeviceTypeId
(
deviceTypeId
);
if
(
Objects
.
isNull
(
dataModelEntityList
)
||
0
==
dataModelEntityList
.
size
())
{
return
;
}
List
<
MqttAcl
>
mqttAclList
=
new
ArrayList
<>();
for
(
DataModelEntity
dataModelEntity
:
dataModelEntityList
)
{
MqttAcl
mqttAcl
=
new
MqttAcl
();
mqttAcl
.
setAllow
(
1
);
mqttAcl
.
setClientId
(
clientId
);
mqttAcl
.
setAccess
(
2
);
StringBuffer
sb
=
new
StringBuffer
();
sb
.
append
(
"$esv/iot/"
).
append
(
dataModelEntity
.
getId
()).
append
(
deviceTypeId
).
append
(
deviceInstanceId
).
append
(
"/data/upload"
);
mqttAcl
.
setTopic
(
sb
.
toString
());
mqttAclList
.
add
(
mqttAcl
);
}
mqttClientAuthComponent
.
saveClientAcl
(
mqttAclList
);
}
}
}
\ No newline at end of file
src/main/java/com/esv/datacenter/iot/module/devicemodel/service/impl/DeviceTypeServiceImpl.java
View file @
ecdf0715
...
@@ -155,7 +155,7 @@ public class DeviceTypeServiceImpl extends ServiceImpl<DeviceTypeDao, DeviceType
...
@@ -155,7 +155,7 @@ public class DeviceTypeServiceImpl extends ServiceImpl<DeviceTypeDao, DeviceType
@Override
@Override
public
List
<
DeviceTypeStatisticsVO
>
getDeviceTypeStatistics
()
{
public
List
<
DeviceTypeStatisticsVO
>
getDeviceTypeStatistics
()
{
// 获取所有设备列表
// 获取所有设备列表
List
<
DeviceInstanceDto
>
dtoList
=
deviceInstanceService
.
get4List
();
List
<
DeviceInstanceDto
>
dtoList
=
deviceInstanceService
.
get4List
(
new
DeviceInstanceDto
()
);
// TODO,获取所有在线设备通信ID
// TODO,获取所有在线设备通信ID
...
...
src/main/resources/application-dev.yml
View file @
ecdf0715
...
@@ -85,4 +85,21 @@ timescale:
...
@@ -85,4 +85,21 @@ timescale:
max-lifetime
:
0
max-lifetime
:
0
table-field
:
table-field
:
map
:
string-text,number-numeric,integer-int8,boolean-bit(1),date-date,time-int4,datetime-timestamptz
map
:
string-text,number-numeric,integer-int8,boolean-bit(1),date-date,time-int4,datetime-timestamptz
table-prefix
:
iot_data_model_
table-prefix
:
iot_data_model_
\ No newline at end of file
emq
:
api
:
url
:
192.168.31.248:18083
auth
:
Basic YWRtaW46cHVibGlj
client-auth
:
table-name
:
mqtt_acl
username
:
esv_mqtt_client
data-source
:
jdbc-url
:
jdbc:mysql://192.168.31.248:3306/emq_mqtt
driver-class-name
:
com.mysql.cj.jdbc.Driver
validation-query
:
SELECT
1
username
:
emq_mqtt
password
:
123456
connection-timeout
:
10000
minimum-idle
:
1
maximum-pool-size
:
1
max-lifetime
:
0
\ No newline at end of file
src/main/resources/application-local.yml
View file @
ecdf0715
...
@@ -89,4 +89,17 @@ timescale:
...
@@ -89,4 +89,17 @@ timescale:
emq
:
emq
:
api
:
api
:
url
:
192.168.31.248:18083
url
:
192.168.31.248:18083
auth
:
Basic YWRtaW46cHVibGlj
auth
:
Basic YWRtaW46cHVibGlj
\ No newline at end of file
client-auth
:
table-name
:
mqtt_acl
username
:
esv_mqtt_client
data-source
:
jdbc-url
:
jdbc:mysql://192.168.31.248:3306/emq_mqtt
driver-class-name
:
com.mysql.cj.jdbc.Driver
validation-query
:
SELECT
1
username
:
emq_mqtt
password
:
123456
connection-timeout
:
10000
minimum-idle
:
1
maximum-pool-size
:
1
max-lifetime
:
0
\ No newline at end of file
src/main/resources/mapper/devicemodel/DeviceInstanceDao.xml
View file @
ecdf0715
...
@@ -52,11 +52,15 @@
...
@@ -52,11 +52,15 @@
group by device_type_id
group by device_type_id
</select>
</select>
<select
id=
"select4List"
resultType=
"com.esv.datacenter.iot.module.devicemodel.dto.DeviceInstanceDto"
>
<select
id=
"select4List"
parameterType=
"com.esv.datacenter.iot.module.devicemodel.dto.DeviceInstanceDto"
resultType=
"com.esv.datacenter.iot.module.devicemodel.dto.DeviceInstanceDto"
>
select a.id, a.device_type_id,a.communication_id,
select a.id, a.device_type_id,a.communication_id,
b.name as deviceTypeName
b.name as deviceTypeName
from device_instance a, device_type b
from device_instance a, device_type b
where a.device_type_id = b.id and a.deleted = false and b.deleted = false
where a.device_type_id = b.id and a.deleted = false and b.deleted = false
<if
test=
"deviceTypeId != null"
>
and a.device_type_id = #{deviceTypeId}
</if>
ORDER BY b.name ASC
ORDER BY b.name ASC
</select>
</select>
...
...
src/test/java/com/esv/datacenter/iot/common/component/MqttClientAuthComponentTest.java
0 → 100644
View file @
ecdf0715
package
com
.
esv
.
datacenter
.
iot
.
common
.
component
;
import
lombok.extern.slf4j.Slf4j
;
import
org.junit.Test
;
import
org.junit.runner.RunWith
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.test.context.SpringBootTest
;
import
org.springframework.test.context.junit4.SpringRunner
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* @description:
* @author: huangchaobin@esvtek.com
* @createTime: 2020/08/13 16:07
* @version:1.0
*/
@RunWith
(
SpringRunner
.
class
)
@SpringBootTest
@Slf4j
public
class
MqttClientAuthComponentTest
{
@Autowired
private
MqttClientAuthComponent
mqttClientAuthComponent
;
@Test
public
void
saveClientAcl_test
()
{
List
<
MqttAcl
>
mqttAclList
=
new
ArrayList
<>();
MqttAcl
mqttAcl
=
new
MqttAcl
();
mqttAcl
.
setAllow
(
1
);
mqttAcl
.
setClientId
(
String
.
valueOf
(
System
.
currentTimeMillis
()));
mqttAcl
.
setAccess
(
2
);
mqttAcl
.
setTopic
(
"$esv/iot/1/2/3/data/upload"
);
mqttAclList
.
add
(
mqttAcl
);
mqttClientAuthComponent
.
saveClientAcl
(
mqttAclList
);
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment