DIY及创意
直播中

RoachWZ

6年用户 46经验值
私信 关注
[创意DIY]

基于安卓的视频遥控小车——电脑端开发

` 本帖最后由 鬼未景彡马奇士 于 2019-7-21 16:30 编辑

基于安卓的视频遥控小车的电脑端程序采用Java语言编写,Java可以做到一次编译到处运行,因为Java程序是在Java虚拟机中运行的,和平台无关,只要平台上有相应的Java虚拟机。

本设计中安卓手机是客户端,电脑是服务器端。采用ServerSocket类与多线程技术相互配合共同完成服务器端与客户端的程序开发。
Socket通信步骤如下图所示。手机采集到的图像通过Socket一帧一帧发送,电脑通过Socket接收每一帧图像。 图片1.png
电脑端Java程序主要代码
  1. /**
  2. *在服务器开启情况下,启动客户端,创建套接字接收图像
  3. */

  4. public class ImageServerTest {       
  5.     public static ServerSocket ss = null;
  6.    
  7.     public static void main(String args[]) throws Exception,IOException{   
  8.             ss = new ServerSocket(6000);
  9.         
  10.         final ImageFrame frame = new ImageFrame(ss);
  11.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  12.         frame.setVisible(true);
  13.       
  14.         while(true){
  15.                 frame.panel.getimage();
  16.             frame.repaint();
  17.         }        
  18.     }
  19.       
  20. }

建立好连接后,getimage()负责接收手机端传过来的图像,repaint()负责将接收到的图像绘制在窗体组件上。在此使用的是动画播放原理,实时视频是通过电脑窗体一帧一帧播放图片,形成视频动画效果。没有采用主流的视频压缩分包技术,而是选择牺牲画质。摄像头采集到的是最低画质,这样每一帧图像的数据量就小了,延迟也就下去了。
对小车的控制放在另一个线程中,监听按键的状态来判断要发送的命令。
主要代码如下所示
  1. ***.addKeyListener(new KeyAdapter() {
  2.                 ServerSocket ss;
  3.                 boolean sendFlag = false;//设置标志位,按下时只执行一次,不连续发送
  4.                 public void keyPressed(KeyEvent e) {
  5.                         int KeyCode = e.getKeyCode(); // 返回所按键对应的整数值
  6.                         String s = KeyEvent.getKeyText(KeyCode); // 返回按键的字符串描述
  7.                         System.out.print("输入的内容为:" + s + ",");
  8.                         System.out.println("对应的KeyCode为:" + KeyCode);
  9.                         if(!sendFlag) {
  10.                         try{
  11.                                 ss = new ServerSocket(7788);
  12.                                 send(KeyCode);
  13.                                 ss.close();
  14.                                 sendFlag=true;
  15.                         }catch (Exception e1) {

  16.                                 e1.printStackTrace();
  17.                         }
  18.                         }
  19.                        
  20.                 }
  21.                 public void keyReleased(KeyEvent e) {
  22.                         int KeyCode = e.getKeyCode(); // 返回所按键对应的整数值
  23.                         if(KeyCode==87||KeyCode==83||KeyCode==65||KeyCode==68||KeyCode==81||KeyCode==69) {
  24.                                 try {
  25.                                         ss = new ServerSocket(7788);
  26.                                                 stop();
  27.                                                 sendFlag=false;
  28.                                         } catch (Exception e1) {
  29.                                                 e1.printStackTrace();
  30.                                         }
  31.                         }
  32.                 }

  33.                         public void send(int i) throws Exception{
  34.                                         @SuppressWarnings("resource")
  35.                                         ServerSocket serverSocket = ss;//new ServerSocket(7788); // 创建ServerSocket对象
  36.                                         Socket client = serverSocket.accept(); // 调用ServerSocket的accept()方法接收数据
  37.                                         OutputStream os = client.getOutputStream();// 获取客户端的输出流
  38.                                         System.out.println("开始与客户端交互数据");
  39.                                         switch (i) {
  40.                                 case 87:os.write(("01").getBytes());break;//w上
  41.                                 case 83:os.write(("02").getBytes());break;//s下
  42.                                 case 65:os.write(("03").getBytes());break;//a左
  43.                                 case 68:os.write(("04").getBytes());break;//d右
  44.                                         case 81:os.write(("13").getBytes());break;//q左自转
  45.                                         case 69:os.write(("14").getBytes());break;//e右自转
  46.                                         case 49:os.write(("s1").getBytes());break;//速度1
  47.                                         case 50:os.write(("s2").getBytes());break;//速度2
  48.                                         case 51:os.write(("s3").getBytes());break;//速度3
  49.                                         case 52:os.write(("s").getBytes());break;//全速
  50.                                         case 16:os.write(("L").getBytes());break;//shift闪光灯
  51.                                         case 67:os.write(("C").getBytes());break;//c切换摄像头
  52.                                 }                        
  53.                                        
  54.                                         System.out.println("结束与客户端交互数据");
  55.                                         os.close();
  56.                                         client.close();
  57.                         }
  58.                         protected void stop() throws Exception {
  59.                                 ServerSocket serverSocket = ss;// 创建ServerSocket对象
  60.                                 Socket client = serverSocket.accept(); // 调用ServerSocket的accept()方法接收数据
  61.                                 OutputStream os = client.getOutputStream();// 获取客户端的输出流
  62.                                 os.write(("05").getBytes());//停止
  63.                                 os.close();
  64.                                 client.close();
  65.                                 ss.close();
  66.                         }
  67.         });

注意:
运行效果及注意事项.png
此部分源码链接http://www.pudn.com/Download/item/id/3913494.html
对应的小车上的安卓手机程序详见基于安卓的视频遥控小车——车载安卓开发详解

https://bbs.elecfans.com/jishu_1804809_1_1.html



` 1562247661208.gif

回帖(2)

RoachWZ

2019-7-20 10:45:26
本帖最后由 鬼未景彡马奇士 于 2019-7-20 12:47 编辑

醉了,代码多了一堆标签,从新改了,就只剩一行了,希望站主修复修复
举报

RoachWZ

2019-7-22 13:46:18
知道了,因为我直接从我的CSDN上粘贴过来的,所以图片和代码块显示不正确_(xз」∠)_一呆。现在重新上传了,能正常显示了。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分