commit 73861f3f18ebbe4639a095091a926bae8b2f4e65 Author: 谢洪龙 <599179587@qq.com> Date: Mon Jul 10 11:54:47 2017 +0800 初始化 diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..bcebd81 --- /dev/null +++ b/.classpath @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9f97022 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +target/ \ No newline at end of file diff --git a/.project b/.project new file mode 100644 index 0000000..629a41f --- /dev/null +++ b/.project @@ -0,0 +1,42 @@ + + + ifishSocket + + + + + + org.eclipse.wst.jsdt.core.javascriptValidator + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.wst.jsdt.core.jsNature + + diff --git a/nb-configuration.xml b/nb-configuration.xml new file mode 100644 index 0000000..974314d --- /dev/null +++ b/nb-configuration.xml @@ -0,0 +1,19 @@ + + + + + + Tomcat + false + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..88e2b16 --- /dev/null +++ b/pom.xml @@ -0,0 +1,181 @@ + + 4.0.0 + ifishSocket + ifishSocket + war + 0.0.1-SNAPSHOT + ifishSocket Maven Webapp + http://mvnrepository.com + + + + org.quartz-scheduler + quartz + 2.2.1 + + + org.springframework + spring-core + 4.1.6.RELEASE + + + + org.springframework + spring-context + 4.1.6.RELEASE + + + + org.springframework + spring-orm + 4.1.6.RELEASE + + + + org.springframework + spring-context-support + 4.1.6.RELEASE + + + + org.aspectj + aspectjweaver + 1.8.5 + + + + org.springframework + spring-webmvc + 4.1.6.RELEASE + + + + org.hibernate + hibernate-core + 4.3.11.Final + + + + org.jboss.logging + jboss-logging-annotations + 2.0.1.Final + + + + c3p0 + c3p0 + 0.9.1.2 + + + + org.slf4j + slf4j-api + 1.7.12 + + + + ch.qos.logback + logback-core + 1.1.2 + + + + ch.qos.logback + logback-classic + 1.1.2 + + + + org.apache.mina + mina-core + 2.0.7 + + + + org.apache.mina + mina-integration-spring + 1.1.7 + + + + org.apache.mina + mina-integration-beans + 2.0.7 + + + + org.apache.mina + mina-filter-compression + 2.0.7 + + + + org.apache.httpcomponents + httpclient + 4.3.5 + + + + org.json + json + 20090211 + + + + com.google.code.gson + gson + 2.3 + + + + + + + ifishSocket + + + org.apache.maven.plugins + maven-war-plugin + 2.4 + + + + src/main/webapp + + + + + + org.apache.felix + maven-bundle-plugin + 2.5.4 + true + + + + + src/main/java + + **/*.hbm.xml + + + + src/main/resources + + **/*.xml + **/*.properties + + + + + + + UTF-8 + + + diff --git a/src/main/java/com/ifish/dao/DeviceDao.java b/src/main/java/com/ifish/dao/DeviceDao.java new file mode 100644 index 0000000..c3dd86f --- /dev/null +++ b/src/main/java/com/ifish/dao/DeviceDao.java @@ -0,0 +1,25 @@ +package com.ifish.dao; + +import java.util.List; + +import com.ifish.entity.Device; + +/** + * @ClassName: DeviceDao + * @Description: TODO + * @author ggw + * + */ +public interface DeviceDao { + + public Device findById(Integer id); + + public Device save(Device device); + + public Device update(Device device); + + public Device getUniqueByProperty(String property,Object value); + + public List getByProperty(String property,Object value); + +} diff --git a/src/main/java/com/ifish/dao/DeviceUserDao.java b/src/main/java/com/ifish/dao/DeviceUserDao.java new file mode 100644 index 0000000..55ae297 --- /dev/null +++ b/src/main/java/com/ifish/dao/DeviceUserDao.java @@ -0,0 +1,20 @@ +package com.ifish.dao; + +import java.util.List; + +import org.hibernate.criterion.Criterion; + +import com.ifish.entity.DeviceUser; +/** + * @ClassName: DeviceUserDaoImpl + * @Description: TODO + * @author ggw + * + */ +public interface DeviceUserDao { + + public DeviceUser getUniqueByProperty(Criterion... criterions); + + public List getListByProperty(Criterion... criterions); + +} diff --git a/src/main/java/com/ifish/dao/FactoryListDao.java b/src/main/java/com/ifish/dao/FactoryListDao.java new file mode 100644 index 0000000..8d5678c --- /dev/null +++ b/src/main/java/com/ifish/dao/FactoryListDao.java @@ -0,0 +1,15 @@ +package com.ifish.dao; + +import com.ifish.entity.FactoryList; + +/** + * @ClassName: FactoryListDao + * @Description: TODO + * @author ggw + * + */ +public interface FactoryListDao{ + + public FactoryList findById(String factoryCode); + +} diff --git a/src/main/java/com/ifish/dao/HardwareTypeDao.java b/src/main/java/com/ifish/dao/HardwareTypeDao.java new file mode 100644 index 0000000..735d4e8 --- /dev/null +++ b/src/main/java/com/ifish/dao/HardwareTypeDao.java @@ -0,0 +1,15 @@ +package com.ifish.dao; + +import com.ifish.entity.HardwareType; + +/** + * @ClassName: HardwareTypeDao + * @Description: TODO + * @author ggw + * + */ +public interface HardwareTypeDao { + + public HardwareType findById(String TypeCode); + +} diff --git a/src/main/java/com/ifish/dao/LoginRecordDao.java b/src/main/java/com/ifish/dao/LoginRecordDao.java new file mode 100644 index 0000000..62147e9 --- /dev/null +++ b/src/main/java/com/ifish/dao/LoginRecordDao.java @@ -0,0 +1,15 @@ +package com.ifish.dao; + +import com.ifish.entity.LoginRecord; + +/** + * @ClassName: LoginRecordDao + * @Description: TODO + * @author ggw + * + */ +public interface LoginRecordDao { + + public LoginRecord save(LoginRecord loginRecord); + +} diff --git a/src/main/java/com/ifish/dao/PushListDao.java b/src/main/java/com/ifish/dao/PushListDao.java new file mode 100644 index 0000000..262a2a4 --- /dev/null +++ b/src/main/java/com/ifish/dao/PushListDao.java @@ -0,0 +1,15 @@ +package com.ifish.dao; + +import com.ifish.entity.PushList; + +/** + * @ClassName: PushListDao + * @Description: TODO + * @author ggw + * + */ +public interface PushListDao{ + + public PushList save(PushList pushList); + +} diff --git a/src/main/java/com/ifish/dao/UserDao.java b/src/main/java/com/ifish/dao/UserDao.java new file mode 100644 index 0000000..eae5cde --- /dev/null +++ b/src/main/java/com/ifish/dao/UserDao.java @@ -0,0 +1,16 @@ +package com.ifish.dao; + +import com.ifish.entity.User; + + +/** + * @ClassName: UserDao + * @Description: TODO + * @author ggw + * + */ +public interface UserDao { + + public User findById(Integer id); + +} diff --git a/src/main/java/com/ifish/daoImpl/DeviceDaoImpl.java b/src/main/java/com/ifish/daoImpl/DeviceDaoImpl.java new file mode 100644 index 0000000..c913453 --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/DeviceDaoImpl.java @@ -0,0 +1,55 @@ +package com.ifish.daoImpl; + +import java.util.List; + +import org.hibernate.criterion.Restrictions; +import org.springframework.stereotype.Repository; + +import com.ifish.dao.DeviceDao; +import com.ifish.entity.Device; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * @ClassName: DeviceDaoImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class DeviceDaoImpl extends HibernateBaseDao implements DeviceDao { + + + @Override + protected Class getEntityClass() { + return Device.class; + } + + @Override + public Device findById(Integer id) { + return this.get(id); + } + + @Override + public Device getUniqueByProperty(String property, Object value) { + return this.findUniqueByProperty(Restrictions.eq(property, value)); + } + + @Override + public Device save(Device device) { + this.getSession().save(device); + return device; + } + + @Override + public Device update(Device device) { + this.getSession().update(device); + return device; + } + + @Override + public List getByProperty(String property, Object value) { + return this.findByProperty(Restrictions.eq(property, value)); + } + +} diff --git a/src/main/java/com/ifish/daoImpl/DeviceUserDaoImpl.java b/src/main/java/com/ifish/daoImpl/DeviceUserDaoImpl.java new file mode 100644 index 0000000..e267483 --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/DeviceUserDaoImpl.java @@ -0,0 +1,38 @@ +package com.ifish.daoImpl; + +import java.util.List; + +import org.hibernate.criterion.Criterion; +import org.springframework.stereotype.Repository; + +import com.ifish.dao.DeviceUserDao; +import com.ifish.entity.DeviceUser; +import com.ifish.entity.PriId; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * @ClassName: DeviceUserDaoImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class DeviceUserDaoImpl extends HibernateBaseDao implements DeviceUserDao { + + @Override + protected Class getEntityClass() { + return DeviceUser.class; + } + + @Override + public DeviceUser getUniqueByProperty(Criterion... criterions) { + return this.findUniqueByProperty(criterions); + } + + @Override + public List getListByProperty(Criterion... criterions) { + return this.findByProperty(criterions); + } + +} diff --git a/src/main/java/com/ifish/daoImpl/FactoryListDaoImpl.java b/src/main/java/com/ifish/daoImpl/FactoryListDaoImpl.java new file mode 100644 index 0000000..70949ff --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/FactoryListDaoImpl.java @@ -0,0 +1,30 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.FactoryListDao; +import com.ifish.entity.FactoryList; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * @ClassName: FactoryListDaoImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class FactoryListDaoImpl extends HibernateBaseDao implements FactoryListDao { + + + @Override + protected Class getEntityClass() { + return FactoryList.class; + } + + @Override + public FactoryList findById(String id) { + return this.get(id); + } + +} diff --git a/src/main/java/com/ifish/daoImpl/HardwareTypeDaoImpl.java b/src/main/java/com/ifish/daoImpl/HardwareTypeDaoImpl.java new file mode 100644 index 0000000..aa7bee4 --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/HardwareTypeDaoImpl.java @@ -0,0 +1,30 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.HardwareTypeDao; +import com.ifish.entity.HardwareType; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * @ClassName: HardwareTypeDaoImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class HardwareTypeDaoImpl extends HibernateBaseDao implements HardwareTypeDao { + + + @Override + protected Class getEntityClass() { + return HardwareType.class; + } + + @Override + public HardwareType findById(String id) { + return this.get(id); + } + +} diff --git a/src/main/java/com/ifish/daoImpl/LoginRecordDaoImpl.java b/src/main/java/com/ifish/daoImpl/LoginRecordDaoImpl.java new file mode 100644 index 0000000..2d4679e --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/LoginRecordDaoImpl.java @@ -0,0 +1,31 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.LoginRecordDao; +import com.ifish.entity.LoginRecord; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * @ClassName: LoginRecordDaoImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class LoginRecordDaoImpl extends HibernateBaseDao implements LoginRecordDao { + + + @Override + protected Class getEntityClass() { + return LoginRecord.class; + } + + @Override + public LoginRecord save(LoginRecord loginRecord) { + this.getSession().save(loginRecord); + return loginRecord; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/PushListDaoImpl.java b/src/main/java/com/ifish/daoImpl/PushListDaoImpl.java new file mode 100644 index 0000000..a23bd63 --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/PushListDaoImpl.java @@ -0,0 +1,30 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.PushListDao; +import com.ifish.entity.PushList; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * @ClassName: PushListDaoImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class PushListDaoImpl extends HibernateBaseDao implements PushListDao { + + @Override + protected Class getEntityClass() { + return PushList.class; + } + + @Override + public PushList save(PushList pushList) { + this.getSession().save(pushList); + return pushList; + } + +} diff --git a/src/main/java/com/ifish/daoImpl/UserDaoImpl.java b/src/main/java/com/ifish/daoImpl/UserDaoImpl.java new file mode 100644 index 0000000..b1815da --- /dev/null +++ b/src/main/java/com/ifish/daoImpl/UserDaoImpl.java @@ -0,0 +1,30 @@ +package com.ifish.daoImpl; + +import org.springframework.stereotype.Repository; + +import com.ifish.dao.UserDao; +import com.ifish.entity.User; +import com.ifish.hibernate.HibernateBaseDao; + +/** + * @ClassName: UserDaoImpl + * @Description: TODO + * @author ggw + * + */ + +@Repository +public class UserDaoImpl extends HibernateBaseDao implements UserDao { + + + @Override + protected Class getEntityClass() { + return User.class; + } + + @Override + public User findById(Integer id) { + return this.get(id); + } + +} diff --git a/src/main/java/com/ifish/entity/Device.java b/src/main/java/com/ifish/entity/Device.java new file mode 100644 index 0000000..a58205d --- /dev/null +++ b/src/main/java/com/ifish/entity/Device.java @@ -0,0 +1,216 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.util.Date; + +/** + * @ClassName: tbl_device + * @date 2015年7月2日 下午16:40:00 + * + */ +public class Device implements Serializable{ + + private static final long serialVersionUID = -4069917773366185534L; + //设备ID + private Integer deviceId; + //服务器IP + private String serverIP; + //设备IP + private String deviceIP; + //设备MAC地址 + private String macAddress; + //登陆次数 + private Integer loginCount; + //电子厂 + private String factoryCode; + //鱼缸厂 + private String brandCode; + //硬件型号 + private String hardwareType; + //mcu版本 + private String softwareVersion; + //sdk版本 + private Integer sdkVersion; + //sdk时间 + private Date sdkTime; + //分配日期 + private Date createDate; + //是否更新 + private String isUpgrade; + //更新版本 + private Integer upgradeVersion; + //更新时间 + private Date upgradeTime; + //最后一次登陆时间 + private Date loginTime; + //是否是黑名单:1是,0否 + private String isBlacklist; + //激活时间 + private Date firstActivate; + //创建时间 + private Date createTime; + //是否推送 + private String onOff; + //MCU启动次数 + private Integer number1; + //模块启动次数 + private Integer number2; + //连接路由器次数 + private Integer number3; + //成功连接服务器次数 + private Integer number4; + //尝试连接服务器次数 + private Integer number5; + + public Integer getDeviceId() { + return deviceId; + } + public void setDeviceId(Integer deviceId) { + this.deviceId = deviceId; + } + public String getServerIP() { + return serverIP; + } + public void setServerIP(String serverIP) { + this.serverIP = serverIP; + } + public String getDeviceIP() { + return deviceIP; + } + public void setDeviceIP(String deviceIP) { + this.deviceIP = deviceIP; + } + public String getMacAddress() { + return macAddress; + } + public void setMacAddress(String macAddress) { + this.macAddress = macAddress; + } + public Integer getLoginCount() { + return loginCount; + } + public void setLoginCount(Integer loginCount) { + this.loginCount = loginCount; + } + public Date getLoginTime() { + return loginTime; + } + public void setLoginTime(Date loginTime) { + this.loginTime = loginTime; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + public String getIsBlacklist() { + return isBlacklist; + } + public void setIsBlacklist(String isBlacklist) { + this.isBlacklist = isBlacklist; + } + public Date getFirstActivate() { + return firstActivate; + } + public void setFirstActivate(Date firstActivate) { + this.firstActivate = firstActivate; + } + public String getHardwareType() { + return hardwareType; + } + public void setHardwareType(String hardwareType) { + this.hardwareType = hardwareType; + } + public String getSoftwareVersion() { + return softwareVersion; + } + public void setSoftwareVersion(String softwareVersion) { + this.softwareVersion = softwareVersion; + } + public String getOnOff() { + return onOff; + } + public void setOnOff(String onOff) { + this.onOff = onOff; + } + public String getBrandCode() { + return brandCode; + } + public void setBrandCode(String brandCode) { + this.brandCode = brandCode; + } + public String getFactoryCode() { + return factoryCode; + } + public void setFactoryCode(String factoryCode) { + this.factoryCode = factoryCode; + } + public Date getCreateDate() { + return createDate; + } + public void setCreateDate(Date createDate) { + this.createDate = createDate; + } + public String getIsUpgrade() { + return isUpgrade; + } + public void setIsUpgrade(String isUpgrade) { + this.isUpgrade = isUpgrade; + } + public Date getUpgradeTime() { + return upgradeTime; + } + public void setUpgradeTime(Date upgradeTime) { + this.upgradeTime = upgradeTime; + } + public Integer getSdkVersion() { + return sdkVersion; + } + public void setSdkVersion(Integer sdkVersion) { + this.sdkVersion = sdkVersion; + } + public Integer getUpgradeVersion() { + return upgradeVersion; + } + public void setUpgradeVersion(Integer upgradeVersion) { + this.upgradeVersion = upgradeVersion; + } + public Date getSdkTime() { + return sdkTime; + } + public void setSdkTime(Date sdkTime) { + this.sdkTime = sdkTime; + } + public Integer getNumber1() { + return number1; + } + public void setNumber1(Integer number1) { + this.number1 = number1; + } + public Integer getNumber2() { + return number2; + } + public void setNumber2(Integer number2) { + this.number2 = number2; + } + public Integer getNumber3() { + return number3; + } + public void setNumber3(Integer number3) { + this.number3 = number3; + } + public Integer getNumber4() { + return number4; + } + public void setNumber4(Integer number4) { + this.number4 = number4; + } + public Integer getNumber5() { + return number5; + } + public void setNumber5(Integer number5) { + this.number5 = number5; + } + +} diff --git a/src/main/java/com/ifish/entity/DeviceUser.java b/src/main/java/com/ifish/entity/DeviceUser.java new file mode 100644 index 0000000..49360aa --- /dev/null +++ b/src/main/java/com/ifish/entity/DeviceUser.java @@ -0,0 +1,39 @@ +package com.ifish.entity; + +import java.io.Serializable; + +/** + * @ClassName: tbl_device_user + * @date 2015年7月2日 下午16:40:00 + * + */ +public class DeviceUser implements Serializable{ + + private static final long serialVersionUID = 6845058501114939424L; + //ID + private PriId priId = new PriId(); + //1、主控制权,0、被分享者 + private String isMaster; + //显示名称 + private String showName; + + public PriId getPriId() { + return priId; + } + public void setPriId(PriId priId) { + this.priId = priId; + } + public String getIsMaster() { + return isMaster; + } + public void setIsMaster(String isMaster) { + this.isMaster = isMaster; + } + public String getShowName() { + return showName; + } + public void setShowName(String showName) { + this.showName = showName; + } + +} diff --git a/src/main/java/com/ifish/entity/FactoryList.java b/src/main/java/com/ifish/entity/FactoryList.java new file mode 100644 index 0000000..55047e8 --- /dev/null +++ b/src/main/java/com/ifish/entity/FactoryList.java @@ -0,0 +1,30 @@ +package com.ifish.entity; + +import java.io.Serializable; + +/** + * @ClassName: tbl_factory_list + * @date 2015年7月2日 下午16:40:00 + * + */ +public class FactoryList implements Serializable{ + + private static final long serialVersionUID = -52948033423321276L; + //电子厂编号 + private String factoryCode; + //电子厂名称 + private String factoryName; + + public String getFactoryCode() { + return factoryCode; + } + public void setFactoryCode(String factoryCode) { + this.factoryCode = factoryCode; + } + public String getFactoryName() { + return factoryName; + } + public void setFactoryName(String factoryName) { + this.factoryName = factoryName; + } +} diff --git a/src/main/java/com/ifish/entity/HardwareType.java b/src/main/java/com/ifish/entity/HardwareType.java new file mode 100644 index 0000000..5f70025 --- /dev/null +++ b/src/main/java/com/ifish/entity/HardwareType.java @@ -0,0 +1,30 @@ +package com.ifish.entity; + +import java.io.Serializable; + +/** + * @ClassName: tbl_hardware_type + * @date 2015年7月2日 下午16:40:00 + * + */ +public class HardwareType implements Serializable{ + + private static final long serialVersionUID = -7239170169013659018L; + //类型编号 + private String hardwareType; + //类型名称 + private String hardwareName; + + public String getHardwareType() { + return hardwareType; + } + public void setHardwareType(String hardwareType) { + this.hardwareType = hardwareType; + } + public String getHardwareName() { + return hardwareName; + } + public void setHardwareName(String hardwareName) { + this.hardwareName = hardwareName; + } +} diff --git a/src/main/java/com/ifish/entity/LoginRecord.java b/src/main/java/com/ifish/entity/LoginRecord.java new file mode 100644 index 0000000..10a1162 --- /dev/null +++ b/src/main/java/com/ifish/entity/LoginRecord.java @@ -0,0 +1,40 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.util.Date; + +/** + * @ClassName: tbl_login_record + * @date 2015年7月2日 下午16:40:00 + * + */ +public class LoginRecord implements Serializable{ + + private static final long serialVersionUID = -5292867602998823697L; + //ID + private Integer recordId; + //mac地址 + private String macAddress; + //登录时间 + private Date loginTime; + + public Integer getRecordId() { + return recordId; + } + public void setRecordId(Integer recordId) { + this.recordId = recordId; + } + public String getMacAddress() { + return macAddress; + } + public void setMacAddress(String macAddress) { + this.macAddress = macAddress; + } + public Date getLoginTime() { + return loginTime; + } + public void setLoginTime(Date loginTime) { + this.loginTime = loginTime; + } + +} diff --git a/src/main/java/com/ifish/entity/PriId.java b/src/main/java/com/ifish/entity/PriId.java new file mode 100644 index 0000000..290031c --- /dev/null +++ b/src/main/java/com/ifish/entity/PriId.java @@ -0,0 +1,43 @@ +package com.ifish.entity; + +import java.io.Serializable; + +public class PriId implements Serializable { + + private static final long serialVersionUID = -8487355297142132996L; + private Integer userId; + private Integer deviceId; + + public Integer getUserId() { + return userId; + } + + public void setUserId(Integer userId) { + this.userId = userId; + } + + public Integer getDeviceId() { + return deviceId; + } + + public void setDeviceId(Integer deviceId) { + this.deviceId = deviceId; + } + + @Override + public boolean equals(Object obj) { + if(obj instanceof PriId){ + PriId pk=(PriId)obj; + if(this.userId.equals(pk.userId)&&this.deviceId.equals(pk.deviceId)){ + return true; + } + } + return false; + } + + @Override + public int hashCode() { + return super.hashCode(); + } + +} diff --git a/src/main/java/com/ifish/entity/PushList.java b/src/main/java/com/ifish/entity/PushList.java new file mode 100644 index 0000000..a914f81 --- /dev/null +++ b/src/main/java/com/ifish/entity/PushList.java @@ -0,0 +1,144 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.util.Date; + +/** + * @ClassName: tbl_push_list + * @date 2015年7月2日 下午16:40:00 + * + */ +public class PushList implements Serializable{ + + private static final long serialVersionUID = -6718129027121198763L; + //ID + private Integer pushId; + //用户ID + private Integer userId; + //设备ID + private Integer deviceId; + //推送手机类型 + private String phoneType; + //显示名称 + private String showName; + //推送消息类型 + private String pushType; + //推送标题 + private String pushTitle; + //推送内容 + private String pushContext; + //极光推送状态 + private String jpushStatus; + //云信推送状态 + private String neteaseStatus; + //创建时间 + private Date createTime; + //MCU启动次数 + private Integer number1; + //模块启动次数 + private Integer number2; + //连接路由器次数 + private Integer number3; + //成功连接服务器次数 + private Integer number4; + //尝试连接服务器次数 + private Integer number5; + + public Integer getPushId() { + return pushId; + } + public void setPushId(Integer pushId) { + this.pushId = pushId; + } + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + public Integer getDeviceId() { + return deviceId; + } + public void setDeviceId(Integer deviceId) { + this.deviceId = deviceId; + } + public String getShowName() { + return showName; + } + public void setShowName(String showName) { + this.showName = showName; + } + public String getPushType() { + return pushType; + } + public void setPushType(String pushType) { + this.pushType = pushType; + } + public String getPushTitle() { + return pushTitle; + } + public void setPushTitle(String pushTitle) { + this.pushTitle = pushTitle; + } + public String getPushContext() { + return pushContext; + } + public void setPushContext(String pushContext) { + this.pushContext = pushContext; + } + public Date getCreateTime() { + return createTime; + } + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + public String getPhoneType() { + return phoneType; + } + public void setPhoneType(String phoneType) { + this.phoneType = phoneType; + } + public String getJpushStatus() { + return jpushStatus; + } + public void setJpushStatus(String jpushStatus) { + this.jpushStatus = jpushStatus; + } + public String getNeteaseStatus() { + return neteaseStatus; + } + public void setNeteaseStatus(String neteaseStatus) { + this.neteaseStatus = neteaseStatus; + } + public Integer getNumber1() { + return number1; + } + public void setNumber1(Integer number1) { + this.number1 = number1; + } + public Integer getNumber2() { + return number2; + } + public void setNumber2(Integer number2) { + this.number2 = number2; + } + public Integer getNumber3() { + return number3; + } + public void setNumber3(Integer number3) { + this.number3 = number3; + } + public Integer getNumber4() { + return number4; + } + public void setNumber4(Integer number4) { + this.number4 = number4; + } + public Integer getNumber5() { + return number5; + } + public void setNumber5(Integer number5) { + this.number5 = number5; + } + +} diff --git a/src/main/java/com/ifish/entity/User.java b/src/main/java/com/ifish/entity/User.java new file mode 100644 index 0000000..6738504 --- /dev/null +++ b/src/main/java/com/ifish/entity/User.java @@ -0,0 +1,49 @@ +package com.ifish.entity; + +import java.io.Serializable; +import java.util.Date; + +/** + * @ClassName: tbl_user + * @date 2015年7月2日 下午16:40:00 + * + */ +public class User implements Serializable{ + + private static final long serialVersionUID = 9090213827766125261L; + //用户ID + private Integer userId; + //最后一次登陆时间 + private Date loginTime; + //登陆手机类型 + private String loginType; + //修改时间 + private Date updateTime; + + public Integer getUserId() { + return userId; + } + public void setUserId(Integer userId) { + this.userId = userId; + } + public Date getLoginTime() { + return loginTime; + } + public void setLoginTime(Date loginTime) { + this.loginTime = loginTime; + } + public String getLoginType() { + return loginType; + } + public void setLoginType(String loginType) { + this.loginType = loginType; + } + public Date getUpdateTime() { + return updateTime; + } + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + +} diff --git a/src/main/java/com/ifish/entity/hbm/Device.hbm.xml b/src/main/java/com/ifish/entity/hbm/Device.hbm.xml new file mode 100644 index 0000000..8ee9711 --- /dev/null +++ b/src/main/java/com/ifish/entity/hbm/Device.hbm.xml @@ -0,0 +1,34 @@ + + + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/ifish/entity/hbm/DeviceUser.hbm.xml b/src/main/java/com/ifish/entity/hbm/DeviceUser.hbm.xml new file mode 100644 index 0000000..3da4b64 --- /dev/null +++ b/src/main/java/com/ifish/entity/hbm/DeviceUser.hbm.xml @@ -0,0 +1,14 @@ + + + + + false + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/ifish/entity/hbm/FactoryList.hbm.xml b/src/main/java/com/ifish/entity/hbm/FactoryList.hbm.xml new file mode 100644 index 0000000..5e80ad3 --- /dev/null +++ b/src/main/java/com/ifish/entity/hbm/FactoryList.hbm.xml @@ -0,0 +1,11 @@ + + + + + false + + + + + + \ No newline at end of file diff --git a/src/main/java/com/ifish/entity/hbm/HardwareType.hbm.xml b/src/main/java/com/ifish/entity/hbm/HardwareType.hbm.xml new file mode 100644 index 0000000..62f8ba0 --- /dev/null +++ b/src/main/java/com/ifish/entity/hbm/HardwareType.hbm.xml @@ -0,0 +1,11 @@ + + + + + false + + + + + + \ No newline at end of file diff --git a/src/main/java/com/ifish/entity/hbm/LoginRecord.hbm.xml b/src/main/java/com/ifish/entity/hbm/LoginRecord.hbm.xml new file mode 100644 index 0000000..fb4f338 --- /dev/null +++ b/src/main/java/com/ifish/entity/hbm/LoginRecord.hbm.xml @@ -0,0 +1,13 @@ + + + + + false + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/ifish/entity/hbm/PushList.hbm.xml b/src/main/java/com/ifish/entity/hbm/PushList.hbm.xml new file mode 100644 index 0000000..282da46 --- /dev/null +++ b/src/main/java/com/ifish/entity/hbm/PushList.hbm.xml @@ -0,0 +1,26 @@ + + + + + false + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/ifish/entity/hbm/User.hbm.xml b/src/main/java/com/ifish/entity/hbm/User.hbm.xml new file mode 100644 index 0000000..824ef56 --- /dev/null +++ b/src/main/java/com/ifish/entity/hbm/User.hbm.xml @@ -0,0 +1,13 @@ + + + + + false + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/ifish/enums/BooleanEnum.java b/src/main/java/com/ifish/enums/BooleanEnum.java new file mode 100644 index 0000000..d2e1851 --- /dev/null +++ b/src/main/java/com/ifish/enums/BooleanEnum.java @@ -0,0 +1,29 @@ +package com.ifish.enums; + +public enum BooleanEnum { + NO("0","否"), + YES("1","是"); + + private BooleanEnum(String key,String value){ + this.key = key; + this.value = value; + } + + private String key; + private String value; + + + public String getKey() { + return key; + } + public void setKey(String key) { + this.key = key; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + +} diff --git a/src/main/java/com/ifish/enums/NeteaseEnum.java b/src/main/java/com/ifish/enums/NeteaseEnum.java new file mode 100644 index 0000000..b0e5062 --- /dev/null +++ b/src/main/java/com/ifish/enums/NeteaseEnum.java @@ -0,0 +1,28 @@ +package com.ifish.enums; + +public enum NeteaseEnum { + status200("200","操作成功"), + status414("414","参数错误"); + + private NeteaseEnum(String key,String value){ + this.key = key; + this.value = value; + } + + private String key; + private String value; + + + public String getKey() { + return key; + } + public void setKey(String key) { + this.key = key; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } +} diff --git a/src/main/java/com/ifish/enums/PhoneTypeEnum.java b/src/main/java/com/ifish/enums/PhoneTypeEnum.java new file mode 100644 index 0000000..ea80e79 --- /dev/null +++ b/src/main/java/com/ifish/enums/PhoneTypeEnum.java @@ -0,0 +1,29 @@ +package com.ifish.enums; + +public enum PhoneTypeEnum { + ios("ios","ios"), + android("android","android"); + + private PhoneTypeEnum(String key,String value){ + this.key = key; + this.value = value; + } + + private String key; + private String value; + + + public String getKey() { + return key; + } + public void setKey(String key) { + this.key = key; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + +} diff --git a/src/main/java/com/ifish/enums/PushTypeEnum.java b/src/main/java/com/ifish/enums/PushTypeEnum.java new file mode 100644 index 0000000..4ffa4e8 --- /dev/null +++ b/src/main/java/com/ifish/enums/PushTypeEnum.java @@ -0,0 +1,33 @@ +package com.ifish.enums; + +public enum PushTypeEnum { + remove_device("remove_device","解绑通知"), + wendu_warn("wendu_warn","温度报警"), + qu_reply("qu_reply","问题反馈"), + app_update("app_update","IOS更新推送"), + remind_water("remind_water","换水提醒"), + offline_push("offline_push","离线通知"); + + private PushTypeEnum(String key,String value){ + this.key = key; + this.value = value; + } + + private String key; + private String value; + + + public String getKey() { + return key; + } + public void setKey(String key) { + this.key = key; + } + public String getValue() { + return value; + } + public void setValue(String value) { + this.value = value; + } + +} diff --git a/src/main/java/com/ifish/hibernate/HibernateBaseDao.java b/src/main/java/com/ifish/hibernate/HibernateBaseDao.java new file mode 100644 index 0000000..e47a872 --- /dev/null +++ b/src/main/java/com/ifish/hibernate/HibernateBaseDao.java @@ -0,0 +1,80 @@ +package com.ifish.hibernate; + +import java.io.Serializable; +import java.util.List; + +import org.hibernate.Criteria; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.criterion.Criterion; +import org.springframework.beans.factory.annotation.Autowired; + + +/** + * hibernate DAO基类 + * @author ggw + * @param + * @param + */ +public abstract class HibernateBaseDao { + + @Autowired + protected SessionFactory sessionFactory; + + protected Session getSession() { + return sessionFactory.getCurrentSession(); + } + + /** + * 根据ID查找 + * @param id + * @return + */ + @SuppressWarnings("unchecked") + protected T get(ID id) { + return (T) getSession().get(getEntityClass(), id); + } + + /** + * 按属性查找对象列表 + * @param criterions + * @return + */ + @SuppressWarnings("unchecked") + protected List findByProperty(Criterion... criterions) { + Criteria cri = createCriteria(criterions); + return cri.list(); + } + + /** + * 按属性查找唯一对象 + * @param criterions + * @return + */ + @SuppressWarnings("unchecked") + protected T findUniqueByProperty(Criterion... criterions) { + Criteria cri = createCriteria(criterions); + return (T) cri.uniqueResult(); + } + + /** + * 根据Criterion条件创建Criteria,后续可进行更多处理,辅助函数. + * @param criterions + * @return + */ + protected Criteria createCriteria(Criterion... criterions) { + Criteria criteria = getSession().createCriteria(getEntityClass()); + if(criterions!=null){ + for (Criterion c : criterions) { + criteria.add(c); + } + } + return criteria; + } + + /** + * 获得Dao对于的实体类 + * @return + */ + abstract protected Class getEntityClass(); +} diff --git a/src/main/java/com/ifish/netease/CheckSumBuilder.java b/src/main/java/com/ifish/netease/CheckSumBuilder.java new file mode 100644 index 0000000..3f3f12e --- /dev/null +++ b/src/main/java/com/ifish/netease/CheckSumBuilder.java @@ -0,0 +1,48 @@ +package com.ifish.netease; + +import java.security.MessageDigest; + +/** + * SHA1(AppSecret + Nonce + CurTime),三个参数拼接的字符串,进行SHA1哈希计算,转化成16进制字符(String,小写) + * @author Administrator + * + */ +public class CheckSumBuilder { + + // 计算并获取CheckSum + public static String getCheckSum(String appSecret, String nonce, String curTime) { + return encode("sha1", appSecret + nonce + curTime); + } + + // 计算并获取md5值 + public static String getMD5(String requestBody) { + return encode("md5", requestBody); + } + + private static String encode(String algorithm, String value) { + if (value == null) { + return null; + } + try { + MessageDigest messageDigest + = MessageDigest.getInstance(algorithm); + messageDigest.update(value.getBytes()); + return getFormattedText(messageDigest.digest()); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static String getFormattedText(byte[] bytes) { + int len = bytes.length; + StringBuilder buf = new StringBuilder(len * 2); + for (int j = 0; j < len; j++) { + buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]); + buf.append(HEX_DIGITS[bytes[j] & 0x0f]); + } + return buf.toString(); + } + + private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +} \ No newline at end of file diff --git a/src/main/java/com/ifish/netease/NeteaseIM.java b/src/main/java/com/ifish/netease/NeteaseIM.java new file mode 100644 index 0000000..5ec9708 --- /dev/null +++ b/src/main/java/com/ifish/netease/NeteaseIM.java @@ -0,0 +1,292 @@ +package com.ifish.netease; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.http.HttpResponse; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.impl.client.DefaultHttpClient; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; +import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.ifish.enums.NeteaseEnum; +import com.ifish.util.IfishUtil; + +public class NeteaseIM { + + String appKey = ""; + String appSecret = ""; + + private static Logger log = LoggerFactory.getLogger(NeteaseIM.class); + + public NeteaseIM(String appKey,String appSecret){ + this.appKey=appKey; + this.appSecret=appSecret; + } + /** + * 创建云信ID + * @param accid 云信ID,最大长度32字符,必须保证一个APP内唯一 + * @param name 云信ID昵称,最大长度64字符,用来PUSH推送 时显示的昵称 + * @param icon 云信ID头像URL,第三方可选填,最大长度1024 + * @param props json属性,第三方可选填,最大长度1024字符 + * @return + * @throws Exception + */ + public Map createAccid(String accid,String name,String icon,String props){ + try { + DefaultHttpClient httpClient = new DefaultHttpClient(); + String url = "https://api.netease.im/nimserver/user/create.action"; + HttpPost httpPost = new HttpPost(url); + String nonce = IfishUtil.getCharAndNumr(10); + String curTime = String.valueOf((new Date()).getTime() / 1000L); + //计算CheckSum + String checkSum = CheckSumBuilder.getCheckSum(appSecret, nonce ,curTime); + //设置请求的header + httpPost.addHeader("AppKey", appKey); + httpPost.addHeader("Nonce", nonce); + httpPost.addHeader("CurTime", curTime); + httpPost.addHeader("CheckSum", checkSum); + httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); + //设置请求的参数 + List nvps = new ArrayList(); + nvps.add(new BasicNameValuePair("accid", accid)); + nvps.add(new BasicNameValuePair("name", name)); + nvps.add(new BasicNameValuePair("icon", icon)); + nvps.add(new BasicNameValuePair("props", props)); + httpPost.setEntity(new UrlEncodedFormEntity(nvps, "utf-8")); + //执行请求 + HttpResponse response = httpClient.execute(httpPost); + //执行结果 + String responseStr = EntityUtils.toString(response.getEntity(), "utf-8"); + JSONObject json = new JSONObject(responseStr); + String code = json.getString("code"); + Map map = new HashMap(); + map.put("code", code); + //200 + if(code.equals(NeteaseEnum.status200.getKey())){ + JSONObject infoJson = json.getJSONObject("info"); + String token = infoJson.getString("token"); + map.put("token", token); + } + else if(code.equals(NeteaseEnum.status414.getKey())){ + String desc = json.getString("desc"); + } + return map; + } catch (Exception e) { + log.error("CreateAccid error message:{},{}",accid,e.toString()); + } + return null; + } + /** + * 更新并获取新token + * @param accid + * @return + * @throws Exception + */ + public Map refreshToken(String accid){ + try { + DefaultHttpClient httpClient = new DefaultHttpClient(); + String url = "https://api.netease.im/nimserver/user/refreshToken.action"; + HttpPost httpPost = new HttpPost(url); + String nonce = IfishUtil.getCharAndNumr(10); + String curTime = String.valueOf((new Date()).getTime() / 1000L); + //计算CheckSum + String checkSum = CheckSumBuilder.getCheckSum(appSecret, nonce ,curTime); + //设置请求的header + httpPost.addHeader("AppKey", appKey); + httpPost.addHeader("Nonce", nonce); + httpPost.addHeader("CurTime", curTime); + httpPost.addHeader("CheckSum", checkSum); + httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); + //设置请求的参数 + List nvps = new ArrayList(); + nvps.add(new BasicNameValuePair("accid", accid)); + httpPost.setEntity(new UrlEncodedFormEntity(nvps, "utf-8")); + //执行请求 + HttpResponse response = httpClient.execute(httpPost); + //执行结果 + String responseStr = EntityUtils.toString(response.getEntity(), "utf-8"); + JSONObject json = new JSONObject(responseStr); + String code = json.getString("code"); + Map map = new HashMap(); + map.put("code", code); + //200 + if(code.equals(NeteaseEnum.status200.getKey())){ + JSONObject infoJson = json.getJSONObject("info"); + String token = infoJson.getString("token"); + map.put("token", token); + } + else if(code.equals(NeteaseEnum.status414.getKey())){ + String desc = json.getString("desc"); + } + return map; + } catch (Exception e) { + log.error("refreshToken error message:{},{}",accid,e.toString()); + } + return null; + } + + /** + * 发送普通消息 + * @param from + * @param to + * @param msg + * @return + */ + public Map sendMsg(String from,String to,String msg){ + try { + DefaultHttpClient httpClient = new DefaultHttpClient(); + String url = "https://api.netease.im/nimserver/msg/sendMsg.action"; + HttpPost httpPost = new HttpPost(url); + String nonce = IfishUtil.getCharAndNumr(10); + String curTime = String.valueOf((new Date()).getTime() / 1000L); + //计算CheckSum + String checkSum = CheckSumBuilder.getCheckSum(appSecret, nonce ,curTime); + //设置请求的header + httpPost.addHeader("AppKey", appKey); + httpPost.addHeader("Nonce", nonce); + httpPost.addHeader("CurTime", curTime); + httpPost.addHeader("CheckSum", checkSum); + httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); + //设置请求的参数 + List nvps = new ArrayList(); + nvps.add(new BasicNameValuePair("from", from)); + nvps.add(new BasicNameValuePair("to", to)); + nvps.add(new BasicNameValuePair("ope", "0")); + nvps.add(new BasicNameValuePair("type", "0")); + nvps.add(new BasicNameValuePair("body", "{\"msg\":\""+msg+"\"}")); + httpPost.setEntity(new UrlEncodedFormEntity(nvps, "utf-8")); + //执行请求 + HttpResponse response = httpClient.execute(httpPost); + //执行结果 + String responseStr = EntityUtils.toString(response.getEntity(), "utf-8"); + JSONObject json = new JSONObject(responseStr); + String code = json.getString("code"); + Map map = new HashMap(); + map.put("code", code); + //200 + if(code.equals(NeteaseEnum.status200.getKey())){ + + } + else if(code.equals(NeteaseEnum.status414.getKey())){ + String desc = json.getString("desc"); + } + return map; + } catch (Exception e) { + log.error("refreshToken error message:{}",e.toString()); + } + return null; + } + /** + * 批量发送点对点普通消息 + * @param fromAccid + * @param toAccids + * @param msg + * @return + */ + public Map sendBatchMsg(String fromAccid,String toAccids,String msg){ + try { + DefaultHttpClient httpClient = new DefaultHttpClient(); + String url = "https://api.netease.im/nimserver/msg/sendBatchMsg.action"; + HttpPost httpPost = new HttpPost(url); + String nonce = IfishUtil.getCharAndNumr(10); + String curTime = String.valueOf((new Date()).getTime() / 1000L); + //计算CheckSum + String checkSum = CheckSumBuilder.getCheckSum(appSecret, nonce ,curTime); + //设置请求的header + httpPost.addHeader("AppKey", appKey); + httpPost.addHeader("Nonce", nonce); + httpPost.addHeader("CurTime", curTime); + httpPost.addHeader("CheckSum", checkSum); + httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); + //设置请求的参数 + List nvps = new ArrayList(); + nvps.add(new BasicNameValuePair("fromAccid", fromAccid)); + nvps.add(new BasicNameValuePair("toAccids", toAccids)); + nvps.add(new BasicNameValuePair("type", "0")); + nvps.add(new BasicNameValuePair("body", "{\"msg\":\""+msg+"\"}")); + httpPost.setEntity(new UrlEncodedFormEntity(nvps, "utf-8")); + //执行请求 + HttpResponse response = httpClient.execute(httpPost); + //执行结果 + String responseStr = EntityUtils.toString(response.getEntity(), "utf-8"); + JSONObject json = new JSONObject(responseStr); + String code = json.getString("code"); + Map map = new HashMap(); + map.put("code", code); + //200 + if(code.equals(NeteaseEnum.status200.getKey())){ + + } + else if(code.equals(NeteaseEnum.status414.getKey())){ + String desc = json.getString("desc"); + } + return map; + } catch (Exception e) { + log.error("refreshToken error message:{}",e.toString()); + } + return null; + } + + /** + * 单聊云端历史消息查询 + * @param from + * @param to + * @param begintime + * @param endtime + * @param limit + * @return + */ + public Map querySessionMsg(String from,String to,String begintime,String endtime,String limit){ + try { + DefaultHttpClient httpClient = new DefaultHttpClient(); + String url = "https://api.netease.im/nimserver/history/querySessionMsg.action"; + HttpPost httpPost = new HttpPost(url); + String nonce = IfishUtil.getCharAndNumr(10); + String curTime = String.valueOf((new Date()).getTime() / 1000L); + //计算CheckSum + String checkSum = CheckSumBuilder.getCheckSum(appSecret, nonce ,curTime); + //设置请求的header + httpPost.addHeader("AppKey", appKey); + httpPost.addHeader("Nonce", nonce); + httpPost.addHeader("CurTime", curTime); + httpPost.addHeader("CheckSum", checkSum); + httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8"); + //设置请求的参数 + List nvps = new ArrayList(); + nvps.add(new BasicNameValuePair("from", from)); + nvps.add(new BasicNameValuePair("to", to)); + nvps.add(new BasicNameValuePair("begintime", begintime)); + nvps.add(new BasicNameValuePair("endtime", endtime)); + nvps.add(new BasicNameValuePair("limit", limit)); + httpPost.setEntity(new UrlEncodedFormEntity(nvps, "utf-8")); + //执行请求 + HttpResponse response = httpClient.execute(httpPost); + //执行结果 + String responseStr = EntityUtils.toString(response.getEntity(), "utf-8"); + JSONObject json = new JSONObject(responseStr); + String code = json.getString("code"); + Map map = new HashMap(); + map.put("code", code); + //200 + if(code.equals(NeteaseEnum.status200.getKey())){ + + } + else if(code.equals(NeteaseEnum.status414.getKey())){ + String desc = json.getString("desc"); + } + return map; + } catch (Exception e) { + log.error("refreshToken error message:{}",e.toString()); + } + return null; + } +} diff --git a/src/main/java/com/ifish/quartz/ExecuteJob.java b/src/main/java/com/ifish/quartz/ExecuteJob.java new file mode 100644 index 0000000..d841948 --- /dev/null +++ b/src/main/java/com/ifish/quartz/ExecuteJob.java @@ -0,0 +1,113 @@ +package com.ifish.quartz; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.mina.core.session.IoSession; +import org.quartz.Job; +import org.quartz.JobDataMap; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import com.ifish.entity.Device; +import com.ifish.entity.DeviceUser; +import com.ifish.entity.PushList; +import com.ifish.entity.User; +import com.ifish.enums.BooleanEnum; +import com.ifish.enums.NeteaseEnum; +import com.ifish.enums.PushTypeEnum; +import com.ifish.netease.NeteaseIM; +import com.ifish.service.DeviceService; +import com.ifish.service.UserService; +import com.ifish.socketNew.SomeServer; + +public class ExecuteJob implements Job { + + private static Logger log = LoggerFactory.getLogger(ExecuteJob.class); + @Autowired + private NeteaseIM neteaseIM; + @Autowired + private UserService userService; + @Autowired + private DeviceService deviceService; + + public void execute(JobExecutionContext context) throws JobExecutionException { + //任务传递的参数 + JobDataMap dataMap = context.getJobDetail().getJobDataMap(); + String macAddress = dataMap.getString("macAddress"); + String timestamp = dataMap.getString("timestamp"); + try { + //移除为null的连接 + IoSession session_cz = SomeServer.sessions_cz.get(macAddress); + if(session_cz==null || session_cz.getRemoteAddress()==null){ + SomeServer.sessions_cz.remove(macAddress); + } + //设备是否存在 + Device device = deviceService.getUniqueByProperty("macAddress", macAddress); + if(device!=null){ + //记录次数 + Integer number1 = device.getNumber1(); + Integer number2 = device.getNumber2(); + Integer number3 = device.getNumber3(); + Integer number4 = device.getNumber4(); + Integer number5 = device.getNumber5(); + List list = deviceService.getListByProperty(device.getDeviceId()); + //是否被绑定 + if(list!=null){ + for (DeviceUser deviceUser : list) { + Integer userId = deviceUser.getPriId().getUserId(); + String showName = deviceUser.getShowName(); + String title = PushTypeEnum.offline_push.getValue(); + String msg = "【"+title+"】你的水族箱“"+showName+"”于"+timestamp+"离线,请及时查看!"; + //发送云信消息 + boolean neteaseBln = false; + Map neteaseMap = neteaseIM.sendMsg("ifish", userId.toString(), msg); + if(neteaseMap!=null){ + neteaseBln = neteaseMap.get("code").equals(NeteaseEnum.status200.getKey()); + } + //IOS极光推送 + boolean jpushIosBln = false; + //推送记录 + PushList pushList = new PushList(); + Integer deviceId = deviceUser.getPriId().getDeviceId(); + User user = userService.findById(userId); + if(user!=null){ + String loginType = user.getLoginType(); + if(loginType!=null){ + Map map = new HashMap(); + map.put("device_id", deviceId.toString()); + map.put("device_name", showName); + map.put("timestamp", timestamp); + map.put("msg_type", PushTypeEnum.offline_push.getKey()); + //推送记录 + pushList.setUserId(userId); + pushList.setDeviceId(deviceId); + pushList.setPhoneType(loginType.toLowerCase()); + pushList.setShowName(showName); + pushList.setPushType(PushTypeEnum.offline_push.getKey()); + pushList.setNeteaseStatus(neteaseBln?BooleanEnum.YES.getKey():BooleanEnum.NO.getKey()); + pushList.setPushTitle(title); + pushList.setPushContext(msg); + pushList.setCreateTime(new Date()); + pushList.setNumber1(number1); + pushList.setNumber2(number2); + pushList.setNumber3(number3); + pushList.setNumber4(number4); + pushList.setNumber5(number5); + this.userService.save(pushList); + } + } + } + } + } + } catch (Exception e) { + e.printStackTrace(); + log.error("error msg:{}",e.toString()); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/ifish/quartz/JobFactory.java b/src/main/java/com/ifish/quartz/JobFactory.java new file mode 100644 index 0000000..8a57a27 --- /dev/null +++ b/src/main/java/com/ifish/quartz/JobFactory.java @@ -0,0 +1,22 @@ +package com.ifish.quartz; + +import org.quartz.spi.TriggerFiredBundle; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.scheduling.quartz.AdaptableJobFactory; + +public class JobFactory extends AdaptableJobFactory { + + @Autowired + private AutowireCapableBeanFactory capableBeanFactory; + + @Override + protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception { + //调用父类的方法 + Object jobInstance = super.createJobInstance(bundle); + //进行注入 + capableBeanFactory.autowireBean(jobInstance); + return jobInstance; + } + +} diff --git a/src/main/java/com/ifish/quartz/JobGroup.java b/src/main/java/com/ifish/quartz/JobGroup.java new file mode 100644 index 0000000..1e7d904 --- /dev/null +++ b/src/main/java/com/ifish/quartz/JobGroup.java @@ -0,0 +1,84 @@ +package com.ifish.quartz; + +import java.util.Date; + +public class JobGroup { + + /** 任务名称 **/ + private String jobName; + + /** 任务分组 **/ + private String jobGroup = "offlinePushGroup"; + + /** 触发器名称 **/ + private String triggerName; + + /** 触发器分组 **/ + private String triggerGroup = "offlinePushGroup"; + + /** mac地址 **/ + private String macAddress; + + /** 执行时间 **/ + private Date startTime; + + /** 离线时间 **/ + private String timestamp; + + public String getJobName() { + return jobName; + } + + public void setJobName(String jobName) { + this.jobName = jobName; + } + + public String getJobGroup() { + return jobGroup; + } + + public void setJobGroup(String jobGroup) { + this.jobGroup = jobGroup; + } + + public String getTriggerName() { + return triggerName; + } + + public void setTriggerName(String triggerName) { + this.triggerName = triggerName; + } + + public String getTriggerGroup() { + return triggerGroup; + } + + public void setTriggerGroup(String triggerGroup) { + this.triggerGroup = triggerGroup; + } + + public String getMacAddress() { + return macAddress; + } + + public void setMacAddress(String macAddress) { + this.macAddress = macAddress; + } + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public String getTimestamp() { + return timestamp; + } + + public void setTimestamp(String timestamp) { + this.timestamp = timestamp; + } + +} diff --git a/src/main/java/com/ifish/quartz/ScheduleJob.java b/src/main/java/com/ifish/quartz/ScheduleJob.java new file mode 100644 index 0000000..55671f4 --- /dev/null +++ b/src/main/java/com/ifish/quartz/ScheduleJob.java @@ -0,0 +1,101 @@ +package com.ifish.quartz; + +import org.quartz.JobBuilder; +import org.quartz.JobDetail; +import org.quartz.JobKey; +import org.quartz.Scheduler; +import org.quartz.SchedulerException; +import org.quartz.SchedulerFactory; +import org.quartz.Trigger; +import org.quartz.TriggerBuilder; +import org.quartz.TriggerKey; +import org.quartz.impl.StdSchedulerFactory; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * 定时任务 + * @author guogw + */ +public class ScheduleJob { + + private static Logger log = LoggerFactory.getLogger(ScheduleJob.class); + //调度 + private Scheduler scheduler = null; + + @Autowired + private JobFactory jobFactory; + + public void init(){ + try { + //调度任务开启 + SchedulerFactory sf = new StdSchedulerFactory(); + scheduler = sf.getScheduler(); + //实现job中注入bean + scheduler.setJobFactory(jobFactory); + scheduler.start(); + } catch (SchedulerException e) { + log.error("start scheduler error:{}",e.toString()); + } + } + /** + * 添加任务 + * @param jobGroup + * @throws SchedulerException + */ + public void addJob(JobGroup jobGroup){ + try { + log.info("添加任务:{}.{}",jobGroup.getJobName(),jobGroup.getTriggerName()); + //任务 + JobDetail jobDetail= JobBuilder.newJob(ExecuteJob.class) + .usingJobData("macAddress", jobGroup.getMacAddress()) + .usingJobData("timestamp", jobGroup.getTimestamp()) + .withIdentity(jobGroup.getJobName(),jobGroup.getJobName()) + .build(); + //触发器 + Trigger trigger= TriggerBuilder.newTrigger() + .withIdentity(jobGroup.getTriggerName(),jobGroup.getTriggerGroup()) + .startAt(jobGroup.getStartTime()).build(); + //添加触发器 + scheduler.scheduleJob(jobDetail,trigger); + } catch (SchedulerException e) { + log.error("addJob error【macAddress:{},jobGroup:{},triggerGroup:{},errMsg:{}】",jobGroup.getMacAddress(),jobGroup.getJobName(),jobGroup.getTriggerGroup(),e.toString()); + } + } + /** + * 移除任务 + * @param jobGroup + * @throws SchedulerException + */ + public void deleteJob(JobGroup jobGroup){ + try { + log.info("移除任务:{}.{}",jobGroup.getJobName(),jobGroup.getTriggerName()); + //触发器 + TriggerKey triggerKey = TriggerKey.triggerKey(jobGroup.getTriggerName(),jobGroup.getTriggerGroup()); + //停止触发器 + scheduler.pauseTrigger(triggerKey); + //移除触发器 + scheduler.unscheduleJob(triggerKey); + //任务 + JobKey jobKey = JobKey.jobKey(jobGroup.getJobName(),jobGroup.getJobGroup()); + //删除任务 + scheduler.deleteJob(jobKey); + } catch (SchedulerException e) { + log.error("deleteJob error【macAddress:{},jobGroup:{},triggerGroup:{},errMsg:{}】",jobGroup.getMacAddress(),jobGroup.getJobName(),jobGroup.getTriggerGroup(),e.toString()); + } + } + + /** + * 关闭调度任务 + */ + public void shutdown(){ + try { + //关闭任务 + scheduler.shutdown(); + } catch (SchedulerException e) { + log.error("shutdown scheduler error:{}",e.toString()); + } + } + +} diff --git a/src/main/java/com/ifish/service/DeviceService.java b/src/main/java/com/ifish/service/DeviceService.java new file mode 100644 index 0000000..5cc6420 --- /dev/null +++ b/src/main/java/com/ifish/service/DeviceService.java @@ -0,0 +1,39 @@ +package com.ifish.service; + +import java.util.List; + +import com.ifish.entity.Device; +import com.ifish.entity.DeviceUser; +import com.ifish.entity.FactoryList; +import com.ifish.entity.HardwareType; +import com.ifish.entity.LoginRecord; +import com.ifish.socketNew.model.send.OrderFunctionCode1; + +/** + * @ClassName: DeviceService + * @Description: TODO + * @author ggw + * + */ +public interface DeviceService { + + public Device update(Device device); + + public Device update(OrderFunctionCode1 model); + + public void updateWarnOnoff(String macAddress,String onOff); + + public Device getUniqueByProperty(String property,Object value); + + public List getByProperty(String property,Object value); + + public DeviceUser getUniqueByProperty(String macAddress); + + public List getListByProperty(Integer deviceId); + + public LoginRecord save(LoginRecord loginRecord); + + public FactoryList getFactoryListById(String factoryCode); + + public HardwareType getHardwareTypeById(String typeCode); +} diff --git a/src/main/java/com/ifish/service/UserService.java b/src/main/java/com/ifish/service/UserService.java new file mode 100644 index 0000000..6ecd985 --- /dev/null +++ b/src/main/java/com/ifish/service/UserService.java @@ -0,0 +1,16 @@ +package com.ifish.service; + +import com.ifish.entity.PushList; +import com.ifish.entity.User; + +/** + * @ClassName: UserService + * @Description: TODO + * @author ggw + * + */ +public interface UserService { + public User findById(Integer userId); + + public PushList save(PushList pushList); +} diff --git a/src/main/java/com/ifish/serviceImpl/DeviceServiceImpl.java b/src/main/java/com/ifish/serviceImpl/DeviceServiceImpl.java new file mode 100644 index 0000000..a458425 --- /dev/null +++ b/src/main/java/com/ifish/serviceImpl/DeviceServiceImpl.java @@ -0,0 +1,171 @@ +package com.ifish.serviceImpl; + +import java.util.Date; +import java.util.List; + +import org.hibernate.criterion.Restrictions; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.ifish.dao.DeviceDao; +import com.ifish.dao.DeviceUserDao; +import com.ifish.dao.FactoryListDao; +import com.ifish.dao.HardwareTypeDao; +import com.ifish.dao.LoginRecordDao; +import com.ifish.entity.Device; +import com.ifish.entity.DeviceUser; +import com.ifish.entity.FactoryList; +import com.ifish.entity.HardwareType; +import com.ifish.entity.LoginRecord; +import com.ifish.enums.BooleanEnum; +import com.ifish.service.DeviceService; +import com.ifish.socketNew.model.send.OrderFunctionCode1; +import com.ifish.util.ByteUtil; + +/** + * @ClassName: DeviceServiceImpl + * @Description: TODO + * @author ggw + * + */ + +@Service +@Transactional +public class DeviceServiceImpl implements DeviceService { + + private static Logger log = LoggerFactory.getLogger(DeviceServiceImpl.class); + + @Autowired + private DeviceDao deviceDao; + @Autowired + private LoginRecordDao loginRecordDao; + @Autowired + private DeviceUserDao deviceUserDao; + @Autowired + private FactoryListDao factoryListDao; + @Autowired + private HardwareTypeDao hardwareTypeDao; + + @Override + public Device update(Device device) { + return this.deviceDao.update(device); + } + + @Override + public Device update(OrderFunctionCode1 model) { + //macAddr地址 + String stcMac = ByteUtil.bytesToHexString(model.getSrc()); + //IP + byte[] log_Ip= model.getLogin_ip(); + StringBuilder ipStr = new StringBuilder(); + for (int i = 0; i < log_Ip.length; i++) { + int v = log_Ip[i] & 0xff; + if(i==0){ + ipStr.append(v); + } + else{ + ipStr.append("."+v); + } + } + //版本 + Integer version = model.getVersion() & 0xff; + //电子厂 + String factoryCode = ByteUtil.toHex(model.getVendor()); + factoryCode = factoryCode.equals("01")?"0a":factoryCode; + //FactoryList factoryList = this.factoryListDao.findById(factoryCode); + //硬件类型 + String typeCode = ByteUtil.toHex(model.getHardware_type()); + //HardwareType hardwareType = this.hardwareTypeDao.findById(typeCode); + //if(factoryList==null || hardwareType==null){ + // return null; + //} + Device device = this.deviceDao.getUniqueByProperty("macAddress", stcMac); + //更新 + if(device!=null){ + Integer loginConut = device.getLoginCount(); + if(loginConut!=null){ + device.setLoginCount(++loginConut); + } + else{ + device.setLoginCount(1); + } + device.setFactoryCode(factoryCode); + device.setHardwareType(typeCode); + device.setSoftwareVersion(version.toString()); + device.setDeviceIP(ipStr.toString()); + device.setLoginTime(new Date()); + this.deviceDao.update(device); + return device; + } + else{ + //新增 + //log.warn("macAddress not exist in database:{}",stcMac); + device = new Device(); + device.setMacAddress(stcMac); + device.setFactoryCode(factoryCode); + device.setHardwareType(typeCode); + device.setSoftwareVersion(version.toString()); + device.setDeviceIP(ipStr.toString()); + device.setLoginCount(1); + Date date = new Date(); + device.setLoginTime(date); + device.setCreateDate(date); + device.setCreateTime(date); + this.deviceDao.save(device); + return device; + } + } + + @Override + public Device getUniqueByProperty(String property, Object value) { + return this.deviceDao.getUniqueByProperty(property, value); + } + + @Override + public List getByProperty(String property, Object value) { + return this.deviceDao.getByProperty(property, value); + } + + @Override + public DeviceUser getUniqueByProperty(String macAddress) { + Device device = deviceDao.getUniqueByProperty("macAddress", macAddress); + if(device!=null){ + DeviceUser deviceUser = deviceUserDao.getUniqueByProperty(Restrictions.eq("isMaster", BooleanEnum.YES.getKey()),Restrictions.eq("priId.deviceId", device.getDeviceId())); + return deviceUser; + } + return null; + } + + @Override + public List getListByProperty(Integer deviceId) { + return deviceUserDao.getListByProperty(Restrictions.eq("priId.deviceId", deviceId)); + } + + @Override + public void updateWarnOnoff(String macAddress,String onOff) { + Device device = this.deviceDao.getUniqueByProperty("macAddress", macAddress); + if(device!=null){ + device.setOnOff(onOff); + this.deviceDao.update(device); + } + } + + @Override + public LoginRecord save(LoginRecord loginRecord) { + return loginRecordDao.save(loginRecord); + } + + @Override + public FactoryList getFactoryListById(String factoryCode) { + return this.factoryListDao.findById(factoryCode); + } + + @Override + public HardwareType getHardwareTypeById(String typeCode) { + return this.hardwareTypeDao.findById(typeCode); + } + +} diff --git a/src/main/java/com/ifish/serviceImpl/UserServiceImpl.java b/src/main/java/com/ifish/serviceImpl/UserServiceImpl.java new file mode 100644 index 0000000..5eaa3e1 --- /dev/null +++ b/src/main/java/com/ifish/serviceImpl/UserServiceImpl.java @@ -0,0 +1,44 @@ +package com.ifish.serviceImpl; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.ifish.dao.PushListDao; +import com.ifish.dao.UserDao; +import com.ifish.entity.PushList; +import com.ifish.entity.User; +import com.ifish.service.UserService; + +/** + * @ClassName: UserServiceImpl + * @Description: TODO + * @author ggw + * + */ + +@Service +@Transactional +public class UserServiceImpl implements UserService { + + private static Logger log = LoggerFactory.getLogger(UserServiceImpl.class); + + @Autowired + private UserDao userDao; + @Autowired + private PushListDao pushListDao; + + @Override + public User findById(Integer userId) { + return this.userDao.findById(userId); + } + + @Override + public PushList save(PushList pushList) { + return pushListDao.save(pushList); + } + + +} diff --git a/src/main/java/com/ifish/socketNew/MinaServerHandler.java b/src/main/java/com/ifish/socketNew/MinaServerHandler.java new file mode 100644 index 0000000..df2e68b --- /dev/null +++ b/src/main/java/com/ifish/socketNew/MinaServerHandler.java @@ -0,0 +1,125 @@ +package com.ifish.socketNew; + +import java.util.Date; +import java.util.concurrent.atomic.AtomicInteger; + +import org.apache.mina.core.service.IoHandlerAdapter; +import org.apache.mina.core.session.IdleStatus; +import org.apache.mina.core.session.IoSession; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import com.ifish.quartz.JobGroup; +import com.ifish.quartz.ScheduleJob; +import com.ifish.util.IfishUtil; + +/** + * mina服务器端事件处理 + * + * @author + */ +public class MinaServerHandler extends IoHandlerAdapter { + + private final AtomicInteger atomicInt = new AtomicInteger(); + + private static Logger log = LoggerFactory.getLogger(MinaServerHandler.class); + + @Autowired + private SomeServer someServer; + @Autowired + private ScheduleJob scheduleJob; + + @Override + public void exceptionCaught(IoSession session, Throwable cause) throws Exception { + cause.printStackTrace(); + log.error("{}服务器-客户端session异常:{}", session.getRemoteAddress(), cause.toString()); + } + + /** + * 服务端接收消息处理 + */ + @Override + public void messageReceived(IoSession session, Object message) throws Exception { + someServer.doSome(session, message); + } + + /** + * 客户端连接的会话创建 + */ + @Override + public void sessionCreated(IoSession session) throws Exception { + log.info("{}:会话创建,在线数:{}", session.getRemoteAddress(), atomicInt.incrementAndGet()); + } + + /** + * 客户端连接关闭 + */ + @Override + public void sessionClosed(IoSession session) throws Exception { + log.warn("{}:会话关闭,连接数:{}", session.getRemoteAddress(), atomicInt.decrementAndGet()); + //旧连接关闭,获取设备mac地址 + String oldConnect = session.getRemoteAddress().toString(); + String macAddress = SomeServer.remoteAddress.get(oldConnect); + if (macAddress != null) { + //移除关闭的连接 + SomeServer.remoteAddress.remove(oldConnect); + //设备当前连接 + IoSession nowIoSession = SomeServer.sessions_cz.get(macAddress); + if (nowIoSession != null && nowIoSession.getRemoteAddress() != null) { + String nowConnect = nowIoSession.getRemoteAddress().toString(); + //如果当前连接和关闭的连接是相同的,说明设备没有重连,10分钟内还未连接,则推送通知用户 + if (nowConnect.equals(oldConnect)) { + offlinePush(macAddress); + } + } //当前没有连接,10分钟内还未连接,则推送通知用户 + else { + offlinePush(macAddress); + } + } + } + + /** + * 延时10分钟推送离线通知,10分钟内重新连接上则移除推送,详见SomeServer + * + * @param macAddress + */ + public void offlinePush(String macAddress) { + JobGroup jobGroup = new JobGroup(); + jobGroup.setJobName(macAddress); + jobGroup.setTriggerName(macAddress); + jobGroup.setMacAddress(macAddress); + //离线时间 + jobGroup.setTimestamp(IfishUtil.format(new Date())); + //10分钟后推送 + jobGroup.setStartTime(new Date(new Date().getTime() + 600000L)); + scheduleJob.addJob(jobGroup); + } + + /** + * 给客户端发送消息 + */ + @Override + public void messageSent(IoSession session, Object message) { + //System.out.println("messageSent"); + } + + /** + * 空闲超时,主动关闭客户端连接 + */ + @Override + public void sessionIdle(IoSession session, IdleStatus status) + throws Exception { + log.warn("空闲超时,服务器主动关闭连接{}", session.getRemoteAddress()); + session.close(true); + } + + /** + * 客户端连接打开 + */ + @Override + public void sessionOpened(IoSession session) throws Exception { + //log.info("session open!!!"); + } + +} diff --git a/src/main/java/com/ifish/socketNew/SomeServer.java b/src/main/java/com/ifish/socketNew/SomeServer.java new file mode 100644 index 0000000..b650552 --- /dev/null +++ b/src/main/java/com/ifish/socketNew/SomeServer.java @@ -0,0 +1,369 @@ +package com.ifish.socketNew; + +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.mina.core.session.IoSession; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import com.ifish.entity.Device; +import com.ifish.entity.DeviceUser; +import com.ifish.entity.LoginRecord; +import com.ifish.entity.PushList; +import com.ifish.entity.User; +import com.ifish.enums.BooleanEnum; +import com.ifish.enums.NeteaseEnum; +import com.ifish.enums.PushTypeEnum; +import com.ifish.netease.NeteaseIM; +import com.ifish.quartz.JobGroup; +import com.ifish.quartz.ScheduleJob; +import com.ifish.service.DeviceService; +import com.ifish.service.UserService; +import com.ifish.socketNew.model.receive.BackFunctionCode0; +import com.ifish.socketNew.model.receive.BackFunctionCode1; +import com.ifish.socketNew.model.receive.BackFunctionCode8; +import com.ifish.socketNew.model.send.OrderFunctionCode0; +import com.ifish.socketNew.model.send.OrderFunctionCode1; +import com.ifish.socketNew.model.send.OrderFunctionCode15; +import com.ifish.socketNew.model.send.OrderFunctionCode16; +import com.ifish.socketNew.model.send.OrderFunctionCode17; +import com.ifish.socketNew.model.send.OrderFunctionCode5; +import com.ifish.socketNew.model.send.OrderFunctionCode9; +import com.ifish.socketNew.util.OrderModel; +import com.ifish.util.ByteUtil; +import com.ifish.util.IfishUtil; + + +/** + * 这个类主要是通过spring注入给MinaServerHandler用的, 表示: mina在接收到信息后,该由主要业务类来处理 服务器处理类 + **/ +public class SomeServer { + + @Autowired + private UserService userService; + @Autowired + private DeviceService deviceService; + @Autowired + private ScheduleJob scheduleJob; + @Autowired + private NeteaseIM neteaseIM; + + //是否回复心跳 + public static boolean isReplay = true; + + private static Logger log = LoggerFactory.getLogger(SomeServer.class); + public static ConcurrentHashMap remoteAddress = new ConcurrentHashMap(); + public static ConcurrentHashMap sessions_cz = new ConcurrentHashMap(); + private ConcurrentHashMap> sessions_sjs = new ConcurrentHashMap>(); + + /** + * 过滤收到的数据 服务器收到数据,进行协议类型匹配,如果不匹配,则不执行相应操作。 + * @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 OrderFunctionCode5) { + OrderFunctionCode5 receive = (OrderFunctionCode5) message; + String strDest = ByteUtil.bytesToHexString(receive.getDest()); + sendToDevice(session,strDest, message); + try { + Integer Onoff = receive.getOnoff() & 0xff; + if(Onoff==1 || Onoff==0){ + deviceService.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 OrderFunctionCode9) { + OrderFunctionCode9 receive = (OrderFunctionCode9) message; + String strSrc = ByteUtil.bytesToHexString(receive.getSrc()); + //推送类型 + Integer warnType = receive.getWarn_type() & 0xff; + if(warnType==0){ + pushNotifcation(strSrc,PushTypeEnum.wendu_warn.getValue(),"温度达到"+(float)receive.getWendu()/10f+"℃,已低于"+(float)receive.getWarn_wendu()/10f+"℃,请及时查看!"); + } + else if(warnType==1){ + pushNotifcation(strSrc,PushTypeEnum.wendu_warn.getValue(),"温度达到"+(float)receive.getWendu()/10f+"℃,已高于"+(float)receive.getWarn_wendu()/10f+"℃,请及时查看!"); + } + else{ + log.error("error warn_type:{},macAddress:{}",warnType,strSrc); + } + } + //设备登录服务器 + else if(message instanceof OrderFunctionCode1) { + OrderFunctionCode1 receive = (OrderFunctionCode1) message; + byte[] srcBytes = receive.getSrc(); + byte[] destBytes = receive.getDest(); + String strSrc = ByteUtil.bytesToHexString(srcBytes); + //服务器回复设备登录请求 + BackFunctionCode1 model = OrderModel.BackFunctionCode1(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 { + //更新设备信息 + deviceService.update(receive); +// if(device==null){ +// String HexDump = ByteUtil.toHex(receive.getType())+ByteUtil.toHex(receive.getCheck_code())+ByteUtil.bytesToHexString(receive.getSrc())+ByteUtil.bytesToHexString(destBytes)+ByteUtil.toHex(receive.getRemote_len())+ByteUtil.toHex(receive.getVendor())+ByteUtil.toHex(receive.getHardware_type())+ByteUtil.toHex(receive.getVersion())+ByteUtil.bytesToHexString(receive.getLogin_ip())+ByteUtil.bytesToHexString(receive.getCrc16_code()); +// log.error("HexDump:{}",HexDump); +// log.error("factoryCode or hardwareType not exist:macAddress:{},factoryCode:{},hardwareType:{}",strSrc,ByteUtil.toHex(receive.getVendor()),ByteUtil.toHex(receive.getHardware_type())); +// } +// else{ + //记录登录时间 + LoginRecord loginRecord = new LoginRecord(); + loginRecord.setMacAddress(strSrc); + loginRecord.setLoginTime(new Date()); + deviceService.save(loginRecord); +// } + } catch (Exception e) { + log.warn("save device login error:macAddress:{},error msg:{}",strSrc,e.toString()); + } + } + //APP登录服务器 + else if(message instanceof OrderFunctionCode0) { + OrderFunctionCode0 receive = (OrderFunctionCode0) 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登录请求 + BackFunctionCode0 model = OrderModel.BackFunctionCode0(destBytes, srcBytes ,login_status); + session.write(model); + //保存APP连接 + CopyOnWriteArraySet sessionSet = sessions_sjs.get(strDest); + if(sessionSet==null){ + sessionSet = new CopyOnWriteArraySet(); + 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 OrderFunctionCode16) { + OrderFunctionCode16 receive = (OrderFunctionCode16) message; + byte[] macBytes = receive.getSrc(); + String strSrc = ByteUtil.bytesToHexString(macBytes); + try { + //查找设备 + Device device = this.deviceService.getUniqueByProperty("macAddress", strSrc); + if(device!=null){ + //是否升级 + if(device.getIsUpgrade().equals(BooleanEnum.YES.getKey())){ + device.setIsUpgrade(BooleanEnum.NO.getKey()); + device.setUpgradeTime(new Date()); + //升级版本 + int upgradeVersion = device.getUpgradeVersion(); + OrderFunctionCode15 model = OrderModel.OrderFunctionCode15(macBytes,upgradeVersion); + session.write(model); + } + //记录参数 + device.setSdkVersion(receive.getVersion() & 0xff); + device.setSdkTime(IfishUtil.StrToDate(receive.getYear()+"-"+(receive.getMonth() & 0xff)+"-"+(receive.getDay() & 0xff))); + this.deviceService.update(device); + } + } catch (Exception e) { + log.warn("save device sdk version16 error:macAddress:{},error msg:{}",strSrc,e.toString()); + } + } + //模块版本号 + else if(message instanceof OrderFunctionCode17) { + OrderFunctionCode17 receive = (OrderFunctionCode17) message; + byte[] macBytes = receive.getSrc(); + String strSrc = ByteUtil.bytesToHexString(macBytes); + try { + //查找设备 + Device device = this.deviceService.getUniqueByProperty("macAddress", strSrc); + if(device!=null){ + //是否升级 + if(device.getIsUpgrade().equals(BooleanEnum.YES.getKey())){ + device.setIsUpgrade(BooleanEnum.NO.getKey()); + device.setUpgradeTime(new Date()); + //升级版本 + int upgradeVersion = device.getUpgradeVersion(); + OrderFunctionCode15 model = OrderModel.OrderFunctionCode15(macBytes,upgradeVersion); + session.write(model); + } + //记录参数 + device.setSdkVersion(receive.getVersion() & 0xff); + device.setSdkTime(IfishUtil.StrToDate(receive.getYear()+"-"+(receive.getMonth() & 0xff)+"-"+(receive.getDay() & 0xff))); + device.setNumber1(receive.getNumber1()); + device.setNumber2(receive.getNumber2()); + device.setNumber3(receive.getNumber3()); + device.setNumber4(receive.getNumber4()); + device.setNumber5(receive.getNumber5()); + this.deviceService.update(device); + } + } 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){ + BackFunctionCode8 model = OrderModel.BackFunctionCode8(strDest); + session.write(model); + } + //转发给APP + CopyOnWriteArraySet 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); + BackFunctionCode0 model = OrderModel.BackFunctionCode0(bytes, bytes ,(byte)0); + session.write(model); + } + } + /** + * 温度预警推送 + * @param strSrc + * @param title + * @param contont + */ + public void pushNotifcation(String strSrc,String title,String contont){ + try { + Device device = deviceService.getUniqueByProperty("macAddress", strSrc); + if(device!=null){ + Integer deviceId = device.getDeviceId(); + //是否开启预警 + String onOff = device.getOnOff(); + if(onOff!=null && onOff.equals(BooleanEnum.YES.getKey())){ + //绑定设备的用户 + List list = deviceService.getListByProperty(device.getDeviceId()); + for (DeviceUser deviceUser : list) { + Integer userId = deviceUser.getPriId().getUserId(); + String showName = deviceUser.getShowName(); + String timestamp = IfishUtil.format(new Date()); + String msg = "【"+title+"】你的水族箱“"+showName+"”在"+timestamp+contont; + User user = userService.findById(userId); + if(user!=null){ + //云信推送 + boolean neteaseBln = false; + //极光推送 + boolean jpushIosBln = false; + boolean jpushAndroidBln = false; + //发送云信消息 + Map neteaseMap = neteaseIM.sendMsg("ifish", userId.toString(), msg); + if(neteaseMap!=null){ + neteaseBln = neteaseMap.get("code").equals(NeteaseEnum.status200.getKey()); + } + String loginType = user.getLoginType(); + if(loginType!=null){ + //推送记录 + PushList pushList = new PushList(); + Map map = new HashMap(); + map.put("device_id", deviceId.toString()); + map.put("device_name", showName); + map.put("timestamp", timestamp); + map.put("msg_type", PushTypeEnum.wendu_warn.getKey()); + //记录推送 + if(jpushIosBln || jpushAndroidBln || neteaseBln){ + 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.setNeteaseStatus(neteaseBln?BooleanEnum.YES.getKey():BooleanEnum.NO.getKey()); + pushList.setCreateTime(new Date()); + pushList.setNumber1(device.getNumber1()); + pushList.setNumber2(device.getNumber2()); + pushList.setNumber3(device.getNumber3()); + pushList.setNumber4(device.getNumber4()); + pushList.setNumber5(device.getNumber5()); + this.userService.save(pushList); + } + } + } + } + + } + } + } catch (Exception e) { + log.warn("pushNotifcation error:macAddress:{},error msg:{}",strSrc,e.toString()); + } + } +} diff --git a/src/main/java/com/ifish/socketNew/codeFactory/Context.java b/src/main/java/com/ifish/socketNew/codeFactory/Context.java new file mode 100644 index 0000000..c18203d --- /dev/null +++ b/src/main/java/com/ifish/socketNew/codeFactory/Context.java @@ -0,0 +1,49 @@ +package com.ifish.socketNew.codeFactory; + +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; + +import org.apache.mina.core.buffer.IoBuffer; + +public class Context { + private final CharsetDecoder decoder; + private IoBuffer buf; + private int matchCount = 0; + private int overflowPosition = 0; + + public Context(Charset charset) { + decoder = charset.newDecoder(); + buf = IoBuffer.allocate(100).setAutoExpand(true); + //buf.order(ByteOrder.LITTLE_ENDIAN); + } + + public CharsetDecoder getDecoder() { + return decoder; + } + + public IoBuffer getBuffer() { + return buf; + } + + public int getOverflowPosition() { + return overflowPosition; + } + + public int getMatchCount() { + return matchCount; + } + + public void setMatchCount(int matchCount) { + this.matchCount = matchCount; + } + + public void reset() { + overflowPosition = 0; + matchCount = 0; + decoder.reset(); + } + + public void append(IoBuffer in) { + getBuffer().put(in); + } +} diff --git a/src/main/java/com/ifish/socketNew/codeFactory/ServerCodecFactory.java b/src/main/java/com/ifish/socketNew/codeFactory/ServerCodecFactory.java new file mode 100644 index 0000000..3adf571 --- /dev/null +++ b/src/main/java/com/ifish/socketNew/codeFactory/ServerCodecFactory.java @@ -0,0 +1,23 @@ +package com.ifish.socketNew.codeFactory; + +import java.nio.charset.Charset; +import org.apache.mina.core.session.IoSession; +import org.apache.mina.filter.codec.ProtocolCodecFactory; +import org.apache.mina.filter.codec.ProtocolDecoder; +import org.apache.mina.filter.codec.ProtocolEncoder; + +public class ServerCodecFactory implements ProtocolCodecFactory{ + + private static final Charset charset = Charset.forName("UTF-8"); + + @Override + public ProtocolDecoder getDecoder(IoSession session) throws Exception { + return new ServerDecode(charset); + } + + @Override + public ProtocolEncoder getEncoder(IoSession session) throws Exception { + return new ServerEncode(charset); + } + +} diff --git a/src/main/java/com/ifish/socketNew/codeFactory/ServerDecode.java b/src/main/java/com/ifish/socketNew/codeFactory/ServerDecode.java new file mode 100644 index 0000000..61c617f --- /dev/null +++ b/src/main/java/com/ifish/socketNew/codeFactory/ServerDecode.java @@ -0,0 +1,377 @@ +package com.ifish.socketNew.codeFactory; + +import java.nio.charset.Charset; + +import org.apache.mina.core.buffer.IoBuffer; +import org.apache.mina.core.session.AttributeKey; +import org.apache.mina.core.session.IoSession; +import org.apache.mina.filter.codec.ProtocolDecoder; +import org.apache.mina.filter.codec.ProtocolDecoderOutput; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.ifish.socketNew.model.send.OrderFunctionCode0; +import com.ifish.socketNew.model.send.OrderFunctionCode1; +import com.ifish.socketNew.model.send.OrderFunctionCode16; +import com.ifish.socketNew.model.send.OrderFunctionCode17; +import com.ifish.socketNew.model.send.OrderFunctionCode5; +import com.ifish.socketNew.model.send.OrderFunctionCode9; + + +/** + * 解码 + * + * @author + */ + +public class ServerDecode implements ProtocolDecoder { + + private final AttributeKey CONTEXT = new AttributeKey(getClass(), "context"); + private final Charset charset; + private static Logger log = LoggerFactory.getLogger(ServerDecode.class); + + public ServerDecode() { + this(Charset.defaultCharset()); + } + + public ServerDecode(Charset charset) { + this.charset = charset; + } + + private Context getContext(IoSession session) { + Context ctx = (Context) session.getAttribute(CONTEXT); + if (ctx == null) { + ctx = new Context(charset); + session.setAttribute(CONTEXT, ctx); + } + return ctx; + } + + @Override + public void decode(IoSession session, IoBuffer in, ProtocolDecoderOutput out) throws Exception { + // 小端模式 + //in.order(ByteOrder.LITTLE_ENDIAN); + // 先获取上次的处理上下文,其中可能有未处理完的数据 + Context ctx = getContext(session); + // 先把当前buffer中的数据追加到Context的buffer当中 + ctx.append(in); + + IoBuffer buf = ctx.getBuffer(); + buf.flip(); + //验证 + getValid(session, buf, out); + } + + /** + * 验证协议 + * @param session + * @param buf + * @param out + */ + private void getValid(IoSession session, IoBuffer buf, ProtocolDecoderOutput out){ + int limit = buf.remaining(); + int check_code = buf.position(1).get() & 0xff; + int length = buf.position(14).get() & 0xff; + buf.position(0); + //计算包长度 + if (buf.hasRemaining() && limit == length && length >= 17) { + //字节转成对象 + doDecode(buf, out, length ,check_code); + } + else{ + log.info("length error:length:【{}】,limit:【{}】,HexDump:【{}】",length,limit,buf.getHexDump()); + } + buf.position(0); + buf.clear(); + } + + /** + * 解码成对象 + * @param buf + * @param out + * @param length + */ + private void doDecode(IoBuffer buf, ProtocolDecoderOutput out, int length, int check_code) { + //字节 + byte[] bytes = new byte[length]; + buf.get(bytes); + buf.flip(); + //log.info("length:【{}】;limit:【{}】,HexDump:【{}】",length,buf.limit(),buf.getHexDump()); + //crc16校验 + //boolean bln = CRC16.calcCrc16(ByteUtil.hexStringToBytes(hexDump)); + switch (length) { + //长度为22 + case 22:{ + //设置报警温度 + if(check_code==5){ + functionCode5(buf, out); + } + //设备报警 + else if(check_code==9){ + functionCode9(buf, out); + } + //模块版本指令 + else if(check_code==16){ + functionCode16(buf, out); + } + else{ + out.write(bytes); + } + break; + } + //长度为24,设备发登录请求 + case 24:{ + if(check_code==1){ + functionCode1(buf, out); + } + break; + } + //长度为25,手机发登录请求 + case 25:{ + if(check_code==0){ + functionCode0(buf, out); + } + break; + } + //模块版本指令 + case 42:{ + if(check_code==17){ + functionCode17(buf, out); + } + break; + } + default:{ + out.write(bytes); + } + } + } + + /** + * 设备登陆服务器 + * @param buf + * @param out + */ + private void functionCode1(IoBuffer buf, ProtocolDecoderOutput out) { + OrderFunctionCode1 model = new OrderFunctionCode1(); + //15字节数据包头 + model.setType(buf.get()); + model.setCheck_code(buf.get()); + byte[] src = model.getSrc(); + for (int i = 0; i < src.length; i++) { + src[i] = buf.get(); + } + model.setSrc(src); + byte[] dest = model.getDest(); + for (int i = 0; i < dest.length; i++) { + dest[i] = buf.get(); + } + model.setDest(dest); + model.setRemote_len(buf.get()); + //登陆信息 + model.setVendor(buf.get()); + model.setHardware_type(buf.get()); + model.setVersion(buf.get()); + byte[] login_ip = model.getLogin_ip(); + for (int i = 0; i < login_ip.length; i++) { + login_ip[i] = buf.get(); + } + model.setLogin_ip(login_ip); + byte[] crc16_code = model.getCrc16_code(); + for (int i = 0; i < crc16_code.length; i++) { + crc16_code[i] = buf.get(); + } + out.write(model); + } + + /** + * APP登陆服务器 + * @param buf + * @param out + */ + private void functionCode0(IoBuffer buf, ProtocolDecoderOutput out) { + OrderFunctionCode0 model = new OrderFunctionCode0(); + //15字节数据包头 + model.setType(buf.get()); + model.setCheck_code(buf.get()); + byte[] src = model.getSrc(); + for (int i = 0; i < src.length; i++) { + src[i] = buf.get(); + } + model.setSrc(src); + byte[] dest = model.getDest(); + for (int i = 0; i < dest.length; i++) { + dest[i] = buf.get(); + } + model.setDest(dest); + model.setRemote_len(buf.get()); + //时间 + model.setLongtime(buf.getLong()); + byte[] crc16_code = model.getCrc16_code(); + for (int i = 0; i < crc16_code.length; i++) { + crc16_code[i] = buf.get(); + } + out.write(model); + } + + /** + * 设置报警温度 + * @param buf + * @param out + */ + private void functionCode5(IoBuffer buf, ProtocolDecoderOutput out) { + OrderFunctionCode5 model = new OrderFunctionCode5(); + //15字节数据包头 + model.setType(buf.get()); + model.setCheck_code(buf.get()); + byte[] src = model.getSrc(); + for (int i = 0; i < src.length; i++) { + src[i] = buf.get(); + } + model.setSrc(src); + byte[] dest = model.getDest(); + for (int i = 0; i < dest.length; i++) { + dest[i] = buf.get(); + } + model.setDest(dest); + model.setRemote_len(buf.get()); + //开启关闭报警,00关,01开,02设置温度 + model.setOnoff(buf.get()); + //低温报警温度 + model.setLow_wendu(buf.getShort()); + //高温报警温度 + model.setHight_wendu(buf.getShort()); + byte[] crc16_code = model.getCrc16_code(); + for (int i = 0; i < crc16_code.length; i++) { + crc16_code[i] = buf.get(); + } + out.write(model); + } + /** + * 模块版本号 + * @param buf + * @param out + */ + private void functionCode16(IoBuffer buf, ProtocolDecoderOutput out) { + OrderFunctionCode16 model = new OrderFunctionCode16(); + //15字节数据包头 + model.setType(buf.get()); + model.setCheck_code(buf.get()); + byte[] src = model.getSrc(); + for (int i = 0; i < src.length; i++) { + src[i] = buf.get(); + } + model.setSrc(src); + byte[] dest = model.getDest(); + for (int i = 0; i < dest.length; i++) { + dest[i] = buf.get(); + } + model.setDest(dest); + model.setRemote_len(buf.get()); + //版本 + model.setVersion(buf.get()); + //年 + model.setYear(buf.getShort()); + //月 + model.setMonth(buf.get()); + //日 + model.setDay(buf.get()); + byte[] crc16_code = model.getCrc16_code(); + for (int i = 0; i < crc16_code.length; i++) { + crc16_code[i] = buf.get(); + } + out.write(model); + } + /** + * 模块版本号 + * @param buf + * @param out + */ + private void functionCode17(IoBuffer buf, ProtocolDecoderOutput out) { + OrderFunctionCode17 model = new OrderFunctionCode17(); + //15字节数据包头 + model.setType(buf.get()); + model.setCheck_code(buf.get()); + byte[] src = model.getSrc(); + for (int i = 0; i < src.length; i++) { + src[i] = buf.get(); + } + model.setSrc(src); + byte[] dest = model.getDest(); + for (int i = 0; i < dest.length; i++) { + dest[i] = buf.get(); + } + model.setDest(dest); + model.setRemote_len(buf.get()); + //版本 + model.setVersion(buf.get()); + //年 + model.setYear(buf.getShort()); + //月 + model.setMonth(buf.get()); + //日 + model.setDay(buf.get()); + //MCU启动次数 + model.setNumber1(buf.getInt()); + //模块启动次数 + model.setNumber2(buf.getInt()); + //连接路由器次数 + model.setNumber3(buf.getInt()); + //成功连接服务器次数 + model.setNumber4(buf.getInt()); + //尝试连接服务器次数 + model.setNumber5(buf.getInt()); + byte[] crc16_code = model.getCrc16_code(); + for (int i = 0; i < crc16_code.length; i++) { + crc16_code[i] = buf.get(); + } + out.write(model); + } + /** + * 设备温度报警 + * @param buf + * @param out + */ + private void functionCode9(IoBuffer buf, ProtocolDecoderOutput out) { + OrderFunctionCode9 model = new OrderFunctionCode9(); + //15字节数据包头 + model.setType(buf.get()); + model.setCheck_code(buf.get()); + byte[] src = model.getSrc(); + for (int i = 0; i < src.length; i++) { + src[i] = buf.get(); + } + model.setSrc(src); + byte[] dest = model.getDest(); + for (int i = 0; i < dest.length; i++) { + dest[i] = buf.get(); + } + model.setDest(dest); + model.setRemote_len(buf.get()); + //报警温度类型,0是低温报警,1是高温报警 + model.setWarn_type(buf.get()); + //当前设备温度 + model.setWendu(buf.getShort()); + //报警温度 + model.setWarn_wendu(buf.getShort()); + byte[] crc16_code = model.getCrc16_code(); + for (int i = 0; i < crc16_code.length; i++) { + crc16_code[i] = buf.get(); + } + out.write(model); + } + + @Override + public void dispose(IoSession session) throws Exception { + Context ctx = (Context) session.getAttribute(CONTEXT); + if (ctx != null) { + session.removeAttribute(CONTEXT); + } + } + + @Override + public void finishDecode(IoSession session, ProtocolDecoderOutput out) + throws Exception { + + } + +} diff --git a/src/main/java/com/ifish/socketNew/codeFactory/ServerEncode.java b/src/main/java/com/ifish/socketNew/codeFactory/ServerEncode.java new file mode 100644 index 0000000..bebf23a --- /dev/null +++ b/src/main/java/com/ifish/socketNew/codeFactory/ServerEncode.java @@ -0,0 +1,134 @@ +package com.ifish.socketNew.codeFactory; + +import java.nio.charset.Charset; + +import org.apache.mina.core.buffer.IoBuffer; +import org.apache.mina.core.session.IoSession; +import org.apache.mina.filter.codec.ProtocolEncoder; +import org.apache.mina.filter.codec.ProtocolEncoderOutput; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.ifish.socketNew.model.receive.BackFunctionCode0; +import com.ifish.socketNew.model.receive.BackFunctionCode1; +import com.ifish.socketNew.model.receive.BackFunctionCode8; +import com.ifish.socketNew.model.send.OrderFunctionCode15; +import com.ifish.socketNew.model.send.OrderFunctionCode5; + +/** + * 编码 + * + * @author + */ +public class ServerEncode implements ProtocolEncoder { + + private final Charset charset; + private static Logger log = LoggerFactory.getLogger(ServerEncode.class); + + public ServerEncode() { + this(Charset.defaultCharset()); + } + + public ServerEncode(Charset charset) { + this.charset = charset; + } + + /* 这个message来自哪? */ + @Override + public void encode(IoSession session, Object message, ProtocolEncoderOutput out) throws Exception { + + IoBuffer buffer = IoBuffer.allocate(100).setAutoExpand(true); + //修改此缓冲区的字节顺序,小端模式 + //buffer.order(ByteOrder.LITTLE_ENDIAN); + //转发不做处理的数据 + if (message instanceof byte[]) { + byte[] bytes = (byte[]) message; + buffer.put(bytes); + } //响应心跳 + else if (message instanceof BackFunctionCode8) { + BackFunctionCode8 model = (BackFunctionCode8) message; + //15字节数据包头 + buffer.put(model.getType()); + buffer.put(model.getCheck_code()); + buffer.put(model.getSrc()); + buffer.put(model.getDest()); + buffer.put(model.getRemote_len()); + //crc16校验码 + buffer.put(model.getCrc16_code()); + } //设置报警温度 + else if (message instanceof OrderFunctionCode5) { + OrderFunctionCode5 model = (OrderFunctionCode5) message; + //15字节数据包头 + buffer.put(model.getType()); + buffer.put(model.getCheck_code()); + buffer.put(model.getSrc()); + buffer.put(model.getDest()); + buffer.put(model.getRemote_len()); + //开关 + buffer.put(model.getOnoff()); + //温度类型 + buffer.putShort(model.getLow_wendu()); + //报警温度 + buffer.putShort(model.getHight_wendu()); + //crc16校验码 + buffer.put(model.getCrc16_code()); + } //APP登录响应 + else if (message instanceof BackFunctionCode0) { + BackFunctionCode0 model = (BackFunctionCode0) message; + //15字节数据包头 + buffer.put(model.getType()); + buffer.put(model.getCheck_code()); + buffer.put(model.getSrc()); + buffer.put(model.getDest()); + buffer.put(model.getRemote_len()); + //状态 + buffer.put(model.getLogin_status()); + //时间 + buffer.putLong(model.getSysTime()); + //crc16校验码 + buffer.put(model.getCrc16_code()); + } //设备登陆返回 + else if (message instanceof BackFunctionCode1) { + BackFunctionCode1 model = (BackFunctionCode1) message; + //15字节数据包头 + buffer.put(model.getType()); + buffer.put(model.getCheck_code()); + buffer.put(model.getSrc()); + buffer.put(model.getDest()); + buffer.put(model.getRemote_len()); + //系统时间 + buffer.put(model.getSysTime()); + //crc16校验码 + buffer.put(model.getCrc16_code()); + } //升级 + else if (message instanceof OrderFunctionCode15) { + OrderFunctionCode15 model = (OrderFunctionCode15) message; + //15字节数据包头 + buffer.put(model.getType()); + buffer.put(model.getCheck_code()); + buffer.put(model.getSrc()); + buffer.put(model.getDest()); + buffer.put(model.getRemote_len()); + //版本 + buffer.put(model.getVersion()); + //地址 + buffer.put(model.getAddress()); + //crc16校验码 + buffer.put(model.getCrc16_code()); + } + buffer.flip(); + /* + * 编码的方式就是按照短信协议拼 装字符串到IoBuffer 缓冲区,然后调用ProtocolEncoderOutput + * 的write()方法输出字节 流 + */ + //log.info("limit:【{}】,HexDump:【{}】",buffer.limit(),buffer.getHexDump()); + out.write(buffer); + out.flush(); + buffer.free(); + } + + @Override + public void dispose(IoSession session) throws Exception { + + } +} diff --git a/src/main/java/com/ifish/socketNew/model/HeadModel.java b/src/main/java/com/ifish/socketNew/model/HeadModel.java new file mode 100644 index 0000000..c5edc89 --- /dev/null +++ b/src/main/java/com/ifish/socketNew/model/HeadModel.java @@ -0,0 +1,74 @@ +package com.ifish.socketNew.model; + +import java.io.Serializable; + +/** + * 15字节数据包头+CRC16校验码2字节 + * @author guogw + * + */ +public class HeadModel implements Serializable { + + private static final long serialVersionUID = 7351497431272185642L; + //发送消息类型,1回复类型,0发送类型 + private byte type; + //功能码 + private byte check_code; + //6位为发送端的mac地址,高16位为0001 + private byte[] src = new byte[6]; + //6位为接收端的mac地址,高16位为0001 + private byte[] dest = new byte[6]; + //整个包长度 + private byte remote_len; + //CRC16校验码 + private byte[] crc16_code = new byte[2]; + + public byte getType() { + return type; + } + + public void setType(byte type) { + this.type = type; + } + + public byte getCheck_code() { + return check_code; + } + + public void setCheck_code(byte check_code) { + this.check_code = check_code; + } + + public void setRemote_len(byte remote_len) { + this.remote_len = remote_len; + } + + public byte[] getSrc() { + return src; + } + + public void setSrc(byte[] src) { + this.src = src; + } + + public byte[] getDest() { + return dest; + } + + public void setDest(byte[] dest) { + this.dest = dest; + } + + public byte getRemote_len() { + return remote_len; + } + + public byte[] getCrc16_code() { + return crc16_code; + } + + public void setCrc16_code(byte[] crc16_code) { + this.crc16_code = crc16_code; + } + +} diff --git a/src/main/java/com/ifish/socketNew/model/receive/BackBytes113.java b/src/main/java/com/ifish/socketNew/model/receive/BackBytes113.java new file mode 100644 index 0000000..d4df5e8 --- /dev/null +++ b/src/main/java/com/ifish/socketNew/model/receive/BackBytes113.java @@ -0,0 +1,461 @@ +package com.ifish.socketNew.model.receive; + +import java.io.Serializable; + +import com.ifish.socketNew.model.HeadModel; + +/** + * 查询反馈信息113字节(15字节协议头+98字节结果) + * @author guogw + * + */ +public class BackBytes113 extends HeadModel implements Serializable { + + private static final long serialVersionUID = 2740442296642889777L; + //工作模式 + private byte work_model; + /*********灯和开关(12字节)**********/ + //灯编号1 + private byte number1; + //灯编号2 + private byte number2; + //灯编号3 + private byte number3; + //灯编号4 + private byte number4; + //灯编号5 + private byte number5; + //灯编号6 + private byte number6; + //灯1开关 + private byte onoff1; + //灯2开关 + private byte onoff2; + //灯3开关 + private byte onoff3; + //灯4开关 + private byte onoff4; + //灯5开关 + private byte onoff5; + //灯6开关 + private byte onoff6; + /*********定时器编号(12字节)灯1对应定时器1-2,灯2对应定时器3-4,灯3对应定时器5-6.....**********/ + //定时器1编号 + private byte timer_number1; + //定时器2编号 + private byte timer_number2; + //定时器3编号 + private byte timer_number3; + //定时器4编号 + private byte timer_number4; + //定时器5编号 + private byte timer_number5; + //定时器6编号 + private byte timer_number6; + //定时器7编号 + private byte timer_number7; + //定时器8编号 + private byte timer_number8; + //定时器9编号 + private byte timer_number9; + //定时器10编号 + private byte timer_number10; + //定时器11编号 + private byte timer_number11; + //定时器12编号 + private byte timer_number12; + /*********定时器开关(12字节)**********/ + //定时器1开关 + private byte timer_onoff1; + //定时器2开关 + private byte timer_onoff2; + //定时器3开关 + private byte timer_onoff3; + //定时器4开关 + private byte timer_onoff4; + //定时器5开关 + private byte timer_onoff5; + //定时器6开关 + private byte timer_onoff6; + //定时器7开关 + private byte timer_onoff7; + //定时器8开关 + private byte timer_onoff8; + //定时器9开关 + private byte timer_onoff9; + //定时器10开关 + private byte timer_onoff10; + //定时器11开关 + private byte timer_onoff11; + //定时器12开关 + private byte timer_onoff12; + /*********定时器时间(48字节)**********/ + //定时器1时间 + private byte[] timer_time1 = new byte[4]; + //定时器2时间 + private byte[] timer_time2 = new byte[4]; + //定时器3时间 + private byte[] timer_time3 = new byte[4]; + //定时器4时间 + private byte[] timer_time4 = new byte[4]; + //定时器5时间 + private byte[] timer_time5 = new byte[4]; + //定时器6时间 + private byte[] timer_time6 = new byte[4]; + //定时器7时间 + private byte[] timer_time7 = new byte[4]; + //定时器8时间 + private byte[] timer_time8 = new byte[4]; + //定时器9时间 + private byte[] timer_time9 = new byte[4]; + //定时器10时间 + private byte[] timer_time10 = new byte[4]; + //定时器11时间 + private byte[] timer_time11 = new byte[4]; + //定时器12时间 + private byte[] timer_time12 = new byte[4]; + //温度 + private short wendu; + //ph + private short ph_value; + //湿度 + private short shidu; + //报警开关,0关,1开 + private byte warn_onoff; + //最低报警温度 + private short low_wendu; + //最高报警温度 + private short high_wendu; + + public short getWendu() { + return wendu; + } + public void setWendu(short wendu) { + this.wendu = wendu; + } + public byte getWork_model() { + return work_model; + } + public void setWork_model(byte work_model) { + this.work_model = work_model; + } + public byte getNumber1() { + return number1; + } + public void setNumber1(byte number1) { + this.number1 = number1; + } + public byte getOnoff1() { + return onoff1; + } + public void setOnoff1(byte onoff1) { + this.onoff1 = onoff1; + } + public byte getNumber2() { + return number2; + } + public void setNumber2(byte number2) { + this.number2 = number2; + } + public byte getOnoff2() { + return onoff2; + } + public void setOnoff2(byte onoff2) { + this.onoff2 = onoff2; + } + public byte getNumber3() { + return number3; + } + public void setNumber3(byte number3) { + this.number3 = number3; + } + public byte getOnoff3() { + return onoff3; + } + public void setOnoff3(byte onoff3) { + this.onoff3 = onoff3; + } + public byte getTimer_number1() { + return timer_number1; + } + public void setTimer_number1(byte timer_number1) { + this.timer_number1 = timer_number1; + } + public byte getTimer_number2() { + return timer_number2; + } + public void setTimer_number2(byte timer_number2) { + this.timer_number2 = timer_number2; + } + public byte getTimer_number3() { + return timer_number3; + } + public void setTimer_number3(byte timer_number3) { + this.timer_number3 = timer_number3; + } + public byte getTimer_number4() { + return timer_number4; + } + public void setTimer_number4(byte timer_number4) { + this.timer_number4 = timer_number4; + } + public byte getTimer_number5() { + return timer_number5; + } + public void setTimer_number5(byte timer_number5) { + this.timer_number5 = timer_number5; + } + public byte getTimer_number6() { + return timer_number6; + } + public void setTimer_number6(byte timer_number6) { + this.timer_number6 = timer_number6; + } + public byte getTimer_number7() { + return timer_number7; + } + public void setTimer_number7(byte timer_number7) { + this.timer_number7 = timer_number7; + } + public byte getTimer_number8() { + return timer_number8; + } + public void setTimer_number8(byte timer_number8) { + this.timer_number8 = timer_number8; + } + public byte getTimer_number9() { + return timer_number9; + } + public void setTimer_number9(byte timer_number9) { + this.timer_number9 = timer_number9; + } + public byte[] getTimer_time1() { + return timer_time1; + } + public void setTimer_time1(byte[] timer_time1) { + this.timer_time1 = timer_time1; + } + public byte[] getTimer_time2() { + return timer_time2; + } + public void setTimer_time2(byte[] timer_time2) { + this.timer_time2 = timer_time2; + } + public byte[] getTimer_time3() { + return timer_time3; + } + public void setTimer_time3(byte[] timer_time3) { + this.timer_time3 = timer_time3; + } + public byte[] getTimer_time4() { + return timer_time4; + } + public void setTimer_time4(byte[] timer_time4) { + this.timer_time4 = timer_time4; + } + public byte[] getTimer_time5() { + return timer_time5; + } + public void setTimer_time5(byte[] timer_time5) { + this.timer_time5 = timer_time5; + } + public byte[] getTimer_time6() { + return timer_time6; + } + public void setTimer_time6(byte[] timer_time6) { + this.timer_time6 = timer_time6; + } + public byte[] getTimer_time7() { + return timer_time7; + } + public void setTimer_time7(byte[] timer_time7) { + this.timer_time7 = timer_time7; + } + public byte[] getTimer_time8() { + return timer_time8; + } + public void setTimer_time8(byte[] timer_time8) { + this.timer_time8 = timer_time8; + } + public byte[] getTimer_time9() { + return timer_time9; + } + public void setTimer_time9(byte[] timer_time9) { + this.timer_time9 = timer_time9; + } + public short getPh_value() { + return ph_value; + } + public void setPh_value(short ph_value) { + this.ph_value = ph_value; + } + public short getShidu() { + return shidu; + } + public void setShidu(short shidu) { + this.shidu = shidu; + } + public byte getWarn_onoff() { + return warn_onoff; + } + public void setWarn_onoff(byte warn_onoff) { + this.warn_onoff = warn_onoff; + } + public short getLow_wendu() { + return low_wendu; + } + public void setLow_wendu(short low_wendu) { + this.low_wendu = low_wendu; + } + public short getHigh_wendu() { + return high_wendu; + } + public void setHigh_wendu(short high_wendu) { + this.high_wendu = high_wendu; + } + public byte getOnoff4() { + return onoff4; + } + public void setOnoff4(byte onoff4) { + this.onoff4 = onoff4; + } + public byte getOnoff5() { + return onoff5; + } + public void setOnoff5(byte onoff5) { + this.onoff5 = onoff5; + } + public byte getTimer_number10() { + return timer_number10; + } + public void setTimer_number10(byte timer_number10) { + this.timer_number10 = timer_number10; + } + public byte[] getTimer_time10() { + return timer_time10; + } + public void setTimer_time10(byte[] timer_time10) { + this.timer_time10 = timer_time10; + } + public byte getNumber4() { + return number4; + } + public void setNumber4(byte number4) { + this.number4 = number4; + } + public byte getNumber5() { + return number5; + } + public void setNumber5(byte number5) { + this.number5 = number5; + } + public byte getTimer_onoff1() { + return timer_onoff1; + } + public void setTimer_onoff1(byte timer_onoff1) { + this.timer_onoff1 = timer_onoff1; + } + public byte getTimer_onoff2() { + return timer_onoff2; + } + public void setTimer_onoff2(byte timer_onoff2) { + this.timer_onoff2 = timer_onoff2; + } + public byte getTimer_onoff3() { + return timer_onoff3; + } + public void setTimer_onoff3(byte timer_onoff3) { + this.timer_onoff3 = timer_onoff3; + } + public byte getTimer_onoff4() { + return timer_onoff4; + } + public void setTimer_onoff4(byte timer_onoff4) { + this.timer_onoff4 = timer_onoff4; + } + public byte getTimer_onoff5() { + return timer_onoff5; + } + public void setTimer_onoff5(byte timer_onoff5) { + this.timer_onoff5 = timer_onoff5; + } + public byte getTimer_onoff6() { + return timer_onoff6; + } + public void setTimer_onoff6(byte timer_onoff6) { + this.timer_onoff6 = timer_onoff6; + } + public byte getTimer_onoff7() { + return timer_onoff7; + } + public void setTimer_onoff7(byte timer_onoff7) { + this.timer_onoff7 = timer_onoff7; + } + public byte getTimer_onoff8() { + return timer_onoff8; + } + public void setTimer_onoff8(byte timer_onoff8) { + this.timer_onoff8 = timer_onoff8; + } + public byte getTimer_onoff9() { + return timer_onoff9; + } + public void setTimer_onoff9(byte timer_onoff9) { + this.timer_onoff9 = timer_onoff9; + } + public byte getTimer_onoff10() { + return timer_onoff10; + } + public void setTimer_onoff10(byte timer_onoff10) { + this.timer_onoff10 = timer_onoff10; + } + public byte getNumber6() { + return number6; + } + public void setNumber6(byte number6) { + this.number6 = number6; + } + public byte getOnoff6() { + return onoff6; + } + public void setOnoff6(byte onoff6) { + this.onoff6 = onoff6; + } + public byte getTimer_number11() { + return timer_number11; + } + public void setTimer_number11(byte timer_number11) { + this.timer_number11 = timer_number11; + } + public byte getTimer_number12() { + return timer_number12; + } + public void setTimer_number12(byte timer_number12) { + this.timer_number12 = timer_number12; + } + public byte getTimer_onoff11() { + return timer_onoff11; + } + public void setTimer_onoff11(byte timer_onoff11) { + this.timer_onoff11 = timer_onoff11; + } + public byte getTimer_onoff12() { + return timer_onoff12; + } + public void setTimer_onoff12(byte timer_onoff12) { + this.timer_onoff12 = timer_onoff12; + } + public byte[] getTimer_time11() { + return timer_time11; + } + public void setTimer_time11(byte[] timer_time11) { + this.timer_time11 = timer_time11; + } + public byte[] getTimer_time12() { + return timer_time12; + } + public void setTimer_time12(byte[] timer_time12) { + this.timer_time12 = timer_time12; + } + +} diff --git a/src/main/java/com/ifish/socketNew/model/receive/BackBytes28.java b/src/main/java/com/ifish/socketNew/model/receive/BackBytes28.java new file mode 100644 index 0000000..8092980 --- /dev/null +++ b/src/main/java/com/ifish/socketNew/model/receive/BackBytes28.java @@ -0,0 +1,73 @@ +package com.ifish.socketNew.model.receive; + +import java.io.Serializable; + +import com.ifish.socketNew.model.HeadModel; + +/** + * 查询反馈信息28字节(15字节协议头+13字节结果) + * @author guogw + * + */ +public class BackBytes28 extends HeadModel implements Serializable { + + private static final long serialVersionUID = 2740442296642889777L; + //温度 + private short wendu; + //ph + private short ph_value; + //背光亮度 + private byte lightness; + //湿度 + private byte shidu; + //报警开关,0关,1开 + private byte warn_onoff; + //最低报警温度 + private short low_wendu; + //最高报警温度 + private short high_wendu; + public short getWendu() { + return wendu; + } + public void setWendu(short wendu) { + this.wendu = wendu; + } + public short getPh_value() { + return ph_value; + } + public void setPh_value(short ph_value) { + this.ph_value = ph_value; + } + public byte getLightness() { + return lightness; + } + public void setLightness(byte lightness) { + this.lightness = lightness; + } + public byte getShidu() { + return shidu; + } + public void setShidu(byte shidu) { + this.shidu = shidu; + } + public byte getWarn_onoff() { + return warn_onoff; + } + public void setWarn_onoff(byte warn_onoff) { + this.warn_onoff = warn_onoff; + } + public short getLow_wendu() { + return low_wendu; + } + public void setLow_wendu(short low_wendu) { + this.low_wendu = low_wendu; + } + public short getHigh_wendu() { + return high_wendu; + } + public void setHigh_wendu(short high_wendu) { + this.high_wendu = high_wendu; + } + + +} diff --git a/src/main/java/com/ifish/socketNew/model/receive/BackBytes57.java b/src/main/java/com/ifish/socketNew/model/receive/BackBytes57.java new file mode 100644 index 0000000..ff19e7e --- /dev/null +++ b/src/main/java/com/ifish/socketNew/model/receive/BackBytes57.java @@ -0,0 +1,213 @@ +package com.ifish.socketNew.model.receive; + +import java.io.Serializable; + +import com.ifish.socketNew.model.HeadModel; + +/** + * 查询反馈信息57字节(15字节协议头+42字节结果) + * @author guogw + * + */ +public class BackBytes57 extends HeadModel implements Serializable { + + private static final long serialVersionUID = 2740442296642889777L; + //工作模式 + private byte work_model; + /*********灯和开关(4字节)**********/ + //灯编号1 + private byte number1; + //灯编号2 + private byte number2; + //灯1开关 + private byte onoff1; + //灯2开关 + private byte onoff2; + /*********定时器编号(4字节)灯1对应定时器1-2,灯2对应定时器3-4.....**********/ + //定时器1编号 + private byte timer_number1; + //定时器2编号 + private byte timer_number2; + //定时器3编号 + private byte timer_number3; + //定时器4编号 + private byte timer_number4; + /*********定时器开关(4字节)**********/ + //定时器1开关 + private byte timer_onoff1; + //定时器2开关 + private byte timer_onoff2; + //定时器3开关 + private byte timer_onoff3; + //定时器4开关 + private byte timer_onoff4; + /*********定时器时间(24字节)**********/ + //定时器1时间 + private byte[] timer_time1 = new byte[4]; + //定时器2时间 + private byte[] timer_time2 = new byte[4]; + //定时器3时间 + private byte[] timer_time3 = new byte[4]; + //定时器4时间 + private byte[] timer_time4 = new byte[4]; + //温度 + private short wendu; + //ph + private short ph_value; + //背光亮度 + private byte lightness; + //柜灯 + private byte sarkLamp; + //报警开关,0关,1开 + private byte warn_onoff; + //最低报警温度 + private short low_wendu; + //最高报警温度 + private short high_wendu; + + public short getWendu() { + return wendu; + } + public void setWendu(short wendu) { + this.wendu = wendu; + } + public byte getWork_model() { + return work_model; + } + public void setWork_model(byte work_model) { + this.work_model = work_model; + } + public byte getNumber1() { + return number1; + } + public void setNumber1(byte number1) { + this.number1 = number1; + } + public byte getOnoff1() { + return onoff1; + } + public void setOnoff1(byte onoff1) { + this.onoff1 = onoff1; + } + public byte getNumber2() { + return number2; + } + public void setNumber2(byte number2) { + this.number2 = number2; + } + public byte getOnoff2() { + return onoff2; + } + public void setOnoff2(byte onoff2) { + this.onoff2 = onoff2; + } + public byte getTimer_number1() { + return timer_number1; + } + public void setTimer_number1(byte timer_number1) { + this.timer_number1 = timer_number1; + } + public byte getTimer_number2() { + return timer_number2; + } + public void setTimer_number2(byte timer_number2) { + this.timer_number2 = timer_number2; + } + public byte getTimer_number3() { + return timer_number3; + } + public void setTimer_number3(byte timer_number3) { + this.timer_number3 = timer_number3; + } + public byte getTimer_number4() { + return timer_number4; + } + public void setTimer_number4(byte timer_number4) { + this.timer_number4 = timer_number4; + } + public byte[] getTimer_time1() { + return timer_time1; + } + public void setTimer_time1(byte[] timer_time1) { + this.timer_time1 = timer_time1; + } + public byte[] getTimer_time2() { + return timer_time2; + } + public void setTimer_time2(byte[] timer_time2) { + this.timer_time2 = timer_time2; + } + public byte[] getTimer_time3() { + return timer_time3; + } + public void setTimer_time3(byte[] timer_time3) { + this.timer_time3 = timer_time3; + } + public byte[] getTimer_time4() { + return timer_time4; + } + public void setTimer_time4(byte[] timer_time4) { + this.timer_time4 = timer_time4; + } + public short getPh_value() { + return ph_value; + } + public void setPh_value(short ph_value) { + this.ph_value = ph_value; + } + public byte getLightness() { + return lightness; + } + public void setLightness(byte lightness) { + this.lightness = lightness; + } + public byte getSarkLamp() { + return sarkLamp; + } + public void setSarkLamp(byte sarkLamp) { + this.sarkLamp = sarkLamp; + } + public byte getWarn_onoff() { + return warn_onoff; + } + public void setWarn_onoff(byte warn_onoff) { + this.warn_onoff = warn_onoff; + } + public short getLow_wendu() { + return low_wendu; + } + public void setLow_wendu(short low_wendu) { + this.low_wendu = low_wendu; + } + public short getHigh_wendu() { + return high_wendu; + } + public void setHigh_wendu(short high_wendu) { + this.high_wendu = high_wendu; + } + public byte getTimer_onoff1() { + return timer_onoff1; + } + public void setTimer_onoff1(byte timer_onoff1) { + this.timer_onoff1 = timer_onoff1; + } + public byte getTimer_onoff2() { + return timer_onoff2; + } + public void setTimer_onoff2(byte timer_onoff2) { + this.timer_onoff2 = timer_onoff2; + } + public byte getTimer_onoff3() { + return timer_onoff3; + } + public void setTimer_onoff3(byte timer_onoff3) { + this.timer_onoff3 = timer_onoff3; + } + public byte getTimer_onoff4() { + return timer_onoff4; + } + public void setTimer_onoff4(byte timer_onoff4) { + this.timer_onoff4 = timer_onoff4; + } + +} diff --git a/src/main/java/com/ifish/socketNew/model/receive/BackBytes71.java b/src/main/java/com/ifish/socketNew/model/receive/BackBytes71.java new file mode 100644 index 0000000..69e9ec3 --- /dev/null +++ b/src/main/java/com/ifish/socketNew/model/receive/BackBytes71.java @@ -0,0 +1,277 @@ +package com.ifish.socketNew.model.receive; + +import java.io.Serializable; + +import com.ifish.socketNew.model.HeadModel; + +/** + * 查询反馈信息71字节(15字节协议头+56字节结果) + * @author guogw + * + */ +public class BackBytes71 extends HeadModel implements Serializable { + + private static final long serialVersionUID = 2740442296642889777L; + //工作模式 + private byte work_model; + /*********灯和开关(6字节)**********/ + //灯编号1 + private byte number1; + //灯编号2 + private byte number2; + //灯编号3 + private byte number3; + //灯1开关 + private byte onoff1; + //灯2开关 + private byte onoff2; + //灯3开关 + private byte onoff3; + /*********定时器编号(6字节)灯1对应定时器1-2,灯2对应定时器3-4,灯3对应定时器5-6.....**********/ + //定时器1编号 + private byte timer_number1; + //定时器2编号 + private byte timer_number2; + //定时器3编号 + private byte timer_number3; + //定时器4编号 + private byte timer_number4; + //定时器5编号 + private byte timer_number5; + //定时器6编号 + private byte timer_number6; + /*********定时器开关(6字节)**********/ + //定时器1开关 + private byte timer_onoff1; + //定时器2开关 + private byte timer_onoff2; + //定时器3开关 + private byte timer_onoff3; + //定时器4开关 + private byte timer_onoff4; + //定时器5开关 + private byte timer_onoff5; + //定时器6开关 + private byte timer_onoff6; + /*********定时器时间(24字节)**********/ + //定时器1时间 + private byte[] timer_time1 = new byte[4]; + //定时器2时间 + private byte[] timer_time2 = new byte[4]; + //定时器3时间 + private byte[] timer_time3 = new byte[4]; + //定时器4时间 + private byte[] timer_time4 = new byte[4]; + //定时器5时间 + private byte[] timer_time5 = new byte[4]; + //定时器6时间 + private byte[] timer_time6 = new byte[4]; + //温度 + private short wendu; + //ph + private short ph_value; + //背光亮度 + private byte lightness; + //柜灯 + private byte sarkLamp; + //报警开关,0关,1开 + private byte warn_onoff; + //最低报警温度 + private short low_wendu; + //最高报警温度 + private short high_wendu; + + public short getWendu() { + return wendu; + } + public void setWendu(short wendu) { + this.wendu = wendu; + } + public byte getWork_model() { + return work_model; + } + public void setWork_model(byte work_model) { + this.work_model = work_model; + } + public byte getNumber1() { + return number1; + } + public void setNumber1(byte number1) { + this.number1 = number1; + } + public byte getOnoff1() { + return onoff1; + } + public void setOnoff1(byte onoff1) { + this.onoff1 = onoff1; + } + public byte getNumber2() { + return number2; + } + public void setNumber2(byte number2) { + this.number2 = number2; + } + public byte getOnoff2() { + return onoff2; + } + public void setOnoff2(byte onoff2) { + this.onoff2 = onoff2; + } + public byte getNumber3() { + return number3; + } + public void setNumber3(byte number3) { + this.number3 = number3; + } + public byte getOnoff3() { + return onoff3; + } + public void setOnoff3(byte onoff3) { + this.onoff3 = onoff3; + } + public byte getTimer_number1() { + return timer_number1; + } + public void setTimer_number1(byte timer_number1) { + this.timer_number1 = timer_number1; + } + public byte getTimer_number2() { + return timer_number2; + } + public void setTimer_number2(byte timer_number2) { + this.timer_number2 = timer_number2; + } + public byte getTimer_number3() { + return timer_number3; + } + public void setTimer_number3(byte timer_number3) { + this.timer_number3 = timer_number3; + } + public byte getTimer_number4() { + return timer_number4; + } + public void setTimer_number4(byte timer_number4) { + this.timer_number4 = timer_number4; + } + public byte getTimer_number5() { + return timer_number5; + } + public void setTimer_number5(byte timer_number5) { + this.timer_number5 = timer_number5; + } + public byte getTimer_number6() { + return timer_number6; + } + public void setTimer_number6(byte timer_number6) { + this.timer_number6 = timer_number6; + } + public byte[] getTimer_time1() { + return timer_time1; + } + public void setTimer_time1(byte[] timer_time1) { + this.timer_time1 = timer_time1; + } + public byte[] getTimer_time2() { + return timer_time2; + } + public void setTimer_time2(byte[] timer_time2) { + this.timer_time2 = timer_time2; + } + public byte[] getTimer_time3() { + return timer_time3; + } + public void setTimer_time3(byte[] timer_time3) { + this.timer_time3 = timer_time3; + } + public byte[] getTimer_time4() { + return timer_time4; + } + public void setTimer_time4(byte[] timer_time4) { + this.timer_time4 = timer_time4; + } + public byte[] getTimer_time5() { + return timer_time5; + } + public void setTimer_time5(byte[] timer_time5) { + this.timer_time5 = timer_time5; + } + public byte[] getTimer_time6() { + return timer_time6; + } + public void setTimer_time6(byte[] timer_time6) { + this.timer_time6 = timer_time6; + } + public short getPh_value() { + return ph_value; + } + public void setPh_value(short ph_value) { + this.ph_value = ph_value; + } + public byte getLightness() { + return lightness; + } + public void setLightness(byte lightness) { + this.lightness = lightness; + } + public byte getSarkLamp() { + return sarkLamp; + } + public void setSarkLamp(byte sarkLamp) { + this.sarkLamp = sarkLamp; + } + public byte getWarn_onoff() { + return warn_onoff; + } + public void setWarn_onoff(byte warn_onoff) { + this.warn_onoff = warn_onoff; + } + public short getLow_wendu() { + return low_wendu; + } + public void setLow_wendu(short low_wendu) { + this.low_wendu = low_wendu; + } + public short getHigh_wendu() { + return high_wendu; + } + public void setHigh_wendu(short high_wendu) { + this.high_wendu = high_wendu; + } + public byte getTimer_onoff1() { + return timer_onoff1; + } + public void setTimer_onoff1(byte timer_onoff1) { + this.timer_onoff1 = timer_onoff1; + } + public byte getTimer_onoff2() { + return timer_onoff2; + } + public void setTimer_onoff2(byte timer_onoff2) { + this.timer_onoff2 = timer_onoff2; + } + public byte getTimer_onoff3() { + return timer_onoff3; + } + public void setTimer_onoff3(byte timer_onoff3) { + this.timer_onoff3 = timer_onoff3; + } + public byte getTimer_onoff4() { + return timer_onoff4; + } + public void setTimer_onoff4(byte timer_onoff4) { + this.timer_onoff4 = timer_onoff4; + } + public byte getTimer_onoff5() { + return timer_onoff5; + } + public void setTimer_onoff5(byte timer_onoff5) { + this.timer_onoff5 = timer_onoff5; + } + public byte getTimer_onoff6() { + return timer_onoff6; + } + public void setTimer_onoff6(byte timer_onoff6) { + this.timer_onoff6 = timer_onoff6; + } + +} diff --git a/src/main/java/com/ifish/socketNew/model/receive/BackBytes73.java b/src/main/java/com/ifish/socketNew/model/receive/BackBytes73.java new file mode 100644 index 0000000..a00695e --- /dev/null +++ b/src/main/java/com/ifish/socketNew/model/receive/BackBytes73.java @@ -0,0 +1,300 @@ +package com.ifish.socketNew.model.receive; + +import java.io.Serializable; + +import com.ifish.socketNew.model.HeadModel; + +/** + * 查询反馈信息73字节(15字节协议头+58字节结果) + * @author guogw + * + */ +public class BackBytes73 extends HeadModel implements Serializable { + + private static final long serialVersionUID = -279167235456861496L; + /*********灯和开关(10字节)**********/ + //灯编号1 + private byte number1; + //灯编号2 + private byte number2; + //灯编号3 + private byte number3; + //灯编号4 + private byte number4; + //灯编号5 + private byte number5; + //灯1开关 + private byte onoff1; + //灯2开关 + private byte onoff2; + //灯3开关 + private byte onoff3; + //灯4开关 + private byte onoff4; + //灯5开关 + private byte onoff5; + /*********定时器编号(6字节)灯1对应定时器1-2,灯2对应定时器3-4,灯3对应定时器5-6.....**********/ + //定时器1编号 + private byte timer_number1; + //定时器2编号 + private byte timer_number2; + //定时器3编号 + private byte timer_number3; + //定时器4编号 + private byte timer_number4; + //定时器5编号 + private byte timer_number5; + //定时器6编号 + private byte timer_number6; + /*********定时器开关(6字节)**********/ + //定时器1开关 + private byte timer_onoff1; + //定时器2开关 + private byte timer_onoff2; + //定时器3开关 + private byte timer_onoff3; + //定时器4开关 + private byte timer_onoff4; + //定时器5开关 + private byte timer_onoff5; + //定时器6开关 + private byte timer_onoff6; + /*********定时器时间(24字节)**********/ + //定时器1时间 + private byte[] timer_time1 = new byte[4]; + //定时器2时间 + private byte[] timer_time2 = new byte[4]; + //定时器3时间 + private byte[] timer_time3 = new byte[4]; + //定时器4时间 + private byte[] timer_time4 = new byte[4]; + //定时器5时间 + private byte[] timer_time5 = new byte[4]; + //定时器6时间 + private byte[] timer_time6 = new byte[4]; + //温度 + private short wendu; + //加热温度 + private short heatWendu; + //加热状态 + private byte heatStatus; + //柜灯 + private byte sarkLamp; + //报警开关,0关,1开 + private byte warn_onoff; + //最低报警温度 + private short low_wendu; + //最高报警温度 + private short high_wendu; + + public byte getNumber1() { + return number1; + } + public void setNumber1(byte number1) { + this.number1 = number1; + } + public byte getNumber2() { + return number2; + } + public void setNumber2(byte number2) { + this.number2 = number2; + } + public byte getNumber3() { + return number3; + } + public void setNumber3(byte number3) { + this.number3 = number3; + } + public byte getNumber4() { + return number4; + } + public void setNumber4(byte number4) { + this.number4 = number4; + } + public byte getNumber5() { + return number5; + } + public void setNumber5(byte number5) { + this.number5 = number5; + } + public byte getOnoff1() { + return onoff1; + } + public void setOnoff1(byte onoff1) { + this.onoff1 = onoff1; + } + public byte getOnoff2() { + return onoff2; + } + public void setOnoff2(byte onoff2) { + this.onoff2 = onoff2; + } + public byte getOnoff3() { + return onoff3; + } + public void setOnoff3(byte onoff3) { + this.onoff3 = onoff3; + } + public byte getOnoff4() { + return onoff4; + } + public void setOnoff4(byte onoff4) { + this.onoff4 = onoff4; + } + public byte getOnoff5() { + return onoff5; + } + public void setOnoff5(byte onoff5) { + this.onoff5 = onoff5; + } + public byte getTimer_number1() { + return timer_number1; + } + public void setTimer_number1(byte timer_number1) { + this.timer_number1 = timer_number1; + } + public byte getTimer_number2() { + return timer_number2; + } + public void setTimer_number2(byte timer_number2) { + this.timer_number2 = timer_number2; + } + public byte getTimer_number3() { + return timer_number3; + } + public void setTimer_number3(byte timer_number3) { + this.timer_number3 = timer_number3; + } + public byte getTimer_number4() { + return timer_number4; + } + public void setTimer_number4(byte timer_number4) { + this.timer_number4 = timer_number4; + } + public byte getTimer_number5() { + return timer_number5; + } + public void setTimer_number5(byte timer_number5) { + this.timer_number5 = timer_number5; + } + public byte getTimer_number6() { + return timer_number6; + } + public void setTimer_number6(byte timer_number6) { + this.timer_number6 = timer_number6; + } + public byte getTimer_onoff1() { + return timer_onoff1; + } + public void setTimer_onoff1(byte timer_onoff1) { + this.timer_onoff1 = timer_onoff1; + } + public byte getTimer_onoff2() { + return timer_onoff2; + } + public void setTimer_onoff2(byte timer_onoff2) { + this.timer_onoff2 = timer_onoff2; + } + public byte getTimer_onoff3() { + return timer_onoff3; + } + public void setTimer_onoff3(byte timer_onoff3) { + this.timer_onoff3 = timer_onoff3; + } + public byte getTimer_onoff4() { + return timer_onoff4; + } + public void setTimer_onoff4(byte timer_onoff4) { + this.timer_onoff4 = timer_onoff4; + } + public byte getTimer_onoff5() { + return timer_onoff5; + } + public void setTimer_onoff5(byte timer_onoff5) { + this.timer_onoff5 = timer_onoff5; + } + public byte getTimer_onoff6() { + return timer_onoff6; + } + public void setTimer_onoff6(byte timer_onoff6) { + this.timer_onoff6 = timer_onoff6; + } + public byte[] getTimer_time1() { + return timer_time1; + } + public void setTimer_time1(byte[] timer_time1) { + this.timer_time1 = timer_time1; + } + public byte[] getTimer_time2() { + return timer_time2; + } + public void setTimer_time2(byte[] timer_time2) { + this.timer_time2 = timer_time2; + } + public byte[] getTimer_time3() { + return timer_time3; + } + public void setTimer_time3(byte[] timer_time3) { + this.timer_time3 = timer_time3; + } + public byte[] getTimer_time4() { + return timer_time4; + } + public void setTimer_time4(byte[] timer_time4) { + this.timer_time4 = timer_time4; + } + public byte[] getTimer_time5() { + return timer_time5; + } + public void setTimer_time5(byte[] timer_time5) { + this.timer_time5 = timer_time5; + } + public byte[] getTimer_time6() { + return timer_time6; + } + public void setTimer_time6(byte[] timer_time6) { + this.timer_time6 = timer_time6; + } + public short getWendu() { + return wendu; + } + public void setWendu(short wendu) { + this.wendu = wendu; + } + public short getHeatWendu() { + return heatWendu; + } + public void setHeatWendu(short heatWendu) { + this.heatWendu = heatWendu; + } + public byte getHeatStatus() { + return heatStatus; + } + public void setHeatStatus(byte heatStatus) { + this.heatStatus = heatStatus; + } + public byte getSarkLamp() { + return sarkLamp; + } + public void setSarkLamp(byte sarkLamp) { + this.sarkLamp = sarkLamp; + } + public byte getWarn_onoff() { + return warn_onoff; + } + public void setWarn_onoff(byte warn_onoff) { + this.warn_onoff = warn_onoff; + } + public short getLow_wendu() { + return low_wendu; + } + public void setLow_wendu(short low_wendu) { + this.low_wendu = low_wendu; + } + public short getHigh_wendu() { + return high_wendu; + } + public void setHigh_wendu(short high_wendu) { + this.high_wendu = high_wendu; + } +} diff --git a/src/main/java/com/ifish/socketNew/model/receive/BackBytes84.java b/src/main/java/com/ifish/socketNew/model/receive/BackBytes84.java new file mode 100644 index 0000000..5bc4e17 --- /dev/null +++ b/src/main/java/com/ifish/socketNew/model/receive/BackBytes84.java @@ -0,0 +1,657 @@ +/* + * 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.socketNew.model.receive; + +import com.ifish.socketNew.model.HeadModel; +import java.io.Serializable; + +/** + * + * @author Administrator + */ +public class BackBytes84 extends HeadModel implements Serializable { + + private static final long serialVersionUID = 2740442296642889778L; + + /** + * *******灯和开关(4字节)********* + */ + //灯编号1 + private byte number1; + //灯编号2 + private byte number2; + //灯编号3 + private byte number3; + //灯编号4 + private byte number4; + //灯1开关 + private byte onoff1; + //灯2开关 + private byte onoff2; + //灯3开关 + private byte onoff3; + //灯4开关 + private byte onoff4; + + /** + * *******定时器编号(4字节)灯1对应定时器1-2,灯2对应定时器3-4.....********* + */ + //定时器1编号 + private byte timer_number1; + //定时器2编号 + private byte timer_number2; + //定时器3编号 + private byte timer_number3; + //定时器4编号 + private byte timer_number4; + //定时器5编号 + private byte timer_number5; + //定时器6编号 + private byte timer_number6; + //定时器7编号 + private byte timer_number7; + //定时器8编号 + private byte timer_number8; + /** + * *******定时器开关(4字节)********* + */ + //定时器1开关 + private byte timer_onoff1; + //定时器2开关 + private byte timer_onoff2; + //定时器3开关 + private byte timer_onoff3; + //定时器4开关 + private byte timer_onoff4; + //定时器5开关 + private byte timer_onoff5; + //定时器6开关 + private byte timer_onoff6; + //定时器7开关 + private byte timer_onoff7; + //定时器8开关 + private byte timer_onoff8; + /** + * *******定时器时间(24字节)********* + */ + //定时器1时间 + private byte[] timer_time1 = new byte[4]; + //定时器2时间 + private byte[] timer_time2 = new byte[4]; + //定时器3时间 + private byte[] timer_time3 = new byte[4]; + //定时器4时间 + private byte[] timer_time4 = new byte[4]; + //定时器5时间 + private byte[] timer_time5 = new byte[4]; + //定时器6时间 + private byte[] timer_time6 = new byte[4]; + //定时器7时间 + private byte[] timer_time7 = new byte[4]; + //定时器8时间 + private byte[] timer_time8 = new byte[4]; + //温度 + private short wendu; + //加热温度 + private short heatWendu; + //加热状态 + private byte heatStatus; + //柜灯 + private byte sarkLamp; + //报警开关,0关,1开 + private byte warn_onoff; + //最低报警温度 + private short low_wendu; + //最高报警温度 + private short high_wendu; + + /** + * @return the number1 + */ + public byte getNumber1() { + return number1; + } + + /** + * @param number1 the number1 to set + */ + public void setNumber1(byte number1) { + this.number1 = number1; + } + + /** + * @return the number2 + */ + public byte getNumber2() { + return number2; + } + + /** + * @param number2 the number2 to set + */ + public void setNumber2(byte number2) { + this.number2 = number2; + } + + /** + * @return the number3 + */ + public byte getNumber3() { + return number3; + } + + /** + * @param number3 the number3 to set + */ + public void setNumber3(byte number3) { + this.number3 = number3; + } + + /** + * @return the number4 + */ + public byte getNumber4() { + return number4; + } + + /** + * @param number4 the number4 to set + */ + public void setNumber4(byte number4) { + this.number4 = number4; + } + + /** + * @return the onoff1 + */ + public byte getOnoff1() { + return onoff1; + } + + /** + * @param onoff1 the onoff1 to set + */ + public void setOnoff1(byte onoff1) { + this.onoff1 = onoff1; + } + + /** + * @return the onoff2 + */ + public byte getOnoff2() { + return onoff2; + } + + /** + * @param onoff2 the onoff2 to set + */ + public void setOnoff2(byte onoff2) { + this.onoff2 = onoff2; + } + + /** + * @return the onoff3 + */ + public byte getOnoff3() { + return onoff3; + } + + /** + * @param onoff3 the onoff3 to set + */ + public void setOnoff3(byte onoff3) { + this.onoff3 = onoff3; + } + + /** + * @return the onoff4 + */ + public byte getOnoff4() { + return onoff4; + } + + /** + * @param onoff4 the onoff4 to set + */ + public void setOnoff4(byte onoff4) { + this.onoff4 = onoff4; + } + + /** + * @return the timer_number1 + */ + public byte getTimer_number1() { + return timer_number1; + } + + /** + * @param timer_number1 the timer_number1 to set + */ + public void setTimer_number1(byte timer_number1) { + this.timer_number1 = timer_number1; + } + + /** + * @return the timer_number2 + */ + public byte getTimer_number2() { + return timer_number2; + } + + /** + * @param timer_number2 the timer_number2 to set + */ + public void setTimer_number2(byte timer_number2) { + this.timer_number2 = timer_number2; + } + + /** + * @return the timer_number3 + */ + public byte getTimer_number3() { + return timer_number3; + } + + /** + * @param timer_number3 the timer_number3 to set + */ + public void setTimer_number3(byte timer_number3) { + this.timer_number3 = timer_number3; + } + + /** + * @return the timer_number4 + */ + public byte getTimer_number4() { + return timer_number4; + } + + /** + * @param timer_number4 the timer_number4 to set + */ + public void setTimer_number4(byte timer_number4) { + this.timer_number4 = timer_number4; + } + + /** + * @return the timer_number5 + */ + public byte getTimer_number5() { + return timer_number5; + } + + /** + * @param timer_number5 the timer_number5 to set + */ + public void setTimer_number5(byte timer_number5) { + this.timer_number5 = timer_number5; + } + + /** + * @return the timer_number6 + */ + public byte getTimer_number6() { + return timer_number6; + } + + /** + * @param timer_number6 the timer_number6 to set + */ + public void setTimer_number6(byte timer_number6) { + this.timer_number6 = timer_number6; + } + + /** + * @return the timer_number7 + */ + public byte getTimer_number7() { + return timer_number7; + } + + /** + * @param timer_number7 the timer_number7 to set + */ + public void setTimer_number7(byte timer_number7) { + this.timer_number7 = timer_number7; + } + + /** + * @return the timer_number8 + */ + public byte getTimer_number8() { + return timer_number8; + } + + /** + * @param timer_number8 the timer_number8 to set + */ + public void setTimer_number8(byte timer_number8) { + this.timer_number8 = timer_number8; + } + + /** + * @return the timer_onoff1 + */ + public byte getTimer_onoff1() { + return timer_onoff1; + } + + /** + * @param timer_onoff1 the timer_onoff1 to set + */ + public void setTimer_onoff1(byte timer_onoff1) { + this.timer_onoff1 = timer_onoff1; + } + + /** + * @return the timer_onoff2 + */ + public byte getTimer_onoff2() { + return timer_onoff2; + } + + /** + * @param timer_onoff2 the timer_onoff2 to set + */ + public void setTimer_onoff2(byte timer_onoff2) { + this.timer_onoff2 = timer_onoff2; + } + + /** + * @return the timer_onoff3 + */ + public byte getTimer_onoff3() { + return timer_onoff3; + } + + /** + * @param timer_onoff3 the timer_onoff3 to set + */ + public void setTimer_onoff3(byte timer_onoff3) { + this.timer_onoff3 = timer_onoff3; + } + + /** + * @return the timer_onoff4 + */ + public byte getTimer_onoff4() { + return timer_onoff4; + } + + /** + * @param timer_onoff4 the timer_onoff4 to set + */ + public void setTimer_onoff4(byte timer_onoff4) { + this.timer_onoff4 = timer_onoff4; + } + + /** + * @return the timer_onoff5 + */ + public byte getTimer_onoff5() { + return timer_onoff5; + } + + /** + * @param timer_onoff5 the timer_onoff5 to set + */ + public void setTimer_onoff5(byte timer_onoff5) { + this.timer_onoff5 = timer_onoff5; + } + + /** + * @return the timer_onoff6 + */ + public byte getTimer_onoff6() { + return timer_onoff6; + } + + /** + * @param timer_onoff6 the timer_onoff6 to set + */ + public void setTimer_onoff6(byte timer_onoff6) { + this.timer_onoff6 = timer_onoff6; + } + + /** + * @return the timer_onoff7 + */ + public byte getTimer_onoff7() { + return timer_onoff7; + } + + /** + * @param timer_onoff7 the timer_onoff7 to set + */ + public void setTimer_onoff7(byte timer_onoff7) { + this.timer_onoff7 = timer_onoff7; + } + + /** + * @return the timer_onoff8 + */ + public byte getTimer_onoff8() { + return timer_onoff8; + } + + /** + * @param timer_onoff8 the timer_onoff8 to set + */ + public void setTimer_onoff8(byte timer_onoff8) { + this.timer_onoff8 = timer_onoff8; + } + + /** + * @return the timer_time1 + */ + public byte[] getTimer_time1() { + return timer_time1; + } + + /** + * @param timer_time1 the timer_time1 to set + */ + public void setTimer_time1(byte[] timer_time1) { + this.timer_time1 = timer_time1; + } + + /** + * @return the timer_time2 + */ + public byte[] getTimer_time2() { + return timer_time2; + } + + /** + * @param timer_time2 the timer_time2 to set + */ + public void setTimer_time2(byte[] timer_time2) { + this.timer_time2 = timer_time2; + } + + /** + * @return the timer_time3 + */ + public byte[] getTimer_time3() { + return timer_time3; + } + + /** + * @param timer_time3 the timer_time3 to set + */ + public void setTimer_time3(byte[] timer_time3) { + this.timer_time3 = timer_time3; + } + + /** + * @return the timer_time4 + */ + public byte[] getTimer_time4() { + return timer_time4; + } + + /** + * @param timer_time4 the timer_time4 to set + */ + public void setTimer_time4(byte[] timer_time4) { + this.timer_time4 = timer_time4; + } + + /** + * @return the timer_time5 + */ + public byte[] getTimer_time5() { + return timer_time5; + } + + /** + * @param timer_time5 the timer_time5 to set + */ + public void setTimer_time5(byte[] timer_time5) { + this.timer_time5 = timer_time5; + } + + /** + * @return the timer_time6 + */ + public byte[] getTimer_time6() { + return timer_time6; + } + + /** + * @param timer_time6 the timer_time6 to set + */ + public void setTimer_time6(byte[] timer_time6) { + this.timer_time6 = timer_time6; + } + + /** + * @return the timer_time7 + */ + public byte[] getTimer_time7() { + return timer_time7; + } + + /** + * @param timer_time7 the timer_time7 to set + */ + public void setTimer_time7(byte[] timer_time7) { + this.timer_time7 = timer_time7; + } + + /** + * @return the timer_time8 + */ + public byte[] getTimer_time8() { + return timer_time8; + } + + /** + * @param timer_time8 the timer_time8 to set + */ + public void setTimer_time8(byte[] timer_time8) { + this.timer_time8 = timer_time8; + } + + /** + * @return the wendu + */ + public short getWendu() { + return wendu; + } + + /** + * @param wendu the wendu to set + */ + public void setWendu(short wendu) { + this.wendu = wendu; + } + + /** + * @return the heatWendu + */ + public short getHeatWendu() { + return heatWendu; + } + + /** + * @param heatWendu the heatWendu to set + */ + public void setHeatWendu(short heatWendu) { + this.heatWendu = heatWendu; + } + + /** + * @return the heatStatus + */ + public byte getHeatStatus() { + return heatStatus; + } + + /** + * @param heatStatus the heatStatus to set + */ + public void setHeatStatus(byte heatStatus) { + this.heatStatus = heatStatus; + } + + /** + * @return the sarkLamp + */ + public byte getSarkLamp() { + return sarkLamp; + } + + /** + * @param sarkLamp the sarkLamp to set + */ + public void setSarkLamp(byte sarkLamp) { + this.sarkLamp = sarkLamp; + } + + /** + * @return the warn_onoff + */ + public byte getWarn_onoff() { + return warn_onoff; + } + + /** + * @param warn_onoff the warn_onoff to set + */ + public void setWarn_onoff(byte warn_onoff) { + this.warn_onoff = warn_onoff; + } + + /** + * @return the low_wendu + */ + public short getLow_wendu() { + return low_wendu; + } + + /** + * @param low_wendu the low_wendu to set + */ + public void setLow_wendu(short low_wendu) { + this.low_wendu = low_wendu; + } + + /** + * @return the high_wendu + */ + public short getHigh_wendu() { + return high_wendu; + } + + /** + * @param high_wendu the high_wendu to set + */ + public void setHigh_wendu(short high_wendu) { + this.high_wendu = high_wendu; + } + +} diff --git a/src/main/java/com/ifish/socketNew/model/receive/BackBytes85.java b/src/main/java/com/ifish/socketNew/model/receive/BackBytes85.java new file mode 100644 index 0000000..0260c36 --- /dev/null +++ b/src/main/java/com/ifish/socketNew/model/receive/BackBytes85.java @@ -0,0 +1,341 @@ +package com.ifish.socketNew.model.receive; + +import java.io.Serializable; + +import com.ifish.socketNew.model.HeadModel; + +/** + * 查询反馈信息71字节(15字节协议头+56字节结果) + * @author guogw + * + */ +public class BackBytes85 extends HeadModel implements Serializable { + + private static final long serialVersionUID = 2740442296642889777L; + //工作模式 + private byte work_model; + /*********灯和开关(8字节)**********/ + //灯编号1 + private byte number1; + //灯编号2 + private byte number2; + //灯编号3 + private byte number3; + //灯编号4 + private byte number4; + //灯1开关 + private byte onoff1; + //灯2开关 + private byte onoff2; + //灯3开关 + private byte onoff3; + //灯3开关 + private byte onoff4; + /*********定时器编号(6字节)灯1对应定时器1-2,灯2对应定时器3-4,灯3对应定时器5-6.....**********/ + //定时器1编号 + private byte timer_number1; + //定时器2编号 + private byte timer_number2; + //定时器3编号 + private byte timer_number3; + //定时器4编号 + private byte timer_number4; + //定时器5编号 + private byte timer_number5; + //定时器6编号 + private byte timer_number6; + //定时器7编号 + private byte timer_number7; + //定时器8编号 + private byte timer_number8; + /*********定时器开关(6字节)**********/ + //定时器1开关 + private byte timer_onoff1; + //定时器2开关 + private byte timer_onoff2; + //定时器3开关 + private byte timer_onoff3; + //定时器4开关 + private byte timer_onoff4; + //定时器5开关 + private byte timer_onoff5; + //定时器6开关 + private byte timer_onoff6; + //定时器7开关 + private byte timer_onoff7; + //定时器8开关 + private byte timer_onoff8; + /*********定时器时间(24字节)**********/ + //定时器1时间 + private byte[] timer_time1 = new byte[4]; + //定时器2时间 + private byte[] timer_time2 = new byte[4]; + //定时器3时间 + private byte[] timer_time3 = new byte[4]; + //定时器4时间 + private byte[] timer_time4 = new byte[4]; + //定时器5时间 + private byte[] timer_time5 = new byte[4]; + //定时器6时间 + private byte[] timer_time6 = new byte[4]; + //定时器7时间 + private byte[] timer_time7 = new byte[4]; + //定时器8时间 + private byte[] timer_time8 = new byte[4]; + //温度 + private short wendu; + //ph + private short ph_value; + //背光亮度 + private byte lightness; + //柜灯 + private byte sarkLamp; + //报警开关,0关,1开 + private byte warn_onoff; + //最低报警温度 + private short low_wendu; + //最高报警温度 + private short high_wendu; + + public short getWendu() { + return wendu; + } + public void setWendu(short wendu) { + this.wendu = wendu; + } + public byte getWork_model() { + return work_model; + } + public void setWork_model(byte work_model) { + this.work_model = work_model; + } + public byte getNumber1() { + return number1; + } + public void setNumber1(byte number1) { + this.number1 = number1; + } + public byte getOnoff1() { + return onoff1; + } + public void setOnoff1(byte onoff1) { + this.onoff1 = onoff1; + } + public byte getNumber2() { + return number2; + } + public void setNumber2(byte number2) { + this.number2 = number2; + } + public byte getOnoff2() { + return onoff2; + } + public void setOnoff2(byte onoff2) { + this.onoff2 = onoff2; + } + public byte getNumber3() { + return number3; + } + public void setNumber3(byte number3) { + this.number3 = number3; + } + public byte getOnoff3() { + return onoff3; + } + public void setOnoff3(byte onoff3) { + this.onoff3 = onoff3; + } + public byte getTimer_number1() { + return timer_number1; + } + public void setTimer_number1(byte timer_number1) { + this.timer_number1 = timer_number1; + } + public byte getTimer_number2() { + return timer_number2; + } + public void setTimer_number2(byte timer_number2) { + this.timer_number2 = timer_number2; + } + public byte getTimer_number3() { + return timer_number3; + } + public void setTimer_number3(byte timer_number3) { + this.timer_number3 = timer_number3; + } + public byte getTimer_number4() { + return timer_number4; + } + public void setTimer_number4(byte timer_number4) { + this.timer_number4 = timer_number4; + } + public byte getTimer_number5() { + return timer_number5; + } + public void setTimer_number5(byte timer_number5) { + this.timer_number5 = timer_number5; + } + public byte getTimer_number6() { + return timer_number6; + } + public void setTimer_number6(byte timer_number6) { + this.timer_number6 = timer_number6; + } + public byte[] getTimer_time1() { + return timer_time1; + } + public void setTimer_time1(byte[] timer_time1) { + this.timer_time1 = timer_time1; + } + public byte[] getTimer_time2() { + return timer_time2; + } + public void setTimer_time2(byte[] timer_time2) { + this.timer_time2 = timer_time2; + } + public byte[] getTimer_time3() { + return timer_time3; + } + public void setTimer_time3(byte[] timer_time3) { + this.timer_time3 = timer_time3; + } + public byte[] getTimer_time4() { + return timer_time4; + } + public void setTimer_time4(byte[] timer_time4) { + this.timer_time4 = timer_time4; + } + public byte[] getTimer_time5() { + return timer_time5; + } + public void setTimer_time5(byte[] timer_time5) { + this.timer_time5 = timer_time5; + } + public byte[] getTimer_time6() { + return timer_time6; + } + public void setTimer_time6(byte[] timer_time6) { + this.timer_time6 = timer_time6; + } + public short getPh_value() { + return ph_value; + } + public void setPh_value(short ph_value) { + this.ph_value = ph_value; + } + public byte getLightness() { + return lightness; + } + public void setLightness(byte lightness) { + this.lightness = lightness; + } + public byte getSarkLamp() { + return sarkLamp; + } + public void setSarkLamp(byte sarkLamp) { + this.sarkLamp = sarkLamp; + } + public byte getWarn_onoff() { + return warn_onoff; + } + public void setWarn_onoff(byte warn_onoff) { + this.warn_onoff = warn_onoff; + } + public short getLow_wendu() { + return low_wendu; + } + public void setLow_wendu(short low_wendu) { + this.low_wendu = low_wendu; + } + public short getHigh_wendu() { + return high_wendu; + } + public void setHigh_wendu(short high_wendu) { + this.high_wendu = high_wendu; + } + public byte getTimer_onoff1() { + return timer_onoff1; + } + public void setTimer_onoff1(byte timer_onoff1) { + this.timer_onoff1 = timer_onoff1; + } + public byte getTimer_onoff2() { + return timer_onoff2; + } + public void setTimer_onoff2(byte timer_onoff2) { + this.timer_onoff2 = timer_onoff2; + } + public byte getTimer_onoff3() { + return timer_onoff3; + } + public void setTimer_onoff3(byte timer_onoff3) { + this.timer_onoff3 = timer_onoff3; + } + public byte getTimer_onoff4() { + return timer_onoff4; + } + public void setTimer_onoff4(byte timer_onoff4) { + this.timer_onoff4 = timer_onoff4; + } + public byte getTimer_onoff5() { + return timer_onoff5; + } + public void setTimer_onoff5(byte timer_onoff5) { + this.timer_onoff5 = timer_onoff5; + } + public byte getTimer_onoff6() { + return timer_onoff6; + } + public void setTimer_onoff6(byte timer_onoff6) { + this.timer_onoff6 = timer_onoff6; + } + public byte getNumber4() { + return number4; + } + public void setNumber4(byte number4) { + this.number4 = number4; + } + public byte getOnoff4() { + return onoff4; + } + public void setOnoff4(byte onoff4) { + this.onoff4 = onoff4; + } + public byte getTimer_number7() { + return timer_number7; + } + public void setTimer_number7(byte timer_number7) { + this.timer_number7 = timer_number7; + } + public byte getTimer_number8() { + return timer_number8; + } + public void setTimer_number8(byte timer_number8) { + this.timer_number8 = timer_number8; + } + public byte getTimer_onoff7() { + return timer_onoff7; + } + public void setTimer_onoff7(byte timer_onoff7) { + this.timer_onoff7 = timer_onoff7; + } + public byte getTimer_onoff8() { + return timer_onoff8; + } + public void setTimer_onoff8(byte timer_onoff8) { + this.timer_onoff8 = timer_onoff8; + } + public byte[] getTimer_time7() { + return timer_time7; + } + public void setTimer_time7(byte[] timer_time7) { + this.timer_time7 = timer_time7; + } + public byte[] getTimer_time8() { + return timer_time8; + } + public void setTimer_time8(byte[] timer_time8) { + this.timer_time8 = timer_time8; + } + +} diff --git a/src/main/java/com/ifish/socketNew/model/receive/BackBytes99.java b/src/main/java/com/ifish/socketNew/model/receive/BackBytes99.java new file mode 100644 index 0000000..57e6fc2 --- /dev/null +++ b/src/main/java/com/ifish/socketNew/model/receive/BackBytes99.java @@ -0,0 +1,397 @@ +package com.ifish.socketNew.model.receive; + +import java.io.Serializable; + +import com.ifish.socketNew.model.HeadModel; + +/** + * 查询反馈信息99字节(15字节协议头+84字节结果) + * @author guogw + * + */ +public class BackBytes99 extends HeadModel implements Serializable { + + private static final long serialVersionUID = -2334084294686976805L; + //工作模式 + private byte work_model; + /*********灯和开关(10字节)**********/ + //灯编号1 + private byte number1; + //灯编号2 + private byte number2; + //灯编号3 + private byte number3; + //灯编号4 + private byte number4; + //灯编号5 + private byte number5; + //灯1开关 + private byte onoff1; + //灯2开关 + private byte onoff2; + //灯3开关 + private byte onoff3; + //灯4开关 + private byte onoff4; + //灯5开关 + private byte onoff5; + /*********定时器编号(10字节)灯1对应定时器1-2,灯2对应定时器3-4,灯3对应定时器5-6**********/ + //定时器1编号 + private byte timer_number1; + //定时器2编号 + private byte timer_number2; + //定时器3编号 + private byte timer_number3; + //定时器4编号 + private byte timer_number4; + //定时器5编号 + private byte timer_number5; + //定时器6编号 + private byte timer_number6; + //定时器7编号 + private byte timer_number7; + //定时器8编号 + private byte timer_number8; + //定时器9编号 + private byte timer_number9; + //定时器10编号 + private byte timer_number10; + /*********定时器开关(10字节)**********/ + //定时器1开关 + private byte timer_onoff1; + //定时器2开关 + private byte timer_onoff2; + //定时器3开关 + private byte timer_onoff3; + //定时器4开关 + private byte timer_onoff4; + //定时器5开关 + private byte timer_onoff5; + //定时器6开关 + private byte timer_onoff6; + //定时器7开关 + private byte timer_onoff7; + //定时器8开关 + private byte timer_onoff8; + //定时器9开关 + private byte timer_onoff9; + //定时器10开关 + private byte timer_onoff10; + /*********定时器时间(40字节)**********/ + //定时器1时间 + private byte[] timer_time1 = new byte[4]; + //定时器2时间 + private byte[] timer_time2 = new byte[4]; + //定时器3时间 + private byte[] timer_time3 = new byte[4]; + //定时器4时间 + private byte[] timer_time4 = new byte[4]; + //定时器5时间 + private byte[] timer_time5 = new byte[4]; + //定时器6时间 + private byte[] timer_time6 = new byte[4]; + //定时器7时间 + private byte[] timer_time7 = new byte[4]; + //定时器8时间 + private byte[] timer_time8 = new byte[4]; + //定时器9时间 + private byte[] timer_time9 = new byte[4]; + //定时器10时间 + private byte[] timer_time10 = new byte[4]; + //温度 + private short wendu; + //ph + private short ph_value; + //湿度 + private short shidu; + //报警开关,0关,1开 + private byte warn_onoff; + //最低报警温度 + private short low_wendu; + //最高报警温度 + private short high_wendu; + + public short getWendu() { + return wendu; + } + public void setWendu(short wendu) { + this.wendu = wendu; + } + public byte getWork_model() { + return work_model; + } + public void setWork_model(byte work_model) { + this.work_model = work_model; + } + public byte getNumber1() { + return number1; + } + public void setNumber1(byte number1) { + this.number1 = number1; + } + public byte getOnoff1() { + return onoff1; + } + public void setOnoff1(byte onoff1) { + this.onoff1 = onoff1; + } + public byte getNumber2() { + return number2; + } + public void setNumber2(byte number2) { + this.number2 = number2; + } + public byte getOnoff2() { + return onoff2; + } + public void setOnoff2(byte onoff2) { + this.onoff2 = onoff2; + } + public byte getNumber3() { + return number3; + } + public void setNumber3(byte number3) { + this.number3 = number3; + } + public byte getOnoff3() { + return onoff3; + } + public void setOnoff3(byte onoff3) { + this.onoff3 = onoff3; + } + public byte getTimer_number1() { + return timer_number1; + } + public void setTimer_number1(byte timer_number1) { + this.timer_number1 = timer_number1; + } + public byte getTimer_number2() { + return timer_number2; + } + public void setTimer_number2(byte timer_number2) { + this.timer_number2 = timer_number2; + } + public byte getTimer_number3() { + return timer_number3; + } + public void setTimer_number3(byte timer_number3) { + this.timer_number3 = timer_number3; + } + public byte getTimer_number4() { + return timer_number4; + } + public void setTimer_number4(byte timer_number4) { + this.timer_number4 = timer_number4; + } + public byte getTimer_number5() { + return timer_number5; + } + public void setTimer_number5(byte timer_number5) { + this.timer_number5 = timer_number5; + } + public byte getTimer_number6() { + return timer_number6; + } + public void setTimer_number6(byte timer_number6) { + this.timer_number6 = timer_number6; + } + public byte getTimer_number7() { + return timer_number7; + } + public void setTimer_number7(byte timer_number7) { + this.timer_number7 = timer_number7; + } + public byte getTimer_number8() { + return timer_number8; + } + public void setTimer_number8(byte timer_number8) { + this.timer_number8 = timer_number8; + } + public byte getTimer_number9() { + return timer_number9; + } + public void setTimer_number9(byte timer_number9) { + this.timer_number9 = timer_number9; + } + public byte[] getTimer_time1() { + return timer_time1; + } + public void setTimer_time1(byte[] timer_time1) { + this.timer_time1 = timer_time1; + } + public byte[] getTimer_time2() { + return timer_time2; + } + public void setTimer_time2(byte[] timer_time2) { + this.timer_time2 = timer_time2; + } + public byte[] getTimer_time3() { + return timer_time3; + } + public void setTimer_time3(byte[] timer_time3) { + this.timer_time3 = timer_time3; + } + public byte[] getTimer_time4() { + return timer_time4; + } + public void setTimer_time4(byte[] timer_time4) { + this.timer_time4 = timer_time4; + } + public byte[] getTimer_time5() { + return timer_time5; + } + public void setTimer_time5(byte[] timer_time5) { + this.timer_time5 = timer_time5; + } + public byte[] getTimer_time6() { + return timer_time6; + } + public void setTimer_time6(byte[] timer_time6) { + this.timer_time6 = timer_time6; + } + public byte[] getTimer_time7() { + return timer_time7; + } + public void setTimer_time7(byte[] timer_time7) { + this.timer_time7 = timer_time7; + } + public byte[] getTimer_time8() { + return timer_time8; + } + public void setTimer_time8(byte[] timer_time8) { + this.timer_time8 = timer_time8; + } + public byte[] getTimer_time9() { + return timer_time9; + } + public void setTimer_time9(byte[] timer_time9) { + this.timer_time9 = timer_time9; + } + public short getPh_value() { + return ph_value; + } + public void setPh_value(short ph_value) { + this.ph_value = ph_value; + } + public short getShidu() { + return shidu; + } + public void setShidu(short shidu) { + this.shidu = shidu; + } + public byte getWarn_onoff() { + return warn_onoff; + } + public void setWarn_onoff(byte warn_onoff) { + this.warn_onoff = warn_onoff; + } + public short getLow_wendu() { + return low_wendu; + } + public void setLow_wendu(short low_wendu) { + this.low_wendu = low_wendu; + } + public short getHigh_wendu() { + return high_wendu; + } + public void setHigh_wendu(short high_wendu) { + this.high_wendu = high_wendu; + } + public byte getOnoff4() { + return onoff4; + } + public void setOnoff4(byte onoff4) { + this.onoff4 = onoff4; + } + public byte getOnoff5() { + return onoff5; + } + public void setOnoff5(byte onoff5) { + this.onoff5 = onoff5; + } + public byte getTimer_number10() { + return timer_number10; + } + public void setTimer_number10(byte timer_number10) { + this.timer_number10 = timer_number10; + } + public byte[] getTimer_time10() { + return timer_time10; + } + public void setTimer_time10(byte[] timer_time10) { + this.timer_time10 = timer_time10; + } + public byte getNumber4() { + return number4; + } + public void setNumber4(byte number4) { + this.number4 = number4; + } + public byte getNumber5() { + return number5; + } + public void setNumber5(byte number5) { + this.number5 = number5; + } + public byte getTimer_onoff1() { + return timer_onoff1; + } + public void setTimer_onoff1(byte timer_onoff1) { + this.timer_onoff1 = timer_onoff1; + } + public byte getTimer_onoff2() { + return timer_onoff2; + } + public void setTimer_onoff2(byte timer_onoff2) { + this.timer_onoff2 = timer_onoff2; + } + public byte getTimer_onoff3() { + return timer_onoff3; + } + public void setTimer_onoff3(byte timer_onoff3) { + this.timer_onoff3 = timer_onoff3; + } + public byte getTimer_onoff4() { + return timer_onoff4; + } + public void setTimer_onoff4(byte timer_onoff4) { + this.timer_onoff4 = timer_onoff4; + } + public byte getTimer_onoff5() { + return timer_onoff5; + } + public void setTimer_onoff5(byte timer_onoff5) { + this.timer_onoff5 = timer_onoff5; + } + public byte getTimer_onoff6() { + return timer_onoff6; + } + public void setTimer_onoff6(byte timer_onoff6) { + this.timer_onoff6 = timer_onoff6; + } + public byte getTimer_onoff7() { + return timer_onoff7; + } + public void setTimer_onoff7(byte timer_onoff7) { + this.timer_onoff7 = timer_onoff7; + } + public byte getTimer_onoff8() { + return timer_onoff8; + } + public void setTimer_onoff8(byte timer_onoff8) { + this.timer_onoff8 = timer_onoff8; + } + public byte getTimer_onoff9() { + return timer_onoff9; + } + public void setTimer_onoff9(byte timer_onoff9) { + this.timer_onoff9 = timer_onoff9; + } + public byte getTimer_onoff10() { + return timer_onoff10; + } + public void setTimer_onoff10(byte timer_onoff10) { + this.timer_onoff10 = timer_onoff10; + } + +} diff --git a/src/main/java/com/ifish/socketNew/model/receive/BackFunctionCode0.java b/src/main/java/com/ifish/socketNew/model/receive/BackFunctionCode0.java new file mode 100644 index 0000000..4ea58e9 --- /dev/null +++ b/src/main/java/com/ifish/socketNew/model/receive/BackFunctionCode0.java @@ -0,0 +1,33 @@ +package com.ifish.socketNew.model.receive; + +import java.io.Serializable; + +import com.ifish.socketNew.model.HeadModel; + +/** + * 服务器回复手机端的登录请求26字节(17字节头+9字节) + * @author guogw + * + */ +public class BackFunctionCode0 extends HeadModel implements Serializable{ + + private static final long serialVersionUID = 656305903606196100L; + //0表示设备还未连接服务器,1表示已连接 + private byte login_status; + //系统时间 + private long sysTime; + + public byte getLogin_status() { + return login_status; + } + public void setLogin_status(byte login_status) { + this.login_status = login_status; + } + public long getSysTime() { + return sysTime; + } + public void setSysTime(long sysTime) { + this.sysTime = sysTime; + } + +} diff --git a/src/main/java/com/ifish/socketNew/model/receive/BackFunctionCode1.java b/src/main/java/com/ifish/socketNew/model/receive/BackFunctionCode1.java new file mode 100644 index 0000000..90ecc58 --- /dev/null +++ b/src/main/java/com/ifish/socketNew/model/receive/BackFunctionCode1.java @@ -0,0 +1,25 @@ +package com.ifish.socketNew.model.receive; + +import java.io.Serializable; + +import com.ifish.socketNew.model.HeadModel; + +/** + * 服务器回复插座的登录请求25字节(15字节头+8字节时间+2字节) + * @author guogw + * + */ +public class BackFunctionCode1 extends HeadModel implements Serializable { + + private static final long serialVersionUID = 1L; + //系统时间 + private byte[] sysTime = new byte[8]; + + public byte[] getSysTime() { + return sysTime; + } + public void setSysTime(byte[] sysTime) { + this.sysTime = sysTime; + } + +} diff --git a/src/main/java/com/ifish/socketNew/model/receive/BackFunctionCode8.java b/src/main/java/com/ifish/socketNew/model/receive/BackFunctionCode8.java new file mode 100644 index 0000000..42ed8f5 --- /dev/null +++ b/src/main/java/com/ifish/socketNew/model/receive/BackFunctionCode8.java @@ -0,0 +1,16 @@ +package com.ifish.socketNew.model.receive; + +import java.io.Serializable; + +import com.ifish.socketNew.model.HeadModel; + +/** + * 服务器响应心跳17字节(15字节头+2校验码) + * @author guogw + * + */ +public class BackFunctionCode8 extends HeadModel implements Serializable{ + + private static final long serialVersionUID = 8470317692571925603L; + +} diff --git a/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode0.java b/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode0.java new file mode 100644 index 0000000..425bfeb --- /dev/null +++ b/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode0.java @@ -0,0 +1,24 @@ +package com.ifish.socketNew.model.send; + +import java.io.Serializable; + +import com.ifish.socketNew.model.HeadModel; + +/** + * 手机登录请求25字节(17字节头+8字节登陆信息) + * @author guogw + * + */ +public class OrderFunctionCode0 extends HeadModel implements Serializable { + + private static final long serialVersionUID = 5899193914651159511L; + //时间 + private long longtime; + + public long getLongtime() { + return longtime; + } + public void setLongtime(long longtime) { + this.longtime = longtime; + } +} diff --git a/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode1.java b/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode1.java new file mode 100644 index 0000000..8ea9276 --- /dev/null +++ b/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode1.java @@ -0,0 +1,57 @@ +package com.ifish.socketNew.model.send; + +import java.io.Serializable; + +import com.ifish.socketNew.model.HeadModel; + +/** + * 设备登录服务器(24字节=17+7字节登陆信息) + * @author guogw + * + */ +public class OrderFunctionCode1 extends HeadModel implements Serializable { + + private static final long serialVersionUID = 5329299292101065390L; + //厂商 + private byte vendor; + //硬件型号 + private byte hardware_type; + //版本 + private byte version; + //登陆IP + private byte[] login_ip = new byte[4]; + + + public byte getVendor() { + return vendor; + } + + public void setVendor(byte vendor) { + this.vendor = vendor; + } + + public byte getHardware_type() { + return hardware_type; + } + + public void setHardware_type(byte hardware_type) { + this.hardware_type = hardware_type; + } + + public byte getVersion() { + return version; + } + + public void setVersion(byte version) { + this.version = version; + } + + public byte[] getLogin_ip() { + return login_ip; + } + + public void setLogin_ip(byte[] login_ip) { + this.login_ip = login_ip; + } + +} diff --git a/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode15.java b/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode15.java new file mode 100644 index 0000000..a20f838 --- /dev/null +++ b/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode15.java @@ -0,0 +1,33 @@ +package com.ifish.socketNew.model.send; + +import java.io.Serializable; + +import com.ifish.socketNew.model.HeadModel; + +/** + * 升级命令78字节(17字节头+61字节) + * @author guogw + * + */ +public class OrderFunctionCode15 extends HeadModel implements Serializable { + + private static final long serialVersionUID = 3696291654504951296L; + //版本 + private byte version; + //地址 + private byte[] address = new byte[60]; + + public byte getVersion() { + return version; + } + public void setVersion(byte version) { + this.version = version; + } + public byte[] getAddress() { + return address; + } + public void setAddress(byte[] address) { + this.address = address; + } + +} diff --git a/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode16.java b/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode16.java new file mode 100644 index 0000000..ebe00ef --- /dev/null +++ b/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode16.java @@ -0,0 +1,49 @@ +package com.ifish.socketNew.model.send; + +import java.io.Serializable; + +import com.ifish.socketNew.model.HeadModel; + +/** + * 温度报警指令22字节(17字节头+5字节) + * @author guogw + * + */ +public class OrderFunctionCode16 extends HeadModel implements Serializable { + + private static final long serialVersionUID = -6712376303551767331L; + //版本 + private byte version; + //年 + private short year; + //月 + private byte month; + //日 + private byte day; + + public byte getVersion() { + return version; + } + public void setVersion(byte version) { + this.version = version; + } + public short getYear() { + return year; + } + public void setYear(short year) { + this.year = year; + } + public byte getMonth() { + return month; + } + public void setMonth(byte month) { + this.month = month; + } + public byte getDay() { + return day; + } + public void setDay(byte day) { + this.day = day; + } + +} diff --git a/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode17.java b/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode17.java new file mode 100644 index 0000000..e6132a9 --- /dev/null +++ b/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode17.java @@ -0,0 +1,89 @@ +package com.ifish.socketNew.model.send; + +import java.io.Serializable; + +import com.ifish.socketNew.model.HeadModel; + +/** + * 温度报警指令38字节(17字节头+21字节) + * @author guogw + * + */ +public class OrderFunctionCode17 extends HeadModel implements Serializable { + + private static final long serialVersionUID = -6712376303551767331L; + //版本 + private byte version; + //年 + private short year; + //月 + private byte month; + //日 + private byte day; + //MCU启动次数 + private int number1; + //模块启动次数 + private int number2; + //连接路由器次数 + private int number3; + //成功连接服务器次数 + private int number4; + //尝试连接服务器次数 + private int number5; + + public byte getVersion() { + return version; + } + public void setVersion(byte version) { + this.version = version; + } + public short getYear() { + return year; + } + public void setYear(short year) { + this.year = year; + } + public byte getMonth() { + return month; + } + public void setMonth(byte month) { + this.month = month; + } + public byte getDay() { + return day; + } + public void setDay(byte day) { + this.day = day; + } + public int getNumber1() { + return number1; + } + public void setNumber1(int number1) { + this.number1 = number1; + } + public int getNumber2() { + return number2; + } + public void setNumber2(int number2) { + this.number2 = number2; + } + public int getNumber3() { + return number3; + } + public void setNumber3(int number3) { + this.number3 = number3; + } + public int getNumber4() { + return number4; + } + public void setNumber4(int number4) { + this.number4 = number4; + } + public int getNumber5() { + return number5; + } + public void setNumber5(int number5) { + this.number5 = number5; + } + +} diff --git a/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode2_12_13.java b/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode2_12_13.java new file mode 100644 index 0000000..146515f --- /dev/null +++ b/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode2_12_13.java @@ -0,0 +1,26 @@ +package com.ifish.socketNew.model.send; + +import java.io.Serializable; + +import com.ifish.socketNew.model.HeadModel; + +/** + * 切换模式/调整背光灯亮度/开关柜灯18字节(17字节头+1字节模式) + * @author guogw + * + */ +public class OrderFunctionCode2_12_13 extends HeadModel implements Serializable { + + private static final long serialVersionUID = 4716919320112205973L; + //工作模式/亮度参数(00-FF)/开关 + private byte parameter; + + public byte getParameter() { + return parameter; + } + public void setParameter(byte parameter) { + this.parameter = parameter; + } + + +} diff --git a/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode3_10.java b/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode3_10.java new file mode 100644 index 0000000..0daea1e --- /dev/null +++ b/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode3_10.java @@ -0,0 +1,32 @@ +package com.ifish.socketNew.model.send; + +import java.io.Serializable; + +import com.ifish.socketNew.model.HeadModel; + +/** + * 开关灯/开关定时器19字节(17字节头+2字节) + * @author guogw + * + */ +public class OrderFunctionCode3_10 extends HeadModel implements Serializable { + + private static final long serialVersionUID = 4716919320112205973L; + //灯编号/定时器编号 + private byte number; + //开关,1开,0关 + private byte onoff; + + public byte getNumber() { + return number; + } + public void setNumber(byte number) { + this.number = number; + } + public byte getOnoff() { + return onoff; + } + public void setOnoff(byte onoff) { + this.onoff = onoff; + } +} diff --git a/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode4.java b/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode4.java new file mode 100644 index 0000000..fb47319 --- /dev/null +++ b/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode4.java @@ -0,0 +1,33 @@ +package com.ifish.socketNew.model.send; + +import java.io.Serializable; + +import com.ifish.socketNew.model.HeadModel; + +/** + * 设置定时器时间22字节(17字节头+5字节) + * @author guogw + * + */ +public class OrderFunctionCode4 extends HeadModel implements Serializable { + + private static final long serialVersionUID = 4716919320112205973L; + //定时器编号 + private byte timer_number; + //定时时间 + private byte[] timer_time = new byte[4]; + + public byte getTimer_number() { + return timer_number; + } + public void setTimer_number(byte timer_number) { + this.timer_number = timer_number; + } + public byte[] getTimer_time() { + return timer_time; + } + public void setTimer_time(byte[] timer_time) { + this.timer_time = timer_time; + } + +} diff --git a/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode5.java b/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode5.java new file mode 100644 index 0000000..b322aae --- /dev/null +++ b/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode5.java @@ -0,0 +1,41 @@ +package com.ifish.socketNew.model.send; + +import java.io.Serializable; + +import com.ifish.socketNew.model.HeadModel; + +/** + * 设置报警温度指令22字节(17字节头+5字节) + * @author guogw + * + */ +public class OrderFunctionCode5 extends HeadModel implements Serializable { + + private static final long serialVersionUID = -6712376303551767331L; + //开启关闭报警,00关,01开,02设置温度 + private byte onoff; + //报警温度 + private short low_wendu; + //报警温度 + private short hight_wendu; + + public byte getOnoff() { + return onoff; + } + public void setOnoff(byte onoff) { + this.onoff = onoff; + } + public short getLow_wendu() { + return low_wendu; + } + public void setLow_wendu(short low_wendu) { + this.low_wendu = low_wendu; + } + public short getHight_wendu() { + return hight_wendu; + } + public void setHight_wendu(short hight_wendu) { + this.hight_wendu = hight_wendu; + } + +} diff --git a/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode6.java b/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode6.java new file mode 100644 index 0000000..9c56d42 --- /dev/null +++ b/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode6.java @@ -0,0 +1,16 @@ +package com.ifish.socketNew.model.send; + +import java.io.Serializable; + +import com.ifish.socketNew.model.HeadModel; + +/** + * 手机查询设备状态17字节(17字节头) + * @author guogw + * + */ +public class OrderFunctionCode6 extends HeadModel implements Serializable{ + + private static final long serialVersionUID = 8470317692571925603L; + +} diff --git a/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode9.java b/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode9.java new file mode 100644 index 0000000..71021e5 --- /dev/null +++ b/src/main/java/com/ifish/socketNew/model/send/OrderFunctionCode9.java @@ -0,0 +1,42 @@ +package com.ifish.socketNew.model.send; + +import java.io.Serializable; + +import com.ifish.socketNew.model.HeadModel; + +/** + * 温度报警指令22字节(17字节头+5字节) + * @author guogw + * + */ +public class OrderFunctionCode9 extends HeadModel implements Serializable { + + private static final long serialVersionUID = -6712376303551767331L; + //报警温度类型,0是低温报警,1是高温报警 + private byte warn_type; + //当前设备温度 + private short wendu; + //报警温度 + private short warn_wendu; + + public byte getWarn_type() { + return warn_type; + } + public void setWarn_type(byte warn_type) { + this.warn_type = warn_type; + } + public short getWendu() { + return wendu; + } + public void setWendu(short wendu) { + this.wendu = wendu; + } + public short getWarn_wendu() { + return warn_wendu; + } + public void setWarn_wendu(short warn_wendu) { + this.warn_wendu = warn_wendu; + } + + +} diff --git a/src/main/java/com/ifish/socketNew/util/ModelCodec.java b/src/main/java/com/ifish/socketNew/util/ModelCodec.java new file mode 100644 index 0000000..2b2f74b --- /dev/null +++ b/src/main/java/com/ifish/socketNew/util/ModelCodec.java @@ -0,0 +1,310 @@ +package com.ifish.socketNew.util; + +import org.apache.mina.core.buffer.IoBuffer; + +import com.ifish.socketNew.model.receive.BackFunctionCode0; +import com.ifish.socketNew.model.receive.BackBytes99; +import com.ifish.socketNew.model.send.OrderFunctionCode0; +import com.ifish.socketNew.model.send.OrderFunctionCode2_12_13; +import com.ifish.socketNew.model.send.OrderFunctionCode3_10; +import com.ifish.socketNew.model.send.OrderFunctionCode4; +import com.ifish.socketNew.model.send.OrderFunctionCode5; +import com.ifish.socketNew.model.send.OrderFunctionCode6; +import com.ifish.util.ByteUtil; + +public class ModelCodec { + /** + * 把对象转成字节数 + * @param obj + * @return + */ + public static byte[] enCode(Object obj){ + IoBuffer buffer = IoBuffer.allocate(100).setAutoExpand(true); + //查询设备状信息 + if(obj instanceof OrderFunctionCode6){ + OrderFunctionCode6 model = (OrderFunctionCode6) obj; + //15字节数据包头 + buffer.put(model.getType()); + buffer.put(model.getCheck_code()); + buffer.put(model.getSrc()); + buffer.put(model.getDest()); + buffer.put(model.getRemote_len()); + //crc16校验码 + buffer.put(model.getCrc16_code()); + } + //切换工作模式 + else if(obj instanceof OrderFunctionCode2_12_13){ + OrderFunctionCode2_12_13 model = (OrderFunctionCode2_12_13) obj; + //15字节数据包头 + buffer.put(model.getType()); + buffer.put(model.getCheck_code()); + buffer.put(model.getSrc()); + buffer.put(model.getDest()); + buffer.put(model.getRemote_len()); + //工作模式 + buffer.put(model.getParameter()); + //crc16校验码 + buffer.put(model.getCrc16_code()); + } + //开关灯 + else if(obj instanceof OrderFunctionCode3_10){ + OrderFunctionCode3_10 model = (OrderFunctionCode3_10) obj; + //15字节数据包头 + buffer.put(model.getType()); + buffer.put(model.getCheck_code()); + buffer.put(model.getSrc()); + buffer.put(model.getDest()); + buffer.put(model.getRemote_len()); + //灯编号 + buffer.put(model.getNumber()); + //开关 + buffer.put(model.getOnoff()); + //crc16校验码 + buffer.put(model.getCrc16_code()); + } + //设置定时器时间 + else if(obj instanceof OrderFunctionCode4){ + OrderFunctionCode4 model = (OrderFunctionCode4) obj; + //15字节数据包头 + buffer.put(model.getType()); + buffer.put(model.getCheck_code()); + buffer.put(model.getSrc()); + buffer.put(model.getDest()); + buffer.put(model.getRemote_len()); + //定时器编号 + buffer.put(model.getTimer_number()); + //定时器时间 + buffer.put(model.getTimer_time()); + //crc16校验码 + buffer.put(model.getCrc16_code()); + } + //设置报警温度 + else if(obj instanceof OrderFunctionCode5){ + OrderFunctionCode5 model = (OrderFunctionCode5) obj; + //15字节数据包头 + buffer.put(model.getType()); + buffer.put(model.getCheck_code()); + buffer.put(model.getSrc()); + buffer.put(model.getDest()); + buffer.put(model.getRemote_len()); + //开关 + buffer.put(model.getOnoff()); + //温度类型 + buffer.putShort(model.getLow_wendu()); + //报警温度 + buffer.putShort(model.getHight_wendu()); + //crc16校验码 + buffer.put(model.getCrc16_code()); + } + //APP登陆服务器 + else if(obj instanceof OrderFunctionCode0){ + OrderFunctionCode0 model = (OrderFunctionCode0) obj; + //15字节数据包头 + buffer.put(model.getType()); + buffer.put(model.getCheck_code()); + buffer.put(model.getSrc()); + buffer.put(model.getDest()); + buffer.put(model.getRemote_len()); + //时间 + buffer.putLong(model.getLongtime()); + //crc16校验码 + buffer.put(model.getCrc16_code()); + } + buffer.flip(); + return ByteUtil.ioBufferToByte(buffer); + } + + /** + * 把字节数组转成对象 + * @param obj + * @return + */ + public static Object deCode(byte[] bys) { + int length = bys.length; + IoBuffer buf = ByteUtil.byteToIoBuffer(bys,length); + //switch语句 + switch (length) { + //长度为26,服务器回复APP登录请求 + case 26: { + return decode26(buf); + } + //长度为99,设备反馈信息 + case 99: { + return decode99(buf); + } + default: + return null; + } + } + /** + * 服务器回复APP登录请求 + * @param buf + * @return + */ + private static Object decode26(IoBuffer buf){ + BackFunctionCode0 model = new BackFunctionCode0(); + //15字节头 + model.setType(buf.get()); + model.setCheck_code(buf.get()); + byte[] src = model.getSrc(); + for (int i = 0; i < src.length; i++) { + src[i] = buf.get(); + } + model.setSrc(src); + byte[] dest = model.getDest(); + for (int i = 0; i < dest.length; i++) { + dest[i] = buf.get(); + } + model.setDest(dest); + model.setRemote_len(buf.get()); + //登陆状态 + model.setLogin_status(buf.get()); + //时间 + model.setSysTime(buf.getLong()); + byte[] crc16_code = model.getCrc16_code(); + for (int i = 0; i < crc16_code.length; i++) { + crc16_code[i] = buf.get(); + } + return model; + } + /** + * 设备反馈信息 + * @param buf + * @return + */ + private static Object decode99(IoBuffer buf){ + BackBytes99 model = new BackBytes99(); + //15字节头 + model.setType(buf.get()); + model.setCheck_code(buf.get()); + byte[] src = model.getSrc(); + for (int i = 0; i < src.length; i++) { + src[i] = buf.get(); + } + model.setSrc(src); + byte[] dest = model.getDest(); + for (int i = 0; i < dest.length; i++) { + dest[i] = buf.get(); + } + model.setDest(dest); + model.setRemote_len(buf.get()); + //工作模式 + model.setWork_model(buf.get()); + //灯1编号和开关 + model.setNumber1(buf.get()); + model.setOnoff1(buf.get()); + //灯2编号和开关 + model.setNumber2(buf.get()); + model.setOnoff2(buf.get()); + //灯3编号和开关 + model.setNumber3(buf.get()); + model.setOnoff3(buf.get()); + //灯4编号和开关 + model.setNumber4(buf.get()); + model.setOnoff4(buf.get()); + //灯5编号和开关 + model.setNumber5(buf.get()); + model.setOnoff5(buf.get()); + + //定时器编号 + byte timer_number1 = model.getTimer_number1(); + byte timer_number2 = model.getTimer_number2(); + byte timer_number3 = model.getTimer_number3(); + byte timer_number4 = model.getTimer_number4(); + byte timer_number5 = model.getTimer_number5(); + byte timer_number6 = model.getTimer_number6(); + byte timer_number7 = model.getTimer_number7(); + byte timer_number8 = model.getTimer_number8(); + byte timer_number9 = model.getTimer_number9(); + byte timer_number10 = model.getTimer_number10(); + + //定时器开关 + byte timer_onoff1 = model.getTimer_onoff1(); + byte timer_onoff2 = model.getTimer_onoff2(); + byte timer_onoff3 = model.getTimer_onoff3(); + byte timer_onoff4 = model.getTimer_onoff4(); + byte timer_onoff5 = model.getTimer_onoff5(); + byte timer_onoff6 = model.getTimer_onoff6(); + byte timer_onoff7 = model.getTimer_onoff7(); + byte timer_onoff8 = model.getTimer_onoff8(); + byte timer_onoff9 = model.getTimer_onoff9(); + byte timer_onoff10 = model.getTimer_onoff10(); + + //定时器时间 + byte[] timer_time1 = model.getTimer_time1(); + byte[] timer_time2 = model.getTimer_time2(); + byte[] timer_time3 = model.getTimer_time3(); + byte[] timer_time4 = model.getTimer_time4(); + byte[] timer_time5 = model.getTimer_time5(); + byte[] timer_time6 = model.getTimer_time6(); + byte[] timer_time7 = model.getTimer_time7(); + byte[] timer_time8 = model.getTimer_time8(); + byte[] timer_time9 = model.getTimer_time9(); + byte[] timer_time10 = model.getTimer_time10(); + + byte[] timer_numbers = {timer_number1,timer_number2,timer_number3,timer_number4,timer_number5,timer_number6,timer_number7,timer_number8,timer_number9,timer_number10}; + byte[] timer_onoffs = {timer_onoff1,timer_onoff2,timer_onoff3,timer_onoff4,timer_onoff5,timer_onoff6,timer_onoff7,timer_onoff8,timer_onoff9,timer_onoff10}; + byte[][] timers = {timer_time1,timer_time2,timer_time3,timer_time4,timer_time5,timer_time6,timer_time7,timer_time8,timer_time9,timer_time10}; + + for (int i = 0; i < timers.length; i++) { + //定时器编号 + timer_numbers[i] = buf.get(); + //定时器开关 + timer_onoffs[i] = buf.get(); + for (int j = 0; j < timers[i].length; j++) { + timers[i][j] = buf.get(); + } + } + //定时器编号 + model.setTimer_number1(timer_numbers[0]); + model.setTimer_number2(timer_numbers[1]); + model.setTimer_number3(timer_numbers[2]); + model.setTimer_number4(timer_numbers[3]); + model.setTimer_number5(timer_numbers[4]); + model.setTimer_number6(timer_numbers[5]); + model.setTimer_number7(timer_numbers[6]); + model.setTimer_number8(timer_numbers[7]); + model.setTimer_number9(timer_numbers[8]); + model.setTimer_number10(timer_numbers[9]); + //定时器开关 + model.setTimer_onoff1(timer_onoffs[0]); + model.setTimer_onoff2(timer_onoffs[1]); + model.setTimer_onoff3(timer_onoffs[2]); + model.setTimer_onoff4(timer_onoffs[3]); + model.setTimer_onoff5(timer_onoffs[4]); + model.setTimer_onoff6(timer_onoffs[5]); + model.setTimer_onoff7(timer_onoffs[6]); + model.setTimer_onoff8(timer_onoffs[7]); + model.setTimer_onoff9(timer_onoffs[8]); + model.setTimer_onoff10(timer_onoffs[9]); + //定时器时间 + model.setTimer_time1(timers[0]); + model.setTimer_time2(timers[1]); + model.setTimer_time3(timers[2]); + model.setTimer_time4(timers[3]); + model.setTimer_time5(timers[4]); + model.setTimer_time6(timers[5]); + model.setTimer_time7(timers[6]); + model.setTimer_time8(timers[7]); + model.setTimer_time9(timers[8]); + model.setTimer_time10(timers[9]); + + //温度 + model.setWendu(buf.getShort()); + //ph + model.setPh_value(buf.getShort()); + //湿度 + model.setShidu(buf.getShort()); + //报警开关 + model.setWarn_onoff(buf.get()); + //最低报警温度 + model.setLow_wendu(buf.getShort()); + //最高报警温度 + model.setHigh_wendu(buf.getShort()); + byte[] crc16_code = model.getCrc16_code(); + for (int i = 0; i < crc16_code.length; i++) { + crc16_code[i] = buf.get(); + } + return model; + } +} diff --git a/src/main/java/com/ifish/socketNew/util/MyInetSocketAddress.java b/src/main/java/com/ifish/socketNew/util/MyInetSocketAddress.java new file mode 100644 index 0000000..f9e90ab --- /dev/null +++ b/src/main/java/com/ifish/socketNew/util/MyInetSocketAddress.java @@ -0,0 +1,44 @@ +package com.ifish.socketNew.util; + +import java.net.InetSocketAddress; + +public class MyInetSocketAddress { + + private InetSocketAddress socketAddress = null; + private String ip = ""; + private int serverPort = 9955; + + public MyInetSocketAddress(String ip, int serverPort) { + try { + this.ip = ip; + this.serverPort = serverPort; + socketAddress = new InetSocketAddress(ip, serverPort); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public InetSocketAddress getSocketAddress() { + return socketAddress; + } + + public void setSocketAddress(InetSocketAddress socketAddress) { + this.socketAddress = socketAddress; + } + + public String getIp() { + return ip; + } + + public void setIp(String ip) { + this.ip = ip; + } + + public int getServerPort() { + return serverPort; + } + + public void setServerPort(int serverPort) { + this.serverPort = serverPort; + } +} diff --git a/src/main/java/com/ifish/socketNew/util/OrderModel.java b/src/main/java/com/ifish/socketNew/util/OrderModel.java new file mode 100644 index 0000000..f69d07b --- /dev/null +++ b/src/main/java/com/ifish/socketNew/util/OrderModel.java @@ -0,0 +1,92 @@ +package com.ifish.socketNew.util; + +import com.ifish.socketNew.model.receive.BackFunctionCode0; +import com.ifish.socketNew.model.receive.BackFunctionCode1; +import com.ifish.socketNew.model.receive.BackFunctionCode8; +import com.ifish.socketNew.model.send.OrderFunctionCode15; +import com.ifish.util.ByteUtil; + +public class OrderModel { + + /** + * 服务器回复设备登录请求指令 + * + * @param src + * @param dest + * @return + */ + public final static BackFunctionCode1 BackFunctionCode1(byte[] src, byte[] dest) { + BackFunctionCode1 model = new BackFunctionCode1(); + model.setType((byte) 1); + model.setCheck_code((byte) 1); + model.setSrc(src); + model.setDest(dest); + model.setRemote_len((byte) 25); + model.setSysTime(ByteUtil.hexSysTime()); + return model; + } + + /** + * 服务器回复APP登录请求指令 + * + * @param src + * @param dest + * @return + */ + public final static BackFunctionCode0 BackFunctionCode0(byte[] src, byte[] dest, byte login_status) { + BackFunctionCode0 model = new BackFunctionCode0(); + model.setType((byte) 1); + model.setSrc(src); + model.setDest(dest); + model.setRemote_len((byte) 26); + model.setLogin_status(login_status); + model.setSysTime(System.currentTimeMillis()); + return model; + } + + /** + * 获取查询命令 + * + * @param type + * @param macAddress + * @return + */ + public final static BackFunctionCode8 BackFunctionCode8(String macAddress) { + BackFunctionCode8 model = new BackFunctionCode8(); + //15字节数据包头 + model.setType((byte) 1); + model.setCheck_code((byte) 8); + model.setSrc(ByteUtil.hexStringToBytes2(macAddress)); + model.setDest(ByteUtil.hexStringToBytes2(macAddress)); + model.setRemote_len((byte) 17); + return model; + } + + /** + * 升级 + * + * @param type + * @param macAddress + * @param timer_number + * @param time + * @return + */ + public final static OrderFunctionCode15 OrderFunctionCode15(byte[] macAddress, int version) { + OrderFunctionCode15 model = new OrderFunctionCode15(); + //15字节数据包头 + model.setType((byte) 0); + model.setCheck_code((byte) 15); + model.setSrc(macAddress); + model.setDest(macAddress); + model.setRemote_len((byte) 78); + model.setVersion((byte) version); + //地址 + byte[] addressByte = model.getAddress(); + byte[] bytes = "/download/sdk/".getBytes(); + for (int i = 0; i < bytes.length; i++) { + addressByte[i] = bytes[i]; + } + model.setAddress(addressByte); + return model; + } +} diff --git a/src/main/java/com/ifish/util/ByteUtil.java b/src/main/java/com/ifish/util/ByteUtil.java new file mode 100644 index 0000000..ac1d980 --- /dev/null +++ b/src/main/java/com/ifish/util/ByteUtil.java @@ -0,0 +1,185 @@ +package com.ifish.util; + +import java.util.Calendar; + +import org.apache.mina.core.buffer.IoBuffer; +import org.json.JSONException; +import org.json.JSONObject; + +import com.ifish.socketNew.model.receive.BackBytes99; + +public class ByteUtil{ + + /** + * 将IoBuffer转换成byte + * @param str + */ + public static byte[] ioBufferToByte(IoBuffer ioBuffer){ + byte[] b = new byte[ioBuffer.limit()]; + ioBuffer.get(b, 0, b.length); + return b; + } + /** + * 将byte[]转换成IoBuffer + * @param str + */ + public static IoBuffer byteToIoBuffer(byte [] bt,int length){ + IoBuffer ioBuffer = IoBuffer.allocate(100).setAutoExpand(true); + //ioBuffer.order(ByteOrder.LITTLE_ENDIAN);// 修改此缓冲区的字节顺大端模式 + ioBuffer.put(bt, 0, length); + ioBuffer.flip(); + return ioBuffer; + } + /** + * 16进制字节数组转16进制字符 + * @param hexString + * @return byte[] + */ + public static String bytesToHexString(byte[] src){ + StringBuilder stringBuilder = new StringBuilder(); + if (src == null || src.length <= 0) { + return null; + } + for (int i = 0; i < src.length; i++) { + int v = src[i] & 0xFF; + String hv = Integer.toHexString(v); + if (hv.length() < 2) { + stringBuilder.append(0); + } + stringBuilder.append(hv); + } + return stringBuilder.toString(); + } + + /** + * 16进制字符串转换成字节数组(带空格) + * @param hexString + * @return byte[] + */ + public static byte[] hexStringToBytes(String hexString){ + hexString = hexString.toLowerCase(); + String[] hexStrings = hexString.split(" "); + byte[] bytes = new byte[hexStrings.length]; + for (int i = 0; i < hexStrings.length; i++){ + char[] hexChars = hexStrings[i].toCharArray(); + bytes[i] = (byte) (charToByte(hexChars[0]) << 4 | charToByte(hexChars[1])); + } + return bytes; + } + private static byte charToByte(char c){ + return (byte) "0123456789abcdef".indexOf(c); + } + /** + * 16进制字符串转换成字节数组(不带空格) + * @param hexString + * @return byte[] + */ + public static byte[] hexStringToBytes2(String hex) { + hex = hex.toLowerCase(); + int len = (hex.length() / 2); + byte[] result = new byte[len]; + char[] achar = hex.toCharArray(); + for (int i = 0; i < len; i++) { + int pos = i * 2; + result[i] = (byte) (charToByte(achar[pos]) << 4 | charToByte(achar[pos + 1])); + } + return result; + } + + /** + * 把byte 转化为两位十六进制数 + * @param b + * @return + */ + public static String toHex(byte b) { + String result = Integer.toHexString(b & 0xFF); + if (result.length() == 1) { + result = '0' + result; + } + return result; + } + /** + * 当前16进制时间 + * @return + */ + public static byte[] hexSysTime(){ + Calendar calendar = Calendar.getInstance(); + String hexYear = String.format("%04x", calendar.get(Calendar.YEAR)); + String hexMonth = String.format("%02x", (calendar.get(Calendar.MONTH)+1)); + String hexDate = String.format("%02x", calendar.get(Calendar.DATE)); + String hexHours = String.format("%02x", calendar.get(Calendar.HOUR_OF_DAY)); + String hexMinutes = String.format("%02x", calendar.get(Calendar.MINUTE)); + String hexSeconds = String.format("%02x", calendar.get(Calendar.SECOND)); + int hexDay = calendar.get(Calendar.DAY_OF_WEEK); + String dayOfWeek = String.format("%02x", hexDay==1?7:hexDay-1); + byte[] sysTime = hexStringToBytes2(hexYear+hexMonth+hexDate+hexHours+hexMinutes+hexSeconds+dayOfWeek); + return sysTime; + } + + /** + * 将byte定时器转换成String + * @param str + */ + public static String BytesToTimer(byte[] bys){ + StringBuilder s = new StringBuilder(); + for (int i = 0; i < bys.length; i++) { + if(i==1){ + s.append(String.format("%02d", (int)bys[i])+"-"); + } + else if(i==3){ + s.append(String.format("%02d", (int)bys[i])); + } + else{ + s.append(String.format("%02d", (int)bys[i])+":"); + } + } + return s.toString(); + } + + /** + * 设备信息 + * @return + */ + public static String formatDeviceInfo(BackBytes99 model){ + String macAddress = ByteUtil.bytesToHexString(model.getSrc()); + String wendu = (float)model.getWendu()/10f+"℃"; + String low_wendu = (float)model.getLow_wendu()/10f+"℃"; + String height_wendu = (float)model.getHigh_wendu()/10f+"℃"; + String warn_onoff = String.valueOf(model.getWarn_onoff()); + String onff1 = String.valueOf(model.getOnoff1()); + String onff2 = String.valueOf(model.getOnoff2()); + String onff3 = String.valueOf(model.getOnoff3()); + String timer_time1 = BytesToTimer(model.getTimer_time1()); + String timer_time2 = BytesToTimer(model.getTimer_time2()); + String timer_time3 = BytesToTimer(model.getTimer_time3()); + String timer_time4 = BytesToTimer(model.getTimer_time4()); + String timer_time5 = BytesToTimer(model.getTimer_time5()); + String timer_time6 = BytesToTimer(model.getTimer_time6()); + String timer_time7 = BytesToTimer(model.getTimer_time7()); + String timer_time8 = BytesToTimer(model.getTimer_time8()); + String timer_time9 = BytesToTimer(model.getTimer_time9()); + JSONObject json = new JSONObject(); + try { + json.put("macAddress", macAddress); + json.put("wendu", wendu); + json.put("low_wendu", low_wendu); + json.put("height_wendu", height_wendu); + json.put("warn_onoff", warn_onoff); + json.put("onff1", onff1); + json.put("onff2", onff2); + json.put("onff3", onff3); + json.put("timer_time1", timer_time1); + json.put("timer_time2", timer_time2); + json.put("timer_time3", timer_time3); + json.put("timer_time4", timer_time4); + json.put("timer_time5", timer_time5); + json.put("timer_time6", timer_time6); + json.put("timer_time7", timer_time7); + json.put("timer_time8", timer_time8); + json.put("timer_time9", timer_time9); + } catch (JSONException e) { + e.printStackTrace(); + } + return json.toString(); + } +} diff --git a/src/main/java/com/ifish/util/CRC16.java b/src/main/java/com/ifish/util/CRC16.java new file mode 100644 index 0000000..cec73d1 --- /dev/null +++ b/src/main/java/com/ifish/util/CRC16.java @@ -0,0 +1,88 @@ +package com.ifish.util; + +/** + * CRC16相关计算 + + * encode: utf-8 + * + * @author trb + * @date 2014-12-25 + */ +public class CRC16 { + static byte[] crc16_tab_h = { (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, + (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, + (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, + (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, + (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x01, (byte) 0xC0, (byte) 0x80, (byte) 0x41, (byte) 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40 }; + + static byte[] crc16_tab_l = { (byte) 0x00, (byte) 0xC0, (byte) 0xC1, (byte) 0x01, (byte) 0xC3, (byte) 0x03, (byte) 0x02, (byte) 0xC2, (byte) 0xC6, (byte) 0x06, (byte) 0x07, (byte) 0xC7, (byte) 0x05, (byte) 0xC5, (byte) 0xC4, (byte) 0x04, (byte) 0xCC, (byte) 0x0C, (byte) 0x0D, (byte) 0xCD, (byte) 0x0F, (byte) 0xCF, (byte) 0xCE, (byte) 0x0E, (byte) 0x0A, (byte) 0xCA, (byte) 0xCB, (byte) 0x0B, (byte) 0xC9, (byte) 0x09, (byte) 0x08, (byte) 0xC8, (byte) 0xD8, (byte) 0x18, (byte) 0x19, (byte) 0xD9, (byte) 0x1B, (byte) 0xDB, (byte) 0xDA, (byte) 0x1A, (byte) 0x1E, (byte) 0xDE, (byte) 0xDF, (byte) 0x1F, (byte) 0xDD, (byte) 0x1D, (byte) 0x1C, (byte) 0xDC, (byte) 0x14, (byte) 0xD4, (byte) 0xD5, (byte) 0x15, (byte) 0xD7, (byte) 0x17, (byte) 0x16, (byte) 0xD6, (byte) 0xD2, (byte) 0x12, + (byte) 0x13, (byte) 0xD3, (byte) 0x11, (byte) 0xD1, (byte) 0xD0, (byte) 0x10, (byte) 0xF0, (byte) 0x30, (byte) 0x31, (byte) 0xF1, (byte) 0x33, (byte) 0xF3, (byte) 0xF2, (byte) 0x32, (byte) 0x36, (byte) 0xF6, (byte) 0xF7, (byte) 0x37, (byte) 0xF5, (byte) 0x35, (byte) 0x34, (byte) 0xF4, (byte) 0x3C, (byte) 0xFC, (byte) 0xFD, (byte) 0x3D, (byte) 0xFF, (byte) 0x3F, (byte) 0x3E, (byte) 0xFE, (byte) 0xFA, (byte) 0x3A, (byte) 0x3B, (byte) 0xFB, (byte) 0x39, (byte) 0xF9, (byte) 0xF8, (byte) 0x38, (byte) 0x28, (byte) 0xE8, (byte) 0xE9, (byte) 0x29, (byte) 0xEB, (byte) 0x2B, (byte) 0x2A, (byte) 0xEA, (byte) 0xEE, (byte) 0x2E, (byte) 0x2F, (byte) 0xEF, (byte) 0x2D, (byte) 0xED, (byte) 0xEC, (byte) 0x2C, (byte) 0xE4, (byte) 0x24, (byte) 0x25, (byte) 0xE5, (byte) 0x27, (byte) 0xE7, + (byte) 0xE6, (byte) 0x26, (byte) 0x22, (byte) 0xE2, (byte) 0xE3, (byte) 0x23, (byte) 0xE1, (byte) 0x21, (byte) 0x20, (byte) 0xE0, (byte) 0xA0, (byte) 0x60, (byte) 0x61, (byte) 0xA1, (byte) 0x63, (byte) 0xA3, (byte) 0xA2, (byte) 0x62, (byte) 0x66, (byte) 0xA6, (byte) 0xA7, (byte) 0x67, (byte) 0xA5, (byte) 0x65, (byte) 0x64, (byte) 0xA4, (byte) 0x6C, (byte) 0xAC, (byte) 0xAD, (byte) 0x6D, (byte) 0xAF, (byte) 0x6F, (byte) 0x6E, (byte) 0xAE, (byte) 0xAA, (byte) 0x6A, (byte) 0x6B, (byte) 0xAB, (byte) 0x69, (byte) 0xA9, (byte) 0xA8, (byte) 0x68, (byte) 0x78, (byte) 0xB8, (byte) 0xB9, (byte) 0x79, (byte) 0xBB, (byte) 0x7B, (byte) 0x7A, (byte) 0xBA, (byte) 0xBE, (byte) 0x7E, (byte) 0x7F, (byte) 0xBF, (byte) 0x7D, (byte) 0xBD, (byte) 0xBC, (byte) 0x7C, (byte) 0xB4, (byte) 0x74, + (byte) 0x75, (byte) 0xB5, (byte) 0x77, (byte) 0xB7, (byte) 0xB6, (byte) 0x76, (byte) 0x72, (byte) 0xB2, (byte) 0xB3, (byte) 0x73, (byte) 0xB1, (byte) 0x71, (byte) 0x70, (byte) 0xB0, (byte) 0x50, (byte) 0x90, (byte) 0x91, (byte) 0x51, (byte) 0x93, (byte) 0x53, (byte) 0x52, (byte) 0x92, (byte) 0x96, (byte) 0x56, (byte) 0x57, (byte) 0x97, (byte) 0x55, (byte) 0x95, (byte) 0x94, (byte) 0x54, (byte) 0x9C, (byte) 0x5C, (byte) 0x5D, (byte) 0x9D, (byte) 0x5F, (byte) 0x9F, (byte) 0x9E, (byte) 0x5E, (byte) 0x5A, (byte) 0x9A, (byte) 0x9B, (byte) 0x5B, (byte) 0x99, (byte) 0x59, (byte) 0x58, (byte) 0x98, (byte) 0x88, (byte) 0x48, (byte) 0x49, (byte) 0x89, (byte) 0x4B, (byte) 0x8B, (byte) 0x8A, (byte) 0x4A, (byte) 0x4E, (byte) 0x8E, (byte) 0x8F, (byte) 0x4F, (byte) 0x8D, (byte) 0x4D, + (byte) 0x4C, (byte) 0x8C, (byte) 0x44, (byte) 0x84, (byte) 0x85, (byte) 0x45, (byte) 0x87, (byte) 0x47, (byte) 0x46, (byte) 0x86, (byte) 0x82, (byte) 0x42, (byte) 0x43, (byte) 0x83, (byte) 0x41, (byte) 0x81, (byte) 0x80, (byte) 0x40 }; + + /** + * 计算CRC16校验 + * + * @param data + * 需要计算的数组 + * @return CRC16校验值 + */ + public static boolean calcCrc16(byte[] data) { + byte[] b = new byte[2]; + int length = data.length; + int begin = length-2; + for (int i = begin; i < data.length; i++) { + b[i-begin]=data[i]; + } + return ByteUtil.bytesToHexString(b).equals(String.format("%04x", calcCrc16(data, 0, data.length-2))); + } + + /** + * 计算CRC16校验 + * + * @param data + * 需要计算的数组 + * @param offset + * 起始位置 + * @param len + * 长度 + * @return CRC16校验值 + */ + public static int calcCrc16(byte[] data, int offset, int len) { + return calcCrc16(data, offset, len, 0xffff); + } + + /** + * 计算CRC16校验 + * + * @param data + * 需要计算的数组 + * @param offset + * 起始位置 + * @param len + * 长度 + * @param preval + * 之前的校验值 + * @return CRC16校验值 + */ + public static int calcCrc16(byte[] data, int offset, int len, int preval) { + int ucCRCHi = (preval & 0xff00) >> 8; + int ucCRCLo = preval & 0x00ff; + int iIndex; + for (int i = 0; i < len; ++i) { + iIndex = (ucCRCLo ^ data[offset + i]) & 0x00ff; + ucCRCLo = ucCRCHi ^ crc16_tab_h[iIndex]; + ucCRCHi = crc16_tab_l[iIndex]; + } + return ((ucCRCHi & 0x00ff) << 8) | (ucCRCLo & 0x00ff) & 0xffff; + } + + // 测试 + public static void main(String[] args) { + // 0x02 05 00 03 FF 00 , crc16=7C 09 + boolean bln = CRC16.calcCrc16(ByteUtil.hexStringToBytes("00 01 5C CF 7F 09 58 29 00 00 00 00 00 08 18 0A 0B 01 C0 A8 3D A2 2D 0C")); + System.out.println(bln); + } +} + diff --git a/src/main/java/com/ifish/util/IfishUtil.java b/src/main/java/com/ifish/util/IfishUtil.java new file mode 100644 index 0000000..83657de --- /dev/null +++ b/src/main/java/com/ifish/util/IfishUtil.java @@ -0,0 +1,116 @@ +package com.ifish.util; + +import java.security.MessageDigest; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + +public class IfishUtil { + + private static final String formatDate ="yyyy-MM-dd HH:mm:ss"; + + private static final String formatDate1 ="yyyy-MM-dd"; + + /** + * 格式化日期yyyy-MM-dd HH:mm:ss + * @param date + * @return + */ + public static String format(Date date){ + SimpleDateFormat format = new SimpleDateFormat(formatDate); + return format.format(date); + } + + /** + * 字符串转换成日期 + * @param str + * @return date + */ + public static Date StrToDate(String str) { + SimpleDateFormat format = new SimpleDateFormat(formatDate1); + Date date = null; + try { + date = format.parse(str); + } catch (ParseException e) { + e.printStackTrace(); + } + return date; + } + + /** + * 随机生成字母与数字组合 + * @param length + * @return + */ + public static String getCharAndNumr(int length) { + String val = ""; + Random random = new Random(); + for (int i = 0; i < length; i++) { + // 输出字母还是数字 + String charOrNum = random.nextInt(2) % 2 == 0 ? "char" : "num"; + // 字符串 + if ("char".equalsIgnoreCase(charOrNum)) { + // 取得大写字母还是小写字母 + int choice = random.nextInt(2) % 2 == 0 ? 65 : 97; + val += (char) (choice + random.nextInt(26)); + // 数字 + } else if ("num".equalsIgnoreCase(charOrNum)) { + val += String.valueOf(random.nextInt(10)); + } + } + return val; + } + /** + * MD5实现方法 + * @param str + * @return + */ + public static String GetMD5(String str) { + MessageDigest md5 = null; + try { + md5 = MessageDigest.getInstance("MD5"); + } catch (Exception e) { + e.printStackTrace(); + return ""; + } + char[] charArray = str.toCharArray(); + byte[] byteArray = new byte[charArray.length]; + + for (int i = 0; i < charArray.length; i++) { + byteArray[i] = (byte) charArray[i]; + } + byte[] md5Bytes = md5.digest(byteArray); + StringBuffer hexValue = new StringBuffer(); + for (int i = 0; i < md5Bytes.length; i++) { + int val = ((int) md5Bytes[i]) & 0xff; + if (val < 16) { + hexValue.append("0"); + } + hexValue.append(Integer.toHexString(val)); + } + return hexValue.toString(); + } + /** + * 返回json数据 + * @param str + * @return + */ + public static Object returnJson(String key,Object value) { + Map map = new HashMap(); + try { + map.put("result", key); + if(value.equals("")){ + map.put("data", null); + } + else{ + map.put("data", value); + } + } catch (Exception e) { + e.printStackTrace(); + } + return map; + } +} diff --git a/src/main/java/com/ifish/webService/MyService.java b/src/main/java/com/ifish/webService/MyService.java new file mode 100644 index 0000000..d85b318 --- /dev/null +++ b/src/main/java/com/ifish/webService/MyService.java @@ -0,0 +1,47 @@ +package com.ifish.webService; + +import javax.jws.WebService; + +import org.apache.mina.core.session.IoSession; + +import com.ifish.socketNew.SomeServer; +import com.ifish.socketNew.model.send.OrderFunctionCode15; +import com.ifish.socketNew.util.OrderModel; +import com.ifish.util.ByteUtil; + +@WebService +public class MyService { + + //查询设备是否在线 + public boolean deviceIsOnline(String macAddress){ + if(macAddress!=null && macAddress.length()>0){ + IoSession session = SomeServer.sessions_cz.get(macAddress); + if(session!=null){ + if(session.getRemoteAddress()!=null){ + return true; + } + } + } + return false; + } + + //查询在线设备数量 + public Integer getLineDeviceNumber(){ + return SomeServer.sessions_cz.size(); + } + + //在线升级 + public boolean onlineUpgrade(String macAddress,Integer upgradeVersion){ + if(macAddress!=null && macAddress.length()>0 && upgradeVersion!=null){ + IoSession session = SomeServer.sessions_cz.get(macAddress); + if(session!=null){ + if(session.getRemoteAddress()!=null){ + OrderFunctionCode15 model = OrderModel.OrderFunctionCode15(ByteUtil.hexStringToBytes2(macAddress),upgradeVersion); + session.write(model); + return true; + } + } + } + return false; + } +} diff --git a/src/main/java/com/ifish/webService/ServiceBean.java b/src/main/java/com/ifish/webService/ServiceBean.java new file mode 100644 index 0000000..f5de9c6 --- /dev/null +++ b/src/main/java/com/ifish/webService/ServiceBean.java @@ -0,0 +1,9 @@ +package com.ifish.webService; + +import javax.xml.ws.Endpoint; + +public class ServiceBean { + public ServiceBean() { + Endpoint.publish("http://localhost:9001/Service/webService", new MyService()); + } +} diff --git a/src/main/resources/application-context.xml b/src/main/resources/application-context.xml new file mode 100644 index 0000000..b61f8d7 --- /dev/null +++ b/src/main/resources/application-context.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + classpath:/com/ifish/entity/hbm/*.hbm.xml + + + + + ${hibernate.dialect} + ${hibernate.show_sql} + ${hibernate.format_sql} + ${hibernate.hbm2ddl.auto} + ${hibernate.query.substitutions} + ${"hibernate.jdbc.batch_size"} + ${hibernate.cache.use_second_level_cache} + ${hibernate.cache.use_query_cache} + ${hibernate.cache.region.factory_class} + + + + + + + + + + + + + + + + + + ${netease.appKey} + + + + ${netease.appSecret} + + + \ No newline at end of file diff --git a/src/main/resources/jPpush.properties b/src/main/resources/jPpush.properties new file mode 100644 index 0000000..362ee70 --- /dev/null +++ b/src/main/resources/jPpush.properties @@ -0,0 +1,16 @@ +#\u6781\u5149\u63a8\u9001 +#appKey +jpush.android.appKey=d970d5e193cb2a0bbe41653c +#secret +jpush.android.secret=60162c8cf195ce9f4dc76629 +#production +jpush.android.productionMode=true +#appKey +jpush.ios.appKey=d147124018074eb970474e48 +#secret +jpush.ios.secret=a7d41825e75082b13675c326 +#production +jpush.ios.productionMode=true +#\u4e91\u4fe1IM +netease.appKey=87b0e3315dfc2df08060bcb54246da68 +netease.appSecret=e62f6c247b46 diff --git a/src/main/resources/jdbc.properties b/src/main/resources/jdbc.properties new file mode 100644 index 0000000..2b2d014 --- /dev/null +++ b/src/main/resources/jdbc.properties @@ -0,0 +1,32 @@ +c3p0.driverClassName=com.mysql.jdbc.Driver +c3p0.url=jdbc\:mysql\://localhost\:3306/myfishdb?characterEncoding\=UTF-8 +c3p0.username=ifish +c3p0.password=ifish7pwd +#c3p0.username=root +#c3p0.password=123456 + +c3p0.autoCommitOnClose=true +c3p0.initialPoolSize=20 +c3p0.minPoolSize=20 +c3p0.maxPoolSize=100 +c3p0.acquireIncrement=3 + +c3p0.checkoutTimeout=5000 +c3p0.maxIdleTime=7200 +c3p0.idleConnectionTestPeriod=18000 +#c3p0.maxIdleTimeExcessConnections=1800 + +#c3p0.automaticTestTable=C3P0TestTable +#c3p0.testConnectionOnCheckout=false +#c3p0.testConnectionOnCheckin=false + +#org.hibernate.dialect.MySQLInnoDBDialect +hibernate.dialect=org.hibernate.dialect.MySQLDialect +hibernate.show_sql=false +hibernate.format_sql=true +hibernate.hbm2ddl.auto=false +hibernate.jdbc.batch_size=50 +hibernate.query.substitutions=true 1,false 0 +hibernate.cache.use_second_level_cache=false +hibernate.cache.use_query_cache=false +hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory \ No newline at end of file diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml new file mode 100644 index 0000000..a3d95ff --- /dev/null +++ b/src/main/resources/logback.xml @@ -0,0 +1,64 @@ + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} 【%-5level】 【%logger{50}】 %msg%n + GBK + + + + + + ${LOG_HOME}/ifishSocket/online.log + + ${LOG_HOME}/ifishSocket/%d{yyyy-MM-dd}_online.log + 30 + + 100MB + + + + %d{yyyy-MM-dd HH:mm:ss} 【%-5level】 【%logger{50}】 %msg%n + UTF-8 + + + WARN + + + + + + ${LOG_HOME}/ifishSocket/socket.log + + ${LOG_HOME}/ifishSocket/%d{yyyy-MM-dd}_socket.log + 30 + + 100MB + + + + %d{yyyy-MM-dd HH:mm:ss} 【%-5level】 【%logger{50}】 %msg%n + UTF-8 + + + WARN + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mina.xml b/src/main/resources/mina.xml new file mode 100644 index 0000000..87cdc05 --- /dev/null +++ b/src/main/resources/mina.xml @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + ${ifish.ip} + + + ${ifish.port} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/property.properties b/src/main/resources/property.properties new file mode 100644 index 0000000..9fae2d4 --- /dev/null +++ b/src/main/resources/property.properties @@ -0,0 +1,8 @@ +#\u672c\u5730 +ifish.ip=192.168.61.128 +#\u6d4b\u8bd5\u4e91 +#ifish.ip=139.196.24.156 +#\u6b63\u5f0f\u4e91 +#ifish.ip=120.55.190.56 +#\u670d\u52a1\u5668\u7aef\u53e3 +ifish.port=9955 \ No newline at end of file diff --git a/src/main/webapp/META-INF/MANIFEST.MF b/src/main/webapp/META-INF/MANIFEST.MF new file mode 100644 index 0000000..254272e --- /dev/null +++ b/src/main/webapp/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Class-Path: + diff --git a/src/main/webapp/META-INF/context.xml b/src/main/webapp/META-INF/context.xml new file mode 100644 index 0000000..5bee3dc --- /dev/null +++ b/src/main/webapp/META-INF/context.xml @@ -0,0 +1,2 @@ + + diff --git a/src/main/webapp/WEB-INF/lib/mysql-connector-5.1.8.jar b/src/main/webapp/WEB-INF/lib/mysql-connector-5.1.8.jar new file mode 100644 index 0000000..5a7c6fb Binary files /dev/null and b/src/main/webapp/WEB-INF/lib/mysql-connector-5.1.8.jar differ diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..7bd141f --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,20 @@ + + + Archetype Created Web Application + + + index.jsp + + + + contextConfigLocation + + classpath:application-context.xml + classpath:mina.xml + + + + org.springframework.web.context.ContextLoaderListener + + + diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp new file mode 100644 index 0000000..99ce2c8 --- /dev/null +++ b/src/main/webapp/index.jsp @@ -0,0 +1,11 @@ +<%@ page language="java" pageEncoding="utf-8"%> + + + + 首页 + + + +

访问正常!

+ +