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视频推流 的相关文章

  • SWT:获取系统设备更改的通知(USB 设备连接/断开)

    我正在编写一个 SWT 应用程序 该应用程序需要位于系统托盘中 并在用户连接某些 USB 设备时自动弹出 该应用程序用作其控制面板 在本机环境 在本例中为 win32 但我最终应该与平台无关 中执行此操作的方法是侦听 WM DEVICECH
  • Win7/8 上从 CD 或 USB 自动运行程序

    我在一家 IT 商店工作 发现一些计算机带有相当严重的病毒 我们正在编写一个自动运行脚本 当我们插入 USB 或 CD 最好是 USB 时 该脚本将运行恶意软件查杀工具 RKill 我们希望在插入 USB 或 CD 后立即运行该工具 而不会
  • 三星 Android 手机从另一台设备上出现 USB 问题

    早上好 我有一部三星 Android 手机 我通过 USB 电缆将其连接到另一台设备 不是电脑 对于这种情况 我在 android 中启用了 USB 调试和开发人员模式 如果我使用另一台 Android 手机 它工作正常 另一台设备正在闪烁
  • 检测 Android 上的 USB 网络共享

    有没有什么方法可以 以编程方式 在您的活动 应用程序中知道用户已在其手机上启用 USB 网络共享 您还可以使用反射来访问用于设置 USB 网络共享的隐藏功能 这是我的代码 ConnectivityManager cm Connectivit
  • 如何检测Android平板电脑中充当USB Host的USB设备?

    我尝试在代码的帮助下开发一个示例应用程序开发者 android com http developer android com guide topics connectivity usb host html 我的代码看起来像这样 public
  • USB 控制传输能否保证交付?

    USB 2 0 指定 http www usb org developers docs usb20 docs 4 种传输类型 第 5 4 节传输类型 控制转移 同步传输 中断传输 批量转账 第 5 8 节规定批量转账提供 在带宽可用的基础上
  • 在 Mac OSX 下检测连接的 USB 设备

    首先声明 对于 Mac 编程 我是一个新手 然而 我有一项任务需要与设备进行 USB 通信 所以我想我将从基本的东西开始 我从here https developer apple com library mac samplecode USB
  • 关闭 USB 端口的电源

    我正在寻找扭转的方法power关闭 然后重新打开 USB 端口 解决方案可以是 C bash 等 我使用运行 32 位 Ubuntu 16 04 的 BeagleBone for armhf gt uname srvm Linux 4 4
  • 如何检查 Android 上是否启用 USB 连接模式?

    我在 Android 市场上有一个应用程序 用户经常将他们的设备连接到计算机以将音乐添加到应用程序文件夹中 我在说明中特别指出 当启用 USB 连接模式时 Android 应用程序无法与 SD 卡通信 显然这还不够愚蠢的证据 有没有办法在j
  • 在c#中读取PVOID,我应该读取多少位?

    我正在读取 URB 类型的 USB 数据包 URB 标头定义于http msdn microsoft com en us library windows hardware ff540409 v vs 85 aspx http msdn mi
  • Java Android 激光条码扫描器

    我正在尝试开发一个能够读取条形码 1d 而不是 qr 的应用程序 真正的问题是 常见的条形码阅读器软件非常有用 但它们似乎太慢 无法作为非常频繁和常见的功能使用 这些条形码相当长 有 20 30 位数字 对于 zxing 等应用程序来说似乎
  • 通过 USB 模拟 UART

    有谁知道是否可以通过 USB 模拟 UART 简单串行发送和接收 这将如何实现 我在 Microchip 网站上找到了这个链接 但不是很容易找到 http www microchip com forums m522571 print asp
  • python的跨平台usb模块?

    我有兴趣在 python 中使用 USB 设备进行一些跨平台工作 关于可以执行此类操作的模块有任何提示或建议吗 我浏览了 SF 和 googlecode 但运气不佳 thanks ct PyUSB http pyusb berlios de
  • 使用 python 检测 Windows 10 上的 USB 设备插入

    我无法获取以下代码检测USB设备插入 http timgolden me uk python win32 how do i detect device insertion html在我的 Windows 10 64 位 计算机上使用 Pyt
  • Android 上的 HP TouchPad USB 驱动

    我可以在运行的 HP TouchPad 上进行应用程序开发吗氰基模组 http en wikipedia org wiki CyanogenMod 9 我有一个安装了 CyanogenMod 9 的 HP TouchPad 并且正在尝试从E
  • Android:与充当主机的 USB 设备通信

    我们制作了一个可以充当 USB 主机或从机并处理其接收到的数据的设备 我想使用Android手机通过USB向其发送数据 我的研究使我得出结论 如果不修改硬件或操作系统 我们就无法在 USB 主机模式下使用 Android 设备 这样做不是一
  • WriteFile 返回错误代码 87

    我正在开发一个写入 HID 设备的程序 但收到错误 87 WriteFile 函数参数无效 我从 Jan Axelson 的 USB Complete 获得了这些功能 所以我不确定为什么会收到错误 我用它来查找我的设备 private vo
  • 在 Python 中将 USB 视频捕获设备友好名称与 OpenCV 端口号相关联

    我想在 Windows 平台上使用 Python 获取外部 USB 视频捕获设备的友好名称和 USB 端口号 我正在使用 OpenCV 从 USB 捕获设备捕获视频 OpenCV 将 USB 端口称为 1 找到的第一个工作摄像头 0 对我来
  • 适用于 Android 的 USB 主机

    I am trying to communicate with my freeduino board which is similar to arduino uno via usb through android device nexus
  • USBInterfaceOpen总是报kIOReturnExclusiveAccess错误

    最近我遇到了这个问题 很头疼 我已经在这个问题上花了一个星期了 但仍然失败 希望您能帮我把这块石头踢开 非常感谢 我的问题 我们公司为iPhone生产USB存储设备 实际上这个存储设备中有一个SDCard 现在 我们想要开发一个 Mac 应

随机推荐

  • 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 发