From 592071967f4ec49e36d351ab2377b951024f02b1 Mon Sep 17 00:00:00 2001 From: 1099815072@qq.com <1099815072@qq.com> Date: Tue, 17 Nov 2020 19:40:00 +0800 Subject: [PATCH] 中控指纹机,考勤看板代码提交 --- cloud/dahua/src/main/java/com/example/dahua/service/imp/PermissFaceServiceImp.java | 19 +++++++++++-------- cloud/dahua/src/main/resources/mapper/PermissionFaceMapper.xml | 2 +- cloud/dahua/src/test/java/com/example/dahua/mapper/SearchMapperTest.java | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/controller/AttendanceController.java | 16 ++++++++++++++++ cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/controller/UserController.java | 10 ++++++++++ cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/mapper/AttendaceMapper.java | 2 ++ cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/mapper/UserMapper.java | 4 ++++ cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/AttendacenService.java | 10 ++++++++++ cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/UserService.java | 4 ++++ cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/impl/AttendacenServiceImp.java | 15 +++++++++++++++ cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/impl/UserServiceImpl.java | 10 ++++++++++ cloud/search_smartCampus/src/main/resources/mapper/AttendanceMapper.xml | 6 +++++- cloud/search_smartCampus/src/main/resources/mapper/UserMapper.xml | 7 +++++++ cloud/zkAttendance/pom.xml | 5 +++++ cloud/zkAttendance/src/main/java/com/sincere/att/controller/AttPushController.java | 33 +++++++++++++++++++++++++++++++++ cloud/zkAttendance/src/main/java/com/sincere/att/feign/ScFeign.java | 8 ++++++++ cloud/zkAttendance/src/main/java/com/sincere/att/mqtt/MqtUtils.java | 28 ++++++++++++++++++++++++++++ cloud/zkAttendance/src/main/java/com/sincere/att/mqtt/MqttManager.java | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ cloud/zkAttendance/src/main/java/com/sincere/att/mqtt/Tools.java | 217 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 19 files changed, 555 insertions(+), 10 deletions(-) create mode 100644 cloud/zkAttendance/src/main/java/com/sincere/att/mqtt/MqtUtils.java create mode 100644 cloud/zkAttendance/src/main/java/com/sincere/att/mqtt/MqttManager.java create mode 100644 cloud/zkAttendance/src/main/java/com/sincere/att/mqtt/Tools.java diff --git a/cloud/dahua/src/main/java/com/example/dahua/service/imp/PermissFaceServiceImp.java b/cloud/dahua/src/main/java/com/example/dahua/service/imp/PermissFaceServiceImp.java index fd39bc8..2d138d3 100644 --- a/cloud/dahua/src/main/java/com/example/dahua/service/imp/PermissFaceServiceImp.java +++ b/cloud/dahua/src/main/java/com/example/dahua/service/imp/PermissFaceServiceImp.java @@ -41,14 +41,7 @@ public class PermissFaceServiceImp implements PermissFaceService { int schoolId = permissionFaceBean.getSchoolId(); - //编辑设置 PermissionBean permissionBean = permissionFaceBean.getPermissionBean(); - if(!StringUtils.isEmpty(permissionFaceBean.getChannel())){ - permissionBean.setChannel(permissionFaceBean.getChannel()); - } - if(!StringUtils.isEmpty(permissionFaceBean.getCustomName())){ - permissionBean.setChannel(permissionFaceBean.getCustomName()); - } int type = permissionFaceBean.getType(); if (null != permissionBean) @@ -80,12 +73,22 @@ public class PermissFaceServiceImp implements PermissFaceService { responseBean.setStatus(1); break; case 1://编辑 - if (null == permissionFaceDao.getPerFaceWithId(id)) { + PermissionFaceBean faceBean = permissionFaceDao.getPerFaceWithId(id); + if (null == faceBean) { responseBean.setMessage("模板不存在"); } else { responseBean.setMessage("编辑权限模板成功"); + permissionFaceBean.setChannel(faceBean.getChannel()); + permissionFaceBean.setCustomName(faceBean.getCustomName()); permissionFaceDao.updatePermissionFace(permissionFaceBean); } + //编辑时设置 + if(!StringUtils.isEmpty(permissionFaceBean.getChannel())){ + permissionBean.setChannel(permissionFaceBean.getChannel()); + } + if(!StringUtils.isEmpty(permissionFaceBean.getCustomName())){ + permissionBean.setChannel(permissionFaceBean.getCustomName()); + } responseBean.setData(null); sendPermiss2Dev(permissionFaceBean); responseBean.setStatus(1); diff --git a/cloud/dahua/src/main/resources/mapper/PermissionFaceMapper.xml b/cloud/dahua/src/main/resources/mapper/PermissionFaceMapper.xml index 58632cf..fdf4342 100644 --- a/cloud/dahua/src/main/resources/mapper/PermissionFaceMapper.xml +++ b/cloud/dahua/src/main/resources/mapper/PermissionFaceMapper.xml @@ -19,7 +19,7 @@ - + diff --git a/cloud/dahua/src/test/java/com/example/dahua/mapper/SearchMapperTest.java b/cloud/dahua/src/test/java/com/example/dahua/mapper/SearchMapperTest.java index bc9184d..807c791 100644 --- a/cloud/dahua/src/test/java/com/example/dahua/mapper/SearchMapperTest.java +++ b/cloud/dahua/src/test/java/com/example/dahua/mapper/SearchMapperTest.java @@ -2,11 +2,18 @@ package com.example.dahua.mapper; import com.alibaba.fastjson.JSON; import com.example.dahua.Tester; +import com.example.dahua.async.MyScheduledTask; import com.example.dahua.bean.CheckIn; +import com.example.dahua.bean.PermissionBean; +import com.example.dahua.bean.PermissionFaceBean; import com.example.dahua.bean.ShortMsg; +import com.example.dahua.dao.PermissionFaceDao; import com.example.dahua.dao.UserDao; +import com.example.dahua.mqtt.MqttManager; +import com.example.dahua.service.PermissFaceService; import com.example.dahua.service.UserService; import com.example.dahua.utils.DateUtils; +import com.example.dahua.utils.JsonUtils; import com.example.dahua.xiananDao.SearchMapper; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -31,6 +38,12 @@ public class SearchMapperTest extends Tester { @Autowired private UserService userService; + @Autowired + private PermissionFaceDao permissionFaceDao; + + @Autowired + private PermissFaceService permissFaceService; + @Test public void test(){ //有效刷卡调考勤存储过程 @@ -66,5 +79,45 @@ public class SearchMapperTest extends Tester { } + @Test + public void test4(){ + PermissionFaceBean faceBean = permissionFaceDao.getPerFaceWithId(45); + System.out.println(JsonUtils.nonDefaultMapper().toJson(faceBean)); + faceBean.setType(1); + + String json = "{\"studentType\":\"1\",\"deviceIds\":[\"ytj01hzszdddddddd\"],\"weekDays\":[{\"weekTimes\":[{\"startTime\":\"10:00\",\"endTime\":\"12:05\"}],\"sex\":\"1\",\"weekDay\":\"3,4,5\"}]}"; + PermissionBean permissionBean = JsonUtils.nonDefaultMapper().fromJson(json,PermissionBean.class); + faceBean.setPermissionBean(permissionBean); + faceBean.setPerrmissName("顺治测试学校"); + faceBean.setChannel(""); + faceBean.setCustomName(""); + permissFaceService.addPermissionFace(faceBean); + + } + + + private MqttManager mqttManager; + + @Autowired + private MyScheduledTask myScheduledTask; + + @Test + public void test5(){ + if(null == mqttManager){ + mqttManager = new MqttManager(); + mqttManager.init(); + } + + String eventTime = DateUtils.date2String(new Date(), DateUtils.format2); + String deviceId =""; + String cardNo =""; + String content = "考勤成功!,设备:" + deviceId + "卡号:" + cardNo + "方向:进门" + "______" + eventTime; + + myScheduledTask.sendMQMess(content,deviceId); + System.out.println("发送成功"); + } + + + // boolean uploadImgAndUserInfo(String file, String schoolId, String studentCode, String clint_type, int userType, String devid); } diff --git a/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/controller/AttendanceController.java b/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/controller/AttendanceController.java index 11e3b7c..8d1d309 100644 --- a/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/controller/AttendanceController.java +++ b/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/controller/AttendanceController.java @@ -68,6 +68,11 @@ public class AttendanceController { attendacenService.updateAttendance(clientId); } + /** + * 关联的显示看板设备 + * @param placeId + * @return + */ @RequestMapping(value = "selectRoomAttendance", method = RequestMethod.GET) List selectRoomAttendance(@RequestParam("placeId") int placeId) { return attendacenService.selectRoomAttendance(placeId); @@ -93,4 +98,15 @@ public class AttendanceController { return DateUtils.date2String(date, DateUtils.format2); } } + + /** + * 根据考勤设备ID 获取关联看板设备ID + * @param deviceId + * @return + */ + @RequestMapping(value = "selectPlaceAttendance", method = RequestMethod.GET) + String selectPlaceAttendance(@RequestParam("placeId") String deviceId) { + return attendacenService.selectPlaceAttendance(deviceId); + } + } diff --git a/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/controller/UserController.java b/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/controller/UserController.java index 8e850ef..0ee77a0 100644 --- a/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/controller/UserController.java +++ b/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/controller/UserController.java @@ -63,4 +63,14 @@ public class UserController { SzVSchoolStudent selectByStudentId(@RequestParam("studentId") int studentId) { return userService.selectByStudentId(studentId); } + + @RequestMapping(value = "getSchoolIdWidthCardNum", method = RequestMethod.GET) + int getSchoolIdWidthCardNum(@RequestParam("num") String num) { + return userService.getSchoolIdWidthCardNum(num); + } + + @RequestMapping(value = "getClintIds", method = RequestMethod.GET) + List getClintIds(@RequestParam("schoolId") String schoolId) { + return userService.getClintIds(schoolId); + } } diff --git a/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/mapper/AttendaceMapper.java b/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/mapper/AttendaceMapper.java index 3f4bb2e..d624df4 100644 --- a/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/mapper/AttendaceMapper.java +++ b/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/mapper/AttendaceMapper.java @@ -23,4 +23,6 @@ public interface AttendaceMapper { List selectCloudAttendanceBySchoolId(int schoolId); + String selectPlaceAttendance(String deviceId); + } diff --git a/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/mapper/UserMapper.java b/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/mapper/UserMapper.java index fc95e51..6be610f 100644 --- a/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/mapper/UserMapper.java +++ b/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/mapper/UserMapper.java @@ -24,4 +24,8 @@ public interface UserMapper { StudentBean getStudent_NumWitdCode(@Param("studentcode") String studentcode); + int getSchoolIdWidthCardNum(@Param("cardNum") String cardNum); + + List getClintIds(@Param("schoolId") String schoolId); + } diff --git a/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/AttendacenService.java b/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/AttendacenService.java index d5965eb..fea9567 100644 --- a/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/AttendacenService.java +++ b/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/AttendacenService.java @@ -17,9 +17,19 @@ public interface AttendacenService { int updateAttendance(String client_id); + /** + * 关联的显示看板设备 + */ List selectRoomAttendance(int placeId); List selectCloudAttendance(); List selectCloudAttendanceBySchoolId(int schoolId); + + /** + * 根据考勤设备ID 获取关联看板设备ID + * @param deviceId + * @return + */ + String selectPlaceAttendance(String deviceId); } diff --git a/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/UserService.java b/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/UserService.java index 5633655..9e53d9e 100644 --- a/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/UserService.java +++ b/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/UserService.java @@ -30,4 +30,8 @@ public interface UserService { int insertTemperature(CwStutemperaturereocrd record); + int getSchoolIdWidthCardNum(String num); + + List getClintIds(String schoolId); + } diff --git a/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/impl/AttendacenServiceImp.java b/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/impl/AttendacenServiceImp.java index 9419151..3bc530e 100644 --- a/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/impl/AttendacenServiceImp.java +++ b/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/impl/AttendacenServiceImp.java @@ -35,6 +35,11 @@ public class AttendacenServiceImp implements AttendacenService { return attendaceMapper.updateAttendance(client_id); } + /** + * 关联的显示看板设备 + * @param placeId + * @return + */ @Override public List selectRoomAttendance(int placeId) { return attendaceMapper.selectRoomAttendance(placeId); @@ -49,4 +54,14 @@ public class AttendacenServiceImp implements AttendacenService { public List selectCloudAttendanceBySchoolId(int schoolId) { return attendaceMapper.selectCloudAttendanceBySchoolId(schoolId); } + + /** + * 根据考勤设备ID 获取关联看板设备ID + * @param deviceId + * @return + */ + @Override + public String selectPlaceAttendance(String deviceId) { + return attendaceMapper.selectPlaceAttendance(deviceId); + } } diff --git a/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/impl/UserServiceImpl.java b/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/impl/UserServiceImpl.java index 5337505..92646c7 100644 --- a/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/impl/UserServiceImpl.java +++ b/cloud/search_smartCampus/src/main/java/com/sincere/smartSearch/service/impl/UserServiceImpl.java @@ -93,4 +93,14 @@ public class UserServiceImpl implements UserService { } return 0; } + + @Override + public int getSchoolIdWidthCardNum(String num) { + return userMapper.getSchoolIdWidthCardNum(num); + } + + @Override + public List getClintIds(String schoolId) { + return userMapper.getClintIds(schoolId); + } } diff --git a/cloud/search_smartCampus/src/main/resources/mapper/AttendanceMapper.xml b/cloud/search_smartCampus/src/main/resources/mapper/AttendanceMapper.xml index 8bf4053..7b70b3b 100644 --- a/cloud/search_smartCampus/src/main/resources/mapper/AttendanceMapper.xml +++ b/cloud/search_smartCampus/src/main/resources/mapper/AttendanceMapper.xml @@ -39,7 +39,7 @@ + + diff --git a/cloud/search_smartCampus/src/main/resources/mapper/UserMapper.xml b/cloud/search_smartCampus/src/main/resources/mapper/UserMapper.xml index 8403aab..6a27022 100644 --- a/cloud/search_smartCampus/src/main/resources/mapper/UserMapper.xml +++ b/cloud/search_smartCampus/src/main/resources/mapper/UserMapper.xml @@ -6,4 +6,11 @@ select student_num from SZ_V_School_Student where student_id = #{studentId} + + + \ No newline at end of file diff --git a/cloud/zkAttendance/pom.xml b/cloud/zkAttendance/pom.xml index a1d0ac4..cb2aec2 100644 --- a/cloud/zkAttendance/pom.xml +++ b/cloud/zkAttendance/pom.xml @@ -41,6 +41,11 @@ org.springframework.boot spring-boot-starter-web + + org.eclipse.paho + org.eclipse.paho.client.mqttv3 + 1.1.0 + diff --git a/cloud/zkAttendance/src/main/java/com/sincere/att/controller/AttPushController.java b/cloud/zkAttendance/src/main/java/com/sincere/att/controller/AttPushController.java index cd1f99e..de03bab 100644 --- a/cloud/zkAttendance/src/main/java/com/sincere/att/controller/AttPushController.java +++ b/cloud/zkAttendance/src/main/java/com/sincere/att/controller/AttPushController.java @@ -7,6 +7,7 @@ import com.sincere.att.feign.ScFeign; import com.sincere.att.feign.XaFeign; import com.sincere.att.logs.LogName; import com.sincere.att.logs.LoggerUtils; +import com.sincere.att.mqtt.MqtUtils; import com.sincere.att.vo.AttendanceInfoBean; import com.sincere.att.vo.CheckOrderVo; import com.sincere.att.vo.FingerOrderVo; @@ -410,6 +411,11 @@ public class AttPushController { JSONObject jsonObject = HttpClientUtils.httpPostJson(urlHXY, jsonResult); //if ((int) jsonObject.get("status") == 1) { if ( Integer.parseInt(jsonObject.get("data").toString()) == 0) { + /** + * 签到成功发送数据到看板 add by 2020-11-17 + */ + sendMQMessage(SN,cardNo); + Log_kaoInfo.info("出入寝签到成功:" + SN + " 卡号:" + cardNo); } else { Log_kaoInfo.info("出入寝签到失败:" + SN + " 卡号:" + cardNo + " result1:" + jsonObject.toJSONString()); @@ -450,6 +456,33 @@ public class AttPushController { } } + public void sendMQMessage(String deviceId,String cardNum) { + //获取寝室关联的场景id + String placeId = scFeign.selectPlaceAttendance(deviceId); + + if (null != placeId) { + //关联的显示看板设备 + List kanbanIds = scFeign.selectRoomAttendance(Integer.parseInt(placeId)); + + for (int i = 0; i < kanbanIds.size(); i++) { + String kanbanId = kanbanIds.get(i); + String data = "{\"cmd\":\"" + 34 + "\",\"clientId\":\"" + kanbanId + "\",\"data\":{\"cardNum\":\"" + cardNum+"}}"; + MqtUtils.getInstance().sendMsg(kanbanId, data); + } + + } else { + String schoolId = scFeign.getSchoolIdWidthCardNum(cardNum); + if(org.springframework.util.StringUtils.isEmpty(schoolId)||Integer.parseInt(schoolId) <=0)return; + List clintIds = scFeign.getClintIds(schoolId); + for (int i = 0; i < clintIds.size(); i++) { + String clintId = clintIds.get(i); + String data = "{\"cmd\":\"" + 34 + "\",\"clientId\":\"" + clintId + "\",\"data\":{\"cardNum\":\"" + cardNum + "}}"; + MqtUtils.getInstance().sendMsg(clintId, data); + } + } + + } + public static void main(String[] args) { /*JSONObject object = new JSONObject(); object.put("pageIndex",1); diff --git a/cloud/zkAttendance/src/main/java/com/sincere/att/feign/ScFeign.java b/cloud/zkAttendance/src/main/java/com/sincere/att/feign/ScFeign.java index 90692d5..95278be 100644 --- a/cloud/zkAttendance/src/main/java/com/sincere/att/feign/ScFeign.java +++ b/cloud/zkAttendance/src/main/java/com/sincere/att/feign/ScFeign.java @@ -33,4 +33,12 @@ public interface ScFeign { String selectStudentNumByStudentId(@RequestParam("studentId") int studentId); + @RequestMapping(value = "attendance/selectPlaceAttendance", method = RequestMethod.GET) + String selectPlaceAttendance(@RequestParam("deviceId") String deviceId); + + @RequestMapping(value = "/sm/user/getSchoolIdWidthCardNum", method = RequestMethod.GET) + String getSchoolIdWidthCardNum(@RequestParam("num") String num); + + @RequestMapping(value = "/sm/user/getClintIds", method = RequestMethod.GET) + List getClintIds(@RequestParam("schoolId") String schoolId); } diff --git a/cloud/zkAttendance/src/main/java/com/sincere/att/mqtt/MqtUtils.java b/cloud/zkAttendance/src/main/java/com/sincere/att/mqtt/MqtUtils.java new file mode 100644 index 0000000..6883b65 --- /dev/null +++ b/cloud/zkAttendance/src/main/java/com/sincere/att/mqtt/MqtUtils.java @@ -0,0 +1,28 @@ +package com.sincere.att.mqtt; + +public class MqtUtils { + + private static MqtUtils mqtUtils; + + private MqttManager mqttManager = null; + + public static MqtUtils getInstance() { + if (null == mqtUtils) { + synchronized (MqtUtils.class) { + if (null == mqtUtils) mqtUtils = new MqtUtils(); + } + } + return mqtUtils; + } + + public MqtUtils() { + mqttManager = new MqttManager(); + mqttManager.init(); + } + + public void sendMsg(String deviceId, String content) { + mqttManager.sendMq(deviceId, content); + } + + +} diff --git a/cloud/zkAttendance/src/main/java/com/sincere/att/mqtt/MqttManager.java b/cloud/zkAttendance/src/main/java/com/sincere/att/mqtt/MqttManager.java new file mode 100644 index 0000000..d5100df --- /dev/null +++ b/cloud/zkAttendance/src/main/java/com/sincere/att/mqtt/MqttManager.java @@ -0,0 +1,116 @@ +package com.sincere.att.mqtt; + +import lombok.extern.slf4j.Slf4j; +import org.eclipse.paho.client.mqttv3.*; +import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; + +import java.io.UnsupportedEncodingException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; + +/** + * mqtt 消息发送服务 + */ +@Slf4j +public class MqttManager { + + private static String accessKey; + + private static String sign; + + public static MqttClient mqttClient; + + public static String groupId; + + public static String topic; + + private static int qosLevel; + + public void init() { + final String brokerUrl = "tcp://post-cn-4590mq2hr03.mqtt.aliyuncs.com:1883"; + groupId = "GID_HFJSIURFHAQO110"; + topic = "Topic_Quene_Test"; + qosLevel = 1; + final Boolean cleanSession = false; + String clientId = groupId + "@@@9ED96FB6D72C1698"; + accessKey = "UimvLVp0Wj90P88u"; + String secretKey = "TE4rZenITG27tiQqHx9qINjx71Nws7"; + final MemoryPersistence memoryPersistence = new MemoryPersistence(); + if (null == mqttClient) { + try { + mqttClient = new MqttClient(brokerUrl, clientId, memoryPersistence); + } catch (MqttException e) { + e.printStackTrace(); + } + MqttConnectOptions connOpts = new MqttConnectOptions(); + //cal the sign as password,sign=BASE64(MAC.SHA1(groupId,secretKey)) + try { + sign = Tools.macSignature(clientId.split("@@@")[0], secretKey); + } catch (InvalidKeyException e) { + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + connOpts.setUserName(accessKey); + connOpts.setPassword(sign.toCharArray()); + connOpts.setCleanSession(cleanSession); + connOpts.setKeepAliveInterval(90); + connOpts.setAutomaticReconnect(true); + mqttClient.setCallback(new MqttCallbackExtended() { + @Override + public void connectComplete(boolean reconnect, String serverURI) { + log.info("connect success"); + } + + @Override + public void connectionLost(Throwable throwable) { + log.info("connect lost:" + throwable.toString()); + throwable.printStackTrace(); + init();//初始化 + } + + @Override + public void messageArrived(String s, MqttMessage mqttMessage) throws Exception { + log.info("receive msg from topic " + s + " , body is " + new String(mqttMessage.getPayload())); + } + + @Override + public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) { + //this notice make sense when qos >0 +// System.out.println("send msg succeed"); + } + }); + try { + mqttClient.connect(connOpts); + } catch (MqttException e) { + log.warn("mqtt:" + e.toString()); + e.printStackTrace(); + } + } + } + + public void sendMq(String deviceId, String content) { + + String recvClientId = groupId + "@@@" + deviceId; + final String p2pSendTopic = topic + "/p2p/" + recvClientId; + + MqttMessage message = null; + try { + message = new MqttMessage(content.getBytes("GB2312")); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + message.setQos(qosLevel); + log.info("发送内容:" + p2pSendTopic + " msg:---------" + content); + if (null != mqttClient) { + try { + mqttClient.publish(p2pSendTopic, message); + } catch (MqttException e) { + e.printStackTrace(); + } + } + + } + + +} diff --git a/cloud/zkAttendance/src/main/java/com/sincere/att/mqtt/Tools.java b/cloud/zkAttendance/src/main/java/com/sincere/att/mqtt/Tools.java new file mode 100644 index 0000000..1c5e2fa --- /dev/null +++ b/cloud/zkAttendance/src/main/java/com/sincere/att/mqtt/Tools.java @@ -0,0 +1,217 @@ +package com.sincere.att.mqtt; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.apache.commons.codec.binary.Base64; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.HttpStatus; +import org.apache.http.NameValuePair; +import org.apache.http.client.HttpClient; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.utils.URLEncodedUtils; +import org.apache.http.config.Registry; +import org.apache.http.config.RegistryBuilder; +import org.apache.http.conn.socket.ConnectionSocketFactory; +import org.apache.http.conn.socket.PlainConnectionSocketFactory; +import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; + +import javax.crypto.Mac; +import javax.crypto.spec.SecretKeySpec; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import java.io.IOException; +import java.nio.charset.Charset; +import java.security.*; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.*; + +/** + * Created by alvin on 17-3-29. + */ +public class Tools { + public static Properties loadProperties() { + Properties properties = new Properties(); + try { + properties.load(ClassLoader.getSystemResourceAsStream("test.properties")); + } catch (IOException e) { + } + return properties; + } + + /** + * 计算签名,参数分别是参数对以及密钥 + * + * @param requestParams 参数对,即参与计算签名的参数 + * @param secretKey 密钥 + * @return 签名字符串 + * @throws NoSuchAlgorithmException + * @throws InvalidKeyException + */ + public static String doHttpSignature(Map requestParams, String secretKey) throws NoSuchAlgorithmException, InvalidKeyException { + List paramList = new ArrayList(); + for (Map.Entry entry : requestParams.entrySet()) { + paramList.add(entry.getKey() + "=" + entry.getValue()); + } + Collections.sort(paramList); + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < paramList.size(); i++) { + if (i > 0) { + sb.append('&'); + } + sb.append(paramList.get(i)); + } + return macSignature(sb.toString(), secretKey); + } + + /** + * @param text 要签名的文本 + * @param secretKey 阿里云MQ secretKey + * @return 加密后的字符串 + * @throws InvalidKeyException + * @throws NoSuchAlgorithmException + */ + public static String macSignature(String text, String secretKey) throws InvalidKeyException, NoSuchAlgorithmException { + Charset charset = Charset.forName("UTF-8"); + String algorithm = "HmacSHA1"; + Mac mac = Mac.getInstance(algorithm); + mac.init(new SecretKeySpec(secretKey.getBytes(charset), algorithm)); + byte[] bytes = mac.doFinal(text.getBytes(charset)); + return new String(Base64.encodeBase64(bytes), charset); + } + + /** + * 创建HTTPS 客户端 + * + * @return 单例模式的客户端 + * @throws KeyStoreException + * @throws UnrecoverableKeyException + * @throws NoSuchAlgorithmException + * @throws KeyManagementException + */ + private static HttpClient httpClient = null; + + public static HttpClient getHttpsClient() throws KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyManagementException { + if (httpClient != null) { + return httpClient; + } + X509TrustManager xtm = new X509TrustManager() { + @Override + public void checkClientTrusted(X509Certificate[] arg0, String arg1) + throws CertificateException { + } + + @Override + public void checkServerTrusted(X509Certificate[] arg0, String arg1) + throws CertificateException { + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[]{}; + } + }; + SSLContext context = SSLContext.getInstance("TLS"); + context.init(null, new TrustManager[]{xtm}, null); + SSLConnectionSocketFactory scsf = new SSLConnectionSocketFactory(context, NoopHostnameVerifier.INSTANCE); + Registry sfr = RegistryBuilder.create() + .register("http", PlainConnectionSocketFactory.INSTANCE) + .register("https", scsf).build(); + PoolingHttpClientConnectionManager pcm = new PoolingHttpClientConnectionManager(sfr); + httpClient = HttpClientBuilder.create().setConnectionManager(pcm).build(); + return httpClient; + } + + public static HttpClient createHttpsClient() throws KeyManagementException, NoSuchAlgorithmException { + X509TrustManager xtm = new X509TrustManager() { + @Override + public void checkClientTrusted(X509Certificate[] arg0, String arg1) + throws CertificateException { + } + + @Override + public void checkServerTrusted(X509Certificate[] arg0, String arg1) + throws CertificateException { + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[]{}; + } + }; + SSLContext context = SSLContext.getInstance("TLS"); + context.init(null, new TrustManager[]{xtm}, null); + SSLConnectionSocketFactory scsf = new SSLConnectionSocketFactory(context, NoopHostnameVerifier.INSTANCE); + Registry sfr = RegistryBuilder.create() + .register("http", PlainConnectionSocketFactory.INSTANCE) + .register("https", scsf).build(); + PoolingHttpClientConnectionManager pcm = new PoolingHttpClientConnectionManager(sfr); + return HttpClientBuilder.create().setConnectionManager(pcm).build(); + } + + /** + * 发起Https Get请求,并得到返回的JSON响应 + * + * @param url 接口Url + * @param params 参数u对 + * @return + * @throws IOException + * @throws KeyStoreException + * @throws UnrecoverableKeyException + * @throws NoSuchAlgorithmException + * @throws KeyManagementException + */ + public static JSONObject httpsGet(String url, Map params) throws IOException, KeyStoreException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyManagementException { + HttpClient client = Tools.getHttpsClient(); + JSONObject jsonResult = null; + //发送get请求 + List urlParameters = new ArrayList(); + for (Map.Entry entry : params.entrySet()) { + urlParameters.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); + } + String paramUrl = URLEncodedUtils.format(urlParameters, Charset.forName("UTF-8")); + HttpGet request = new HttpGet(url + "?" + paramUrl); + HttpResponse response = client.execute(request); + if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { + String strResult = EntityUtils.toString(response.getEntity()); + jsonResult = JSON.parseObject(strResult); + } + return jsonResult; + } + + /** + * 工具方法,发送一个http post请求,并尝试将响应转换为JSON + * + * @param url 请求的方法名url + * @param params 参数表 + * @return 如果请求成功则返回JSON, 否则抛异常或者返回空 + * @throws IOException + */ + public static JSONObject httpsPost(String url, Map params) throws IOException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException { + JSONObject jsonResult = null; + //发送get请求 + HttpClient client = getHttpsClient(); + HttpPost request = new HttpPost(url); + List urlParameters = new ArrayList(); + for (Map.Entry entry : params.entrySet()) { + urlParameters.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); + } + HttpEntity postParams = new UrlEncodedFormEntity(urlParameters); + request.setEntity(postParams); + HttpResponse response = client.execute(request); + if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { + String strResult = EntityUtils.toString(response.getEntity()); + jsonResult = JSON.parseObject(strResult); + } + return jsonResult; + } +} -- libgit2 0.21.0