物联网开发终端管理篇-java从MQTT获取设备数据,并通过Druid连接池把数据写入MySQL数据库(Windows系统)

这篇具有很好参考价值的文章主要介绍了物联网开发终端管理篇-java从MQTT获取设备数据,并通过Druid连接池把数据写入MySQL数据库(Windows系统)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

物联网开发终端管理篇-java从MQTT获取设备数据,并通过Druid连接池把数据写入MySQL数据库(Windows系统)

下面来给大家做个简单的数据对接,也就是通过写JAVA代码实现MQTT协议

  1. 首页我们得搭建一个简单的IDEA项目,这个我就不做演示了
  2. 搭建完项目,我们需要准备一些jar包,jar包名如下:
  1. org.eclipse.paho.client.mqttv3-1.1.0.jar
  2. mysql-connector-java-5.1.34.jar
  3. jackson-databind-2.10.0.jar
  4. jackson-core-2.10.0.jar
  5. jackson-annotations-2.10.0.jar
  6. 如果是连接sqlserver数据库 则用   jtds-1.3.1.jar

下面就是java代码了

package com.baidai;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 接收订阅的消息
 */
public class ClientMQTT implements MqttCallback {

    public static final String HOST = "tcp://127.0.0.1:1883";//(127.0.0.1也就是EMQX的ip地址)
    private static final String clientID = "clientXX";//(这个clientXX 可以随便写)
    private String TOPIC= "testtopic";//(这个testtopic 是EMQX的订阅主题,如果你对接别的数据,别人给了你主题,改这个就行)
    private MqttClient client;
    private MqttConnectOptions options;
    private String user = "admin";//(连接登录EMQX的账号)
    private String password = "xiaofang";//(连接登录EMQX的密码)
    private String driverName = "com.mysql.cj.jdbc.Driver";//(连接MySQL数据库)
    //private String driverName = "net.sourceforge.jtds.jdbc.Driver";//(连接SQLServer数据库)
    private String url = "";//根据不同数据库填写自己的数据库地址
    private String userName = "";//填写自己的数据库名称
    private String userPwd = "";//数据库对应密码


    /*连接MQtt*/
    public void clientStart(){
        try {
            client = new MqttClient(HOST,clientID,new MemoryPersistence());
            options = new MqttConnectOptions();
            options.setCleanSession(true);
            options.setKeepAliveInterval(10);
            options.setConnectionTimeout(50);
            options.setUserName(user);
            options.setPassword(password.toCharArray());
            client.setCallback(new ClientMQTT());
            MqttTopic topic = client.getTopic(TOPIC);
            //setWill方法,如果项目中需要知道客户端是否掉线可以调用该方法。设置最终端口的通知消息
            options.setWill(topic,"close".getBytes(),1,true);
            client.connect(options);
            int[] Qos = {1};
            String[] topic1 = {TOPIC};
            client.subscribe(topic1,Qos);
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }

    /**
     * 连接数据库
     */
    public void connection(){
        try {
            Class.forName(driverName);
            System.out.println("连接成功!!!");

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
            System.out.println("驱动加载失败");
        }

        try {
        	//在这里可以先测试数据库能不能连接
            Connection dbcon = DriverManager.getConnection(url,userName,userPwd);
            System.out.println("数据库连接成功!");

            System.out.println("数据库连接成功!");
        } catch (SQLException e) {
            e.printStackTrace();
            System.out.println("连接失败");

        }
    }

    @Override
    public void connectionLost(Throwable throwable) {
        System.out.println(throwable);
        //连接断掉会执行到这里
        System.out.println("连接以断,请重新连接!!!");
    }

	//接收EMQX上订阅主题的数据
    @Override
    public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {

        try {

			//获取消息返回格式
            String msg = new String(mqttMessage.getPayload());
            if(msg.equals("close")){
                return;
            }
            ObjectMapper objectMapper = new ObjectMapper();
            JsonNode jsonNode = objectMapper.readTree(msg);

            String info= jsonNode.get("info").toString();
            String time= jsonNode.get("time").toString().replaceAll("\"", "").replaceAll("/","");
			//格式化接收过来的时间
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddhhmmss");
            Date productTime = simpleDateFormat.parse(timeStamp);
            String infoTwo = jsonNode.get("infoTwo ").toString();

			//按照对方返回过来的格式接收数据
            JsonNode infoList = objectMapper.readTree(info);
            JsonNode infoTwoList = objectMapper.readTree(infoTwo);

            for (JsonNode dataJsonNode : infoList) {
                //这里就省略了
            }
            
            for (JsonNode dataJsonNode : infoTwoList) {
                //这里就省略了
            }

			//连接数据库
            Connection dbcon = DriverManager.getConnection(url,userName,userPwd);
            Statement stmt = dbcon.createStatement();

			//如果是SqlServe不能自动生成id,可以用这个生成一个随机id
            ResultSet rs = stmt.executeQuery("select REPLACE(NEWID(), '-', '') as Id");
            String id="";
            while(rs.next()) {
                id=rs.getString("Id").toString();
            }
            String sql="insert into 表的名称 (id,name,date,number,totalNumber,nowDate)"+
                    "values(?,?,?,?,?,?)";

            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

            PreparedStatement preparedStatement = dbcon.prepareStatement(sql);//预编译下SQL语句
            preparedStatement.setString( 1,id);
            preparedStatement.setString( 2,"测试");
            preparedStatement.setString( 3, dateFormat.format(time));//获取时间
            preparedStatement.setInt( 4,number);//数量
            preparedStatement.setDouble( 5,totalNumber);//总数量
            preparedStatement.setString( 6,dateFormat.format(System.currentTimeMillis()));//获取当前时间
            //这里是执行上面的sql语句的方法
            preparedStatement.executeUpdate();
            //subscribe后会执行到这里
            System.out.println("订阅消息的主题是:"+s);
            System.out.println("消息的ID是:"+mqttMessage.getId());
            System.out.println("添加成功:"+msg);
            System.out.println("添加成功SQl语句:"+preparedStatement);
        }catch (Exception e){
            System.out.println("插入错误信息:"+e);
        }

    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
        //publish可以执行到这里
        System.out.println("This is deliveryComplete method----->"+iMqttDeliveryToken.isComplete());
    }

    public static void main(String[] args) {
        ClientMQTT clientMQTT = new ClientMQTT();
        clientMQTT.clientStart();
        //在这里可以先测试数据库能不能连接
        //clientMQTT.connection();
    }
}

上面的代码写完,下面我们该怎么让上面的代码可以直接在服务器上面跑,不用自己一直启动idea项目呢???




生成可执行jar包, 并安装运行到服务器

1.停止运行

mqtt数据如何存入数据库,数据库,java,物联网

2.因为程序已经设置过生成jar包,所以用户直接按照下面操作即可生成可执行jar包.

mqtt数据如何存入数据库,数据库,java,物联网
mqtt数据如何存入数据库,数据库,java,物联网
mqtt数据如何存入数据库,数据库,java,物联网
mqtt数据如何存入数据库,数据库,java,物联网
mqtt数据如何存入数据库,数据库,java,物联网
mqtt数据如何存入数据库,数据库,java,物联网
mqtt数据如何存入数据库,数据库,java,物联网

然后找到idea设置的Show Excluded Filesmqtt数据如何存入数据库,数据库,java,物联网

mqtt数据如何存入数据库,数据库,java,物联网

然后可能就会生成Out文件或者class文件。文件是橙黄色的,然后右键Show in Explorer

mqtt数据如何存入数据库,数据库,java,物联网

然后找到生成的jar包的位置

mqtt数据如何存入数据库,数据库,java,物联网

如果服务器没有安装JDK,请用户先安装JDK,然后把先前生成的jar包拷贝到服务器

mqtt数据如何存入数据库,数据库,java,物联网

下一步就是打开命令窗口 cmd

mqtt数据如何存入数据库,数据库,java,物联网

进入到jar包目录

mqtt数据如何存入数据库,数据库,java,物联网

执行 java -jar MqttDataToMySQL.jar

mqtt数据如何存入数据库,数据库,java,物联网

打印所有设备的数据,说明已经运行起来了

mqtt数据如何存入数据库,数据库,java,物联网

让程序在后台运行

1. 关闭

mqtt数据如何存入数据库,数据库,java,物联网

2. 注意呀!不要犯常识性错误!把文件扩展名选中!

mqtt数据如何存入数据库,数据库,java,物联网

3. 在jar包目录新建一个后缀名字为.bat的文件

编辑里面的内容如下(MqttDataToMySQL.jar 就是jar包的名字)

@echo off
start javaw -jar MqttDataToMySQL.jar
exit

mqtt数据如何存入数据库,数据库,java,物联网

4. 双击运行即可

mqtt数据如何存入数据库,数据库,java,物联网

5. 如果要关闭,找到任务管理器java运行进程,关闭即可

mqtt数据如何存入数据库,数据库,java,物联网

6.也可以指定JDK路径运行

C:\java8\jdk1.8.0.131 为JDK的安装路径
@echo off
set JAVA_HOME=C:\java8\jdk1.8.0.131
set CLASSPATH=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOMe%\lib\tools.jar;
set Path=%JAVA_HOME%\bin;
start javaw -jar MqttDataToMySQL.jar
exit

在服务器运行Jar包可能会出现的错误:

“Exception in thread “main” java.lang.SecurityException: Invalid signature file digest for Manifest”

解决办法

找到你打的jar包META-INF中后缀为.SF和.RSA文件并且删除,然后重新运行,就会成功!!!!赶紧去试试吧!!!

mqtt数据如何存入数据库,数据库,java,物联网

如果还不可以的话,你可以自行查看别人解决的办法点击查看解决方法

如果你想多次运行不同的jar包,你得改java代码的“clientID”,然后再重新打jar包,取不同的jar包名称,然后放到服务器上面运行

mqtt数据如何存入数据库,数据库,java,物联网文章来源地址https://www.toymoban.com/news/detail-671607.html

到了这里,关于物联网开发终端管理篇-java从MQTT获取设备数据,并通过Druid连接池把数据写入MySQL数据库(Windows系统)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【汤4操作系统】深入掌握操作系统-文件管理篇

    数据项记录文件 数据项分为: 基本数据项:描述对象的某些属性,例如学生的年龄,姓名学号等 组合数据项:由若干个基本数据项组合而成 记录:一组相关数据项的集合,用于描述一个对象在某方面的属性 文件:文件是指由创建者所定义的、 具有文件名的一组 相关元素的

    2024年02月09日
    浏览(42)
  • 【探索 Kubernetes|作业管理篇 系列 11】控制器的核心功能

    大家好,我是秋意零。 上一篇结束了 Pod 对象的内容。 今天要探讨的内容是 “控制器”,它是 Kubernetes 编排最核心的功能。理解了 “控制器”,你就能理解 Deployment、StatefulSet、DaemontSet、Job、CroJob 控制器对象。 最近搞了一个扣扣群,旨在技术交流、博客互助,希望各位大佬

    2024年02月11日
    浏览(37)
  • 【探索 Kubernetes|作业管理篇 系列 15】DaemonSet 的”过人之处“

    大家好,我是秋意零。 在上一篇中,我们讲解了 StatefulSet 的存储状态;我们发现,它的存储状态,就是利用了 PV 与 PVC 的设计。StatefulSet 自动为我们创建 PVC 并且以 pvc-name-pod-name-编号 命名,从而始终与 Pod 编号名一致的绑定。 需要注意的是 :StatefulSet 的“滚动更新”是从最

    2024年02月11日
    浏览(34)
  • 【探索 Kubernetes|作业管理篇 系列 10】Pod 健康检查和恢复机制

    大家好,我是秋意零。 上一篇中介绍了,Pod 的服务对象,从而对 Pod 有了更深的理解; 今天的主题是 Pod 健康检查和恢复机制,我们将结束 Pod 的内容。 最近搞了一个扣扣群,旨在技术交流、博客互助,希望各位大佬多多支持!在我主页推广区域,如图: 文章底部推广区域

    2024年02月09日
    浏览(41)
  • U3D客户端框架(资源管理篇)之自动化打Assetbundle包管理器

    AssetBundle是将资源使用Unity提供的一种用于存储资源的压缩格式打包后的集合,它可以存储任何一种Unity可以识别的资源,如模型,纹理图,音频,场景等资源。也可以加载开发者自定义的二进制文件。他们的文件类型是.assetbundle/.unity3d,他们先前被设计好,很容易就下载到我们

    2024年02月09日
    浏览(39)
  • 【探索 Kubernetes|作业管理篇 系列 16】离线业务 Job、CronJob

    大家好,我是秋意零。 在上一篇中,我们讲解了 DaemonSet 控制器,相信你以及理解了其的工作过程,分为三部。一是,获取所有 Node 节点中的 Pod;二是,判断是否有符合 DaemonSet 管理的 Pod;三是,通过“亲和性”和“容忍”来精确控制并保证 Pod 在目标节点运行。 今天的内容

    2024年02月12日
    浏览(40)
  • 【管理篇 / 升级】❀ 13. FortiOS 7.4固件升级新规则 ❀ FortiGate 防火墙

    【简介】飞塔防火墙的固件升级一直是所有厂家中最好的。只要有注册官方帐号,有注册设备,并且只要有一台设备在服务期内,即可下载所有型号的所有版本的固件。即使其它设备服务期已过,也可以通过固件文件手动升级,避免防火墙受到漏洞攻击。但是从7.4版本开始,

    2024年01月17日
    浏览(58)
  • 【探索 Kubernetes|作业管理篇 系列 7】探究 Pod 有什么用,为什么需要它

    大家好,我是秋意零。 前一篇,我们介绍了如何从 0 到 1 搭建 Kubernetes 集群。现在我们可以正式了解,Kubernetes 核心特征了。 今天我们来探究 Pod,为什么需要 Pod? 👿 简介 🏠 个人主页 : 秋意零 🧑 个人介绍 :在校期间参与众多云计算相关比赛,如:🌟 “省赛”、“国

    2024年02月09日
    浏览(54)
  • 【探索 Kubernetes|作业管理篇 系列 8】探究 Pod 的 API 对象属性级别与重要字段用法

    大家好,我是秋意零。 本专栏上一篇中,我们介绍了 Pod 的核心思想以及 Pod 的工作原理。今天我们还是探讨 Pod ,聊一聊 Pod 的基本概念。 👿 简介 🏠 个人主页 : 秋意零 🧑 个人介绍 :在校期间参与众多云计算相关比赛,如:🌟 “省赛”、“国赛” ,并斩获多项奖项荣

    2024年02月08日
    浏览(49)
  • 【管理篇 / 恢复】❀ 08. 文件权限对macOS下用命令刷新固件的影响 ❀ FortiGate 防火墙

    【简介】虽然上篇文章中成功的在macOS下刷新了固件,但是很多小伙伴在实际操作中碰到了无法成功的状况,我们来看看最常见的一种。  在/private/tftpboot目录拷贝另一个版本的固件文件,具体拷贝过程不再详述。  打开终端,输入命令  sudo launchctl load -F /System/Library/LaunchDa

    2024年02月02日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包