JAVA小项目(四)—— 贪吃蛇【轻松入门,附源码】

article/2025/10/15 12:05:46

目录

(一)效果图

(二)代码实现

(1)将图片加载到程序中

(2)创建窗体

(3)创建面板

(4)绘制静态的小蛇

(5) 加入监听事件

 (6)让蛇动起来 

(7)绘制食物和吃食物

(8)把游戏打包

💴哈喽,大家好丫,你们的小郭子又来啦 ~

🌞今天我们用java来写一个简单的小项目——【贪吃蛇】,嘿嘿,是不是DNA动了呀🌞🌞

🌞话不多说,直接上干货,

  

(一)效果图

 

(二)代码实现

(1)将图片加载到程序中

现在本程序中创建一个Images包,包中保存需要使用的照片,如图所示

 

/*** Images这个类,专门用来获取游戏中所涉及的图片*/
public class Images {/*现在是面向对象的语言,面向对象的思维--》将图片进行封装 ,封装为一个对象,这样在程序中才可以通过操纵这个对象来操纵图片。*///将图片的路径封装为一个对象:public static URL bodyURL = Images.class.getResource("/images/body.png");//将图片封装为程序中一个对象:public static ImageIcon bodyImg = new ImageIcon(bodyURL);//将图片的路径封装为一个对象:public static URL downURL = Images.class.getResource("/images/down.png");//将图片封装为程序中一个对象:public static ImageIcon downImg = new ImageIcon(downURL);//将图片的路径封装为一个对象:public static URL foodURL = Images.class.getResource("/images/food.png");//将图片封装为程序中一个对象:public static ImageIcon foodImg = new ImageIcon(foodURL);//将图片的路径封装为一个对象:public static URL headerURL = Images.class.getResource("/images/header.png");//将图片封装为程序中一个对象:public static ImageIcon headerImg = new ImageIcon(headerURL);//将图片的路径封装为一个对象:public static URL leftURL = Images.class.getResource("/images/left.png");//将图片封装为程序中一个对象:public static ImageIcon leftImg = new ImageIcon(leftURL);//将图片的路径封装为一个对象:public static URL rightURL = Images.class.getResource("/images/right.png");//将图片封装为程序中一个对象:public static ImageIcon rightImg = new ImageIcon(rightURL);//将图片的路径封装为一个对象:public static URL upURL = Images.class.getResource("/images/up.png");//将图片封装为程序中一个对象:public static ImageIcon upImg = new ImageIcon(upURL);
}
class TestURL {//这是一个main方法,是程序的入口:public static void main(String[] args) {URL url = Images.class.getResource("/");// /指代的就是相对路径,相对/D:/IDEA_workspace/TestJavaSE/out/production/TestSnakeGame/System.out.println(url);}
}

(2)创建窗体

public class StartGame {public static void main(String[] args) {//创建一个窗体:JFrame jf = new JFrame();//给窗体设置一个标题:jf.setTitle("贪吃蛇  by jayden");//设置窗体弹出的坐标,对应窗体的宽高:int width = Toolkit.getDefaultToolkit().getScreenSize().width;int height = Toolkit.getDefaultToolkit().getScreenSize().height;jf.setBounds((width-800)/2,(height-800)/2,800,800);//设置窗体大小不可调节:jf.setResizable(false);//关闭窗口的同时 程序随之关闭:jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//默认情况下窗体是隐藏效果,必须将窗体进行显现:细节--》这个显现方法最好放在最后jf.setVisible(true);}
}

(3)创建面板

public class StartGame {public static void main(String[] args) {//创建一个窗体:JFrame jf = new JFrame();//给窗体设置一个标题:jf.setTitle("贪吃蛇  by jayden");//设置窗体弹出的坐标,对应窗体的宽高:int width = Toolkit.getDefaultToolkit().getScreenSize().width;int height = Toolkit.getDefaultToolkit().getScreenSize().height;jf.setBounds((width-800)/2,(height-800)/2,800,800);//设置窗体大小不可调节:jf.setResizable(false);//关闭窗口的同时 程序随之关闭:jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//默认情况下窗体是隐藏效果,必须将窗体进行显现:细节--》这个显现方法最好放在最后jf.setVisible(true);}
}

(4)绘制静态的小蛇

/*** @author : jayden* GamePanel继承了JPanel以后,才具备面板的功能,才成为一个面板*/
public class GamePanel extends JPanel {//定义两个数组//蛇的长度:int length;//一个数组,专门存储蛇的x轴坐标int[] snakeX = new int[200];//一个数组,专门存储蛇的y轴坐标int[] snakeY = new int[200];//定义蛇的行走方向:String direction ;public void init(){//初始化蛇的长度:length = 3;//初始化蛇头坐标:snakeX[0] = 175;snakeY[0] = 275;//初始化第一节身子坐标:snakeX[1] = 150;snakeY[1] = 275;//初始化第二节身子坐标:snakeX[2] = 125;snakeY[2] = 275;//初始化蛇头的方向:direction = "R"; // U  D  L R}public GamePanel(){init();}/*paintComponent这个方法比较特殊,这个方法就属于图形版的main方法自动调用*/@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);//填充背景颜色:this.setBackground(new Color(208, 221, 227));//画头部图片:/*paintIcon四个参数:this指的是当前面板  g:指的是使用的画笔  x,y对应的坐标*/Images.headerImg.paintIcon(this,g,-10,10);//调解画笔颜色:g.setColor(new Color(219, 226, 219));//画一个矩形:g.fillRect(10,70,770,685);//画小蛇://画蛇头:if("R".equals(direction)){Images.rightImg.paintIcon(this,g,snakeX[0],snakeY[0]);}if("L".equals(direction)){Images.leftImg.paintIcon(this,g,snakeX[0],snakeY[0]);}if("U".equals(direction)){Images.upImg.paintIcon(this,g,snakeX[0],snakeY[0]);}if("D".equals(direction)){Images.downImg.paintIcon(this,g,snakeX[0],snakeY[0]);}/*//画第一节身子:Images.bodyImg.paintIcon(this,g,snakeX[1],snakeY[1]);//画第二节身子:Images.bodyImg.paintIcon(this,g,snakeX[2],snakeY[2]);*///优化为循环画蛇的身子:for(int i = 1;i<length;i++){Images.bodyImg.paintIcon(this,g,snakeX[i],snakeY[i]);}}
}

(5) 加入监听事件

/*** @author : jayden* GamePanel继承了JPanel以后,才具备面板的功能,才成为一个面板*/
public class GamePanel extends JPanel {//定义两个数组//蛇的长度:int length;//一个数组,专门存储蛇的x轴坐标int[] snakeX = new int[200];//一个数组,专门存储蛇的y轴坐标int[] snakeY = new int[200];//游戏只有两个状态,开始,暂停:boolean isStart = false;//默认游戏是暂停效果//定义蛇的行走方向:String direction ;public void init(){//初始化蛇的长度:length = 3;//初始化蛇头坐标:snakeX[0] = 175;snakeY[0] = 275;//初始化第一节身子坐标:snakeX[1] = 150;snakeY[1] = 275;//初始化第二节身子坐标:snakeX[2] = 125;snakeY[2] = 275;//初始化蛇头的方向:direction = "R"; // U  D  L R}public GamePanel(){init();//将焦点定位在当前操作的面板上:this.setFocusable(true);//加入监听:this.addKeyListener(new KeyAdapter(){@Overridepublic void keyPressed(KeyEvent e) {//监听键盘按键的按下操作super.keyPressed(e);int keyCode = e.getKeyCode();System.out.println(keyCode);if(keyCode == 32){isStart = !isStart;//监听到空格以后,游戏开始的就变成暂停的,暂停的就变成开始的repaint();//重绘动作,重新调用paintComponent()方法}}});}/*paintComponent这个方法比较特殊,这个方法就属于图形版的main方法自动调用*/@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);//填充背景颜色:this.setBackground(new Color(208, 221, 227));//画头部图片:/*paintIcon四个参数:this指的是当前面板  g:指的是使用的画笔  x,y对应的坐标*/Images.headerImg.paintIcon(this,g,-10,10);//调解画笔颜色:g.setColor(new Color(219, 226, 219));//画一个矩形:g.fillRect(10,70,770,685);//画小蛇://画蛇头:if("R".equals(direction)){Images.rightImg.paintIcon(this,g,snakeX[0],snakeY[0]);}if("L".equals(direction)){Images.leftImg.paintIcon(this,g,snakeX[0],snakeY[0]);}if("U".equals(direction)){Images.upImg.paintIcon(this,g,snakeX[0],snakeY[0]);}if("D".equals(direction)){Images.downImg.paintIcon(this,g,snakeX[0],snakeY[0]);}/*//画第一节身子:Images.bodyImg.paintIcon(this,g,snakeX[1],snakeY[1]);//画第二节身子:Images.bodyImg.paintIcon(this,g,snakeX[2],snakeY[2]);*///优化为循环画蛇的身子:for(int i = 1;i<length;i++){Images.bodyImg.paintIcon(this,g,snakeX[i],snakeY[i]);}//如果游戏暂停的,界面中间就应该有一句提示语:if(isStart == false){//画一个文字:g.setColor(new Color(114, 98, 255));//三个参数:字体,加粗,字号g.setFont(new Font("微软雅黑",Font.BOLD,40));//画文字:三个参数:文字内容,x轴坐标,y轴坐标g.drawString("点击空格开始游戏",250,330);}}
}

 (6)让蛇动起来 

public class GamePanel extends JPanel {//定义两个数组//蛇的长度:int length;//一个数组,专门存储蛇的x轴坐标int[] snakeX = new int[200];//一个数组,专门存储蛇的y轴坐标int[] snakeY = new int[200];//游戏只有两个状态,开始,暂停:boolean isStart = false;//默认游戏是暂停效果//加入一个定时器:Timer timer;//定义蛇的行走方向:String direction ;public void init(){//初始化蛇的长度:length = 3;//初始化蛇头坐标:snakeX[0] = 175;snakeY[0] = 275;//初始化第一节身子坐标:snakeX[1] = 150;snakeY[1] = 275;//初始化第二节身子坐标:snakeX[2] = 125;snakeY[2] = 275;//初始化蛇头的方向:direction = "R"; // U  D  L R}public GamePanel(){init();//将焦点定位在当前操作的面板上:this.setFocusable(true);//加入监听:this.addKeyListener(new KeyAdapter(){@Overridepublic void keyPressed(KeyEvent e) {//监听键盘按键的按下操作super.keyPressed(e);int keyCode = e.getKeyCode();System.out.println(keyCode);if(keyCode == 32){isStart = !isStart;//监听到空格以后,游戏开始的就变成暂停的,暂停的就变成开始的repaint();//重绘动作,重新调用paintComponent()方法}}});//对定时器进行初始化动作:timer = new Timer(150, new ActionListener() {/*ActionListener是 事件监听相当于每100ms监听一下你是否发生了一个动作具体的动作放入actionPerformed*/@Overridepublic void actionPerformed(ActionEvent e) {if(isStart){//游戏是开始状态的时候,蛇才动://后一节身子走到前一节身子的位置上:for(int i=length-1;i>0;i--){snakeX[i] = snakeX[i-1];snakeY[i] = snakeY[i-1];}//动头:snakeX[0] += 25;//防止蛇超出边界:if(snakeX[0]>750){snakeX[0] = 25;}repaint();//重绘}}});//定时器必须要启动:timer.start();}/*paintComponent这个方法比较特殊,这个方法就属于图形版的main方法自动调用*/@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);//填充背景颜色:this.setBackground(new Color(208, 221, 227));//画头部图片:/*paintIcon四个参数:this指的是当前面板  g:指的是使用的画笔  x,y对应的坐标*/Images.headerImg.paintIcon(this,g,-10,10);//调解画笔颜色:g.setColor(new Color(219, 226, 219));//画一个矩形:g.fillRect(10,70,770,685);//画小蛇://画蛇头:if("R".equals(direction)){Images.rightImg.paintIcon(this,g,snakeX[0],snakeY[0]);}if("L".equals(direction)){Images.leftImg.paintIcon(this,g,snakeX[0],snakeY[0]);}if("U".equals(direction)){Images.upImg.paintIcon(this,g,snakeX[0],snakeY[0]);}if("D".equals(direction)){Images.downImg.paintIcon(this,g,snakeX[0],snakeY[0]);}/*//画第一节身子:Images.bodyImg.paintIcon(this,g,snakeX[1],snakeY[1]);//画第二节身子:Images.bodyImg.paintIcon(this,g,snakeX[2],snakeY[2]);*///优化为循环画蛇的身子:for(int i = 1;i<length;i++){Images.bodyImg.paintIcon(this,g,snakeX[i],snakeY[i]);}//如果游戏暂停的,界面中间就应该有一句提示语:if(isStart == false){//画一个文字:g.setColor(new Color(114, 98, 255));//三个参数:字体,加粗,字号g.setFont(new Font("微软雅黑",Font.BOLD,40));//画文字:三个参数:文字内容,x轴坐标,y轴坐标g.drawString("点击空格开始游戏",250,330);}}
}

(7)绘制食物和吃食物

public class GamePanel extends JPanel {//定义两个数组//蛇的长度:int length;//一个数组,专门存储蛇的x轴坐标int[] snakeX = new int[200];//一个数组,专门存储蛇的y轴坐标int[] snakeY = new int[200];//游戏只有两个状态,开始,暂停:boolean isStart = false;//默认游戏是暂停效果//加入一个定时器:Timer timer;//定义蛇的行走方向:String direction ;//定义食物的x,y轴坐标:int foodX;int foodY;//定义一个积分:int score;//加入一个变量,判断小蛇的死亡状态:boolean isDie = false;//默认情况下小蛇没有死亡public void init(){//初始化蛇的长度:length = 3;//初始化蛇头坐标:snakeX[0] = 175;snakeY[0] = 275;//初始化第一节身子坐标:snakeX[1] = 150;snakeY[1] = 275;//初始化第二节身子坐标:snakeX[2] = 125;snakeY[2] = 275;//初始化食物的坐标:foodX = 300;foodY = 200;//初始化蛇头的方向:direction = "R"; // U  D  L R}public GamePanel(){init();//将焦点定位在当前操作的面板上:this.setFocusable(true);//加入监听:this.addKeyListener(new KeyAdapter(){@Overridepublic void keyPressed(KeyEvent e) {//监听键盘按键的按下操作super.keyPressed(e);int keyCode = e.getKeyCode();System.out.println(keyCode);if(keyCode == 32){
//                    isStart = !isStart;//监听到空格以后,游戏开始的就变成暂停的,暂停的就变成开始的
//                    repaint();//重绘动作,重新调用paintComponent()方法if(isDie){//全部恢复到初始化状态init();isDie = false;}else{//小蛇没有死亡的情况下:isStart = !isStart;repaint();//重绘动作}}//监听向上箭头:if(keyCode == KeyEvent.VK_UP){direction = "U";}//监听向下箭头:if(keyCode == KeyEvent.VK_DOWN){direction = "D";}//监听向左箭头:if(keyCode == KeyEvent.VK_LEFT){direction = "L";}//监听向右箭头:if(keyCode == KeyEvent.VK_RIGHT){direction = "R";}}});//对定时器进行初始化动作:timer = new Timer(150, new ActionListener() {/*ActionListener是 事件监听相当于每100ms监听一下你是否发生了一个动作具体的动作放入actionPerformed*/@Overridepublic void actionPerformed(ActionEvent e) {if(isStart&&isDie == false){//游戏是开始状态的时候,蛇才动://后一节身子走到前一节身子的位置上:for(int i=length-1;i>0;i--){snakeX[i] = snakeX[i-1];snakeY[i] = snakeY[i-1];}//动头:if("R".equals(direction)){snakeX[0] += 25;}if("L".equals(direction)){snakeX[0] -= 25;}if("U".equals(direction)){snakeY[0] -= 25;}if("D".equals(direction)){snakeY[0] += 25;}//防止蛇超出边界:if(snakeX[0]>750){snakeX[0] = 25;}if(snakeX[0]<25){snakeX[0] = 750;}if(snakeY[0]<100){snakeY[0] = 725;}if(snakeY[0]>725){snakeY[0] = 100;}//防止蛇超出边界:if(snakeX[0]>750){snakeX[0] = 25;}//检测碰撞的动作://食物的坐标和蛇头的坐标一样的时候,才是碰撞了if(snakeX[0] == foodX&&snakeY[0] == foodY){//蛇长度加1:length++;//吃上食物以后 积分加10分:score += 10;//食物坐标改变:随机生成坐标 --》细节:坐标必须是25的倍数/*[25,750] -> [1,30]*25[1,30]Math.random() -> [0.0,1.0)Math.random()*30 -> [0.0,30.0)(int)(Math.random()*30) -> [0,29](int)(Math.random()*30)+1 -> [1,30]*/foodX = ((int)(Math.random()*30)+1)*25;//[25,750]/*[100,725] -> [4,29]*25[4,29]->[0,25]+4[0,25]new Random().nextInt(26) -> [0,26) ->[0,25]*/foodY = (new Random().nextInt(26)+4)*25;//[100,725]}//死亡判定:蛇头和任意一节身子碰撞都是死亡:for(int i = 1;i<length;i++){if(snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]){//将死亡 状态改为:trueisDie = true;}}repaint();//重绘}}});//定时器必须要启动:timer.start();}/*paintComponent这个方法比较特殊,这个方法就属于图形版的main方法自动调用*/@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);//填充背景颜色:this.setBackground(new Color(208, 221, 227));//画头部图片:/*paintIcon四个参数:this指的是当前面板  g:指的是使用的画笔  x,y对应的坐标*/Images.headerImg.paintIcon(this,g,-10,10);//调解画笔颜色:g.setColor(new Color(219, 226, 219));//画一个矩形:g.fillRect(10,70,770,685);//画小蛇://画蛇头:if("R".equals(direction)){Images.rightImg.paintIcon(this,g,snakeX[0],snakeY[0]);}if("L".equals(direction)){Images.leftImg.paintIcon(this,g,snakeX[0],snakeY[0]);}if("U".equals(direction)){Images.upImg.paintIcon(this,g,snakeX[0],snakeY[0]);}if("D".equals(direction)){Images.downImg.paintIcon(this,g,snakeX[0],snakeY[0]);}/*//画第一节身子:Images.bodyImg.paintIcon(this,g,snakeX[1],snakeY[1]);//画第二节身子:Images.bodyImg.paintIcon(this,g,snakeX[2],snakeY[2]);*///优化为循环画蛇的身子:for(int i = 1;i<length;i++){Images.bodyImg.paintIcon(this,g,snakeX[i],snakeY[i]);}//如果游戏暂停的,界面中间就应该有一句提示语:if(isStart == false){//画一个文字:g.setColor(new Color(114, 98, 255));//三个参数:字体,加粗,字号g.setFont(new Font("微软雅黑",Font.BOLD,40));//画文字:三个参数:文字内容,x轴坐标,y轴坐标g.drawString("点击空格开始游戏",250,330);}//画食物:Images.foodImg.paintIcon(this,g,foodX,foodY);//画积分:g.setColor(new Color(255, 248, 248));g.setFont(new Font("微软雅黑",Font.BOLD,20));g.drawString("积分:"+score,670,45);//画入死亡状态:if(isDie){g.setColor(new Color(255, 82, 68));g.setFont(new Font("微软雅黑",Font.BOLD,20));g.drawString("小蛇死亡,游戏停止,按下空格重新开始游戏",200,330);}}
}

(8)把游戏打包

 

 

 

 

     

好啦,今天的分享到这里就结束啦 ~🌞🌞

 觉得我分享的文章不错的话,可以关注一下哦,嘻嘻嘻🌞🌞

  


http://chatgpt.dhexx.cn/article/fIcmB8TH.shtml

相关文章

Java贪吃蛇大作战

作为Java新手小白&#xff0c;渴望学习一些好玩有趣的java程序 废话不多说&#xff0c;接下来我会一步一步实现java小程序&#xff1a;贪吃蛇大作战哦&#xff01; 实现 Java贪吃蛇一共分四个步骤&#xff1a; 1、画出窗体对象 2、绘制静态ui 3、使用鼠标监听器事件和定时器事…

Java简易小游戏贪吃蛇(Java实战)

这个版本的贪吃蛇我是跟着“黑马程序员”写的。小伙伴们可以跟着视频试着做一下&#xff0c;同时视频也会更详细。 B站学习链接&#xff1a;【黑马】两个小时带你用Java语言写一个贪吃蛇游戏【配套源码笔记】_哔哩哔哩_bilibili 相对于新手而言&#xff0c;贪吃蛇应该算是一个…

JAVA实现贪吃蛇游戏

本文实现的功能有: 1.绘制静态窗口 2.绘制游戏面板 3.绘制静态小蛇 4.通过键盘控制小蛇移动 5.吃食物 6.积分系统和失败判定 最近在学GUI&#xff0c;然后又有读者希望我写一下相关的实战。刚好博主在b站漫无目的的寻找着题材的时候看到了一个写贪吃蛇游戏的视频&#xff0c;于…

Java实现贪吃蛇大作战小游戏(完整版)

大家好&#xff0c;今天尝试用swing技术写一个贪吃蛇大作战小游戏&#xff0c;供大家参考。 效果展示 目录 效果展示 一、游戏界面 二、得分情况 项目介绍 项目背景 总体需求 实现过程 代码展示 主类 &#xff1a;Demo类 MyPanel类 ①构造方法 ②初始化方法 ③绘制方法…

用java写一个贪吃蛇小游戏(源码在最后)

一、引入 涉及技能&#xff1a; 循环、分支方法的抽取数组的使用面向对象继承&#xff0c;子类方法的重写接口&#xff0c;接口的实现GUI&#xff08;图像化界面编程&#xff09; GUI中的组件&#xff1a; 7.1 窗口 7.2 弹窗 7.3 面板 7.4 文本框 7.5 列表框 7.6 按钮 7.7 图…

安卓蓝牙开发总结(一)—蓝牙开启与关闭

蓝牙开启与关闭 1、引言2、布局文件3、蓝牙打开与关闭  3.1 通过对按钮监听方法  3.2 通过设置点击事件 4、结果展示及总结5、参考链接 1、引言 最近在学习如何在安卓手机上对蓝牙进行操控&#xff0c;作为初学者发现大多数博客对安卓开发的初学者极为不友好&#xff0c;特…

【Bluetooth|蓝牙开发】二、蓝牙开发入门

个人主页&#xff1a;董哥聊技术 我是董哥&#xff0c;嵌入式领域新星创作者 创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01; 【所有文章汇总】 1、蓝牙基础概念 蓝牙&#xff0c;是一种利用低功率无线电&#xff0c;支持设备短距离…

nimble 蓝牙开发一:BLE 蓝牙 Host 规范概述

目录 nimble 蓝牙开发一&#xff1a;概述一、BLE 简介二、BLE 基础知识蓝牙设备地址BLE 广播类型标准广播数据 三、BLE 工作概述BLE 常见的操作有&#xff1a;BLE 常见的工作流程&#xff1a; 四、BLE 使用的协议规范GAP1. GAP 工作角色2. GAP 工作模式3. GAP 工作流程4. GAP 工…

ESP32 蓝牙开发

1. 低功耗蓝牙&#xff08;BLE&#xff09;协议栈 低功耗蓝牙协议是蓝牙通信协议的一种&#xff0c;BLE协议栈就是实现低功耗蓝牙协议的代码 1.1 层次协议 蓝牙协议规定了两个层次的协议&#xff0c;分别为蓝牙核心协议&#xff08;Bluetooth Core&#xff09;和蓝牙应用层协…

Android蓝牙开发 — 经典蓝牙BLE蓝牙

一&#xff0c;前期基础知识储备 1&#xff09;蓝牙是一种支持设备之间短距离通信的无线电技术&#xff08;其他还包括红外&#xff0c;WIFI&#xff09;&#xff1b; 支持移动电话、笔记本电脑、无线耳机等设备之间进行信息的交换&#xff1b; Android支持的蓝牙协议栈&…

Android 蓝牙开发——概述(一)

一、蓝牙简介 蓝牙技术是一种无线数据和语音通信开放的全球规范,它是基于低成本的近距离无线连接,为固定和移动设备建立通信环境的一种特殊的近距离无线技术连接。 其中将1.x~3.0之间的版本称之为经典蓝牙,4.x开始的蓝牙称之为低功耗蓝牙,也就是蓝牙BLE。 1、蓝牙协议介绍…

低功耗蓝牙开发入门概念科普

一、概述 1、缘起 低功耗蓝牙起源于Bluetooth4.0版本&#xff0c;至今已发展到5.3 4.0 bluetooth low enerngy 这个阶段低功耗蓝牙的基础框架已经稳定成型&#xff0c;后面版本主要退出新特性和扩展特性&#xff0c;同时保证和4.0的原生兼容性 4.1 multi role&#xff08;主从…

ESP32开发三_蓝牙开发

蓝牙开发 交流QQ: 1048272975 QQ交流群: 636564526 蓝牙是一种不断创新发展的无线通信技术标准&#xff0c;采用了2.4G ISM频段&#xff0c;在音频传输、数据传输、位置服务、设备组网这些场景有着广泛的应用。 1. 蓝牙概述 蓝牙技术分经典蓝牙(Classic BT)和低…

iOS 蓝牙开发实现文件传输

这是一篇旧文&#xff0c;三年前就写过了&#xff0c;一直没有时间分享出来&#xff0c;最近简单整理了下&#xff0c;希望能帮到有需要的人。   由于我这里没有相关的蓝牙设备&#xff0c;主要用了两个手机&#xff0c;一个作为主设备&#xff0c;一个做为从设备。另外进行蓝…

Android经典蓝牙开发全流程

一、基本介绍 所谓蓝牙(Bluetooth)技术&#xff0c;实际上是一种短距离无线电技术&#xff0c;最初是由爱立信公司公司发明的。技术始于爱立信公司 1994 方案&#xff0c;它是研究在移动电话和其他配件间进行低功耗、低成本无线通信连接的方法。发明者希望为设备间的通讯创造一…

Android - 蓝牙开发

文章目录 科普SIG类型制式选择逻辑链路控制适配协议 (L2CAP)L2CAP的功能 蓝牙框架和 RFCOMM 协议蓝牙安全白名单机制 编程蓝牙权限Classic BluetoothBluetooth Low Energy术语角色 & 职能查找 BLE 设备连接设备上的 GATT 服务器绑定服务蓝牙设置连接到设备连接到 GATT 服务…

Android 蓝牙开发 uuid,Android蓝牙开发之 UUID

UUID&#xff1a;全球唯一标识符 在蓝牙中&#xff0c;每个Service和Characteristic都唯一地由"全球唯一标识符" (UUID)来校验&#xff0c;主要是保证他们的唯一性。 UUID可分为&#xff1a;16位、32位、128 位UUID Bluetooth_Base_UUID&#xff1a;蓝牙UUID基数 UUI…

Android 低功耗蓝牙开发简述

低功耗蓝牙简述 一、什么是低功耗蓝牙&#xff1f;二、怎么做低功耗蓝牙应用&#xff1f;① 之前有没有接触Android蓝牙开发&#xff1f;② 蓝牙设备固件是公司自己的吗&#xff1f;③ 有没有蓝牙固件和蓝牙应用的文档和Demo&#xff1f;④ 具体的业务功能需求明确吗&#xff1…

Android蓝牙开发

题引&#xff1a; 最近项目上涉及与硬件相关的功能&#xff0c;需要通过蓝牙进行消息收发。项目已完成&#xff0c;这里做下记录。 通信步骤&#xff1a; 1.初始化BluetoothAdapter.getDefaultAdapter()获取BluetoothAdapter对象 2.判断蓝牙是否开启bluetoothAdapter.isEnab…

【Android】蓝牙开发——BLE(低功耗蓝牙)(附完整Demo)

目录 目录 前言 一、相关概念介绍 二、实战开发 三、项目演示 四、Demo案例源码地址 五、更新记录 1、2020/12/29 &#xff1a;修改 setupService()中错误 2、2021/05/14 &#xff1a;更新连接方法&#xff08;解决部分蓝牙设备连接失败的问题&#xff09; 3、2022/1…