Commit 083a2a8e authored by leyboy's avatar leyboy

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	adc-da-main/src/main/java/com/adc/da/znks/service/UserService.java
parents fcc4c1ec 0b088e72
This diff is collapsed.
...@@ -255,6 +255,43 @@ ...@@ -255,6 +255,43 @@
<artifactId>netty-all</artifactId> <artifactId>netty-all</artifactId>
<version>4.1.22.Final</version> <version>4.1.22.Final</version>
</dependency> </dependency>
<dependency>
<groupId>com.gexin.platform</groupId>
<artifactId>gexin-rp-sdk-http</artifactId>
<version>4.1.00</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/lib/gexin-rp-sdk-http-4.1.0.0.jar</systemPath>
</dependency>
<dependency>
<groupId>com.gexin.platform</groupId>
<artifactId>gexin-rp-fastjson</artifactId>
<version>1.0.0.1</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/lib/gexin-rp-fastjson-1.0.0.1.jar</systemPath>
</dependency>
<dependency>
<groupId>com.gexin.platform</groupId>
<artifactId>gexin-rp-sdk-base</artifactId>
<version>4.0.0.25</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/lib/gexin-rp-sdk-base-4.0.0.25.jar</systemPath>
</dependency>
<dependency>
<groupId>com.gexin.platform</groupId>
<artifactId>gexin-rp-sdk-template</artifactId>
<version>4.0.0.19</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/lib/gexin-rp-sdk-template-4.0.0.19.jar</systemPath>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>2.5.0</version>
<scope>system</scope>
<systemPath>${basedir}/src/main/lib/protobuf-java-2.5.0.jar</systemPath>
</dependency>
</dependencies> </dependencies>
<build> <build>
<plugins> <plugins>
......
...@@ -2,6 +2,7 @@ package com.adc.da; ...@@ -2,6 +2,7 @@ package com.adc.da;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import com.adc.da.znks.util.netty.NettyServer;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
...@@ -30,6 +31,12 @@ public class AdcDaApplication { ...@@ -30,6 +31,12 @@ public class AdcDaApplication {
// 启动Metrics 性能监控报表 // 启动Metrics 性能监控报表
// CsvReporter reporter = applicationContext.getBean(CsvReporter.class); // CsvReporter reporter = applicationContext.getBean(CsvReporter.class);
// reporter.start(1, TimeUnit.MINUTES); // reporter.start(1, TimeUnit.MINUTES);
try{
new NettyServer(9999).start();
}catch(Exception e){
e.printStackTrace();
}
} }
/** /**
......
...@@ -54,7 +54,7 @@ public class DeviceController extends BaseController<Device> { ...@@ -54,7 +54,7 @@ public class DeviceController extends BaseController<Device> {
@GetMapping("/delete") @GetMapping("/delete")
public ResponseEntity<Boolean> delete(String id) { public ResponseEntity<Boolean> delete(String id) {
try { try {
deviceService.deleteByPrimaryKey(id); deviceService.deleteDeviceById(id);
return GenResponse.success(); return GenResponse.success();
} catch (Exception e) { } catch (Exception e) {
return GenResponse.fail("删除失败"); return GenResponse.fail("删除失败");
......
package com.adc.da.znks.controller; package com.adc.da.znks.controller;
import com.adc.da.base.web.BaseController; import com.adc.da.base.web.BaseController;
import com.adc.da.util.http.ResponseMessage;
import com.adc.da.util.http.Result;
import com.adc.da.znks.entity.ResponseEntity; import com.adc.da.znks.entity.ResponseEntity;
import com.adc.da.znks.entity.User; import com.adc.da.znks.entity.User;
import com.adc.da.znks.service.LockRecordService;
import com.adc.da.znks.service.UserService; import com.adc.da.znks.service.UserService;
import com.adc.da.znks.util.GenResponse; import com.adc.da.znks.util.GenResponse;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
...@@ -13,6 +16,9 @@ import org.springframework.beans.factory.annotation.Autowired; ...@@ -13,6 +16,9 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
/**
* @author David
*/
@RestController @RestController
@RequestMapping("/api/user") @RequestMapping("/api/user")
@Api(description = "|User|") @Api(description = "|User|")
...@@ -20,14 +26,15 @@ public class UserController extends BaseController<User> { ...@@ -20,14 +26,15 @@ public class UserController extends BaseController<User> {
@Autowired @Autowired
private UserService userService; private UserService userService;
@Autowired
private LockRecordService lockRecordService;
private static final Logger log = LoggerFactory.getLogger(UserController.class); private static final Logger log = LoggerFactory.getLogger(UserController.class);
@ApiOperation(value = "|User|登录或者注册用户") @ApiOperation(value = "|User|登录或者注册用户")
@PostMapping(value = {"/loginOrRegisterUser"}) @PostMapping(value = {"/loginOrRegisterUser"})
public ResponseEntity<Boolean> loginOrRegisterUser(@RequestBody User user) { public ResponseEntity<Boolean> loginOrRegisterUser(String phoneNumber ,String password) {
log.info("user: {}", user); boolean flag = userService.loginOrRegister(phoneNumber, password);
boolean flag = userService.loginOrRegister(user.getTemphone(), user.getPlainPassword());
if (flag) { if (flag) {
return GenResponse.success(String.valueOf(HttpStatus.OK.value()), "登录或者注册用户成功", flag); return GenResponse.success(String.valueOf(HttpStatus.OK.value()), "登录或者注册用户成功", flag);
} else { } else {
...@@ -44,7 +51,10 @@ public class UserController extends BaseController<User> { ...@@ -44,7 +51,10 @@ public class UserController extends BaseController<User> {
@ApiOperation(value = "|User|更新密码") @ApiOperation(value = "|User|更新密码")
@PostMapping("/updatePassword") @PostMapping("/updatePassword")
public ResponseEntity<Boolean> update(@RequestBody User user) { public ResponseEntity<Boolean> update(String phoneNumber,String password) {
User user = new User();
user.setTemphone(phoneNumber);
user.setPlainPassword(password);
boolean flag = userService.updatePassword(user); boolean flag = userService.updatePassword(user);
if (flag) { if (flag) {
return GenResponse.success(String.valueOf(HttpStatus.OK.value()), "更新密码成功", flag); return GenResponse.success(String.valueOf(HttpStatus.OK.value()), "更新密码成功", flag);
...@@ -53,4 +63,18 @@ public class UserController extends BaseController<User> { ...@@ -53,4 +63,18 @@ public class UserController extends BaseController<User> {
} }
} }
@ApiOperation(value = "|User|更新个推ClientId")
@PostMapping("/updateClientId")
public ResponseEntity updateClientId(String clientId, String phoneNumber) {
userService.updateClientIdByPhoneNumber(clientId, phoneNumber);
return GenResponse.success();
}
//selectLockRecord
@ApiOperation(value = "开锁日志")
@GetMapping("/listLockRecord")
public ResponseMessage listLockRecord(String phone,String number) {
return Result.success(lockRecordService.selectLockRecord(phone,number));
}
} }
...@@ -3,6 +3,7 @@ package com.adc.da.znks.dao; ...@@ -3,6 +3,7 @@ package com.adc.da.znks.dao;
import com.adc.da.base.dao.BaseDao; import com.adc.da.base.dao.BaseDao;
import com.adc.da.znks.entity.Device; import com.adc.da.znks.entity.Device;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List; import java.util.List;
...@@ -19,4 +20,6 @@ public interface DeviceDao extends BaseDao<Device> { ...@@ -19,4 +20,6 @@ public interface DeviceDao extends BaseDao<Device> {
*/ */
List<Device> listByPhoneNumber(String phoneNumber); List<Device> listByPhoneNumber(String phoneNumber);
void deleteDeviceById(@Param("id") String id);
} }
...@@ -3,6 +3,10 @@ package com.adc.da.znks.dao; ...@@ -3,6 +3,10 @@ package com.adc.da.znks.dao;
import com.adc.da.base.dao.BaseDao; import com.adc.da.base.dao.BaseDao;
import com.adc.da.znks.entity.Gateway; import com.adc.da.znks.entity.Gateway;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
@Mapper @Mapper
public interface GatewayDao extends BaseDao<Gateway> { public interface GatewayDao extends BaseDao<Gateway> {
...@@ -14,4 +18,8 @@ public interface GatewayDao extends BaseDao<Gateway> { ...@@ -14,4 +18,8 @@ public interface GatewayDao extends BaseDao<Gateway> {
*/ */
Gateway getByPhoneNumber(String phoneNumber); Gateway getByPhoneNumber(String phoneNumber);
void updateIpByMac(Gateway gateway);
List<Map<String,Object>> selectIp(@Param("ip") String ip);
} }
package com.adc.da.znks.dao;
import com.adc.da.base.dao.BaseDao;
import com.adc.da.znks.entity.Device;
import com.adc.da.znks.entity.LockRecord;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* @author David
*/
@Mapper
public interface LockRecordDao extends BaseDao<LockRecord> {
void insertLockRecord(LockRecord lockRecord);
List<Map<String,Object>> selectLockRecord(@Param("phone") String phone,@Param("deviceCode") String deviceCode);
}
...@@ -6,6 +6,10 @@ import com.adc.da.znks.entity.User; ...@@ -6,6 +6,10 @@ import com.adc.da.znks.entity.User;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select; import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import java.util.List;
import java.util.Map;
/** /**
* *
...@@ -18,4 +22,11 @@ public interface UserDao extends BaseDao<User> { ...@@ -18,4 +22,11 @@ public interface UserDao extends BaseDao<User> {
@Select("SELECT * FROM tb_user WHERE temphone = #{phoneNumber}") @Select("SELECT * FROM tb_user WHERE temphone = #{phoneNumber}")
User getUserByPhoneNumber(@Param("phoneNumber") String phoneNumber); User getUserByPhoneNumber(@Param("phoneNumber") String phoneNumber);
List<Map<String,Object>> queryIpByUser(@Param("phone") String phone);
@Update("UPDATE tb_user SET client_id = #{clientId} WHERE temphone = #{phoneNumber}")
int updateClientIdByPhoneNumber(@Param("clientId")String clientId, @Param("phoneNumber")String phoneNumber);
List<Map<String,Object>> queryClientByIp(@Param("ip") String ip);
} }
package com.adc.da.znks.entity;
import com.adc.da.base.entity.BaseEntity;
import java.util.Date;
/**
* @ClassName LockRecord
* @Descroption TODO
* @Author 王夏晖
* @Date 2018/9/9 0009 10:24
**/
public class LockRecord extends BaseEntity {
private int id;
private Date time;
private int user;
private String deviceId;
private String lockType;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Date getTime() {
return time;
}
public void setTime(Date time) {
this.time = time;
}
public int getUser() {
return user;
}
public void setUser(int user) {
this.user = user;
}
public String getDeviceId() {
return deviceId;
}
public void setDeviceId(String deviceId) {
this.deviceId = deviceId;
}
public String getLockType() {
return lockType;
}
public void setLockType(String lockType) {
this.lockType = lockType;
}
}
...@@ -18,6 +18,8 @@ public class User extends BaseEntity { ...@@ -18,6 +18,8 @@ public class User extends BaseEntity {
**/ **/
private transient String plainPassword; private transient String plainPassword;
private String clientId;
public User() { public User() {
} }
...@@ -73,6 +75,13 @@ public class User extends BaseEntity { ...@@ -73,6 +75,13 @@ public class User extends BaseEntity {
this.encryptkey = encryptkey; this.encryptkey = encryptkey;
} }
public String getClientId() {
return clientId;
}
public void setClientId(String clientId) {
this.clientId = clientId;
}
@Override @Override
public String toString() { public String toString() {
...@@ -87,6 +96,8 @@ public class User extends BaseEntity { ...@@ -87,6 +96,8 @@ public class User extends BaseEntity {
.append(plainPassword).append('\"'); .append(plainPassword).append('\"');
sb.append(",\"encryptkey\":\"") sb.append(",\"encryptkey\":\"")
.append(encryptkey).append('\"'); .append(encryptkey).append('\"');
sb.append(",\"clientId\":\"")
.append(clientId).append('\"');
sb.append('}'); sb.append('}');
return sb.toString(); return sb.toString();
} }
......
...@@ -4,6 +4,7 @@ import com.adc.da.base.dao.BaseDao; ...@@ -4,6 +4,7 @@ import com.adc.da.base.dao.BaseDao;
import com.adc.da.base.service.BaseService; import com.adc.da.base.service.BaseService;
import com.adc.da.znks.dao.DeviceDao; import com.adc.da.znks.dao.DeviceDao;
import com.adc.da.znks.entity.Device; import com.adc.da.znks.entity.Device;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Propagation;
...@@ -29,4 +30,8 @@ public class DeviceService extends BaseService<Device, String> { ...@@ -29,4 +30,8 @@ public class DeviceService extends BaseService<Device, String> {
public List<Device> listByPhoneNumber(String phoneNumber) { public List<Device> listByPhoneNumber(String phoneNumber) {
return dao.listByPhoneNumber(phoneNumber); return dao.listByPhoneNumber(phoneNumber);
} }
public void deleteDeviceById(String id){
dao.deleteDeviceById(id);
}
} }
...@@ -4,6 +4,7 @@ import com.adc.da.base.dao.BaseDao; ...@@ -4,6 +4,7 @@ import com.adc.da.base.dao.BaseDao;
import com.adc.da.base.service.BaseService; import com.adc.da.base.service.BaseService;
import com.adc.da.znks.dao.GatewayDao; import com.adc.da.znks.dao.GatewayDao;
import com.adc.da.znks.entity.Gateway; import com.adc.da.znks.entity.Gateway;
import org.apache.ibatis.annotations.Param;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -11,6 +12,9 @@ import org.springframework.stereotype.Service; ...@@ -11,6 +12,9 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
/** /**
* @author David * @author David
*/ */
...@@ -36,4 +40,12 @@ public class GatewayService extends BaseService<Gateway, String> { ...@@ -36,4 +40,12 @@ public class GatewayService extends BaseService<Gateway, String> {
} }
return flag; return flag;
} }
public void updateIpByMac(Gateway gateway){
dao.updateIpByMac(gateway);
}
public List<Map<String,Object>> selectIpByMac(String ip){
return dao.selectIp(ip);
}
} }
package com.adc.da.znks.service;
import com.adc.da.base.dao.BaseDao;
import com.adc.da.base.service.BaseService;
import com.adc.da.znks.dao.DeviceDao;
import com.adc.da.znks.dao.LockRecordDao;
import com.adc.da.znks.entity.Device;
import com.adc.da.znks.entity.LockRecord;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author David
*/
@Service
@Transactional(value = "transactionManager", propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
public class LockRecordService extends BaseService<LockRecord, String> {
@Autowired(required = false)
private LockRecordDao dao;
@Override
public BaseDao<LockRecord> getDao() {
return dao;
}
public void insertLockRecord(LockRecord lockRecord){
dao.insertLockRecord(lockRecord);
}
public List<Map<String,Object>> selectLockRecord(String phone,String deviceCode){
List<Map<String,Object>> result = new ArrayList<>();
List<Map<String,Object>> list = dao.selectLockRecord(phone,deviceCode);
List<String> dayList = new ArrayList<>();
for(Map<String,Object> tmap : list){
if(!dayList.contains(tmap.get("day"))){
dayList.add(tmap.get("day").toString());
}
}
for(String day : dayList){
Map<String,Object> dayMap = new HashMap<>();
List<Map<String,Object>> dayReList = new ArrayList<>();
for(Map<String,Object> t : list){
if(day.equals(t.get("day").toString())){
dayReList.add(t);
}
}
dayMap.put("day",day);
dayMap.put("dayList",dayReList);
result.add(dayMap);
}
return result;
}
}
...@@ -9,6 +9,7 @@ import com.adc.da.znks.entity.User; ...@@ -9,6 +9,7 @@ import com.adc.da.znks.entity.User;
import com.adc.da.znks.page.UserPage; import com.adc.da.znks.page.UserPage;
import com.adc.da.znks.util.SecurityUtils; import com.adc.da.znks.util.SecurityUtils;
import org.apache.http.util.Asserts; import org.apache.http.util.Asserts;
import org.apache.ibatis.annotations.Param;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -18,7 +19,7 @@ import org.springframework.transaction.annotation.Transactional; ...@@ -18,7 +19,7 @@ import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* <br> * <br>
...@@ -60,29 +61,20 @@ public class UserService extends BaseService<User, String> { ...@@ -60,29 +61,20 @@ public class UserService extends BaseService<User, String> {
public boolean updatePassword(User user) { public boolean updatePassword(User user) {
List<String> encryptList = encryptList(user.getPlainPassword()); List<String> encryptList = encryptList(user.getPlainPassword());
Asserts.notNull(encryptList, "encrypt list must not be null."); Asserts.notNull(encryptList, "encrypt list must not be null.");
user.setEncryptkey(encryptList.get(0));
user.setPassword(encryptList.get(1));
UserPage userPage = new UserPage(); UserPage userPage = new UserPage();
userPage.setTemphone(user.getTemphone()); user.setTemphone(user.getTemphone());
List<User> users = dao.queryByList(userPage); User findUser = dao.queryByList(userPage).get(0);
if (CollectionUtils.isEmpty(users)) {//通过验证码登录时,用户不存在,新增用户 User updateUser = new User();
user.setId(UUID.randomUUID()); updateUser.setPassword(encryptList.get(1));
user.setPassword(encryptList.get(1)); updateUser.setEncryptkey(encryptList.get(0));
user.setEncryptkey(encryptList.get(0)); updateUser.setTemphone(user.getTemphone());
dao.insert(user); int result = dao.updateByPrimaryKeySelective(updateUser);
if (result != 0) {
return true; return true;
} else { } else {
//如果能查到相关user记录,进行更新 return false;
User findUser = dao.queryByList(userPage).get(0);
logger.info("findUser: {}", findUser);
User updateUser = new User();
updateUser.setPassword(encryptList.get(1));
updateUser.setEncryptkey(encryptList.get(0));
updateUser.setId(findUser.getId());
int result = dao.updateByPrimaryKeySelective(updateUser);
if (result != 0) {
return true;
} else {
return false;
}
} }
} }
...@@ -133,4 +125,15 @@ public class UserService extends BaseService<User, String> { ...@@ -133,4 +125,15 @@ public class UserService extends BaseService<User, String> {
} }
public List<Map<String,Object>> queryIpByUser(String phone){
return dao.queryIpByUser(phone);
}
public void updateClientIdByPhoneNumber(String clientId, String phoneNumber) {
dao.updateClientIdByPhoneNumber(clientId, phoneNumber);
}
public List<Map<String,Object>> queryClientByIp(@Param("ip") String ip){
return dao.queryClientByIp(ip);
}
} }
package com.adc.da.znks.util;
import com.gexin.rp.sdk.base.IPushResult;
import com.gexin.rp.sdk.base.impl.AppMessage;
import com.gexin.rp.sdk.base.impl.ListMessage;
import com.gexin.rp.sdk.base.impl.Target;
import com.gexin.rp.sdk.http.IGtPush;
import com.gexin.rp.sdk.template.NotificationTemplate;
import com.gexin.rp.sdk.template.style.Style0;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* 个推推送服务工具类
* @author David
*/
public class AppPushUtils {
private static String appId = "Rk3H4Z9usA6beHxyNrnIJ6";
private static String appKey = "XRxH4VbaVZAkl7uK44pd97";
private static String masterSecret = "xhUi7HRWsv8uj28GJdjhR2";
private static String url = "http://sdk.open.api.igexin.com/apiex.htm";
public static void push(String title, String msg, String clientId) throws IOException {
// 配置返回每个用户返回用户状态,可选
System.setProperty("gexin_pushList_needDetails", "true");
// 配置返回每个别名及其对应cid的用户状态,可选
// System.setProperty("gexin_pushList_needAliasDetails", "true");
IGtPush push = new IGtPush(url, appKey, masterSecret);
// 通知透传模板
NotificationTemplate template = notificationTemplateDemo(title, msg);
ListMessage message = new ListMessage();
message.setData(template);
// 设置消息离线,并设置离线时间
message.setOffline(true);
// 离线有效时间,单位为毫秒,可选
message.setOfflineExpireTime(24 * 1000 * 3600);
// 配置推送目标
List<Target> targets = new ArrayList<>(1);
Target target1 = new Target();
target1.setAppId(appId);
target1.setClientId(clientId);
targets.add(target1);
// taskId用于在推送时去查找对应的message
String taskId = push.getContentId(message);
IPushResult ret = push.pushMessageToList(taskId, targets);
System.out.println(ret.getResponse().toString());
}
public static NotificationTemplate notificationTemplateDemo(String title, String message) {
NotificationTemplate template = new NotificationTemplate();
// 设置APPID与APPKEY
template.setAppId(appId);
template.setAppkey(appKey);
Style0 style = new Style0();
// 设置通知栏标题与内容
style.setTitle(title);
style.setText(message);
// 配置通知栏图标
style.setLogo("icon.png");
// 配置通知栏网络图标
style.setLogoUrl("");
// 设置通知是否响铃,震动,或者可清除
style.setRing(true);
style.setVibrate(true);
style.setClearable(true);
template.setStyle(style);
// 透传消息设置,1为强制启动应用,客户端接收到消息后就会立即启动应用;2为等待应用启动
// template.setTransmissionType(2);
// template.setTransmissionContent("请输入您要透传的内容");
return template;
}
public static void main(String[] args) {
try {
push("提示", "测试推送", "59f02635c46d1b6d047fa051ad5db9fc");
} catch (IOException e) {
e.printStackTrace();
}
}
}
...@@ -21,13 +21,12 @@ public class SocketUtils { ...@@ -21,13 +21,12 @@ public class SocketUtils {
public static String connectServerWithTCPSocket(byte[] msg, int resultLength) { public static String connectServerWithTCPSocket(byte[] msg, int resultLength,String host,int port) {
String hex = null; String hex = null;
Socket socket = null; Socket socket = null;
//创建socket //创建socket
try { try {
socket = new Socket("127.0.0.1", 9999);//ip+端口号 socket = new Socket(host, port);//ip+端口号
//socket = new Socket("10.10.100.254", 8899);//ip+端口号
System.out.println("socket连接成功"); System.out.println("socket连接成功");
//向服务器端发送消息 //向服务器端发送消息
...@@ -84,6 +83,18 @@ public class SocketUtils { ...@@ -84,6 +83,18 @@ public class SocketUtils {
} }
public static void main(String[] args) { public static void main(String[] args) {
byte[] request = new byte[23];
request[0] = 0x4d;
request[1] = 0x41;
request[2] = 0x43;
request[3] = 0x5F;
request[4] = 0x52;
request[5] = 0x45;
request[6] = 0x51;
request[7] = 0x55;
request[8] = 0x45;
request[9] = 0x53;
request[10] = 0x54;
// 登录码 // 登录码
byte[] login = new byte[8]; byte[] login = new byte[8];
...@@ -95,7 +106,7 @@ public class SocketUtils { ...@@ -95,7 +106,7 @@ public class SocketUtils {
login[5] = 0x05; // 第5位密码 login[5] = 0x05; // 第5位密码
login[6] = 0x06; // 第6位密码 login[6] = 0x06; // 第6位密码
login[7] = 0x2a; // 尾 login[7] = 0x2a; // 尾
//connectServerWithTCPSocket(login); connectServerWithTCPSocket(login,1,"127.0.0.1",9999);
// 门锁安防码学习 // 门锁安防码学习
byte[] device = new byte[8]; byte[] device = new byte[8];
...@@ -107,7 +118,7 @@ public class SocketUtils { ...@@ -107,7 +118,7 @@ public class SocketUtils {
device[5] = 0x00; // 房间码 device[5] = 0x00; // 房间码
device[6] = 0x00; // 设备编码 device[6] = 0x00; // 设备编码
device[7] = 0x01; // 功能码 安防码学习默认01 device[7] = 0x01; // 功能码 安防码学习默认01
connectServerWithTCPSocket(device, 8); //connectServerWithTCPSocket(device, 8);
// 门锁设备码学习/ 开锁指令 // 门锁设备码学习/ 开锁指令
byte[] open = new byte[8]; byte[] open = new byte[8];
......
package com.adc.da.znks.util;
import java.util.HashMap;
import java.util.Map;
/**
* @ClassName SystemValue
* @Descroption TODO
* @Author 王夏晖
* @Date 2018/9/10 0010 12:05
**/
public class SystemValue {
public static Map<String, String> ipMacMap = new HashMap<>();
}
package com.adc.da.znks.util; package com.adc.da.znks.util;
import java.math.BigInteger;
/** /**
* @ClassName Test * @ClassName Test
* @Descroption TODO * @Descroption TODO
...@@ -51,5 +53,23 @@ public class Test { ...@@ -51,5 +53,23 @@ public class Test {
} }
} }
System.out.println(list);*/ System.out.println(list);*/
byte[] b = {0x54,0x59};
System.out.println(SocketUtils.bytesToHex(b,0,b.length).split(" ").length);
}
public static String hexString(byte[] bs) {
return new BigInteger(1, bs).toString(16);
}
private static String intToHex(int n) {
StringBuffer s = new StringBuffer();
String a;
char []b = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
while(n != 0){
s = s.append(b[n%16]);
n = n/16;
}
a = s.reverse().toString();
return a;
} }
} }
package com.adc.da.znks.util.netty; package com.adc.da.znks.util.netty;
import com.adc.da.znks.service.GatewayService;
import com.adc.da.znks.util.SocketUtils;
import com.adc.da.znks.util.SystemValue;
import io.netty.bootstrap.ServerBootstrap; import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelInitializer;
...@@ -7,6 +10,12 @@ import io.netty.channel.EventLoopGroup; ...@@ -7,6 +10,12 @@ import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel; import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.bytes.ByteArrayDecoder;
import io.netty.handler.codec.bytes.ByteArrayEncoder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
public class NettyServer { public class NettyServer {
private final int port; private final int port;
...@@ -26,8 +35,17 @@ public class NettyServer { ...@@ -26,8 +35,17 @@ public class NettyServer {
@Override @Override
protected void initChannel(SocketChannel ch) throws Exception { protected void initChannel(SocketChannel ch) throws Exception {
System.out.println("connected...; Client:" + ch.remoteAddress()); System.out.println("connected...; Client:" + ch.remoteAddress().getHostString());
//發送請求指令
if( SystemValue.ipMacMap.get(ch.remoteAddress().getHostString()) == null){
connectGateway(ch.remoteAddress().getHostString(),8899);
}
ch.pipeline().addLast(new ByteArrayEncoder());
ch.pipeline().addLast(new ByteArrayDecoder());
ch.pipeline().addLast(new ServerHandler()); // 客户端触发操作 ch.pipeline().addLast(new ServerHandler()); // 客户端触发操作
} }
}); });
ChannelFuture cf = sb.bind().sync(); // 服务器异步创建绑定 ChannelFuture cf = sb.bind().sync(); // 服务器异步创建绑定
...@@ -37,4 +55,20 @@ public class NettyServer { ...@@ -37,4 +55,20 @@ public class NettyServer {
group.shutdownGracefully().sync(); // 释放线程池资源 group.shutdownGracefully().sync(); // 释放线程池资源
} }
} }
public void connectGateway(String host,int port){
byte[] request = new byte[23];
request[0] = 0x4d;
request[1] = 0x41;
request[2] = 0x43;
request[3] = 0x5F;
request[4] = 0x52;
request[5] = 0x45;
request[6] = 0x51;
request[7] = 0x55;
request[8] = 0x45;
request[9] = 0x53;
request[10] = 0x54;
SocketUtils.connectServerWithTCPSocket(request,1,host,port);
}
} }
\ No newline at end of file
package com.adc.da.znks.util.netty; package com.adc.da.znks.util.netty;
import com.adc.da.znks.entity.Gateway;
import com.adc.da.znks.entity.LockRecord;
import com.adc.da.znks.service.GatewayService;
import com.adc.da.znks.service.LockRecordService;
import com.adc.da.znks.service.UserService;
import com.adc.da.znks.util.AppPushUtils;
import com.adc.da.znks.util.SocketUtils;
import com.adc.da.znks.util.SystemValue;
import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled; import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter; import io.netty.channel.ChannelInboundHandlerAdapter;
import oracle.jdbc.proxy.annotation.Post;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import sun.java2d.pipe.SpanShapeRenderer;
import javax.annotation.PostConstruct;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* 接收socket请求
* @author David
*/
@Component
public class ServerHandler extends ChannelInboundHandlerAdapter { public class ServerHandler extends ChannelInboundHandlerAdapter {
@Autowired
private GatewayService gatewayService;
@Autowired
private LockRecordService lockRecordService;
@Autowired
private UserService userService;
public static ServerHandler serverHandler;
@PostConstruct
public void init(){
serverHandler = this;
serverHandler.gatewayService = this.gatewayService;
serverHandler.lockRecordService = this.lockRecordService;
serverHandler.userService = this.userService;
}
@Override @Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
System.out.println("server channelRead...; received:" + msg); System.out.println("server channelRead...; received:" + msg);
System.out.println(convertByteBufToString((ByteBuf) msg)); String remoteAddress = ctx.channel().remoteAddress().toString();
String host = remoteAddress.substring(1,remoteAddress.lastIndexOf(":"));
System.out.println("网关IP地址:" + host);
byte[] result = (byte[])msg;
System.out.println(SocketUtils.bytesToHex(result,0,result.length));
// 在此处需要分别解析
// 1.上报MAC地址信息 6位mac地址+10位的(MAC-UPLOAD)
try{
int len = SocketUtils.bytesToHex(result,0,result.length).split(" ").length;
if(len == 16){
String mac = SocketUtils.bytesToHex(result,0,6);
Gateway gateway = new Gateway();
gateway.setIp(host);
gateway.setMacAddress(mac);
serverHandler.gatewayService.updateIpByMac(gateway);
SystemValue.ipMacMap.put(host, mac);
}else{
String title = "";
String message = "";
String clientId = "";
List<Map<String,Object>> list = serverHandler.userService.queryClientByIp(host);
// 2.开关门信息( 0x54 0x59 0x54 0x01 0x01 0x00 0x01 0x01 0x05 0x00 0x01)
// 前6位不用管,第七位是设备编号,第八位是功能码0x05代表开锁,0x06代表关锁,最后两位代表用户ID,1-300
// 3.安防信息,需要根据安防信息做不同的处理,安防信息有 0x60(非法开门警报),0x61(非法尝试开锁警报),0x80(远程开锁触发),0x28(电池低电量警报)
byte device = result[13];
byte user = 0;
String device_id = String.valueOf(device);
byte instruct = 0;
if(result.length == 17){//开关门信息,6位mac + 11位指令
instruct = result[14];
user = result[16];
}else{//开关门信息,6位mac + 8位指令
instruct = result[9];
}
int user_id = Integer.parseInt(String.valueOf(user));
String lockType = getLockType(instruct);
title = getTitle(instruct);
message = getMessage(instruct);
LockRecord lockRecord = new LockRecord();
lockRecord.setTime(new Date());
lockRecord.setUser(user_id);
lockRecord.setDeviceId(device_id);
lockRecord.setLockType(lockType);
System.out.println(lockType);
serverHandler.lockRecordService.insertLockRecord(lockRecord);
if(list != null){
clientId = list.get(0).get("client_id")!=null?list.get(0).get("client_id").toString():"";
if(!"".equals(clientId)){
AppPushUtils.push(title,message,clientId);
}
}else{
System.out.println("clientId未获取,消息发送失败");
}
}
}catch(Exception e){
System.out.println("数据存储失败");
e.printStackTrace();
}
//ctx.write(msg); //ctx.write(msg);
} }
...@@ -25,12 +128,14 @@ public class ServerHandler extends ChannelInboundHandlerAdapter { ...@@ -25,12 +128,14 @@ public class ServerHandler extends ChannelInboundHandlerAdapter {
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
System.out.println("server occur exception:" + cause.getMessage()); System.out.println("server occur exception:" + cause.getMessage());
cause.printStackTrace(); cause.printStackTrace();
ctx.close(); // 关闭发生异常的连接 // 关闭发生异常的连接
ctx.close();
} }
public String convertByteBufToString(ByteBuf buf) { public String convertByteBufToString(ByteBuf buf) {
String str; String str;
if(buf.hasArray()) { // 处理堆缓冲区 if(buf.hasArray()) {
// 处理堆缓冲区
str = new String(buf.array(), buf.arrayOffset() + buf.readerIndex(), buf.readableBytes()); str = new String(buf.array(), buf.arrayOffset() + buf.readerIndex(), buf.readableBytes());
} else { // 处理直接缓冲区以及复合缓冲区 } else { // 处理直接缓冲区以及复合缓冲区
byte[] bytes = new byte[buf.readableBytes()]; byte[] bytes = new byte[buf.readableBytes()];
...@@ -40,4 +145,54 @@ public class ServerHandler extends ChannelInboundHandlerAdapter { ...@@ -40,4 +145,54 @@ public class ServerHandler extends ChannelInboundHandlerAdapter {
return str; return str;
} }
//判断指令是不是mac地址
public boolean ifMac(byte[] b){
if(b[6] == 0x54 && b[7] == 0x59 && b[8] == 0x54 && b[9] == 0x01 ){
return false;
}
return true;
}
public String getLockType(byte b){
if(b == 0x05){return "开锁";}
else if(b == 0x06){return "关锁";}
else if(b == 0x60){return "非法开门警报";}
else if(b == 0x61){return "非法尝试开锁警报";}
else if(b == 0x80){return "远程开锁触发";}
else if(b == 0x28){return "电池低电量警报";}
return "";
}
public String getTitle(byte b){
String title = "";
if(b == 0x05){title = "开锁";}
else if(b == 0x06){title = "关锁";}
else if(b == 0x60){title = "非法开门警报";}
else if(b == 0x61){title = "非法尝试开锁警报";}
else if(b == 0x80){title = "远程开锁触发";}
else if(b == 0x28){title = "电池低电量警报";}
return title;
}
public String getMessage(byte b){
String msg = "";
if(b == 0x05){msg = "开锁";}
else if(b == 0x06){msg = "关锁";}
else if(b == 0x60){msg = "非法开门警报";}
else if(b == 0x61){msg = "非法尝试开锁警报";}
else if(b == 0x80){msg = "远程开锁触发";}
else if(b == 0x28){msg = "电池低电量警报";}
SimpleDateFormat simple = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return simple.format(new Date()) + " 触发 " + msg;
}
public static int bytesToInt(byte[] src, int offset) {
int value;
value = (int) ((src[offset] & 0xFF)
| ((src[offset+1] & 0xFF)<<8)
| ((src[offset+2] & 0xFF)<<16)
| ((src[offset+3] & 0xFF)<<24));
return value;
}
} }
\ No newline at end of file
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
<result column="user_password" property="userPassword"/> <result column="user_password" property="userPassword"/>
<result column="uid" property="uid"/> <result column="uid" property="uid"/>
</resultMap> </resultMap>
<select id="listByPhoneNumber" resultType="com.adc.da.znks.entity.Device"> <select id="listByPhoneNumber" resultMap="BaseResultMap">
select * from tb_device,tb_user select * from tb_device,tb_user
where tb_device.user_id = tb_user.id where tb_device.user_id = tb_user.id
and tb_user.temphone = #{phoneNumber} and tb_user.temphone = #{phoneNumber}
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
<if test="userName != null">user_name,</if> <if test="userName != null">user_name,</if>
<if test="userPassword != null">user_password,</if> <if test="userPassword != null">user_password,</if>
<if test="uid != null">uid,</if> <if test="uid != null">uid,</if>
<if test="userId != null">user_id,</if>
</trim> </trim>
<trim prefix="values (" suffix=")" suffixOverrides=","> <trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">#{id, jdbcType=VARCHAR},</if> <if test="id != null">#{id, jdbcType=VARCHAR},</if>
...@@ -37,7 +38,12 @@ ...@@ -37,7 +38,12 @@
<if test="userName != null">#{userName, jdbcType=VARCHAR},</if> <if test="userName != null">#{userName, jdbcType=VARCHAR},</if>
<if test="userPassword != null">#{userPassword, jdbcType=VARCHAR},</if> <if test="userPassword != null">#{userPassword, jdbcType=VARCHAR},</if>
<if test="uid != null">#{uid, jdbcType=VARCHAR},</if> <if test="uid != null">#{uid, jdbcType=VARCHAR},</if>
<if test="userId != null">#{userId, jdbcType=VARCHAR},</if>
</trim> </trim>
</insert> </insert>
<delete id="deleteDeviceById" parameterType="java.util.Map">
delete from tb_device where id = #{id}
</delete>
</mapper> </mapper>
...@@ -40,4 +40,12 @@ ...@@ -40,4 +40,12 @@
and tb_user.temphone = #{phoneNumber} and tb_user.temphone = #{phoneNumber}
</select> </select>
<update id="updateIpByMac" parameterType="com.adc.da.znks.entity.Gateway">
update tb_gateway set ip = #{ip} where mac_address = #{macAddress}
</update>
<select id="selectIp" parameterType = "java.util.Map">
select * from tb_gateway where ip = #{ip}
</select>
</mapper> </mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.adc.da.znks.dao.LockRecordDao">
<!-- Result Map-->
<resultMap id="BaseResultMap" type="com.adc.da.znks.entity.Device">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="code" property="code"/>
<result column="type" property="type"/>
<result column="user_name" property="userName"/>
<result column="user_password" property="userPassword"/>
<result column="uid" property="uid"/>
</resultMap>
<!-- 查询10天内开锁记录 -->
<select id="selectLockRecord" resultType="java.util.Map" parameterType="java.util.Map">
SELECT
loc.*, DATE_FORMAT(loc.time, '%Y-%m-%d') day,
DATE_FORMAT(loc.time,'%Y-%m-%d %h:%i:%s') htime
FROM
tb_lock_record loc,
tb_device dev,
tb_user u
WHERE
u.id = dev.user_id
AND dev.code = loc.device_id
AND u.temphone = #{phone}
AND dev. CODE = #{deviceCode}
AND dev.type = 1
AND DATE_SUB(now(), INTERVAL 10 DAY) &lt;= loc.time
order by loc.time desc
</select>
<!-- 动态插入记录 主键是序列 -->
<insert id="insertLockRecord" parameterType="com.adc.da.znks.entity.LockRecord">
insert into tb_lock_record(time,user,device_id,lock_type) values(#{time},#{user},#{deviceId},#{lockType})
</insert>
</mapper>
...@@ -7,11 +7,12 @@ ...@@ -7,11 +7,12 @@
<result column="temphone" property="temphone"/> <result column="temphone" property="temphone"/>
<result column="password" property="password"/> <result column="password" property="password"/>
<result column="encryptkey" property="encryptkey"/> <result column="encryptkey" property="encryptkey"/>
<result column="client_id" property="clientId"/>
</resultMap> </resultMap>
<!-- tb_user table all fields --> <!-- tb_user table all fields -->
<sql id="Base_Column_List"> <sql id="Base_Column_List">
id, temphone, password, encryptkey id, temphone, password, encryptkey, client_id
</sql> </sql>
<!-- 查询条件 --> <!-- 查询条件 -->
...@@ -77,9 +78,6 @@ ...@@ -77,9 +78,6 @@
<update id="updateByPrimaryKeySelective" parameterType="com.adc.da.znks.entity.User"> <update id="updateByPrimaryKeySelective" parameterType="com.adc.da.znks.entity.User">
update tb_user update tb_user
<set> <set>
<if test="temphone != null">
temphone = #{temphone},
</if>
<if test="password != null"> <if test="password != null">
password = #{password}, password = #{password},
</if> </if>
...@@ -87,7 +85,7 @@ ...@@ -87,7 +85,7 @@
encryptkey = #{encryptkey}, encryptkey = #{encryptkey},
</if> </if>
</set> </set>
where id = #{id} where temphone = #{temphone}
</update> </update>
<!-- 根据id查询 tb_user --> <!-- 根据id查询 tb_user -->
...@@ -137,4 +135,14 @@ ...@@ -137,4 +135,14 @@
</if> </if>
</select> </select>
<select id="queryIpByUser" resultType="java.util.Map" parameterType="java.util.Map">
select way.ip from tb_user ur,tb_gateway way where ur.id = way.user_id
and ur.temphone = #{phone}
</select>
<select id="queryClientByIp" resultType="java.util.Map" parameterType="java.util.Map">
select u.client_id from tb_user u,tb_gateway g where u.id = g.user_id and
g.ip = #{ip}
</select>
</mapper> </mapper>
<?xml version="1.0" encoding="UTF-8"?>
<module version="4">
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment