IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 树莓派4B使用pi4j+WiringPi+Tomcat+IDEA进行USB串口通讯 -> 正文阅读

[Java知识库]树莓派4B使用pi4j+WiringPi+Tomcat+IDEA进行USB串口通讯

1、由于项目既需要USB串口通讯,又要用ffmpeg推流,所以选择64位操作系统: 操作系统下载地址

2、官方烧写工具下载地址

3、烧写工具下载完成后,
在这里插入图片描述
选择最底下的
在这里插入图片描述
然后再选择下载的系统镜像

4、选择TF卡
在这里插入图片描述

5、Write!

6、烧录完成后,在boot里添加SSH空文件

7、使用XShell连接
在这里插入图片描述

8、输入命令

ffmpeg

正常状态如下图所示:
在这里插入图片描述
参考rtsp转推rtmp命令如下:

ffmpeg -i "rtsp://admin:12345@192.168.1.77:554/h264/ch1/main/av_stream" -f flv -r 25 -s 640x480 -an "rtmp://localhost/oflaDemo/hello"

9、安装jdk11

说明:
1、由于pi4j的1.4版本才支持64位操作系统,且必须jdk11才能正常使用
2、安装jdk11时JRE_HOME需要与JDK_HOME一致
3、jdk11不自带jre,需要自己生成,命令如下(可能不需要)
jlink --module-path jmods --add-modules java.desktop --output jre
4、或者直接
sudo apt-get install openjdk-11-jdk
我没试过…

10、安装tomcat9

具体内容参考我以前文章:
https://blog.csdn.net/u014492512/article/details/101197876
以下两点需要根据现有环境修改

(1)catalina.sh添加如下内容,可以用idea来远程部署(注意修改ip地址):

export CATALINA_OPTS="-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=1099 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Djava.rmi.server.hostname=192.168.50.85"
 
export JAVA_OPTS="-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=1099 \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.rmi.port=1099"

(2)setclasspath.sh添加如下内容:

export JAVA_HOME=/home/pi/jdk1.8.0_321
export JRE_HOME=/home/pi/jdk1.8.0_321

11、下载pi4j-1.4
(1)jar下载地址:https://github.com/Pi4J/download/raw/main/pi4j-1.4.zip
(2)解压pi4j-core.jar,将pi4j-core\lib文件夹中的内容复制到\lib中
(3)示例如下:

package cmcc.serial;

import cmcc.Parameter;
import cmcc.ParameterManager;
import cmcc.Util;
import cmcc.fc.DataLinkParserUtil;
import cmcc.fc.Device;
import cmcc.fc.datalink.MAVLinkPacket;
import cmcc.fc.datalink.common.MsgSerialNumberRequest;
import com.pi4j.io.serial.*;

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;

/**
 * @author K.L.Zous
 */
public class SerialPortManager
{
    private static final SerialPortManager SERIAL_PORT_MANAGER = new SerialPortManager();

    private static Serial serial;
    private SerialDataEventListener listener;

    public static SerialPortManager getInstance()
    {
        return SERIAL_PORT_MANAGER;
    }

    public void init()
    {
        //打开串口
        if (connect())
        {
            Device.isConnect = true;
            //添加监听器
            startReceiveData();
            Parameter.threadPoolExecutor.execute(this::startSendData);
            Parameter.threadPoolExecutor.execute(this::getSn);
            return;
        }
        Device.isConnect = false;
        try
        {
            Thread.sleep(2000);
        }
        catch (InterruptedException e)
        {
            e.printStackTrace();
        }
        //刷新参数
        new ParameterManager(false).start();
    }

    /**
     * 获取数据
     */
    private void startReceiveData()
    {
        final DataLinkParserUtil parserUtil = new DataLinkParserUtil();
        //获取到数据
        serial.addListener(listener = event ->
        {
            try
            {
                parserUtil.unpackData(event.length(), event.getBytes());
            }
            catch (IOException ignored)
            {
                System.out.println("[Serial]inputStream.read(readBuffer):ERROR!");
//                    init();
            }
        });
    }

    /**
     * 发送串口数据
     */
    private void startSendData()
    {
        OutputStream outputStream = serial.getOutputStream();
        while (Device.isConnect && serial.isOpen())
        {
            try
            {
                MAVLinkPacket packet = Device.sendCommandQueue.take();
                outputStream.write(packet.encodePacket());
                outputStream.flush();
            }
            catch (InterruptedException | IOException e)
            {
                e.printStackTrace();
            }
        }
        try
        {
            outputStream.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    /**
     * 连接
     */
    private boolean connect()
    {
        disconnect();
        //默认获取第一个串口
        File file = new File(Parameter.PORT);
        if (!file.exists())
        {
            System.out.println("端口不存在:" + Parameter.PORT);
            return false;
        }
        SerialConfig config = new SerialConfig();
        config.device(Parameter.PORT);
        config.baud(Baud.getInstance(Parameter.RATE));
        serial = SerialFactory.createInstance();
        try
        {
            serial.open(config);
        }
        catch (IOException e)
        {
            e.printStackTrace();
            return false;
        }
        System.out.println("端口已打开:" + Parameter.PORT);
        return true;
    }

    /**
     * 断开连接
     */
    public void disconnect()
    {
        System.out.println("串口断开连接");
        Device.isConnect = false;
        if (serial == null)
        {
            return;
        }
        if (listener != null)
        {
            serial.removeListener(listener);
        }
        try
        {
            serial.close();
            serial = null;
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }

    /**
     * 发送获取飞控编号请求
     */
    private void getSn()
    {
        int retryNum = 0;
        while (Device.isConnect && Util.isEmpty(Device.sn))
        {
            try
            {
                Thread.sleep(500);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
            System.out.println("[Serial]Send FCSN request");
            Device.sendCommandQueue.offer(new MsgSerialNumberRequest().pack());
            if (retryNum > 10)
            {
                init();
                return;
            }
            retryNum++;
        }
    }

}

12、安装WiringPi

sudo apt-get remove wiringpi -y
sudo apt-get --yes install git-core gcc make
cd ~
git clone https://github.com/WiringPi/WiringPi --branch master --single-branch wiringpi
cd ~/wiringpi
sudo ./build

13、最终效果如下图
在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-01-24 10:41:48  更:2022-01-24 10:43:39 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:19:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码