IfishSocketEnglish/src/main/java/com/ifish/socket/config/SomeServer.java

357 lines
17 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.ifish.socket.config;
import com.ifish.bean.LoginRecord;
import com.ifish.bean.Tbl_Device;
import com.ifish.bean.Tbl_Device_Statistics;
import com.ifish.bean.Tbl_Device_User;
import com.ifish.bean.Tbl_Push_List;
import com.ifish.bean.Tbl_User;
import com.ifish.enums.PushTypeEnum;
import com.ifish.helper.DeviceHelperI;
import com.ifish.helper.JpushHelperI;
import com.ifish.helper.UserHelperI;
import com.ifish.socket.model.JobGroup;
import com.ifish.socket.model.OrderModel;
import com.ifish.socket.model.receive.APPLoginResponseLength26;
import com.ifish.socket.model.receive.DeviceLoginResponseLength25;
import com.ifish.socket.model.receive.ServerHeartbeatLength17;
import com.ifish.socket.model.send.APPLoginContextLength25;
import com.ifish.socket.model.send.DeviceLoginContextLength24;
import com.ifish.socket.model.send.ModelVersionLength22;
import com.ifish.socket.model.send.ModelVersionLength38;
import com.ifish.socket.model.send.TemperatureAlarmLength22;
import com.ifish.socket.model.send.TemperatureSwitchLength22;
import com.ifish.socket.model.send.UpgradeVersionLength78;
import com.ifish.util.ByteUtil;
import com.ifish.util.IfishUtil;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;
import org.apache.commons.lang3.StringUtils;
import org.apache.mina.core.session.IoSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
/**
*
* @author Administrator
*/
public class SomeServer {
@Autowired
private UserHelperI userHelperI;
@Autowired
private DeviceHelperI deviceHelperI;
@Autowired
private ScheduleJob scheduleJob;
// @Autowired
// private NeteaseIM neteaseIM;
@Autowired
private JpushHelperI jpushHelperI;
//是否回复心跳
public static boolean isReplay = true;
private static Logger log = LoggerFactory.getLogger(SomeServer.class);
public static ConcurrentHashMap<String, String> remoteAddress = new ConcurrentHashMap<String, String>();
public static ConcurrentHashMap<String, IoSession> sessions_cz = new ConcurrentHashMap<String, IoSession>();
private ConcurrentHashMap<String, CopyOnWriteArraySet<IoSession>> sessions_sjs = new ConcurrentHashMap<String, CopyOnWriteArraySet<IoSession>>();
/**
* 过滤收到的数据 服务器收到数据,进行协议类型匹配,如果不匹配,则不执行相应操作。
*
* @param session
* @param message
*/
public void doSome(IoSession session, Object message) {
//通配字符串
if (message instanceof byte[]) {
byte[] bytes = (byte[]) message;
//长度
int length = bytes[14] & 0xff;
//mac地址
byte[] srcByte = new byte[6];
for (int i = 2; i < 8; i++) {
srcByte[i - 2] = bytes[i];
}
String strSrc = ByteUtil.bytesToHexString(srcByte);
//心跳
if (length >= 28) {
sendToApp(session, strSrc, message);
} else {
sendToDevice(session, strSrc, message);
}
} //设置设备温度报警
else if (message instanceof TemperatureSwitchLength22) {
TemperatureSwitchLength22 receive = (TemperatureSwitchLength22) message;
String strDest = ByteUtil.bytesToHexString(receive.getDest());
sendToDevice(session, strDest, message);
try {
Integer Onoff = receive.getOnoff() & 0xff;
if (Onoff == 1 || Onoff == 0) {
deviceHelperI.updateWarnOnoff(strDest, Onoff.toString());
} else {
log.error("error Onoff:{},macAddress:{}", Onoff, strDest);
}
} catch (Exception e) {
log.warn("set OrderSetWarnModel error:macAddress:{},error msg:{}", strDest, e.toString());
}
} //设备温度报警
else if (message instanceof TemperatureAlarmLength22) {
TemperatureAlarmLength22 receive = (TemperatureAlarmLength22) message;
String strSrc = ByteUtil.bytesToHexString(receive.getSrc());
//推送类型
Integer warnType = receive.getWarn_type() & 0xff;
if (warnType == 0) {
pushNotifcation(strSrc, PushTypeEnum.wendu_warn.getValue(), "'s temperature is" + (float) receive.getWendu() / 10f + "lower than" + (float) receive.getWarn_wendu() / 10f + "℃,");
} else if (warnType == 1) {
pushNotifcation(strSrc, PushTypeEnum.wendu_warn.getValue(), "'s temperature is" + (float) receive.getWendu() / 10f + "high than" + (float) receive.getWarn_wendu() / 10f + "℃,");
} else {
log.error("error warn_type:{},macAddress:{}", warnType, strSrc);
}
} //设备登录服务器
else if (message instanceof DeviceLoginContextLength24) {
DeviceLoginContextLength24 receive = (DeviceLoginContextLength24) message;
byte[] srcBytes = receive.getSrc();
byte[] destBytes = receive.getDest();
String strSrc = ByteUtil.bytesToHexString(srcBytes);
//服务器回复设备登录请求
DeviceLoginResponseLength25 model = OrderModel.DeviceLoginResponseLength25(destBytes, srcBytes);
//直接往本次session写回去
session.write(model);
//保存连接
sessions_cz.put(strSrc, session);
remoteAddress.put(session.getRemoteAddress().toString(), strSrc);
//设备重新连接上,则移除延时推送的任务
JobGroup jobGroup = new JobGroup();
jobGroup.setJobName(strSrc);
jobGroup.setTriggerName(strSrc);
scheduleJob.deleteJob(jobGroup);
try {
//更新设备信息
deviceHelperI.updateDeviceWhenLogin(receive);
} catch (Exception e) {
log.warn("save device login error:macAddress:{},error msg:{}", strSrc, e.toString());
}
} //APP登录服务器
else if (message instanceof APPLoginContextLength25) {
APPLoginContextLength25 receive = (APPLoginContextLength25) message;
byte[] srcBytes = receive.getSrc();
byte[] destBytes = receive.getDest();
String strDest = ByteUtil.bytesToHexString(receive.getDest());
//设备是否在线
IoSession tmpSession = sessions_cz.get(strDest);
//1表示在线0表示离线
byte login_status = 0;
if (tmpSession != null && tmpSession.getRemoteAddress() != null) {
login_status = 1;
} else {
login_status = 0;
}
//服务器回复APP登录请求
APPLoginResponseLength26 model = OrderModel.APPLoginResponseLength26(destBytes, srcBytes, login_status);
session.write(model);
//保存APP连接
CopyOnWriteArraySet<IoSession> sessionSet = sessions_sjs.get(strDest);
if (sessionSet == null) {
sessionSet = new CopyOnWriteArraySet<IoSession>();
sessionSet.add(session);
sessions_sjs.put(strDest, sessionSet);
} else {
for (IoSession ioSession : sessionSet) {
if (ioSession == null || ioSession.getRemoteAddress() == null) {
sessionSet.remove(ioSession);
}
}
sessionSet.add(session);
}
} //模块版本号
else if (message instanceof ModelVersionLength22) {
ModelVersionLength22 receive = (ModelVersionLength22) message;
byte[] macBytes = receive.getSrc();
String strSrc = ByteUtil.bytesToHexString(macBytes);
try {
//查找设备
Tbl_Device device = deviceHelperI.getDeviceByMacAddress(strSrc);
Tbl_Device_Statistics device_Statistics = deviceHelperI.getDeviceStatisticsByMacAddress(strSrc);
if (device != null) {
//是否升级
if (StringUtils.isNotBlank(device_Statistics.getIsUpgrade()) && device_Statistics.getIsUpgrade().equals("1")) {
device_Statistics.setIsUpgrade("0");
device_Statistics.setUpgradeTime(new Date());
//升级版本
int upgradeVersion = Integer.valueOf(device_Statistics.getUpgradeVersion());
UpgradeVersionLength78 model = OrderModel.UpgradeVersionLength78(macBytes, upgradeVersion);
session.write(model);
}
//记录参数
device_Statistics.setSdkVersion(String.valueOf(receive.getVersion() & 0xff));
device_Statistics.setSdkTime(IfishUtil.StrToDate(receive.getYear() + "-" + (receive.getMonth() & 0xff) + "-" + (receive.getDay() & 0xff)));
deviceHelperI.updateDevice_Statistics(device_Statistics);
}
} catch (Exception e) {
log.warn("save device sdk version16 error:macAddress:{},error msg:{}", strSrc, e.toString());
}
} //模块版本号
else if (message instanceof ModelVersionLength38) {
ModelVersionLength38 receive = (ModelVersionLength38) message;
byte[] macBytes = receive.getSrc();
String strSrc = ByteUtil.bytesToHexString(macBytes);
try {
//查找设备
Tbl_Device device = deviceHelperI.getDeviceByMacAddress(strSrc);
Tbl_Device_Statistics device_Statistics = deviceHelperI.getDeviceStatisticsByMacAddress(strSrc);
if (device != null) {
//是否升级
if (StringUtils.isNotBlank(device_Statistics.getIsUpgrade()) && device_Statistics.getIsUpgrade().equals("1")) {
device_Statistics.setIsUpgrade("0");
device_Statistics.setUpgradeTime(new Date());
//升级版本
int upgradeVersion = Integer.parseInt(device_Statistics.getUpgradeVersion());
UpgradeVersionLength78 model = OrderModel.UpgradeVersionLength78(macBytes, upgradeVersion);
session.write(model);
}
//记录参数
device_Statistics.setSdkVersion(String.valueOf(receive.getVersion() & 0xff));
device_Statistics.setSdkTime(IfishUtil.StrToDate(receive.getYear() + "-" + (receive.getMonth() & 0xff) + "-" + (receive.getDay() & 0xff)));
device_Statistics.setMcuCount(receive.getNumber1());
device_Statistics.setModuleCount(receive.getNumber2());
device_Statistics.setRouterCount(receive.getNumber3());
device_Statistics.setServerCount(receive.getNumber4());
device_Statistics.setServerTryCount(receive.getNumber5());
deviceHelperI.updateDevice_Statistics(device_Statistics);
}
} catch (Exception e) {
log.warn("save device sdk version17 error:macAddress:{},error msg:{}", strSrc, e.toString());
}
}
}
/**
* 发送数据APP
*
* @param dest 目的地
* @param message 发送对象
* @return
*/
public void sendToApp(IoSession session, String strDest, Object message) {
//回复设备
if (isReplay) {
ServerHeartbeatLength17 model = OrderModel.ServerHeartbeatLength17(strDest);
session.write(model);
}
//转发给APP
CopyOnWriteArraySet<IoSession> sessionSet = sessions_sjs.get(strDest);
if (sessionSet != null && sessionSet.size() > 0) {
for (IoSession sj_session : sessionSet) {
if (sj_session != null && sj_session.getRemoteAddress() != null) {
sj_session.write(message);
} else {
sessionSet.remove(sj_session);
}
}
}
}
/**
* 发送数据给设备
*
* @param dest 目的地
* @param message 发送对象
* @return
*/
public void sendToDevice(IoSession session, String strDest, Object message) {
IoSession cz_session = sessions_cz.get(strDest);
if (cz_session != null && cz_session.getRemoteAddress() != null) {
cz_session.write(message);
} else {
//设备离线
byte[] bytes = ByteUtil.hexStringToBytes2(strDest);
APPLoginResponseLength26 model = OrderModel.APPLoginResponseLength26(bytes, bytes, (byte) 0);
session.write(model);
}
}
/**
* 温度预警推送
*
* @param strSrc
* @param title
* @param contont
*/
public void pushNotifcation(String strSrc, String title, String contont) {
try {
Tbl_Device device = deviceHelperI.getDeviceByMacAddress(strSrc);
Tbl_Device_Statistics device_Statistics = null;
if (device != null) {
Integer deviceId = device.getDeviceId();
//是否开启预警
String onOff = device.getOnOff();
if (onOff != null && onOff.equals("1")) {
//绑定设备的用户
List<Tbl_Device_User> list = deviceHelperI.getTbl_Device_UsersListByDeviceId(device.getDeviceId());
for (Tbl_Device_User deviceUser : list) {
Integer userId = deviceUser.getUserId();
String showName = deviceUser.getShowName();
String timestamp = IfishUtil.format(new Date());
String msg = "" + title + "】Your aquarium “" + showName + "" + contont + "at" + timestamp + ", please check it with out delay!";
Tbl_User user = userHelperI.findById(userId);
if (user != null) {
//极光推送
boolean result = false;
String loginType = user.getLoginType();
if (StringUtils.isNotBlank(loginType) && userId != null) {
//推送记录
Tbl_Push_List pushList = new Tbl_Push_List();
Map<String, String> map = new HashMap<String, String>();
map.put("device_id", deviceId.toString());
map.put("device_name", showName);
map.put("timestamp", timestamp);
map.put("msg_type", PushTypeEnum.wendu_warn.getKey());
if (loginType.equals("android")) {
result = jpushHelperI.pushMessageByAndroid(title, msg, userId.toString(), map);
} else if (loginType.equals("ios")) {
result = jpushHelperI.pushMessageByIOS(title, msg, userId.toString(), map);
}
//记录推送
if (result) {
pushList.setUserId(userId);
pushList.setDeviceId(deviceId);
pushList.setPhoneType(loginType.toLowerCase());
pushList.setShowName(showName);
pushList.setPushType(PushTypeEnum.wendu_warn.getKey());
pushList.setPushTitle(title);
pushList.setPushContext(msg);
pushList.setJpushStatus(result ? "1" : "0");
pushList.setCreateTime(new Date());
pushList.setMcuCount(device_Statistics.getMcuCount());
pushList.setModularCount(device_Statistics.getModuleCount());
pushList.setRouterCount(device_Statistics.getRouterCount());
pushList.setServerCount(device_Statistics.getServerCount());
pushList.setServerTryCount(device_Statistics.getServerTryCount());
userHelperI.save(pushList);
}
}
}
}
}
}
} catch (Exception e) {
log.warn("pushNotifcation error:macAddress:{},error msg:{}", strSrc, e.toString());
}
}
}