作者 钟来

初始提交

正在显示 94 个修改的文件 包含 2069 行增加1168 行删除

要显示太多修改。

为保证性能只显示 94 of 94+ 个文件。

... ... @@ -12,6 +12,8 @@ import org.springframework.context.annotation.ComponentScan;
"com.ruoyi.generator",
"com.zhonglai.luhui.admin.config",
"com.zhonglai.luhui.admin.controller",
"com.zhonglai.luhui.mqtt.comm.service.redis",
"com.zhonglai.luhui.mqtt.service.db.mode"
})
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class AdminApplication {
... ...
package com.zhonglai.luhui.admin.controller.iot;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.Message;
import com.ruoyi.common.core.domain.MessageCode;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.html.HttpUtils;
import com.ruoyi.system.domain.IotDevice;
import com.ruoyi.system.service.IIotDeviceService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import okhttp3.FormBody;
import okhttp3.Request;
import okhttp3.Response;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@Api(tags = "设备控制")
@Controller
@RequestMapping("/iot/iotDeviceControl")
public class IotDeviceControlController {
@Autowired
private IIotDeviceService iotDeviceService;
private String getServiceAdrres(HttpServletResponse response,String imei) throws IOException {
IotDevice iotDevice = iotDeviceService.selectIotDeviceByClient_id(imei);
response.setCharacterEncoding("UTF-8");
if(StringUtils.isEmpty(iotDevice.getListen_service_ip()))
{
response.getWriter().print(new Message(MessageCode.DEFAULT_FAIL_CODE,"未找到设备监听服务地址"));
return null;
}
return "http://"+iotDevice.getListen_service_ip()+"device/control/"+imei;
}
@ApiOperation("固件版本更新")
@ApiImplicitParams({
@ApiImplicitParam(value = "主机imei",name = "imei"),
@ApiImplicitParam(value = "版本号",name = "firmwareVersion")
})
@PreAuthorize("@ss.hasPermi('iot:iotDeviceControl:firmwareUp')")
@Log(title = "设备控制", businessType = BusinessType.UPDATE)
@ResponseBody
@PostMapping("/firmwareUp/{imei}")
public String firmwareUp(HttpServletResponse response,@PathVariable String imei,String firmwareVersion) throws IOException {
String url = getServiceAdrres(response,imei);
if(null == url)
{
return null;
}
Map<String,Object> map = new HashMap<>();
Map<String,Object> valueMap = new HashMap<>();
valueMap.put("firmwareVersion",firmwareVersion);
map.put("0",valueMap);
Response response1 = HttpUtils.postFromBody(url, builder -> {
}, formBody -> {
formBody.add("map", JSONObject.toJSONString(map));
});
return response1.body().string();
}
@ApiOperation("设备重启")
@ApiImplicitParams({
@ApiImplicitParam(value = "主机imei",name = "imei"),
@ApiImplicitParam(value = "restart 1重启,2复位,3恢复出厂值",name = "restart"),
})
@PreAuthorize("@ss.hasPermi('iot:iotDeviceControl:restart')")
@Log(title = "设备控制", businessType = BusinessType.UPDATE)
@ResponseBody
@PostMapping("/restart/{imei}/{restart}")
public String restart(HttpServletResponse response,@PathVariable String imei ,@PathVariable Integer restart) throws IOException {
String url = getServiceAdrres(response,imei);
if(null == url)
{
return null;
}
Map<String,Object> map = new HashMap<>();
Map<String,Object> valueMap = new HashMap<>();
valueMap.put("restart",restart);
map.put("0",valueMap);
Response response1 = HttpUtils.postFromBody(url, builder -> {
}, formBody -> {
formBody.add("map", JSONObject.toJSONString(map));
});
return response1.body().string();
}
@ApiOperation("获取指定设备版本信息")
@ApiImplicitParams({
@ApiImplicitParam(value = "主机imei",name = "imei"),
})
@ResponseBody
@PostMapping("/getFirmwareVersion/{imei}")
public String getFirmwareVersion(HttpServletResponse response,@PathVariable String imei) throws IOException {
IotDevice iotDevice = iotDeviceService.selectIotDeviceByClient_id(imei);
response.setCharacterEncoding("UTF-8");
if(StringUtils.isEmpty(iotDevice.getListen_service_ip()))
{
response.getWriter().print(new Message(MessageCode.DEFAULT_FAIL_CODE,"未找到设备监听服务地址"));
return null;
}
String url = "http://"+iotDevice.getListen_service_ip()+"device/getFirmwareVersion/"+iotDevice.getMqtt_username();
Response response1 = HttpUtils.postFromBody(url, builder -> {
}, formBody -> {
});
return response1.body().string();
}
@ApiOperation("强行断开链接")
@ApiImplicitParams({
@ApiImplicitParam(value = "主机imei",name = "imei"),
})
@ResponseBody
@PostMapping("/closeSession/{imei}")
public String closeSession(HttpServletResponse response,@PathVariable String imei) throws IOException {
IotDevice iotDevice = iotDeviceService.selectIotDeviceByClient_id(imei);
response.setCharacterEncoding("UTF-8");
if(StringUtils.isEmpty(iotDevice.getListen_service_ip()))
{
response.getWriter().print(new Message(MessageCode.DEFAULT_FAIL_CODE,"未找到设备监听服务地址"));
return null;
}
String url = "http://"+iotDevice.getListen_service_ip()+"device/closeSession/"+imei;
Response response1 = HttpUtils.postFromBody(url, builder -> {
}, formBody -> {
});
return response1.body().string();
}
@ApiOperation("删除主机")
@ApiImplicitParams({
@ApiImplicitParam(value = "主机imei",name = "imei"),
})
@ResponseBody
@PostMapping("/delIotDevice/{imei}")
public String delIotDevice(HttpServletResponse response,@PathVariable String imei) throws IOException {
IotDevice iotDevice = iotDeviceService.selectIotDeviceByClient_id(imei);
response.setCharacterEncoding("UTF-8");
if(StringUtils.isEmpty(iotDevice.getListen_service_ip()))
{
response.getWriter().print(new Message(MessageCode.DEFAULT_FAIL_CODE,"未找到设备监听服务地址"));
return null;
}
String url = "http://"+iotDevice.getListen_service_ip()+"device/delIotDevice/"+imei;
Response response1 = HttpUtils.postFromBody(url, builder -> {
}, formBody -> {
});
return response1.body().string();
}
@ApiOperation("删除终端")
@ApiImplicitParams({
@ApiImplicitParam(value = "主机imei",name = "imei"),
})
@ResponseBody
@PostMapping("/delIotTerminal/{imei}/{number}")
public String delIotTerminal(HttpServletResponse response,@PathVariable String imei,@PathVariable String number) throws IOException {
IotDevice iotDevice = iotDeviceService.selectIotDeviceByClient_id(imei);
response.setCharacterEncoding("UTF-8");
if(StringUtils.isEmpty(iotDevice.getListen_service_ip()))
{
response.getWriter().print(new Message(MessageCode.DEFAULT_FAIL_CODE,"未找到设备监听服务地址"));
return null;
}
String url = "http://"+iotDevice.getListen_service_ip()+"device/delIotTerminal/"+imei+"/"+number;
Response response1 = HttpUtils.postFromBody(url, builder -> {
}, formBody -> {
});
return response1.body().string();
}
@ApiOperation(value = "读取属性")
@ApiImplicitParams({
@ApiImplicitParam(value = "主机imei",name = "imei"),
@ApiImplicitParam(value = "传感器编号(0,1_1,10_1)",name = "sensor_number"),
@ApiImplicitParam(value = "属性集合(id1,id2,id3)",name = "attributes"),
})
@PreAuthorize("@ss.hasPermi('iot:iotDeviceControl:upSummary')")
@Log(title = "设备控制", businessType = BusinessType.UPDATE)
@ResponseBody
@PostMapping("/readAttribute/{imei}/{sensor_number}")
public String readAttribute(HttpServletResponse response,@PathVariable String imei,@PathVariable String sensor_number,String attributes) throws IOException {
IotDevice iotDevice = iotDeviceService.selectIotDeviceByClient_id(imei);
response.setCharacterEncoding("UTF-8");
if(StringUtils.isEmpty(iotDevice.getListen_service_ip()))
{
response.getWriter().print(new Message(MessageCode.DEFAULT_FAIL_CODE,"未找到设备监听服务地址"));
return null;
}
String url = "http://"+iotDevice.getListen_service_ip()+"device/read/"+imei;
Map<String,Object> map = new HashMap<>();
map.put(sensor_number,attributes);
Response response1 = HttpUtils.postJsonBody(url, jsonObject -> jsonObject.putAll(map));
return response1.body().string();
}
@ApiOperation(value = "设置主机自定义参数",notes = "自定义数据模型:\n" +
"{\n" +
" \t \"name\": \"wumei-smart\",\n" +
" \t \"chip\": \"esp8266\",\n" +
" \t \"author\": \"kerwincui\",\n" +
" \t \"version\": 1.2,\n" +
" \t \"createTime\": \"2022-06-06\"\n" +
" }")
@ApiImplicitParams({
@ApiImplicitParam(value = "主机imei",name = "imei"),
@ApiImplicitParam(value = "自定义数据json字符串",name = "summary")
})
@PreAuthorize("@ss.hasPermi('iot:iotDeviceControl:upSummary')")
@Log(title = "设备控制", businessType = BusinessType.UPDATE)
@ResponseBody
@PostMapping("/upSummary/{imei}")
public String upSummary(HttpServletResponse response,@PathVariable String imei,String summary) throws IOException {
String url = getServiceAdrres(response,imei);
if(null == url)
{
return null;
}
Map<String,Object> map = new HashMap<>();
Map<String,Object> valueMap = new HashMap<>();
valueMap.put("summary",JSONObject.parseObject(summary));
map.put("0",valueMap);
Response response1 = HttpUtils.postFromBody(url, builder -> {
}, formBody -> {
formBody.add("map", JSONObject.toJSONString(map));
});
return response1.body().string();
}
@ApiOperation(value = "修改指定终端属性",notes = "配置参数模型:\n" +
"{\n" +
" \"id1\":\"value1\",\n" +
" \"id2\":\"value2\",\n" +
" \"id3\":\"value3\"\n" +
" }")
@ApiImplicitParams({
@ApiImplicitParam(value = "主机imei",name = "imei"),
@ApiImplicitParam(value = "终端编号(如:1_1)",name = "number"),
@ApiImplicitParam(value = "配置参数json字符串",name = "config")
})
@PreAuthorize("@ss.hasPermi('iot:iotDeviceControl:upTerminalConfig')")
@Log(title = "设备控制", businessType = BusinessType.UPDATE)
@ResponseBody
@PostMapping("/upTerminalConfig/{imei}/{number}")
public String upTerminalConfig(HttpServletResponse response, @PathVariable String imei,@PathVariable String number,@RequestBody Map<String,Object> config) throws IOException {
String url = getServiceAdrres(response,imei);
if(null == url)
{
return null;
}
Map<String,Object> map = new HashMap<>();
map.put(number,config);
Response response1 = HttpUtils.postJsonBody(url, jsonObject -> jsonObject.putAll(map));
return response1.body().string();
}
@ApiOperation(value = "批量修改终端属性",notes = "批量数据模型:\n" +
"{\n" +
" \"1\":{\n" +
" \"id1\":\"value1\",\n" +
" \"id2\":\"value2\",\n" +
" \"id3\":\"value3\"\n" +
" },\n" +
" \"3\":{\n" +
" \"id1\":\"value1\",\n" +
" \"id2\":\"value2\",\n" +
" \"id3\":\"value3\"\n" +
" },\n" +
" \"4\":{\n" +
" \"id1\":\"value1\",\n" +
" \"id2\":\"value2\",\n" +
" \"id3\":\"value3\"\n" +
" }\n" +
"}")
@ApiImplicitParam(value = "批量数据json字符串",name = "map")
@PreAuthorize("@ss.hasPermi('iot:iotDeviceControl:batchUpTerminalConfig')")
@Log(title = "设备控制", businessType = BusinessType.UPDATE)
@ResponseBody
@PostMapping("/batchUpTerminalConfig/{imei}")
public String batchUpTerminalConfig(HttpServletResponse response,@PathVariable String imei,@RequestBody Map<String,Object> map) throws IOException {
String url = getServiceAdrres(response,imei);
if(null == url)
{
return null;
}
Response response1 = HttpUtils.postFromBody(url, builder -> {
}, formBody -> {
formBody.add("map", JSONObject.toJSONString(map));
});
return response1.body().string();
}
}
... ...
... ... @@ -3,9 +3,11 @@ package com.zhonglai.luhui.admin.controller.iot;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.ruoyi.common.utils.http.HttpUtils;
import com.ruoyi.common.core.domain.Message;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.system.domain.IotProduct;
import com.ruoyi.system.service.IIotProductService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
... ... @@ -39,7 +41,8 @@ public class IotDeviceController extends BaseController
{
@Autowired
private IIotDeviceService iotDeviceService;
@Autowired
private IIotProductService iIotProductService;
/**
* 查询主机/网关列表
*/
... ... @@ -87,6 +90,11 @@ public class IotDeviceController extends BaseController
@PostMapping("add")
public AjaxResult add(@RequestBody IotDevice iotDevice)
{
IotProduct iotProduct = iIotProductService.selectIotProductById(iotDevice.getProduct_id());
iotDevice.setMqtt_username(iotProduct.getMqtt_username());
iotDevice.setCreate_by(getUsername());
iotDevice.setCreate_time(DateUtils.getNowTimeMilly());
return toAjax(iotDeviceService.insertIotDevice(iotDevice));
}
... ... @@ -99,6 +107,8 @@ public class IotDeviceController extends BaseController
@PutMapping("edit")
public AjaxResult edit(@RequestBody IotDevice iotDevice)
{
iotDevice.setUpdate_by(getUsername());
iotDevice.setUpdate_time(DateUtils.getNowTimeMilly());
return toAjax(iotDeviceService.updateIotDevice(iotDevice));
}
... ... @@ -113,27 +123,4 @@ public class IotDeviceController extends BaseController
{
return toAjax(iotDeviceService.deleteIotDeviceByClient_ids(client_ids));
}
/**
* 修改主机/网关
*/
@ApiOperation("修改主机/网关")
@PreAuthorize("@ss.hasPermi('iot:IotDevice:restart')")
@Log(title = "主机/网关", businessType = BusinessType.UPDATE)
@PutMapping("restart")
public AjaxResult restart(@RequestBody IotDevice iotDevice)
{
return toAjax(iotDeviceService.updateIotDevice(iotDevice));
}
// @ApiOperation("固件版本更新")
// @ApiImplicitParam(value = "版本号",name = "firmwareVersion")
// @PreAuthorize("@ss.hasPermi('iot:IotDevice:firmwareUp')")
// @Log(title = "主机/网关", businessType = BusinessType.UPDATE)
// @PutMapping
// public AjaxResult firmwareUp(String firmwareVersion)
// {
// return redirect("/device/control");
// }
}
... ...
... ... @@ -19,8 +19,8 @@ import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.IotUser;
import com.ruoyi.system.service.IIotUserService;
import com.ruoyi.system.domain.IotProduct;
import com.ruoyi.system.service.IIotProductService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
... ... @@ -32,22 +32,22 @@ import com.ruoyi.common.core.page.TableDataInfo;
*/
@Api(tags = "产品")
@RestController
@RequestMapping("/iot/IotUser")
public class IotUserController extends BaseController
@RequestMapping("/iot/IotProduct")
public class IotProductController extends BaseController
{
@Autowired
private IIotUserService iotUserService;
private IIotProductService IotProductService;
/**
* 查询产品列表
*/
@ApiOperation("查询产品列表")
@PreAuthorize("@ss.hasPermi('iot:IotUser:list')")
@PreAuthorize("@ss.hasPermi('iot:IotProduct:list')")
@GetMapping("/list")
public TableDataInfo list(IotUser iotUser)
public TableDataInfo list(IotProduct iotProduct)
{
startPage();
List<IotUser> list = iotUserService.selectIotUserList(iotUser);
List<IotProduct> list = IotProductService.selectIotProductList(iotProduct);
return getDataTable(list);
}
... ... @@ -55,13 +55,13 @@ public class IotUserController extends BaseController
* 导出产品列表
*/
@ApiOperation("导出产品列表")
@PreAuthorize("@ss.hasPermi('iot:IotUser:export')")
@PreAuthorize("@ss.hasPermi('iot:IotProduct:export')")
@Log(title = "产品", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, IotUser iotUser)
public void export(HttpServletResponse response, IotProduct iotProduct)
{
List<IotUser> list = iotUserService.selectIotUserList(iotUser);
ExcelUtil<IotUser> util = new ExcelUtil<IotUser>(IotUser.class);
List<IotProduct> list = IotProductService.selectIotProductList(iotProduct);
ExcelUtil<IotProduct> util = new ExcelUtil<IotProduct>(IotProduct.class);
util.exportExcel(response, list, "产品数据");
}
... ... @@ -69,46 +69,46 @@ public class IotUserController extends BaseController
* 获取产品详细信息
*/
@ApiOperation("获取产品详细信息")
@PreAuthorize("@ss.hasPermi('iot:IotUser:query')")
@PreAuthorize("@ss.hasPermi('iot:IotProduct:query')")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Integer id)
{
return AjaxResult.success(iotUserService.selectIotUserById(id));
return AjaxResult.success(IotProductService.selectIotProductById(id));
}
/**
* 新增产品
*/
@ApiOperation("新增产品")
@PreAuthorize("@ss.hasPermi('iot:IotUser:add')")
@PreAuthorize("@ss.hasPermi('iot:IotProduct:add')")
@Log(title = "产品", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody IotUser iotUser)
public AjaxResult add(@RequestBody IotProduct iotProduct)
{
return toAjax(iotUserService.insertIotUser(iotUser));
return toAjax(IotProductService.insertIotProduct(iotProduct));
}
/**
* 修改产品
*/
@ApiOperation("修改产品")
@PreAuthorize("@ss.hasPermi('iot:IotUser:edit')")
@PreAuthorize("@ss.hasPermi('iot:IotProduct:edit')")
@Log(title = "产品", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody IotUser iotUser)
public AjaxResult edit(@RequestBody IotProduct iotProduct)
{
return toAjax(iotUserService.updateIotUser(iotUser));
return toAjax(IotProductService.updateIotProduct(iotProduct));
}
/**
* 删除产品
*/
@ApiOperation("删除产品")
@PreAuthorize("@ss.hasPermi('iot:IotUser:remove')")
@PreAuthorize("@ss.hasPermi('iot:IotProduct:remove')")
@Log(title = "产品", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Integer[] ids)
{
return toAjax(iotUserService.deleteIotUserByIds(ids));
return toAjax(IotProductService.deleteIotProductByIds(ids));
}
}
... ...
package com.zhonglai.luhui.admin.controller.iot;
import java.util.Date;
import java.util.List;
import java.util.*;
import javax.servlet.http.HttpServletResponse;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.system.domain.IotProduct;
import com.ruoyi.system.service.IIotProductService;
import com.zhonglai.luhui.admin.dto.IotThingsModelAddApi;
import com.zhonglai.luhui.mqtt.comm.dto.thingsmodels.ThingsModelItemBase;
import com.zhonglai.luhui.mqtt.comm.dto.thingsmodels.specs.*;
import com.zhonglai.luhui.mqtt.service.db.mode.TerminalDataThingsModeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
... ... @@ -33,7 +35,7 @@ import com.ruoyi.common.core.page.TableDataInfo;
/**
* 物模型模板Controller
*
*
* @author 钟来
* @date 2022-08-26
*/
... ... @@ -45,6 +47,11 @@ public class IotThingsModelController extends BaseController
@Autowired
private IIotThingsModelService iotThingsModelService;
@Autowired
private TerminalDataThingsModeService terminalDataThingsModeService;
@Autowired
private IIotProductService iIotProductService;
/**
* 查询物模型模板列表
*/
... ... @@ -124,7 +131,12 @@ public class IotThingsModelController extends BaseController
return AjaxResult.error("请输入数模型");
}
iotThingsModel.setSpecs(JSONObject.toJSONString(thingsModelItemBase));
return toAjax(iotThingsModelService.insertIotThingsModel(iotThingsModel));
IotProduct iotProduct = iIotProductService.selectIotProductById(iotThingsModel.getProduct_id());
iotThingsModel.setMqtt_username(iotProduct.getMqtt_username());
int ri = iotThingsModelService.insertIotThingsModel(iotThingsModel);
terminalDataThingsModeService.saveIotThingsModel(JSON.parseObject(JSONObject.toJSONString(iotThingsModel),IotThingsModel.class));
return toAjax(ri);
}
/**
... ... @@ -134,9 +146,47 @@ public class IotThingsModelController extends BaseController
@PreAuthorize("@ss.hasPermi('iot:IotThingsModel:edit')")
@Log(title = "物模型模板", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody IotThingsModel iotThingsModel)
public AjaxResult edit(@RequestBody IotThingsModelAddApi iotThingsModelAddApi)
{
return toAjax(iotThingsModelService.updateIotThingsModel(iotThingsModel));
IotThingsModel iotThingsModel = iotThingsModelAddApi.getIotThingsModel();
iotThingsModel.setCreate_by(getUsername());
ThingsModelItemBase thingsModelItemBase = null;
switch (iotThingsModel.getData_type())
{
case "integer":
thingsModelItemBase = JSONObject.parseObject(JSON.toJSONString(iotThingsModelAddApi.getThingsModelBase()), IntegerModelOutput.class);
break;
case "decimal":
thingsModelItemBase = JSONObject.parseObject(JSON.toJSONString(iotThingsModelAddApi.getThingsModelBase()), DecimalModelOutput.class);
break;
case "string":
thingsModelItemBase = JSONObject.parseObject(JSON.toJSONString(iotThingsModelAddApi.getThingsModelBase()), StringModelOutput.class);
break;
case "bool":
thingsModelItemBase = JSONObject.parseObject(JSON.toJSONString(iotThingsModelAddApi.getThingsModelBase()), BoolModelOutput.class);
break;
case "array":
thingsModelItemBase = JSONObject.parseObject(JSON.toJSONString(iotThingsModelAddApi.getThingsModelBase()), ArrayModelOutput.class);
break;
case "enum":
thingsModelItemBase = JSONObject.parseObject(JSON.toJSONString(iotThingsModelAddApi.getThingsModelBase()), EnumModelOutput.class);
break;
}
if(null == thingsModelItemBase)
{
return AjaxResult.error("请输入数模型");
}
iotThingsModel.setSpecs(JSONObject.toJSONString(thingsModelItemBase));
int ri =iotThingsModelService.updateIotThingsModel(iotThingsModel);
IotThingsModel oldiotThingsModel = iotThingsModelService.selectIotThingsModelByModel_id(iotThingsModel.getModel_id());
IotProduct iotProduct = iIotProductService.selectIotProductById(oldiotThingsModel.getProduct_id());
iotThingsModel.setMqtt_username(iotProduct.getMqtt_username());
terminalDataThingsModeService.saveIotThingsModel(JSON.parseObject(JSONObject.toJSONString(iotThingsModel),IotThingsModel.class));
return toAjax(ri);
}
/**
... ... @@ -145,9 +195,34 @@ public class IotThingsModelController extends BaseController
@ApiOperation("删除物模型模板")
@PreAuthorize("@ss.hasPermi('iot:IotThingsModel:remove')")
@Log(title = "物模型模板", businessType = BusinessType.DELETE)
@Transactional
@DeleteMapping("/{model_ids}")
public AjaxResult remove(@PathVariable Integer[] model_ids)
{
return toAjax(iotThingsModelService.deleteIotThingsModelByModel_ids(model_ids));
Map<String,List<String>> map = new HashMap<>();
List<IotThingsModel> list = iotThingsModelService.selectIotThingsModelListByIds(model_ids);
if(null != list && list.size() !=0)
{
for(IotThingsModel iotThingsModel:list)
{
List<String> identifiers = map.get(iotThingsModel.getMqtt_username());
if(null == identifiers )
{
identifiers = new ArrayList<>();
map.put(iotThingsModel.getMqtt_username(),identifiers);
}
identifiers.add(iotThingsModel.getIdentifier());
}
}
int ri =iotThingsModelService.deleteIotThingsModelByModel_ids(model_ids);
if(null != map && map.size() !=0)
{
for(String key:map.keySet())
{
terminalDataThingsModeService.delIotThingsModel(key, map.get(key).toArray());
}
}
return toAjax(ri);
}
}
... ...
package com.zhonglai.luhui.admin.controller.iot;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.domain.IotThingsModelTemplate;
import com.ruoyi.system.service.IIotThingsModelTemplateService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 物模型模板Controller
*
* @author 钟来
* @date 2022-10-24
*/
@Api(tags = "物模型模板公用模型")
@RestController
@RequestMapping("/iot/IotThingsModelTemplate")
public class IotThingsModelTemplateController extends BaseController
{
@Autowired
private IIotThingsModelTemplateService iotThingsModelTemplateService;
/**
* 查询物模型模板列表
*/
@ApiOperation("查询物模型模板列表")
@PreAuthorize("@ss.hasPermi('iot:IotThingsModelTemplate:list')")
@GetMapping("/list")
public TableDataInfo list(IotThingsModelTemplate iotThingsModelTemplate)
{
startPage();
List<IotThingsModelTemplate> list = iotThingsModelTemplateService.selectIotThingsModelTemplateList(iotThingsModelTemplate);
return getDataTable(list);
}
/**
* 导出物模型模板列表
*/
@ApiOperation("导出物模型模板列表")
@PreAuthorize("@ss.hasPermi('iot:IotThingsModelTemplate:export')")
@Log(title = "物模型模板", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, IotThingsModelTemplate iotThingsModelTemplate)
{
List<IotThingsModelTemplate> list = iotThingsModelTemplateService.selectIotThingsModelTemplateList(iotThingsModelTemplate);
ExcelUtil<IotThingsModelTemplate> util = new ExcelUtil<IotThingsModelTemplate>(IotThingsModelTemplate.class);
util.exportExcel(response, list, "物模型模板数据");
}
/**
* 获取物模型模板详细信息
*/
@ApiOperation("获取物模型模板详细信息")
@PreAuthorize("@ss.hasPermi('iot:IotThingsModelTemplate:query')")
@GetMapping(value = "/{model_id}")
public AjaxResult getInfo(@PathVariable("model_id") Integer model_id)
{
return AjaxResult.success(iotThingsModelTemplateService.selectIotThingsModelTemplateByModel_id(model_id));
}
/**
* 新增物模型模板
*/
@ApiOperation("新增物模型模板")
@PreAuthorize("@ss.hasPermi('iot:IotThingsModelTemplate:add')")
@Log(title = "物模型模板", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody IotThingsModelTemplate iotThingsModelTemplate)
{
return toAjax(iotThingsModelTemplateService.insertIotThingsModelTemplate(iotThingsModelTemplate));
}
/**
* 修改物模型模板
*/
@ApiOperation("修改物模型模板")
@PreAuthorize("@ss.hasPermi('iot:IotThingsModelTemplate:edit')")
@Log(title = "物模型模板", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody IotThingsModelTemplate iotThingsModelTemplate)
{
return toAjax(iotThingsModelTemplateService.updateIotThingsModelTemplate(iotThingsModelTemplate));
}
/**
* 删除物模型模板
*/
@ApiOperation("删除物模型模板")
@PreAuthorize("@ss.hasPermi('iot:IotThingsModelTemplate:remove')")
@Log(title = "物模型模板", businessType = BusinessType.DELETE)
@DeleteMapping("/{model_ids}")
public AjaxResult remove(@PathVariable Integer[] model_ids)
{
return toAjax(iotThingsModelTemplateService.deleteIotThingsModelTemplateByModel_ids(model_ids));
}
}
... ...
# 项目相关配置 jhlt: # 名称 name: zhonglai # 版本 version: 3.8.2 # 版权年份 copyrightYear: 2022 # 实例演示开关 demoEnabled: true # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) profile: D:/ruoyi/uploadPath # 获取ip地址开关 addressEnabled: false # 验证码类型 math 数组计算 char 字符验证 captchaType: math # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8080 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: com.ruoyi: debug org.springframework: warn # Spring配置 spring: # 资源信息 messages: # 国际化资源文件路径 basename: i18n/messages profiles: active: druid # 文件上传 servlet: multipart: # 单个文件大小 max-file-size: 10MB # 设置总上传的文件大小 max-request-size: 20MB # 服务模块 devtools: restart: # 热部署开关 enabled: true # redis 配置 redis: # 地址 host: 47.112.163.61 # 端口,默认为6379 port: 9527 # 数据库索引 database: 0 # 密码 password: Luhui586 # 连接超时时间 timeout: 10s lettuce: pool: # 连接池中的最小空闲连接 min-idle: 0 # 连接池中的最大空闲连接 max-idle: 8 # 连接池的最大数据库连接数 max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms # token配置 token: # 令牌自定义标识 header: Authorization # 令牌密钥 secret: abcdefghijklmnopqrstuvwxyz # 令牌有效期(默认30分钟) expireTime: 1440 # MyBatis配置 mybatis: # 搜索指定包别名 typeAliasesPackage: com.ruoyi.**.domain # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 configLocation: classpath:mybatis/mybatis-config.xml # PageHelper分页插件 pagehelper: helperDialect: mysql supportMethodsArguments: true params: count=countSql # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 pathMapping: /dev-api # 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* sys: ## // 对于登录login 注册register 验证码captchaImage 允许匿名访问 antMatchers: /login,/register,/captchaImage,/getCacheObject,/v2/api-docs,/tool/gen/generatorCodeFromDb
\ No newline at end of file
# 项目相关配置 jhlt: # 名称 name: zhonglai # 版本 version: 3.8.2 # 版权年份 copyrightYear: 2022 # 实例演示开关 demoEnabled: true # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) profile: D:/ruoyi/uploadPath # 获取ip地址开关 addressEnabled: false # 验证码类型 math 数组计算 char 字符验证 captchaType: math # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8080 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: com.ruoyi: debug org.springframework: warn # Spring配置 spring: # 资源信息 messages: # 国际化资源文件路径 basename: i18n/messages profiles: active: druid # 文件上传 servlet: multipart: # 单个文件大小 max-file-size: 10MB # 设置总上传的文件大小 max-request-size: 20MB # 服务模块 devtools: restart: # 热部署开关 enabled: true # redis 配置 redis: # 地址 host: 47.112.163.61 # 端口,默认为6379 port: 9527 # 数据库索引 database: 0 # 密码 password: Luhui586 # 连接超时时间 timeout: 10s lettuce: pool: # 连接池中的最小空闲连接 min-idle: 0 # 连接池中的最大空闲连接 max-idle: 8 # 连接池的最大数据库连接数 max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms # token配置 token: # 令牌自定义标识 header: Authorization # 令牌密钥 secret: abcdefghijklmnopqrstuvwxyz # 令牌有效期(默认30分钟) expireTime: 1440 # MyBatis配置 mybatis: # 搜索指定包别名 typeAliasesPackage: com.ruoyi.**.domain # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 configLocation: classpath:mybatis/mybatis-config.xml # PageHelper分页插件 pagehelper: helperDialect: mysql supportMethodsArguments: true params: count=countSql # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 pathMapping: /dev-api # 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* mqtt: client: device_life: 180 sys: ## // 对于登录login 注册register 验证码captchaImage 允许匿名访问 antMatchers: /login,/register,/captchaImage,/getCacheObject,/v2/api-docs,/tool/gen/generatorCodeFromDb
\ No newline at end of file
... ...
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>Luhui</artifactId>
<groupId>com.zhonglai.luhui</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>lh-domain</artifactId>
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
</dependency>
<dependency>
<groupId>jakarta.validation</groupId>
<artifactId>jakarta.validation-api</artifactId>
</dependency>
<!-- Swagger3依赖 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>${swagger.version}</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
\ No newline at end of file
... ...
package com.zhonglai.luhui.mqtt.comm.dto.iot;
package com.ruoyi.system.domain;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.util.List;
import java.util.Map;
import java.io.Serializable;
/**
* 主机/网关对象 iot_device
... ... @@ -15,7 +14,7 @@ import java.util.Map;
* @date 2022-08-26
*/
@ApiModel("主机/网关")
public class IotDevice
public class IotDevice implements Serializable
{
private static final long serialVersionUID = 1L;
... ... @@ -84,7 +83,7 @@ public class IotDevice
private Integer rssi;
/** 设备状态(1-未激活,2-禁用,3-在线,4-离线) */
@ApiModelProperty("设备状态(1-未激活,2-禁用,3-在线,4-离线)")
@ApiModelProperty("设备状态(1-未激活,2-禁用,3-在线,4-离线,5-锁定)")
private Integer status;
/** 设备摘要,格式[{"name":"device"},{"chip":"esp8266"}] */
... ... @@ -103,23 +102,41 @@ public class IotDevice
@ApiModelProperty("更新时间")
private Integer update_time;
/** 用户id */
@ApiModelProperty("用户id")
private Integer user_id;
@ApiModelProperty("产品id")
private Integer product_id;
@ApiModelProperty("mqtt用户名/设备类型")
private String mqtt_username;
@ApiModelProperty("负载类型(String,Json,Bite16,Bite32)")
private String payload_type;
@ApiModelProperty("payload 协议模型")
private String business_model; //payload 协议模型
public String getBusiness_model() {
return business_model;
@ApiModelProperty("物模型配置")
private String things_model_config; //payload 协议模型
@ApiModelProperty("监听服务器的ip")
private String listen_service_ip;
@ApiModelProperty("描述")
private String remark;
public String getListen_service_ip() {
return listen_service_ip;
}
public void setListen_service_ip(String listen_service_ip) {
this.listen_service_ip = listen_service_ip;
}
public void setBusiness_model(String business_model) {
this.business_model = business_model;
public String getThings_model_config() {
return things_model_config;
}
public void setThings_model_config(String things_model_config) {
this.things_model_config = things_model_config;
}
public String getPayload_type() {
return payload_type;
}
... ... @@ -317,40 +334,29 @@ public class IotDevice
{
return update_time;
}
public void setUser_id(Integer user_id)
{
this.user_id = user_id;
}
public Integer getUser_id()
{
return user_id;
}
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("active_time", getActive_time())
.append("client_id", getClient_id())
.append("completion_auth", getCompletion_auth())
.append("create_by", getCreate_by())
.append("create_time", getCreate_time())
.append("del_flag", getDel_flag())
.append("firmware_version", getFirmware_version())
.append("img_url", getImg_url())
.append("is_shadow", getIs_shadow())
.append("latitude", getLatitude())
.append("location_way", getLocation_way())
.append("longitude", getLongitude())
.append("name", getName())
.append("network_address", getNetwork_address())
.append("network_ip", getNetwork_ip())
.append("rssi", getRssi())
.append("status", getStatus())
.append("summary", getSummary())
.append("things_model_value", getThings_model_value())
.append("update_by", getUpdate_by())
.append("update_time", getUpdate_time())
.append("user_id", getUser_id())
.toString();
public Integer getProduct_id() {
return product_id;
}
public void setProduct_id(Integer product_id) {
this.product_id = product_id;
}
public String getMqtt_username() {
return mqtt_username;
}
public void setMqtt_username(String mqtt_username) {
this.mqtt_username = mqtt_username;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
}
... ...
package com.ruoyi.system.domain;
import com.ruoyi.system.domain.tool.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
/**
* topic权限控制对象 iot_permission
*
... ... @@ -14,7 +15,7 @@ import io.swagger.annotations.ApiModelProperty;
* @date 2022-08-26
*/
@ApiModel("topic权限控制")
public class IotPermission extends BaseEntity
public class IotPermission implements Serializable
{
private static final long serialVersionUID = 1L;
... ...
package com.zhonglai.luhui.mqtt.comm.dto.iot;
package com.ruoyi.system.domain;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.ruoyi.system.domain.tool.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
/**
* 产品对象 iot_user
* 产品对象 iot_product
*
* @author 钟来
* @date 2022-08-26
*/
@ApiModel("产品")
public class IotUser
public class IotProduct implements Serializable
{
private static final long serialVersionUID = 1L;
... ... @@ -34,7 +37,7 @@ public class IotUser
/** 密码 */
@ApiModelProperty("密码")
private String password;
private String mqtt_password;
/** 角色id */
@ApiModelProperty("角色id")
... ... @@ -42,7 +45,7 @@ public class IotUser
/** 盐 */
@ApiModelProperty("盐")
private String salt;
private String mqtt_salt;
/** 是否使用(0否,1是) */
@ApiModelProperty("是否使用(0否,1是)")
... ... @@ -50,7 +53,11 @@ public class IotUser
/** 用户名 */
@ApiModelProperty("用户名")
private String username;
private String mqtt_username;
@ApiModelProperty("产品名称")
private String product_name;
public void setCreate_time(Integer create_time)
{
... ... @@ -88,16 +95,7 @@ public class IotUser
{
return open_encryption;
}
public void setPassword(String password)
{
this.password = password;
}
public String getPassword()
{
return password;
}
public void setRole_id(Integer role_id)
public void setRole_id(Integer role_id)
{
this.role_id = role_id;
}
... ... @@ -106,16 +104,8 @@ public class IotUser
{
return role_id;
}
public void setSalt(String salt)
{
this.salt = salt;
}
public String getSalt()
{
return salt;
}
public void setUsed(Integer used)
public void setUsed(Integer used)
{
this.used = used;
}
... ... @@ -124,27 +114,52 @@ public class IotUser
{
return used;
}
public void setUsername(String username)
{
this.username = username;
public String getMqtt_password() {
return mqtt_password;
}
public String getUsername()
{
return username;
public void setMqtt_password(String mqtt_password) {
this.mqtt_password = mqtt_password;
}
public String getMqtt_salt() {
return mqtt_salt;
}
public void setMqtt_salt(String mqtt_salt) {
this.mqtt_salt = mqtt_salt;
}
public String getMqtt_username() {
return mqtt_username;
}
public void setMqtt_username(String mqtt_username) {
this.mqtt_username = mqtt_username;
}
public String getProduct_name() {
return product_name;
}
public void setProduct_name(String product_name) {
this.product_name = product_name;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("create_time", getCreate_time())
.append("encryption_type", getEncryption_type())
.append("id", getId())
.append("open_encryption", getOpen_encryption())
.append("password", getPassword())
.append("mqtt_password", getMqtt_password())
.append("role_id", getRole_id())
.append("salt", getSalt())
.append("mqtt_salt", getMqtt_salt())
.append("used", getUsed())
.append("username", getUsername())
.append("mqtt_username", getMqtt_username())
.append("product_name", getProduct_name())
.toString();
}
}
... ...
package com.ruoyi.system.domain;
import com.ruoyi.system.domain.tool.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
/**
* 公司对象 iot_role
*
... ... @@ -14,7 +15,7 @@ import io.swagger.annotations.ApiModelProperty;
* @date 2022-08-26
*/
@ApiModel("公司")
public class IotRole extends BaseEntity
public class IotRole implements Serializable
{
private static final long serialVersionUID = 1L;
... ...
... ... @@ -2,11 +2,11 @@ package com.ruoyi.system.domain;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
/**
* 终端对象 iot_terminal
*
... ... @@ -14,7 +14,7 @@ import io.swagger.annotations.ApiModelProperty;
* @date 2022-08-26
*/
@ApiModel("终端")
public class IotTerminal extends BaseEntity
public class IotTerminal implements Serializable
{
private static final long serialVersionUID = 1L;
... ... @@ -37,7 +37,38 @@ public class IotTerminal extends BaseEntity
/** 更新时间 */
@ApiModelProperty("更新时间")
private Integer update_time;
@ApiModelProperty("物模型配置")
private String things_model_config; //payload 协议模型
@ApiModelProperty("产品id")
private Integer product_id;
@ApiModelProperty("产品名称")
private String mqtt_username;
public Integer getProduct_id() {
return product_id;
}
public void setProduct_id(Integer product_id) {
this.product_id = product_id;
}
public String getMqtt_username() {
return mqtt_username;
}
public void setMqtt_username(String mqtt_username) {
this.mqtt_username = mqtt_username;
}
public String getThings_model_config() {
return things_model_config;
}
public void setThings_model_config(String things_model_config) {
this.things_model_config = things_model_config;
}
public void setDevice_id(String device_id)
{
this.device_id = device_id;
... ... @@ -92,6 +123,8 @@ public class IotTerminal extends BaseEntity
.append("name", getName())
.append("things_model_value", getThings_model_value())
.append("update_time", getUpdate_time())
.append("product_id", getProduct_id())
.append("mqtt_username", getMqtt_username())
.toString();
}
}
... ...
package com.ruoyi.system.domain;
import com.ruoyi.system.domain.tool.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serializable;
/**
* 物模型模板对象 iot_things_model
*
... ... @@ -14,7 +15,7 @@ import io.swagger.annotations.ApiModelProperty;
* @date 2022-08-26
*/
@ApiModel("物模型模板")
public class IotThingsModel extends BaseEntity
public class IotThingsModel implements Serializable
{
private static final long serialVersionUID = 1L;
... ... @@ -74,11 +75,70 @@ public class IotThingsModel extends BaseEntity
@ApiModelProperty("更新时间")
private java.util.Date update_time;
/** 用户id */
@ApiModelProperty("用户id")
private Integer user_id;
@ApiModelProperty("mqtt用户名/设备类型")
private String mqtt_username;
@ApiModelProperty("产品id")
private Integer product_id;
@ApiModelProperty("是否配置属性(0否,1是)")
private Integer is_config;
@ApiModelProperty("展示类型")
private String view_type;
@ApiModelProperty("对应配置属性名称集合(英文逗号分割)")
private String config_names;
@ApiModelProperty("归属(0主键,1终端)")
private String ascription;
/** 数据定义 */
@ApiModelProperty("数据定义")
private String remark;
public String getAscription() {
return ascription;
}
public void setAscription(String ascription) {
this.ascription = ascription;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getView_type() {
return view_type;
}
public void setCreate_by(String create_by)
public void setView_type(String view_type) {
this.view_type = view_type;
}
public String getConfig_names() {
return config_names;
}
public void setConfig_names(String config_names) {
this.config_names = config_names;
}
public Integer getIs_config() {
return is_config;
}
public void setIs_config(Integer is_config) {
this.is_config = is_config;
}
public void setCreate_by(String create_by)
{
this.create_by = create_by;
}
... ... @@ -204,14 +264,21 @@ public class IotThingsModel extends BaseEntity
{
return update_time;
}
public void setUser_id(Integer user_id)
{
this.user_id = user_id;
public String getMqtt_username() {
return mqtt_username;
}
public Integer getUser_id()
{
return user_id;
public void setMqtt_username(String mqtt_username) {
this.mqtt_username = mqtt_username;
}
public Integer getProduct_id() {
return product_id;
}
public void setProduct_id(Integer product_id) {
this.product_id = product_id;
}
@Override
... ... @@ -227,12 +294,12 @@ public class IotThingsModel extends BaseEntity
.append("is_top", getIs_top())
.append("model_id", getModel_id())
.append("model_name", getModel_name())
.append("remark", getRemark())
.append("specs", getSpecs())
.append("type", getType())
.append("update_by", getUpdate_by())
.append("update_time", getUpdate_time())
.append("user_id", getUser_id())
.append("product_id", getProduct_id())
.append("mqtt_username", getMqtt_username())
.toString();
}
}
... ...
package com.zhonglai.luhui.mqtt.comm.dto.iot;
package com.ruoyi.system.domain;
import com.ruoyi.system.domain.tool.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
* 物模型模板对象 iot_things_model
* 物模型模板对象 iot_things_model_template
*
* @author 钟来
* @date 2022-08-26
* @date 2022-10-24
*/
@ApiModel("物模型模板")
public class IotThingsModel
public class IotThingsModelTemplate extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 归属(0主键,1终端) */
@ApiModelProperty("归属(0主键,1终端)")
private Integer ascription;
/** 对应配置属性名称集合(英文逗号分割) */
@ApiModelProperty("对应配置属性名称集合(英文逗号分割)")
private String config_names;
/** 创建者 */
@ApiModelProperty("创建者")
private String create_by;
... ... @@ -36,6 +45,10 @@ public class IotThingsModel
@ApiModelProperty("标识符,用户下唯一")
private String identifier;
/** 是否配置属性(0否,1是) */
@ApiModelProperty("是否配置属性(0否,1是)")
private Integer is_config;
/** 是否实时监测(0-否,1-是) */
@ApiModelProperty("是否实时监测(0-否,1-是)")
private Integer is_monitor;
... ... @@ -56,6 +69,14 @@ public class IotThingsModel
@ApiModelProperty("物模型名称")
private String model_name;
/** mqtt用户名/设备类型 */
@ApiModelProperty("mqtt用户名/设备类型")
private String mqtt_username;
/** 产品id */
@ApiModelProperty("产品id")
private Integer product_id;
/** 数据定义 */
@ApiModelProperty("数据定义")
private String specs;
... ... @@ -72,23 +93,29 @@ public class IotThingsModel
@ApiModelProperty("更新时间")
private java.util.Date update_time;
/** 用户id */
@ApiModelProperty("用户id")
private Integer user_id;
/** 用户id */
@ApiModelProperty("用户名称")
private String user_name;
/** 页面展示类型 */
@ApiModelProperty("页面展示类型")
private String view_type;
public String getUser_name() {
return user_name;
public void setAscription(Integer ascription)
{
this.ascription = ascription;
}
public void setUser_name(String user_name) {
this.user_name = user_name;
public Integer getAscription()
{
return ascription;
}
public void setConfig_names(String config_names)
{
this.config_names = config_names;
}
public void setCreate_by(String create_by)
public String getConfig_names()
{
return config_names;
}
public void setCreate_by(String create_by)
{
this.create_by = create_by;
}
... ... @@ -133,6 +160,15 @@ public class IotThingsModel
{
return identifier;
}
public void setIs_config(Integer is_config)
{
this.is_config = is_config;
}
public Integer getIs_config()
{
return is_config;
}
public void setIs_monitor(Integer is_monitor)
{
this.is_monitor = is_monitor;
... ... @@ -178,6 +214,24 @@ public class IotThingsModel
{
return model_name;
}
public void setMqtt_username(String mqtt_username)
{
this.mqtt_username = mqtt_username;
}
public String getMqtt_username()
{
return mqtt_username;
}
public void setProduct_id(Integer product_id)
{
this.product_id = product_id;
}
public Integer getProduct_id()
{
return product_id;
}
public void setSpecs(String specs)
{
this.specs = specs;
... ... @@ -214,33 +268,40 @@ public class IotThingsModel
{
return update_time;
}
public void setUser_id(Integer user_id)
public void setView_type(String view_type)
{
this.user_id = user_id;
this.view_type = view_type;
}
public Integer getUser_id()
public String getView_type()
{
return user_id;
return view_type;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
.append("ascription", getAscription())
.append("config_names", getConfig_names())
.append("create_by", getCreate_by())
.append("create_time", getCreate_time())
.append("data_type", getData_type())
.append("del_flag", getDel_flag())
.append("identifier", getIdentifier())
.append("is_config", getIs_config())
.append("is_monitor", getIs_monitor())
.append("is_save_log", getIs_save_log())
.append("is_top", getIs_top())
.append("model_id", getModel_id())
.append("model_name", getModel_name())
.append("mqtt_username", getMqtt_username())
.append("product_id", getProduct_id())
.append("remark", getRemark())
.append("specs", getSpecs())
.append("type", getType())
.append("update_by", getUpdate_by())
.append("update_time", getUpdate_time())
.append("user_id", getUser_id())
.append("view_type", getView_type())
.toString();
}
}
... ...
package com.ruoyi.system.domain;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.annotation.Excel.ColumnType;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.system.domain.tool.BaseEntity;
import com.ruoyi.system.domain.tool.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.apache.commons.lang3.builder.ToStringBuilder;
... ... @@ -23,7 +22,7 @@ public class SysConfig extends BaseEntity
/** 参数主键 */
@ApiModelProperty("参数主键")
@Excel(name = "参数主键", cellType = ColumnType.NUMERIC)
@Excel(name = "参数主键", cellType = Excel.ColumnType.NUMERIC)
private Long configId;
/** 参数名称 */
... ...
package com.ruoyi.system.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.annotation.Excel.ColumnType;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.system.domain.tool.BaseEntity;
import com.ruoyi.system.domain.tool.Excel;
import java.util.Date;
... ... @@ -17,7 +16,7 @@ public class SysLogininfor extends BaseEntity
private static final long serialVersionUID = 1L;
/** ID */
@Excel(name = "序号", cellType = ColumnType.NUMERIC)
@Excel(name = "序号", cellType = Excel.ColumnType.NUMERIC)
private Long infoId;
/** 用户账号 */
... ...
package com.ruoyi.system.domain;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.xss.Xss;
import com.ruoyi.system.domain.tool.BaseEntity;
import com.ruoyi.system.domain.tool.Xss;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.apache.commons.lang3.builder.ToStringBuilder;
... ...
package com.ruoyi.system.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.annotation.Excel.ColumnType;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.system.domain.tool.BaseEntity;
import com.ruoyi.system.domain.tool.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
... ... @@ -21,7 +20,7 @@ public class SysOperLog extends BaseEntity
/** 日志主键 */
@ApiModelProperty("操作序号")
@Excel(name = "操作序号", cellType = ColumnType.NUMERIC)
@Excel(name = "操作序号", cellType = Excel.ColumnType.NUMERIC)
private Long operId;
/** 操作模块 */
... ...
package com.ruoyi.system.domain;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.annotation.Excel.ColumnType;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.system.domain.tool.BaseEntity;
import com.ruoyi.system.domain.tool.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.apache.commons.lang3.builder.ToStringBuilder;
... ... @@ -23,7 +22,7 @@ public class SysPost extends BaseEntity
/** 岗位序号 */
@ApiModelProperty("岗位序号")
@Excel(name = "岗位序号", cellType = ColumnType.NUMERIC)
@Excel(name = "岗位序号", cellType = Excel.ColumnType.NUMERIC)
private Long postId;
/** 岗位编码 */
... ...
package com.ruoyi.common.core.domain;
package com.ruoyi.system.domain.tool;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.data.annotation.Transient;
... ...
package com.ruoyi.common.annotation;
import com.ruoyi.common.utils.poi.ExcelHandlerAdapter;
package com.ruoyi.system.domain.tool;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
... ...
package com.ruoyi.common.utils.poi;
package com.ruoyi.system.domain.tool;
/**
* Excel数据格式处理适配器
... ...
package com.ruoyi.common.xss;
package com.ruoyi.system.domain.tool;
import javax.validation.Constraint;
import javax.validation.Payload;
... ...
package com.ruoyi.common.xss;
package com.ruoyi.system.domain.tool;
import com.ruoyi.common.utils.StringUtils;
import org.apache.commons.lang3.StringUtils;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
... ...
package com.ruoyi.system.domain.vo;
import com.ruoyi.common.utils.StringUtils;
import org.apache.commons.lang3.StringUtils;
/**
* 路由显示信息
... ... @@ -58,7 +59,7 @@ public class MetaVo
this.title = title;
this.icon = icon;
this.noCache = noCache;
if (StringUtils.ishttp(link))
if (StringUtils.startsWithAny(link, "http://", "https://"))
{
this.link = link;
}
... ...
... ... @@ -12,11 +12,42 @@
<artifactId>lh-mqtt-service</artifactId>
<dependencies>
<!-- spring-boot-devtools -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 表示依赖不会传递 -->
</dependency>
<!-- SpringBoot Web容器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring框架基本的核心工具 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
<!-- SpringWeb模块 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<!-- yml解析器 -->
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</dependency>
<!-- servlet包 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
</dependency>
<!-- 文档 -->
<dependency>
<groupId>io.springfox</groupId>
... ... @@ -58,11 +89,6 @@
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.jodah</groupId>
<artifactId>expiringmap</artifactId>
</dependency>
... ... @@ -126,6 +152,11 @@
<artifactId>okhttp</artifactId>
</dependency>
<!-- 通用工具-->
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-domain</artifactId>
</dependency>
</dependencies>
... ...
... ... @@ -6,8 +6,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.annotation.ComponentScan;
import javax.servlet.Filter;
@ComponentScan(basePackages = {
"com.zhonglai.luhui.mqtt.comm.config",
... ...
... ... @@ -14,13 +14,23 @@ import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import javax.annotation.PostConstruct;
@Configuration
public class RedisConfig {
@Value("${sys.redis.field:#{'luhui:mqttservice:device:'}")
@Value("${sys.redis.field}")
public String sysRedisField ; //域
public static String FIELD ; //域
public static String DEVICE = "device:"; //存放网关数据
public static String THINGS_MODEL = "things_model:"; //存放数据模型
public static String TERMINAL = "terminal:"; //存放终端数据
public static String LOCK = "lock:"; //存放设备锁
@PostConstruct
public void init()
{
RedisConfig.FIELD = sysRedisField;
}
@Bean
... ...
package com.zhonglai.luhui.mqtt.comm.config;
import com.alibaba.fastjson.JSONObject;
import com.zhonglai.luhui.mqtt.comm.dto.iot.IotThingsModel;
import com.zhonglai.luhui.mqtt.comm.factory.Topic;
import com.zhonglai.luhui.mqtt.comm.service.DataModeAnalysisService;
import com.zhonglai.luhui.mqtt.comm.util.http.HttpUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;
@Configuration
public class SysParameter {
... ... @@ -30,7 +23,6 @@ public class SysParameter {
public static String topicconfig ; //topic 配置
private static Map<String, IotThingsModel> terminalDataThingsMode = new HashMap<>(); //topic 终端数据模型
@PostConstruct
public void init() {
... ... @@ -45,13 +37,4 @@ public class SysParameter {
topicconfig = tempTopicconfig;
}
public static void setTerminalDataThingsMode(String username,IotThingsModel thingsModel)
{
terminalDataThingsMode.put(username+":"+thingsModel.getIdentifier(),thingsModel);
}
public static IotThingsModel getTerminalDataThingsMode(String username,String identifier)
{
return terminalDataThingsMode.get(username+":"+identifier);
}
}
... ...
... ... @@ -233,7 +233,13 @@ public class BaseDao {
{
Field field = fields[i];
try {
Method method = object.getClass().getMethod("get"+com.zhonglai.luhui.mqtt.comm.util.StringUtils.getName(field.getName()));
Method method = null;
try {
method = object.getClass().getMethod("get"+com.zhonglai.luhui.mqtt.comm.util.StringUtils.getName(field.getName()));
} catch (NoSuchMethodException e) {
continue;
}
Object value = method.invoke(object);
if(null != value)
{
... ... @@ -241,14 +247,11 @@ public class BaseDao {
{
sql += ",";
}
sql += "`"+changTableNameFromObject(field.getName())+"`"+"=?";
sql += "`"+com.zhonglai.luhui.mqtt.comm.util.StringUtils.toUnderScoreCase(field.getName())+"`"+"=?";
j++;
valueList.add(value);
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
... ... @@ -276,7 +279,7 @@ public class BaseDao {
Method method = object.getClass().getMethod("get"+com.zhonglai.luhui.mqtt.comm.util.StringUtils.getName(wheres[i]));
Object value = method.invoke(object);
sql += " and ";
sql += changTableNameFromObject(wheres[i]) + "=?";
sql += com.zhonglai.luhui.mqtt.comm.util.StringUtils.toUnderScoreCase(wheres[i]) + "=?";
valueList.add(value);
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
... ... @@ -774,7 +777,6 @@ public class BaseDao {
update += "`"+com.zhonglai.luhui.mqtt.comm.util.StringUtils.toUnderScoreCase(field.getName())+"`"+"=VALUES("+"`"+com.zhonglai.luhui.mqtt.comm.util.StringUtils.toUnderScoreCase(field.getName())+"`)";
}
} catch (NoSuchMethodException e) {
System.out.println("未找到"+field.getName()+"的get方法");
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
... ...
... ... @@ -5,7 +5,6 @@ import com.zhonglai.luhui.mqtt.comm.factory.Topic;
import com.zhonglai.luhui.mqtt.dto.Message;
public interface ServerAgreementContent {
String getClienConnectionId();
byte[] getCommd();
String getReplyCommdTopic(Topic topic);
void setReplyMessage(Message message);
... ...
package com.zhonglai.luhui.mqtt.comm.dto.iot;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
* topic权限控制对象 iot_permission
*
* @author 钟来
* @date 2022-08-26
*/
@ApiModel("topic权限控制")
public class IotPermission
{
private static final long serialVersionUID = 1L;
/** 动作(PUBLISH,SUBSCRIBE,ALL) */
@ApiModelProperty("动作(PUBLISH,SUBSCRIBE,ALL)")
private String activity;
/** 创建时间 */
@ApiModelProperty("创建时间")
private Integer create_time;
/** 描述 */
@ApiModelProperty("描述")
private String describe;
/** 主键 */
@ApiModelProperty("主键")
private Integer id;
/** 质量(ZERO,ONE,TWO,ZERO_ONE,ZERO_TWO,ONE_TWO,ALL) */
@ApiModelProperty("质量(ZERO,ONE,TWO,ZERO_ONE,ZERO_TWO,ONE_TWO,ALL)")
private String qos;
/** 是否保留(RETAINED,NOT_RETAINED,ALL) */
@ApiModelProperty("是否保留(RETAINED,NOT_RETAINED,ALL)")
private String retain;
/** 角色id */
@ApiModelProperty("角色id")
private Integer role_id;
/** 共享组 */
@ApiModelProperty("共享组")
private String shared_group;
/** 共享订阅(SHARED,NOT_SHARED,ALL) */
@ApiModelProperty("共享订阅(SHARED,NOT_SHARED,ALL)")
private String shared_subscription;
/** topic(同一角色有切只有一个) */
@ApiModelProperty("topic(同一角色有切只有一个)")
private String topic;
public void setActivity(String activity)
{
this.activity = activity;
}
public String getActivity()
{
return activity;
}
public void setCreate_time(Integer create_time)
{
this.create_time = create_time;
}
public Integer getCreate_time()
{
return create_time;
}
public void setDescribe(String describe)
{
this.describe = describe;
}
public String getDescribe()
{
return describe;
}
public void setId(Integer id)
{
this.id = id;
}
public Integer getId()
{
return id;
}
public void setQos(String qos)
{
this.qos = qos;
}
public String getQos()
{
return qos;
}
public void setRetain(String retain)
{
this.retain = retain;
}
public String getRetain()
{
return retain;
}
public void setRole_id(Integer role_id)
{
this.role_id = role_id;
}
public Integer getRole_id()
{
return role_id;
}
public void setShared_group(String shared_group)
{
this.shared_group = shared_group;
}
public String getShared_group()
{
return shared_group;
}
public void setShared_subscription(String shared_subscription)
{
this.shared_subscription = shared_subscription;
}
public String getShared_subscription()
{
return shared_subscription;
}
public void setTopic(String topic)
{
this.topic = topic;
}
public String getTopic()
{
return topic;
}
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("activity", getActivity())
.append("create_time", getCreate_time())
.append("describe", getDescribe())
.append("id", getId())
.append("qos", getQos())
.append("retain", getRetain())
.append("role_id", getRole_id())
.append("shared_group", getShared_group())
.append("shared_subscription", getShared_subscription())
.append("topic", getTopic())
.toString();
}
}
package com.zhonglai.luhui.mqtt.comm.dto.iot;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
* 公司对象 iot_role
*
* @author 钟来
* @date 2022-08-26
*/
@ApiModel("公司")
public class IotRole
{
private static final long serialVersionUID = 1L;
/** 创建时间 */
@ApiModelProperty("创建时间")
private Integer create_time;
/** 描述 */
@ApiModelProperty("描述")
private String describe;
/** 主键 */
@ApiModelProperty("主键")
private Integer id;
/** 名称 */
@ApiModelProperty("名称")
private String name;
/** 是否使用(0否,1是) */
@ApiModelProperty("是否使用(0否,1是)")
private Integer used;
public void setCreate_time(Integer create_time)
{
this.create_time = create_time;
}
public Integer getCreate_time()
{
return create_time;
}
public void setDescribe(String describe)
{
this.describe = describe;
}
public String getDescribe()
{
return describe;
}
public void setId(Integer id)
{
this.id = id;
}
public Integer getId()
{
return id;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public void setUsed(Integer used)
{
this.used = used;
}
public Integer getUsed()
{
return used;
}
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("create_time", getCreate_time())
.append("describe", getDescribe())
.append("id", getId())
.append("name", getName())
.append("used", getUsed())
.toString();
}
}
package com.zhonglai.luhui.mqtt.comm.dto.iot;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
* 终端对象 iot_terminal
*
* @author 钟来
* @date 2022-08-26
*/
@ApiModel("终端")
public class IotTerminal
{
private static final long serialVersionUID = 1L;
/** 网关id */
@ApiModelProperty("网关id")
private String device_id;
/** 主键id */
@ApiModelProperty("主键id")
private String id;
/** 终端名称 */
@ApiModelProperty("终端名称")
private String name;
/** 物模型值 */
@ApiModelProperty("物模型值")
private String things_model_value;
/** 更新时间 */
@ApiModelProperty("更新时间")
private Integer update_time;
public void setDevice_id(String device_id)
{
this.device_id = device_id;
}
public String getDevice_id()
{
return device_id;
}
public void setId(String id)
{
this.id = id;
}
public String getId()
{
return id;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public void setThings_model_value(String things_model_value)
{
this.things_model_value = things_model_value;
}
public String getThings_model_value()
{
return things_model_value;
}
public void setUpdate_time(Integer update_time)
{
this.update_time = update_time;
}
public Integer getUpdate_time()
{
return update_time;
}
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("device_id", getDevice_id())
.append("id", getId())
.append("name", getName())
.append("things_model_value", getThings_model_value())
.append("update_time", getUpdate_time())
.toString();
}
}
package com.zhonglai.luhui.mqtt.comm.dto.thingsmodels;
import com.alibaba.fastjson.annotation.JSONField;
import com.zhonglai.luhui.mqtt.comm.dto.iot.IotThingsModel;
import com.ruoyi.system.domain.IotThingsModel;
/**
* 物模型工厂
... ... @@ -12,4 +12,5 @@ public interface ThingsModelBase<T> {
// @JSONField(serialize=false)
String getView();
String getSaveView();
Object getCmdView(Object value);
}
... ...
package com.zhonglai.luhui.mqtt.comm.dto.thingsmodels;
import com.zhonglai.luhui.mqtt.comm.dto.iot.IotThingsModel;
import com.ruoyi.system.domain.IotThingsModel;
import lombok.Data;
/**
... ... @@ -26,6 +26,8 @@ public abstract class ThingsModelItemBase<T> implements ThingsModelBase<T>
private Integer is_save_log;
/** 模型类别(1-属性,2-功能,3-事件) */
private Integer mode_type;
/** 模型类别(1-属性,2-功能,3-事件) */
private String config_names;
public void conversionThingsModel(IotThingsModel thingsModel)
{
... ... @@ -36,6 +38,7 @@ public abstract class ThingsModelItemBase<T> implements ThingsModelBase<T>
type = thingsModel.getData_type();
is_save_log = thingsModel.getIs_save_log();
mode_type = thingsModel.getType();
config_names = thingsModel.getConfig_names();
}
}
... ...
... ... @@ -33,4 +33,9 @@ public class ArrayModelOutput extends ThingsModelItemBase<JSONArray>
}
return JSONArray.toJSONString(getValue());
}
@Override
public Object getCmdView(Object object) {
return object;
}
}
... ...
... ... @@ -37,4 +37,9 @@ public class BoolModelOutput extends ThingsModelItemBase<Boolean>
}
return getValue().toString();
}
@Override
public Object getCmdView(Object object) {
return object;
}
}
... ...
... ... @@ -24,7 +24,7 @@ public class DecimalModelOutput extends ThingsModelItemBase<BigDecimal>
{
return null;
}
return getValue().doubleValue()+unit;
return getValue().doubleValue()+(null==unit?"":unit);
}
@Override
... ... @@ -35,4 +35,9 @@ public class DecimalModelOutput extends ThingsModelItemBase<BigDecimal>
}
return getValue().toString();
}
@Override
public Object getCmdView(Object object) {
return object;
}
}
... ...
... ... @@ -7,33 +7,46 @@ import lombok.Data;
import java.util.List;
@Data
public class EnumModelOutput extends ThingsModelItemBase<String>
public class EnumModelOutput extends ThingsModelItemBase<Object>
{
private List<EnumItemOutput> enumList;
@Override
public void addValue(String object) {
public void addValue(Object object) {
setValue(object);
}
@Override
public String getView() {
if(null == getValue())
{
return null;
}
if(null == enumList || enumList.size()==0)
{
return null;
}
for(EnumItemOutput enumItemOutput:enumList)
{
if(enumItemOutput.getValue().equals(getValue()))
if(enumItemOutput.getValue().equals(getValue()+""))
{
return enumItemOutput.getText();
}
}
return getValue();
return getValue()+"";
}
@Override
public String getSaveView() {
return getValue();
if(null == getValue())
{
return null;
}
return getValue()+"";
}
@Override
public Object getCmdView(Object object) {
return object;
}
}
... ...
... ... @@ -27,7 +27,7 @@ public class IntegerModelOutput extends ThingsModelItemBase<Integer>
{
return null;
}
return getSaveView()+unit;
return getSaveView()+(null==unit?"":unit);
}
@Override
... ... @@ -39,4 +39,14 @@ public class IntegerModelOutput extends ThingsModelItemBase<Integer>
BigDecimal bigDecimal = new BigDecimal(getValue().toString());
return bigDecimal.divide(new BigDecimal(acy),acy.toString().length()-1, RoundingMode.HALF_UP).toString();
}
@Override
public Object getCmdView(Object object) {
if(null == object)
{
return null;
}
BigDecimal bigDecimal = new BigDecimal(object.toString());
return bigDecimal.multiply(new BigDecimal(acy)).intValue();
}
}
... ...
... ... @@ -25,4 +25,9 @@ public class StringModelOutput extends ThingsModelItemBase<Object>
public String getSaveView() {
return getView();
}
@Override
public Object getCmdView(Object object) {
return object;
}
}
... ...
... ... @@ -4,6 +4,7 @@ import com.zhonglai.luhui.mqtt.comm.config.RedisConfig;
import com.zhonglai.luhui.mqtt.comm.config.SysParameter;
import com.zhonglai.luhui.mqtt.comm.dto.MyException;
import com.zhonglai.luhui.mqtt.comm.service.MqttCallback;
import com.zhonglai.luhui.mqtt.comm.util.StringUtils;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
... ... @@ -19,9 +20,29 @@ public class Topic {
private String username;
private String clientid;
private String topicType;
private String redicKey;
private String messageid;
private String payloadtype;
public Topic() {
}
public Topic(String roleid, String username, String clientid, String topicType, String payloadtype) {
this.roleid = roleid;
this.username = username;
this.clientid = clientid;
this.topicType = topicType;
this.payloadtype = payloadtype;
}
public Topic(String roleid, String username, String clientid, String topicType, String messageid, String payloadtype) {
this.roleid = roleid;
this.username = username;
this.clientid = clientid;
this.topicType = topicType;
this.messageid = messageid;
this.payloadtype = payloadtype;
}
public Topic(String topic)
{
topic = Optional.ofNullable(topic).orElseThrow(()->new MyException("topic为空"));
... ... @@ -45,17 +66,72 @@ public class Topic {
}
}
}
public String getRedicKey()
/**
* 生成缓存关键字
* @return
*/
public String generateRedicKey()
{
if(null == redicKey)
{
return generateRedicKey();
}
return redicKey;
return generate(":");
}
/**
* 生成发送消息的topic
* @return
*/
public String generateSendMessageTopic()
{
return "/"+generate("/");
}
private String generateRedicKey()
/**
* 生成客户端关键字
* @return
*/
public String generateClienKey()
{
return RedisConfig.FIELD+roleid+":"+username+":"+clientid;
return "/"+generate("/");
}
private String generate(String division)
{
String str = SysParameter.topicconfig;
if(StringUtils.isEmpty(roleid))
{
roleid = "2";
}
str = str.replace("/{{roleid}}",roleid+division);
if(StringUtils.isEmpty(username))
{
username = "+";
}
str = str.replace("/{{username}}",username+division);
if(StringUtils.isEmpty(clientid))
{
clientid = "+";
}
str = str.replace("/{{clientid}}",clientid+division);
if(StringUtils.isEmpty(payloadtype))
{
payloadtype = "String";
}
str = str.replace("/{{payloadtype}}",payloadtype+division);
if(StringUtils.isEmpty(topicType))
{
topicType = "PUT";
}
str = str.replace("/{{topicType}}",topicType+division);
if(StringUtils.isNotEmpty(messageid))
{
str = str.replace("/{{messageid}}",messageid);
}
return str;
}
}
... ...
package com.zhonglai.luhui.mqtt.comm.service;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.system.domain.IotDevice;
import com.ruoyi.system.domain.IotTerminal;
import com.zhonglai.luhui.mqtt.comm.config.SysParameter;
import com.zhonglai.luhui.mqtt.comm.dto.DeviceSensorData;
import com.zhonglai.luhui.mqtt.comm.dto.LogDeviceOperation;
import com.zhonglai.luhui.mqtt.comm.dto.iot.IotDevice;
import com.zhonglai.luhui.mqtt.comm.dto.iot.IotTerminal;
import com.zhonglai.luhui.mqtt.comm.factory.Topic;
import com.zhonglai.luhui.mqtt.comm.util.DateUtils;
import com.zhonglai.luhui.mqtt.dto.SaveDataDto;
import com.zhonglai.luhui.mqtt.dto.topic.AddPostDto;
import com.zhonglai.luhui.mqtt.service.db.DeviceService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
... ... @@ -20,6 +25,8 @@ import java.util.List;
*/
@Service
public class BusinessDataUpdateService {
private static final Logger logger = LoggerFactory.getLogger(BusinessDataUpdateService.class);
@Autowired
private DataModeAnalysisService dataModeAnalysisService ;
@Autowired
... ... @@ -27,6 +34,14 @@ public class BusinessDataUpdateService {
@Autowired
private DeviceService deviceService ;
@Value("${server.port}")
private long port;
@Value("${server.context-path}")
private String contextPath;
@Value("${sys.isText:false}")
private Boolean isText;
/**
* 更新数据
* @param type
... ... @@ -35,6 +50,13 @@ public class BusinessDataUpdateService {
*/
public void updataDta(Type type,Topic topic, JSONObject data,boolean isOperLog,List<LogDeviceOperation> operateHisList, List<DeviceSensorData> list)
{
if(1==deviceService.getlockIotDevice(topic.getClientid()))
{
logger.info("设备锁定等待解锁");
return;
}
IotDevice olddevice = deviceService.getRedicDevice(topic.getClientid());
for(String key:data.keySet())
{
Object o = data.get(key);
... ... @@ -43,11 +65,18 @@ public class BusinessDataUpdateService {
JSONObject jsData = data.getJSONObject(key);
if("0".equals(key)) //主机
{
IotDevice iotDevice = translateDevice(type,topic,jsData,isOperLog,operateHisList,list);
IotDevice iotDevice = translateDevice(type,olddevice,jsData,isOperLog,operateHisList,list);
if(isText)
{
iotDevice.setListen_service_ip("127.0.0.1"+":"+port+contextPath);
}else{
iotDevice.setListen_service_ip(SysParameter.service_ip+":"+port+contextPath);
}
logger.info("更新网关数据{}",iotDevice);
deviceService.updataDevice(iotDevice);
}else{ //终端
IotTerminal iotTerminal = translateTerminal(type,key,topic,jsData,isOperLog,operateHisList,list);
IotTerminal iotTerminal = translateTerminal(type,key,olddevice,jsData,isOperLog,operateHisList,list);
logger.info("更新终端数据{}",iotTerminal);
deviceService.updataTerminal(iotTerminal);
}
}
... ... @@ -57,40 +86,45 @@ public class BusinessDataUpdateService {
/**
* 更新网关
* @param type
* @param topic
* @param olddevice
* @param jsData
* @param operateHisList
* @return
*/
private IotDevice translateDevice(Type type,Topic topic , JSONObject jsData,boolean isOperLog, List<LogDeviceOperation> operateHisList, List<DeviceSensorData> list)
private IotDevice translateDevice(Type type, IotDevice olddevice , JSONObject jsData,boolean isOperLog, List<LogDeviceOperation> operateHisList, List<DeviceSensorData> list)
{
IotDevice olddevice = deviceService.getRedicDevice(topic.getClientid());
JSONObject summaryObjec = null;
if(jsData.containsKey("summary") && null != jsData.get("summary") && jsData.get("summary") instanceof JSONObject)
{
summaryObjec = jsData.getJSONObject("summary");
//记录summary内容变更日志
operateHisList.add(deviceLogService.newLogDeviceOperation(topic.getClientid(),summaryObjec.toString(),olddevice.getSummary(),"主机本地summary状态更新",jsData.toJSONString()));
operateHisList.add(deviceLogService.newLogDeviceOperation(olddevice.getClient_id(),summaryObjec.toString(),olddevice.getSummary(),"主机本地summary状态更新",jsData.toJSONString()));
jsData.remove("summary");
}
IotDevice device = JSONObject.parseObject(JSONObject.toJSONString(jsData),IotDevice.class);
device.setClient_id(topic.getClientid());
device.setClient_id(olddevice.getClient_id());
device.setUpdate_time(DateUtils.getNowTimeMilly());
device.setMqtt_username(olddevice.getMqtt_username());
device.setProduct_id(olddevice.getProduct_id());
if(null != summaryObjec)
{
device.setSummary(summaryObjec.toString());
}
JSONObject saveJson = dataModeAnalysisService.analysisThingsModelValue( topic.getClientid(),topic.getUsername(),jsData,"主机本地",isOperLog,operateHisList,list);
SaveDataDto saveDataDto = dataModeAnalysisService.analysisThingsModelValue( olddevice.getClient_id(),olddevice.getMqtt_username(),jsData,"主机本地",isOperLog,operateHisList,list);
//更新数据
if(null != olddevice && "ADD".equals(type.name()))
if(null != olddevice && ("ADD".equals(type.name())|| "READ".equals(type.name())))
{
String str = olddevice.getThings_model_value();
String newStr = deviceService.getNewAdddate(str,saveJson).toJSONString();
String newStr = deviceService.getNewAdddate(str,saveDataDto.getData()).toJSONString();
device.setThings_model_value(newStr);
}else{
device.setThings_model_value(saveJson.toJSONString());
device.setThings_model_value(saveDataDto.getData().toJSONString());
}
//配置只做增量
String str = (null!=olddevice?olddevice.getThings_model_config():null);
String newStr = deviceService.getNewAdddate(str,saveDataDto.getConfig()).toJSONString();
device.setThings_model_config(newStr);
return device;
}
... ... @@ -99,28 +133,47 @@ public class BusinessDataUpdateService {
* 更新终端
* @param type "ADD"增量更新,"ALL"全量更新
* @param key
* @param topic
* @param olddevice
* @param jsData
* @param operateHisList
* @return
*/
private IotTerminal translateTerminal(Type type,String key, Topic topic , JSONObject jsData,boolean isOperLog, List<LogDeviceOperation> operateHisList, List<DeviceSensorData> list)
private IotTerminal translateTerminal(Type type,String key, IotDevice olddevice , JSONObject jsData,boolean isOperLog, List<LogDeviceOperation> operateHisList, List<DeviceSensorData> list)
{
String id = topic.getClientid()+"_"+key;
JSONObject saveJson = dataModeAnalysisService.analysisThingsModelValue( id,topic.getUsername(),jsData,"终端本地",isOperLog,operateHisList,list);
String id = olddevice.getClient_id()+"_"+key;
SaveDataDto saveDataDto = dataModeAnalysisService.analysisThingsModelValue( id,olddevice.getMqtt_username(),jsData,"终端本地",isOperLog,operateHisList,list);
IotTerminal terminal = new IotTerminal();
terminal.setId(id);
terminal.setUpdate_time(DateUtils.getNowTimeMilly());
terminal.setDevice_id(olddevice.getClient_id());
terminal.setProduct_id(olddevice.getProduct_id());
terminal.setMqtt_username(olddevice.getMqtt_username());
//更新数据
IotTerminal oldterminal = deviceService.getRedicTerminal(id);
if(null != oldterminal && "ADD".equals(type.name()))
if(null == oldterminal)
{
oldterminal = new IotTerminal();
oldterminal.setDevice_id(olddevice.getClient_id());
oldterminal.setId(id);
oldterminal.setMqtt_username(olddevice.getMqtt_username());
oldterminal.setName(olddevice.getMqtt_username()+"终端"+key);
oldterminal.setProduct_id(olddevice.getProduct_id());
deviceService.updataTerminal(oldterminal);
}
if(null != oldterminal && ("ADD".equals(type.name())|| "READ".equals(type.name())))
{
String str = oldterminal.getThings_model_value();
terminal.setThings_model_value(deviceService.getNewAdddate(str,saveJson).toJSONString());
terminal.setThings_model_value(deviceService.getNewAdddate(str,saveDataDto.getData()).toJSONString());
}else{
terminal.setThings_model_value(saveJson.toJSONString());
terminal.setThings_model_value(saveDataDto.getData().toJSONString());
}
if(key.startsWith("1_") && null != saveDataDto.getConfig())
{
System.out.println(saveDataDto);
}
String str = (null!=oldterminal?oldterminal.getThings_model_config():null);
terminal.setThings_model_config(deviceService.getNewAdddate(str,saveDataDto.getConfig()).toJSONString());
return terminal;
}
... ...
package com.zhonglai.luhui.mqtt.comm.service;
import com.mysql.cj.x.protobuf.MysqlxDatatypes;
import com.zhonglai.luhui.mqtt.comm.clien.ClienConnection;
import com.zhonglai.luhui.mqtt.comm.clien.impl.ClienConnectionImpl;
import com.zhonglai.luhui.mqtt.comm.dto.ServerDto;
... ... @@ -18,6 +19,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
... ... @@ -30,14 +32,14 @@ public class ClienNoticeService {
@Autowired
private TerminalService terminalService;
@Autowired
private TopicsService topicsService;
private ExpiringMap<String, ClienConnection> clienConnectionMap;
@Value("${mqtt.client.operationTime}")
private long operationTime; //客户端操作时间
@Value("#{${mqtt.top_return_map}}")
private Map<String,String> top_return_map; //topic返回的对应关系
@PostConstruct
public void init()
{
... ... @@ -48,46 +50,45 @@ public class ClienNoticeService {
// CREATED: 只在put和replace方法清零过期时间
// ACCESSED: 在CREATED策略基础上增加, 在还没过期时get方法清零过期时间。
// 清零过期时间也就是重置过期时间,重新计算过期时间.
clienConnectionMap = ExpiringMap.builder().maxSize(2000).expiration(operationTime, TimeUnit.SECONDS)
clienConnectionMap = ExpiringMap.builder().maxSize(20000).expiration(operationTime, TimeUnit.SECONDS)
.asyncExpirationListener((ExpirationListener<String, ClienConnection>) (s, clienConnection) -> clienConnection.close())
.expirationPolicy(ExpirationPolicy.CREATED).build();
}
public Message sendMessage(String imei, MqttMessage mqttMessage, String messageid) throws MqttException, InterruptedException {
public Message sendMessage(Topic topic, MqttMessage mqttMessage) throws MqttException, InterruptedException {
//设置通知渠道
ClienConnection clienConnection = new ClienConnectionImpl();
clienConnectionMap.put(topicsService.getClienConnectionMapKey(imei,messageid),clienConnection);
log.info("{} {} {} {}",topic.generateClienKey(),topic.getTopicType(),top_return_map,clienConnection);
clienConnectionMap.put(topic.generateClienKey().replace(topic.getTopicType(),top_return_map.get(topic.getTopicType())),clienConnection);
sendMessage(imei,messageid,mqttMessage);
sendMessage(topic.generateSendMessageTopic(),mqttMessage);
synchronized(clienConnection)
{
log.info("{}等待通知",imei);
log.info("{}等待通知",topic.getClientid());
clienConnection.wait(operationTime*1000+3000l);
}
log.info("{}收到通知{}",imei,clienConnection.getReplyMessage().getMessage());
log.info("{}收到通知{}",topic.getClientid(),clienConnection.getReplyMessage().getMessage());
Message message = clienConnection.getReplyMessage();
log.info("{}返回通知{}",imei,message);
log.info("{}返回通知{}",topic.getClientid(),message);
return message;
}
/**
* 发送消息
* @param imei
* @param mqttMessage
* @throws MqttException
* @throws InterruptedException
*/
public void sendMessage(String imei,String messageid, MqttMessage mqttMessage) throws MqttException, InterruptedException {
public void sendMessage(String topic,MqttMessage mqttMessage) throws MqttException, InterruptedException {
//发生指令,等待通知
String topic = topicsService.getTopicFromImei(imei,messageid);
System.out.println("发送的消息内容"+ ByteUtil.hexStringToSpace(ByteUtil.toHexString(mqttMessage.getPayload()).toUpperCase()));
System.out.println(topic+"发送的消息内容"+ ByteUtil.hexStringToSpace(ByteUtil.toHexString(mqttMessage.getPayload()).toUpperCase())+" 转化为字符串:"+new String(mqttMessage.getPayload()));
terminalService.publish(topic,mqttMessage);
}
public ClienConnection getClienConnection(String imei, String messageid)
public ClienConnection getClienConnection(Topic topic)
{
return clienConnectionMap.get(topicsService.getClienConnectionMapKey(imei,messageid));
return clienConnectionMap.get(topic.generateClienKey());
}
public void replySendMessage(Topic topic, ServerDto dto)
... ... @@ -96,7 +97,7 @@ public class ClienNoticeService {
//判断有没有需要回复的客户端,如果有就回复
if(dto.isReplyMessage())
{
ClienConnection clienConnection = getClienConnection(topic.getClientid(),dto.getServerAgreementContent().getClienConnectionId());
ClienConnection clienConnection = getClienConnection(topic);
if(null != clienConnection)
{
synchronized(clienConnection)
... ...
... ... @@ -2,26 +2,24 @@ package com.zhonglai.luhui.mqtt.comm.service;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.zhonglai.luhui.mqtt.comm.config.RedisConfig;
import com.zhonglai.luhui.mqtt.comm.config.SysParameter;
import com.ruoyi.system.domain.IotThingsModel;
import com.zhonglai.luhui.mqtt.comm.dao.BaseDao;
import com.zhonglai.luhui.mqtt.comm.dto.DeviceSensorData;
import com.zhonglai.luhui.mqtt.comm.dto.LogDeviceOperation;
import com.zhonglai.luhui.mqtt.comm.dto.iot.IotThingsModel;
import com.zhonglai.luhui.mqtt.comm.dto.thingsmodels.ThingsModelBase;
import com.zhonglai.luhui.mqtt.comm.dto.thingsmodels.ThingsModelDataTypeEnum;
import com.zhonglai.luhui.mqtt.comm.dto.thingsmodels.ThingsModelItemBase;
import com.zhonglai.luhui.mqtt.comm.util.DateUtils;
import com.zhonglai.luhui.mqtt.comm.util.StringUtils;
import com.zhonglai.luhui.mqtt.dto.SaveDataDto;
import com.zhonglai.luhui.mqtt.service.db.mode.TerminalDataThingsModeService;
import org.apache.commons.lang3.EnumUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* 数据模型解析服务
... ... @@ -35,40 +33,37 @@ public class DataModeAnalysisService {
@Autowired
private DeviceLogService dviceLogService;
@Autowired
private TerminalDataThingsModeService terminalDataThingsModeService;
/**
* 初始化物模型数据
*/
public void initDataThingsMode(String roleIds,String usernames)
{
String sql = "SELECT a.*,b.username user_name FROM `mqtt_broker`.`iot_things_model` a LEFT JOIN `mqtt_broker`.`iot_user` b ON a.`user_id`=b.`id` WHERE a.del_flag=0 AND b.`role_id` IN("+roleIds+")";
String sql = "SELECT a.*,b.mqtt_username mqtt_username FROM `mqtt_broker`.`iot_things_model` a LEFT JOIN `mqtt_broker`.`iot_product` b ON a.`product_id`=b.`id` WHERE a.del_flag=0 AND b.`role_id` IN("+roleIds+")";
if(StringUtils.isNotEmpty(usernames))
{
sql += " AND b.`username` IN("+usernames+")";
}
List<IotThingsModel> list = baseDao.findBysql(sql, IotThingsModel.class);
if(null != list && list.size() != 0)
{
for(IotThingsModel thingsModel:list)
{
SysParameter.setTerminalDataThingsMode(thingsModel.getUser_name(),thingsModel);
}
}
terminalDataThingsModeService.saveIotThingsModelToUser(list);
}
/**
* 解析物模型数据
*/
public JSONObject analysisThingsModelValue(String id,String userName ,JSONObject jsData,String controlModel,boolean isOperLog, List<LogDeviceOperation> operateHisList, List<DeviceSensorData> list)
public SaveDataDto analysisThingsModelValue(String id,String userName ,JSONObject jsData,String controlModel,boolean isOperLog, List<LogDeviceOperation> operateHisList, List<DeviceSensorData> list)
{
if(null != jsData && jsData.size() != 0 )
{
JSONObject rObjec = new JSONObject();
JSONObject data = new JSONObject();
JSONObject config = new JSONObject();
for(String key:jsData.keySet())
{
IotThingsModel thingsModel = SysParameter.getTerminalDataThingsMode(userName,key);
IotThingsModel thingsModel = terminalDataThingsModeService.getIotThingsModel(userName,key);
if(null == thingsModel) //没有配置的 都按字符串处理
{
thingsModel = new IotThingsModel();
... ... @@ -78,12 +73,13 @@ public class DataModeAnalysisService {
thingsModel.setIs_top(0);
thingsModel.setIs_monitor(0);
thingsModel.setIs_save_log(0);
thingsModel.setIs_config(0);
JSONObject jsonObject = new JSONObject();
jsonObject.put("maxLength",255);
thingsModel.setSpecs(jsonObject.toString());
}
String data_type = thingsModel.getData_type().toUpperCase();
if(!jsData.get(key).getClass().getSimpleName().toUpperCase().equals(data_type))
if(!EnumUtils.isValidEnum(ThingsModelDataTypeEnum.class,data_type))
{
data_type = ThingsModelDataTypeEnum.STRING.name();
}
... ... @@ -95,7 +91,7 @@ public class DataModeAnalysisService {
ThingsModelItemBase thingsModelItemBase = (ThingsModelItemBase) thingsModelBase;
//记录数据日志
if(1==thingsModelItemBase.getIs_save_log())
if(1==thingsModelItemBase.getIs_save_log() && null != list)
{
DeviceSensorData sensorData = new DeviceSensorData();
sensorData.setDataType(key);
... ... @@ -107,15 +103,22 @@ public class DataModeAnalysisService {
}
//记录操作日志
if(isOperLog)
if(isOperLog && null != operateHisList)
{
operateHisList.add(dviceLogService.newLogDeviceOperation(id,thingsModelBase.getSaveView(),null,controlModel+thingsModelItemBase.getName()+"为"+thingsModelBase.getView(),jsData.toString()));
}
rObjec.put(key,thingsModelBase);
if(1==thingsModel.getIs_config())
{
config.put(key,thingsModelBase);
}else{
data.put(key,thingsModelBase);
}
}
return rObjec;
SaveDataDto saveDataDto = new SaveDataDto();
saveDataDto.setConfig(config);
saveDataDto.setData(data);
return saveDataDto;
}
return null;
}
... ...
... ... @@ -17,7 +17,6 @@ public abstract class DataPersistenceService {
protected BaseDao baseDao = new BaseDao();
public abstract void persistence(Topic topic, ServerDto serverDto);
public abstract void addDeviceSensorData(Topic topic, ServerDto serverDto);
/**
* 记录操作日志
... ...
package com.zhonglai.luhui.mqtt.comm.service;
import com.ruoyi.system.domain.IotDevice;
import com.zhonglai.luhui.mqtt.comm.dto.DeviceSensorData;
import com.zhonglai.luhui.mqtt.comm.dto.LogDeviceOperation;
import com.zhonglai.luhui.mqtt.comm.dto.ServerDto;
import com.zhonglai.luhui.mqtt.comm.dto.business.BusinessDto;
import com.zhonglai.luhui.mqtt.comm.dto.business.BusinessDtoClassNew;
import com.zhonglai.luhui.mqtt.comm.dto.iot.IotDevice;
import com.zhonglai.luhui.mqtt.comm.factory.BusinessAgreement;
import com.zhonglai.luhui.mqtt.comm.factory.BusinessAgreementFactory;
import com.zhonglai.luhui.mqtt.comm.factory.Topic;
... ... @@ -69,11 +69,15 @@ public class MqttCallback implements MqttCallbackExtended {
byte[] data = mqttMessage.getPayload();
IotDevice iotDevice = deviceService.getDeviceById(topic.getClientid());
//转化为协议对象
BusinessDto businessDto = BusinessDtoClassNew.newBean(topic.getPayloadtype(),data).analyticalModel(iotDevice.getThings_model_value());
BusinessAgreement businessAgreement = businessAgreementFactory.createBusinessAgreement(topic);
if("ONLINE".equals(topic.getTopicType().toUpperCase()))
{
topic.setPayloadtype("String");
}
try {
//转化为协议对象
BusinessDto businessDto = BusinessDtoClassNew.newBean(topic.getPayloadtype(),data).analyticalModel(iotDevice.getThings_model_value());
BusinessAgreement businessAgreement = businessAgreementFactory.createBusinessAgreement(topic);
//解析为业务对象
ServerDto dto = businessAgreement.analysis(topic,businessAgreement.toData(businessDto));
if(null == dto)
... ... @@ -87,7 +91,6 @@ public class MqttCallback implements MqttCallbackExtended {
//数据持久化
dataPersistenceService.persistence(topic,dto);
} catch (Exception e) {
log.error(s+"消息解析异常",e);
}
... ...
package com.zhonglai.luhui.mqtt.comm.service;
import com.zhonglai.luhui.mqtt.comm.config.RedisConfig;
import com.zhonglai.luhui.mqtt.comm.service.redis.RedisService;
import com.zhonglai.luhui.mqtt.service.db.DeviceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
... ... @@ -15,6 +17,9 @@ public class RedisKeyExpirationListener extends KeyExpirationEventMessageListene
@Autowired
private DataPersistenceService dtaPersistenceService;
@Autowired
private DeviceService deviceService ;
public RedisKeyExpirationListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
... ... @@ -22,9 +27,18 @@ public class RedisKeyExpirationListener extends KeyExpirationEventMessageListene
@Override
public void onMessage(Message message, byte[] pattern) {
String expiredKey = message.toString();
if(expiredKey.startsWith(RedisConfig.getRedisKeyPath())) //指定设备离线
String devicePath = deviceService.getRedicDeviceKeyPath();
String terminalPath = deviceService.getRedicTerminalKeyPath();
if(expiredKey.startsWith(devicePath)) //如果是主机
{
String imei = expiredKey.replace(devicePath,"").replace(":","");
dtaPersistenceService.offLine(imei);
}
if(expiredKey.startsWith(terminalPath)) //如果是终端
{
String imei = expiredKey.replace(RedisConfig.getRedisKeyPath(),"");
String imei = expiredKey.replace(devicePath,"").replace(":","");
dtaPersistenceService.offLine(imei);
}
}
... ...
package com.zhonglai.luhui.mqtt.comm.service;
public interface TopicsService {
String getClienConnectionMapKey(String imei, String messageid);
String getTopicFromImei(String imei, String messageid);
}
... ...
package com.zhonglai.luhui.mqtt.comm.service;
package com.zhonglai.luhui.mqtt.comm.service.redis;
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
... ...
package com.zhonglai.luhui.mqtt.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.system.domain.IotDevice;
import com.ruoyi.system.domain.IotThingsModel;
import com.zhonglai.luhui.mqtt.comm.dao.BaseDao;
import com.zhonglai.luhui.mqtt.comm.dto.thingsmodels.ThingsModelBase;
import com.zhonglai.luhui.mqtt.comm.dto.thingsmodels.ThingsModelDataTypeEnum;
import com.zhonglai.luhui.mqtt.comm.factory.Topic;
import com.zhonglai.luhui.mqtt.comm.service.ClienNoticeService;
import com.zhonglai.luhui.mqtt.comm.util.DateUtils;
import com.zhonglai.luhui.mqtt.dto.Message;
import com.zhonglai.luhui.mqtt.dto.MessageCode;
import com.zhonglai.luhui.mqtt.service.db.DeviceService;
import com.zhonglai.luhui.mqtt.service.db.mode.TerminalDataThingsModeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
@Api(tags = "设备操作")
... ... @@ -20,25 +33,177 @@ public class DeviceController {
@Autowired
private ClienNoticeService clienNoticeService;
@Autowired
private TerminalDataThingsModeService terminalDataThingsModeService;
private BaseDao baseDao = new BaseDao();
@Autowired
private DeviceService deviceService ;
@ApiOperation("控制发16进制指令")
@RequestMapping(value = "controlHex/{clienid}",method = RequestMethod.POST)
public Message controlHex(@PathVariable String clienid, String data) throws MqttException, InterruptedException {
Topic topic = getTopicFromDb(clienid);
if(null == topic)
{
return new Message(MessageCode.DEFAULT_FAIL_CODE,"mqtt_username查询失败");
}
topic.setTopicType("PUT");
topic.setMessageid(DateUtils.getNowTimeMilly()+"");
MqttMessage mqttMessage = new MqttMessage();
byte[] bs = hexStringToByte(data.trim().toUpperCase());
mqttMessage.setPayload(bs);
Message message = clienNoticeService.sendMessage(clienid,mqttMessage, DateUtils.getNowTimeMilly()+"");
Message message = clienNoticeService.sendMessage(topic,mqttMessage);
return message;
}
@ApiOperation("读")
@RequestMapping(value = "read/{clienid}",method = RequestMethod.POST)
public Message read(@PathVariable String clienid,@RequestBody Map<String,Object> map) throws MqttException, InterruptedException {
if(null == map || map.size() ==0)
{
return new Message(MessageCode.DEFAULT_FAIL_CODE,"参数验证失败");
}
Topic topic = getTopicFromDb(clienid);
if(null == topic)
{
return new Message(MessageCode.DEFAULT_FAIL_CODE,"mqtt_username查询失败");
}
topic.setTopicType("READ");
topic.setMessageid(DateUtils.getNowTimeMilly()+"");
MqttMessage mqttMessage = new MqttMessage();
mqttMessage.setPayload(JSON.toJSONString(map).trim().getBytes());
Message message = clienNoticeService.sendMessage(topic,mqttMessage);
return message;
}
@ApiOperation("强行断开链接")
@RequestMapping(value = "closeSession/{clienid}",method = RequestMethod.POST)
public Message closeSession(@PathVariable String clienid) throws MqttException, InterruptedException {
MqttMessage mqttMessage = new MqttMessage();
byte[] bs = hexStringToByte(clienid.trim().toUpperCase());
mqttMessage.setPayload(bs);
clienNoticeService.sendMessage("CLOSE",mqttMessage);
return new Message(MessageCode.DEFAULT_SUCCESS_CODE,"端口请求已发送");
}
@ApiOperation("删除主机")
@Transactional
@RequestMapping(value = "delIotDevice/{client_id}",method = RequestMethod.POST)
public Message delIotDevice(@PathVariable String client_id) throws MqttException, InterruptedException {
deviceService.lockIotDevice(client_id);//先锁定
closeSession(client_id); //强制下线
baseDao.updateBySql("DELETE FROM `iot_terminal` WHERE device_id='"+client_id+"'");
baseDao.updateBySql("DELETE FROM `iot_device` WHERE client_id='"+client_id+"'");
deviceService.unlockIotDevice(client_id);//解锁
return new Message(MessageCode.DEFAULT_SUCCESS_CODE);
}
@ApiOperation("删除终端")
@Transactional
@RequestMapping(value = "delIotTerminal/{client_id}/{number}",method = RequestMethod.POST)
public Message delIotTerminal(@PathVariable String client_id,@PathVariable String number) throws MqttException, InterruptedException {
deviceService.lockIotDevice(client_id);//先锁定
closeSession(client_id); //强制下线
baseDao.updateBySql("DELETE FROM `iot_terminal` WHERE id='"+client_id+"_"+number+"'");
deviceService.unlockIotDevice(client_id);//解锁
return new Message(MessageCode.DEFAULT_SUCCESS_CODE);
}
@ApiOperation("控制发json")
@RequestMapping(value = "control/{clienid}",method = RequestMethod.POST)
public Message control(@PathVariable String clienid, @RequestBody String map) throws MqttException, InterruptedException {
public Message control(@PathVariable String clienid,@RequestBody Map<String,Object> map) throws MqttException, InterruptedException {
if(null == map || map.size() ==0)
{
return new Message(MessageCode.DEFAULT_FAIL_CODE,"参数验证失败");
}
Topic topic = getTopicFromDb(clienid);
if(null == topic)
{
return new Message(MessageCode.DEFAULT_FAIL_CODE,"mqtt_username查询失败");
}
topic.setTopicType("PUT");
topic.setMessageid(DateUtils.getNowTimeMilly()+"");
for(String key:map.keySet())
{
Object sendMap = map.get(key);
JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(sendMap));
for(String skey:jsonObject.keySet())
{
IotThingsModel thingsModel = terminalDataThingsModeService.getIotThingsModel(topic.getUsername(),skey);
if(null == thingsModel) //没有配置的 都按字符串处理
{
thingsModel = new IotThingsModel();
thingsModel.setData_type(ThingsModelDataTypeEnum.STRING.name());
thingsModel.setIdentifier(key);
thingsModel.setModel_name(key);
thingsModel.setIs_top(0);
thingsModel.setIs_monitor(0);
thingsModel.setIs_save_log(0);
thingsModel.setIs_config(0);
JSONObject spes = new JSONObject();
spes.put("maxLength",255);
thingsModel.setSpecs(spes.toString());
}
String data_type = thingsModel.getData_type().toUpperCase();
Class<ThingsModelBase> aClass = Enum.valueOf(ThingsModelDataTypeEnum.class,data_type).getaClass();
ThingsModelBase thingsModelBase = JSON.parseObject(thingsModel.getSpecs(),aClass);
jsonObject.put(skey,thingsModelBase.getCmdView(jsonObject.get(skey)));
}
map.put(key,jsonObject);
}
MqttMessage mqttMessage = new MqttMessage();
mqttMessage.setPayload(map.trim().getBytes());
Message message = clienNoticeService.sendMessage(clienid,mqttMessage, DateUtils.getNowTimeMilly()+"");
mqttMessage.setPayload(JSON.toJSONString(map).trim().getBytes());
Message message = clienNoticeService.sendMessage(topic,mqttMessage);
return message;
}
@ApiOperation("获取指定设备版本信息")
@RequestMapping(value = "getFirmwareVersion/{app_type}",method = RequestMethod.POST)
public Message getFirmwareVersion(@PathVariable String app_type)
{
List list = baseDao.findListBysql("SELECT md5str,upload_file_path uploadFilePath,version_number versionNumber FROM liu_yu_le.`app_file_upgrade` WHERE app_type='"+app_type+"' ORDER BY id DESC limit 5");
return new Message(MessageCode.DEFAULT_SUCCESS_CODE,list);
}
@ApiOperation("测试")
@RequestMapping(value = "test",method = RequestMethod.GET)
public Message test(String mqtt_username)
{
Map<String, IotThingsModel> map = terminalDataThingsModeService.getUserIotThingsModel(mqtt_username);
return new Message(MessageCode.DEFAULT_SUCCESS_CODE,map);
}
/**
* 通过数据获取发送消息的topic
* @param clienid
* @return
*/
private Topic getTopicFromDb(String clienid)
{
JSONArray jsonArray = baseDao.findBysql("SELECT b.`role_id` roleid,b.`mqtt_username` username,a.`client_id` clientid,a.`payload_type` payloadtype FROM `iot_device` a LEFT JOIN `iot_product` b ON a.`product_id`=b.`id` WHERE client_id='"+clienid+"'");
if(null == jsonArray || jsonArray.size()==0 || null == jsonArray.getJSONObject(0).get("username"))
{
return null;
}
Topic topic = JSON.parseObject( jsonArray.getJSONObject(0).toJSONString(),Topic.class);
topic.setTopicType("PUT");
topic.setMessageid(DateUtils.getNowTimeMilly()+"");
return topic;
}
/**
* 把16进制字符串转换成字节数组
*
... ...
package com.zhonglai.luhui.mqtt.dto;
import com.alibaba.fastjson.JSONObject;
/**
* 入库数据对象
*/
public class SaveDataDto {
private JSONObject data;
private JSONObject config;
public JSONObject getData() {
return data;
}
public void setData(JSONObject data) {
this.data = data;
}
public JSONObject getConfig() {
return config;
}
public void setConfig(JSONObject config) {
this.config = config;
}
}
... ...
... ... @@ -12,6 +12,7 @@ import java.util.List;
@Data
@Accessors(chain = true)
public class OnlineDto implements ServerDto {
private Integer state;
@Override
public ServerAgreementContent getServerAgreementContent() {
return null;
... ...
... ... @@ -24,10 +24,6 @@ public class PutReqDto implements ServerDto {
public ServerAgreementContent getServerAgreementContent() {
PutReqDto putReqDto = this;
return new ServerAgreementContent() {
@Override
public String getClienConnectionId() {
return putReqDto.getMessageid();
}
@Override
public byte[] getCommd() {
... ... @@ -43,12 +39,14 @@ public class PutReqDto implements ServerDto {
@Override
public void setReplyMessage(Message message) {
message.setData(putReqDto);
message.setData(data);
message.setCode(MessageCode.DEFAULT_SUCCESS_CODE);
message.setMessage("成功");
switch (code)
{
case 0:
message.setCode(MessageCode.DEFAULT_FAIL_CODE);
message.setMessage("失败");
break;
}
}
... ...
package com.zhonglai.luhui.mqtt.dto.topic;
import com.alibaba.fastjson.JSONObject;
import com.zhonglai.luhui.mqtt.comm.dto.DeviceSensorData;
import com.zhonglai.luhui.mqtt.comm.dto.LogDeviceOperation;
import com.zhonglai.luhui.mqtt.comm.dto.ServerAgreementContent;
import com.zhonglai.luhui.mqtt.comm.dto.ServerDto;
import com.zhonglai.luhui.mqtt.comm.factory.Topic;
import com.zhonglai.luhui.mqtt.dto.Message;
import com.zhonglai.luhui.mqtt.dto.MessageCode;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@Data
@Accessors(chain = true)
public class ReadReqDto implements ServerDto {
private Integer code;
private JSONObject data;
private String messageid;
private List<LogDeviceOperation> operateHisList = new ArrayList<>();
private List<DeviceSensorData> list = new ArrayList<>();
@Override
public ServerAgreementContent getServerAgreementContent() {
ReadReqDto readReqDto = this;
return new ServerAgreementContent() {
@Override
public byte[] getCommd() {
JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(readReqDto));
jsonObject.remove("messageid");
return jsonObject.toJSONString().getBytes();
}
@Override
public String getReplyCommdTopic(Topic topic) {
return null;
}
@Override
public void setReplyMessage(Message message) {
if(null != readReqDto.data)
{
message.setData(JSONObject.parseObject(readReqDto.data.toJSONString(), HashMap.class));
}
message.setCode(MessageCode.DEFAULT_SUCCESS_CODE);
message.setMessage("成功");
switch (code)
{
case 0:
message.setCode(MessageCode.DEFAULT_FAIL_CODE);
message.setMessage("失败");
break;
}
}
};
}
@Override
public boolean isReplyMessage() {
return true;
}
@Override
public List<DeviceSensorData> getDeviceSensorData() {
return null;
}
@Override
public List<LogDeviceOperation> getOperationLog() {
return null;
}
}
... ...
... ... @@ -24,13 +24,14 @@ public class DataPersistenceServiceImpl extends DataPersistenceService {
@Override
public void persistence(Topic topic, ServerDto serverDto) {
//日志入库
//曲线数据入库
List<DeviceSensorData> dsdList = serverDto.getDeviceSensorData();
if(null != dsdList && dsdList.size() != 0)
{
dviceLogService.saveDeviceSensorDataLog(dsdList);
}
//日志入库
List<LogDeviceOperation> doList = serverDto.getOperationLog();
if(null != doList && doList.size() != 0)
{
... ... @@ -39,27 +40,6 @@ public class DataPersistenceServiceImpl extends DataPersistenceService {
}
@Override
public void addDeviceSensorData(Topic topic, ServerDto serverDto) {
if(serverDto instanceof AddPostDto)
{
AddPostDto addPostDto = (AddPostDto) serverDto;
List<DeviceSensorData> list = addPostDto.getList();
if(null != list && list.size() != 0)
{
baseDao.insertList(list, TableGenerateSqlEnum.DeviceSensorData.getNowTableName());
}
}else if(serverDto instanceof AllPostDto)
{
AllPostDto allPostDto = (AllPostDto) serverDto;
List<DeviceSensorData> list = allPostDto.getList();
if(null != list && list.size() != 0)
{
baseDao.insertList(list, TableGenerateSqlEnum.DeviceSensorData.getNowTableName());
}
}
}
@Override
public String[] upDeviceInfoOffLine(String s) {
return new String[0];
}
... ...
package com.zhonglai.luhui.mqtt.service;
import com.zhonglai.luhui.mqtt.comm.service.TopicsService;
import org.springframework.stereotype.Service;
@Service
public class TopicsServiceImpl implements TopicsService {
@Override
public String getClienConnectionMapKey(String imei, String messageid) {
return "/2/2/X6/"+imei+"/PUT";
}
@Override
public String getTopicFromImei(String imei, String messageid) {
return "/2/6_W/"+imei+"/Json/PUT";
}
}
package com.zhonglai.luhui.mqtt.service.db;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.system.domain.IotDevice;
import com.ruoyi.system.domain.IotTerminal;
import com.zhonglai.luhui.mqtt.comm.config.RedisConfig;
import com.zhonglai.luhui.mqtt.comm.dao.BaseDao;
import com.zhonglai.luhui.mqtt.comm.dto.iot.IotDevice;
import com.zhonglai.luhui.mqtt.comm.dto.iot.IotTerminal;
import com.zhonglai.luhui.mqtt.comm.dto.iot.IotThingsModel;
import com.zhonglai.luhui.mqtt.comm.service.RedisService;
import com.zhonglai.luhui.mqtt.comm.util.DateUtils;
import com.zhonglai.luhui.mqtt.comm.service.redis.RedisService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
... ... @@ -70,7 +68,7 @@ public class DeviceService {
public void updataDevice(IotDevice iotDevice)
{
setRedicDevice(iotDevice);
baseDao.saveOrUpdateObject(iotDevice);
baseDao.update(iotDevice,"client_id");
}
/**
... ... @@ -80,7 +78,17 @@ public class DeviceService {
*/
private boolean setRedicDevice(IotDevice device)
{
return redisService.setexDevice(RedisConfig.FIELD+RedisConfig.DEVICE+device.getClient_id(),device);
return redisService.setexDevice(getRedicDeviceKey(device.getClient_id()),device);
}
public String getRedicDeviceKey(String client_id)
{
return getRedicDeviceKeyPath()+client_id;
}
public String getRedicDeviceKeyPath()
{
return RedisConfig.FIELD+RedisConfig.DEVICE;
}
/**
... ... @@ -95,15 +103,12 @@ public class DeviceService {
{
IotTerminal terminal = getTerminalById(id);
IotTerminal saveTerminal = new IotTerminal();
saveTerminal.setId(id);
if(null == terminal)
{
baseDao.saveOrUpdateObject(saveTerminal);
return null;
}else{
saveTerminal.setThings_model_value(terminal.getThings_model_value());
return terminal;
}
return saveTerminal;
}
return (IotTerminal)object;
}
... ... @@ -114,8 +119,19 @@ public class DeviceService {
*/
private boolean setRedicTerminal(IotTerminal terminal)
{
return redisService.setexDevice(RedisConfig.FIELD+RedisConfig.TERMINAL+terminal.getId(),terminal);
return redisService.setexDevice(getRedicTerminalKey(terminal.getId()),terminal);
}
public String getRedicTerminalKey(String terminal_id)
{
return getRedicTerminalKeyPath()+terminal_id;
}
public String getRedicTerminalKeyPath()
{
return RedisConfig.FIELD+RedisConfig.TERMINAL;
}
public void updataTerminal(IotTerminal terminal)
{
setRedicTerminal(terminal);
... ... @@ -141,4 +157,35 @@ public class DeviceService {
}
return oldjs;
}
/**
* 上锁
* @param clint_id
*/
public void lockIotDevice(String clint_id)
{
redisService.setexDevice(RedisConfig.FIELD+RedisConfig.LOCK+clint_id,1);
}
/**
* 获取锁
* @param clint_id
*/
public int getlockIotDevice(String clint_id)
{
Object object = redisService.get(RedisConfig.FIELD+RedisConfig.LOCK+clint_id);
if(null==object)
{
return 0;
}
return (int)object;
}
/**
* 解锁锁
* @param clint_id
*/
public void unlockIotDevice(String clint_id)
{
redisService.del(RedisConfig.FIELD+RedisConfig.LOCK+clint_id);
}
}
... ...
package com.zhonglai.luhui.mqtt.service.db.mode;
import com.ruoyi.system.domain.IotThingsModel;
import com.zhonglai.luhui.mqtt.comm.service.redis.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 终端数据模型服务
*
* 存储redis
* 存储结构:
* luhui:service:mqtt:terminalDataThingsMode:${deviceTypeKey}
* {
* "${identifier}":IotThingsModel
* }
*/
@Service
public class TerminalDataThingsModeService {
@Autowired
private RedisService redisService;
private static String deviceTypeKeyPath="luhui:service:mqtt:terminalDataThingsMode:"; //设备类型key路径
/**
* 保存模型
* @param iotThingsModel
*/
public void saveIotThingsModel(IotThingsModel iotThingsModel)
{
redisService.hset(deviceTypeKeyPath+iotThingsModel.getMqtt_username(),iotThingsModel.getIdentifier(),iotThingsModel);
}
/**
* 删除模型
*/
public void delIotThingsModel(String mqtt_username, Object... identifiers)
{
redisService.sRemove(deviceTypeKeyPath+mqtt_username,identifiers);
}
/**
* 批量保存指定用户模型保存模型
* @param iotThingsModels
*/
public void saveIotThingsModelToUser(List<IotThingsModel> iotThingsModels)
{
if(null != iotThingsModels && iotThingsModels.size() !=0)
{
Map<String,Map<Object,Object>> all = new HashMap<>();
for(IotThingsModel iotThingsModel:iotThingsModels)
{
Map<Object,Object> map = all.get(iotThingsModel.getMqtt_username());
if(null == map)
{
map = new HashMap<>();
all.put(iotThingsModel.getMqtt_username(),map);
}
map.put(iotThingsModel.getIdentifier(),iotThingsModel);
}
if(null != all && all.size() !=0)
{
for(Object key:all.keySet())
{
redisService.hmset(deviceTypeKeyPath+key,all.get(key));
}
}
}
}
/**
* 获取模型
* @param mqtt_username
* @param identifier
*/
public IotThingsModel getIotThingsModel(String mqtt_username,String identifier)
{
if(redisService.hHashKey(deviceTypeKeyPath+mqtt_username,identifier))
{
return (IotThingsModel) redisService.hget(deviceTypeKeyPath+mqtt_username,identifier);
}
return null;
}
/**
* 获取用户下所有模型模型
* @param mqtt_username
*/
public Map<String, IotThingsModel> getUserIotThingsModel(String mqtt_username )
{
if(redisService.hasKey(deviceTypeKeyPath+mqtt_username))
{
return redisService.hmgetObject(deviceTypeKeyPath+mqtt_username, HashMap.class);
}
return null;
}
/**
* 获取用户下所有指定标识符模型模型
* @param mqtt_username
*/
public Map<String, Object> getUserIotThingsModelByIdentifier(String mqtt_username,String... identifiers)
{
return redisService.hmget(deviceTypeKeyPath+mqtt_username,identifiers);
}
}
... ...
... ... @@ -21,7 +21,6 @@ public class AddPostTopic implements BusinessAgreement<AddPostDto> {
private BusinessDataUpdateService businessDataUpdateService ;
@Override
public ServerDto analysis(Topic topic, AddPostDto data) {
businessDataUpdateService.updataDta(BusinessDataUpdateService.Type.ADD,topic,data.getData(),true,data.getOperateHisList(),data.getList());
return data;
}
... ...
... ... @@ -12,11 +12,13 @@ import org.springframework.stereotype.Service;
public class OnlineTopic implements BusinessAgreement<OnlineDto> {
@Override
public ServerDto analysis(Topic topic, OnlineDto data) throws Exception {
return null;
return data;
}
@Override
public OnlineDto toData(BusinessDto data) {
return null;
OnlineDto onlineDto = new OnlineDto();
onlineDto.setState(Integer.parseInt(new String((byte[]) data.getContentData())));
return onlineDto;
}
}
... ...
... ... @@ -23,17 +23,14 @@ public class PutReqTopic implements BusinessAgreement<PutReqDto> {
@Override
public ServerDto analysis(Topic topic, PutReqDto data) throws Exception {
data.setMessageid(topic.getMessageid());
clienNoticeService.replySendMessage(topic,data);
return null;
}
@Override
public PutReqDto toData(BusinessDto data) {
PutReqDto putReqDto = new PutReqDto();
return putReqDto.setData((String) data.getContentData());
}
private void replyTerminalMessage(Topic topic,ServerDto dto) throws MqttException {
//回复终端消息
clienNoticeService.replyTerminalMessage(topic,dto);
PutReqDto putReqDto = JSONObject.parseObject(((JSONObject) data.getContentData()).toJSONString(),PutReqDto.class);
return putReqDto;
}
}
... ...
package com.zhonglai.luhui.mqtt.service.topic;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.system.domain.IotThingsModel;
import com.zhonglai.luhui.mqtt.comm.dto.DeviceSensorData;
import com.zhonglai.luhui.mqtt.comm.dto.ServerDto;
import com.zhonglai.luhui.mqtt.comm.dto.business.BusinessDto;
import com.zhonglai.luhui.mqtt.comm.dto.thingsmodels.ThingsModelBase;
import com.zhonglai.luhui.mqtt.comm.dto.thingsmodels.ThingsModelDataTypeEnum;
import com.zhonglai.luhui.mqtt.comm.dto.thingsmodels.ThingsModelItemBase;
import com.zhonglai.luhui.mqtt.comm.factory.BusinessAgreement;
import com.zhonglai.luhui.mqtt.comm.factory.Topic;
import com.zhonglai.luhui.mqtt.comm.service.BusinessDataUpdateService;
import com.zhonglai.luhui.mqtt.comm.service.ClienNoticeService;
import com.zhonglai.luhui.mqtt.comm.service.DataModeAnalysisService;
import com.zhonglai.luhui.mqtt.comm.util.DateUtils;
import com.zhonglai.luhui.mqtt.dto.SaveDataDto;
import com.zhonglai.luhui.mqtt.dto.topic.AddPostDto;
import com.zhonglai.luhui.mqtt.dto.topic.ReadReqDto;
import com.zhonglai.luhui.mqtt.service.db.mode.TerminalDataThingsModeService;
import org.apache.commons.lang3.EnumUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service("READ_REQ")
public class ReadReqTopic implements BusinessAgreement<ReadReqDto> {
@Autowired
private ClienNoticeService clienNoticeService; //客户端通知服务
@Autowired
private BusinessDataUpdateService businessDataUpdateService ;
@Autowired
private TerminalDataThingsModeService terminalDataThingsModeService;
@Override
public ServerDto analysis(Topic topic, ReadReqDto data) {
if(1==data.getCode())
{
JSONObject vjsonObject = data.getData().clone();
businessDataUpdateService.updataDta(BusinessDataUpdateService.Type.ADD,topic,data.getData(),true,data.getOperateHisList(),data.getList());
if(null != vjsonObject && vjsonObject.size() !=0 )
{
for(String vkey:vjsonObject.keySet())
{
JSONObject jsData = vjsonObject.getJSONObject(vkey);
for(String key:jsData.keySet())
{
IotThingsModel thingsModel = terminalDataThingsModeService.getIotThingsModel(topic.getUsername(),key);
if(null == thingsModel) //没有配置的 都按字符串处理
{
thingsModel = new IotThingsModel();
thingsModel.setData_type(ThingsModelDataTypeEnum.STRING.name());
thingsModel.setIdentifier(key);
thingsModel.setModel_name(key);
thingsModel.setIs_top(0);
thingsModel.setIs_monitor(0);
thingsModel.setIs_save_log(0);
thingsModel.setIs_config(0);
JSONObject jsonObject = new JSONObject();
jsonObject.put("maxLength",255);
thingsModel.setSpecs(jsonObject.toString());
}
String data_type = thingsModel.getData_type().toUpperCase();
if(!EnumUtils.isValidEnum(ThingsModelDataTypeEnum.class,data_type))
{
data_type = ThingsModelDataTypeEnum.STRING.name();
}
Class<ThingsModelBase> aClass = Enum.valueOf(ThingsModelDataTypeEnum.class,data_type).getaClass();
ThingsModelBase thingsModelBase = JSON.parseObject(thingsModel.getSpecs(),aClass);
thingsModelBase.conversionThingsModel(thingsModel);
thingsModelBase.addValue(jsData.get(key));
jsData.put(key,thingsModelBase);
}
vjsonObject.put(vkey,jsData);
}
data.setData(vjsonObject);
}
clienNoticeService.replySendMessage(topic,data);
return data;
}else if(0==data.getCode())
{
clienNoticeService.replySendMessage(topic,data);
return data;
}
return null;
}
@Override
public ReadReqDto toData(BusinessDto data) {
return JSONObject.parseObject(JSONObject.toJSONString(data.getContentData()),ReadReqDto.class);
}
}
... ...
... ... @@ -2,8 +2,8 @@
server:
tomcat:
uri-encoding: UTF-8
port: 4881
context-path: /lh-mqtt-service
port: 4883
context-path: /
spring:
messages:
... ... @@ -42,10 +42,11 @@ mqtt:
#链接地址
broker: tcp://175.24.61.68:1883
#唯一标识
clientId: lh-mqtt-service-002
clientId: lh-mqtt-service-003
#订阅的topic
topics: "/2/+/+/+/ADD_POST,/2/+/+/+/ALL_POST,/2/+/+/+/DB_TOPIC_DISTRIBUTE,/2/+/+/+/GET,/2/+/+/+/online,/2/+/+/+/PUT_REQ"
topicconfig: "/{{roleid}}/{{username}}/{{clientid}}/{{payloadtype}}/{{topicType}}"
topics: "/2/+/+/+/ADD_POST,/2/+/+/+/ALL_POST,/2/+/+/+/DB_TOPIC_DISTRIBUTE,/2/+/+/+/GET/+,/2/+/+/+/online,/2/+/+/+/PUT_REQ/+,/2/+/+/+/READ_REQ/+"
topicconfig: "/{{roleid}}/{{username}}/{{clientid}}/{{payloadtype}}/{{topicType}}/{{messageid}}"
top_return_map: '{"PUT":"PUT_REQ","READ":"READ_REQ"}'
username: sysuser
password: "!@#1qaz"
client:
... ... @@ -61,5 +62,5 @@ mqtt:
sys:
redis:
field: "lh:mqtt:service:"
field: "luhui:mqttservice:device:"
isText: true
... ...
... ... @@ -14,6 +14,7 @@
<module>ruoyi-common</module>
<module>lh-admin</module>
<module>lh-mqtt-service</module>
<module>lh-domain</module>
</modules>
<packaging>pom</packaging>
... ... @@ -60,6 +61,7 @@
<scope>import</scope>
</dependency>
<!-- 阿里数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
... ... @@ -213,6 +215,13 @@
<version>${ruoyi.version}</version>
</dependency>
<!-- 模型-->
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-domain</artifactId>
<version>${ruoyi.version}</version>
</dependency>
<!-- 支持data -->
<dependency>
<groupId>org.projectlombok</groupId>
... ...
... ... @@ -17,6 +17,12 @@
<dependencies>
<!-- 模型-->
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-domain</artifactId>
</dependency>
<!-- Spring框架基本的核心工具 -->
<dependency>
<groupId>org.springframework</groupId>
... ...
package com.ruoyi.common.annotation;
import com.ruoyi.system.domain.tool.Excel;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
... ...
package com.ruoyi.common.core.domain;
import com.ruoyi.system.domain.tool.BaseEntity;
import java.util.ArrayList;
import java.util.List;
... ...
package com.ruoyi.common.core.domain.entity;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.system.domain.tool.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
... ...
package com.ruoyi.common.core.domain.entity;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.annotation.Excel.ColumnType;
import com.ruoyi.system.domain.tool.Excel;
import com.ruoyi.system.domain.tool.Excel.ColumnType;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.system.domain.tool.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
... ...
package com.ruoyi.common.core.domain.entity; import javax.validation.constraints.NotBlank;import javax.validation.constraints.Size;import org.apache.commons.lang3.builder.ToStringBuilder;import org.apache.commons.lang3.builder.ToStringStyle;import com.ruoyi.common.annotation.Excel;import com.ruoyi.common.annotation.Excel.ColumnType;import com.ruoyi.common.core.domain.BaseEntity; /** * 字典类型表 sys_dict_type * * @author ruoyi */public class SysDictType extends BaseEntity{ private static final long serialVersionUID = 1L; /** 字典主键 */ @Excel(name = "字典主键", cellType = ColumnType.NUMERIC) private Long dictId; /** 字典名称 */ @Excel(name = "字典名称") private String dictName; /** 字典类型 */ @Excel(name = "字典类型") private String dictType; /** 状态(0正常 1停用) */ @Excel(name = "状态", readConverterExp = "0=正常,1=停用") private String status; public Long getDictId() { return dictId; } public void setDictId(Long dictId) { this.dictId = dictId; } @NotBlank(message = "字典名称不能为空") @Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符") public String getDictName() { return dictName; } public void setDictName(String dictName) { this.dictName = dictName; } @NotBlank(message = "字典类型不能为空") @Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符") public String getDictType() { return dictType; } public void setDictType(String dictType) { this.dictType = dictType; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("dictId", getDictId()) .append("dictName", getDictName()) .append("dictType", getDictType()) .append("status", getStatus()) .append("createBy", getCreateBy()) .append("createTime", getCreateTime()) .append("updateBy", getUpdateBy()) .append("updateTime", getUpdateTime()) .append("remark", getRemark()) .toString(); }}
\ No newline at end of file
package com.ruoyi.common.core.domain.entity; import javax.validation.constraints.NotBlank;import javax.validation.constraints.Size;import org.apache.commons.lang3.builder.ToStringBuilder;import org.apache.commons.lang3.builder.ToStringStyle;import com.ruoyi.system.domain.tool.Excel;import com.ruoyi.system.domain.tool.Excel.ColumnType;import com.ruoyi.system.domain.tool.BaseEntity; /** * 字典类型表 sys_dict_type * * @author ruoyi */public class SysDictType extends BaseEntity{ private static final long serialVersionUID = 1L; /** 字典主键 */ @Excel(name = "字典主键", cellType = ColumnType.NUMERIC) private Long dictId; /** 字典名称 */ @Excel(name = "字典名称") private String dictName; /** 字典类型 */ @Excel(name = "字典类型") private String dictType; /** 状态(0正常 1停用) */ @Excel(name = "状态", readConverterExp = "0=正常,1=停用") private String status; public Long getDictId() { return dictId; } public void setDictId(Long dictId) { this.dictId = dictId; } @NotBlank(message = "字典名称不能为空") @Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符") public String getDictName() { return dictName; } public void setDictName(String dictName) { this.dictName = dictName; } @NotBlank(message = "字典类型不能为空") @Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符") public String getDictType() { return dictType; } public void setDictType(String dictType) { this.dictType = dictType; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("dictId", getDictId()) .append("dictName", getDictName()) .append("dictType", getDictType()) .append("status", getStatus()) .append("createBy", getCreateBy()) .append("createTime", getCreateTime()) .append("updateBy", getUpdateBy()) .append("updateTime", getUpdateTime()) .append("remark", getRemark()) .toString(); }}
\ No newline at end of file
... ...
package com.ruoyi.common.core.domain.entity;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.system.domain.tool.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
... ...
package com.ruoyi.common.core.domain.entity;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.annotation.Excel.ColumnType;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.system.domain.tool.Excel;
import com.ruoyi.system.domain.tool.Excel.ColumnType;
import com.ruoyi.system.domain.tool.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
... ...
... ... @@ -2,12 +2,12 @@ package com.ruoyi.common.core.domain.entity;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.annotation.Excel.ColumnType;
import com.ruoyi.common.annotation.Excel.Type;
import com.ruoyi.system.domain.tool.Excel;
import com.ruoyi.system.domain.tool.Excel.ColumnType;
import com.ruoyi.system.domain.tool.Excel.Type;
import com.ruoyi.common.annotation.Excels;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.common.xss.Xss;
import com.ruoyi.system.domain.tool.BaseEntity;
import com.ruoyi.system.domain.tool.Xss;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
... ...
... ... @@ -212,7 +212,7 @@ public class RedisCache
* @param key
* @param hKey
*/
public void delCacheMapValue(final String key, final String hKey)
public void delCacheMapValue(final String key, final String... hKey)
{
HashOperations hashOperations = redisTemplate.opsForHash();
hashOperations.delete(key, hKey);
... ...
package com.ruoyi.common.utils.html;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import okhttp3.*;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
public class HttpUtils {
public interface Header
{
void addHeader(Request.Builder builder);
}
public interface JsonBody
{
void addJsonBody(JSONObject jsonObject);
}
public interface JsonListBody
{
void addJsonBody(JSONArray jsonArray);
}
public interface FromBody
{
void addFromBody(FormBody.Builder formBody);
}
private static OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(20, TimeUnit.SECONDS)
.build();
public static Response postJsonBody(String url,JsonBody jsonBody) throws IOException {
return postJsonBody(url,null,jsonBody);
}
public static Response postJsonBody(String url,Header header,JsonBody jsonBody) throws IOException {
Request.Builder builder = new Request.Builder();
if(null != header)
{
header.addHeader(builder);
}
RequestBody requestBody = requestBody(jsonBody);
Request request = getPostRequest(url,builder,requestBody);
return response(request);
}
public static Response postJsonListBody(String url,Header header,JsonListBody jsonListBody) throws IOException {
Request.Builder builder = new Request.Builder();
if(null != header)
{
header.addHeader(builder);
}
MediaType json = MediaType.parse("application/json; charset=utf-8");
JSONArray jsonArray = new JSONArray();
if(null != jsonArray)
{
jsonListBody.addJsonBody(jsonArray);
}
RequestBody requestBody = RequestBody.create(json,jsonArray.toString());
Request request = getPostRequest(url,builder,requestBody);
return response(request);
}
private static RequestBody requestBody(JsonBody jsonBody)
{
JSONObject jsonObject = new JSONObject();
if(null != jsonBody)
{
jsonBody.addJsonBody(jsonObject);
}
MediaType json = MediaType.parse("application/json; charset=utf-8");
RequestBody requestBody = RequestBody.create(json,jsonObject.toString());
return requestBody;
}
public static Response putJsonBody(String url,Header header) throws IOException {
return putJsonBody(url,header,null);
}
public static Response putJsonBody(String url,Header header,JsonBody jsonBody) throws IOException {
Request.Builder builder = new Request.Builder();
if(null != header)
{
header.addHeader(builder);
}
RequestBody requestBody = requestBody(jsonBody);
return response(builder.url(url)
.put(requestBody)
.build());
}
public static Response delete(String url,Header header) throws IOException {
return delete(url,header,null);
}
public static Response delete(String url,Header header,FromBody fromBody) throws IOException {
Request.Builder builder = new Request.Builder();
if(null != header)
{
header.addHeader(builder);
}
FormBody.Builder formB = new FormBody.Builder();
if(null != fromBody)
{
fromBody.addFromBody(formB);
}
return response( builder.url(url)
.delete(formB.build())
.build());
}
public static Response postFromBody(String url,Header header,FromBody fromBody) throws IOException {
Request.Builder builder = new Request.Builder();
if(null != header)
{
header.addHeader(builder);
}
FormBody.Builder formB = new FormBody.Builder();
if(null != fromBody)
{
fromBody.addFromBody(formB);
}
Request request = getPostRequest(url,builder,formB.build());
Response response = response(request);
return response;
}
public static String get(String url,Header header) throws IOException {
Response response = getResponse(url,header);
return response.body().string();
}
public static Response getResponse(String url,Header header) throws IOException {
Request.Builder builder = new Request.Builder();
if(null != header)
{
header.addHeader(builder);
}
Request request = builder.url(url).get().build();
return response(request);
}
public static Request getPostRequest(String url,Request.Builder builder, RequestBody requestBody)
{
return builder
.url(url)
.post(requestBody)
.build();
}
public static Response response(Request request) throws IOException {
Response response = okHttpClient.newCall(request).execute();
try {
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
} catch (IOException e) {
response.body().close();
}
return response;
}
}
... ...
package com.ruoyi.common.utils.poi;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.annotation.Excel.ColumnType;
import com.ruoyi.common.annotation.Excel.Type;
import com.ruoyi.common.annotation.Excels;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.core.domain.AjaxResult;
... ... @@ -15,6 +12,8 @@ import com.ruoyi.common.utils.file.FileTypeUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.common.utils.file.ImageUtils;
import com.ruoyi.common.utils.reflect.ReflectUtils;
import com.ruoyi.system.domain.tool.Excel;
import com.ruoyi.system.domain.tool.ExcelHandlerAdapter;
import org.apache.commons.lang3.RegExUtils;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ooxml.POIXMLDocumentPart;
... ... @@ -65,7 +64,7 @@ public class ExcelUtil<T>
/**
* 导出类型(EXPORT:导出数据;IMPORT:导入模板)
*/
private Type type;
private Excel.Type type;
/**
* 工作薄对象
... ... @@ -127,7 +126,7 @@ public class ExcelUtil<T>
this.clazz = clazz;
}
public void init(List<T> list, String sheetName, String title, Type type)
public void init(List<T> list, String sheetName, String title, Excel.Type type)
{
if (list == null)
{
... ... @@ -192,7 +191,7 @@ public class ExcelUtil<T>
*/
public List<T> importExcel(String sheetName, InputStream is, int titleNum) throws Exception
{
this.type = Type.IMPORT;
this.type = Excel.Type.IMPORT;
this.wb = WorkbookFactory.create(is);
List<T> list = new ArrayList<T>();
// 如果指定sheet名,则取指定sheet中的内容 否则默认指向第1个sheet
... ... @@ -340,7 +339,7 @@ public class ExcelUtil<T>
{
val = dataFormatHandlerAdapter(val, attr);
}
else if (ColumnType.IMAGE == attr.cellType() && StringUtils.isNotEmpty(pictures))
else if (Excel.ColumnType.IMAGE == attr.cellType() && StringUtils.isNotEmpty(pictures))
{
PictureData image = pictures.get(row.getRowNum() + "_" + entry.getKey());
if (image == null)
... ... @@ -384,7 +383,7 @@ public class ExcelUtil<T>
*/
public AjaxResult exportExcel(List<T> list, String sheetName, String title)
{
this.init(list, sheetName, title, Type.EXPORT);
this.init(list, sheetName, title, Excel.Type.EXPORT);
return exportExcel();
}
... ... @@ -414,7 +413,7 @@ public class ExcelUtil<T>
{
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
this.init(list, sheetName, title, Type.EXPORT);
this.init(list, sheetName, title, Excel.Type.EXPORT);
exportExcel(response);
}
... ... @@ -438,7 +437,7 @@ public class ExcelUtil<T>
*/
public AjaxResult importTemplateExcel(String sheetName, String title)
{
this.init(null, sheetName, title, Type.IMPORT);
this.init(null, sheetName, title, Excel.Type.IMPORT);
return exportExcel();
}
... ... @@ -464,7 +463,7 @@ public class ExcelUtil<T>
{
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
this.init(null, sheetName, title, Type.IMPORT);
this.init(null, sheetName, title, Excel.Type.IMPORT);
exportExcel(response);
}
... ... @@ -538,7 +537,7 @@ public class ExcelUtil<T>
Excel excel = (Excel) os[1];
this.createCell(excel, row, column++);
}
if (Type.EXPORT.equals(type))
if (Excel.Type.EXPORT.equals(type))
{
fillExcelData(index, row);
addStatisticsRow();
... ... @@ -672,7 +671,7 @@ public class ExcelUtil<T>
*/
public void setCellVo(Object value, Excel attr, Cell cell)
{
if (ColumnType.STRING == attr.cellType())
if (Excel.ColumnType.STRING == attr.cellType())
{
String cellValue = Convert.toStr(value);
// 对于任何以表达式触发字符 =-+@开头的单元格,直接使用tab字符作为前缀,防止CSV注入。
... ... @@ -682,14 +681,14 @@ public class ExcelUtil<T>
}
cell.setCellValue(StringUtils.isNull(cellValue) ? attr.defaultValue() : cellValue + attr.suffix());
}
else if (ColumnType.NUMERIC == attr.cellType())
else if (Excel.ColumnType.NUMERIC == attr.cellType())
{
if (StringUtils.isNotNull(value))
{
cell.setCellValue(StringUtils.contains(Convert.toStr(value), ".") ? Convert.toDouble(value) : Convert.toInt(value));
}
}
else if (ColumnType.IMAGE == attr.cellType())
else if (Excel.ColumnType.IMAGE == attr.cellType())
{
ClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) cell.getColumnIndex(), cell.getRow().getRowNum(), (short) (cell.getColumnIndex() + 1), cell.getRow().getRowNum() + 1);
String imagePath = Convert.toStr(value);
... ... @@ -1117,7 +1116,7 @@ public class ExcelUtil<T>
if (field.isAnnotationPresent(Excel.class))
{
Excel attr = field.getAnnotation(Excel.class);
if (attr != null && (attr.type() == Type.ALL || attr.type() == type))
if (attr != null && (attr.type() == Excel.Type.ALL || attr.type() == type))
{
field.setAccessible(true);
fields.add(new Object[] { field, attr });
... ... @@ -1131,7 +1130,7 @@ public class ExcelUtil<T>
Excel[] excels = attrs.value();
for (Excel attr : excels)
{
if (attr != null && (attr.type() == Type.ALL || attr.type() == type))
if (attr != null && (attr.type() == Excel.Type.ALL || attr.type() == type))
{
field.setAccessible(true);
fields.add(new Object[] { field, attr });
... ...
package com.ruoyi.framework.aspectj;
import com.ruoyi.common.annotation.DataScope;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.system.domain.tool.BaseEntity;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.model.LoginUser;
... ...
... ... @@ -218,7 +218,7 @@ public class GenController extends BaseController
@ApiOperation("从数据库结构生成代码")
@ApiImplicitParam(value = "表名集合",name = "tableNames")
@GetMapping("/generatorCodeFromDb")
public void generatorCodeFromDb(HttpServletResponse response,String databaseName, String tableNames) throws IOException {
public void generatorCodeFromDb(HttpServletResponse response,String databaseName, String tableNames) throws IOException {
byte[] data = genTableService.generatorCodeFromDb(databaseName,tableNames);
genCode(response, data);
}
... ...
... ... @@ -5,7 +5,7 @@ import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import org.apache.commons.lang3.ArrayUtils;
import com.ruoyi.common.constant.GenConstants;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.system.domain.tool.BaseEntity;
import com.ruoyi.common.utils.StringUtils;
/**
... ...
package com.ruoyi.generator.domain;
import javax.validation.constraints.NotBlank;
import com.ruoyi.common.core.domain.BaseEntity;
import com.ruoyi.system.domain.tool.BaseEntity;
import com.ruoyi.common.utils.StringUtils;
/**
... ...
... ... @@ -3,13 +3,9 @@ package ${packageName}.domain;
#foreach ($import in $importList)
import ${import};
#end
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
#if($table.crud || $table.sub)
import com.ruoyi.common.core.domain.BaseEntity;
#elseif($table.tree)
import com.ruoyi.common.core.domain.TreeEntity;
#end
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
... ...
... ... @@ -3,10 +3,7 @@ package ${packageName}.domain;
#foreach ($import in $subImportList)
import ${import};
#end
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* ${subTable.functionName}对象 ${subTableName}
... ...
... ... @@ -20,6 +20,12 @@
<!-- 通用工具-->
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-domain</artifactId>
</dependency>
<!-- 通用工具-->
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>ruoyi-common</artifactId>
</dependency>
... ...
package com.ruoyi.system.domain;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.core.domain.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
/**
* 主机/网关对象 iot_device
*
* @author 钟来
* @date 2022-08-26
*/
@ApiModel("主机/网关")
public class IotDevice extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 激活时间 */
@ApiModelProperty("激活时间")
private Integer active_time;
/** 主键 */
@ApiModelProperty("主键")
private String client_id;
/** 是否补充权限,前面加${{roleid}}/${{username}}/${{clientid}}(0否,1是) */
@ApiModelProperty("是否补充权限,前面加${{roleid}}/${{username}}/${{clientid}}(0否,1是)")
private Integer completion_auth;
/** 创建者 */
@ApiModelProperty("创建者")
private String create_by;
/** 创建时间 */
@ApiModelProperty("创建时间")
private Integer create_time;
/** 删除标志(0代表存在 2代表删除) */
@ApiModelProperty("删除标志(0代表存在 2代表删除)")
private Integer del_flag;
/** 固件版本 */
@ApiModelProperty("固件版本")
private Float firmware_version;
/** 图片地址 */
@ApiModelProperty("图片地址")
private String img_url;
/** 是否启用设备影子(0=禁用,1=启用) */
@ApiModelProperty("是否启用设备影子(0=禁用,1=启用)")
private Integer is_shadow;
/** 设备纬度 */
@ApiModelProperty("设备纬度")
private Double latitude;
/** 定位方式(1=ip自动定位,2=设备定位,3=自定义) */
@ApiModelProperty("定位方式(1=ip自动定位,2=设备定位,3=自定义)")
private Integer location_way;
/** 设备经度 */
@ApiModelProperty("设备经度")
private Double longitude;
/** 设备名称 */
@ApiModelProperty("设备名称")
private String name;
/** 设备所在地址 */
@ApiModelProperty("设备所在地址")
private String network_address;
/** 设备入网IP */
@ApiModelProperty("设备入网IP")
private String network_ip;
/** 信号强度( 信号极好4格[-55— 0], 信号好3格[-70— -55], 信号一般2格[-85— -70], 信号差1格[-100— -85]) */
@ApiModelProperty("信号强度( 信号极好4格[-55— 0], 信号好3格[-70— -55], 信号一般2格[-85— -70], 信号差1格[-100— -85])")
private Integer rssi;
/** 设备状态(1-未激活,2-禁用,3-在线,4-离线) */
@ApiModelProperty("设备状态(1-未激活,2-禁用,3-在线,4-离线)")
private Integer status;
/** 设备摘要,格式[{"name":"device"},{"chip":"esp8266"}] */
@ApiModelProperty("设备摘要,格式[{\"name\":\"device\"},{\"chip\":\"esp8266\"}]")
private String summary;
/** 物模型值 */
@ApiModelProperty("物模型值")
private String things_model_value;
/** 更新者 */
@ApiModelProperty("更新者")
private String update_by;
/** 更新时间 */
@ApiModelProperty("更新时间")
private Integer update_time;
/** 用户id */
@ApiModelProperty("用户id")
private Integer user_id;
@ApiModelProperty("负载类型(String,Json,Bite16,Bite32)")
private String payload_type;
public String getPayload_type() {
return payload_type;
}
public void setPayload_type(String payload_type) {
this.payload_type = payload_type;
}
public void setActive_time(Integer active_time)
{
this.active_time = active_time;
}
public Integer getActive_time()
{
return active_time;
}
public void setClient_id(String client_id)
{
this.client_id = client_id;
}
public String getClient_id()
{
return client_id;
}
public void setCompletion_auth(Integer completion_auth)
{
this.completion_auth = completion_auth;
}
public Integer getCompletion_auth()
{
return completion_auth;
}
public void setCreate_by(String create_by)
{
this.create_by = create_by;
}
public String getCreate_by()
{
return create_by;
}
public void setCreate_time(Integer create_time)
{
this.create_time = create_time;
}
public Integer getCreate_time()
{
return create_time;
}
public void setDel_flag(Integer del_flag)
{
this.del_flag = del_flag;
}
public Integer getDel_flag()
{
return del_flag;
}
public void setFirmware_version(Float firmware_version)
{
this.firmware_version = firmware_version;
}
public Float getFirmware_version()
{
return firmware_version;
}
public void setImg_url(String img_url)
{
this.img_url = img_url;
}
public String getImg_url()
{
return img_url;
}
public void setIs_shadow(Integer is_shadow)
{
this.is_shadow = is_shadow;
}
public Integer getIs_shadow()
{
return is_shadow;
}
public void setLatitude(Double latitude)
{
this.latitude = latitude;
}
public Double getLatitude()
{
return latitude;
}
public void setLocation_way(Integer location_way)
{
this.location_way = location_way;
}
public Integer getLocation_way()
{
return location_way;
}
public void setLongitude(Double longitude)
{
this.longitude = longitude;
}
public Double getLongitude()
{
return longitude;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public void setNetwork_address(String network_address)
{
this.network_address = network_address;
}
public String getNetwork_address()
{
return network_address;
}
public void setNetwork_ip(String network_ip)
{
this.network_ip = network_ip;
}
public String getNetwork_ip()
{
return network_ip;
}
public void setRssi(Integer rssi)
{
this.rssi = rssi;
}
public Integer getRssi()
{
return rssi;
}
public void setStatus(Integer status)
{
this.status = status;
}
public Integer getStatus()
{
return status;
}
public void setSummary(String summary)
{
this.summary = summary;
}
public String getSummary()
{
return summary;
}
public void setThings_model_value(String things_model_value)
{
this.things_model_value = things_model_value;
}
public String getThings_model_value()
{
return things_model_value;
}
public void setUpdate_by(String update_by)
{
this.update_by = update_by;
}
public String getUpdate_by()
{
return update_by;
}
public void setUpdate_time(Integer update_time)
{
this.update_time = update_time;
}
public Integer getUpdate_time()
{
return update_time;
}
public void setUser_id(Integer user_id)
{
this.user_id = user_id;
}
public Integer getUser_id()
{
return user_id;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("active_time", getActive_time())
.append("client_id", getClient_id())
.append("completion_auth", getCompletion_auth())
.append("create_by", getCreate_by())
.append("create_time", getCreate_time())
.append("del_flag", getDel_flag())
.append("firmware_version", getFirmware_version())
.append("img_url", getImg_url())
.append("is_shadow", getIs_shadow())
.append("latitude", getLatitude())
.append("location_way", getLocation_way())
.append("longitude", getLongitude())
.append("name", getName())
.append("network_address", getNetwork_address())
.append("network_ip", getNetwork_ip())
.append("remark", getRemark())
.append("rssi", getRssi())
.append("status", getStatus())
.append("summary", getSummary())
.append("things_model_value", getThings_model_value())
.append("update_by", getUpdate_by())
.append("update_time", getUpdate_time())
.append("user_id", getUser_id())
.toString();
}
}