在把手機變成電腦的移動觸控板 (一)里,介紹了手機通過socket 連接控制電腦的實現(xiàn)。那篇里寫到了通過組播來使手機和電腦互相自動發(fā)現(xiàn),本篇介紹另一種連接方式:通過手機掃描二維碼的方式連接。
基本想法
因為上篇介紹過,手機要連接電腦,必須先知道電腦的ip,所以,這里的想法是:電腦端(server)程序獲取自己的ip,把ip編碼生成一個二維碼并顯示在屏幕上;手機端(client)掃描這個二維碼得到電腦的ip,然后建立socket連接,剩余的控制部分同上篇。
實現(xiàn)
Server
server和client都是使用** zxing **的庫。server端由java實現(xiàn),因為上一篇介紹時,只有組播一種連接方式,現(xiàn)在新增一種二維碼掃描的方式,所以定義了連接模式:
// 連接模式
private enum Mode {
DISCOVERY, // 自動發(fā)現(xiàn)模式
QR_SCAN // 掃描連接模式
}
在server端程序線程的run方法其實時判斷連接模式:
if (mMode == Mode.DISCOVERY) {
try {
// 自動發(fā)現(xiàn)模式,等待client發(fā)來組播
waitForClientWave(MULTI_CAST_ADDR, LOCAL_UDP_PORT);
} catch (IOException e1) {
e1.printStackTrace();
}
} else {
// 掃描模式,生成并顯示二維碼圖案
generateAndShowQRCode();
}
二維碼的生成也是使用** zxing *,參考這個鏈接,稍作了修改。 createQRImage() *方法返回一個java.awt.image.BufferedImage 對象,用于界面顯示。界面代碼如下:
package com.mobcontrol.server.ui;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class UIFrame extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1831203428568086441L;
public void showImage(BufferedImage image) {
if (image == null) {
return;
}
this.setTitle("Mobile Control");
this.setSize((int)(image.getWidth() * 1.5f), (int)(image.getHeight() * 1.5f));
this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
JLabel jLabel = new JLabel(new ImageIcon(image));
JPanel jPanel = new JPanel();
jPanel.add(jLabel);
this.add(jPanel);
this.setVisible(true);
}
}
到此,server已經(jīng)完成了生成并顯示二維碼的工作。
Client
手機端使用了** journeyapps **的這個庫,是在zxing庫基礎(chǔ)之上的一次封裝,封裝成一個Android library project,可以在Android studio里面作為module引用。
都是開源的代碼,我只是拿過來用了,就不多介紹了??傊畳呙瓒S碼解析得到其中的ip后就可以創(chuàng)建socket連接電腦了。
完畢,謝謝觀賞