局域网内用JAVA建立MQTT客户端监听MQTT服务器消息并持久化到数据库

实验一 MQTT与MySQL数据持久化实验 实验一 MQTT与MySQL数据持久化实验 准备 你需要有一个云服务器、ESP8266、DHT11、一条安卓线和3根母母线。 步骤: 首先登录你的云服务器终端界面,我这里以腾讯云为例, 然后打开网址https://www.emqx.cn/download,选中EMQ X Enterprise, 根据你的云服务器选择相应系统,安装方式选npm,CPU架构一般都是选x86_64,然后依次运行下面的命令来安装和运行emqx。 登录你的宝塔页面,还没安装的根据宝塔官网安装步骤自行安装即可,比较简单,这里就不说 阅读详情

这玩意能干什么?我只能说,这是一个物联网的方案,能通过java客户端监听来自单片机发送的消息,单片机有什么消息?常见的有:比如持久性的传感器数据上报,这你得1s上传一次吧,还有一些控制设备的信息,比如灯,电机之类一次操作持续运转的东西。

写在前面:

曾经用过的一种需要接入Internet的物联网方案(这是目前的主流):

我之前就受益与免费的云平台(云服务器),比如我以前博客里介绍过了的巴法云平台,还有我以前用过的小熊派华为云平台,它们的好处显而易见,就是不需要你去搭建服务器,不需要去了解数据传输的各种细节,你只需要用你的单片机去连上云就行了,用它们的API接口(特别是巴法云平台的接口真的适合小白实现前端和设备的控制),面向接口编程确实给人很舒服。缺点就是你必须得有网络吧,没网络你就连不上云。

本次主角:

一种局域网内物联网方案(非主流,但实用)

优点:不需要接入外网,除了这个优点没什么优点。

步骤:

首先,你得有个MQTT的服务器吧,怎么办,用EMQX搭建一个局域网的MQTT服务器。

然后,用MQTTX或paho或是它本身自带的web测试接口测试是否能正常订阅和发布消息以及能否正常收到消息。

然后,你得有单片机吧,单片机得支持MQTT协议吧,推荐用ESP32(ESP8266),基于开源的arduino,你能在太极创客的文档上轻松学会MQTT的相关知识。然后你得把单片机的数据格式转换成通用的JSON格式去发。

附上太极创客的相关文档链接地址:

零基础入门学用物联网 – MQTT基础篇 – 目录 – 太极创客 (taichi-maker.com)

然后,也就是本次的主题了,用JAVA建立一个客户端,由于要用MQTT,所以java是一个springboot的项目,用其去监听EMQX建立的MQTT服务器的报文(也就是对于主题所发布个各种消息),客户端不局限于用JAVA语言去写,具体可参考EMQX的文档,报文采用JSON格式,为什么要用JSON格式,因为方便用JSON格式反过来创建对象然后将对象的属性持久化到数据库。

MQTT Java 客户端库 | EMQX 文档

你可以用这文档里的相关代码,然后稍微修改,就以我的为参考(已经设置了断开服务器后客户端自动重连)

连接Mysql(主要是拿到数据库的操作对象connection)

package emqx.demo.Console;



import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;

public class JDBC {
    static String driverClass=null;
    static String url=null;
    static String name=null;
    static String password=null;

    static {
        try {
            //读取配置文件的信息
            Properties properties= new Properties();
            InputStream is=new FileInputStream("MyInfo.properties");//放在工程文件下使用
            //InputStream is=JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");//放在src下使用
            //导入输入流
            properties.load(is);
            //读取属性
            driverClass=properties.getProperty("driverClass");
            url=properties.getProperty("url");
            name=properties.getProperty("name");
            password=properties.getProperty("password");
            System.out.println(driverClass);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


    /**
     * 获取连接对象
     * @return
     * */
    public static Connection getConn() {
        Connection conn=null;
        try {
            Class.forName(driverClass);
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            conn = DriverManager.getConnection(url,name,password);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return conn;
    }
    /**  释放资源
     *
     *
     **/
    public static void release(Connection conn,Statement st,ResultSet rs) {
        closeRs(rs);
        closeSt(st);
        closeConn(conn);
    }

    public static void release(Connection conn,Statement st) {
        closeSt(st);
        closeConn(conn);
    }
    private static void closeRs(ResultSet rs) {
        try {
            if(rs!=null)
                rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            rs=null;
        }
    }
    private static void closeSt(Statement st) {
        try {
            if(st!=null)
                st.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            st=null;
        }
    }
    private static void closeConn(Connection conn) {
        try {
            if(conn!=null)
                conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            conn=null;
        }

    }

}

连接EMQX的MQTT服务器

package emqx.demo.Console;

import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

public class ConnectServer {

    String subTopic ="ESP32/DEVICE";//订阅主题
    int qos =1;//消息服务等级
    String broker ="tcp://127.0.0.1:1883";//emqx搭建的mqtt服务器的地址
    String clientId  ="JavaClient";//这个客户端的名字在emqx上显示的
    String content="Java Client is online";//发布消息
    String pubtopic="esp32";//发布主题
    public ConnectServer() {

        MemoryPersistence persistence = new MemoryPersistence();//保存形式以内容保存

        try {
            MqttClient client = new MqttClient(broker, clientId, persistence);
            //设置消息对象
            MqttMessage message = new MqttMessage(content.getBytes());//待发送的信息
            message.setQos(qos);

            // MQTT 连接选项
            MqttConnectOptions connOpts = new MqttConnectOptions();
            connOpts.setUserName("emqx_java");
            connOpts.setPassword("random".toCharArray());
            // 保留会话
            connOpts.setCleanSession(false);
            //设置超时时间
            connOpts.setConnectionTimeout(10);
            /*
            设置会话心跳时间 单位为秒 服务器会每隔
            1.5*20秒的时间向客户端发送个消息判断客户端是否在线,
            但这个方法并没有重连的机制
             */
            connOpts.setKeepAliveInterval(20);

            // 设置回调
            client.setCallback(new MyMqttCallback());


            // 建立连接
            while (!client.isConnected()) {
                System.out.println(" client is Connecting to broker: " + broker);
                client.connect(connOpts);
            }
            System.out.println("连接成功");

            // 订阅
            client.subscribe(subTopic,qos  );
            System.out.println("订阅主题"+subTopic);

            // 发布上线消息
            client.publish(pubtopic,message);


        } catch (MqttException me) {
            System.out.println("reason " + me.getReasonCode());
            System.out.println("msg " + me.getMessage());
            System.out.println("loc " + me.getLocalizedMessage());
            System.out.println("cause " + me.getCause());
            System.out.println("excep " + me);
            me.printStackTrace();
        }


    }
}

编写回调函数类(这个根据自己的需求写就好了)

回调函数类必须实现MqttCallback接口

package emqx.demo.Console;

import com.alibaba.fastjson.JSON;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;

import java.sql.SQLException;
import java.sql.Statement;


/*
* MQTT回调
* 收消息持久化到mysql
*
*
* */
public class MyMqttCallback  implements MqttCallback {

 public  static    Statement stmt= null;
    ESP32 myesp32;
    String mystring;
    public  MyMqttCallback()  {
        try {
            stmt= JDBC.getConn().createStatement();
        }
        catch (Exception e){
            System.out.println("无法创建statement实例化对象");
        }

    }
    @Override
    public void connectionLost(Throwable cause) {
        System.out.println("连接断开,可以做重连");
        new ConnectServer();//每次连接断开就又创建一个连接对象



    }

    @Override
    public void messageArrived(String topic, MqttMessage message) throws Exception {
        // subscribe后得到的消息会执行到这里面
        System.out.println("接收来自主题:" + topic+"的信息内容:");
        mystring=new String(message.getPayload());
        System.out.println(mystring);
        myesp32= JSON.parseObject(  mystring,ESP32.class);
        System.out.println(myesp32.toString());
        System.out.println("--------------------------------");


        /*
        *
        * 更新瞬间性操作传感器比如灯,电机的状态
        * */
        if(myesp32.command==1){
            try {
                MysqlDao.updata(myesp32.name,myesp32.state,stmt);
                System.out.println("更新传感器状态");
            }
           catch (Exception e){
               System.out.println("更新数据失败");
           }


        }


        /*
        * 插入传感器持久性上传的数据
        *
        * */
        else if(myesp32.command==2) {
            try {
                MysqlDao.insert(myesp32.name, myesp32.data, stmt);
                System.out.println("插入新数据");
            }
            catch ( Exception e){
                System.out.println("插入新数据失败");
            }

        }
        mystring="";

    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken token) {
        System.out.println("deliveryComplete---------" + token.isComplete());
    }


}

以及编写我的Mydao类,用于数据持久化到数据库

package emqx.demo.Console;

import com.sun.source.tree.LineMap;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import sun.nio.cs.FastCharsetProvider;

import java.security.Key;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Repository
public class MysqlDao  {

    /*
    *
    * 供接口拿数据的方法
    *
    * */
        //获取某传感器的全部数据
         public   static  Map   FindAll(Statement statement, String name, String tablename) throws SQLException {
        ResultSet rs=statement.executeQuery( "SELECT id, name, data FROM "+tablename+"  where  name ='"+name+"'");
            Map map=new HashMap();
            List list=new ArrayList();
            map.put(name,list);
            while (rs.next()) {
                // 通过字段检索
                list.add(rs.getString("data")) ;
            }
            map.put(name,list);
            return  map;
        }

        //获取传感器对应的最新数据
   public    static  String find(String Sensor_name,String key,Statement statement) throws SQLException {
       String sql=  "SELECT    "+  key+"   FROM devices.sensor   WHERE  id=(SELECT MAX(id) FROM sensor GROUP BY `name` HAVING `name`="+"\""+Sensor_name+"\")";
       System.out.println(sql);
       ResultSet rs=statement.executeQuery(sql);
       System.out.println(rs.toString());
        rs.next();
      System.out.println(rs.getString(key));
       return rs.getString(key);
   }


   public static String   GetState(String name ,Statement statement){
    String sql= "SELECT state  FROM action WHERE `sname` ="+"'"+name+"'";
       System.out.println(sql);
       try {
           ResultSet rs=statement.executeQuery(sql);
           rs.next();
           return rs.getString("state");
       } catch (SQLException e) {
           e.printStackTrace();
           return "error";

       }
   }


   /*
   *
   *
   * 监听单片机发出的数据
   *
   * */



    //在数据库的表中插入数据
   public  static  boolean insert(String name,String dat,Statement sta) throws SQLException {
       String sql="insert  into  devices.sensor(name,data)  VALUES ('"+name+"" +"','"+dat+"')";
       System.out.println(sql);
       if (sta.execute(sql))return true;
       return false;
   }

   //更新持续性外设如灯,电机的状态一次改变永久使用
    public static  void  updata(String dev,String state,Statement statement) throws SQLException {
       String sql="UPDATE devices.action SET state='"+state+"'WHERE sname='"+dev+"'";
        System.out.println(sql);
       statement.executeUpdate(sql);
    }



}

以上就做完了,Mqtt服务器的消息就JAVA客户端监听并被被持久化报存到了数据库中。

最后就是用JAVA的JDBC写数据库相关的API接口供安卓端,微信小程序端去调用,让它们拿数据放前端界面了就ok了。可以的话,可用JAVA的第三方框架Mybatis去简化API接口的编写。(主要简化的是sql语句)

MQTT与MySQL数据持久化实验(ESP32、MQTT、MySQL、云服务器) 一、实验目的 实现MQTT数据在MySQL上的数据持久化实验。 参考文章: EMQ X 规则引擎系列(二)存储消息到 MySQL 数据库 https://www.cnblogs.com/emqx/p/11401071.html 二、实验原理 或 三、实验软硬件环境 硬件:Arduino+wifi/esp32、DHT11温湿度传感器 软件:Arduino IDE、云服务器、宝塔面板、EMQX CLOUD 四、实验过程 1.数据库搭建(MySQL) 2.使用SQL语句新建数据表 使用以下 SQL 语句将创 阅读详情

相关推荐

将mqtt的消息存储至mysql数据库

一段linux系统中处理mqtt消息服务器上的消息入库的例程。使用python开发

含光左卫的工作笔记集 2488

内存模型系列(下)- 内存持久性模型(Memory Persistency)

本文主要深入浅出地介绍了用于约束内存持久化指令完成顺序的内存持久性模型(Memory Persistency)。该模型面向未来的持久内存系统,其核心主张为:通过扩展内存一致性模型,1) 帮助架构师挖掘持久化指令的指令级并行度,2) 帮助编程者推理崩溃一致性。

猫科龙 4793

推送消息到手机?从推送原理到自建MQTT链路实践

消息推送是移动端开发常见需求,但高可靠送达并非易事。初看“推送消息到手机”类似服务端调用接口,实际难点在于设备离线、进程被杀后仍然可靠送达。传统HTTP轮询不仅浪费资源,实时性也受限,理解Push与Pull的本质差异是技术选型的前提。MQTT协议凭借轻量、低带宽、发布订阅模型,成为自建推送通道的常用方案。系统级通道(如APNs、厂商通道)与自建MQTT各有适用场景:C端高到达率依赖厂商ROM,内部可控设备则可低成本搭建完整链路。本文基于EMQX开源Broker,演示一条“服务端发布→MQTT转发→Andro

cuixie2370的博客 431

Java实现mqtt连接,使用mqtt客户端工具实现消息的发布、订阅测试(超详解)

(1).server()实现了mqtt的连接,其中你的订阅消息主题可能是多个的,详情可以查看client.subscribe(subTopic,qos)方法的源码。(2).publish()可以通过controller层调用该接口实现消息的发布,消息的发布主题和消息内容根据你自己去定义。4.调用publish方法去发布消息,使用工具去订阅。1.mqtt客户端配置,可以填写好mqtt连接信息。3.使用工具发布消息后,代码中订阅消息。2.工具连接mqtt,添加订阅主题。

qq_65570537的博客 3993

KEPServerEX6+IoT Gateway实战:OPC数据转MQTT上云全流程

工业现场设备层数据丰富,但跨系统上云常受限于协议差异与网络环境。OPC UA作为工业通信标准,擅长设备内网互联,而MQTT凭借轻量、发布/订阅模型和QoS机制,成为物联网数据传输的首选。面对设备联网与数据采集上云需求,如何高效打通OPC到MQTT的链路是关键。KEPServerEX6作为成熟的OPC服务器,通过内置IoT Gateway组件,可将PLC等设备数据映射为MQTT主题,实现采集与转发解耦。文章从架构设计、环境准备、Agent与Data Map配置,到MQTT客户端验证与常见排障,完整拆解从模拟器

weixin_34413802的博客 281

工业实时看板协议选型:MQTT、SSE与WebSocket实战对比

工业实时看板本质是面向产线状态感知与快速响应的数据系统,其核心诉求在于低延迟、高可靠、强兼容与易运维。MQTT作为轻量级发布/订阅协议,天然适配PLC、传感器等异构设备接入,支撑海量终端的低带宽通信;SSE以极简HTTP流式传输实现浏览器端高效数据广播,兼顾自动重连与资源友好性;WebSocket则提供毫秒级双向通道,专精于远程控制、参数调试等强交互场景。三者并非替代关系,而是分层协作:MQTT管设备接入,SSE管数据下发,WebSocket管指令回传。本文基于光伏、汽车、化工等真实产线案例,解析协议原理、

cojm55771的博客 448

java测试mqtt持久化数据,零基础入门到精通,收藏这篇就够了

我之前就受益与免费的云平台(云服务器),比如我以前博客里介绍过了的巴法云平台,还有我以前用过的小熊派华为云平台,它们的好处显而易见,就是不需要你去搭建服务器,不需要去了解数据传输的各种细节,你只需要用你的单片机去连上云就行了,用它们的API接口(特别是巴法云平台的接口真的适合小白实现前端和设备的控制),面向接口编程确实给人很舒服。缺点就是你必须得有网络吧,没网络你就连不上云。本次主角:一种局域网内物联网方案(非主流,但实用)优点:不需要接入外网,除了这个优点没什么优点。

Python_0011的博客 623

【信息科学与工程学】【通信工程】第二百四十一篇 IPv6改造方案中的需求列表01

编号场景IPv6特性业务场景特性应用系统的需求1公网用户访问IPv6地址分配与路由负载均衡、随机性应用系统需支持IPv6协议的HTTP/HTTPS监听,能够接收来自IPv6客户端的请求;Web服务器、API网关需绑定IPv6地址并开放相应端口;Session管理需兼容IPv6地址格式。2内网服务器间通信双栈或纯IPv6子网一致性、其他应用间的RPC调用(如Dubbo、gRPC)、数据库连接(JDBC、ODBC)需支持IPv6地址解析和连接;服务注册与发现组件(如Nacos、Consul)需存储和返回IPv6

weixin_49199313的博客 34

基于局域网内物联网的androidAPP开发——实现消息上报与命令下达

为实现第三方移动端控制的要求,我需要实现一个在个人局域网内控制设备的移动端APP。

昊月光华的博客 3439

C#实现MQTT客户端与服务端:基于MQTTnet的完整工程实践

MQTT是一种基于发布/订阅模式的轻量级消息传输协议,广泛应用于物联网、嵌入式设备及上位机通信场景。其核心原理是通过Broker中转消息,以Topic为路由标识,配合QoS等级实现不同可靠性的消息投递。理解透这套机制,对实际开发有直接价值。尤其在设备接入和调试过程中,一个本地自研Broker加功能完备的客户端工具,能显著提升联调效率。本文围绕C#语言与MQTTnet库,完整展示了如何构建MQTT客户端和服务端,涵盖连接配置、发布订阅、遗嘱消息、持久会话、断线重连等关键细节,并给出了常见问题排查与性能优化思路

weixin_34314962的博客 368

Java工业数据采集实战:使用Utgard连接OPC DA服务器

在工业自动化与物联网系统中,数据采集是连接物理设备与上层信息系统的核心技术。OPC(OLE for Process Control)作为工业通信的事实标准,特别是OPC DA(数据访问)协议,长期以来是实现不同品牌PLC、仪表与上位软件之间数据互通的关键桥梁。其原理基于微软的COM/DCOM技术,在Windows平台上为实时数据读写提供了稳定接口。对于采用Java技术栈的后台服务而言,直接调用COM组件存在跨平台障碍,因此需要通过JNI(Java Native Interface)桥接方案进行封装。Utga

weixin_30607659的博客 379

Spring Boot集成MQTT通信实战:从协议原理到生产排坑

MQTT是一种基于TCP长连接的轻量级物联网通信协议,以发布/订阅模型和极小的报文开销闻名。相比HTTP轮询,它能显著降低设备端功耗和流量消耗,同时支持双向实时通信和离线消息补发等能力。在Spring Boot生态中,通过集成Spring Integration MQTT模块可以快速接入MQTT,实现设备上下行链路的可靠通信。本文围绕MQTT与Spring Boot的整合实践,从协议特性、Broker选型、Topic设计到生产环境的调优排坑,提供了一套可直接落地的解决方案,适用于物联网平台、充电桩数据采集等

weixin_30235225的博客 164

华为SUN2000光伏逆变器Modbus TCP数据采集与MQTT上报实战

在光伏监控与能源物联网场景中,设备数据采集和协议转换是不可或缺的基础环节。Modbus TCP作为工业现场主流的通信协议,凭借跨平台支持和简单可靠的传输特性,广泛应用于各类逆变器、电表等设备的实时数据读取。而MQTT以其轻量、解耦和发布订阅模式,成为物联网数据上行与多系统集成的首选消息协议。本文将围绕华为SUN2000系列光伏逆变器,讲解如何通过Modbus TCP高效采集发电量、电压、电流等运行参数,并结合数据映射与倍率换算保证数值准确,再转换为结构化JSON消息通过MQTT上报至数据中心或可视化平台。方

weixin_34150830的博客 427

EdgeCitadel:异构边缘计算中NATS与MQTT协议的无缝桥接实践

在分布式系统和物联网架构中,消息中间件是实现服务解耦与异步通信的核心组件。其基本原理是通过发布/订阅、请求/回复等模式,在松散耦合的服务间可靠地传递数据。MQTT协议凭借其轻量级和低功耗特性,成为物联网设备通信的事实标准;而NATS则以其高性能和内置的服务发现、负载均衡能力,在云原生微服务中广泛应用。两者的技术价值在于为不同场景提供了最优的通信范式。然而,在边缘计算等异构环境中,设备与服务的通信协议往往不统一,导致系统集成复杂、通信效率低下。本文聚焦于**协议桥接**与**边缘计算**场景,通过设计一个名为

weixin_30326741的博客 327

DSPF28335:从零到一,实战GPIO与外部中断的嵌入式系统交互设计

本文以德州仪器DSPF28335芯片为例,详细讲解了嵌入式系统中GPIO与外部中断(EXTI)的实战配置方法。通过一个完整的按键控制LED并触发ADC采样的项目,深入剖析了GPIO寄存器配置、三级中断机制(外设-PIE-CPU)以及中断服务函数编写的核心要点,帮助开发者掌握嵌入式交互设计的基石,并提供了关键的避坑指南与调试清单。

weixin_29169899的博客 115

安装破解IAR EWARM 8.2,提供注册机

IAR Embedded Workbench for ARM(IAR for ARM)是一款微处理器的集成开发环境软件,该集成开发环境中包含了IAR的C/C++编译器、 汇编工具、链接器、库管理器、文本编辑器、工程管理器和C-SPY调试器,支持ARM,AVR,MSP430等芯片。   一、安装 双击运行安装程序,点击Install IAR Embedded Workbench for ARM...

睿思派克 4万+

MCU设备后端开发:从MQTT到协议适配的实战指南

嵌入式开发与Web后端的技术交汇日益频繁,MCU设备(如STM32、ESP32)的联网需求催生了针对资源受限客户端的后端架构设计。理解MCU的RAM、Flash、网络抖动等基础约束,是设计可靠设备接入服务的起点。以MQTT为代表的轻量级消息协议,凭借极小的报文开销、异步推送和遗嘱机制,成为设备通信的首选;而HTTP则在固件升级、设备激活等低频交互中扮演补充角色。后端需采用异步消息管道(如Redis Stream)解耦设备上报与业务处理,并通过CBOR或Protobuf等紧凑序列化格式降低传输成本。针对具体场

weixin_33885676的博客 383

HC32 CAN通信

qqa

zhaopenglihui的博客 5433

MQTT 3.1.1协议深度解析:从核心机制到物联网实战应用

物联网场景下,设备与云端的数据通信往往面临低带宽、高延迟和弱网环境,传统的请求/响应模式难以满足多对多实时交互的需求。MQTT作为一种轻量级的发布/订阅消息传输协议,以极小的报文开销和灵活的QoS分级机制,成为连接智能硬件与云端的关键桥梁。它通过Broker解耦生产者和消费者,支持主题通配符、遗嘱消息、保留消息和会话保持等特性,能有效应对设备状态监测、远程控制、实时数据上报等高频场景。从Mosquitto、EMQX等Broker的选型,到STM32嵌入式移植、4G模组AT指令接入、前端mqtt.js实时展示

weixin_33937778的博客 559

ROS2机械臂MPC轨迹规划实战:从MoveIt 2插件配置到参数调优全流程

本文详细介绍了ROS2机械臂MPC轨迹规划的全流程,从MoveIt 2插件配置到参数调优。通过模型预测控制(MPC)技术,实现高精度运动控制,特别适合复杂装配任务。文章包含环境搭建、插件部署、参数设计及实战调优方法,帮助开发者快速掌握ROS2机械臂的MPC轨迹规划技术。

i0j1k2l3m的博客 206

[漏洞利用]利用五次Shift越权破解win7\win10开机密码

注:第一个学习和接触的Windows漏洞 文章目录本机实验环境前置知识漏洞原理漏洞介绍漏洞验证解决方法基本流程介绍详细步骤截图 本机实验环境 虚拟机:VMware Workstation 14 pro 操作系统:Windows10 前置知识 1、cmd工具路径 c:\windows\system32\cmd,按五次shift默认调用同目录下sethc文件,其路径为“c:\windows\system32\sethc.exe” 2、用户/账户密码存储位置 c:\windows\system32\config\

Y4tacker的博客 2万+

国产MQTT协议栈替代Mosquitto/EMQX:选型、许可证与迁移实战指南

MQTT协议栈与消息代理(broker)是物联网通信中两个截然不同的层级:协议栈负责报文的编解码与收发,而broker负责连接管理和消息转发。理解这一边界,是评估国产替代方案的前提。开源许可证的差异直接影响商用合规性,Apache 2.0、EPL、GPL等许可条款决定了代码是否可以闭源分发,这也是许多团队替换Mosquitto和EMQX的核心动因。国产MQTT实现如JMQTT、QuickMQ以及RT-Thread嵌入式协议栈,在千级至万级设备接入场景中表现出色,且能更好地适配国产芯片与云平台生态。从服务器端

weixin_29165465的博客 278

NEU-DET 冷轧钢缺陷检测:基于 YOLOv8 的目标检测与可视化 UI 实现

冷轧钢的生产过程中,由于设备故障、工艺问题或者人为因素,钢板表面可能会出现多种缺陷,如划痕、裂纹、孔洞等,这些缺陷会严重影响钢材的质量。它比之前的版本(如 YOLOv5、YOLOv4)在速度和精度上都有显著提升,并且对硬件要求较低,适合进行工业界面和嵌入式系统的应用。这些版本相较于更大型的模型(如 YOLOv8x)具有更快的推理速度和较低的资源占用,适合工业生产线中的实时应用。通过将训练好的模型部署到工业生产线摄像头中,我们可以实现实时的缺陷检测,极大地提升生产效率和产品质量。

YOLO 736

.NET 8 vs Java:产线物联网后端的资源确定性选型指南

工业物联网后端服务需在严苛物理约束下实现毫秒级响应与7×24稳定运行,其核心挑战在于边缘设备资源受限、协议实时性要求高、部署运维零接触、安全策略白名单化。.NET 8凭借AOT编译消除JVM GC不确定性、零拷贝内存模型降低网络协议延迟、单文件Windows服务简化交付、默认关闭外连行为契合工业安全铁律,展现出远超Java 17/21的工程确定性。本文聚焦真实产线场景——老旧工控机、OPC UA/Modbus/S7多协议共存、SQLite本地持久化与MQTT上报——解析如何用Minimal API、Sour

weixin_30984001的博客 94

SAP_ABAP_SD_BAPI清单案例教程——销售订单开票_BAPI_BILLINGDOC_CREATEMULTIPLE_VF01_S4版本

SAP BAPI(Business Application Programming Interface)是SAP系统中的一组规范和标准,用于从SAP系统中获取数据、输入数据和更新数据。这些API允许开发者以编程方式与SAP系统交互,而无需编写大量的自定义代码。2.1 Copy代码 直接可使用。2.2 VF01开票。

java_zhong1990的专栏 2214

2025届程序技术类笔试题

希尔排序在直接插入排序的基础上进行了改进,它通过比较相距一定间隔的元素来进行,各轮比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一轮排序为止。某人逆着水流的方向向岸边划船,每次行进前进x米后需要休息一下,休息期间船会自行倒退y米,每次休息后再次行进,前进距离缩短1/5,若起始距离岸边为m米,问:能否到达岸上,需要行进多少次才能上岸。直接插入排序的原理是将第i个元素插入前面i-1个已排好序的记录中,将比第i个元素大的记录依次向后移动一个位置,将第i个元素插入空位。第二轮相邻比较,后移2次。

博客 591
上一篇: Mysql查询(以xx字符开头,以xx字符结尾,第几个字符是xxx)
下一篇: JAVA中JDBC的事务管理——Connection
昊月光华
博客等级 码龄6年 340粉丝 158原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值