首页 > 编程语言 >物联网项目-通讯协议之 Java版

物联网项目-通讯协议之 Java版

时间:2023-09-23 14:01:47浏览次数:35  
标签:strTo16 通讯 Java String 联网 substring Integer nowStr data

物联网项目-温湿度表结构

物联网项目-温湿度-Web后台

物联网项目-温湿度Web管理后台代码之一

物联网项目-温湿度Web管理后台代码之二

物联网项目-温湿度Web管理后台代码之三

物联网项目-温湿度Web管理后台代码之四

物联网项目-温湿度Web管理后台代码之五

物联网项目-服务端TCP Server

物联网项目-订阅者Subscribe

物联网项目-温湿度之 TCP 协议包C#版

物联网项目-通讯协议之 C语言版 STM32

物联网项目-通讯协议之 Java版

物联网项目-温湿度之 nodemcu esp8266 刷机

物联网项目-温湿度stm32 发送短信打电话

0、背景

本协议包参考车联网TCP 组包格式,Java写测试客户端组包函数。

1、代码

java组包代码。

private Integer postDataToMq(String tsid, String message_type, Float temper, Float humidity){
        String head = strTo16("##");
        String cmd = "";
        cmd += message_type;//2 命令标识 01 登录 02 实时信息上报
        cmd += "FE";//3 应答标志
        cmd += strTo16(tsid);
        cmd += "01";//21 数据单元加密方式 01 不加密

        String dataLength = "";
        String data = "";
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");//设置日期格式
        Date dtNow = new Date();
        String nowStr = df.format(new Date());
        String year = nowStr;
        //System.out.println(year.substring(2, 4));
        data += padLeft(Integer.toHexString(Integer.parseInt(year.substring(2, 4))), 2, '0');// nowStr.substring(2, 2);//年
        //System.out.println(year.substring(2, 4));
        data +=  padLeft(Integer.toHexString(Integer.parseInt(nowStr.substring(4,6))), 2, '0');// nowStr.substring(4,2);//月
        //System.out.println(nowStr.substring(4,6));
        data += padLeft(Integer.toHexString(Integer.parseInt(nowStr.substring(6,8))), 2, '0');// nowStr.substring(6,2);//日
        //System.out.println(nowStr.substring(6,8));
        data += padLeft(Integer.toHexString(Integer.parseInt(nowStr.substring(8, 10))), 2, '0');// strTo16((nowStr.substring(8, 2)));//时
        //System.out.println(nowStr.substring(8, 10));
        data += padLeft(Integer.toHexString(Integer.parseInt(nowStr.substring(10,12))), 2, '0');// strTo16(nowStr.substring(10,2));//分
        //System.out.println(nowStr.substring(10,12));
        data += padLeft(Integer.toHexString(dtNow.getSeconds()), 2, '0');// strTo16(nowStr.substring(12, 2));//秒
        //System.out.println(dtNow.getSeconds());
        if(message_type.equals("02")) {
            data += "01";
            DecimalFormat decimalFormat = new DecimalFormat(".0");//构造方法的字符格式这里如果小数不足2位,会以0补足.
            String p = decimalFormat.format(temper);//format 返回的是字符串
            System.out.println(padLeft(p.replace('.', '0'), 4, '0'));
            data += padLeft(p.replace('.', '0'), 4, '0');
            data += "02";
            String h = decimalFormat.format(humidity);
            data += padLeft(h.replace('.', '0'), 4, '0');
        }else {
            data += padLeft(Integer.toHexString(2001), 4, '0');//登录流水号
            data += strTo16("898600MXKENJIXXXXX03");//20位 SSID
            data += strTo16("1");//温度
            data += strTo16("1");//湿度
            data += strTo16("0");//烟雾
            data += strTo16("0");//水浸
            data += strTo16("0");//电力
            data += strTo16("0");//入侵
        }
        dataLength = Integer.toHexString(data.length());
        dataLength = padLeft(dataLength, 4, '0');
        byte[] checkArray = (cmd + dataLength + data).getBytes();
        String check = getBCC(checkArray);
        String result = head + cmd + dataLength + data + check;

        //rabbitTemplate.convertAndSend("System.Byte[], mscorlib","upload", result.getBytes());
        //Message msg = new Message();
        //msg.setMsg(result);
        String routingKey = "upload";
        if(message_type.equals("01")){
            routingKey = "login";
        }
        rabbitTemplate.convertAndSend("IEMS",routingKey, result);
        System.out.println(result);
        return  1;
    }
    
public static String getBCC(byte[] data) {

        String ret = "";
        byte BCC[]= new byte[1];
        for(int i=0;i<data.length;i++)
        {
            BCC[0]=(byte) (BCC[0] ^ data[i]);
        }
        String hex = Integer.toHexString(BCC[0] & 0xFF);
        if (hex.length() == 1) {
            hex = '0' + hex;
        }
        ret += hex.toUpperCase();
        return ret;
    }
    /**
     * String左对齐
     */
    public static String padLeft(String src, int len, char ch) {
        int diff = len - src.length();
        if (diff <= 0) {
            return src;
        }

        char[] charr = new char[len];
        System.arraycopy(src.toCharArray(), 0, charr, 0, src.length());
        for (int i = src.length(); i < len; i++) {
            charr[i] = ch;
        }
        return new String(charr);
    }

    /**
     * 字符串转化成为16进制字符串
     * @param s
     * @return
     */
    public static String strTo16(String s) {
        String str = "";
        for (int i = 0; i < s.length(); i++) {
            int ch = (int) s.charAt(i);
            String s4 = Integer.toHexString(ch);
            str = str + s4;
        }
        return str;
    }

标签:strTo16,通讯,Java,String,联网,substring,Integer,nowStr,data
From: https://blog.51cto.com/kenji/7577995

相关文章

  • Maven 命令行构建 Java 项目
    Maven命令行构建Java项目(22条消息)使用Maven构建SpringBoot项目_Amazing_time的博客-CSDN博客_如何生成springboot项目的mvn构建命令xml-在Spring-BootIntro之后,"Unabletofindasuitablemainclass,pleaseadda'mainClass'属性"-IT工具网(coder.work)(2......
  • 无涯教程-JavaScript - MAXIFS函数
    描述MAXIFS函数返回由一组给定条件或条件指定的单元格中的最大值。Excel2016中已添加此功能。语法MAXIFS(max_range,criteria_range1,criteria1,[criteria_range2,criteria2],...)争论Argument描述Required/Optionalmax_rangeTheactualrangeofcellsinwh......
  • Java与MySQL的数据加密与解密:保障数据安全
    Java与MySQL的数据加密与解密是保障数据安全的重要手段。数据加密可以有效地防止敏感数据在存储和传输过程中被未经授权的人访问和篡改,而数据解密则是在需要使用加密数据时对其进行还原。下面将详细介绍如何在Java与MySQL中实现数据加密与解密来保障数据安全。一、数据加密方法1、......
  • 解决IntelliJ IDEA执行maven打包,执行java -jar命令提示jar中没有主清单属性
    问题场景IDEA执行mvncleanpackage-DskipTest=true命令或者借助工具的Maven菜单进行打包操作,然后执行java-jarapp.jar命令后,提示jar中没有主清单属性D:\WorkSpace\demo\target>java-jardemo-SNAPSHOT.jardemo-SNAPSHOT.jar中没有主清单属性原因分析这个错误通常是......
  • 01-React-父子组件通讯-函数式组件
    在了解父子组件通讯这个知识点的时候,首先要说明清楚一点内容就是什么是父组件什么是子组件,在上一篇React-组件开篇当中我们在App.js类组件当中使用到了其它的一些组件,那么App就是父组件,被App所使用的就是子组件,了解了什么是父子组件之后,介绍要来介绍一下它们之间该如何进......
  • 01-React-父子组件通讯
    父子组件通讯父组件将方法传递给子组件,在React当中也会将父组件传递的,数据和函数信息直接存放在子组件当中,的Props属性对象当中React的父子组件通讯的实现其实就是利用,函数的互相调用进行实现完成的Header.js:importReactfrom'react';import'./Header.css';impo......
  • 无涯教程-JavaScript - MAXA函数
    描述MAXA函数返回参数列表中的最大值。语法MAXA(value1,[value2]...)争论Argument描述Required/OptionalValue1Thefirstnumberargumentforwhichyouwanttofindthelargestvalue.RequiredValue2...Numberarguments2to255forwhichyouwanttofin......
  • 【Java 基础篇】Java Date 类详解:日期和时间操作的利器
    在Java编程中,处理日期和时间是一项常见但复杂的任务。Java提供了许多用于日期和时间操作的类,其中java.util.Date类是最早的日期和时间类之一。然而,它存在一些问题,因此Java8引入了java.time包,其中包含了java.time.LocalDate、java.time.LocalTime和java.time.LocalDat......
  • 【Java 基础篇】深入理解 Java 中的抽象类:提高代码可维护性与扩展性
    抽象类(AbstractClass)是Java面向对象编程中的一个重要概念。它允许我们定义一组抽象方法,这些方法可以被子类(类)实现。抽象类通常用于定义一些通用的方法和属性,但不能被实例化。本篇博客将深入探讨Java中抽象类的概念、语法和实际应用,适用于初学者,帮助你轻松理解和应用抽象类。什......
  • 【Java 基础篇】Java Date 类详解:日期和时间操作的利器
    在Java编程中,处理日期和时间是一项常见但复杂的任务。Java提供了许多用于日期和时间操作的类,其中java.util.Date类是最早的日期和时间类之一。然而,它存在一些问题,因此Java8引入了java.time包,其中包含了java.time.LocalDate、java.time.LocalTime和java.time.LocalDate......