`
本帖最后由 鬼未景彡马奇士 于 2019-7-21 16:30 编辑
基于安卓的视频遥控小车的电脑端程序采用Java语言编写,Java可以做到一次编译到处运行,因为Java程序是在Java虚拟机中运行的,和平台无关,只要平台上有相应的Java虚拟机。
本设计中安卓
手机是客户端,电脑是服务器端。采用ServerSocket类与多线程技术相互配合共同完成服务器端与客户端的程序开发。
Socket
通信步骤如下图所示。手机采集到的图像通过Socket一帧一帧发送,电脑通过Socket接收每一帧图像。
电脑端Java程序主要代码
- /**
- *在服务器开启情况下,启动客户端,创建套接字接收图像
- */
- public class ImageServerTest {
- public static ServerSocket ss = null;
-
- public static void main(String args[]) throws Exception,IOException{
- ss = new ServerSocket(6000);
-
- final ImageFrame frame = new ImageFrame(ss);
- frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- frame.setVisible(true);
-
- while(true){
- frame.panel.getimage();
- frame.repaint();
- }
- }
-
- }
建立好连接后,getimage()负责接收手机端传过来的图像,repaint()负责将接收到的图像绘制在窗体组件上。在此使用的是动画播放原理,实时视频是通过电脑窗体一帧一帧播放图片,形成视频动画效果。没有采用主流的视频压缩分包技术,而是选择牺牲画质。摄像头采集到的是最低画质,这样每一帧图像的数据量就小了,延迟也就下去了。
对小车的控制放在另一个线程中,监听按键的状态来判断要发送的命令。
主要代码如下所示
- ***.addKeyListener(new KeyAdapter() {
- ServerSocket ss;
- boolean sendFlag = false;//设置标志位,按下时只执行一次,不连续发送
- public void keyPressed(KeyEvent e) {
- int KeyCode = e.getKeyCode(); // 返回所按键对应的整数值
- String s = KeyEvent.getKeyText(KeyCode); // 返回按键的字符串描述
- System.out.print("输入的内容为:" + s + ",");
- System.out.println("对应的KeyCode为:" + KeyCode);
- if(!sendFlag) {
- try{
- ss = new ServerSocket(7788);
- send(KeyCode);
- ss.close();
- sendFlag=true;
- }catch (Exception e1) {
- e1.printStackTrace();
- }
- }
-
- }
- public void keyReleased(KeyEvent e) {
- int KeyCode = e.getKeyCode(); // 返回所按键对应的整数值
- if(KeyCode==87||KeyCode==83||KeyCode==65||KeyCode==68||KeyCode==81||KeyCode==69) {
- try {
- ss = new ServerSocket(7788);
- stop();
- sendFlag=false;
- } catch (Exception e1) {
- e1.printStackTrace();
- }
- }
- }
- public void send(int i) throws Exception{
- @SuppressWarnings("resource")
- ServerSocket serverSocket = ss;//new ServerSocket(7788); // 创建ServerSocket对象
- Socket client = serverSocket.accept(); // 调用ServerSocket的accept()方法接收数据
- OutputStream os = client.getOutputStream();// 获取客户端的输出流
- System.out.println("开始与客户端交互数据");
- switch (i) {
- case 87:os.write(("01").getBytes());break;//w上
- case 83:os.write(("02").getBytes());break;//s下
- case 65:os.write(("03").getBytes());break;//a左
- case 68:os.write(("04").getBytes());break;//d右
- case 81:os.write(("13").getBytes());break;//q左自转
- case 69:os.write(("14").getBytes());break;//e右自转
- case 49:os.write(("s1").getBytes());break;//速度1
- case 50:os.write(("s2").getBytes());break;//速度2
- case 51:os.write(("s3").getBytes());break;//速度3
- case 52:os.write(("s").getBytes());break;//全速
- case 16:os.write(("L").getBytes());break;//shift闪光灯
- case 67:os.write(("C").getBytes());break;//c切换摄像头
- }
-
- System.out.println("结束与客户端交互数据");
- os.close();
- client.close();
- }
- protected void stop() throws Exception {
- ServerSocket serverSocket = ss;// 创建ServerSocket对象
- Socket client = serverSocket.accept(); // 调用ServerSocket的accept()方法接收数据
- OutputStream os = client.getOutputStream();// 获取客户端的输出流
- os.write(("05").getBytes());//停止
- os.close();
- client.close();
- ss.close();
- }
- });
注意:
此部分源码链接http://www.pudn.com/Download/item/id/3913494.html
对应的小车上的安卓手机程序详见基于安卓的视频遥控小车——车载安卓开发详解
https://bbs.elecfans.com/jishu_1804809_1_1.html
`