commit f557cca7cccdc1f7ae0cffc3ee4fcb10152fbf8b
Author: 谢洪龙 <599179587@qq.com>
Date: Thu Jul 6 18:12:01 2017 +0800
Socket项目
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/nb-configuration.xml b/nb-configuration.xml
new file mode 100644
index 0000000..99174dc
--- /dev/null
+++ b/nb-configuration.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+ 1.6-web
+ Tomcat
+
+
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..80dba0b
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,227 @@
+
+ 4.0.0
+
+ com.ifish
+ IfishSocketEnglish
+ 1.0
+ war
+
+ IfishSocketEnglish
+
+
+ ${project.build.directory}/endorsed
+ UTF-8
+
+
+
+
+
+ com.sun.xml.ws
+ jaxws-tools
+ 2.2.10
+ pom
+
+
+
+ org.json
+ json
+ 20170516
+
+
+
+ org.apache.mina
+ mina-core
+ 2.0.16
+
+
+
+ org.quartz-scheduler
+ quartz
+ 2.3.0
+
+
+
+ org.csource
+ fastdfs-client-java
+ 1.25
+ system
+ ${basedir}/src/main/webapp/WEB-INF/lib/fastdfs-client-java-1.25.jar
+
+
+ cn.jpush.api
+ jpush-client
+ 3.2.17
+
+
+ org.apache.commons
+ commons-lang3
+ 3.5
+ jar
+
+
+ org.codehaus.jackson
+ jackson-mapper-asl
+ 1.9.13
+ jar
+
+
+ com.alibaba
+ fastjson
+ 1.2.28
+ jar
+
+
+ org.springframework.data
+ spring-data-redis
+ 1.8.4.RELEASE
+ jar
+
+
+ org.apache.commons
+ commons-pool2
+ 2.4.2
+ jar
+
+
+ redis.clients
+ jedis
+ 2.9.0
+ jar
+
+
+ c3p0
+ c3p0
+ 0.9.1.2
+ jar
+
+
+ javax
+ javaee-web-api
+ 6.0
+ provided
+
+
+
+ org.springframework
+ spring-context
+ 4.3.9.RELEASE
+
+
+
+ org.springframework
+ spring-beans
+ 4.3.9.RELEASE
+
+
+
+ org.springframework
+ spring-core
+ 4.3.9.RELEASE
+
+
+
+ org.springframework
+ spring-web
+ 4.3.9.RELEASE
+
+
+
+ org.springframework
+ spring-webmvc
+ 4.3.8.RELEASE
+ jar
+
+
+
+ org.springframework
+ spring-jdbc
+ 4.3.9.RELEASE
+
+
+
+ org.mybatis
+ mybatis
+ 3.4.4
+
+
+
+ org.mybatis
+ mybatis-spring
+ 1.3.1
+
+
+ cn.jpush.api
+ jiguang-common
+ 1.0.3
+
+
+ io.netty
+ netty-all
+ 4.1.6.Final
+ compile
+
+
+ com.google.code.gson
+ gson
+ 2.3
+
+
+ org.slf4j
+ slf4j-api
+ 1.7.13
+ jar
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 2.3.2
+
+ 1.6
+ 1.6
+
+ ${endorsed.dir}
+
+
+
+
+ org.apache.maven.plugins
+ maven-war-plugin
+ 2.1.1
+
+ false
+
+
+
+ org.apache.maven.plugins
+ maven-dependency-plugin
+ 2.1
+
+
+ validate
+
+ copy
+
+
+ ${endorsed.dir}
+ true
+
+
+ javax
+ javaee-endorsed-api
+ 6.0
+ jar
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main/java/com/ifish/bean/LoginRecord.java b/src/main/java/com/ifish/bean/LoginRecord.java
new file mode 100644
index 0000000..46f9eb2
--- /dev/null
+++ b/src/main/java/com/ifish/bean/LoginRecord.java
@@ -0,0 +1,49 @@
+/*
+ * 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.bean;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ *
+ * @author Administrator
+ */
+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/bean/Tbl_Device.java b/src/main/java/com/ifish/bean/Tbl_Device.java
new file mode 100644
index 0000000..ffcb840
--- /dev/null
+++ b/src/main/java/com/ifish/bean/Tbl_Device.java
@@ -0,0 +1,508 @@
+/*
+ * 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.bean;
+
+import java.util.Date;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * 设备详情表(tbl_device)
+ *
+ * @author Administrator
+ */
+@Entity
+@Table(name = "tbl_device")
+public class Tbl_Device implements java.io.Serializable {
+
+ /**
+ * 版本号
+ */
+ private static final long serialVersionUID = 3405700970095511149L;
+
+ /**
+ * 设备Id
+ */
+ @Id
+ @Column(name = "device_id", unique = true, nullable = false, length = 10)
+ private Integer deviceId;
+
+ /**
+ * 服务器IP
+ */
+ @Column(name = "server_ip", nullable = true, length = 50)
+ private String serverIp;
+
+ /**
+ * 设备IP
+ */
+ @Column(name = "device_ip", nullable = true, length = 50)
+ private String deviceIp;
+
+ /**
+ * 是否为摄像头:1是,0否
+ */
+ @Column(name = "is_camera", nullable = true, length = 1)
+ private String isCamera;
+
+ /**
+ * 设备Mac地址
+ */
+ @Column(name = "mac_address", unique = true, nullable = true, length = 50)
+ private String macAddress;
+
+ /**
+ * 登陆时间
+ */
+ @Column(name = "login_time", nullable = true)
+ private Date loginTime;
+
+ /**
+ * 是否在黑名单:1不在、0在
+ */
+ @Column(name = "is_blacklist", nullable = true, length = 1)
+ private String isBlacklist;
+
+ /**
+ * 设备型号
+ */
+ @Column(name = "hardware_type", nullable = true, length = 10)
+ private String hardwareType;
+
+ /**
+ * 是否推送
+ */
+ @Column(name = "on_off", nullable = true, length = 1)
+ private String onOff;
+
+ /**
+ * 今天是否提醒:1提醒、0不提醒
+ */
+ @Column(name = "today_remind", nullable = true, length = 1)
+ private String todayRemind;
+
+ /**
+ * 是否开启换水提醒:1开启、0不开启
+ */
+ @Column(name = "water_remind", nullable = true, length = 1)
+ private String waterRemind;
+
+ /**
+ * 换水提醒日期
+ */
+ @Column(name = "remind_date", nullable = true)
+ private Date remindDate;
+
+ /**
+ * 换水周期
+ */
+ @Column(name = "remind_cycle", nullable = true, length = 10)
+ private Integer remindCycle;
+
+ /**
+ * 电子厂代码
+ */
+ @Column(name = "factory_code", nullable = true, length = 20)
+ private String factoryCode;
+
+ /**
+ * 鱼缸场代码
+ */
+ @Column(name = "brand_code", nullable = true, length = 20)
+ private String brandCode;
+
+ /**
+ * 摄像头ID
+ */
+ @Column(name = "camera_id", nullable = true, length = 20)
+ private String cameraId;
+
+ /**
+ * 创建时间
+ */
+ @Column(name = "create_time", nullable = true)
+ private Date createTime;
+
+ /**
+ * 摄像头激活码
+ */
+ @Column(name = "active_code", nullable = true, length = 50)
+ private String activeCode;
+
+ /**
+ * 摄像头激活时间
+ */
+ @Column(name = "active_time", nullable = true)
+ private Date activeTime;
+
+ /**
+ * 修改时间
+ */
+ @Column(name = "update_time", nullable = true)
+ private Date updateTime;
+
+ /**
+ * 获取设备Id
+ *
+ * @return 设备Id
+ */
+ public Integer getDeviceId() {
+ return this.deviceId;
+ }
+
+ /**
+ * 设置设备Id
+ *
+ * @param deviceId 设备Id
+ */
+ public void setDeviceId(Integer deviceId) {
+ this.deviceId = deviceId;
+ }
+
+ /**
+ * 获取服务器IP
+ *
+ * @return 服务器IP
+ */
+ public String getServerIp() {
+ return this.serverIp;
+ }
+
+ /**
+ * 设置服务器IP
+ *
+ * @param serverIp 服务器IP
+ */
+ public void setServerIp(String serverIp) {
+ this.serverIp = serverIp;
+ }
+
+ /**
+ * 获取设备IP
+ *
+ * @return 设备IP
+ */
+ public String getDeviceIp() {
+ return this.deviceIp;
+ }
+
+ /**
+ * 设置设备IP
+ *
+ * @param deviceIp 设备IP
+ */
+ public void setDeviceIp(String deviceIp) {
+ this.deviceIp = deviceIp;
+ }
+
+ /**
+ * 获取是否为摄像头:1是,0否
+ *
+ * @return 是否为摄像头:1是
+ */
+ public String getIsCamera() {
+ return this.isCamera;
+ }
+
+ /**
+ * 设置是否为摄像头:1是,0否
+ *
+ * @param isCamera 是否为摄像头:1是,0否
+ */
+ public void setIsCamera(String isCamera) {
+ this.isCamera = isCamera;
+ }
+
+ /**
+ * 获取设备Mac地址
+ *
+ * @return 设备Mac地址
+ */
+ public String getMacAddress() {
+ return this.macAddress;
+ }
+
+ /**
+ * 设置设备Mac地址
+ *
+ * @param macAddress 设备Mac地址
+ */
+ public void setMacAddress(String macAddress) {
+ this.macAddress = macAddress;
+ }
+
+ /**
+ * 获取登陆时间
+ *
+ * @return 登陆时间
+ */
+ public Date getLoginTime() {
+ return this.loginTime;
+ }
+
+ /**
+ * 设置登陆时间
+ *
+ * @param loginTime 登陆时间
+ */
+ public void setLoginTime(Date loginTime) {
+ this.loginTime = loginTime;
+ }
+
+ /**
+ * 获取是否在黑名单:1不在、0在
+ *
+ * @return 是否在黑名单
+ */
+ public String getIsBlacklist() {
+ return this.isBlacklist;
+ }
+
+ /**
+ * 设置是否在黑名单:1不在、0在
+ *
+ * @param isBlacklist 是否在黑名单:1不在、0在
+ */
+ public void setIsBlacklist(String isBlacklist) {
+ this.isBlacklist = isBlacklist;
+ }
+
+ /**
+ * 获取设备型号
+ *
+ * @return 设备型号
+ */
+ public String getHardwareType() {
+ return this.hardwareType;
+ }
+
+ /**
+ * 设置设备型号
+ *
+ * @param hardwareType 设备型号
+ */
+ public void setHardwareType(String hardwareType) {
+ this.hardwareType = hardwareType;
+ }
+
+ /**
+ * 获取是否推送
+ *
+ * @return 是否推送
+ */
+ public String getOnOff() {
+ return this.onOff;
+ }
+
+ /**
+ * 设置是否推送
+ *
+ * @param onOff 是否推送
+ */
+ public void setOnOff(String onOff) {
+ this.onOff = onOff;
+ }
+
+ /**
+ * 获取今天是否提醒:1提醒、0不提醒
+ *
+ * @return 今天是否提醒
+ */
+ public String getTodayRemind() {
+ return this.todayRemind;
+ }
+
+ /**
+ * 设置今天是否提醒:1提醒、0不提醒
+ *
+ * @param todayRemind 今天是否提醒:1提醒、0不提醒
+ */
+ public void setTodayRemind(String todayRemind) {
+ this.todayRemind = todayRemind;
+ }
+
+ /**
+ * 获取是否开启换水提醒:1开启、0不开启
+ *
+ * @return 是否开启换水提醒
+ */
+ public String getWaterRemind() {
+ return this.waterRemind;
+ }
+
+ /**
+ * 设置是否开启换水提醒:1开启、0不开启
+ *
+ * @param waterRemind 是否开启换水提醒:1开启、0不开启
+ */
+ public void setWaterRemind(String waterRemind) {
+ this.waterRemind = waterRemind;
+ }
+
+ /**
+ * 获取换水提醒日期
+ *
+ * @return 换水提醒日期
+ */
+ public Date getRemindDate() {
+ return this.remindDate;
+ }
+
+ /**
+ * 设置换水提醒日期
+ *
+ * @param remindDate 换水提醒日期
+ */
+ public void setRemindDate(Date remindDate) {
+ this.remindDate = remindDate;
+ }
+
+ /**
+ * 获取换水周期
+ *
+ * @return 换水周期
+ */
+ public Integer getRemindCycle() {
+ return this.remindCycle;
+ }
+
+ /**
+ * 设置换水周期
+ *
+ * @param remindCycle 换水周期
+ */
+ public void setRemindCycle(Integer remindCycle) {
+ this.remindCycle = remindCycle;
+ }
+
+ /**
+ * 获取电子厂代码
+ *
+ * @return 电子厂代码
+ */
+ public String getFactoryCode() {
+ return this.factoryCode;
+ }
+
+ /**
+ * 设置电子厂代码
+ *
+ * @param factoryCode 电子厂代码
+ */
+ public void setFactoryCode(String factoryCode) {
+ this.factoryCode = factoryCode;
+ }
+
+ /**
+ * 获取鱼缸场代码
+ *
+ * @return 鱼缸场代码
+ */
+ public String getBrandCode() {
+ return this.brandCode;
+ }
+
+ /**
+ * 设置鱼缸场代码
+ *
+ * @param brandCode 鱼缸场代码
+ */
+ public void setBrandCode(String brandCode) {
+ this.brandCode = brandCode;
+ }
+
+ /**
+ * 获取摄像头ID
+ *
+ * @return 摄像头ID
+ */
+ public String getCameraId() {
+ return this.cameraId;
+ }
+
+ /**
+ * 设置摄像头ID
+ *
+ * @param cameraId 摄像头ID
+ */
+ public void setCameraId(String cameraId) {
+ this.cameraId = cameraId;
+ }
+
+ /**
+ * 获取创建时间
+ *
+ * @return 创建时间
+ */
+ public Date getCreateTime() {
+ return this.createTime;
+ }
+
+ /**
+ * 设置创建时间
+ *
+ * @param createTime 创建时间
+ */
+ public void setCreateTime(Date createTime) {
+ this.createTime = createTime;
+ }
+
+ /**
+ * 获取摄像头激活码
+ *
+ * @return 摄像头激活码
+ */
+ public String getActiveCode() {
+ return this.activeCode;
+ }
+
+ /**
+ * 设置摄像头激活码
+ *
+ * @param activeCode 摄像头激活码
+ */
+ public void setActiveCode(String activeCode) {
+ this.activeCode = activeCode;
+ }
+
+ /**
+ * 获取摄像头激活时间
+ *
+ * @return 摄像头激活时间
+ */
+ public Date getActiveTime() {
+ return this.activeTime;
+ }
+
+ /**
+ * 设置摄像头激活时间
+ *
+ * @param activeTime 摄像头激活时间
+ */
+ public void setActiveTime(Date activeTime) {
+ this.activeTime = activeTime;
+ }
+
+ /**
+ * 获取修改时间
+ *
+ * @return 修改时间
+ */
+ public Date getUpdateTime() {
+ return this.updateTime;
+ }
+
+ /**
+ * 设置修改时间
+ *
+ * @param updateTime 修改时间
+ */
+ public void setUpdateTime(Date updateTime) {
+ this.updateTime = updateTime;
+ }
+}
diff --git a/src/main/java/com/ifish/bean/Tbl_Device_Statistics.java b/src/main/java/com/ifish/bean/Tbl_Device_Statistics.java
new file mode 100644
index 0000000..a5df6aa
--- /dev/null
+++ b/src/main/java/com/ifish/bean/Tbl_Device_Statistics.java
@@ -0,0 +1,630 @@
+/*
+ * 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.bean;
+
+import java.util.Date;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * 设备统计信息表(tbl_device_statistics)
+ *
+ * @author bianj
+ * @version 1.0.0 2017-06-29
+ */
+@Entity
+@Table(name = "tbl_device_statistics")
+public class Tbl_Device_Statistics implements java.io.Serializable {
+
+ /**
+ * 版本号
+ */
+ private static final long serialVersionUID = 1215383532220649875L;
+
+ /**
+ * id
+ */
+ @Id
+ @Column(name = "id", unique = true, nullable = false, length = 10)
+ private Integer id;
+
+ /**
+ * 设备ID
+ */
+ @Id
+ @Column(name = "device_id", unique = true, nullable = false, length = 10)
+ private Integer deviceId;
+
+ /**
+ * 设备MAC地址
+ */
+ @Column(name = "mac_address", nullable = true, length = 50)
+ private String macAddress;
+
+ /**
+ * 登陆次数
+ */
+ @Column(name = "login_count", nullable = true, length = 11)
+ private int loginCount;
+
+ /**
+ * 最后登陆时间
+ */
+ @Column(name = "login_time", nullable = true)
+ private Date loginTime;
+
+ /**
+ * 首次激活时间
+ */
+ @Column(name = "first_activate", nullable = true)
+ private Date firstActivate;
+
+ /**
+ * 创建时间
+ */
+ @Column(name = "create_time", nullable = true)
+ private Date createTime;
+
+ /**
+ * 是否收费
+ */
+ @Column(name = "is_charge", nullable = true, length = 1)
+ private String isCharge;
+
+ /**
+ * sdk版本
+ */
+ @Column(name = "sdk_version", nullable = true, length = 10)
+ private String sdkVersion;
+
+ /**
+ * sdk时间
+ */
+ @Column(name = "sdk_time", nullable = true)
+ private Date sdkTime;
+
+ /**
+ * 分配日期
+ */
+ @Column(name = "create_date", nullable = true)
+ private Date createDate;
+
+ /**
+ * 是否升级
+ */
+ @Column(name = "is_upgrade", nullable = true, length = 1)
+ private String isUpgrade;
+
+ /**
+ * 更新版本
+ */
+ @Column(name = "upgrade_version", nullable = true, length = 10)
+ private String upgradeVersion;
+
+ /**
+ * 更新时间
+ */
+ @Column(name = "upgrade_time", nullable = true)
+ private Date upgradeTime;
+
+ /**
+ * 授权时间
+ */
+ @Column(name = "authorize_time", nullable = true)
+ private Date authorizeTime;
+
+ /**
+ * 编号
+ */
+ @Column(name = "create_code", nullable = true, length = 50)
+ private String createCode;
+
+ /**
+ * MCU启动次数
+ */
+ @Column(name = "mcu_count", nullable = true, length = 10)
+ private Integer mcuCount;
+
+ /**
+ * 模块启动次数
+ */
+ @Column(name = "module_count", nullable = true, length = 10)
+ private Integer moduleCount;
+
+ /**
+ * 连接路由器次数
+ */
+ @Column(name = "router_count", nullable = true, length = 10)
+ private Integer routerCount;
+
+ /**
+ * 成功连接服务器次数
+ */
+ @Column(name = "server_count", nullable = true, length = 10)
+ private Integer serverCount;
+
+ /**
+ * 尝试连接服务器次数
+ */
+ @Column(name = "server_try_count", nullable = true, length = 10)
+ private Integer serverTryCount;
+
+ /**
+ * mcu版本
+ */
+ @Column(name = "software_version", nullable = true, length = 10)
+ private String softwareVersion;
+
+ /**
+ * 硬件型号
+ */
+ @Column(name = "hardware_type", nullable = true, length = 10)
+ private String hardwareType;
+
+ /**
+ * 电子厂代码
+ */
+ @Column(name = "factory_code", nullable = true, length = 20)
+ private String factoryCode;
+
+ /**
+ * 鱼缸场代码
+ */
+ @Column(name = "brand_code", nullable = true, length = 20)
+ private String brandCode;
+
+ /**
+ * 获取id
+ *
+ * @return id
+ */
+ public Integer getId() {
+ return this.id;
+ }
+
+ /**
+ * 设置id
+ *
+ * @param id id
+ */
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ /**
+ * 获取设备ID
+ *
+ * @return 设备ID
+ */
+ public Integer getDeviceId() {
+ return this.deviceId;
+ }
+
+ /**
+ * 设置设备ID
+ *
+ * @param deviceId 设备ID
+ */
+ public void setDeviceId(Integer deviceId) {
+ this.deviceId = deviceId;
+ }
+
+ /**
+ * 获取设备MAC地址
+ *
+ * @return 设备MAC地址
+ */
+ public String getMacAddress() {
+ return this.macAddress;
+ }
+
+ /**
+ * 设置设备MAC地址
+ *
+ * @param macAddress 设备MAC地址
+ */
+ public void setMacAddress(String macAddress) {
+ this.macAddress = macAddress;
+ }
+
+ /**
+ * 获取登陆次数
+ *
+ * @return 登陆次数
+ */
+ public Integer getLoginCount() {
+ return this.loginCount;
+ }
+
+ /**
+ * 设置登陆次数
+ *
+ * @param loginCount 登陆次数
+ */
+ public void setLoginCount(Integer loginCount) {
+ this.loginCount = loginCount;
+ }
+
+ /**
+ * 获取最后登陆时间
+ *
+ * @return 最后登陆时间
+ */
+ public Date getLoginTime() {
+ return this.loginTime;
+ }
+
+ /**
+ * 设置最后登陆时间
+ *
+ * @param loginTime 最后登陆时间
+ */
+ public void setLoginTime(Date loginTime) {
+ this.loginTime = loginTime;
+ }
+
+ /**
+ * 获取首次激活时间
+ *
+ * @return 首次激活时间
+ */
+ public Date getFirstActivate() {
+ return this.firstActivate;
+ }
+
+ /**
+ * 设置首次激活时间
+ *
+ * @param firstActivate 首次激活时间
+ */
+ public void setFirstActivate(Date firstActivate) {
+ this.firstActivate = firstActivate;
+ }
+
+ /**
+ * 获取创建时间
+ *
+ * @return 创建时间
+ */
+ public Date getCreateTime() {
+ return this.createTime;
+ }
+
+ /**
+ * 设置创建时间
+ *
+ * @param createTime 创建时间
+ */
+ public void setCreateTime(Date createTime) {
+ this.createTime = createTime;
+ }
+
+ /**
+ * 获取是否收费
+ *
+ * @return 是否收费
+ */
+ public String getIsCharge() {
+ return this.isCharge;
+ }
+
+ /**
+ * 设置是否收费
+ *
+ * @param isCharge 是否收费
+ */
+ public void setIsCharge(String isCharge) {
+ this.isCharge = isCharge;
+ }
+
+ /**
+ * 获取sdk版本
+ *
+ * @return sdk版本
+ */
+ public String getSdkVersion() {
+ return this.sdkVersion;
+ }
+
+ /**
+ * 设置sdk版本
+ *
+ * @param sdkVersion sdk版本
+ */
+ public void setSdkVersion(String sdkVersion) {
+ this.sdkVersion = sdkVersion;
+ }
+
+ /**
+ * 获取sdk时间
+ *
+ * @return sdk时间
+ */
+ public Date getSdkTime() {
+ return this.sdkTime;
+ }
+
+ /**
+ * 设置sdk时间
+ *
+ * @param sdkTime sdk时间
+ */
+ public void setSdkTime(Date sdkTime) {
+ this.sdkTime = sdkTime;
+ }
+
+ /**
+ * 获取分配日期
+ *
+ * @return 分配日期
+ */
+ public Date getCreateDate() {
+ return this.createDate;
+ }
+
+ /**
+ * 设置分配日期
+ *
+ * @param createDate 分配日期
+ */
+ public void setCreateDate(Date createDate) {
+ this.createDate = createDate;
+ }
+
+ /**
+ * 获取是否升级
+ *
+ * @return 是否升级
+ */
+ public String getIsUpgrade() {
+ return this.isUpgrade;
+ }
+
+ /**
+ * 设置是否升级
+ *
+ * @param isUpgrade 是否升级
+ */
+ public void setIsUpgrade(String isUpgrade) {
+ this.isUpgrade = isUpgrade;
+ }
+
+ /**
+ * 获取更新版本
+ *
+ * @return 更新版本
+ */
+ public String getUpgradeVersion() {
+ return this.upgradeVersion;
+ }
+
+ /**
+ * 设置更新版本
+ *
+ * @param upgradeVersion 更新版本
+ */
+ public void setUpgradeVersion(String upgradeVersion) {
+ this.upgradeVersion = upgradeVersion;
+ }
+
+ /**
+ * 获取更新时间
+ *
+ * @return 更新时间
+ */
+ public Date getUpgradeTime() {
+ return this.upgradeTime;
+ }
+
+ /**
+ * 设置更新时间
+ *
+ * @param upgradeTime 更新时间
+ */
+ public void setUpgradeTime(Date upgradeTime) {
+ this.upgradeTime = upgradeTime;
+ }
+
+ /**
+ * 获取授权时间
+ *
+ * @return 授权时间
+ */
+ public Date getAuthorizeTime() {
+ return this.authorizeTime;
+ }
+
+ /**
+ * 设置授权时间
+ *
+ * @param authorizeTime 授权时间
+ */
+ public void setAuthorizeTime(Date authorizeTime) {
+ this.authorizeTime = authorizeTime;
+ }
+
+ /**
+ * 获取编号
+ *
+ * @return 编号
+ */
+ public String getCreateCode() {
+ return this.createCode;
+ }
+
+ /**
+ * 设置编号
+ *
+ * @param createCode 编号
+ */
+ public void setCreateCode(String createCode) {
+ this.createCode = createCode;
+ }
+
+ /**
+ * 获取MCU启动次数
+ *
+ * @return MCU启动次数
+ */
+ public Integer getMcuCount() {
+ return this.mcuCount;
+ }
+
+ /**
+ * 设置MCU启动次数
+ *
+ * @param mcuCount MCU启动次数
+ */
+ public void setMcuCount(Integer mcuCount) {
+ this.mcuCount = mcuCount;
+ }
+
+ /**
+ * 获取模块启动次数
+ *
+ * @return 模块启动次数
+ */
+ public Integer getModuleCount() {
+ return this.moduleCount;
+ }
+
+ /**
+ * 设置模块启动次数
+ *
+ * @param moduleCount 模块启动次数
+ */
+ public void setModuleCount(Integer moduleCount) {
+ this.moduleCount = moduleCount;
+ }
+
+ /**
+ * 获取连接路由器次数
+ *
+ * @return 连接路由器次数
+ */
+ public Integer getRouterCount() {
+ return this.routerCount;
+ }
+
+ /**
+ * 设置连接路由器次数
+ *
+ * @param routerCount 连接路由器次数
+ */
+ public void setRouterCount(Integer routerCount) {
+ this.routerCount = routerCount;
+ }
+
+ /**
+ * 获取成功连接服务器次数
+ *
+ * @return 成功连接服务器次数
+ */
+ public Integer getServerCount() {
+ return this.serverCount;
+ }
+
+ /**
+ * 设置成功连接服务器次数
+ *
+ * @param serverCount 成功连接服务器次数
+ */
+ public void setServerCount(Integer serverCount) {
+ this.serverCount = serverCount;
+ }
+
+ /**
+ * 获取尝试连接服务器次数
+ *
+ * @return 尝试连接服务器次数
+ */
+ public Integer getServerTryCount() {
+ return this.serverTryCount;
+ }
+
+ /**
+ * 设置尝试连接服务器次数
+ *
+ * @param serverTryCount 尝试连接服务器次数
+ */
+ public void setServerTryCount(Integer serverTryCount) {
+ this.serverTryCount = serverTryCount;
+ }
+
+ /**
+ * 获取mcu版本
+ *
+ * @return mcu版本
+ */
+ public String getSoftwareVersion() {
+ return this.softwareVersion;
+ }
+
+ /**
+ * 设置mcu版本
+ *
+ * @param softwareVersion mcu版本
+ */
+ public void setSoftwareVersion(String softwareVersion) {
+ this.softwareVersion = softwareVersion;
+ }
+
+ /**
+ * 获取硬件型号
+ *
+ * @return 硬件型号
+ */
+ public String getHardwareType() {
+ return this.hardwareType;
+ }
+
+ /**
+ * 设置硬件型号
+ *
+ * @param hardwareType 硬件型号
+ */
+ public void setHardwareType(String hardwareType) {
+ this.hardwareType = hardwareType;
+ }
+
+ /**
+ * 获取电子厂代码
+ *
+ * @return 电子厂代码
+ */
+ public String getFactoryCode() {
+ return this.factoryCode;
+ }
+
+ /**
+ * 设置电子厂代码
+ *
+ * @param factoryCode 电子厂代码
+ */
+ public void setFactoryCode(String factoryCode) {
+ this.factoryCode = factoryCode;
+ }
+
+ /**
+ * 获取鱼缸场代码
+ *
+ * @return 鱼缸场代码
+ */
+ public String getBrandCode() {
+ return this.brandCode;
+ }
+
+ /**
+ * 设置鱼缸场代码
+ *
+ * @param brandCode 鱼缸场代码
+ */
+ public void setBrandCode(String brandCode) {
+ this.brandCode = brandCode;
+ }
+}
diff --git a/src/main/java/com/ifish/bean/Tbl_Device_User.java b/src/main/java/com/ifish/bean/Tbl_Device_User.java
new file mode 100644
index 0000000..08184a0
--- /dev/null
+++ b/src/main/java/com/ifish/bean/Tbl_Device_User.java
@@ -0,0 +1,293 @@
+/*
+ * 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.bean;
+
+import java.util.Date;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * 设备与用户关系表(tbl_device_user)
+ *
+ * @author bianj
+ * @version 1.0.0 2017-06-27
+ */
+@Entity
+@Table(name = "tbl_device_user")
+public class Tbl_Device_User implements java.io.Serializable {
+
+ /**
+ * 版本号
+ */
+ private static final long serialVersionUID = -4018159739383033383L;
+
+ /**
+ * id
+ */
+ @Id
+ @Column(name = "id", unique = true, nullable = false, length = 10)
+ private Integer id;
+
+ /**
+ * 用户Id
+ */
+ @Column(name = "user_id", unique = true, nullable = false, length = 10)
+ private Integer userId;
+
+ /**
+ * 设备Id
+ */
+ @Column(name = "device_id", unique = true, nullable = false, length = 10)
+ private Integer deviceId;
+
+ /**
+ * 是否主控:1、主控制权,0、被分享者
+ */
+ @Column(name = "is_master", nullable = true, length = 1)
+ private String isMaster;
+
+ /**
+ * 显示名称
+ */
+ @Column(name = "show_name", nullable = true, length = 50)
+ private String showName;
+
+ /**
+ * 创建时间
+ */
+ @Column(name = "create_time", nullable = true)
+ private Date createTime;
+
+ /**
+ * 修改时间
+ */
+ @Column(name = "update_time", nullable = true)
+ private Date updateTime;
+
+ /**
+ * 保存的显示图标
+ */
+ @Column(name = "custom_icon_name", nullable = true, length = 100)
+ private String customIconName;
+
+ /**
+ * 保存的显示名称
+ */
+ @Column(name = "custom_show_name", nullable = true, length = 100)
+ private String customShowName;
+
+ /**
+ * 是否看护
+ */
+ @Column(name = "is_look", nullable = true, length = 1)
+ private String isLook;
+
+ /**
+ * 是否直播
+ */
+ @Column(name = "is_live", nullable = true, length = 1)
+ private String isLive;
+
+ /**
+ * 获取id
+ *
+ * @return id
+ */
+ public Integer getId() {
+ return this.id;
+ }
+
+ /**
+ * 设置id
+ *
+ * @param id id
+ */
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ /**
+ * 获取用户Id
+ *
+ * @return 用户Id
+ */
+ public Integer getUserId() {
+ return this.userId;
+ }
+
+ /**
+ * 设置用户Id
+ *
+ * @param userId 用户Id
+ */
+ public void setUserId(Integer userId) {
+ this.userId = userId;
+ }
+
+ /**
+ * 获取设备Id
+ *
+ * @return 设备Id
+ */
+ public Integer getDeviceId() {
+ return this.deviceId;
+ }
+
+ /**
+ * 设置设备Id
+ *
+ * @param deviceId 设备Id
+ */
+ public void setDeviceId(Integer deviceId) {
+ this.deviceId = deviceId;
+ }
+
+ /**
+ * 获取是否主控:1、主控制权,0、被分享者
+ *
+ * @return 是否主控:1、主控制权
+ */
+ public String getIsMaster() {
+ return this.isMaster;
+ }
+
+ /**
+ * 设置是否主控:1、主控制权,0、被分享者
+ *
+ * @param isMaster 是否主控:1、主控制权,0、被分享者
+ */
+ public void setIsMaster(String isMaster) {
+ this.isMaster = isMaster;
+ }
+
+ /**
+ * 获取显示名称
+ *
+ * @return 显示名称
+ */
+ public String getShowName() {
+ return this.showName;
+ }
+
+ /**
+ * 设置显示名称
+ *
+ * @param showName 显示名称
+ */
+ public void setShowName(String showName) {
+ this.showName = showName;
+ }
+
+ /**
+ * 获取创建时间
+ *
+ * @return 创建时间
+ */
+ public Date getCreateTime() {
+ return this.createTime;
+ }
+
+ /**
+ * 设置创建时间
+ *
+ * @param createTime 创建时间
+ */
+ public void setCreateTime(Date createTime) {
+ this.createTime = createTime;
+ }
+
+ /**
+ * 获取修改时间
+ *
+ * @return 修改时间
+ */
+ public Date getUpdateTime() {
+ return this.updateTime;
+ }
+
+ /**
+ * 设置修改时间
+ *
+ * @param updateTime 修改时间
+ */
+ public void setUpdateTime(Date updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ /**
+ * 获取保存的显示图标
+ *
+ * @return 保存的显示图标
+ */
+ public String getCustomIconName() {
+ return this.customIconName;
+ }
+
+ /**
+ * 设置保存的显示图标
+ *
+ * @param customIconName 保存的显示图标
+ */
+ public void setCustomIconName(String customIconName) {
+ this.customIconName = customIconName;
+ }
+
+ /**
+ * 获取保存的显示名称
+ *
+ * @return 保存的显示名称
+ */
+ public String getCustomShowName() {
+ return this.customShowName;
+ }
+
+ /**
+ * 设置保存的显示名称
+ *
+ * @param customShowName 保存的显示名称
+ */
+ public void setCustomShowName(String customShowName) {
+ this.customShowName = customShowName;
+ }
+
+ /**
+ * 获取是否看护
+ *
+ * @return 是否看护
+ */
+ public String getIsLook() {
+ return this.isLook;
+ }
+
+ /**
+ * 设置是否看护
+ *
+ * @param isLook 是否看护
+ */
+ public void setIsLook(String isLook) {
+ this.isLook = isLook;
+ }
+
+ /**
+ * 获取是否直播
+ *
+ * @return 是否直播
+ */
+ public String getIsLive() {
+ return this.isLive;
+ }
+
+ /**
+ * 设置是否直播
+ *
+ * @param isLive 是否直播
+ */
+ public void setIsLive(String isLive) {
+ this.isLive = isLive;
+ }
+}
diff --git a/src/main/java/com/ifish/bean/Tbl_Factory_List.java b/src/main/java/com/ifish/bean/Tbl_Factory_List.java
new file mode 100644
index 0000000..b03bf10
--- /dev/null
+++ b/src/main/java/com/ifish/bean/Tbl_Factory_List.java
@@ -0,0 +1,125 @@
+/*
+ * 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.bean;
+
+import java.util.Date;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * 电子厂详情表(tbl_factory_list)
+ *
+ * @author bianj
+ * @version 1.0.0 2017-07-03
+ */
+@Entity
+@Table(name = "tbl_factory_list")
+public class Tbl_Factory_List implements java.io.Serializable {
+
+ /**
+ * 版本号
+ */
+ private static final long serialVersionUID = -8290320819344778436L;
+
+ /**
+ * 电子厂代码
+ */
+ @Id
+ @Column(name = "factory_code", unique = true, nullable = false, length = 20)
+ private String factoryCode;
+
+ /**
+ * 电子厂名称
+ */
+ @Column(name = "factory_name", nullable = false, length = 20)
+ private String factoryName;
+
+ /**
+ * 创建时间
+ */
+ @Column(name = "create_time", nullable = true)
+ private Date createTime;
+
+ /**
+ * 是否收税:1收、0不收
+ */
+ @Column(name = "is_tax", nullable = true, length = 1)
+ private String isTax;
+
+ /**
+ * 获取电子厂代码
+ *
+ * @return 电子厂代码
+ */
+ public String getFactoryCode() {
+ return this.factoryCode;
+ }
+
+ /**
+ * 设置电子厂代码
+ *
+ * @param factoryCode 电子厂代码
+ */
+ public void setFactoryCode(String factoryCode) {
+ this.factoryCode = factoryCode;
+ }
+
+ /**
+ * 获取电子厂名称
+ *
+ * @return 电子厂名称
+ */
+ public String getFactoryName() {
+ return this.factoryName;
+ }
+
+ /**
+ * 设置电子厂名称
+ *
+ * @param factoryName 电子厂名称
+ */
+ public void setFactoryName(String factoryName) {
+ this.factoryName = factoryName;
+ }
+
+ /**
+ * 获取创建时间
+ *
+ * @return 创建时间
+ */
+ public Date getCreateTime() {
+ return this.createTime;
+ }
+
+ /**
+ * 设置创建时间
+ *
+ * @param createTime 创建时间
+ */
+ public void setCreateTime(Date createTime) {
+ this.createTime = createTime;
+ }
+
+ /**
+ * 获取是否收税:1收、0不收
+ *
+ * @return 是否收税
+ */
+ public String getIsTax() {
+ return this.isTax;
+ }
+
+ /**
+ * 设置是否收税:1收、0不收
+ *
+ * @param isTax 是否收税:1收、0不收
+ */
+ public void setIsTax(String isTax) {
+ this.isTax = isTax;
+ }
+}
diff --git a/src/main/java/com/ifish/bean/Tbl_HardWare_Type.java b/src/main/java/com/ifish/bean/Tbl_HardWare_Type.java
new file mode 100644
index 0000000..7760168
--- /dev/null
+++ b/src/main/java/com/ifish/bean/Tbl_HardWare_Type.java
@@ -0,0 +1,437 @@
+/*
+ * 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.bean;
+
+import java.util.Date;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * 设备类型详情表(tbl_hardware_type)
+ *
+ * @author bianj
+ * @version 1.0.0 2017-06-27
+ */
+@Entity
+@Table(name = "tbl_hardware_type")
+public class Tbl_HardWare_Type implements java.io.Serializable {
+
+ /**
+ * 版本号
+ */
+ private static final long serialVersionUID = 7870932947017585134L;
+
+ /**
+ * 设备型号代码
+ */
+ @Id
+ @Column(name = "hardware_type", unique = true, nullable = false, length = 10)
+ private String hardwareType;
+
+ /**
+ * 电子厂代码
+ */
+ @Column(name = "factory_code", nullable = true, length = 20)
+ private String factoryCode;
+
+ /**
+ * 设备名称
+ */
+ @Column(name = "hardware_name", nullable = false, length = 20)
+ private String hardwareName;
+
+ /**
+ * 描述
+ */
+ @Column(name = "hardware_desc", nullable = true, length = 100)
+ private String hardwareDesc;
+
+ /**
+ * 创建时间
+ */
+ @Column(name = "create_time", nullable = true)
+ private Date createTime;
+
+ /**
+ * 控制个数
+ */
+ @Column(name = "control_amount", nullable = true, length = 10)
+ private Integer controlAmount;
+
+ /**
+ * 定时器个数
+ */
+ @Column(name = "timer_amount", nullable = true, length = 10)
+ private Integer timerAmount;
+
+ /**
+ * 是否自定义图标:1是、0否
+ */
+ @Column(name = "is_custom_icon", nullable = true, length = 1)
+ private String isCustomIcon;
+
+ /**
+ * 自定义图标根地址
+ */
+ @Column(name = "icon_link", nullable = true, length = 200)
+ private String iconLink;
+
+ /**
+ * 根地址下图标名称
+ */
+ @Column(name = "all_icon_name", nullable = true, length = 200)
+ private String allIconName;
+
+ /**
+ * 修改时间
+ */
+ @Column(name = "update_time", nullable = true)
+ private Date updateTime;
+
+ /**
+ * 是否有背光:1是、0否
+ */
+ @Column(name = "is_lightness", nullable = true, length = 1)
+ private String isLightness;
+
+ /**
+ * 是否有柜灯:1是、0否
+ */
+ @Column(name = "is_sark_lamp", nullable = true, length = 1)
+ private String isSarkLamp;
+
+ /**
+ * 是否有工作模式:1是、0否
+ */
+ @Column(name = "is_work_model", nullable = true, length = 1)
+ private String isWorkModel;
+
+ /**
+ * 显示名称
+ */
+ @Column(name = "all_show_name", nullable = true, length = 200)
+ private String allShowName;
+
+ /**
+ * 默认名称
+ */
+ @Column(name = "default_show_name", nullable = true, length = 200)
+ private String defaultShowName;
+
+ /**
+ * 默认图标
+ */
+ @Column(name = "default_icon_name", nullable = true, length = 200)
+ private String defaultIconName;
+
+ /**
+ * 获取设备型号代码
+ *
+ * @return 设备型号代码
+ */
+ public String getHardwareType() {
+ return this.hardwareType;
+ }
+
+ /**
+ * 设置设备型号代码
+ *
+ * @param hardwareType 设备型号代码
+ */
+ public void setHardwareType(String hardwareType) {
+ this.hardwareType = hardwareType;
+ }
+
+ /**
+ * 获取电子厂代码
+ *
+ * @return 电子厂代码
+ */
+ public String getFactoryCode() {
+ return this.factoryCode;
+ }
+
+ /**
+ * 设置电子厂代码
+ *
+ * @param factoryCode 电子厂代码
+ */
+ public void setFactoryCode(String factoryCode) {
+ this.factoryCode = factoryCode;
+ }
+
+ /**
+ * 获取设备名称
+ *
+ * @return 设备名称
+ */
+ public String getHardwareName() {
+ return this.hardwareName;
+ }
+
+ /**
+ * 设置设备名称
+ *
+ * @param hardwareName 设备名称
+ */
+ public void setHardwareName(String hardwareName) {
+ this.hardwareName = hardwareName;
+ }
+
+ /**
+ * 获取描述
+ *
+ * @return 描述
+ */
+ public String getHardwareDesc() {
+ return this.hardwareDesc;
+ }
+
+ /**
+ * 设置描述
+ *
+ * @param hardwareDesc 描述
+ */
+ public void setHardwareDesc(String hardwareDesc) {
+ this.hardwareDesc = hardwareDesc;
+ }
+
+ /**
+ * 获取创建时间
+ *
+ * @return 创建时间
+ */
+ public Date getCreateTime() {
+ return this.createTime;
+ }
+
+ /**
+ * 设置创建时间
+ *
+ * @param createTime 创建时间
+ */
+ public void setCreateTime(Date createTime) {
+ this.createTime = createTime;
+ }
+
+ /**
+ * 获取控制个数
+ *
+ * @return 控制个数
+ */
+ public Integer getControlAmount() {
+ return this.controlAmount;
+ }
+
+ /**
+ * 设置控制个数
+ *
+ * @param controlAmount 控制个数
+ */
+ public void setControlAmount(Integer controlAmount) {
+ this.controlAmount = controlAmount;
+ }
+
+ /**
+ * 获取定时器个数
+ *
+ * @return 定时器个数
+ */
+ public Integer getTimerAmount() {
+ return this.timerAmount;
+ }
+
+ /**
+ * 设置定时器个数
+ *
+ * @param timerAmount 定时器个数
+ */
+ public void setTimerAmount(Integer timerAmount) {
+ this.timerAmount = timerAmount;
+ }
+
+ /**
+ * 获取是否自定义图标:1是、0否
+ *
+ * @return 是否自定义图标
+ */
+ public String getIsCustomIcon() {
+ return this.isCustomIcon;
+ }
+
+ /**
+ * 设置是否自定义图标:1是、0否
+ *
+ * @param isCustomIcon 是否自定义图标:1是、0否
+ */
+ public void setIsCustomIcon(String isCustomIcon) {
+ this.isCustomIcon = isCustomIcon;
+ }
+
+ /**
+ * 获取自定义图标根地址
+ *
+ * @return 自定义图标根地址
+ */
+ public String getIconLink() {
+ return this.iconLink;
+ }
+
+ /**
+ * 设置自定义图标根地址
+ *
+ * @param iconLink 自定义图标根地址
+ */
+ public void setIconLink(String iconLink) {
+ this.iconLink = iconLink;
+ }
+
+ /**
+ * 获取根地址下图标名称
+ *
+ * @return 根地址下图标名称
+ */
+ public String getAllIconName() {
+ return this.allIconName;
+ }
+
+ /**
+ * 设置根地址下图标名称
+ *
+ * @param allIconName 根地址下图标名称
+ */
+ public void setAllIconName(String allIconName) {
+ this.allIconName = allIconName;
+ }
+
+ /**
+ * 获取修改时间
+ *
+ * @return 修改时间
+ */
+ public Date getUpdateTime() {
+ return this.updateTime;
+ }
+
+ /**
+ * 设置修改时间
+ *
+ * @param updateTime 修改时间
+ */
+ public void setUpdateTime(Date updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ /**
+ * 获取是否有背光:1是、0否
+ *
+ * @return 是否有背光
+ */
+ public String getIsLightness() {
+ return this.isLightness;
+ }
+
+ /**
+ * 设置是否有背光:1是、0否
+ *
+ * @param isLightness 是否有背光:1是、0否
+ */
+ public void setIsLightness(String isLightness) {
+ this.isLightness = isLightness;
+ }
+
+ /**
+ * 获取是否有柜灯:1是、0否
+ *
+ * @return 是否有柜灯
+ */
+ public String getIsSarkLamp() {
+ return this.isSarkLamp;
+ }
+
+ /**
+ * 设置是否有柜灯:1是、0否
+ *
+ * @param isSarkLamp 是否有柜灯:1是、0否
+ */
+ public void setIsSarkLamp(String isSarkLamp) {
+ this.isSarkLamp = isSarkLamp;
+ }
+
+ /**
+ * 获取是否有工作模式:1是、0否
+ *
+ * @return 是否有工作模式
+ */
+ public String getIsWorkModel() {
+ return this.isWorkModel;
+ }
+
+ /**
+ * 设置是否有工作模式:1是、0否
+ *
+ * @param isWorkModel 是否有工作模式:1是、0否
+ */
+ public void setIsWorkModel(String isWorkModel) {
+ this.isWorkModel = isWorkModel;
+ }
+
+ /**
+ * 获取显示名称
+ *
+ * @return 显示名称
+ */
+ public String getAllShowName() {
+ return this.allShowName;
+ }
+
+ /**
+ * 设置显示名称
+ *
+ * @param allShowName 显示名称
+ */
+ public void setAllShowName(String allShowName) {
+ this.allShowName = allShowName;
+ }
+
+ /**
+ * 获取默认名称
+ *
+ * @return 默认名称
+ */
+ public String getDefaultShowName() {
+ return this.defaultShowName;
+ }
+
+ /**
+ * 设置默认名称
+ *
+ * @param defaultShowName 默认名称
+ */
+ public void setDefaultShowName(String defaultShowName) {
+ this.defaultShowName = defaultShowName;
+ }
+
+ /**
+ * 获取默认图标
+ *
+ * @return 默认图标
+ */
+ public String getDefaultIconName() {
+ return this.defaultIconName;
+ }
+
+ /**
+ * 设置默认图标
+ *
+ * @param defaultIconName 默认图标
+ */
+ public void setDefaultIconName(String defaultIconName) {
+ this.defaultIconName = defaultIconName;
+ }
+}
diff --git a/src/main/java/com/ifish/bean/Tbl_Push_List.java b/src/main/java/com/ifish/bean/Tbl_Push_List.java
new file mode 100644
index 0000000..8bfa849
--- /dev/null
+++ b/src/main/java/com/ifish/bean/Tbl_Push_List.java
@@ -0,0 +1,465 @@
+/*
+ * 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.bean;
+
+import java.util.Date;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * 推送详情表(tbl_push_list)
+ *
+ * @author bianj
+ * @version 1.0.0 2017-07-03
+ */
+@Entity
+@Table(name = "tbl_push_list")
+public class Tbl_Push_List implements java.io.Serializable {
+
+ /**
+ * 版本号
+ */
+ private static final long serialVersionUID = -7760764975977010045L;
+
+ /**
+ * ID
+ */
+ @Id
+ @Column(name = "push_id", unique = true, nullable = false, length = 10)
+ private Integer pushId;
+
+ /**
+ * 用户Id
+ */
+ @Column(name = "user_id", nullable = true, length = 10)
+ private Integer userId;
+
+ /**
+ * 设备Id
+ */
+ @Column(name = "device_id", nullable = true, length = 10)
+ private Integer deviceId;
+
+ /**
+ * 显示名称
+ */
+ @Column(name = "show_name", nullable = true, length = 20)
+ private String showName;
+
+ /**
+ * 推送手机类型
+ */
+ @Column(name = "phone_type", nullable = true, length = 20)
+ private String phoneType;
+
+ /**
+ * 推送消息类型
+ * 1."remove_device","解绑通知";2."wendu_warn","温度预警;3."qu_reply","问题反馈";4."app_update","IOS更新推送";5."remind_water","换水提醒";6."offline_push","离线通知";7."send_report","看护报告";8."shops_push","看护通知";9."all_push","所有用户推送"
+ */
+ @Column(name = "push_type", nullable = true, length = 20)
+ private String pushType;
+
+ /**
+ * 推送标题
+ */
+ @Column(name = "push_title", nullable = true, length = 100)
+ private String pushTitle;
+
+ /**
+ * 推送内容
+ */
+ @Column(name = "push_context", nullable = true, length = 200)
+ private String pushContext;
+
+ /**
+ * 创建时间
+ */
+ @Column(name = "create_time", nullable = true)
+ private Date createTime;
+
+ /**
+ * 链接
+ */
+ @Column(name = "push_link", nullable = false, length = 100)
+ private String pushLink;
+
+ /**
+ * 极光推送状态
+ */
+ @Column(name = "jpush_status", nullable = true, length = 1)
+ private String jpushStatus;
+
+ /**
+ * 谷歌推送状态
+ */
+ @Column(name = "google_status", nullable = true, length = 1)
+ private String googleStatus;
+
+ /**
+ * 看护报告Id
+ */
+ @Column(name = "report_id", nullable = true, length = 10)
+ private Integer reportId;
+
+ /**
+ * MCU启动次数
+ */
+ @Column(name = "mcu_count", nullable = true, length = 10)
+ private Integer mcuCount;
+
+ /**
+ * 模块启动次数
+ */
+ @Column(name = "modular_count", nullable = true, length = 10)
+ private Integer modularCount;
+
+ /**
+ * 连接路由器次数
+ */
+ @Column(name = "router_count", nullable = true, length = 10)
+ private Integer routerCount;
+
+ /**
+ * 成功连接服务器次数
+ */
+ @Column(name = "server_count", nullable = true, length = 10)
+ private Integer serverCount;
+
+ /**
+ * 尝试连接服务器次数
+ */
+ @Column(name = "server_try_count", nullable = true, length = 10)
+ private Integer serverTryCount;
+
+ /**
+ * 获取ID
+ *
+ * @return ID
+ */
+ public Integer getPushId() {
+ return this.pushId;
+ }
+
+ /**
+ * 设置ID
+ *
+ * @param pushId ID
+ */
+ public void setPushId(Integer pushId) {
+ this.pushId = pushId;
+ }
+
+ /**
+ * 获取用户Id
+ *
+ * @return 用户Id
+ */
+ public Integer getUserId() {
+ return this.userId;
+ }
+
+ /**
+ * 设置用户Id
+ *
+ * @param userId 用户Id
+ */
+ public void setUserId(Integer userId) {
+ this.userId = userId;
+ }
+
+ /**
+ * 获取设备Id
+ *
+ * @return 设备Id
+ */
+ public Integer getDeviceId() {
+ return this.deviceId;
+ }
+
+ /**
+ * 设置设备Id
+ *
+ * @param deviceId 设备Id
+ */
+ public void setDeviceId(Integer deviceId) {
+ this.deviceId = deviceId;
+ }
+
+ /**
+ * 获取显示名称
+ *
+ * @return 显示名称
+ */
+ public String getShowName() {
+ return this.showName;
+ }
+
+ /**
+ * 设置显示名称
+ *
+ * @param showName 显示名称
+ */
+ public void setShowName(String showName) {
+ this.showName = showName;
+ }
+
+ /**
+ * 获取推送手机类型
+ *
+ * @return 推送手机类型
+ */
+ public String getPhoneType() {
+ return this.phoneType;
+ }
+
+ /**
+ * 设置推送手机类型
+ *
+ * @param phoneType 推送手机类型
+ */
+ public void setPhoneType(String phoneType) {
+ this.phoneType = phoneType;
+ }
+
+ /**
+ * 获取推送消息类型
+ * 1."remove_device","解绑通知";2."wendu_warn","温度预警;3."qu_reply","问题反馈";4."app_update","IOS更新推送";5."remind_water","换水提醒";6."offline_push","离线通知";7."send_report","看护报告";8."shops_push","看护通知";9."all_push","所有用户推送"
+ *
+ * @return 推送消息类型 1."remove_device"
+ */
+ public String getPushType() {
+ return this.pushType;
+ }
+
+ /**
+ * 设置推送消息类型
+ * 1."remove_device","解绑通知";2."wendu_warn","温度预警;3."qu_reply","问题反馈";4."app_update","IOS更新推送";5."remind_water","换水提醒";6."offline_push","离线通知";7."send_report","看护报告";8."shops_push","看护通知";9."all_push","所有用户推送"
+ *
+ * @param pushType 推送消息类型
+ * 1."remove_device","解绑通知";2."wendu_warn","温度预警;3."qu_reply","问题反馈";4."app_update","IOS更新推送";5."remind_water","换水提醒";6."offline_push","离线通知";7."send_report","看护报告";8."shops_push","看护通知";9."all_push","所有用户推送"
+ */
+ public void setPushType(String pushType) {
+ this.pushType = pushType;
+ }
+
+ /**
+ * 获取推送标题
+ *
+ * @return 推送标题
+ */
+ public String getPushTitle() {
+ return this.pushTitle;
+ }
+
+ /**
+ * 设置推送标题
+ *
+ * @param pushTitle 推送标题
+ */
+ public void setPushTitle(String pushTitle) {
+ this.pushTitle = pushTitle;
+ }
+
+ /**
+ * 获取推送内容
+ *
+ * @return 推送内容
+ */
+ public String getPushContext() {
+ return this.pushContext;
+ }
+
+ /**
+ * 设置推送内容
+ *
+ * @param pushContext 推送内容
+ */
+ public void setPushContext(String pushContext) {
+ this.pushContext = pushContext;
+ }
+
+ /**
+ * 获取创建时间
+ *
+ * @return 创建时间
+ */
+ public Date getCreateTime() {
+ return this.createTime;
+ }
+
+ /**
+ * 设置创建时间
+ *
+ * @param createTime 创建时间
+ */
+ public void setCreateTime(Date createTime) {
+ this.createTime = createTime;
+ }
+
+ /**
+ * 获取链接
+ *
+ * @return 链接
+ */
+ public String getPushLink() {
+ return this.pushLink;
+ }
+
+ /**
+ * 设置链接
+ *
+ * @param pushLink 链接
+ */
+ public void setPushLink(String pushLink) {
+ this.pushLink = pushLink;
+ }
+
+ /**
+ * 获取极光推送状态
+ *
+ * @return 极光推送状态
+ */
+ public String getJpushStatus() {
+ return this.jpushStatus;
+ }
+
+ /**
+ * 设置极光推送状态
+ *
+ * @param jpushStatus 极光推送状态
+ */
+ public void setJpushStatus(String jpushStatus) {
+ this.jpushStatus = jpushStatus;
+ }
+
+ /**
+ * 获取谷歌推送状态
+ *
+ * @return 谷歌推送状态
+ */
+ public String getGoogleStatus() {
+ return this.googleStatus;
+ }
+
+ /**
+ * 设置谷歌推送状态
+ *
+ * @param googleStatus 谷歌推送状态
+ */
+ public void setGoogleStatus(String googleStatus) {
+ this.googleStatus = googleStatus;
+ }
+
+ /**
+ * 获取看护报告Id
+ *
+ * @return 看护报告Id
+ */
+ public Integer getReportId() {
+ return this.reportId;
+ }
+
+ /**
+ * 设置看护报告Id
+ *
+ * @param reportId 看护报告Id
+ */
+ public void setReportId(Integer reportId) {
+ this.reportId = reportId;
+ }
+
+ /**
+ * 获取MCU启动次数
+ *
+ * @return MCU启动次数
+ */
+ public Integer getMcuCount() {
+ return this.mcuCount;
+ }
+
+ /**
+ * 设置MCU启动次数
+ *
+ * @param mcuCount MCU启动次数
+ */
+ public void setMcuCount(Integer mcuCount) {
+ this.mcuCount = mcuCount;
+ }
+
+ /**
+ * 获取模块启动次数
+ *
+ * @return 模块启动次数
+ */
+ public Integer getModularCount() {
+ return this.modularCount;
+ }
+
+ /**
+ * 设置模块启动次数
+ *
+ * @param modularCount 模块启动次数
+ */
+ public void setModularCount(Integer modularCount) {
+ this.modularCount = modularCount;
+ }
+
+ /**
+ * 获取连接路由器次数
+ *
+ * @return 连接路由器次数
+ */
+ public Integer getRouterCount() {
+ return this.routerCount;
+ }
+
+ /**
+ * 设置连接路由器次数
+ *
+ * @param routerCount 连接路由器次数
+ */
+ public void setRouterCount(Integer routerCount) {
+ this.routerCount = routerCount;
+ }
+
+ /**
+ * 获取成功连接服务器次数
+ *
+ * @return 成功连接服务器次数
+ */
+ public Integer getServerCount() {
+ return this.serverCount;
+ }
+
+ /**
+ * 设置成功连接服务器次数
+ *
+ * @param serverCount 成功连接服务器次数
+ */
+ public void setServerCount(Integer serverCount) {
+ this.serverCount = serverCount;
+ }
+
+ /**
+ * 获取尝试连接服务器次数
+ *
+ * @return 尝试连接服务器次数
+ */
+ public Integer getServerTryCount() {
+ return this.serverTryCount;
+ }
+
+ /**
+ * 设置尝试连接服务器次数
+ *
+ * @param serverTryCount 尝试连接服务器次数
+ */
+ public void setServerTryCount(Integer serverTryCount) {
+ this.serverTryCount = serverTryCount;
+ }
+}
diff --git a/src/main/java/com/ifish/bean/Tbl_User.java b/src/main/java/com/ifish/bean/Tbl_User.java
new file mode 100644
index 0000000..57cb9af
--- /dev/null
+++ b/src/main/java/com/ifish/bean/Tbl_User.java
@@ -0,0 +1,557 @@
+/*
+ * 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.bean;
+
+import java.util.Date;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * 用户详情表(tbl_user)
+ *
+ * @author bianj
+ * @version 1.0.0 2017-06-28
+ */
+@Entity
+@Table(name = "tbl_user")
+public class Tbl_User implements java.io.Serializable {
+
+ /**
+ * 版本号
+ */
+ private static final long serialVersionUID = -3293426131332327827L;
+
+ /**
+ * 用户Id
+ */
+ @Id
+ @Column(name = "user_id", unique = true, nullable = false, length = 10)
+ private Integer userId;
+
+ /**
+ * 昵称
+ */
+ @Column(name = "nick_name", nullable = true, length = 20)
+ private String nickName;
+
+ /**
+ * 密码
+ */
+ @Column(name = "user_password", nullable = true, length = 32)
+ private String userPassword;
+
+ /**
+ * 手机
+ */
+ @Column(name = "phone_number", unique = true, nullable = true, length = 11)
+ private String phoneNumber;
+
+ /**
+ * 邮箱
+ */
+ @Column(name = "user_email", unique = true, nullable = true, length = 50)
+ private String userEmail;
+
+ /**
+ * 用户类型
+ */
+ @Column(name = "user_type", nullable = false, length = 1)
+ private String userType;
+
+ /**
+ * 头像
+ */
+ @Column(name = "user_img", nullable = true, length = 100)
+ private String userImg;
+
+ /**
+ * 性别
+ */
+ @Column(name = "user_sex", nullable = true, length = 1)
+ private String userSex;
+
+ /**
+ * 登陆次数
+ */
+ @Column(name = "login_count", nullable = true, length = 10)
+ private Integer loginCount;
+
+ /**
+ * 修改时间
+ */
+ @Column(name = "update_time", nullable = true)
+ private Date updateTime;
+
+ /**
+ * 登陆时间
+ */
+ @Column(name = "login_time", nullable = true)
+ private Date loginTime;
+
+ /**
+ * 注册时间
+ */
+ @Column(name = "create_time", nullable = true)
+ private Date createTime;
+
+ /**
+ * 登陆手机类型
+ */
+ @Column(name = "login_type", nullable = true, length = 10)
+ private String loginType;
+
+ /**
+ * 备注
+ */
+ @Column(name = "remarks", nullable = true, length = 100)
+ private String remarks;
+
+ /**
+ * 地址
+ */
+ @Column(name = "address", nullable = true, length = 200)
+ private String address;
+
+ /**
+ * 技威Code1
+ */
+ @Column(name = "p2pverify_code1", nullable = true, length = 50)
+ private String p2pverifyCode1;
+
+ /**
+ * 技威Code2
+ */
+ @Column(name = "p2pverify_code2", nullable = true, length = 50)
+ private String p2pverifyCode2;
+
+ /**
+ * 技威用户ID
+ */
+ @Column(name = "gwell_userid", nullable = true, length = 50)
+ private String gwellUserid;
+
+ /**
+ * 是否注册技威:1已注册、0未注册
+ */
+ @Column(name = "is_register_gwell", nullable = true, length = 1)
+ private String isRegisterGwell;
+
+ /**
+ * 极光用户ID
+ */
+ @Column(name = "jiguang_userid", nullable = true, length = 50)
+ private String jiguangUserid;
+
+ /**
+ * 经度
+ */
+ @Column(name = "longitude", nullable = true)
+ private Double longitude;
+
+ /**
+ * 纬度
+ */
+ @Column(name = "latitude", nullable = true)
+ private Double latitude;
+
+ /**
+ * 获取用户Id
+ *
+ * @return 用户Id
+ */
+ public Integer getUserId() {
+ return this.userId;
+ }
+
+ /**
+ * 设置用户Id
+ *
+ * @param userId 用户Id
+ */
+ public void setUserId(Integer userId) {
+ this.userId = userId;
+ }
+
+ /**
+ * 获取昵称
+ *
+ * @return 昵称
+ */
+ public String getNickName() {
+ return this.nickName;
+ }
+
+ /**
+ * 设置昵称
+ *
+ * @param nickName 昵称
+ */
+ public void setNickName(String nickName) {
+ this.nickName = nickName;
+ }
+
+ /**
+ * 获取密码
+ *
+ * @return 密码
+ */
+ public String getUserPassword() {
+ return this.userPassword;
+ }
+
+ /**
+ * 设置密码
+ *
+ * @param userPassword 密码
+ */
+ public void setUserPassword(String userPassword) {
+ this.userPassword = userPassword;
+ }
+
+ /**
+ * 获取手机
+ *
+ * @return 手机
+ */
+ public String getPhoneNumber() {
+ return this.phoneNumber;
+ }
+
+ /**
+ * 设置手机
+ *
+ * @param phoneNumber 手机
+ */
+ public void setPhoneNumber(String phoneNumber) {
+ this.phoneNumber = phoneNumber;
+ }
+
+ /**
+ * 获取邮箱
+ *
+ * @return 邮箱
+ */
+ public String getUserEmail() {
+ return this.userEmail;
+ }
+
+ /**
+ * 设置邮箱
+ *
+ * @param userEmail 邮箱
+ */
+ public void setUserEmail(String userEmail) {
+ this.userEmail = userEmail;
+ }
+
+ /**
+ * 获取用户类型
+ *
+ * @return 用户类型
+ */
+ public String getUserType() {
+ return this.userType;
+ }
+
+ /**
+ * 设置用户类型
+ *
+ * @param userType 用户类型
+ */
+ public void setUserType(String userType) {
+ this.userType = userType;
+ }
+
+ /**
+ * 获取头像
+ *
+ * @return 头像
+ */
+ public String getUserImg() {
+ return this.userImg;
+ }
+
+ /**
+ * 设置头像
+ *
+ * @param userImg 头像
+ */
+ public void setUserImg(String userImg) {
+ this.userImg = userImg;
+ }
+
+ /**
+ * 获取性别
+ *
+ * @return 性别
+ */
+ public String getUserSex() {
+ return this.userSex;
+ }
+
+ /**
+ * 设置性别
+ *
+ * @param userSex 性别
+ */
+ public void setUserSex(String userSex) {
+ this.userSex = userSex;
+ }
+
+ /**
+ * 获取登陆次数
+ *
+ * @return 登陆次数
+ */
+ public Integer getLoginCount() {
+ return this.loginCount;
+ }
+
+ /**
+ * 设置登陆次数
+ *
+ * @param loginCount 登陆次数
+ */
+ public void setLoginCount(Integer loginCount) {
+ this.loginCount = loginCount;
+ }
+
+ /**
+ * 获取修改时间
+ *
+ * @return 修改时间
+ */
+ public Date getUpdateTime() {
+ return this.updateTime;
+ }
+
+ /**
+ * 设置修改时间
+ *
+ * @param updateTime 修改时间
+ */
+ public void setUpdateTime(Date updateTime) {
+ this.updateTime = updateTime;
+ }
+
+ /**
+ * 获取登陆时间
+ *
+ * @return 登陆时间
+ */
+ public Date getLoginTime() {
+ return this.loginTime;
+ }
+
+ /**
+ * 设置登陆时间
+ *
+ * @param loginTime 登陆时间
+ */
+ public void setLoginTime(Date loginTime) {
+ this.loginTime = loginTime;
+ }
+
+ /**
+ * 获取注册时间
+ *
+ * @return 注册时间
+ */
+ public Date getCreateTime() {
+ return this.createTime;
+ }
+
+ /**
+ * 设置注册时间
+ *
+ * @param createTime 注册时间
+ */
+ public void setCreateTime(Date createTime) {
+ this.createTime = createTime;
+ }
+
+ /**
+ * 获取登陆手机类型
+ *
+ * @return 登陆手机类型
+ */
+ public String getLoginType() {
+ return this.loginType;
+ }
+
+ /**
+ * 设置登陆手机类型
+ *
+ * @param loginType 登陆手机类型
+ */
+ public void setLoginType(String loginType) {
+ this.loginType = loginType;
+ }
+
+ /**
+ * 获取备注
+ *
+ * @return 备注
+ */
+ public String getRemarks() {
+ return this.remarks;
+ }
+
+ /**
+ * 设置备注
+ *
+ * @param remarks 备注
+ */
+ public void setRemarks(String remarks) {
+ this.remarks = remarks;
+ }
+
+ /**
+ * 获取地址
+ *
+ * @return 地址
+ */
+ public String getAddress() {
+ return this.address;
+ }
+
+ /**
+ * 设置地址
+ *
+ * @param address 地址
+ */
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ /**
+ * 获取技威Code1
+ *
+ * @return 技威Code1
+ */
+ public String getP2pverifyCode1() {
+ return this.p2pverifyCode1;
+ }
+
+ /**
+ * 设置技威Code1
+ *
+ * @param p2pverifyCode1 技威Code1
+ */
+ public void setP2pverifyCode1(String p2pverifyCode1) {
+ this.p2pverifyCode1 = p2pverifyCode1;
+ }
+
+ /**
+ * 获取技威Code2
+ *
+ * @return 技威Code2
+ */
+ public String getP2pverifyCode2() {
+ return this.p2pverifyCode2;
+ }
+
+ /**
+ * 设置技威Code2
+ *
+ * @param p2pverifyCode2 技威Code2
+ */
+ public void setP2pverifyCode2(String p2pverifyCode2) {
+ this.p2pverifyCode2 = p2pverifyCode2;
+ }
+
+ /**
+ * 获取技威用户ID
+ *
+ * @return 技威用户ID
+ */
+ public String getGwellUserid() {
+ return this.gwellUserid;
+ }
+
+ /**
+ * 设置技威用户ID
+ *
+ * @param gwellUserid 技威用户ID
+ */
+ public void setGwellUserid(String gwellUserid) {
+ this.gwellUserid = gwellUserid;
+ }
+
+ /**
+ * 获取是否注册技威:1已注册、0未注册
+ *
+ * @return 是否注册技威
+ */
+ public String getIsRegisterGwell() {
+ return this.isRegisterGwell;
+ }
+
+ /**
+ * 设置是否注册技威:1已注册、0未注册
+ *
+ * @param isRegisterGwell 是否注册技威:1已注册、0未注册
+ */
+ public void setIsRegisterGwell(String isRegisterGwell) {
+ this.isRegisterGwell = isRegisterGwell;
+ }
+
+ /**
+ * 获取极光用户ID
+ *
+ * @return 极光用户ID
+ */
+ public String getJiguangUserid() {
+ return this.jiguangUserid;
+ }
+
+ /**
+ * 设置极光用户ID
+ *
+ * @param jiguangUserid 极光用户ID
+ */
+ public void setJiguangUserid(String jiguangUserid) {
+ this.jiguangUserid = jiguangUserid;
+ }
+
+ /**
+ * 获取经度
+ *
+ * @return 经度
+ */
+ public Double getLongitude() {
+ return this.longitude;
+ }
+
+ /**
+ * 设置经度
+ *
+ * @param longitude 经度
+ */
+ public void setLongitude(Double longitude) {
+ this.longitude = longitude;
+ }
+
+ /**
+ * 获取纬度
+ *
+ * @return 纬度
+ */
+ public Double getLatitude() {
+ return this.latitude;
+ }
+
+ /**
+ * 设置纬度
+ *
+ * @param latitude 纬度
+ */
+ public void setLatitude(Double latitude) {
+ this.latitude = latitude;
+ }
+}
diff --git a/src/main/java/com/ifish/config/MinaConfig.java b/src/main/java/com/ifish/config/MinaConfig.java
new file mode 100644
index 0000000..00f9d5b
--- /dev/null
+++ b/src/main/java/com/ifish/config/MinaConfig.java
@@ -0,0 +1,139 @@
+/*
+ * 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.config;
+
+import com.ifish.socket.codeFactory.ServerCodecFactory;
+import com.ifish.socket.config.JobFactory;
+import com.ifish.socket.config.MinaServerHandler;
+import com.ifish.socket.config.MyInetSocketAddress;
+import com.ifish.socket.config.ScheduleJob;
+import com.ifish.socket.config.SomeServer;
+import com.ifish.socket.webService.ServiceBean;
+import com.ifish.util.IfishFilePath;
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.mina.core.filterchain.DefaultIoFilterChainBuilder;
+import org.apache.mina.filter.codec.ProtocolCodecFilter;
+import org.apache.mina.filter.logging.LoggingFilter;
+import org.apache.mina.transport.socket.nio.NioSocketAcceptor;
+import org.springframework.context.annotation.Bean;
+
+/**
+ *
+ * @author Administrator
+ */
+public class MinaConfig {
+
+ /**
+ * webService
+ *
+ * @return
+ */
+ @Bean
+ public ServiceBean serviceBean() {
+ return new ServiceBean();
+ }
+
+ /**
+ * 消息处理类
+ *
+ * @return
+ */
+ @Bean
+ public SomeServer someServer() {
+ return new SomeServer();
+ }
+
+ /**
+ * 实现job中注入bean
+ *
+ * @return
+ */
+ @Bean
+ public JobFactory jobFactory() {
+ return new JobFactory();
+ }
+
+ /**
+ * 调度任务
+ *
+ * @return
+ */
+ @Bean
+ public ScheduleJob scheduleJob() {
+ return new ScheduleJob();
+ }
+
+ /**
+ * 自定义的serverHandler
+ *
+ * @return
+ */
+ @Bean
+ public MinaServerHandler serverHandler() {
+ return new MinaServerHandler();
+ }
+
+ /**
+ * 指定服务端地址和端口
+ *
+ * @return
+ */
+ @Bean
+ public MyInetSocketAddress address() {
+ MyInetSocketAddress myInetSocketAddress = new MyInetSocketAddress(IfishFilePath.ifiship, IfishFilePath.ifishport);
+ return myInetSocketAddress;
+ }
+
+ /**
+ * 编码filter
+ *
+ * @return
+ */
+ @Bean
+ public ProtocolCodecFilter codecFilter() {
+ return new ProtocolCodecFilter(new ServerCodecFactory());
+ }
+
+ /**
+ * 日志filter
+ *
+ * @return
+ */
+ @Bean
+ public LoggingFilter loggingFilter() {
+ return new LoggingFilter();
+ }
+
+ /**
+ * 过滤器链
+ *
+ * @return
+ */
+ @Bean
+ public DefaultIoFilterChainBuilder filterChainBuilder() {
+ DefaultIoFilterChainBuilder defaultIoFilterChainBuilder = new DefaultIoFilterChainBuilder();
+ Map map = new HashMap();
+ map.put("codecFilter", codecFilter());
+ defaultIoFilterChainBuilder.setFilters(map);
+ return defaultIoFilterChainBuilder;
+ }
+
+ /**
+ * 开始运行socket服务
+ * @return
+ */
+ @Bean(initMethod = "bind", destroyMethod = "unbind")
+ public NioSocketAcceptor ioAcceptor() {
+ NioSocketAcceptor nioSocketAcceptor = new NioSocketAcceptor();
+ nioSocketAcceptor.setHandler(serverHandler());
+ nioSocketAcceptor.setDefaultLocalAddress(address().getSocketAddress());
+ nioSocketAcceptor.setFilterChainBuilder(filterChainBuilder());
+ nioSocketAcceptor.setReuseAddress(true);
+ nioSocketAcceptor.getSessionConfig().setBothIdleTime(0);
+ return nioSocketAcceptor;
+ }
+}
diff --git a/src/main/java/com/ifish/config/MyWSServletContextListener.java b/src/main/java/com/ifish/config/MyWSServletContextListener.java
new file mode 100644
index 0000000..d2da971
--- /dev/null
+++ b/src/main/java/com/ifish/config/MyWSServletContextListener.java
@@ -0,0 +1,14 @@
+/*
+ * 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.config;
+
+/**
+ *
+ * @author Administrator
+ */
+public class MyWSServletContextListener {
+
+}
diff --git a/src/main/java/com/ifish/config/MybatisConfig.java b/src/main/java/com/ifish/config/MybatisConfig.java
new file mode 100644
index 0000000..235479f
--- /dev/null
+++ b/src/main/java/com/ifish/config/MybatisConfig.java
@@ -0,0 +1,86 @@
+/*
+ * 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.config;
+
+import javax.sql.DataSource;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.mapper.MapperScannerConfigurer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+import org.springframework.jdbc.datasource.DriverManagerDataSource;
+import org.springframework.transaction.PlatformTransactionManager;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+/**
+ *
+ * @author Administrator
+ */
+@Configuration
+@EnableTransactionManagement
+public class MybatisConfig {
+
+ @Bean
+ public DataSource dataSource() {
+// try {
+// ComboPooledDataSource datasourc = new ComboPooledDataSource();
+// datasourc.setDriverClass(JdbcProperties.driverClassName);
+// datasourc.setJdbcUrl(JdbcProperties.url);
+// datasourc.setUser(JdbcProperties.username);
+// datasourc.setPassword(JdbcProperties.password);
+// datasourc.setAutoCommitOnClose(JdbcProperties.autoCommitOnClose);
+// datasourc.setInitialPoolSize(JdbcProperties.initialPoolSize);
+// datasourc.setMinPoolSize(JdbcProperties.minPoolSize);
+// datasourc.setMaxPoolSize(JdbcProperties.maxPoolSize);
+// datasourc.setAcquireIncrement(JdbcProperties.acquireIncrement);
+// datasourc.setCheckoutTimeout(JdbcProperties.checkoutTimeout);
+// datasourc.setMaxIdleTime(JdbcProperties.maxIdleTime);
+// datasourc.setIdleConnectionTestPeriod(JdbcProperties.idleConnectionTestPeriod);
+// return datasourc;
+// } catch (Exception e) {
+//
+// }
+ DriverManagerDataSource dataSource = new DriverManagerDataSource();
+ dataSource.setDriverClassName("com.mysql.jdbc.Driver");
+ //线上生产数据库连接
+ dataSource.setUsername("ifish");
+ dataSource.setPassword("ifish7pwd");
+ dataSource.setUrl("jdbc:mysql://localhost:3306/myfishdbenglish?characterEncoding=UTF-8");
+ return dataSource;
+ }
+
+ @Bean(name = "sqlSessionFactory")
+ public SqlSessionFactoryBean sqlSessionFactory() {
+ SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
+ ssfb.setDataSource(dataSource());
+ ssfb.setTypeAliasesPackage("com.ifish.bean");
+ try {
+ org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
+ configuration.setMapUnderscoreToCamelCase(true);
+ ssfb.setConfiguration(configuration);
+
+ } catch (Exception e) {
+ }
+
+ return ssfb;
+ }
+
+ @Bean
+ public MapperScannerConfigurer mpperScannnerConfigurer() {
+ MapperScannerConfigurer msc = new MapperScannerConfigurer();
+ msc.setSqlSessionFactoryBeanName("sqlSessionFactory");
+ msc.setBasePackage("com.ifish.mapper");
+ return msc;
+ }
+
+ @Bean
+ PlatformTransactionManager transactionManager() {
+ DataSourceTransactionManager transactionManager = new DataSourceTransactionManager();
+ transactionManager.setDataSource(dataSource());
+ return transactionManager;
+ }
+
+}
diff --git a/src/main/java/com/ifish/config/RedisConfig.java b/src/main/java/com/ifish/config/RedisConfig.java
new file mode 100644
index 0000000..1d37213
--- /dev/null
+++ b/src/main/java/com/ifish/config/RedisConfig.java
@@ -0,0 +1,58 @@
+/*
+ * 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.config;
+
+import com.ifish.util.IfishFilePath;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.StringRedisTemplate;
+
+/**
+ *
+ * @author Administrator
+ */
+@Configuration
+public class RedisConfig {
+
+ @Bean
+ public RedisConnectionFactory redisCF() {
+ JedisConnectionFactory cf = new JedisConnectionFactory();
+
+// //获取当前操作系统(servers_os为服务器设置的属性JAVA_OPTS=%JAVA_OPTS% -Dservers_os=online84)
+// String servers_os = System.getProperty("servers_os") == null ? "" : System.getProperty("servers_os");
+ if (IfishFilePath.link_img_head.contains("ifish7")) {
+ //站点线上服务器
+ cf.setHostName("120.55.190.56");
+ cf.setPort(3796);
+ cf.setPassword("ifish7myredis");
+ } else {
+ //站点测试服务器
+ cf.setHostName("139.196.24.156");
+ cf.setPort(3796);
+ cf.setPassword("ifish7myredis");
+// FileUtil.writeLinesByLog("测试缓存连接");
+ }
+
+ return cf;
+ }
+
+ @Bean
+ public RedisTemplate redisTemplate(RedisConnectionFactory cf) {
+ RedisTemplate redis = new RedisTemplate();
+ redis.setConnectionFactory(cf);
+ return redis;
+ }
+
+ @Bean
+ public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory cf) {
+ StringRedisTemplate redis = new StringRedisTemplate();
+ redis.setConnectionFactory(cf);
+ return redis;
+ }
+}
diff --git a/src/main/java/com/ifish/config/RootConfig.java b/src/main/java/com/ifish/config/RootConfig.java
new file mode 100644
index 0000000..f2aaaa3
--- /dev/null
+++ b/src/main/java/com/ifish/config/RootConfig.java
@@ -0,0 +1,26 @@
+/*
+ * 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.config;
+
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.ComponentScan.Filter;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.FilterType;
+import org.springframework.context.annotation.Import;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+
+/**
+ *
+ * @author Administrator
+ */
+@Configuration
+//@Import(MybatisConfig.class) //导入数据库文件配置
+@ComponentScan(basePackages = {"com.ifish.*"},
+ excludeFilters = {
+ @Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class)})
+public class RootConfig {
+
+}
diff --git a/src/main/java/com/ifish/config/WebAppInitializer.java b/src/main/java/com/ifish/config/WebAppInitializer.java
new file mode 100644
index 0000000..af5c16c
--- /dev/null
+++ b/src/main/java/com/ifish/config/WebAppInitializer.java
@@ -0,0 +1,46 @@
+/*
+ * 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.config;
+
+import javax.servlet.Filter;
+import org.springframework.context.annotation.Bean;
+import org.springframework.web.filter.CharacterEncodingFilter;
+import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
+
+/**
+ *
+ * @author Administrator
+ */
+public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
+
+ @Override
+ protected Class>[] getRootConfigClasses() {
+ return new Class>[]{RootConfig.class, MybatisConfig.class,MinaConfig.class};
+ }
+
+ @Override
+ protected Class>[] getServletConfigClasses() {
+ return new Class>[]{WebConfig.class};
+ }
+
+ @Override
+ protected String[] getServletMappings() {
+ return new String[]{"/api/*"};
+ }
+
+ @Override
+ protected Filter[] getServletFilters() {
+ return null;
+ }
+
+ @Bean
+ public Filter characterEncodingFilter() {
+ CharacterEncodingFilter filter = new CharacterEncodingFilter();
+ filter.setEncoding("UTF-8");
+ filter.setForceEncoding(true);
+ return filter;
+ }
+}
diff --git a/src/main/java/com/ifish/config/WebConfig.java b/src/main/java/com/ifish/config/WebConfig.java
new file mode 100644
index 0000000..9771e0a
--- /dev/null
+++ b/src/main/java/com/ifish/config/WebConfig.java
@@ -0,0 +1,59 @@
+/*
+ * 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.config;
+
+import com.ifish.util.IfishFilePath;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.ViewResolver;
+import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+import org.springframework.web.servlet.view.InternalResourceViewResolver;
+
+/**
+ *
+ * @author Administrator
+ */
+@Configuration
+/**
+ * 启动SpringMVC
+ */
+@EnableWebMvc
+/**
+ * 启动组件扫描器,com.mymvc.controller是包
+ */
+@ComponentScan("com.ifish.controller")
+public class WebConfig extends WebMvcConfigurerAdapter {
+
+ /**
+ * 配置视图解析器
+ *
+ * @return
+ */
+ @Bean
+ public ViewResolver viewResolver() {
+ InternalResourceViewResolver resolver = new InternalResourceViewResolver();
+ resolver.setPrefix("/WEB-INF/views/");
+ resolver.setSuffix(".jsp");
+ resolver.setExposeContextBeansAsAttributes(true);
+ return resolver;
+ }
+
+ /**
+ * 配置静态资源的处理
+ *
+ * @param configurer
+ */
+ @Override
+ public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
+ configurer.enable();;
+ }
+
+
+}
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/enums/SubDirectoryEnum.java b/src/main/java/com/ifish/enums/SubDirectoryEnum.java
new file mode 100644
index 0000000..2715c25
--- /dev/null
+++ b/src/main/java/com/ifish/enums/SubDirectoryEnum.java
@@ -0,0 +1,45 @@
+/*
+ * 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.enums;
+
+/**
+ *
+ * @author Administrator
+ */
+public enum SubDirectoryEnum {
+ headImage("app/", "头像"),
+ banner("banner/", "banner图"),
+ look("look/", "看护报告"),
+ ueditorHtml("ueditorHtml/", "后台生成的网页"),
+ adInfo("Img/adInfo/", "广告图片"),
+ information("Img/information/", "资讯图片"),
+ ifishGoods("Img/goods/", "商品图片"),
+ ifishCommodity("Img/commodity/", "商家商品介绍图");
+
+ private SubDirectoryEnum(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/helper/DeviceHelperI.java b/src/main/java/com/ifish/helper/DeviceHelperI.java
new file mode 100644
index 0000000..f3bf135
--- /dev/null
+++ b/src/main/java/com/ifish/helper/DeviceHelperI.java
@@ -0,0 +1,41 @@
+/*
+ * 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.helper;
+
+import com.ifish.bean.LoginRecord;
+import com.ifish.bean.Tbl_Device;
+import com.ifish.bean.Tbl_Device_User;
+import com.ifish.bean.Tbl_Factory_List;
+import com.ifish.bean.Tbl_HardWare_Type;
+import com.ifish.socket.model.send.DeviceLoginContextLength24;
+import java.util.List;
+
+/**
+ *
+ * @author Administrator
+ */
+public interface DeviceHelperI {
+
+ public Tbl_Device update(Tbl_Device device);
+
+ public Tbl_Device update(DeviceLoginContextLength24 model);
+
+ public void updateWarnOnoff(String macAddress, String onOff);
+
+ public Tbl_Device getUniqueByProperty(String property, Object value);
+
+ public List getByProperty(String property, Object value);
+
+ public Tbl_Device_User getUniqueByProperty(String macAddress);
+
+ public List getListByProperty(Integer deviceId);
+
+ public LoginRecord save(LoginRecord loginRecord);
+
+ public Tbl_Factory_List getFactoryListById(String factoryCode);
+
+ public Tbl_HardWare_Type getHardwareTypeById(String typeCode);
+}
diff --git a/src/main/java/com/ifish/helper/UserHelperI.java b/src/main/java/com/ifish/helper/UserHelperI.java
new file mode 100644
index 0000000..3470650
--- /dev/null
+++ b/src/main/java/com/ifish/helper/UserHelperI.java
@@ -0,0 +1,20 @@
+/*
+ * 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.helper;
+
+import com.ifish.bean.Tbl_Push_List;
+import com.ifish.bean.Tbl_User;
+
+/**
+ *
+ * @author Administrator
+ */
+public interface UserHelperI {
+
+ public Tbl_User findById(Integer userId);
+
+ public Tbl_Push_List save(Tbl_Push_List pushList);
+}
diff --git a/src/main/java/com/ifish/socket/codeFactory/Context.java b/src/main/java/com/ifish/socket/codeFactory/Context.java
new file mode 100644
index 0000000..3d632d2
--- /dev/null
+++ b/src/main/java/com/ifish/socket/codeFactory/Context.java
@@ -0,0 +1,58 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.ifish.socket.codeFactory;
+
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+import org.apache.mina.core.buffer.IoBuffer;
+
+/**
+ *
+ * @author Administrator
+ */
+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/socket/codeFactory/ServerCodecFactory.java b/src/main/java/com/ifish/socket/codeFactory/ServerCodecFactory.java
new file mode 100644
index 0000000..897b763
--- /dev/null
+++ b/src/main/java/com/ifish/socket/codeFactory/ServerCodecFactory.java
@@ -0,0 +1,31 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.ifish.socket.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;
+
+/**
+ *
+ * @author Administrator
+ */
+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/socket/codeFactory/ServerDecode.java b/src/main/java/com/ifish/socket/codeFactory/ServerDecode.java
new file mode 100644
index 0000000..5cc6dd2
--- /dev/null
+++ b/src/main/java/com/ifish/socket/codeFactory/ServerDecode.java
@@ -0,0 +1,385 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.ifish.socket.codeFactory;
+
+import com.ifish.socket.model.send.DeviceLoginContextLength24;
+import com.ifish.socket.model.send.APPLoginContextLength25;
+import com.ifish.socket.model.send.ModelVersionLength22;
+import com.ifish.socket.model.send.ModelVersionLength38;
+import com.ifish.socket.model.send.TemperatureAlarmLength22;
+import com.ifish.socket.model.send.TemperatureSwitchLength22;
+import 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;
+
+/**
+ * 解码
+ *
+ * @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) {
+ TemperatureSwitch(buf, out);
+ } //设备报警
+ else if (check_code == 9) {
+ TemperatureAlarm(buf, out);
+ } //模块版本指令
+ else if (check_code == 16) {
+ ModelVersion(buf, out);
+ } else {
+ out.write(bytes);
+ }
+ break;
+ }
+ //长度为24,设备发登录请求
+ case 24: {
+ if (check_code == 1) {
+ DeviceLogin(buf, out);
+ }
+ break;
+ }
+ //长度为25,手机发登录请求
+ case 25: {
+ if (check_code == 0) {
+ AppLogin(buf, out);
+ }
+ break;
+ }
+ //模块版本指令
+ case 42: {
+ if (check_code == 17) {
+ ModelVersion17(buf, out);
+ }
+ break;
+ }
+ default: {
+ out.write(bytes);
+ }
+ }
+ }
+
+ /**
+ * 设备登陆服务器
+ *
+ * @param buf
+ * @param out
+ */
+ private void DeviceLogin(IoBuffer buf, ProtocolDecoderOutput out) {
+ DeviceLoginContextLength24 model = new DeviceLoginContextLength24();
+ //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 AppLogin(IoBuffer buf, ProtocolDecoderOutput out) {
+ APPLoginContextLength25 model = new APPLoginContextLength25();
+ //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 TemperatureSwitch(IoBuffer buf, ProtocolDecoderOutput out) {
+ TemperatureSwitchLength22 model = new TemperatureSwitchLength22();
+ //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 ModelVersion(IoBuffer buf, ProtocolDecoderOutput out) {
+ ModelVersionLength22 model = new ModelVersionLength22();
+ //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 ModelVersion17(IoBuffer buf, ProtocolDecoderOutput out) {
+ ModelVersionLength38 model = new ModelVersionLength38();
+ //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 TemperatureAlarm(IoBuffer buf, ProtocolDecoderOutput out) {
+ TemperatureAlarmLength22 model = new TemperatureAlarmLength22();
+ //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/socket/codeFactory/ServerEncode.java b/src/main/java/com/ifish/socket/codeFactory/ServerEncode.java
new file mode 100644
index 0000000..37f4926
--- /dev/null
+++ b/src/main/java/com/ifish/socket/codeFactory/ServerEncode.java
@@ -0,0 +1,137 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.ifish.socket.codeFactory;
+
+import com.ifish.socket.model.receive.APPLoginResponseLength26;
+import com.ifish.socket.model.receive.DeviceLoginResponseLength25;
+import com.ifish.socket.model.receive.ServerHeartbeatLength17;
+import com.ifish.socket.model.send.UpgradeVersionLength78;
+import com.ifish.socket.model.send.TemperatureSwitchLength22;
+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;
+
+/**
+ * 编码
+ *
+ * @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 ServerHeartbeatLength17) {
+ ServerHeartbeatLength17 model = (ServerHeartbeatLength17) 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 TemperatureSwitchLength22) {
+ TemperatureSwitchLength22 model = (TemperatureSwitchLength22) 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 APPLoginResponseLength26) {
+ APPLoginResponseLength26 model = (APPLoginResponseLength26) 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 DeviceLoginResponseLength25) {
+ DeviceLoginResponseLength25 model = (DeviceLoginResponseLength25) 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 UpgradeVersionLength78) {
+ UpgradeVersionLength78 model = (UpgradeVersionLength78) 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/socket/config/ExecuteJob.java b/src/main/java/com/ifish/socket/config/ExecuteJob.java
new file mode 100644
index 0000000..81f2658
--- /dev/null
+++ b/src/main/java/com/ifish/socket/config/ExecuteJob.java
@@ -0,0 +1,119 @@
+
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.ifish.socket.config;
+
+import com.ifish.bean.Tbl_Device;
+import com.ifish.bean.Tbl_Device_Statistics;
+import com.ifish.bean.Tbl_Device_User;
+import com.ifish.bean.Tbl_Push_List;
+import com.ifish.bean.Tbl_User;
+import com.ifish.enums.PushTypeEnum;
+import com.ifish.helper.DeviceHelperI;
+import com.ifish.helper.UserHelperI;
+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;
+
+/**
+ *
+ * @author Administrator
+ */
+public class ExecuteJob implements Job {
+
+ private static Logger log = LoggerFactory.getLogger(ExecuteJob.class);
+ //@Autowired
+ //private NeteaseIM neteaseIM;
+ @Autowired
+ private UserHelperI userHelperI;
+ @Autowired
+ private DeviceHelperI deviceHelperI;
+
+ 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);
+ }
+ //设备是否存在
+ Tbl_Device device = deviceHelperI.getUniqueByProperty("macAddress", macAddress);
+ Tbl_Device_Statistics device_Statistics = null;
+ if (device != null) {
+ //记录次数
+ Integer number1 = device_Statistics.getMcuCount();
+ Integer number2 = device_Statistics.getModuleCount();
+ Integer number3 = device_Statistics.getRouterCount();
+ Integer number4 = device_Statistics.getServerCount();
+ Integer number5 = device_Statistics.getServerTryCount();
+ List list = deviceHelperI.getListByProperty(device.getDeviceId());
+ //是否被绑定
+ if (list != null) {
+ for (Tbl_Device_User deviceUser : list) {
+ Integer userId = deviceUser.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;
+ //推送记录
+ Tbl_Push_List pushList = new Tbl_Push_List();
+ Integer deviceId = deviceUser.getDeviceId();
+ Tbl_User user = userHelperI.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.setJpushStatus(neteaseBln ? "1" : "0");
+ pushList.setPushTitle(title);
+ pushList.setPushContext(msg);
+ pushList.setCreateTime(new Date());
+ pushList.setMcuCount(number1);
+ pushList.setModularCount(number2);
+ pushList.setRouterCount(number3);
+ pushList.setServerCount(number4);
+ pushList.setServerTryCount(number5);
+ userHelperI.save(pushList);
+ }
+ }
+ }
+ }
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ log.error("error msg:{}", e.toString());
+ }
+ }
+}
diff --git a/src/main/java/com/ifish/socket/config/JobFactory.java b/src/main/java/com/ifish/socket/config/JobFactory.java
new file mode 100644
index 0000000..976a079
--- /dev/null
+++ b/src/main/java/com/ifish/socket/config/JobFactory.java
@@ -0,0 +1,31 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.ifish.socket.config;
+
+import org.quartz.spi.TriggerFiredBundle;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
+import org.springframework.scheduling.quartz.AdaptableJobFactory;
+
+/**
+ *
+ * @author Administrator
+ */
+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/socket/config/MinaServerHandler.java b/src/main/java/com/ifish/socket/config/MinaServerHandler.java
new file mode 100644
index 0000000..e5824ce
--- /dev/null
+++ b/src/main/java/com/ifish/socket/config/MinaServerHandler.java
@@ -0,0 +1,126 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.ifish.socket.config;
+
+import com.ifish.socket.model.JobGroup;
+import com.ifish.util.IfishUtil;
+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;
+
+/**
+ *
+ * @author Administrator
+ */
+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/socket/config/MyInetSocketAddress.java b/src/main/java/com/ifish/socket/config/MyInetSocketAddress.java
new file mode 100644
index 0000000..2260d5e
--- /dev/null
+++ b/src/main/java/com/ifish/socket/config/MyInetSocketAddress.java
@@ -0,0 +1,53 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.ifish.socket.config;
+
+import java.net.InetSocketAddress;
+
+/**
+ *
+ * @author Administrator
+ */
+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/socket/config/ScheduleJob.java b/src/main/java/com/ifish/socket/config/ScheduleJob.java
new file mode 100644
index 0000000..684dfaa
--- /dev/null
+++ b/src/main/java/com/ifish/socket/config/ScheduleJob.java
@@ -0,0 +1,114 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.ifish.socket.config;
+
+import com.ifish.socket.model.JobGroup;
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+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 Administrator
+ */
+public class ScheduleJob {
+
+ private static Logger log = LoggerFactory.getLogger(ScheduleJob.class);
+ //调度
+ private Scheduler scheduler = null;
+
+ @Autowired
+ private JobFactory jobFactory;
+
+ @PostConstruct //初始化方法的注解方式 等同与init-method=init
+ 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());
+ }
+ }
+
+ /**
+ * 关闭调度任务
+ */
+ @PreDestroy //销毁方法的注解方式 等同于destory-method=destory222
+ public void shutdown() {
+ try {
+ //关闭任务
+ scheduler.shutdown();
+ } catch (SchedulerException e) {
+ log.error("shutdown scheduler error:{}", e.toString());
+ }
+ }
+}
diff --git a/src/main/java/com/ifish/socket/config/SomeServer.java b/src/main/java/com/ifish/socket/config/SomeServer.java
new file mode 100644
index 0000000..3deb2eb
--- /dev/null
+++ b/src/main/java/com/ifish/socket/config/SomeServer.java
@@ -0,0 +1,364 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.ifish.socket.config;
+
+import com.ifish.bean.LoginRecord;
+import com.ifish.bean.Tbl_Device;
+import com.ifish.bean.Tbl_Device_Statistics;
+import com.ifish.bean.Tbl_Device_User;
+import com.ifish.bean.Tbl_Push_List;
+import com.ifish.bean.Tbl_User;
+import com.ifish.enums.PushTypeEnum;
+import com.ifish.helper.DeviceHelperI;
+import com.ifish.helper.UserHelperI;
+import com.ifish.socket.model.JobGroup;
+import com.ifish.socket.model.OrderModel;
+import com.ifish.socket.model.receive.APPLoginResponseLength26;
+import com.ifish.socket.model.receive.DeviceLoginResponseLength25;
+import com.ifish.socket.model.receive.ServerHeartbeatLength17;
+import com.ifish.socket.model.send.DeviceLoginContextLength24;
+import com.ifish.socket.model.send.ModelVersionLength22;
+import com.ifish.socket.model.send.ModelVersionLength38;
+import com.ifish.socket.model.send.TemperatureAlarmLength22;
+import com.ifish.socket.model.send.TemperatureSwitchLength22;
+import com.ifish.socket.model.send.UpgradeVersionLength78;
+import com.ifish.util.ByteUtil;
+import com.ifish.util.IfishUtil;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArraySet;
+import org.apache.mina.core.session.IoSession;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ *
+ * @author Administrator
+ */
+public class SomeServer {
+
+ @Autowired
+ private UserHelperI userHelperI;
+ @Autowired
+ private DeviceHelperI deviceHelperI;
+ @Autowired
+ private ScheduleJob scheduleJob;
+// @Autowired
+// private NeteaseIM neteaseIM;
+
+ //是否回复心跳
+ 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 TemperatureSwitchLength22) {
+ TemperatureSwitchLength22 receive = (TemperatureSwitchLength22) message;
+ String strDest = ByteUtil.bytesToHexString(receive.getDest());
+ sendToDevice(session, strDest, message);
+ try {
+ Integer Onoff = receive.getOnoff() & 0xff;
+ if (Onoff == 1 || Onoff == 0) {
+ deviceHelperI.updateWarnOnoff(strDest, Onoff.toString());
+ } else {
+ log.error("error Onoff:{},macAddress:{}", Onoff, strDest);
+ }
+ } catch (Exception e) {
+ log.warn("set OrderSetWarnModel error:macAddress:{},error msg:{}", strDest, e.toString());
+ }
+ } //设备温度报警
+ else if (message instanceof TemperatureAlarmLength22) {
+ TemperatureAlarmLength22 receive = (TemperatureAlarmLength22) message;
+ String strSrc = ByteUtil.bytesToHexString(receive.getSrc());
+ //推送类型
+ Integer warnType = receive.getWarn_type() & 0xff;
+ if (warnType == 0) {
+ pushNotifcation(strSrc, PushTypeEnum.wendu_warn.getValue(), "温度达到" + (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 DeviceLoginContextLength24) {
+ DeviceLoginContextLength24 receive = (DeviceLoginContextLength24) message;
+ byte[] srcBytes = receive.getSrc();
+ byte[] destBytes = receive.getDest();
+ String strSrc = ByteUtil.bytesToHexString(srcBytes);
+ //服务器回复设备登录请求
+ DeviceLoginResponseLength25 model = OrderModel.DeviceLoginResponseLength25(destBytes, srcBytes);
+ //直接往本次session写回去
+ session.write(model);
+ //保存连接
+ sessions_cz.put(strSrc, session);
+ remoteAddress.put(session.getRemoteAddress().toString(), strSrc);
+ //设备重新连接上,则移除延时推送的任务
+ JobGroup jobGroup = new JobGroup();
+ jobGroup.setJobName(strSrc);
+ jobGroup.setTriggerName(strSrc);
+ scheduleJob.deleteJob(jobGroup);
+ try {
+ //更新设备信息
+ deviceHelperI.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());
+ deviceHelperI.save(loginRecord);
+// }
+ } catch (Exception e) {
+ log.warn("save device login error:macAddress:{},error msg:{}", strSrc, e.toString());
+ }
+ } //APP登录服务器
+ else if (message instanceof APPLoginResponseLength26) {
+ APPLoginResponseLength26 receive = (APPLoginResponseLength26) message;
+ byte[] srcBytes = receive.getSrc();
+ byte[] destBytes = receive.getDest();
+ String strDest = ByteUtil.bytesToHexString(receive.getDest());
+ //设备是否在线
+ IoSession tmpSession = sessions_cz.get(strDest);
+ //1表示在线,0表示离线
+ byte login_status = 0;
+ if (tmpSession != null && tmpSession.getRemoteAddress() != null) {
+ login_status = 1;
+ } else {
+ login_status = 0;
+ }
+ //服务器回复APP登录请求
+ APPLoginResponseLength26 model = OrderModel.APPLoginResponseLength26(destBytes, srcBytes, login_status);
+ session.write(model);
+ //保存APP连接
+ CopyOnWriteArraySet 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 ModelVersionLength22) {
+ ModelVersionLength22 receive = (ModelVersionLength22) message;
+ byte[] macBytes = receive.getSrc();
+ String strSrc = ByteUtil.bytesToHexString(macBytes);
+ try {
+ //查找设备
+ Tbl_Device device = deviceHelperI.getUniqueByProperty("macAddress", strSrc);
+ Tbl_Device_Statistics device_Statistics = null;
+ if (device != null) {
+ //是否升级
+ if (device_Statistics.getIsUpgrade().equals("1")) {
+ device_Statistics.setIsUpgrade("0");
+ device_Statistics.setUpgradeTime(new Date());
+ //升级版本
+ int upgradeVersion = Integer.valueOf(device_Statistics.getUpgradeVersion());
+ UpgradeVersionLength78 model = OrderModel.UpgradeVersionLength78(macBytes, upgradeVersion);
+ session.write(model);
+ }
+ //记录参数
+ device_Statistics.setSdkVersion(String.valueOf(receive.getVersion() & 0xff));
+ device_Statistics.setSdkTime(IfishUtil.StrToDate(receive.getYear() + "-" + (receive.getMonth() & 0xff) + "-" + (receive.getDay() & 0xff)));
+ deviceHelperI.update(device);
+ }
+ } catch (Exception e) {
+ log.warn("save device sdk version16 error:macAddress:{},error msg:{}", strSrc, e.toString());
+ }
+ } //模块版本号
+ else if (message instanceof ModelVersionLength38) {
+ ModelVersionLength38 receive = (ModelVersionLength38) message;
+ byte[] macBytes = receive.getSrc();
+ String strSrc = ByteUtil.bytesToHexString(macBytes);
+ try {
+ //查找设备
+ Tbl_Device device = deviceHelperI.getUniqueByProperty("macAddress", strSrc);
+ Tbl_Device_Statistics device_Statistics = null;
+ if (device != null) {
+ //是否升级
+ if (device_Statistics.getIsUpgrade().equals("1")) {
+ device_Statistics.setIsUpgrade("0");
+ device_Statistics.setUpgradeTime(new Date());
+ //升级版本
+ int upgradeVersion = Integer.parseInt(device_Statistics.getUpgradeVersion());
+ UpgradeVersionLength78 model = OrderModel.UpgradeVersionLength78(macBytes, upgradeVersion);
+ session.write(model);
+ }
+ //记录参数
+ device_Statistics.setSdkVersion(String.valueOf(receive.getVersion() & 0xff));
+ device_Statistics.setSdkTime(IfishUtil.StrToDate(receive.getYear() + "-" + (receive.getMonth() & 0xff) + "-" + (receive.getDay() & 0xff)));
+ device_Statistics.setMcuCount(receive.getNumber1());
+ device_Statistics.setModuleCount(receive.getNumber2());
+ device_Statistics.setRouterCount(receive.getNumber3());
+ device_Statistics.setServerCount(receive.getNumber4());
+ device_Statistics.setServerTryCount(receive.getNumber5());
+ deviceHelperI.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) {
+ ServerHeartbeatLength17 model = OrderModel.ServerHeartbeatLength17(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);
+ APPLoginResponseLength26 model = OrderModel.APPLoginResponseLength26(bytes, bytes, (byte) 0);
+ session.write(model);
+ }
+ }
+
+ /**
+ * 温度预警推送
+ *
+ * @param strSrc
+ * @param title
+ * @param contont
+ */
+ public void pushNotifcation(String strSrc, String title, String contont) {
+ try {
+ //Device device = deviceService.getUniqueByProperty("macAddress", strSrc);
+ Tbl_Device device = deviceHelperI.getUniqueByProperty("macAddress", strSrc);
+ Tbl_Device_Statistics device_Statistics = null;
+ if (device != null) {
+ Integer deviceId = device.getDeviceId();
+ //是否开启预警
+ String onOff = device.getOnOff();
+ if (onOff != null && onOff.equals("1")) {
+ //绑定设备的用户
+ List list = deviceHelperI.getListByProperty(device.getDeviceId());
+ for (Tbl_Device_User deviceUser : list) {
+ Integer userId = deviceUser.getUserId();
+ String showName = deviceUser.getShowName();
+ String timestamp = IfishUtil.format(new Date());
+ String msg = "【" + title + "】你的水族箱“" + showName + "”在" + timestamp + contont;
+ Tbl_User user = userHelperI.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) {
+ //推送记录
+ Tbl_Push_List pushList = new Tbl_Push_List();
+ 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.setJpushStatus(neteaseBln ? "1" : "0");
+ pushList.setCreateTime(new Date());
+ pushList.setMcuCount(device_Statistics.getMcuCount());
+ pushList.setModularCount(device_Statistics.getModuleCount());
+ pushList.setRouterCount(device_Statistics.getRouterCount());
+ pushList.setServerCount(device_Statistics.getServerCount());
+ pushList.setServerTryCount(device_Statistics.getServerTryCount());
+ userHelperI.save(pushList);
+ }
+ }
+ }
+ }
+
+ }
+ }
+ } catch (Exception e) {
+ log.warn("pushNotifcation error:macAddress:{},error msg:{}", strSrc, e.toString());
+ }
+ }
+}
diff --git a/src/main/java/com/ifish/socket/model/DeviceResponseLength99.java b/src/main/java/com/ifish/socket/model/DeviceResponseLength99.java
new file mode 100644
index 0000000..f83b8f8
--- /dev/null
+++ b/src/main/java/com/ifish/socket/model/DeviceResponseLength99.java
@@ -0,0 +1,500 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.ifish.socket.model;
+
+import java.io.Serializable;
+
+/**
+ *
+ * @author Administrator
+ */
+public class DeviceResponseLength99 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/socket/model/HeadModel.java b/src/main/java/com/ifish/socket/model/HeadModel.java
new file mode 100644
index 0000000..d0d0b44
--- /dev/null
+++ b/src/main/java/com/ifish/socket/model/HeadModel.java
@@ -0,0 +1,80 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.ifish.socket.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/socket/model/JobGroup.java b/src/main/java/com/ifish/socket/model/JobGroup.java
new file mode 100644
index 0000000..35fbc72
--- /dev/null
+++ b/src/main/java/com/ifish/socket/model/JobGroup.java
@@ -0,0 +1,107 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.ifish.socket.model;
+
+import java.util.Date;
+
+/**
+ *
+ * @author Administrator
+ */
+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/socket/model/OrderModel.java b/src/main/java/com/ifish/socket/model/OrderModel.java
new file mode 100644
index 0000000..178693a
--- /dev/null
+++ b/src/main/java/com/ifish/socket/model/OrderModel.java
@@ -0,0 +1,101 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.ifish.socket.model;
+
+import com.ifish.socket.model.receive.APPLoginResponseLength26;
+import com.ifish.socket.model.receive.DeviceLoginResponseLength25;
+import com.ifish.socket.model.receive.ServerHeartbeatLength17;
+import com.ifish.socket.model.send.UpgradeVersionLength78;
+import com.ifish.util.ByteUtil;
+
+/**
+ *
+ * @author Administrator
+ */
+public class OrderModel {
+
+ /**
+ * 服务器回复设备登录请求指令
+ *
+ * @param src
+ * @param dest
+ * @return
+ */
+ public final static DeviceLoginResponseLength25 DeviceLoginResponseLength25(byte[] src, byte[] dest) {
+ DeviceLoginResponseLength25 model = new DeviceLoginResponseLength25();
+ 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 APPLoginResponseLength26 APPLoginResponseLength26(byte[] src, byte[] dest, byte login_status) {
+ APPLoginResponseLength26 model = new APPLoginResponseLength26();
+ 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 ServerHeartbeatLength17 ServerHeartbeatLength17(String macAddress) {
+ ServerHeartbeatLength17 model = new ServerHeartbeatLength17();
+ //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 UpgradeVersionLength78 UpgradeVersionLength78(byte[] macAddress, int version) {
+ UpgradeVersionLength78 model = new UpgradeVersionLength78();
+ //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/socket/model/receive/APPLoginResponseLength26.java b/src/main/java/com/ifish/socket/model/receive/APPLoginResponseLength26.java
new file mode 100644
index 0000000..ce51e39
--- /dev/null
+++ b/src/main/java/com/ifish/socket/model/receive/APPLoginResponseLength26.java
@@ -0,0 +1,41 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.ifish.socket.model.receive;
+
+import com.ifish.socket.model.HeadModel;
+import java.io.Serializable;
+
+/**
+ * 服务器回复手机端的登录请求26字节(17字节头+9字节)
+ *
+ * @author guogw
+ *
+ */
+public class APPLoginResponseLength26 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/socket/model/receive/DeviceLoginResponseLength25.java b/src/main/java/com/ifish/socket/model/receive/DeviceLoginResponseLength25.java
new file mode 100644
index 0000000..7f4d0bb
--- /dev/null
+++ b/src/main/java/com/ifish/socket/model/receive/DeviceLoginResponseLength25.java
@@ -0,0 +1,31 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.ifish.socket.model.receive;
+
+import com.ifish.socket.model.HeadModel;
+import java.io.Serializable;
+
+/**
+ * 服务器回复插座的登录请求25字节(15字节头+8字节时间+2字节)
+ *
+ * @author guogw
+ *
+ */
+public class DeviceLoginResponseLength25 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/socket/model/receive/ServerHeartbeatLength17.java b/src/main/java/com/ifish/socket/model/receive/ServerHeartbeatLength17.java
new file mode 100644
index 0000000..32c19d4
--- /dev/null
+++ b/src/main/java/com/ifish/socket/model/receive/ServerHeartbeatLength17.java
@@ -0,0 +1,21 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.ifish.socket.model.receive;
+
+import com.ifish.socket.model.HeadModel;
+import java.io.Serializable;
+
+/**
+ * 服务器响应心跳17字节(15字节头+2校验码)
+ *
+ * @author guogw
+ *
+ */
+public class ServerHeartbeatLength17 extends HeadModel implements Serializable {
+
+ private static final long serialVersionUID = 8470317692571925603L;
+
+}
diff --git a/src/main/java/com/ifish/socket/model/send/APPLoginContextLength25.java b/src/main/java/com/ifish/socket/model/send/APPLoginContextLength25.java
new file mode 100644
index 0000000..1a05d53
--- /dev/null
+++ b/src/main/java/com/ifish/socket/model/send/APPLoginContextLength25.java
@@ -0,0 +1,30 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.ifish.socket.model.send;
+
+import com.ifish.socket.model.HeadModel;
+import java.io.Serializable;
+
+/**
+ * 手机登录请求25字节(17字节头+8字节登陆信息)
+ *
+ * @author guogw
+ *
+ */
+public class APPLoginContextLength25 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/socket/model/send/DeviceLoginContextLength24.java b/src/main/java/com/ifish/socket/model/send/DeviceLoginContextLength24.java
new file mode 100644
index 0000000..8adec41
--- /dev/null
+++ b/src/main/java/com/ifish/socket/model/send/DeviceLoginContextLength24.java
@@ -0,0 +1,61 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.ifish.socket.model.send;
+
+import com.ifish.socket.model.HeadModel;
+import java.io.Serializable;
+
+/**
+ * 设备登录服务器(24字节=17+7字节登陆信息)
+ *
+ * @author guogw
+ *
+ */
+public class DeviceLoginContextLength24 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/socket/model/send/ModelVersionLength22.java b/src/main/java/com/ifish/socket/model/send/ModelVersionLength22.java
new file mode 100644
index 0000000..d21c083
--- /dev/null
+++ b/src/main/java/com/ifish/socket/model/send/ModelVersionLength22.java
@@ -0,0 +1,60 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.ifish.socket.model.send;
+
+import com.ifish.socket.model.HeadModel;
+import java.io.Serializable;
+
+/**
+ * 模块版本号,日期
+ *
+ * @author Administrator
+ */
+public class ModelVersionLength22 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/socket/model/send/ModelVersionLength38.java b/src/main/java/com/ifish/socket/model/send/ModelVersionLength38.java
new file mode 100644
index 0000000..a4fe84d
--- /dev/null
+++ b/src/main/java/com/ifish/socket/model/send/ModelVersionLength38.java
@@ -0,0 +1,111 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.ifish.socket.model.send;
+
+import com.ifish.socket.model.HeadModel;
+import java.io.Serializable;
+
+/**
+ * 模块版本号,日期,38字节(17字节头+21字节)
+ *
+ * @author guogw
+ *
+ */
+public class ModelVersionLength38 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/socket/model/send/TemperatureAlarmLength22.java b/src/main/java/com/ifish/socket/model/send/TemperatureAlarmLength22.java
new file mode 100644
index 0000000..569b57c
--- /dev/null
+++ b/src/main/java/com/ifish/socket/model/send/TemperatureAlarmLength22.java
@@ -0,0 +1,51 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.ifish.socket.model.send;
+
+import com.ifish.socket.model.HeadModel;
+import java.io.Serializable;
+
+/**
+ * 温度报警工作模式和温度指令22字节(17字节头+5字节)
+ *
+ * @author guogw
+ *
+ */
+public class TemperatureAlarmLength22 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/socket/model/send/TemperatureSwitchLength22.java b/src/main/java/com/ifish/socket/model/send/TemperatureSwitchLength22.java
new file mode 100644
index 0000000..aad3aa2
--- /dev/null
+++ b/src/main/java/com/ifish/socket/model/send/TemperatureSwitchLength22.java
@@ -0,0 +1,51 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.ifish.socket.model.send;
+
+import com.ifish.socket.model.HeadModel;
+import java.io.Serializable;
+
+/**
+ * 设置报警温度开关指令22字节(17字节头+5字节)
+ *
+ * @author guogw
+ *
+ */
+public class TemperatureSwitchLength22 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/socket/model/send/UpgradeVersionLength78.java b/src/main/java/com/ifish/socket/model/send/UpgradeVersionLength78.java
new file mode 100644
index 0000000..cf076d4
--- /dev/null
+++ b/src/main/java/com/ifish/socket/model/send/UpgradeVersionLength78.java
@@ -0,0 +1,41 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.ifish.socket.model.send;
+
+import com.ifish.socket.model.HeadModel;
+import java.io.Serializable;
+
+/**
+ * 升级命令78字节(17字节头+61字节)
+ *
+ * @author guogw
+ *
+ */
+public class UpgradeVersionLength78 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/socket/webService/MyService.java b/src/main/java/com/ifish/socket/webService/MyService.java
new file mode 100644
index 0000000..50dd40f
--- /dev/null
+++ b/src/main/java/com/ifish/socket/webService/MyService.java
@@ -0,0 +1,54 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.ifish.socket.webService;
+
+import com.ifish.socket.config.SomeServer;
+import com.ifish.socket.model.OrderModel;
+import com.ifish.socket.model.send.UpgradeVersionLength78;
+import com.ifish.util.ByteUtil;
+import javax.jws.WebService;
+import org.apache.mina.core.session.IoSession;
+
+/**
+ *
+ * @author Administrator
+ */
+@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) {
+ UpgradeVersionLength78 model = OrderModel.UpgradeVersionLength78(ByteUtil.hexStringToBytes2(macAddress), upgradeVersion);
+ session.write(model);
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/com/ifish/socket/webService/ServiceBean.java b/src/main/java/com/ifish/socket/webService/ServiceBean.java
new file mode 100644
index 0000000..d0b20d4
--- /dev/null
+++ b/src/main/java/com/ifish/socket/webService/ServiceBean.java
@@ -0,0 +1,19 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.ifish.socket.webService;
+
+import javax.xml.ws.Endpoint;
+
+/**
+ *
+ * @author Administrator
+ */
+public class ServiceBean {
+
+ public ServiceBean() {
+ Endpoint.publish("http://localhost:9001/Service/webService", new MyService());
+ }
+}
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..76f63c9
--- /dev/null
+++ b/src/main/java/com/ifish/util/ByteUtil.java
@@ -0,0 +1,196 @@
+package com.ifish.util;
+
+import com.ifish.socket.model.DeviceResponseLength99;
+import java.util.Calendar;
+
+import org.apache.mina.core.buffer.IoBuffer;
+import org.json.JSONException;
+import org.json.JSONObject;
+
+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(DeviceResponseLength99 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/IfishFilePath.java b/src/main/java/com/ifish/util/IfishFilePath.java
new file mode 100644
index 0000000..65f72ed
--- /dev/null
+++ b/src/main/java/com/ifish/util/IfishFilePath.java
@@ -0,0 +1,113 @@
+/*
+ * 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.util;
+
+import com.ifish.enums.SubDirectoryEnum;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.util.Properties;
+
+/**
+ *
+ * @author Administrator
+ */
+public class IfishFilePath {
+
+ //头像地址
+ public static String path_img;
+ /**
+ * 图片头地址
+ */
+ public static String link_img_head;
+ //商家图片地址
+ public static String path_shops;
+ //商品介绍图片
+ public static String path_commodity;
+ //微信分享页面
+ public static String path_share_html;
+ //微信分享页图片
+ public static String path_share_img;
+ //看护报告页面
+ public static String path_look_html;
+ //看护报告图片
+ public static String path_look_img;
+ //html名字
+ public static String html_name;
+ //图片上传格式
+ public static String check_style;
+ //云信爱鱼奇官方帐号
+ public static String ifish_account;
+ //IM官方手机号
+ public static String netease_phone;
+ //直播间封面
+ public static String path_room_img;
+ //FastDFS商家视频上传URL访问路径(本地和测试环境)
+ public static String fastDFS_url_local;
+ //FastDFS商家视频上传URL访问路径(正式环境)
+ public static String fastDFS_url_app;
+ //开发模式
+ public static boolean devModel;
+ //本机IP
+ public static String ifiship;
+ //本机端口
+ public static int ifishport;
+
+ static {
+ Properties prop = new Properties();
+ InputStream in = IfishFilePath.class.getResourceAsStream("/property.properties");
+ try {
+ prop.load(in);
+ //利用反射机制给属性赋值
+ Field[] fields = IfishFilePath.class.getDeclaredFields();
+ for (Field field : fields) {
+ String name = field.getName();
+ //获取property.properties的值
+ String value = prop.getProperty(name).trim();
+ //判断这个值希望塞入的变量类型,并进行转换
+ Object value1 = getValue(value, field);
+ //转换完成后塞入此变量
+ field.set(IfishFilePath.class, value1);
+
+ }
+ in.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * 验证图片格式
+ */
+ public static String checkImgName(String fileName) {
+ //对格式进行验证
+ int index = fileName.lastIndexOf(".");
+ String extEndName = fileName.substring(++index, fileName.length());
+ if (check_style.indexOf(extEndName.toUpperCase()) == -1) {
+ return null;
+ }
+ //返回格式.png
+ return "." + extEndName;
+ }
+
+ /**
+ * 获取图片链接地址
+ *
+ * @param type
+ * @return
+ */
+ public static String getPath(SubDirectoryEnum pictureEnum, String fileName) {
+ return link_img_head + pictureEnum.getKey() + fileName;
+ }
+
+ private static Object getValue(String value, Field field) {
+ if (field.getType().equals(int.class)) {
+ return Integer.valueOf(value);
+ } else if (field.getType().equals(boolean.class)) {
+ return Boolean.valueOf(value);
+ }
+ return value;
+ }
+}
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..3ea006d
--- /dev/null
+++ b/src/main/java/com/ifish/util/IfishUtil.java
@@ -0,0 +1,454 @@
+/*
+ * 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.util;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.UnsupportedEncodingException;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.type.JavaType;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ *
+ * @author Administrator
+ */
+public class IfishUtil {
+
+ private static final String formatDate = "yyyy-MM-dd HH:mm:ss";
+
+ private static final String formatDate3 = "MM-dd HH:mm";
+
+ private static final String formatDate2 = "yyyy-MM-dd HH:mm";
+
+ private static final String formatDate1 = "yyyy-MM-dd";
+
+ /**
+ * 测试缓存时间:一分钟;单位:秒
+ */
+ public static final int CacheTime_Test_SECONDS = 60;
+ /**
+ * 缓存时间:一秒;单位:秒
+ */
+ public static final int CacheTime_SECONDS = 1;
+ /**
+ * 缓存时间:一分钟;单位:分
+ */
+ public static final int CacheTime_MINUTES = 1;
+ /**
+ * 缓存时间:一小时;单位:小时
+ */
+ public static final int CacheTime_HOURS = 1;
+ /**
+ * 缓存时间:一天;单位:天
+ */
+ public static final int CacheTime_DAYS = 1;
+
+ /**
+ * Object转Json
+ */
+ public static String ObjectToJson(Object value) {
+ try {
+ if (value == null) {
+ return null;
+ }
+ ObjectMapper mapper = new ObjectMapper();
+ String js = mapper.writeValueAsString(value);
+ return js;
+ } catch (Exception ex) {
+ System.out.println("【异常信息】 >>> " + ex.toString());
+ return "Error";
+ }
+ }
+
+ /**
+ * Json转Object(List)
+ *
+ * @param json 需要转换的JSON字符串
+ * @param bean JavaBean,
+ * @return 拿到结果需要强转一次,因为你拿到的是Object, 例如这样调用和强转: List<School> lst
+ * =(List<School>)StringUtil.JsonToObjectList(value, School.class);
+ */
+ public static Object JsonToList(String json, Class> bean) throws Exception {
+ ObjectMapper mapper = new ObjectMapper();
+ JavaType javaType = mapper.getTypeFactory().constructParametricType(List.class, bean);
+ return mapper.readValue(json, javaType);
+ }
+
+ /**
+ * Json转Object(JavaBean)
+ *
+ * @param json 需要转换的JSON字符串
+ * @param bean JavaBean,
+ * @return 拿到结果需要强转一次,因为你拿到的是Object, 例如这样调用和强转: School lst
+ * =(School)StringUtil.JsonToObjectList(value, School.class);
+ */
+ public static Object JsonToBean(String json, Class> bean) throws Exception {
+ ObjectMapper mapper = new ObjectMapper();
+ JavaType javaType = mapper.getTypeFactory().uncheckedSimpleType(bean);
+ return mapper.readValue(json, javaType);
+ }
+
+ /**
+ * 将json格式的字符串解析成Map对象
+ */
+ public static Map> JsonToMap(String json) {
+ try {
+ ObjectMapper mapper = new ObjectMapper();
+ Map> maps = mapper.readValue(json, Map.class);
+ return maps;
+ } catch (Exception e) {
+ System.out.println("【异常信息】 >>> " + e.toString());
+ return null;
+ }
+ }
+
+ public static Map JsonToMapContainMap(String json) {
+ try {
+ ObjectMapper mapper = new ObjectMapper();
+ Map maps = mapper.readValue(json, Map.class);
+ return maps;
+ } catch (Exception e) {
+ System.out.println("【异常信息】 >>> " + e.toString());
+ return null;
+ }
+ }
+
+ public static Map JsonToRealMap(String json) {
+ try {
+ ObjectMapper mapper = new ObjectMapper();
+ Map maps = mapper.readValue(json, Map.class);
+ return maps;
+ } catch (Exception e) {
+ System.out.println("【异常信息】 >>> " + e.toString());
+ return null;
+ }
+ }
+
+
+ //返回时分秒的时间字符串
+ public static String TimestampToStringAndSecond(Object timestamp) {
+ DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ try {
+ return (format.format(timestamp));
+ } catch (Exception e) {
+ System.out.println("【isGaokaoYearExpire 异常】:" + e);
+ return "";
+ }
+ }
+
+ //返回时分秒的时间字符串
+ public static String TimestampToStringAndSecond(Object timestamp, String geshi) {
+ DateFormat format = new SimpleDateFormat(geshi);
+ try {
+ return (format.format(timestamp));
+ } catch (Exception e) {
+ System.out.println("【isGaokaoYearExpire 异常】:" + e);
+ return "";
+ }
+ }
+
+ /**
+ * 返回当前日期yyyy-MM-dd
+ *
+ * @return
+ * @throws ParseException
+ */
+ public static Date getCurDate() {
+ DateFormat df = DateFormat.getDateInstance();
+ try {
+ return df.parse(df.format(new Date()));
+ } catch (ParseException e) {
+ }
+ return null;
+ }
+
+ /**
+ * 格式化日期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 date
+ * @return
+ */
+ public static String format1(Date date) {
+ SimpleDateFormat format = new SimpleDateFormat(formatDate1);
+ return format.format(date);
+ }
+
+ /**
+ * 格式化日期
+ *
+ * @param date
+ * @return
+ */
+ public static String format2(Date date) {
+ SimpleDateFormat format = new SimpleDateFormat(formatDate2);
+ return format.format(date);
+ }
+
+ /**
+ * 格式化日期
+ *
+ * @param date
+ * @return
+ */
+ public static String format3(Date date) {
+ SimpleDateFormat format = new SimpleDateFormat(formatDate3);
+ 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;
+ }
+
+ /**
+ * 返回json数据
+ *
+ * @param str
+ * @return
+ */
+ public static Map returnJson(String key, Object value) {
+ Map map = new HashMap();
+ map.put("result", key);
+ if (value.equals("")) {
+ map.put("data", null);
+ } else {
+ map.put("data", value);
+ }
+ return map;
+ }
+
+ /**
+ * 返回json数据
+ *
+ * @param str
+ * @return
+ */
+ public static Map toJson(String key, Object value) {
+ Map map = new HashMap();
+ map.put("result", key);
+ if (value.equals("")) {
+ map.put("data", null);
+ } else {
+ map.put("data", value);
+ }
+ return map;
+ }
+
+ /**
+ * 上传图片文件
+ *
+ * @param fileUpload
+ * @param path
+ * @return
+ */
+ public static String uploadFile(MultipartFile fileUpload, String path) {
+ //根据时间得文件名
+ Calendar calendar = Calendar.getInstance();
+ String fileName = String.valueOf(calendar.getTimeInMillis());
+ //保存文件
+ if (fileUpload == null) {
+ return "base/default.png";
+ }
+ if (!fileUpload.isEmpty()) {
+ try {
+ if (!fileUpload.getOriginalFilename().equals("")) {
+ File picFile = new File(path, fileName + ".png");
+ //不存在则创建
+ if (!picFile.exists()) {
+ picFile.mkdirs();
+ }
+ //保存
+ fileUpload.transferTo(picFile);
+ }
+ return "share/" + fileName + ".png";
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+ return "";
+ }
+
+ /**
+ * 生成微信分享页面
+ *
+ * @param title
+ * @param base64
+ * @return
+ */
+ public static String getHtmlFile(String title, String pngName, String modelFile, String filePath) {
+ try {
+ if (pngName != null && !pngName.equals("")) {
+ //读取模板文件
+ FileInputStream fileinputstream = new FileInputStream(filePath + modelFile);
+ int lenght = fileinputstream.available();
+ byte bytes[] = new byte[lenght];
+ fileinputstream.read(bytes);
+ fileinputstream.close();
+ String templateContent = new String(bytes);
+ //替换掉模板中相应的地方
+ templateContent = templateContent.replaceAll("###title###", title);
+ templateContent = templateContent.replaceAll("###fileName###", pngName);
+ //根据时间得文件名
+ Calendar calendar = Calendar.getInstance();
+ String fileName = String.valueOf(calendar.getTimeInMillis());
+ fileName = fileName + ".html";
+ //建立文件输出流
+ FileOutputStream fileoutputstream = new FileOutputStream(filePath + fileName);
+ byte tag_bytes[] = templateContent.getBytes();
+ fileoutputstream.write(tag_bytes);
+ fileoutputstream.close();
+ return fileName;
+ }
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ return "";
+ }
+
+ /**
+ * 随即区间整数
+ *
+ * @param min
+ * @param max
+ * @return
+ */
+ public static int getRandom(int min, int max) {
+ int r = new Random().nextInt(max - min);
+ return r + min;
+ }
+
+ /**
+ * URL 解码
+ *
+ * @return String
+ * @author lifq
+ * @date 2015-3-17 下午04:09:51
+ */
+ public static String getURLDecoderString(String str) {
+ String result = "";
+ if (null == str) {
+ return "";
+ }
+ try {
+ result = java.net.URLDecoder.decode(str, "GBK");
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ }
+ return result;
+ }
+
+ /**
+ * URL 转码
+ *
+ * @return String
+ * @author lifq
+ * @date 2015-3-17 下午04:10:28
+ */
+ public static String getURLEncoderString(String str) {
+ String result = "";
+ if (null == str) {
+ return "";
+ }
+ try {
+ result = java.net.URLEncoder.encode(str, "GBK");
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ }
+ return result;
+ }
+
+ /**
+ * 正则表达式截取字符串
+ *
+ * @param str
+ * @param regex
+ * @return
+ */
+ public static String regex(String str, String regex) {
+ Matcher matcher = Pattern.compile(regex).matcher(str);
+ if (matcher.find()) {
+ return matcher.group(0);
+ } else {
+ return "";
+ }
+ }
+
+ public static String regexToChinese(String str) {
+ String regex = "([\\u4e00-\\u9fa5]+)";
+ return regex(str, regex);
+ }
+
+ /**
+ * 验证当前系统是windows(本地,返回true),还是unix(服务器,返回false)
+ *
+ * @return
+ */
+ public static boolean IsWinOrUnix() {
+ String os = System.getProperty("os.name");//获取当前操作系统
+ return os.toLowerCase().startsWith("win");
+ }
+}
diff --git a/src/main/java/com/ifish/util/JdbcProperties.java b/src/main/java/com/ifish/util/JdbcProperties.java
new file mode 100644
index 0000000..9260ea9
--- /dev/null
+++ b/src/main/java/com/ifish/util/JdbcProperties.java
@@ -0,0 +1,61 @@
+/*
+ * 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.util;
+
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.util.Properties;
+
+/**
+ *
+ * @author Administrator
+ */
+public class JdbcProperties {
+
+ public static String driverClassName;
+ public static String url;
+ public static String username;
+ public static String password;
+ public static boolean autoCommitOnClose;
+ public static int initialPoolSize;
+ public static int minPoolSize;
+ public static int maxPoolSize;
+ public static int acquireIncrement;
+ public static int checkoutTimeout;
+ public static int maxIdleTime;
+ public static int idleConnectionTestPeriod;
+
+ static {
+ Properties prop = new Properties();
+ InputStream in = IfishFilePath.class.getResourceAsStream("/jdbc.properties");
+ try {
+ prop.load(in);
+ //利用反射机制给属性赋值
+ Field[] fields = JdbcProperties.class.getDeclaredFields();
+ for (Field field : fields) {
+ String name = field.getName();
+ //获取property.properties的值
+ String value = prop.getProperty(name).trim();
+ //判断这个值希望塞入的变量类型,并进行转换
+ Object value1 = getValue(value, field);
+ //转换完成后塞入此变量
+ field.set(IfishFilePath.class, value1);
+ }
+ in.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private static Object getValue(String value, Field field) {
+ if (field.getType().equals(int.class)) {
+ return Integer.valueOf(value);
+ } else if (field.getType().equals(boolean.class)) {
+ return Boolean.valueOf(value);
+ }
+ return value;
+ }
+}
diff --git a/src/main/java/com/ifish/util/RedisKey.java b/src/main/java/com/ifish/util/RedisKey.java
new file mode 100644
index 0000000..331f03a
--- /dev/null
+++ b/src/main/java/com/ifish/util/RedisKey.java
@@ -0,0 +1,78 @@
+/*
+ * 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.util;
+
+/**
+ *
+ * @author Administrator
+ */
+public class RedisKey {
+
+ /**
+ * 用户缓存前缀
+ */
+ public static final String User_Key = "userE:";
+
+ /**
+ * 商家信息缓存前缀
+ */
+ public static final String ShopsInfo_Key = "shopsInfoE:";
+
+ /**
+ * 用户绑定设备缓存前缀
+ */
+ public static final String DeviceUser_Key = "deviceUserE:";
+
+ /**
+ * 设备绑定摄像头缓存前缀
+ */
+ public static final String DeviceCamera_key = "deviceCameraE:";
+
+ /**
+ * 设备详情缓存前缀
+ */
+ public static final String Device_key = "deviceE:";
+
+ /**
+ * 设备类型缓存前缀
+ */
+ public static final String HardWareType_key = "hardwaretypeE:";
+
+ /**
+ * 厂家列表缓存前缀
+ */
+ public static final String VenderList_key = "venderlistE:";
+
+ /**
+ * 用户和摄像头的绑定关系存前缀
+ */
+ public static final String CameraUser_key = "cameraUserE:";
+
+ /**
+ * 摄像头详情缓存前缀
+ */
+ public static final String Camera_key = "cameraE:";
+
+ /**
+ * 设备统计信息表缓存前缀
+ */
+ public static final String DeviceStatistic_key = "deviceStaticticsE:";
+
+ /**
+ * 直播间详情表缓存前缀
+ */
+ public static final String LiveRoom_key = "liveroomE:";
+
+ /**
+ * 直播间数量缓存前缀
+ */
+ public static final String LIVEROOM_COUNT_KEY = "liveroomcountE:";
+
+ /**
+ * 推送消息缓存前缀
+ */
+ public static final String PUSHLIST_KEY = "pushlistE:";
+}
diff --git a/src/main/resources/fdfs_client_ifish7.conf b/src/main/resources/fdfs_client_ifish7.conf
new file mode 100644
index 0000000..9661bfb
--- /dev/null
+++ b/src/main/resources/fdfs_client_ifish7.conf
@@ -0,0 +1,7 @@
+connect_timeout = 2
+network_timeout = 30
+charset = UTF-8
+http.tracker_http_port = 85
+http.anti_steal_token = no
+http.secret_key = FastDFS1234567890
+tracker_server = 120.55.190.56:22131
\ No newline at end of file
diff --git a/src/main/resources/fdfs_client_zhangxinyanv5.conf b/src/main/resources/fdfs_client_zhangxinyanv5.conf
new file mode 100644
index 0000000..6a88c9e
--- /dev/null
+++ b/src/main/resources/fdfs_client_zhangxinyanv5.conf
@@ -0,0 +1,8 @@
+connect_timeout = 2
+network_timeout = 30
+charset = UTF-8
+http.tracker_http_port = 8017
+http.anti_steal_token = no
+http.secret_key = FastDFS1234567890
+tracker_server = 139.196.24.156:22122
+
diff --git a/src/main/resources/jdbc.properties b/src/main/resources/jdbc.properties
new file mode 100644
index 0000000..1b38a52
--- /dev/null
+++ b/src/main/resources/jdbc.properties
@@ -0,0 +1,40 @@
+#c3p0.driverClassName=com.mysql.jdbc.Driver
+#c3p0.url=jdbc\:mysql\://localhost\:3306/myfishdbenglish?characterEncoding\=UTF-8
+#c3p0.username=ifish
+#c3p0.password=ifish7pwd
+#c3p0.autoCommitOnClose=true
+#c3p0.initialPoolSize=20
+#c3p0.minPoolSize=20
+#c3p0.maxPoolSize=50
+#c3p0.acquireIncrement=3
+
+#c3p0.checkoutTimeout=5000
+#c3p0.maxIdleTime=7200
+#c3p0.idleConnectionTestPeriod=18000
+#c3p0.maxIdleTimeExcessConnections=1800
+
+#c3p0.automaticTestTable=C3P0TestTable
+#c3p0.testConnectionOnCheckout=false
+#c3p0.testConnectionOnCheckin=false
+
+#\u8fd9\u91cc\u662f\u4e0a\u9762\u53d6\u6d88\u524d\u7f00\u7684\u5f15\u7528,\u5982\u679c\u4fee\u6539\uff0c\u8bf7\u4fee\u6539\u8fd9\u91cc
+driverClassName=com.mysql.jdbc.Driver
+url=jdbc\:mysql\://localhost\:3306/myfishdbenglish?characterEncoding\=UTF-8
+username=ifish
+password=ifish7pwd
+autoCommitOnClose=true
+initialPoolSize=20
+minPoolSize=20
+maxPoolSize=50
+acquireIncrement=3
+checkoutTimeout=5000
+maxIdleTime=7200
+idleConnectionTestPeriod=18000
+
+#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
diff --git a/src/main/resources/property.properties b/src/main/resources/property.properties
new file mode 100644
index 0000000..6fa1e49
--- /dev/null
+++ b/src/main/resources/property.properties
@@ -0,0 +1,44 @@
+#\u5934\u50cf\u5b58\u50a8\u8def\u5f84
+path_img=/mydata/tmp/Img/app
+#\u5546\u5bb6\u8ba4\u8bc1\u56fe\u7247
+path_shops=/mydata/tmp/Img/shops
+#\u5546\u54c1\u4ecb\u7ecd\u56fe\u7247
+path_commodity=/mydata/tmp/Img/commodity
+#\u76f4\u64ad\u95f4\u5c01\u9762
+path_room_img=/mydata/tmp/Img/room
+#\u5fae\u4fe1\u5206\u4eab\u9875\u9762
+path_share_html=/mydata/tmp/html/
+#\u5fae\u4fe1\u5206\u4eab\u9875\u56fe\u7247
+path_share_img=/mydata/tmp/html/images/share
+#\u770b\u62a4\u62a5\u544a\u9875\u9762
+path_look_html=/mydata/tmp/look/
+#\u770b\u62a4\u62a5\u544a\u56fe\u7247
+path_look_img=/mydata/tmp/look/images/share
+#\u770b\u62a4\u62a5\u544a\u6a21\u7248html\u540d\u5b57
+html_name=index.html
+#\u4e91\u4fe1\u7231\u9c7c\u5947\u5b98\u65b9\u5e10\u53f7
+ifish_account=ifish
+#IM\u5b98\u65b9\u624b\u673a\u53f7
+netease_phone=18501773036
+#FastDFS\u6587\u4ef6URL\u8bbf\u95ee\u8def\u5f84(\u672c\u5730\u548c\u6d4b\u8bd5\u73af\u5883)
+fastDFS_url_local=https://app.zhangxinyanv5.top/
+#FastDFS\u6587\u4ef6URL\u8bbf\u95ee\u8def\u5f84(\u6b63\u5f0f\u73af\u5883)
+fastDFS_url_app=http://app.ifish7.com/
+#\u672c\u5730
+#link_img_head=http://192.168.61.128:81/
+#\u6d4b\u8bd5\u73af\u5883
+#link_img_head=https://app.zhangxinyanv5.top/
+#\u6b63\u5f0f\u73af\u5883
+link_img_head=https://app.ifish7.com/
+#\u56fe\u7247\u683c\u5f0f\u9a8c\u8bc1
+check_style=GIF,PNG,BMP,JPG,JPEG
+#\u662f\u5426\u5f00\u53d1\u6a21\u5f0f\uff0cfalse\u5219\u4ee3\u8868\u8981\u53d1\u5e03\u5230\u6d4b\u8bd5\u6216\u8005\u6b63\u5f0f\u73af\u5883\uff0c\u4f1a\u8fdb\u884c\u5168\u5c40\u5934\u90e8\u9a8c\u8bc1\uff0ctrue\u4ee3\u8868\u5728\u672c\u5730\u8fdb\u884c\u4ee3\u7801\u7f16\u5199\uff0c\u4e0d\u4f1a\u8fdb\u884c\u9a8c\u8bc1
+devModel=true
+#\u672c\u5730
+ifiship=192.168.199.129
+#\u6d4b\u8bd5\u4e91
+#ifiship=139.196.24.156
+#\u6b63\u5f0f\u4e91
+#ifiship=120.55.190.56
+#\u670d\u52a1\u5668\u7aef\u53e3
+ifishport=9956
\ No newline at end of file
diff --git a/src/main/webapp/META-INF/context.xml b/src/main/webapp/META-INF/context.xml
new file mode 100644
index 0000000..a800ff1
--- /dev/null
+++ b/src/main/webapp/META-INF/context.xml
@@ -0,0 +1,2 @@
+
+
diff --git a/src/main/webapp/WEB-INF/lib/fastdfs-client-java-1.25.jar b/src/main/webapp/WEB-INF/lib/fastdfs-client-java-1.25.jar
new file mode 100644
index 0000000..74adb92
Binary files /dev/null and b/src/main/webapp/WEB-INF/lib/fastdfs-client-java-1.25.jar differ
diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp
new file mode 100644
index 0000000..94af086
--- /dev/null
+++ b/src/main/webapp/index.jsp
@@ -0,0 +1,13 @@
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+
+
+
+
+
+ Socket
+
+
+ 访问正常!
+
+