package com.zy.bms.service; import com.zy.bms.common.Constant; import com.zy.bms.common.dto.MqttMsgDto; import com.zy.bms.config.mqtt.MqttGateway; import com.zy.bms.model.Device; import com.zy.bms.model.SetBase; import com.zy.bms.model.News; import com.zy.bms.utils.BeanUtil; import com.zy.bms.common.io.wechat.*; import com.zy.bms.websocket.WebSocketServer; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.HashMap; import java.util.Map; /** * 设备设置 Service * * @author chen_yi * Create on 2021/3/27 */ @Component public class SetService { @Resource private SetBaseService setBaseService; @Resource private SetNewsService setNewsService; @Resource private MqttGateway mqttGateway; @Resource private MqttLogService mqttLogService; @Resource private WebSocketServer webSocketServer; /** * 设置设备 * * @param code 设置指令 * @param io 设置信息 */ public void set(String code, SetIO io) { MqttMsgDto msgDto = getMqttMsgDtoByCode(code, io); // 1. 向设备发送设置指令 mqttGateway.sendMsgToMqtt(msgDto.toJson(), io.getTopic()); // 2. 设置信息保存至数据库 saveToDataBase(code, io); // 3. 存储消息日志 mqttLogService.saveLog(io.getTopic(), msgDto.toJson(), 1); // 4. 消息转发前端webSocket String deviceId = io.getTopic().split("/")[1]; webSocketServer.massMessage(deviceId, msgDto.toJson()); } /** * 服务器返回授权码 */ public void returnCodeToDevice(Device device) { //发送模板消息给设备 MqttMsgDto msgDto = new MqttMsgDto(); msgDto.setM(Constant.M_CODE_RETURN_CODE); msgDto.setR(Constant.TOPIC_REGISTER_CLIENT); msgDto.setT(Constant.TOPIC_REGISTER_SERVER); Map data = new HashMap<>(); data.put("regnum", device.getNum()); data.put("deviceid", device.getClientId()); data.put("password", device.getPassword()); msgDto.setData(data); // 3. 存储消息日志 mqttLogService.saveLog(Constant.TOPIC_REGISTER_CLIENT, msgDto.toJson(), 1); } /** * 存储至数据库 */ private void saveToDataBase(String code, SetIO io) { //发送语音播报单独处理 if (code.equals(Constant.M_CODE_NEWS)) { News entity = BeanUtil.cast(io, News.class); setNewsService.save(entity); } else { SetBase entity = BeanUtil.cast(io, SetBase.class); setBaseService.updateByDeviceId(entity); } } /** * 组装需要发送的模板消息 * * @param code 协议中 M 值 * @param io 设置信息 * @return 模板消息对象 */ private MqttMsgDto getMqttMsgDtoByCode(String code, SetIO io) { MqttMsgDto result = new MqttMsgDto(code, io.getDeviceId()); switch (code) { //自动接听 case Constant.M_CODE_AUTO_ANSWER: { result.set("autoanswer", io.getAutoAnswer()); break; } //音量 case Constant.M_CODE_VOLUME: { result.set("msgvol", io.getMsgVol()).set("phonevol", io.getPhoneVol()).set("msgtype", 1); break; } //定位频率 case Constant.M_CODE_GPS_RATE: { result.set("GPS_rate", io.getGpsRate()); break; } //语音播报 case Constant.M_CODE_NEWS: { result.set("newstype", io.getNewsType()).set("newstime", io.getNewsTime()).set("news", io.getNews()); break; } //SOS紧急呼叫 case Constant.M_CODE_SOS: { result.set("key0_name", io.getKey0Name()).set("key0_phone", io.getKey0Phone()) .set("key1_name", io.getKey1Name()).set("key1_phone", io.getKey1Phone()) .set("key2_name", io.getKey2Name()).set("key2_phone", io.getKey2Phone()); break; } //持续定位 case Constant.M_CODE_CONTINUE_GPS: { result.set("highfreq", io.getHighFreq()); break; } } return result; } }