基于粤嵌gec6818开发板嵌入式开发电子相册,音乐播放,视频播放,2048游戏

news2024/11/18 15:25:19

一、功能与要求

实现功能:本系统需要使用粤嵌的GEC-6818开发板设计一款娱乐影音系统,其中包括图片显示(相册)、音乐播放、视频播放,游戏四个部分,在每个部分内部,具有操控各个部分的功能触摸按键。本系统还应具有蓝牙远程操控功能。

具体要求:对使用者具有良好的可视交互体验,可自由切换各个模块。在图片模块里面,能够点击左右两侧来切换上一张和下一张图片,退出相册显示主屏幕;在音乐模块里面,能够点击屏幕进行播放/暂停/退出;在视频模块中,点击屏幕进行播放/暂停/快进/快退/音量加/音量减/退出。所有模块还应具有退出至菜单的功能。这些交互除了需要通过触摸屏幕完成,也还应通过蓝牙进行远程操作。

演示视频

【基于粤嵌gec6818开发板嵌入式开发电子相册,音乐播放,视频播放,2048游戏】

在这里插入图片描述

(二)软件设计

电子相册功能程序如下:

  1. 准备图片素材:1.bmp,2.bmp,3.bmp,img1.bmp。
  2. 头文件、设置变量和定义函数,关键代码如下:
  #include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <linux/input.h>
#include <stdlib.h>
#include <string.h>
#include <termios.h>
 
//打开触摸屏设备文件
void open_ts();
//关闭触摸屏设备文件
void close_ts();
//获取坐标
void get_xy(int *x,int *y);
//打开LCD设备文件
void open_lcd();
//关闭LCD设备文件
void close_lcd();
//显示某张大小的图片某个位置
int show_bmp(char *pic_path,int x,int y,int w,int h);
//相册
void photo();
//音乐
void music();
//视频
void video();
void guan();
//蓝牙控制照片
void photo1();
//蓝牙控制音频
void music1();
//蓝牙控制视频
void video1();
//全局变量
int ts_fd;
int lcd_fd;
unsigned *FB;
int pos_x,pos_y;
 
int fd_fifo;
  1. 获取坐标,读取坐标信息,存储到信息结构体,产生阻塞,等待用户触摸屏幕,关键代码如下:
//获取坐标
void get_xy(int *x,int *y)
{
    //读取坐标信息,存储到信息结构体
    struct input_event ts_buf;
    int x_read = 0;
    int y_read = 0;
    int pre = -1;
    while (1)
    {
        //产生阻塞,等待用户触摸屏幕
        read(ts_fd,&ts_buf,sizeof(ts_buf));
        if(ts_buf.type  == EV_ABS && ts_buf.code == ABS_X)
        {
            *x = ts_buf.value;
            x_read = 1;
        }
        else if(ts_buf.type  == EV_ABS && ts_buf.code == ABS_Y)
        {
            *y = ts_buf.value;
            y_read = 1;
        } 
        else if(ts_buf.type  == EV_KEY && ts_buf.code == BTN_TOUCH) 
        {
            pre = ts_buf.value;
        }
        if (x_read == 1 && y_read == 1 && pre == 0 )
        {
            *x = *x*800/1024;
            *y = *y*480/600;
            break;
        }    
    }
}
  1. 完成show_bmp函数,实现显示某张大小的图片某个位置,关键代码如下:
//显示某张大小的图片某个位置
int show_bmp(char *pic_path,int x,int y,int w,int h)
{
 
    //映射新的显存
    unsigned *new_FB = FB + (x+y*800);
	//打开BMP图片文件
    int bmp_fd = open(pic_path,O_RDWR);
	//读取BMP中RGB数据
    //先将BMP图片的文件头14个字节和信息头40个字节读取到bmp_info
    unsigned char bmp_info[54]={0};
    read(bmp_fd,bmp_info,sizeof(bmp_info));
    unsigned char bmp_buf[3*w*h];
    read(bmp_fd,bmp_buf,sizeof(bmp_buf));
    unsigned int lcd_buf[w*h];
    for(int i = 0; i<w*h; i++)
    {
        lcd_buf[i] = bmp_buf[i*3] <<  0 | bmp_buf[i*3+1] << 8 | bmp_buf[i*3+2] << 16 | 0x00 << 24;
    }
 
    //图片上下颠倒
    int n,m;
    unsigned int lcd_buf1[w*h];
    for (m = 0; m < h; m++)
    {
        for(n = 0; n < w; n++)
        {
            lcd_buf1[n+m*w] = lcd_buf[n+(h-1-m)*w];
        }
    }
	//将aRGB写入到LCD屏中
    for (m = 0; m < h; m++)
    {
        for(n = 0; n < w; n++)
        {
            *(new_FB+n+m*800) = lcd_buf1[n+m*w];
        }
    }
    close(bmp_fd);
}
5.	完成Photo1()函数,实现蓝牙控制电子相册功能,实现相册展示,关键代码如下:
//蓝牙控制相册
void photo1(){
	// 1.访问串口3
    int fd = open("/dev/ttySAC3", O_RDWR | O_NOCTTY);
 
    // 2.配置串口3参数
    init_tty(fd);
 
    char buf[10] = {0};
    int ret;
 
	int current_photo = 1;  // 记录当前显示的照片编号,初始值为1。
    char bmp_path[20];		//字符串数组,用于存储照片的路径
    int switch_x = 700;   // 切换按钮的右边x 坐标
    int switch_y = 200;   // 切换按钮的右边 y 坐标
    int switch_width = 100;   // 切换按钮的宽度
    int switch_height = 50;   // 切换按钮的高度
 
	int left_switch_x = 0;   // 左边切换按钮的左边 x 坐标
    int left_switch_y = 200;   // 左边切换按钮的右边 y 坐标
    int left_switch_width = 100;   // 左边切换按钮的宽度
    int left_switch_height = 50;   // 左边切换按钮的高度
 
    while (1)
    {
 
		//使用当前照片编号动态构建照片路径,并将结果存储在bmp_path字符串中
        sprintf(bmp_path, "./%d.bmp", current_photo); 
		//调用一个名为show_bmp的函数,显示指定路径的照片在屏幕上。
        show_bmp(bmp_path, 0, 0, 800, 480);  
 
        // 读数据
        ret = read(fd, buf, 10);
        if (ret == -1)
        {
            perror("read error");
            return -1;
        }
        // 对比
        if (0 == strcmp(buf, "on"))
        {
            printf("下一张图片\n");
			current_photo++; 
            if (current_photo > 3) 
            {
                current_photo = 1;
            }
        }
        else if (0 == strcmp(buf, "off"))
        {
			printf("退出相册\n");
            show_bmp("./img1.bmp", 0, 0, 800, 480);
            break;
        }else if (0 == strcmp(buf, "back"))
        {
			current_photo--; 
            if (current_photo < 1)
            {
                current_photo = 3;
            }
        }
        write(fd, buf, strlen(buf));
        // 清空buf
        bzero(buf, 10);
    }
}

音频播放功能代码如下:

  1. 准备音乐素材:jay.mp3,yy.mp3
  2. 头文字,设置变量、定义函数。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <linux/input.h>
#include <stdlib.h>
#include <string.h>
#include <termios.h>
 
//打开触摸屏设备文件
void open_ts();
//关闭触摸屏设备文件
void close_ts();
//获取坐标
void get_xy(int *x,int *y);
//打开LCD设备文件
void open_lcd();
//关闭LCD设备文件
void close_lcd();
//显示某张大小的图片某个位置
int show_bmp(char *pic_path,int x,int y,int w,int h);
//相册
void photo();
//音乐
void music();
//视频
void video();
void guan();
//蓝牙控制照片
void photo1();
//蓝牙控制音频
void music1();
//蓝牙控制视频
void video1();
//全局变量
int ts_fd;
int lcd_fd;
unsigned *FB;
int pos_x,pos_y;
int fd_fifo;
  1. 音频模块
//音频
void music(){
	int current_track = 0; 
	int switch_x = 700;   
    int switch_y = 200;   
    int switch_width = 100;   
    int switch_height = 50;   
	int left_switch_x = 0;   
    int left_switch_y = 200;   
    int left_switch_width = 100;   
    int left_switch_height = 50;   

    const char* mu[] = {
        "jay.mp3",
        "yy.mp3",
     
    };

    char command[50];
    sprintf(command, "madplay %s &", mu[current_track]);

    while(1){
        get_xy(&pos_x, &pos_y);
		system("madplay jay.mp3 &");
		if (pos_x > 700 && pos_x < 800 && pos_y > 0 && pos_y < 50)
        {
            printf("退出音乐\n");
            show_bmp("./img1.bmp", 0, 0, 800, 480);
            break;
        }
        if (pos_x > switch_x && pos_x < switch_x + switch_width && pos_y > switch_y && pos_y < switch_y + switch_height)
        {
			printf("下一首\n");
            current_track++;
			if (current_track > 2) {
				current_track = 0; 
			}
        }
		 if (pos_x > left_switch_x && pos_x < left_switch_x + left_switch_width && pos_y > left_switch_y && pos_y < left_switch_y + left_switch_height)
        {
            printf("上一首\n");
            current_track--;
			if (current_track < 0) {
				current_track = 2; 
			}
        }
		
		 if (pos_x > 95 && pos_x < 245 && pos_y > 255 && pos_y < 405)
        {
            printf("暂停\n");
            system("killall -19 madplay"); 
        }
		
		 if (pos_x > 500 && pos_x < 600 && pos_y > 255 && pos_y < 405)
        {
            printf("继续\n");
            system("killall -18 madplay"); 
        }
		
		 if (pos_x > 700 && pos_x < 800 && pos_y > 400 && pos_y < 480)
        {
            printf("终止\n");
            system("killall -9 madplay"); 
        }	
	}
}
  1. 蓝牙控制音频
//蓝牙控制音乐
void music1(){
	// 1.访问串口3
    int fd = open("/dev/ttySAC3", O_RDWR | O_NOCTTY);
    // 2.配置串口3参数
    init_tty(fd);

    char buf[10] = {0};
    int ret;
show_bmp("./music.bmp", 0, 0, 800, 480);  
	int current_track = 0; // 当前播放的音频文件索引
	int switch_x = 700;   // 切换按钮的右边x 坐标
    int switch_y = 200;   // 切换按钮的右边 y 坐标
    int switch_width = 100;   // 切换按钮的宽度
    int switch_height = 50;   // 切换按钮的高度
	int left_switch_x = 0;   // 左边切换按钮的左边 x 坐标
    int left_switch_y = 200;   // 左边切换按钮的右边 y 坐标
    int left_switch_width = 100;   // 左边切换按钮的宽度
    int left_switch_height = 50;   // 左边切换按钮的高度

	 // 音频文件列表
    const char* mu[] = {
        "jay.mp3",
        "yy.mp3"
    };
	// 拼接当前音频文件的路径
    char command[50];
    sprintf(command, "madplay %s &", mu[current_track]);
	system("madplay jay.mp3 &"); // 后台播放
    while (1)
    {

        // 读数据
        ret = read(fd, buf, 10);
        if (ret == -1)
        {
            perror("read error");
            return -1;
        }
        // 对比
        if (0 == strcmp(buf, "1"))
        {
            printf("退出音乐\n");
            show_bmp("./img1.bmp", 0, 0, 800, 480);
            break;
        }
        else if (0 == strcmp(buf, "2"))
        {
            printf("下一首\n");
            current_track++;
			if (current_track > 2) {
				current_track = 0; // 切换到第一首音频文件
			}
        }else if (0 == strcmp(buf, "3"))
        {
            printf("上一首\n");
            current_track--;
			if (current_track < 0) {
				current_track = 2; // 切换到最后一首音频文件
			}
        }else if (0 == strcmp(buf, "4"))
        {
            printf("上一首\n");
            current_track--;
			if (current_track < 0) {
				current_track = 2; // 切换到最后一首音频文件
			}
        }else if (0 == strcmp(buf, "5"))
        {
           printf("暂停\n");
           system("killall -19 madplay"); // 暂停音乐播放
        }else if (0 == strcmp(buf, "6"))
        {
            printf("继续\n");
            system("killall -18 madplay"); // 继续音乐播放
        }else if (0 == strcmp(buf, "7"))
        {
            printf("终止\n");
            system("killall -9 madplay"); // 继续音乐播放
        }
        write(fd, buf, strlen(buf));
        // 清空buf
        bzero(buf, 10);
    }
}

5.视频部分核心代码如下:

int init_tty(int fd)
{
    struct termios old_flags, new_flags;
    // 清空new_flags
    bzero(&new_flags, sizeof(new_flags));
    // 1. 获取旧的属性
    tcgetattr(fd, &old_flags);
    // 2. 设置原始模式
    cfmakeraw(&new_flags);
    // 3. 激活本地连接CLOCAL与接收使能CREAD的选项
    new_flags.c_cflag |= CLOCAL | CREAD;
    // 4. 设置波特率
    cfsetispeed(&new_flags, B9600);
    cfsetospeed(&new_flags, B9600);
    // 5. 设置数据位位8位
    // 清空原有的数据位
    new_flags.c_cflag &= ~CSIZE;
    new_flags.c_cflag |= CS8;

    // 6. 设置奇偶校验位
    new_flags.c_cflag &= ~PARENB;

    // 7. 设置一位停止位
    new_flags.c_cflag &= ~CSTOPB;

    // 8. 设置等待时间,最少接收字符个数
    new_flags.c_cc[VTIME] = 0;
    new_flags.c_cc[VMIN] = 1;

    // 9. 清空串口缓冲区
    tcflush(fd, TCIFLUSH);

    // 10. 设置串口的属性到文件中
    tcsetattr(fd, TCSANOW, &new_flags);

    return 0;
}
//蓝牙控制视频
void video1(){
 system("mplayer -slave -quiet -input file=/fifo -geometry 0:0 -zoom -x 800 -y 400 1.mp4 &");
	sleep(1);
	// 1.访问串口3
    int fd = open("/dev/ttySAC3", O_RDWR | O_NOCTTY);

    // 2.配置串口3参数
    init_tty(fd);

    char buf[10] = {0};
    int ret;

	system("mplayer -slave -quiet -input file=/fifo -geometry 0:0 -zoom -x 800 -y 400 1.mp4 &");
	sleep(1);
	
    while (1)
    {
        // 读数据
        ret = read(fd, buf, 10);
        if (ret == -1)
        {
            perror("read error");
            return -1;
        }
        // 对比
        if (0 == strcmp(buf, "1"))
        {
            printf("暂停 继续!\n");
		    Send_Cmd("pause\n");
        }
        else if (0 == strcmp(buf, "2"))
        {
            printf("音量+\n");
		    Send_Cmd("volume +10\n");
        }
		else if (0 == strcmp(buf, "3"))
        {
            printf("音量-\n");
		    Send_Cmd("volume -10\n");
        }
		else if (0 == strcmp(buf, "4"))
        {
            printf("快进!\n");
			Send_Cmd("seek +10\n");
        }
		else if (0 == strcmp(buf, "5"))
        {
            printf("快退!\n");
			Send_Cmd("seek -10\n");
        }
		else if (0 == strcmp(buf, "6"))
        {
            system("killall -9 mplayer");
			printf("退出视频\n");
            show_bmp("./img1.bmp",0,0,800,480);
            break;
        }
        write(fd, buf, strlen(buf));
        // 清空buf
        bzero(buf, 10);
	}
}
//视频
void video()
{
    system("mplayer -slave -quiet -input file=/fifo -geometry 0:0 -zoom -x 800 -y 400 1.mp4 &");
	sleep(1);
    //show_bmp("13.bmp",0,0,800,480);
    while(1)
    {
        get_xy(&pos_x, &pos_y);
        //判断坐标位置
        if(pos_x>241 && pos_x<440 && pos_y>400 && pos_y<480)
        {
            printf("暂停 继续!\n");
		    Send_Cmd("pause\n");
        }
		if(pos_x>0 && pos_x<120 && pos_y>400 && pos_y<480)
		{
		    printf("音量+\n");
		    Send_Cmd("volume +10\n");
		}
		if(pos_x>121 && pos_x<240 && pos_y>400 && pos_y<480)
		{
		    printf("音量-\n");
		    Send_Cmd("volume -10\n");
		}
		if(pos_x>441 && pos_x<560 && pos_y>400 && pos_y<480)
		{
			printf("快进!\n");
			Send_Cmd("seek +10\n");
		}
		if(pos_x>561 && pos_x<680 && pos_y>400 && pos_y<480)
		{
			printf("快退!\n");
			Send_Cmd("seek -10\n");
		}
		if(pos_x>681 && pos_x<799 && pos_y>400 && pos_y<480)
        {
            system("killall -9 mplayer");
            break;
        }    
    }
}

void guan(){
	if(access("/fifo",F_OK))// 默认管道文件创建在根目录  F_OK:判断是否存在
	{
		//如果没有创建
		mkfifo("/fifo",777); //创建管道文件函数
 
	}
	fd_fifo = open("/fifo",O_RDWR);
	if(fd_fifo == -1)
	{
		printf("创建管道文件失败!\n");
		return -1;
 
	}
}

int Send_Cmd(char *cmd)//写入管道文件
{
	write(fd_fifo,cmd,strlen(cmd));
	
	return 0;
}

三 实物展示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

需要源码和答辩PPT的私信我

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/733913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UNIAPP调用讯飞语音评测API

1、历经千辛万苦&#xff0c;UNIAPP调用评测API终于完成&#xff0c;在此做下总结下&#xff1a;首先看效果&#xff01; 2、实现第1步&#xff0c;首先是鉴权&#xff0c;用到的CryptoJS等工具都可以从讯飞和uniapp官方获取 import * as base64 from "base-64" impo…

redis操作问题

使用redisTemplate 往set集合中批量添加值 # 第一种办法就是for循环&#xff0c;每次进行setfor (int i 0; i < 1000000; i) {redisTemplate.opsForSet().add("key",i);} # 第二中办法就是使用HashSet批量添加数据Set set new HashSet<>();for (int i 1…

mybatisplus生成代码

导包&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>m…

CorelDRAW2023免费版平面设计矢量绘图工具

最初CorelDRAW 被开发运行于Windows版&#xff0c;数年后Macintosh版也随之发布。同时&#xff0c;CorelDRAW曾经存在过Linux的版本&#xff0c;但后来被放弃了。CorelDRAW简称cdr&#xff0c;是一款功能强大的矢量图制作软件&#xff0c;一说到矢量图制作&#xff0c;大家都会…

Go实现socks5服务器

SOCKS5 是一个代理协议&#xff0c;它在使用TCP/IP协议通讯的前端机器和服务器机器之间扮演一个中介角色&#xff0c;使得内部网中的前端机器变得能够访问Internet网中的服务器&#xff0c;或者使通讯更加安全。SOCKS5 服务器通过将前端发来的请求转发给真正的目标服务器&#…

应用层:万维网WWW

1.万维网WWW 笔记来源&#xff1a; 湖科大教书匠&#xff1a;应用层概述 湖科大教书匠&#xff1a;万维网WWW 声明&#xff1a;该学习笔记来自湖科大教书匠&#xff0c;笔记仅做学习参考 浏览器最重要的部分是渲染引擎&#xff0c;也就是浏览器内核。负责对网页内容进行解析和…

【触类旁通】编写代码和写小说的相似性

【触类旁通】编写代码和写小说的相似性 1&#xff0c;序2&#xff0c;对比分析2.1 相同点2.1.1 三要素2.1.2 读者-用户&#xff08;受众&#xff09;2.1.3 目录——功能模块2.1.4 故事情节——框架2.1.5 文笔——编程风格2.1.6 多部作品——多个阶段2.1.7 修辞——设计模式2.1.…

Mycat【Mycat分片规则(取模、分片枚举、范围约定)】(六)-全面详解(学习总结---从入门到深化)

目录 Mycat分片规则_取模 Mycat分片规则_分片枚举 Mycat分片规则_范围约定 Mycat分片规则_取模 实现方式 取模分片就是根据数据表的某一个字段&#xff0c;通常是某一个整数型的字 段&#xff0c;对其进行十进制的求模运算&#xff0c;将运算结果作为Mycat的路由结果。 注…

Element-案例-脚本页面布局

案例需求&#xff1a; 根据页面原型完成员工管理页面开发&#xff0c;并通过Axios完成数据异步加载 步骤 创建页面&#xff0c;完成页面的总体布局规划布局中各个组件的实现列表数据的异步加载&#xff0c;并渲染展示 1.创建页面&#xff0c;完成页面的总体布局规划 分析案…

代码随想录算法训练营第十三天 | 二叉树系列4

二叉树系列4 617 合并二叉树重点代码随想录的代码我的代码(晚上理解后自己编写) 700 二叉搜索树中的搜索未看解答自己编写看了解答后&#xff0c;精简了两个判断的写法重点代码随想录的代码我的代码(晚上理解后自己编写) 98 验证二叉搜索树重点看到二叉搜索树&#xff0c;就要想…

rust 自动化测试、迭代器与闭包、智能指针、无畏并发

编写测试可以让我们的代码在后续迭代过程中不出现功能性缺陷问题&#xff1b;理解迭代器、闭包的函数式编程特性&#xff1b;Box<T>智能指针在堆上存储数据&#xff0c;Rc<T>智能指针开启多所有权模式等&#xff1b;理解并发&#xff0c;如何安全的使用线程&#x…

静态路由实验

目录 第一步&#xff1a; 第二步&#xff1a; 端口IP配置方法 环回接口IP配置方法 第三步&#xff1a; 第四步&#xff1a; 第一步&#xff1a; 先进行子网划分 192.168.1.0 24 子网划分 需要13个广播域 5个网段——子网划分 192.168.1.0 24 192.168.1.000 00000 27 192.…

数据结构一:绪论

一、绪论 数据结构是计算机科学中的一门基础课程&#xff0c;研究数据的存储、组织和管理方法&#xff0c;以及在这些数据上进行各种操作的算法和技术。掌握数据结构和算法是编程中非常重要的基础&#xff0c;对于实现高效、可靠的程序至关重要。常见的数据结构包括数组、链表、…

雅思口语考试时长多少分钟?

雅思口语考试是单独考的&#xff0c;对于第一次考雅思的同学来说&#xff0c;了解雅思考试的时长才能更好的备考雅思&#xff0c;那么雅思口语考试时长多久呢&#xff1f; 一、雅思口语考试时长 雅思口语考试时长一般为11-14分钟 第一段约4-5分钟&#xff0c;会面问候一番&am…

java项目之高校信息资源共享平台(ssm+mysql+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的高校信息资源共享平台。技术交流和部署相关看文末&#xff01; 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java 框架&…

DynaSLAM 2018论文翻译

Dynaslam:动态场景下的跟踪、建图和图像修复 摘要-场景刚性假设是SLAM算法的典型特征。这种强假设限制了大多数视觉SLAM系统在人口稠密的现实环境中的使用&#xff0c;而这些环境是服务机器人或自动驾驶汽车等几个相关应用的目标。 在本文中&#xff0c;我们提出了一个基于ORB…

学习react,复制了一个C站Civitai

苦肝两个多月&#xff0c;终于复制了一个C站&#xff0c;也就是现在最热门的AI绘画社区Civitai。 来看看效果图吧&#xff01; 技术栈介绍 我还是一个菜鸡&#xff0c;所以不像c站那样用了各种技术。 目前只是为了展示数据&#xff0c;我的Civitai简单技术栈如下 前端&…

Java17:IO流

一&#xff1a;File类&#xff1a; 1.File类的理解&#xff1a; 1.File类的一个对象&#xff0c;代表一个文件或一个文件目录&#xff08;俗称&#xff1a;文件夹&#xff09; 2.File类声明在java.io包下 3.File类中涉及到关于文件或文件目录的创建,删除&#xff0c;重命名…

仙境传说RO:添加自定义道具

仙境传说RO&#xff1a;添加自定义道具 大家好&#xff0c;我是艾西今天和大家聊一下仙境传说RO怎么添加自定义道具。在我们开服时加入一些道具模组等往往会让我们的服务器更有特色以及消费点&#xff0c;那么让我们直接进入正题开始操作&#xff1a;&#xff08;此处我们讲的…

k8s集群安装Istio过程记录及问题总结

目录 一、介绍二、部署Helm三、部署Istio部署官方示例 Bookinfo 四、部署KaliBug 记录部署Bookinfo demo失败 一、介绍 这篇文章记录一下k8s集群安装Helm、Istio 和 Kiali&#xff0c;方便学习相关概念。 前提需要k8s集群&#xff1a; 可参考&#xff1a;Arm64架构(MacBookPr…