Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
gamera_videos_no_ui
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
liusq
gamera_videos_no_ui
Commits
53105180
You need to sign in or sign up before continuing.
Commit
53105180
authored
Oct 10, 2024
by
guof
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'feature-1007488' into 'release'
Feature 1007488 See merge request
!44
parents
1893e60d
742e07a4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
130 additions
and
41 deletions
+130
-41
Common.cpp
+100
-0
Common.h
+18
-0
NonConnectedCameraHandle.cpp
+12
-2
VidesData.h
+0
-39
No files found.
Common.cpp
View file @
53105180
...
...
@@ -200,5 +200,105 @@ bool Common::pingAddress(const QString &address) {
}
return
false
;
}
void
Common
::
get_network_info
(
const
char
*
interface
,
QString
&
mac
,
QString
&
subnet_mask
,
QString
&
gateway
)
{
int
fd
;
struct
ifreq
ifr
;
struct
rtentry
route
;
unsigned
char
*
mac_addr
;
struct
sockaddr_in
*
addr
;
struct
ifaddrs
*
ifaddr
,
*
ifa
;
// Create a socket to perform ioctl requests
fd
=
socket
(
AF_INET
,
SOCK_DGRAM
,
0
);
if
(
fd
<
0
)
{
perror
(
"socket"
);
return
;
}
// Get the MAC address
memset
(
&
ifr
,
0
,
sizeof
(
ifr
));
strncpy
(
ifr
.
ifr_name
,
interface
,
IFNAMSIZ
-
1
);
if
(
ioctl
(
fd
,
SIOCGIFHWADDR
,
&
ifr
)
==
0
)
{
mac_addr
=
(
unsigned
char
*
)
ifr
.
ifr_hwaddr
.
sa_data
;
mac
=
QString
::
asprintf
(
"%02x:%02x:%02x:%02x:%02x:%02x"
,
mac_addr
[
0
],
mac_addr
[
1
],
mac_addr
[
2
],
mac_addr
[
3
],
mac_addr
[
4
],
mac_addr
[
5
]);
}
else
{
perror
(
"SIOCGIFHWADDR"
);
mac
=
"Unknown"
;
}
// Get the subnet mask
if
(
ioctl
(
fd
,
SIOCGIFNETMASK
,
&
ifr
)
==
0
)
{
addr
=
(
struct
sockaddr_in
*
)
&
ifr
.
ifr_netmask
;
subnet_mask
=
QString
::
fromUtf8
(
inet_ntoa
(
addr
->
sin_addr
));
}
else
{
perror
(
"SIOCGIFNETMASK"
);
subnet_mask
=
"Unknown"
;
}
// Get the default gateway
FILE
*
fp
=
fopen
(
"/proc/net/route"
,
"r"
);
if
(
fp
!=
NULL
)
{
char
buffer
[
256
];
while
(
fgets
(
buffer
,
sizeof
(
buffer
),
fp
))
{
char
iface
[
IFNAMSIZ
];
unsigned
long
dest
,
gateway_addr
;
if
(
sscanf
(
buffer
,
"%s %lx %lx"
,
iface
,
&
dest
,
&
gateway_addr
)
==
3
)
{
if
(
dest
==
0
)
{
// Default route
struct
in_addr
gwaddr
;
gwaddr
.
s_addr
=
gateway_addr
;
gateway
=
QString
::
fromUtf8
(
inet_ntoa
(
gwaddr
));
break
;
}
}
}
fclose
(
fp
);
}
else
{
perror
(
"fopen"
);
gateway
=
"Unknown"
;
}
// Clean up
close
(
fd
);
}
// 确定当前网络接口
void
Common
::
determine_interface
(
char
*
interface
)
{
struct
ifaddrs
*
ifaddr
,
*
ifa
;
int
family
,
s
;
char
host
[
NI_MAXHOST
];
if
(
getifaddrs
(
&
ifaddr
)
==
-
1
)
{
perror
(
"getifaddrs"
);
exit
(
EXIT_FAILURE
);
}
// Walk through linked list, maintaining head pointer so we can free list later
for
(
ifa
=
ifaddr
;
ifa
!=
NULL
;
ifa
=
ifa
->
ifa_next
)
{
if
(
ifa
->
ifa_addr
==
NULL
)
continue
;
family
=
ifa
->
ifa_addr
->
sa_family
;
// Check for IPv4 or IPv6
if
(
family
==
AF_INET
||
family
==
AF_INET6
)
{
s
=
getnameinfo
(
ifa
->
ifa_addr
,
(
family
==
AF_INET
)
?
sizeof
(
struct
sockaddr_in
)
:
sizeof
(
struct
sockaddr_in6
),
host
,
NI_MAXHOST
,
NULL
,
0
,
NI_NUMERICHOST
);
if
(
s
!=
0
)
{
printf
(
"getnameinfo() failed: %s
\n
"
,
gai_strerror
(
s
));
exit
(
EXIT_FAILURE
);
}
// Check if the interface is up and running
if
(
ifa
->
ifa_flags
&
IFF_UP
&&
ifa
->
ifa_flags
&
IFF_RUNNING
)
{
strncpy
(
interface
,
ifa
->
ifa_name
,
IFNAMSIZ
-
1
);
break
;
}
}
}
freeifaddrs
(
ifaddr
);
}
Common
::~
Common
(){}
Common.h
View file @
53105180
#ifndef COMMON_H
#define COMMON_H
#include <ctime>
#include <chrono>
#include <thread>
...
...
@@ -17,6 +19,17 @@
#include <netinet/ip_icmp.h>
#include <sys/socket.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <arpa/inet.h>
#include <net/if_arp.h>
#include <linux/route.h>
#include <ifaddrs.h>
#include <netdb.h>
// ICMP 头部结构体
struct
ICMPHeader
{
uint8_t
type
;
// 类型
...
...
@@ -59,6 +72,11 @@ public:
bool
receivePingReply
(
int
sockfd
,
int
sequence
);
//确定当前网络接口
void
determine_interface
(
char
*
interface
);
void
get_network_info
(
const
char
*
interface
,
QString
&
mac
,
QString
&
subnet_mask
,
QString
&
gateway
)
;
bool
pingAddress
(
const
QString
&
address
)
;
...
...
NonConnectedCameraHandle.cpp
View file @
53105180
...
...
@@ -23,9 +23,19 @@ NonConnectedCameraHandle* NonConnectedCameraHandle::getInstance()
bool
NonConnectedCameraHandle
::
changeCameraIp
(
vides_data
::
localDevice
&
device
){
Common
&
instace
=
Common
::
getInstance
();
char
interface
[
IFNAMSIZ
];
// 确定当前网络接口
instace
.
determine_interface
(
interface
);
QString
localMac
,
subnetMask
,
gateway
;
bool
success
=
vides_data
::
GetNetworkInfoByQNetworkInterface
(
localMac
,
subnetMask
,
gateway
);
if
(
!
success
)
{
// 获取网络信息
instace
.
get_network_info
(
interface
,
localMac
,
subnetMask
,
gateway
);
qInfo
()
<<
QString
(
"SN(%1): 获取本地MAC:%2,%3,%4"
).
arg
(
device
.
sSn
).
arg
(
localMac
)
.
arg
(
subnetMask
).
arg
(
gateway
);
if
(
localMac
==
"Unknown"
&&
subnetMask
==
"Unknown"
&&
gateway
==
"Unknown"
)
{
qInfo
()
<<
QString
(
"SN(%1): 获取本地MAC失败"
).
arg
(
device
.
sSn
);
return
false
;
}
...
...
VidesData.h
View file @
53105180
...
...
@@ -440,45 +440,6 @@ inline bool isInSameSubnet(const QString &ip1, const QString &ip2, const QString
// 比较结果
return
result1
==
result2
;
}
inline
bool
GetNetworkInfoByQNetworkInterface
(
QString
&
mac
,
QString
&
subnetMask
,
QString
&
gateway
)
{
QList
<
QNetworkInterface
>
interfaces
=
QNetworkInterface
::
allInterfaces
();
foreach
(
QNetworkInterface
interface
,
interfaces
)
{
if
(
interface
.
flags
().
testFlag
(
QNetworkInterface
::
IsUp
)
&&
interface
.
flags
().
testFlag
(
QNetworkInterface
::
IsRunning
)
&&
!
interface
.
flags
().
testFlag
(
QNetworkInterface
::
IsLoopBack
))
{
mac
=
interface
.
hardwareAddress
();
QList
<
QNetworkAddressEntry
>
addressEntries
=
interface
.
addressEntries
();
foreach
(
QNetworkAddressEntry
entry
,
addressEntries
)
{
if
(
entry
.
ip
().
protocol
()
==
QAbstractSocket
::
IPv4Protocol
)
{
subnetMask
=
entry
.
netmask
().
toString
();
// 获取网关地址
QFile
file
(
"/proc/net/route"
);
if
(
!
file
.
open
(
QIODevice
::
ReadOnly
|
QIODevice
::
Text
))
{
qInfo
()
<<
"Failed to open /proc/net/route file."
;
continue
;
}
QTextStream
in
(
&
file
);
while
(
!
in
.
atEnd
())
{
QString
line
=
in
.
readLine
();
QStringList
parts
=
line
.
split
(
QRegExp
(
"
\\
s+"
));
if
(
parts
.
size
()
>=
3
&&
parts
[
1
]
==
"00000000"
)
{
gateway
=
parts
[
2
];
gateway
=
gateway
.
mid
(
6
,
2
)
+
":"
+
gateway
.
mid
(
4
,
2
)
+
":"
+
gateway
.
mid
(
2
,
2
)
+
":"
+
gateway
.
mid
(
0
,
2
);
gateway
=
gateway
.
replace
(
":"
,
"."
);
gateway
=
QHostAddress
(
gateway
).
toString
();
return
true
;
}
}
}
}
}
}
return
false
;
// Return false if no suitable interface is found or gateway not found
}
inline
bool
pingAddress
(
const
QString
&
address
)
{
QProcess
cmd
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment