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

nvidia设置wifi和接口

tx-nx设置wifi和接口

  • 前言
  • 基础知识点
    • 1.创建和删除一个wifi连接
    • 2. 启动连接和关闭连接
  • 代码和调试
    • 1. 代码展示
    • 2. 调试
  • 写到最后

前言

针对嵌入式开发,有时候通过QT或PAD跨网络对设备设置WIFI,在此记录下,方便后续的查阅。


基础知识点

1.创建和删除一个wifi连接

创建WIFI 连接

nmcli device wifi connect "SSID" password "passwd"

每次创建在/etc/NetworkManager/system-connections/目录下TR106-4文件多个,分别为"TR106" “TR106-4 1” TR106-4 2 …为什么有多个,笔者可能觉得是因为存在相同的SSID,不同的PASSWD的原因吧!

删除wifi连接
p.s:不允许手动rm删除,删除依然会保留到nmcli con show中

nmcli con del "SSID"

2. 启动连接和关闭连接

启动

nmcli connection up "TR106"或 nmcli device con wlan0
nmcli device con wlan0

关闭wifi连接

nmcli connection down "TR106"或nmcli device dis wlan0
  1. 创建热点 暂不描述,后续如增加再做记录。

代码和调试

1. 代码展示

#ifndef WIFI_MANAGE_H__
#define WIFI_MANAGE_H__#include <vector>
#include <string>#ifndef NMCCLI_CON_SHOW_ACTIVE
#define NMCCLI_CON_SHOW_ACTIVE	"nmcli con show -active |grep wifi |grep wlan"
#endif #define OUT		//param out 
#define IN		//param in
#define MAX_STRING (1024)
#define MIN_STRING (128)
namespace NMV
{};
class CWifiManage
{
public:static CWifiManage *inst(){static CWifiManage wm;return &wm;}/**获取设备WIFI扫描的列表*/int getWifiSSIDScanf();const std::vector<std::string> &getSsidList()const {return m_ssid_list;}/**获取当前wlanx已连接的WIFI ssid和passwd,当前只有wlan0,如果有多个wlan,需要做修改*/int getSystemWlanxInfo(std::string &rhs_ssid, std::string &rhs_passwd);/**获取当前的SSID和PASSWD*/int getWifiInfo(std::string &rhs_ssid, std::string &rhs_passwd)const {rhs_ssid = m_WifiSsid; rhs_passwd = m_WifiPasswd;}/**设置一个wifi信息到系统,切换WIFI的操作*/int setWifiInfo2SystemNetwork(const std::string &rhs_ssid, const std::string &rhs_passwd,OUT char *sys_response);/**外部接口,设置WIFI*/int setWifiInfo(const std::string &rhs_ssid, const std::string &rhs_passwd);
private:CWifiManage();~CWifiManage();std::string m_WifiSsid, m_WifiPasswd;std::vector<std::string> m_ssid_list;
};#endif
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>#include <string.h>#include <string>
#include <iostream>
#include <codecvt>#include "wifi_manage.h"CWifiManage::CWifiManage():m_WifiSsid(""), m_WifiPasswd("")
{m_ssid_list.clear();
}CWifiManage::~CWifiManage()
{}int CWifiManage::getSystemWlanxInfo(OUT std::string &rhs_ssid, OUT std::string &rhs_passwd)
{char pipeBuf[MAX_STRING] = {0};char tssid[MIN_STRING] = {0};FILE * pPipe = popen(NMCCLI_CON_SHOW_ACTIVE, "r");if(!pPipe){printf("PIPE ERROR\n");return -1;}size_t pipeSiz = ftell(pPipe);fseek(pPipe, 0, SEEK_SET);fread(pipeBuf, 1, pipeSiz, pPipe);if(pPipe){pclose(pPipe); pPipe = (FILE*)0;}if(!strlen(pipeBuf)){printf("无连接上的WIFI!\n");return -1;}sscanf(pipeBuf, "%s", tssid);/*根据SSID查看Passwd*/char ssidFileConfigure[MIN_STRING] = {0};snprintf(ssidFileConfigure, MIN_STRING-1, "/etc/NetworkManager/system-connections/%s", tssid);FILE *fp = fopen(ssidFileConfigure, "r");if(!fp){printf("打开%s失败!\n", ssidFileConfigure);return -1;}char line_buf[MIN_STRING] = {0};char tpasswd[MIN_STRING] = {0};while(!feof(fp)){memset(line_buf, 0, MIN_STRING);fgets(line_buf, MIN_STRING, fp);if(strstr(line_buf, "psk=")){size_t line_siz = strlen(line_buf);if(line_buf[line_siz-1] == '\n') line_buf[line_siz-1] = '\0';memcpy(tpasswd, line_buf+strlen("psk="), strlen(line_buf+strlen("psk=")));printf("passwd:%s, siz:%lu!\n" , tpasswd, strlen(tpasswd));}}if(fp){fclose(fp); fp = (FILE*)0;}if(strlen(tssid)&& strlen(tpasswd)){rhs_ssid = tssid; rhs_passwd = tpasswd;}return 0;}int CWifiManage::setWifiInfo2SystemNetwork(const std::string &rhs_ssid, const std::string &rhs_passwd,char *sys_response)
{char cmd_string[MIN_STRING] = {0};memset(cmd_string, 0, MIN_STRING);snprintf(cmd_string, MIN_STRING, "nmcli device wifi connect %s password %s", rhs_ssid.c_str(), rhs_passwd.c_str());FILE *pPipe = popen(cmd_string, "r"); //阻塞if(!pPipe){printf("cmdString: %s, err:%s\n" , cmd_string, strerror(errno));memcpy(sys_response, "pipe null", strlen("pipe null"));return -1;}fread(sys_response, 1, MAX_STRING-1, pPipe);pclose(pPipe); pPipe = (FILE*)0;if(!strstr(sys_response, "successfully"))			//如果设置失败{return -2;}printf("SSID:%s 设置成功!\n", rhs_ssid.c_str());/*重置wifi为设置的ssid和信息,更新 "nmcli con show"*///1. 关闭之前的连接pPipe = popen("nmcli device dis wlan0", "r");if(pPipe){pclose(pPipe); pPipe = (FILE*)0;}//2 开启设置的连接memset(cmd_string, 0, MIN_STRING);snprintf(cmd_string, MIN_STRING, "nmcli connection up %s", rhs_ssid.c_str());pPipe = popen(cmd_string, "r");if(pPipe){pclose(pPipe); pPipe = (FILE*)0;}#if 0		//配置暂先不做处理//3 删除(忘记)不需要的WIFI连接 cmd:nmcli con del "SSID",仅保留设置的wifi有效pPipe = popen("ls /etc/NetworkManager/system-connections/ |grep -v 'Wire'", "r");char ssid[MIN_STRING];if(pPipe){while(!feof(pPipe)){memset(ssid, 0, MIN_STRING);fgets(ssid, MIN_STRING-1, pPipe);if(ssid[strlen(ssid)-1] == '\n') ssid[strlen(ssid)-1] = '\0';if(rhs_ssid == std::string(ssid)){continue;}comm_sys_cmd("nmcli con del %s", ssid);}}
#endifreturn 0;
}int CWifiManage::getWifiSSIDScanf()
{//扫描WIFI ESSID//do somethingschar cmd_string[MIN_STRING] = {0};char sline[MIN_STRING], ssid[MIN_STRING];memset(cmd_string, 0, MIN_STRING);snprintf(cmd_string, MIN_STRING, "iw wlan0 scan |grep SSID");	FILE *pPipe = (FILE*)0;pPipe = popen(cmd_string, "r");if(!pPipe){printf("cmdString: %s, err:%s\n" , cmd_string, strerror(errno));return -1;}while(!feof(pPipe)){memset(sline, 0, MIN_STRING);memset(ssid, 0 , MIN_STRING);fgets(sline, MIN_STRING, pPipe);int j = 0;for(int i = 0; i < strlen(sline); ++i){if(sline[i] == '\t' || sline[i] == '\n' || sline[i] == ' '){continue ;}ssid[j] = sline[i];j++;}//printf("ssid:%s, siz:%lu\n", ssid, strlen(ssid));if(0 == strlen(ssid) - strlen("SSID:") || strlen(sline) == 0 ){//printf("ssid为空\n");continue;}if(strstr(ssid, "x00")){printf("含有x00\n");continue;}static std::wstring_convert<std::codecvt_utf8<wchar_t> > strCnv;//	std::wstring test = strCnv.from_bytes(ssid);printf("%s\n", test.c_str());m_ssid_list.push_back(ssid+strlen("SSID:"));}auto vit = m_ssid_list.begin();for(; vit != m_ssid_list.end();++vit){	static int cnt = 0;std::cout <<  "SSID_siz:" << (*vit).size() << " "<< *vit << std::endl;;}if(pPipe){pclose(pPipe); pPipe = (FILE*)0;}return 0;
}int CWifiManage::setWifiInfo(const std::string &rhs_ssid, const std::string &rhs_passwd)
{char sys_resp[MAX_STRING] = {0};if(setWifiInfo2SystemNetwork(rhs_ssid, rhs_passwd,  sys_resp)){printf("设置wifi失败!");}std::cout << "设置wifi系统提示: " << sys_resp << std::endl;m_WifiSsid = rhs_ssid;m_WifiPasswd = rhs_passwd;return  0;
}int main(int argc, char *argv[])
{int ret = 0;
#if 0std::string str_ssid = "", str_passwd = "";ret = CWifiManage::inst()->getSystemWlanxInfo(str_ssid, str_passwd);if(ret == 0){printf("当前wifi已连接成功, ssid:%s, passwd:%s\n", str_ssid.c_str(), str_passwd.c_str());}if(CWifiManage::inst()->setWifiInfo("HONOR-Hello-Ouyang_2.4", "woshisunouyangaaaa")){printf("设置wifi失败!\n");}
#else CWifiManage::inst()->getWifiSSIDScanf();
#endif }

2. 调试

扫描中踢出了空格,换行和制表符
获取WIFI扫描

{"Jsonrpc": "1.0","Method": "GetWifiScan","Result": true,"SsidList": ["TR106-4","HONOR-Hello-Ouyang_2.4","HUAWEI-WANG","Maxvision-2.4G","HUAWEI-MV_SLAM_02","ymg","fanyiji-ceshi","Tenda_1D0130","cleanRobot","Xiaomi_DESKT","YUN","siweite7wifi","HUAWEI-MV_SLAM_00","HONOR-xunjian-Mast","HONOR-xunjian-Mast","jxkjc","Trans-4G-SanFanTest","TP-LINK_2.4G_D6D088","TR106-4","Maxvision-2.4G","ChinaNet-5pV3-5G","HUAWEI-MV_SLAM_00","HONOR-Hello-Ouyang_5G","HUAWEI-MV_SLAM_02","ROBOT_TEST","HONOR-0J14YA","xunjian"]
}

设置wifi过程中遇到的问题:

1. SSID不存在,返回如下错误
{"Jsonrpc": "1.0","Method": "SetWifiConnect","Params": null,"ResponseMsg": "ERROR:未扫描到SSID:TR106-41","Result": false
}
之前使用PAD对设备设置,用的是android的API扫描WIFI SSID,可能设备和WIFI处的位置不同,以及无线网卡的差异性,导致PAD搜索的SSID可能设备网卡搜不到的情况。

2.输入的密码错误

{"Jsonrpc": "1.0","Method": "SetWifiConnect","Params": null,"ResponseMsg": "ERROR:Error: Connection activation failed: (7) Secrets were required, but not provided.\n","Result": false
}

写到最后

1. 每次设置一个新WIFI,将之前的配置都删除掉,让设备只连最近更新的WIFI,后面考虑合理性以及手机android等
都采用保存配置的情况, 该功能就删除了。
2. 还有比较多的功能可以实现,比如忘记WIFI名称等功能。
忘记WIFI名称
pPipe = popen("ls /etc/NetworkManager/system-connections/ |grep -v 'Wire'", "r");char ssid[128];if(pPipe){while(!feof(pPipe)){memset(ssid, 0, MIN_STRING);fgets(ssid, MIN_STRING-1, pPipe);if(ssid[strlen(ssid)-1] == '\n') ssid[strlen(ssid)-1] = '\0';if(rhs_ssid == std::string(ssid)){continue;}std::string str_cmd = "nmcli con del" + " " + ssid;system(str_cmd.c_str());}}

相关文章:

nvidia设置wifi和接口

tx-nx设置wifi和接口前言基础知识点1.创建和删除一个wifi连接2. 启动连接和关闭连接代码和调试1. 代码展示2. 调试写到最后前言 针对嵌入式开发&#xff0c;有时候通过QT或PAD跨网络对设备设置WIFI&#xff0c;在此记录下&#xff0c;方便后续的查阅。 基础知识点 1.创建和删…...

PostgreSQL 变化数据捕捉(CDC)

PostgreSQL 变化数据捕捉&#xff08;CDC&#xff09;基于CDC&#xff08;变更数据捕捉&#xff09;的增量数据集成总体步骤&#xff1a;1.捕获源数据库中的更改数据2.将变更的数据转换为您的消费者可以接受的格式3.将数据发布到消费者或目标数据库PostgreSQL支持触发器&#x…...

Spring 事务【隔离级别与传播机制】

Spring 事务【隔离级别与传播机制】&#x1f34e;一.事务隔离级别&#x1f352;1.1 事务特性回顾&#x1f352;1.2 事务的隔离级别(5种)&#x1f352;1.3 事务隔离级别的设置&#x1f34e;二.Spring 事务传播机制&#x1f352;2.1 Spring 事务传播机制的作用&#x1f352;2.2 事…...

HTTP和HTTPS协议

HTTP协议 HTTP协议是一种应用层的协议&#xff0c;全称为超文本传输协议。 URL URL值统一资源定位标志&#xff0c;也就是俗称的网址。 协议方案名 http://表示的就是协议方案名&#xff0c;常用的协议有HTTP协议、HTTPS协议、FTP协议等。HTTPS协议是以HTTP协议为基础&#…...

day3——有关java运算符的笔记

今天主要学习的内容有java的运算符 赋值运算符算数运算符关系运算符逻辑运算符位运算符&#xff08;专门写一篇笔记&#xff09;条件运算符运算符的优先级流程控制 赋值运算符 赋值运算符&#xff08;&#xff09;主要用于给变量赋值&#xff0c;可以跟算数运算符相结合&…...

Git多人协同远程开发

1. 李四&#xff08;项目负责人&#xff09;操作步骤 在github中创建远程版本库testgit将基础代码上传⾄testgit远程库远程库中基于main分⽀创建dev分⽀将 githubleaflife/testgit 共享给组员李四继续在基础代码上添加⾃⼰负责的模块内容 2. 张三、王五&#xff08;组员&…...

Chapter4:机器人仿真

ROS1{\rm ROS1}ROS1的基础及应用&#xff0c;基于古月的课&#xff0c;各位可以去看&#xff0c;基于hawkbot{\rm hawkbot}hawkbot机器人进行实际操作。 ROS{\rm ROS}ROS版本&#xff1a;ROS1{\rm ROS1}ROS1的Melodic{\rm Melodic}Melodic&#xff1b;实际机器人&#xff1a;Ha…...

python(14)--集合

前言 本篇文章学习的是 python 中集合的基础知识。 集合元素的内容是不可变的&#xff0c;常见的元素有整数、浮点数、字符串、元组等。至于可变内容列表、字典、集合等不可以是集合元素。虽然集合不可以是集合的元素&#xff0c;但是集合本身是可变的&#xff0c;可以去增加或…...

【Spark分布式内存计算框架——Spark Core】4. RDD函数(中)Transformation函数、Action函数

3.2 Transformation函数 在Spark中Transformation操作表示将一个RDD通过一系列操作变为另一个RDD的过程&#xff0c;这个操作可能是简单的加减操作&#xff0c;也可能是某个函数或某一系列函数。值得注意的是Transformation操作并不会触发真正的计算&#xff0c;只会建立RDD间…...

Mysql 数据类型

1、数值数据类型 1.1 整数类型(精确值) INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT MySQL支持SQL标准的整数类型INTEGER (或INT)和SMALLINT。作为标准的扩展&#xff0c;MySQL还支持整数类型TINYINT、MEDIUMINT和BIGINT。下表显示了每种整数类型所需的存储和范围。…...

运行Whisper笔记(1)

最近chatGPT很火&#xff0c;就去逛了一下openai的github项目。发现了这个项目。 这个项目可以识别视频中的音频&#xff0c;转换出字幕。 带着一颗好奇的心就尝试自己去部署玩一玩 跟着这篇文章一步步来进行安装&#xff0c;并且跟着这篇文章解决途中遇到的问题。 途中还会遇…...

2023年最强大的12款数据可视化工具,值得收藏

做数据分析也有年头了&#xff0c;好的坏的工具都用过&#xff0c;推荐几个觉得很好用的&#xff0c;避坑必看&#xff01; PS&#xff1a;一般比较成熟的公司里&#xff0c;数据分析工具不只是满足业务分析和报表制作&#xff0c;像我现在给我们公司选型BI工具&#xff0c;是做…...

LeetCode刷题系列 -- 523. 连续的子数组和

给你一个整数数组 nums 和一个整数 k &#xff0c;编写一个函数来判断该数组是否含有同时满足下述条件的连续子数组&#xff1a;子数组大小 至少为 2 &#xff0c;且子数组元素总和为 k 的倍数。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。如果存…...

LeetCode刷题系列 -- 525. 连续数组

给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组&#xff0c;并返回该子数组的长度。示例 1:输入: nums [0,1]输出: 2说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。示例 2:输入: nums [0,1,0]输出: 2说明: [0, 1] (或 [1, 0]) 是具有相同数…...

JavaEE15-Spring Boot统一功能处理

目录 1.统一用户登录权限效验 1.1.最初用户登录验证 1.2.Spring AOP用户统一登录验证的问题 1.3.Spring拦截器 1.3.1.创建自定义拦截器&#xff0c;实现 HandlerInterceptor 接口并重写 preHandle&#xff08;执行具体方法之前的预处理&#xff09;方法 1.3.2.将自定义拦…...

centos7.6 设置防火墙

1、查看系统版本 cat /etc/redhat-release2、查看防火墙运行状态 systemctl status firewalld这里可以看到当前是未运行状态(inactive)。 3、关闭开机自启动防火墙 systemctl disable firewalld.service4、启动防火墙并查看状态&#xff0c;系统默认 22 端口是开启的。 sy…...

在线支付系列【22】微信支付实战篇之集成服务商API

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录前言1. 环境搭建2. 特约商户进件3. 统一下单总结前言 在上篇文档中&#xff0c;我们做好了接入前准备工作&#xff0c;接下来使用开源框架集成服务商相关API。 一个简单的支付系统完成支付流程…...

3.2 埃尔米特转置

定义 对于复矩阵&#xff0c;转置又不一样&#xff0c;常见的操作是共轭转置&#xff0c;也叫埃尔米特转置Hermitian transpose。埃尔米特转置就是对矩阵先共轭&#xff0c;再转置&#xff0c;一般来说用三种符号表示埃尔米特转置&#xff1a; 第一种符号是AHA^HAH&#xff0c…...

Python爬虫之Scrapy框架系列(13)——实战ZH小说爬取数据入MySql数据库

目录&#xff1a;1 数据持久化存储&#xff0c;写入Mysql数据库①定义结构化字段&#xff1a;②重新编写爬虫文件&#xff1a;③编写管道文件&#xff1a;④辅助配置&#xff08;修改settings.py文件&#xff09;&#xff1a;⑤navicat创库建表&#xff1a;⑥ 效果如下&#xf…...

MySQL篇02-三大范式,多表查询

数据入库时,由于数据设计不合理&#xff0c;会存在数据重复、更新插入异常等情况, 故数据库中表的设计遵循的设计规范&#xff1a;三大范式1.第一范式(1NF)要求数据库的每一列都是不可分割的原子数据项&#xff0c;即原子性。强调的是列的原子性&#xff0c;即数据库中每一列的…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...