Jetson Xavier NX 配置(七)—— 数据传输之socket文件传输 & usb摄像头RTSP视频推流

2023-05-16

目录

1、Python socket 文件传输

(1)发送单个文件(一次性)

(2)发送一个文件夹下的所有文件(一次性)

(3)发送每个文件夹下的最新文件(等时间间隔持续发送)

2、usb摄像头RTSP视频推流

(1)下载与配置

(2)使用


1、Python socket 文件传输

简介:python的socket库提供了基于TCP/IP协议的数据传输功能,相当于服务器端开了一个通道listen着,等待一台客户端connect,成功建立连接后,通过send和recv的发送和应答来实现数据传输
需要:同一内网下两台设备的ip地址(在cmd中,windows通过ipconfig命令查看,ubuntu通过ifconfig查看)

(1)发送单个文件(一次性)

参考博客:https://blog.csdn.net/m0_55415810/article/details/1214 p54582

(2)发送一个文件夹下的所有文件(一次性)

参考博客:python socket通信传输某文件夹下的所有图片_不告诉你/tp的博客-CSDN博客

这段代码我在运行试用的时候有出现报错。

一开始send一长串十六进制字符串,相当于是在对暗号,对上暗号了服务器才确认发送数据。但是我这里收发都报错,原代码 s.send("\xAA\x96\xAC\x00\x01\x00\x01\x69")  报错 TypeError: a bytes-like object is required, not 'str' ,改成了 s.send(b'\xAA\x96\xAC\x00\x01\x00\x01\x69') ;原代码 if(rev_str[6] == b"\x01") 的判断报错,应该是进制的问题,我改成了 if(str(rev_str[6]) == “1”) 用十进制判断就可以了

另外前面的send和recv,收发的是文件长度等信息,需要encode和decode成utf-8格式,否则也报错TypeError: a bytes-like object is required, not 'str'

(3)发送每个文件夹下的最新文件(等时间间隔持续发送)

前情提要:应用场景是有N个摄像头,对应N个文件夹,定时更新摄像头的最新抓拍截图,需要将最新的图像传输给其他客户端。

基于(2)进行了一些修改,尤其要注意沾包的问题,如果存在两次连续的send,而实际想要发送的这两次是两个独立的数据文件,对于socket来说他认为两次连续发送的内容是粘连在一起发送的。因此要避免连续的send,在send中间加一句recv(),进行阻塞,多一次一问一答的确认。

上代码:

(传输的数据存放方式与命名格式如下,可根据自己的需求自行修改)

 

服务器端-发送(先启动):

import sys
import socket  
import time
import os
import re

s_server = socket.socket()
print("开始创建服务器socket")
host = ''
port = 7891  # 随意设置一个空闲的端口号(和客户端保持一致即可)
addr = (host, port)
s_server.bind(addr)  # 绑定端口
s_server.listen(5)  # 监听等待客户端的connect,没有的话就一直停留在这一步等待

# 客户端程序运行以后就成功建立了连接
to_client, addr = s_server.accept()
print ('...connected from :', addr)
rev_str = to_client.recv(1024)
print(rev_str)

# 确认过暗号,是要接受该客户端的信息
if(str(rev_str[6]) == "1"):
    start = time.time()
    while True:
        # 每隔一定时间(20s)发送一次
        if (time.time() - start) > 20:
            # 遍历文件夹下的所有文件夹
            path_folder = r"/home/ysj/parking/code/cameras/"
            dirs_folder = os.listdir(path_folder)
            print("文件夹个数")
            print(len(dirs_folder)) 
            to_client.send(str(len(dirs_folder)).encode('utf-8'))

            # 遍历文件夹
            for folder in dirs_folder:  

                # 函数阻塞,防止沾包(避免连续两个send)
                to_client.recv(8) 

                start1 = time.time()
                print("当前文件夹:%s"%folder)
                # 获取该文件夹下的所有图片文件
                path_file = path_folder + folder + "/"
                files = os.listdir(path_file)
                # 对文件夹内的图片按文件名中的序号排序,取最大的那张(最新)
                # 我的图片命名格式如:192.168.1.104_15.jpg,需要用正则表达式取出其中的序号“15”
                files.sort(key = lambda x:int(x[re.search('(?<=_)(.+?)(?=\.jpg)', x).span()[0] : re.search('(?<=_)(.+?)(?=\.jpg)', x).span()[1]]))
                # 取最后一张图片
                file_size = os.path.getsize(path_file + files[-1])
                print('即将发送的文件长度是:%d '%file_size)
                file_info='%s|%s'%(files[-1], file_size)
                to_client.send(file_info.encode('utf-8'))
                to_client.recv(6)
                # 一张图片可能要分好几批才能发送完,此处是连续send
                fout = open(path_file + files[-1], "rb")
                has_send = 0
                while has_send < file_size:
                    frame_data = fout.read(1024)
                    to_client.send(frame_data)
                    has_send+=len(frame_data)

                end1 = time.time()
                dur1 = end1 - start1
                print('time cost: %.5f sec' %dur1)
            
            start = time.time()

    # 如果要定时持续接收的话就不关闭连接了
    # print("program exit normally:-> close socket")
    # s_server.close()
    # to_client.close()

客户端-接收:

import socket               # 导入 socket 模块
import time
 
s = socket.socket()         # 创建 socket 对象
host = socket.gethostname() # 获取本地主机名
port = 7891       # 设置端口号
 
s.connect(("192.168.1.106", port)) # 服务器的ip地址


while True:
    # 允许一轮接收发的时候才进行
    # 都要encode和decode成utf-8,否则报错无法传输str而是需要字节
    s.send(b'\xAA\x96\xAC\x00\x01\x00\x01\x69')
    # 对上暗号后,接收即将传输的文件夹下的文件个数
    file_num = s.recv(1024).decode('utf-8')
    print(file_num)
    file_num = int(file_num)

    for file_end in range(0, file_num):

        # 对应服务器端的那一句防止沾包的recv,传的内容无所谓
        s.send(str(file_num).encode('utf-8'))

        file_info = s.recv(80).decode('utf-8')
        print(file_info)
        filename,filesize=str(file_info).split('|')
        s.send(filesize.encode('utf-8'))
        filesize=int(filesize)
        # 接收文件的位置
        f_txt = open("./receive0905/"+filename, "ab")
        has_receive = 0
        while has_receive < filesize:
            picture_date = s.recv(1024)
            f_txt.write(picture_date)
            has_receive+=len(picture_date)
        # time.sleep(2)
        f_txt.close()
        print("接收了一个")
 
# s.close()

2、usb摄像头RTSP视频推流

参考博客:2.gstreamer USB摄像头RTSP推流_生如~夏花的博客-CSDN博客_gstreamer usb摄像头

(1)下载与配置

先下gst-rtsp-server,不能要最新版本的,没有autogen.sh,用旧版本

git clone  -b 1.8 https://github.com/GStreamer/gst-rtsp-server.git 

再下载common.git,粘贴到server下common文件夹下:

GitHub - GStreamer/common: 'common' shared submodule. This module is unused and deprecated.

然后就运行autogen.sh,make就好:

cd gst-rtsp-server 
./autogen.sh
sudo make

(2)使用

使用的时候进入examples文件夹
注:device=/dev/video0,此处的序号0是接入的摄像头序号,如果有多个摄像头需要修改

查看摄像头设备
sudo v4l2-ctl --list-devices
./test-launch --gst-debug-level=3 "( v4l2src device=/dev/video0 ! videoconvert ! video/x-raw, format=(string)NV12, width=640, height=480, framerate=30/1 ! queue ! x264enc bitrate=10240 !  rtph264pay name=pay0 pt=96 )"

(不记得最后成功执行的是哪一段代码了)

./test-launch  --gst-debug=3 "( v4l2src ! video/x-raw,width=640,height=480, framerate=30/1 ! omxh264enc ! h264parse ! rtph264pay name=pay0 pt=96 )"

执行后显示:stream ready at rtsp://127.0.0.1:8554/test

在同一局域网下的另一台主机上,就可以在VLC plyaer里打开网络串流,地址改成服务器的ip地址即可

或者通过opencv也可以获取

问题:当前的视频推流延迟太高了,有10s左右,还未深究

主要参考:

python socket通信传输某文件夹下的所有图片_不告诉你/tp的博客-CSDN博客
2.gstreamer USB摄像头RTSP推流_生如~夏花的博客-CSDN博客_usb摄像头rtsp推流

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jetson Xavier NX 配置(七)—— 数据传输之socket文件传输 & usb摄像头RTSP视频推流 的相关文章

  • 在c#中读取PVOID,我应该读取多少位?

    我正在读取 URB 类型的 USB 数据包 URB 标头定义于http msdn microsoft com en us library windows hardware ff540409 v vs 85 aspx http msdn mi
  • ALSA 记录 - 了解内存映射

    我尝试使用 ALSA 从 USB 音频设备获取输入并将其作为一系列内容写入磁盘signed short价值观 我最终得到的是看似有效的数据块 其中散布着大块的零 我猜测我的缓冲区设置不正确并且没有正确使用内存映射 我正在尝试什么 采样率 8
  • 通过 USB 模拟 UART

    有谁知道是否可以通过 USB 模拟 UART 简单串行发送和接收 这将如何实现 我在 Microchip 网站上找到了这个链接 但不是很容易找到 http www microchip com forums m522571 print asp
  • 软件和与外部设备串行通信的波特率限制

    我使用 USB 端口作为虚拟 COM 端口运行 以使用 MATLAB 或 Visual Basic 6 实现与外部设备的串行通信 我面临波特率限制 具体取决于我用于与设备通信的软件 MATLAB 2018a 没有问题 因为它可以设置高波特率
  • 使用 adb 连接到 LG 手机时出现问题 (Mac OS X 10.7.5)

    当我跑步时adb devices没有设备显示为已连接 我的设备是运行 4 4 2 的 LG Optimus Exceed 2 周围有很多这样的帖子 所以这就是我所做的 我正在使用电话附带的数据线 它会充电并尝试同步照片 因此这不是问题 切换
  • 如何枚举 USB 设备*并*对其进行读/写?

    我需要与一个自定义 USB 设备进行通信 它没有特定的驱动程序 该设备不显示为 dev tty I 发现 http www signal11 us oss udev 我该如何使用libudev枚举 USB 设备 假设我设法获得相应的stru
  • 如何在 DriverKit 中将我的 dex 与 USB 设备匹配?

    我正在编写一个驱动程序包扩展 其目标是阻止 USB 设备 例如闪存驱动器 作为起点 我选择了示例项目https developer apple com documentation driverkit communicating Betwee
  • 使用Python直接向USB发送信号

    如何使用 Python 将 USB 端口连接设置为高或低 这可用于定制 USB 设备 例如 假设我有一个 LED 连接到 USB 端口 数据线 现在通过代码我想闪烁它或控制它 现在 这可以通过使用任何微控制器 Arduino Raspber
  • 在 Python 中将 USB 视频捕获设备友好名称与 OpenCV 端口号相关联

    我想在 Windows 平台上使用 Python 获取外部 USB 视频捕获设备的友好名称和 USB 端口号 我正在使用 OpenCV 从 USB 捕获设备捕获视频 OpenCV 将 USB 端口称为 1 找到的第一个工作摄像头 0 对我来
  • 使用 STM32 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板
  • 从网络浏览器中检测和访问 USB 设备 - 即使用插件

    是否可以通过插件 activeX Java 或 Flex 编写一个能够检测从 USB 设备通道读取数据流的浏览器插件 我做了一些研究 但没有找到答案 http support microsoft com kb 832678 http sup
  • Android 版 usbmon

    我想分析我的设备的 USB 通信 SGS4 我到处都看到需要配置 usbmon 并将其编译到内核中 Afaik 这个模块没有内置在android linux系统中 我在编译内核方面没有太多经验 但如果有必要 我会这样做 您能说出这样做的步骤
  • 在 Linux (libusb-1.0) 上访问 USB 设备?

    我正在编写一个小程序 使用 Linux 上的 libusb 1 0 与特定 USB HID 产品 由供应商和产品 ID 标识 进行通信 现在 我必须以 root 身份运行该程序 因为 libusb 需要对 USB 设备节点的写访问权限 有没
  • USB 端口速度 Linux [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何以编程方式确定运行 Linux 内核的嵌入式设备中的 USB 端口速度 你可以阅读 sys bus usb devices usb s
  • Linux 源代码中的哪个位置会识别特定的 USB 设备?

    我有一个特定的 USB 设备 我想检查其 Linux 驱动程序源代码 我的理解是 USB 驱动程序执行的第一步是注册自己能够处理具有特定供应商 ID 和产品 ID 的设备 就我而言 供应商 ID 是0BDA产品 ID 是8187 有了这些信
  • 使用 iTextSharp 5.3.3 和 USB 令牌签署 PDF

    我是 iTextSharp 和 StackOverFlow 的新手 我正在尝试使用外部 USB 令牌在 C 中签署 PDF 我尝试使用从互联网上挖掘的以下代码 Org BouncyCastle X509 X509CertificatePar
  • USB编程

    我想对微控制器 AVR 进行编程 以通过 USB 控制一些 LED 它只是出于对如何构建和编程 USB 设备的兴趣 有一些 AVR 微控制器支持 USB 协议 或者我可以自己在另一个微控制器中实现 USB 协议 但我想知道用什么来在计算机上
  • 作为附件的 Android 设备

    我有 2 个 Android 设备 我想用 USB OTG 电缆连接它们 并在两个设备之间进行来回通信 据我了解 一台 Android 设备将充当 USB 主机 运行 4 4 的 Nexus 7 另一台 Android 设备将充当 USB
  • 如何在 C# 中知道 PID 和 VID 来发现虚拟 COM 端口名称

    如果我知道 PID 和 VID 我会尝试找到查找 COM 端口名称的正确方法 到目前为止 我写了解决方法 但我不相信没有更优雅和正确的方法 顺便说一句 我知道我可以使用 REGEX 编写此代码只是为了测试解决方法 我知道还有很大的改进空间
  • 通过 USB 将原始文本发送到打印机

    我正在尝试将 ZPL 命令发送到 Zebra ZT230 打印机 打印机和驱动程序已安装 打印机端口为 USB003 PC 通过 Zebra 打印机设置实用程序或 ZebraDesign 与打印机完美通信 我尝试了以下代码 Private

随机推荐

  • luffy-16/订单表设计,立即付款接口/前端,支付成功get回调用户展示,支付成功post回调修改订单状态

    这里写目录标题 一 昨日回顾二 今日内容1 订单表设计2 立即付款接口 一堆校验 登录后 2 1视图类2 2序列化类2 3自定义异常类2 4配置文件2 5路由 3 立即付款前端4 支付成功get回调用户展示4 1luffycity src
  • luffy-17/上线

    这里写目录标题 一 上节回顾二 今日内容1 购买阿里云服务器2 服务器配置 软件安装2 1更新系统软件包2 2安装mysql2 3安装redis2 4安装python3 62 5配置pip源 xff1a 阿里云不用配置 xff0c 默认配置
  • bs4遍历文档树,搜素文档树,find_all参数,selenium,模拟登陆百度

    这里写目录标题 一 昨日回顾二 今日内容1 bs4遍历文档树2 bs4的搜索文档树3 find all的其他参数4 css选择器5 selenium的介绍6 selenium的使用7 模拟登陆百度8 selenium的其他使用 一 昨日回顾
  • xpath的使用,selenium爬取京东商品信息,scrapy介绍,安装及使用

    这里写目录标题 一 xpath的使用二 selenium爬取京东商品信息三 scrapy的架构3 1scrapy的架构3 2目录介绍 四 scrapy的简单使用 一 xpath的使用 span class token number 1 sp
  • go语言值变量命名规范,定义变量,数据类型,常量,函数基础,函数高级

    这里写目录标题 一 昨日回顾二 今日内容1 变量命名规范2 变量代码演示 3 类型代码演示 4 常量5 函数基础6 函数高级 一 昨日回顾 span class token number 1 span redis高级 span class
  • 串口接收一帧数据及解析

    3 xff0e 下位机中的数据接收和协议解析 下位机接收数据也有两种方式 xff0c 一 等待接收 xff0c 处理器一直查询串口状态 xff0c 来判断是否接收到数据 二 中断接收 两种方法的优缺点在此前的一篇关于串口通信的文章中详细讨论
  • <string>库常用的函数

    include lt string h gt 库包含字符串处理函数 xff0c 常用的有strcpy strcat strcmp strchr等 1 strcpy是字符串赋值函数 char strcpy char target char s
  • APM(Ardupilot)——电机输出流程图

    电机类声明 xff1a system cpp void Copter allocate motors void switch AP Motors motor frame class g2 frame class get if FRAME C
  • C++中的三个特殊宏:__FILE__,__FUNCTION__和__LINE__

    C 43 43 中的三个特殊宏 xff1a FILE xff0c FUNCTION 和 LINE 1 FILE 宏 FILE 宏用于检查当前文件名 xff0c 例如 xff1a include lt cstdio gt using name
  • GD32F10x外部晶振配置108MHz系统时钟

    嵌入式 GD32F10x外部晶振配置108MHz系统时钟 文章目录 嵌入式 GD32F10x外部晶振配置108MHz系统时钟前言一 时钟树与配置思路二 时钟配置过程三 晶振故障排查总结 前言 由于公司更改硬件设计选择使用新的型号兆易创新国产
  • Keil MDK C (error: #29: expected an expression) 错误的解决

    今天 xff0c 自己建了一个EFM32工程模版 xff0c 调试代码时显示 App Panel main c 119 error 29 expected an expression 仔细的检查了半个小时 xff0c 最后解决了 xff01
  • HTTP协议之报文详解

    学习WEB开发需要对HTTP协议熟悉 xff0c 下面直接进入主题 一 什么是报文 报文 xff0c 是网络中交换和传输的数据单元 xff0c 即站点一次性要发送的数据块 报文包含了将要发送的完整的数据信息 xff0c 其长短很不一致 xf
  • linux发送tcp/udp请求

    本文章介绍下通过nc工具 iperf工具和python脚本 xff0c 实现发送tcp udp请求 一 nc工具 xff08 netcat工具 xff09 这个工具linux系统默认是自带的 xff0c 以下是命令的常用参数 1 1 发送t
  • 第一次网页前端培训笔记(HBuilderX)

    一 安装HBuilderX 官网 xff1a HBuilderX 高效极客技巧 dcloud io 二 了解HBuilderX lt DOCTYPE html gt lt html gt lt head gt lt meta charset
  • 第二次网页前端培训笔记(HBuilderX)

    常用标签 一 表单 form标签 xff1a 表单标签 xff0c 块级元素 xff0c 会自动换行 xff1b 将数据传输给服务器 常用属性 xff1a action 表单提交的地址url id 唯一标识 name 名称 target 表
  • 前端第7次培训

    对象 一对象的创建 1 字面量形式创建对象 var对象名 61 xff1b var对象名 61 键 xff1a 值 2 通过new Object创建 var对象名 61 new Object xff08 xff09 3 通过Object对象
  • MPU6050的再次深度学习与实操遇到问题

    数据的处理与实现 xff1a MPU6050芯片提供的数据夹杂有较严重的噪音 xff0c 在芯片处理静止状态时数据摆动都可能超过2 除了噪音 xff0c 各项数据还会有偏移的现象 xff0c 也就是说数据并不是围绕静止工作点摆动 xff0c
  • moderlarts第一次作业

    一 物体检测模型 以口罩检测为例 1 下载OBS 2 打开华为云 xff0c 找到modelarts控制台 xff0c 鼠标移到用户名上 xff0c 点击我的凭证 3 点击访问密钥 gt 新增访问密钥 xff0c 下载 xff0c 然后登陆
  • 培训modelarts 二

    一 进行声音分类 1 下载数据包 xff0c 导入OBS 2 创建声音分类项目 3 标签分类 4 开始训练 5 部署模型 6 预测结果 二 AI gallery 1 下载数据集 2 创建数据集 xff0c 导入外卖评论 3 进行创建文本分类
  • Jetson Xavier NX 配置(七)—— 数据传输之socket文件传输 & usb摄像头RTSP视频推流

    目录 1 Python socket 文件传输 xff08 1 xff09 发送单个文件 xff08 一次性 xff09 xff08 2 xff09 发送一个文件夹下的所有文件 xff08 一次性 xff09 xff08 3 xff09 发