当前位置: 首页 > news >正文

Python自动化运维实战——Telnetlib和Netmiko自动化管理网络设备

❤️博客主页 iknow181
🔥系列专栏 PythonJavaSEJavaWebCCNP
🎉欢迎大家点赞👍收藏⭐评论✍


在这里插入图片描述

目录

一、前言

二、准备工作

三、Telnetlib

Telnetlib介绍

Telnetlib模块及操作方法介绍

Telnetlib配置设备

Telnetlib批量化部署多台设备

Telnetlib抓取设备配置

四、Netmiko

Netmiko介绍

Netmiko登陆设备并配置

Netmiko配置设备

Netmiko以文件方式配置设备

Netmiko抓取设备配置

Netmiko抓取设备配置并写入文件中

Netmiko批量化部署多台设备

Netmiko批量化抓取设备配置


一、前言

本期小i为大家带来了关于Python自动化运维的技术——利用Python进行网络设备的自动化管理。话不多说,直接上干货!


二、准备工作

在开始之前先做好准备工作,我用的是VMware这款虚拟机和EVE模拟器结合来模拟本次所需要的网络设备,没有VMware和EVE的小伙伴可以参考这两篇文章进行安装。

EVE模拟器的使用-带图超详细(学网络用)_eve虚拟机-CSDN博客

安装虚拟机(VMware)保姆级教程(附安装包)_vmware虚拟机-CSDN博客

先打开VMware,注意两个网络适配器中必须有一个是VMnet1,

确定好之后,点击继续运行此虚拟机。

然后打开EVE,新建一个实验,拖三台路由器,最好用vIOS

再添加一个Network,右击鼠标,点Network选项,

类型选Cloud0

将四台设备连线后开机,如下图。

然后为三台路由器配置ip地址,Net不用配,
注意:这里的ip地址是有讲究的,前24网络位为必须和你的虚拟机的IP网络一致(这就是为什么前面必须用VMnet1),后8位主机位随意,只要不是0,1,2等特殊地址就行,这里我选用188,189,190作为主机位。不清楚你的虚拟机网络地址的可以看EVE的网址。

vIOS1: 

enable
configure terminal
hostname R1
interface G0/0
ip address 192.168.254.188 255.255.255.0
no shutdown

vIOS2:

en
conf t
host R3
int G0/0
ip add 192.168.254.189 255.255.255.0
no sh

vIOS3:

en
conf t
host R3
int G0/0
ip add 192.168.254.190 255.255.255.0
no sh

配完后可以用本机ping一下这些设备,看能不能通。 

按win + R,输入cmd,进入命令行窗口,输入 ping 192.168.254.188

 

最后为设备配置telent和ssh,因为Telnetlib和Netmiko分别基于telent和ssh实现连接的。

下面我就以一台设备为例做配置。

telent

en
conf t
username admin privilege 15 password admin
line vty 0 4
tran in telnet
login local

ssh

en
conf t
ip domain-name cisco.com
crypto key generate rsa modulus 1024
line vty 0 4
transport input ssh

另外还需在PyCharm中导入TelnetlibNetmiko库,

Telnetlib直接导入就可以,

import telnetlib

Netmiko则需要先下载软件包,打开文件(file)中的设置(setting),找到项目:Project下的Python解释器,点击加号

在输入框中输入Netmiko,点击第一个选项netmiko,安装软件包即可。

注意:下载时必须保证一个好的网速,不然会非常慢且容易断开下载从而下载失败。

自此我们的准备工作就全部完成了,下面开始上代码!!!

三、Telnetlib

Telnetlib介绍
Telnetlib模块是Python提供的可用于Telnet连接使用的模块,值得注意的是,在现有的生产环境中,Telnet协议连接已经使用的较为少见了(原因也非常简单,Telnet协议是明文传输的协议,所以在数据传输,尤其是在公网上传输的时候极其不安全)。
​
且telnetlib已逐渐弃用,并计划在Python 3.13 版本中删除

Telnetlib模块及操作方法介绍
1. Telnet(host=None, port=0, timeout=None):Telnet类的构造函数,用于创建一个Telnet对象。参数host是远程主机的地址,port是远程主机的端口号,timeout是连接超时时间。
​
2. open(host, port=23, timeout=None):打开一个Telnet连接。参数host和port与Telnet构造函数中的相同。
​
3. read_until(expected, timeout=None):读取输入直到遇到预期的字符串。参数expected是预期的字符串,timeout是读取超时时间。
​
4. read_very_eager():读取输入缓冲区中的所有数据,不会阻塞。
​
5. write(data):向远程主机发送数据。参数data是要发送的数据。
​
6. close():关闭Telnet连接。
​
7. set_debuglevel(level):设置调试级别,用于输出调试信息。
​
8. set_option_negotiation_callback(callback):设置选项协商回调函数。
​
9. expect(list, timeout=None):等待预期的字符串出现,返回匹配的字符串。参数list是一个字符串列表,每个字符串表示一个预期的字符串,timeout是等待超时时间。
​
10. expect_regexp(list, timeout=None):等待预期的正则表达式出现,返回匹配的字符串。参数list是一个正则表达式列表,每个正则表达式表示一个预期的字符串,timeout是等待超时时间。
​
11. set_echo(option):设置是否回显输入。
​
12. set_timeout(timeout):设置读取超时时间。
​
13. set_option_negotiation_callback(callback):设置选项协商回调函数。
​
14. set_option_negotiation_callback(callback):设置选项协商回调函数。
Telnetlib配置设备
import telnetlib
​
host = '192.168.2541.188'  # 要远程管理的主机,确保IP可达,telnet服务打开
username = 'admin'  # telnet的用户名
password = 'admin'  # telnet的密码
​
tn = telnetlib.Telnet(host)  # 调用telnetlib的Telnet(),赋值给tn
tn.read_until(b"Username:")  # b表示等待期望的字符出现
tn.write(username.encode("ascii") + b"\n")  # 通过tn.write()的方式输入用户名,b/n表示回车
tn.read_until(b"Password:")   # b表示等待期望的字符出现
tn.write(password.encode("ascii") + b"\n")  # 通过tn.write()的方式输入密码,b/n表示回车
​
# 通过write函数输入配置命令
tn.write(b"enable\n")
tn.write(b"configure terminal\n")
tn.write(b"username CCIE password CCIE\n")
tn.write(b"end\n")
tn.write(b"wr\n")
tn.write(b"exit\n")
​
print(tn.read_all().decode("ascii"))  # 通过read_all()方法记录配置命令的过程
并且可以在EVE中看到相应的日志信息,代表192.168.254.1这个用户连接了此设备。​# 优化部分:通过函数调用的形式
import telnetlib
​
​
def run_telnet(host, username, password):# 通过Telnet登录网络设备tn = telnetlib.Telnet(host, port=23, timeout=10)
​# 输入用户名tn.read_until(b"Username:")tn.write(username.encode("ascii") + b"\n")
​# 输入密码tn.read_until(b"Password:")tn.write(password.encode("ascii") + b"\n")
​# 登录完成后执行命令tn.write(b"enable\n")tn.write(b"configure terminal\n")tn.write(b"username CCIECLUB privilege 15 password CCIECLUB\n")tn.write(b"end\n")tn.write(b"exit\n")tn.write(b"wr\n")
​print(tn.read_all().decode("ascii"))
​
​
run_telnet('192.168.254.188', "admin", "admin")
run_telnet('192.168.254.189', "admin", "admin")
run_telnet('192.168.254.190', "admin", "admin")
Telnetlib批量化部署多台设备
import telnetlib
​
​
def run_telnet(host, username, password, commands):# 通过Telnet登录网络设备tn = telnetlib.Telnet(host, port=23, timeout=10)tn.set_debuglevel(1)
​# 输入用户名tn.read_until(b"Username:")tn.write(username.encode("ascii") + b"\n")
​# 输入密码tn.read_until(b"Password:")tn.write(password.encode("ascii") + b"\n")
​# 登录完成后执行命令for command in commands:tn.write(command.encode("ascii") + b"\n")
​print(tn.read_all().decode("ascii"))tn.close()
​
​
commands = ['enable', 'configure terminal', 'username CCIE password CCIE', 'end', 'exit']
run_telnet('192.168.254.220', "admin", "admin", commands)
run_telnet('192.168.254.221', "admin", "admin", commands)
run_telnet('192.168.254.222', "admin", "admin", commands)
Telnetlib抓取设备配置

堪称写实验报告神器,一键导出配置到一个txt文档,告别手动一个一个的show,display。

import telnetlib
import time
​
​
def run_telnet(host, username, password):# 通过Telnet登录网络设备tn = telnetlib.Telnet(host, port=23, timeout=10)
​# 输入用户名tn.read_until(b"Username:")tn.write(username.encode("ascii") + b"\n")
​# 输入密码tn.read_until(b"Password:")tn.write(password.encode("ascii") + b"\n")
​# 登录完成后执行命令tn.write(b"enable\n")tn.write(b"terminal length 0\n") # 取消分段显示time.sleep(1)tn.write(b"show running-config\n")time.sleep(5)
​out = tn.read_very_eager().decode("ascii")print(out)
​file = open(file="E:\\1.txt", mode='a')file.write(out)file.close()
​tn.close()
​
​
run_telnet('192.168.254.188', "admin", "admin")
run_telnet('192.168.254.189', "admin", "admin")
run_telnet('192.168.254.190', "admin", "admin")

这边结果太长了我就不贴出来了。

四、Netmiko

Netmiko介绍
Netmiko是一款Python库,被广泛用于自动化网络设备管理任务。作为一个重要的开源库,它通过简化与网络设备的TCP连接,实现了快速执行相关任务的能力。Netmiko基于Paramiko库的基础架构,支持绝大多数的网络设备,包括Cisco, Juniper, Arista等。它提供了连接网络设备并执行特定任务的接口,例如SSH, Telnet以及串口这些网络协议的相关处理。
​
Netmiko在 Github 上是开源的,它的源代码可以在 GitHub 网站上进行获取和修改。Netmiko 项目的 GitHub 地址为:https://github.com/ktbyers/netmiko
Netmiko登陆设备并配置
from netmiko import ConnectHandler    # 导入函数,通过该函数实现SSH登录网络设备
​
# 创建字典,Netmiko支持多厂商,Arista、Cisco、HP、Juniper、Huawei、Extreme等主流厂商
# 同时,Netmiko支持不同平台的网络设备,如Cisco的IOS、Cisco IOS-XE、Cisco ASA、Cisco NX-OS
​
​
R1 = {"device_type": "cisco_ios",    # 由于不同厂商的设备在登陆后命令行特性不一致,需要通过"device_type"来指定登陆设备的类型"ip": "192.168.254.188",    # 远端主机IP"username": "admin",     # SSH登录到远端主机使用的用户名"password": "admin"    # SSH登录到远端主机使用的密码
}
​
with ConnectHandler(**R1) as connect:print("Successfully connected to" + " " + R1["ip"])    # 打印连接成功result = connect.send_command("show ip int b")    # send command()只支持向设备发送一条命令,一般来说是show/display类的查询命令,用于查看设备的某些信息。当此命令发出后,该函数会一直等待,直到收到设备完整的回显内容为止。如果在一定时间内依然没有读到完整的回显内容,Netmiko则会返回一个OSErrorprint(result)
Netmiko配置设备
from netmiko import ConnectHandler
​
R1 = {"device_type": "cisco_ios","ip": "192.168.2541.188","username": "admin","password": "admin"
}
with ConnectHandler(**R1) as connect:print("Successfully connected to" + R1["ip"])commands = ['interface g0/0', "description This is a physical interface"]result = connect.send_config_set(commands)print(commands)
​
# send_config_set():用于向设备发送一条或多条配置命令,此处一定是配置命令,因为send_config_set()本身会自动加上configure terminal命令进入配置模式(在结束的时候也会自动加上end),因此,如果要在此时使用show等查看命令,需要在前面加上do(如: do show ip interface brief),否则会无效。
# send_config_set()一般搭配列表来使用
​
from netmiko import ConnectHandler
​
R1 = {"device_type": "cisco_ios","ip": "192.168.254.188","username": "admin","password": "admin"
}
with ConnectHandler(**R1) as connect:print("Successfully connected to " + R1["ip"])commands = ['do sh ip int b']result = connect.send_config_set(commands)print(result)
Netmiko以文件方式配置设备

首先在当前目录下(使用的相对路径)创建一个txt文本——Lab,在里面写入需要执行的命令。

do show ip int b

from netmiko import ConnectHandlerR1 = {"device_type": "cisco_ios","ip": "192.168.254.188","username": "admin","password": "admin"
}
with ConnectHandler(**R1) as connect:print("Successfully connected to " + R1["ip"])File_configure = connect.send_config_from_file("Lab.txt")     # 相对路径print(File_configure)# connect.send_config_from_file():在配置命令数量较多的时候,将所有配置命令都填入列表中会显得列表很臃肿,因为代码过长,所以导致可读性变差、还会有可能出现设备超时的情况。所以我们可以先把所有的配置命令写入一个配置文件中,然后使用send_config_from_file()去读取该文件的内容帮助我们完成配置。# 和send_config_set()一样,send_config_from_file()也会自动的去添加"configure terminal"和 "end"命令,所以直接写要配置的命令就可以
Netmiko抓取设备配置
from netmiko import ConnectHandler
​
R1 = {"device_type": "cisco_ios","ip": "192.168.254.188","username": "admin","password": "admin"
}
with ConnectHandler(**R1) as connect:print("Successfully connected to " + R1["ip"])running_config = connect.send_command("show running-config")print(running_config)
Netmiko抓取设备配置并写入文件中
from netmiko import ConnectHandler
​
R1 = {"device_type": "cisco_ios","ip": "192.168.254.188","username": "admin","password": "admin"
}
with ConnectHandler(**R1) as connect:print("Successfully connected to " + R1["ip"])running_config = connect.send_command("show running-config")print(running_config)
​file = open(file="R1_config.txt", mode="a")    # 以写的方式打开文件file.write(running_config)file.close()
Netmiko批量化部署多台设备
from netmiko import ConnectHandler
​
host = {"192.168.254.188","192.168.254.189","192.168.254.190",
}
​
for ip in host:Router = {"device_type": "cisco_ios","ip": ip,"username": "admin","password": "admin"}with ConnectHandler(**Router) as connect:print("Successfully connected to " + Router["ip"])command = ["username abc password abc"]run_command = connect.send_config_set(command)print(run_command)
Netmiko批量化抓取设备配置
在lab.txt文本中写入需要抓取的目标设备IP
192.168.254.188
192.168.254.189
192.168.254.19
from netmiko import ConnectHandler
​
f = open("Lab.txt", mode='r')
for ips in f.readlines():ip = ips.strip()Router = {"device_type": "cisco_ios","ip": ip,"username": "admin","password": "admin"}with ConnectHandler(**Router) as connect:print("Successfully connected to " + Router["ip"])running_config = connect.send_command("show running-config")print(running_config)
​# 写入文件中backup_file_name = open(file="backup.txt", mode='a')backup_file_name.write(running_config)

在这里插入图片描述

相关文章:

Python自动化运维实战——Telnetlib和Netmiko自动化管理网络设备

❤️博客主页: iknow181🔥系列专栏: Python、JavaSE、JavaWeb、CCNP🎉欢迎大家点赞👍收藏⭐评论✍ 目录 一、前言 二、准备工作 三、Telnetlib Telnetlib介绍 Telnetlib模块及操作方法介绍 Telnetlib配置设备 T…...

中文编程开发语言工具开发的实际软件案例:称重管理系统软件

中文编程开发语言工具开发的实际软件案例:称重管理系统软件 中文编程开发语言工具开发的实际软件案例:称重管理系统软件,软件可以安装在电脑上,也可以安装在收银机上,支持触摸和鼠标点,想学编程可以关注系统…...

CSS如何画出平行四边形

其实如果项目中有这样的画图 还是会用到的比如 看起来样子怪怪的 哈哈 但是确实可以完成一些需求哈哈哈 这个就要用到一个css3转换的一个 属性了 skew 让一个元素再平面上进行倾斜 div {width: 200px;height: 50px;background-color: #f00;transform: skew(20deg);margin: 100…...

【计算机网络笔记】计算机网络性能(1)——速率、带宽、延迟

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 系列文章目录速率带宽延迟/时延(delay或latency) 下面介绍一些计算机网络中常用的性能指标。在本篇中涉及速…...

数字孪生与智慧城市:重塑未来城市生活的奇迹

今天,我们将探讨数字孪生和智慧城市两个颠覆性技术,它们正引领着未来城市生活的巨大变革。随着科技的飞速发展,数字孪生和智慧城市成为实现可持续发展和提升居民生活质量的关键策略。 数字孪生:实现现实与虚拟的完美融合 数字孪生…...

大势智慧是否支持航拍图片生成3D建模?

答:支持的,重建大师软件可以导入照片完成三维建模。 重建大师是一款专为超大规模实景三维数据生产而设计的集群并行处理软件,输入倾斜照片,激光点云,POS信息及像控点,输出高精度彩色网格模型,可…...

ASO优化之增加APP应用下载安装量的技巧1

想要增加APP应用的下载安装量,首先要在发布之前,分析我们的应用推广策略该如何运作并进行调整。提高知名度的基础是关键词,其次使用社交网络来推广我们的应用程序。 1、基础与规划。 在启动应用程序或者是实行ASO计划之前,需要了…...

点云从入门到精通技术详解100篇-雨雾环境下多传感器融合SLAM方法

目录 前言 国内外研究现状 传统SLAM研究现状 多传感器融合SLAM研究现状...

electron安装失败时配置

electron下载前配置 使用命令打开npm全局配置,C盘下的.npmrc文件。 npm config edit 然后在空白处添加 electron_builder_binaries_mirrorhttps://npmmirror.com/mirrors/electron-builder-binaries/ electron_mirrorhttps://cdn.npmmirror.com/binaries/electr…...

酷开科技为你的电视增添魅力,点亮每一个娱乐瞬间!

有没有想过有一天,你的电视可以像超人一样,为你的每一个娱乐时刻带来炫酷的观影体验。酷开科技,作为智能电视领域内的领军企业,正是你期待的那个“超人”,不妨让我们探索一下酷开科技的独特魅力,为你枯燥乏…...

Spring Cloud 之 Feign 简介及简单DEMO的搭建

Feign简介: Feign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用Feign, 我们可以做到使用HTTP请求远程服务时能与调用本地方法一样的编码体验。 Feign是在RestTemplate基础上封装的,使用注解的方式来声明一组与服务提供者Rest接口所对应的本地…...

SAS国际认证考试报名流程

文章目录 注册SAS账号登录SAS账号预约考试考试注意事项 注册SAS账号 SAS考试报名入口:https://home.pearsonvue.com/sas 注册SAS账号 邮箱验证 点击上述邮件发送来的链接,跳转到如下界面。输入密码即可。 完成注册。选择login。 登录SAS账号 输入Email …...

CSS 什么是外边距重叠?重叠的结果是什么?

外边距重叠是CSS中的一种现象,当两个(或更多)相邻的元素具有外边距时,它们的外边距可能会合并(重叠)成一个较大的外边距,而不是简单地叠加在一起。外边距重叠通常出现在垂直方向上,有…...

MultiPlayerShoot----C++学习记录01打包测试项目

首先将多人游戏插件plug文件夹移至项目目录 打开config/DefaultEngine.ini(5.0的虚幻引擎内容略不一样)和Game.ini对里边的内容进行编辑。 DefaultEngine.ini [/Script/Engine.GameEngine] NetDriverDefinitions(DefName"GameNetDriver",Driv…...

机器学习——奇异值分解二(特征分解+SVD纯理解)

矩阵的特征分解 特征值和特征向量的定义 抄来的:奇异值分解 困惑1:特征值和特征向量,和原矩阵是怎样的关系,需要一个栗子进行更具象的认识 困惑2:为什么多个特征向量组合成的矩阵,可以构成矩阵A的特征分解…...

牛客:FZ35 滑动窗口最小值

FZ35 滑动窗口最小值 文章目录 FZ35 滑动窗口最小值题目描述题解思路题解代码 题目描述 题解思路 遍历数组,然后遍历窗口找到最小值,加入到结果集里面 题解代码 func minSlidingWindow( nums []int , k int ) []int {// write code heren : len(nums…...

MAC上设置IDEA如何一个窗口打开多个项目,多个tab

1、IDEA一个窗口打开多个项目 如果你打开了多个项目、每次切换都要半天,想让项目都汇聚到top栏 点击 Window - Merge All Project Windows 即可 但是这样比较挫,每次打开新的项目都还是会重新打开一个IDEA窗口 so,如何设置项目在同一个窗口…...

【学习笔记】RabbitMQ02:交换机,以及结合springboot快速开始

参考资料 RabbitMQ官方网站RabbitMQ官方文档噼咔噼咔-动力节点教程 文章目录 四、RabbitMQ :Exchange 交换机4.1 交换机类型4.2 扇形交换机 Fanout Exchange4.2.1 概念4.2.1 实例:生产者4.2.1.1 添加起步依赖4.2.1.2 配置文件4.2.1.3 JavaBean进行配置4.…...

【Python机器学习】零基础掌握OPTICS聚类

你是否曾经困扰于这样的如何将相似的商品以最优的方式推荐给你的客户? 假设你是一个电商网站的运营经理,有成千上万的商品和用户,但不知道如何有效地将相似的商品分组以便推荐。或者是一个环保组织的数据分析师,希望找出那些具有相似环境影响的地区。这些问题都需要一种可…...

【HuggingFace文档学习】Bert的token分类与句分类

BERT特性: BERT的嵌入是位置绝对(position absolute)的。BERT擅长于预测掩码token和NLU,但是不擅长下一文本生成。 1.BertForTokenClassification 一个用于token级分类的模型,可用于命名实体识别(NER)、部分语音标记…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

Java编程之桥接模式

定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

如何做好一份技术文档?从规划到实践的完整指南

如何做好一份技术文档?从规划到实践的完整指南 🌟 嗨,我是IRpickstars! 🌌 总有一行代码,能点亮万千星辰。 🔍 在技术的宇宙中,我愿做永不停歇的探索者。 ✨ 用代码丈量世界&…...

大模型的LoRa通讯详解与实现教程

一、LoRa通讯技术概述 LoRa(Long Range)是一种低功耗广域网(LPWAN)通信技术,由Semtech公司开发,特别适合于物联网设备的长距离、低功耗通信需求。LoRa技术基于扩频调制技术,能够在保持低功耗的同时实现数公里甚至数十公里的通信距离。 LoRa的主要特点 长距离通信:在城…...

CCF 开源发展委员会 “开源高校行“ 暨红山开源 + OpenAtom openKylin 高校行活动在西安四所高校成功举办

点击蓝字 关注我们 CCF Opensource Development Committee CCF开源高校行 暨红山开源 openKylin 高校行 西安站 5 月 26 日至 28 日,CCF 开源发展委员会 "开源高校行" 暨红山开源 OpenAtom openKylin 高校行活动在西安四所高校(西安交通大学…...