【本地网页控制远程开发板】使用Python的Paramiko库通过SSH连接开发板进行通信

news2024/11/24 13:02:51

最近想要在本地用flask框架创建网页,在网页端与远程开发板进行交互,里面有一项需求就是当我点击网页端的按钮时,开发板会执行相应的脚本文件进行预警。以下演示如何使用Python的Paramiko库来通过SSH连接开发板实现上述功能。

主要的代码思路如下:

@app.route('/remote_reminder', methods=['POST'])
def remote_reminder():
    """通过SSH执行远程脚本"""
    try:
        # 创建SSH客户端实例
        ssh = paramiko.SSHClient()
        
        # 设置SSH客户端的主机密钥策略为AutoAddPolicy,即自动添加新主机的密钥到本地的HostKeys对象中
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        
        # 使用提供的远程主机地址、用户名和密码进行SSH连接
        ssh.connect(REMOTE_HOST, username=REMOTE_USER, password=REMOTE_PASSWORD)

        # 通过SSH在远程主机上执行脚本 'sh /home/set_led.sh &'
        # '&' 表示在后台运行脚本,避免阻塞
        stdin, stdout, stderr = ssh.exec_command('sh /home/set_led.sh &')
        
        # 读取执行命令的标准输出,并将其解码为字符串
        output = stdout.read().decode()
        
        # 读取执行命令的错误输出,并将其解码为字符串
        error = stderr.read().decode()

        # 关闭SSH连接
        ssh.close()

        # 如果有错误信息,将错误信息返回并设置HTTP状态码为500
        if error:
            return jsonify({"status": "error", "message": error}), 500
        
        # 如果没有错误信息,将执行结果返回并设置HTTP状态码为200
        return jsonify({"status": "success", "message": output})
    
    except Exception as e:
        # 捕获所有异常,并返回错误信息,HTTP状态码为500
        return jsonify({"status": "error", "message": str(e)}), 500

这里我们通过SSH连接开发板,提起那需要设置好端口用户名和密码

REMOTE_HOST = '192.168.43.101'  # 开发板的IP地址
REMOTE_USER = 'root'  # SSH登录用户名
REMOTE_PASSWORD = '123456'  # SSH登录密码

然后再在index.html文件中将点击事件和按钮进行关联

document.getElementById('reminderBtn').addEventListener('click', function() {
            fetch('{{ url_for("remote_reminder") }}', { method: 'POST' })
                .then(response => response.json())
                .then(data => {
                    alert("远程提醒已发送!");
                });
        });

在以上的例子中,flask是服务器端,而本地网页浏览器和远程开发板都是客户端,当点击网页时浏览器向flask服务器发送http请求,此时flask服务器接受请求,并向另一个客户端——远程开发板发送指令。

因为之前尝试过实时传输视频的通信,当时使用的是websocket通信,这次使用的是http通信,下面对这两种网络通信方式进行总结区分:

(1)通信模式

HTTP是请求——响应的单向通信,客户端(如浏览器)发送一个请求到服务器,服务器处理请求并返回响应。

WebSocket是全双工的通信。客户端和服务端可以同时收发数据。

(2)连接方式

HTTP是短连接的,每次请求后都会断开

WebSocket是长连接的,一旦连接成功,将保持开放,允许持续的双向通信

(3)协议层

HTTP是应用层协议,建立在TCP之上,使用TCP作为传输层协议

WebSocket是传输层协议。在初次连接时,WebSocket通过HTTP协议进行握手,一旦握手之后,切换到WebSocket协议。

(4)数据传输效率

HTTP每次请求都要附带完整的HTTP头信息,增加通信的开销。

WebSocket握手成功后会切换到WebSocket协议。后续的通信只需要传输数据帧,而不需要HTTP头信息。

(5)应用场景

HTTP适用于web浏览器和web服务器的交互

WebSocket适用于实时更新和双向通信的应用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2063933.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SSL/TLS协议信息泄露漏洞修复

概述:CVE-2016-2183 是一个涉及 SSL/TLS 协议信息泄露的漏洞,也被称为 "SWEET32" 攻击。该漏洞利用了某些对称加密算法(如 3DES)的弱点,攻击者可以通过捕获和分析大量的加密流量,可能会恢复明文数…

MySQL 配置免密码登陆(mysql_config_editor Configuration)

当使用mysql, mysqldump, mysqladmin等客户端连接MySQL数据库服务器时,需要提供用户凭证信息。你可以在每次连接时都输入连接信息(用户名/密码/地址/端口等)或者将用户信息保存在my.cnf配置文件的[client]模块。 第一种方式每次都输入用户密…

JWT 基础知识

目录 什么是JWT JWT 的原理 JWT 的数据结构 Header Payload Signature 参考链接 什么是JWT Json Web Token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准(RFC 7519。 该token被设计为紧凑且安全的,特别适用于分布式站…

gsap动画库入门

目录 前言 一、基本用法 (一) 安装 (二) 语法 (三) 简单动画 二、配置 (一) 动画方法 1. to 2. from 3. fromTo 4. set (二) 动画目标 (三) 动画属性 前言 官网:https://gsap.com/ 中文文档:GSAP 中文教程 中文文档 |官方文档 …

JAVA基础知识总结(上)(初识Java)

JDK的下载与环境变量的配置 JDK的下载 首先在官网找到JDK,然后根据电脑配置选择x64或者x32,然后一直next就可以了,不过重要的一点是记住存放的路径,因为后续环境配置需要复制这个路径。 为什么要配置环境变量 第一:JAVA_HOME环…

Vue | Vue 中的 refInForde 用法

refInFor:如果你在渲染函数中给多个元素都应用了相同的 ref 名,那么 $refs.myRef 会变成一个数组。 vue中的refInFor属性是Vue框架中用于在循环渲染的元素上设置引用的一种方式。‌ 在Vue中,‌ref属性通常用于给元素或子组件注册引用信息&am…

vue打包设置 自定义的NODE_ENV

默认NODE_ENV 自定义process.env.NODE_ENV的值_process.node.env的值-CSDN博客 ‌NODE_ENV开发环境下:NODE_ENVdevelopment(默认) 生产环境下:NODE_ENVproduction(默认) NODE_ENV 除了默认的 development 和 production 以外,确实可以自定义…

一款轻量级的Docker日志查看器!!【送源码】

今天给大家分享一款Docker日志查看神器。 背景 作为一名攻城狮,相信大家对Docker并不陌生,特别是现在盛行微服务时代,容器应用技术可谓是满天飞,Docker的好处和便捷就不多说了。 如今管你项目多大,先来个容器部署&a…

在Kubernetes中通过 pod 打开 pod所在宿主机上的shell

昨日一伙计突然问我 在么把自己打好的 docker镜像 上传到 kubernetes 的 节点的 local 镜像池。 现状大约如下: 1)只有master节点的登录权限; 2)不知道存在哪些worker节点也无法通过 master 借助SSH 登录到 worker节点 &#x…

算法的学习笔记—二叉搜索树的后序遍历序列(牛客JZ33)

😀前言 在数据结构与算法的学习中,二叉搜索树(BST)是一个重要的概念,而后序遍历则是树的遍历方式之一。今天,我们将深入探讨一个经典问题:如何判断一个给定的整数数组是否是某个二叉搜索树的后序…

水利详细数据

有网友问水利数据的情况,前两天忙,没回应!现在我将号内数据总结了一下,发给大家看看!可以获取数据不限于以下,其它数据也可以根据需要转出和制作! 数据详细情况: 下面是关于水系方面的数据效果…

黑神话·悟空爆火,有哪些AI技术在助力?

北京时间8月20日上午10点,沉淀了4年的首款国产“3A”游戏《黑神话悟空》正式在各大游戏交易平台上线,迄今为止售出预计450万份。 昨天,各大社媒平台的热搜榜前列几乎都被「黑神话」相关词条霸占,并久居不下,大众的社交…

linux容器基础-namespace-2(net)

net namespace network namespace用来隔离网络环境,在network namespace中,网络设备、端口、套接字、网络协议栈、路由表、防火墙规则等都是独立的。 因为network namespace中具有独立的网络协议栈,因此每个network namespace中都有一个lo接…

向量数据库中的PQ(Procduct Quantization)

为了加快向量之间距离计算和比较速度,有人发明的Product Quantization方法,这个方法并不是一种索引,所以它并不能减少目标向量(要查找的向量),与数据库中向量的比较次数,但是它可以加快与每个数…

黑神话孙悟空:自媒体小白的流量密码!

当下,黑神话孙悟空的热度如熊熊烈火,席卷了整个游戏世界。 只要与这个话题沾边,似乎就能轻松吸引大量关注。 那么,对于不怎么懂自媒体运营的小伙伴来说,该如何抓住这个机遇呢? 别担心,我们用以…

IO进程线程8月22日

1&#xff0c;思维导图 2&#xff0c;使用read和write实现文件拷贝 #include<myhead.h> int main(int argc, const char *argv[]) {int fp1,fp2;char a[1];fp1open("./1.txt",O_RDONLY);fp2open("./2.txt",O_CREAT|O_TRUNC|O_WRONLY,0664);if(fp1-…

简过网:博士考公务员有什么优势?还需要笔试吗?

博士生考公务员需要面试吗&#xff1f;这要看具体情况&#xff0c;一般来讲&#xff0c;公务员考试分为国考、省考和单招&#xff01; 很多公务员单招的一般可以免笔试&#xff0c;但是需要面试&#xff0c;但是对于国考和省考和统考来讲&#xff0c;博士是不能免笔试的&#…

hive4.0.0部署以及与MySQL8.4连接

在开始之前&#xff0c;需要在主机上准备好MySQL数据库&#xff0c;并且已经完成了hdfs和yarn的部署 步骤1&#xff1a;MySQL的配置 以root用户登录mysql后执行以下命令&#xff1a; grant all privileges on *.* to root% with grant option; flush privileges; 这样我们就…

解码极氪汽车的短期成效与长期定力

近日&#xff0c;极氪汽车&#xff08;NYSE&#xff1a;ZK&#xff0c;下同“极氪”&#xff09;公布了截止2024年第二季度的业绩公告。 不难发现&#xff0c;极氪汽车实现了交付数量与经营业绩的双螺旋增长&#xff0c;稳居新能源自主品牌第一梯队。不仅如此&#xff0c;极氪…

JavaEE从入门到起飞(九) ~Activiti 工作流

工作流 当一道流程逻辑需要用到多个表单的提交和多个角色的审核共同完成的时候&#xff0c;就可以使用工作流。 工作流一般使用的是第三方技术&#xff0c;也就是说别人帮你创建数据库表和service层、mapper层&#xff0c;你只需要注入工具接口即可使用。 原理&#xff1a;一…