Android WIFI調試助手源碼分析

**WIFI調試助手源碼(支持十六進制和ACSII發送與接收)

客戶端(我自己修改的工程文件,支持十六制的接收與發送,主要是通信協議,代碼簡單,可輕鬆改造爲上位機)

在這裏插入圖片描述
**
分爲操作分析和代碼分析。
1.代碼分析:
代碼1獲取連接熱點的IP地址,然後寫入:(這個代碼之後添加的,用戶可自行復制粘貼)

 WifiManager wifiManager = (WifiManager) getApplicationContext(). getSystemService(Context.WIFI_SERVICE);//定義服務器
        DhcpInfo dhcpInfo = wifiManager.getDhcpInfo();//獲取服務器信息
        String IP = Formatter.formatIpAddress(dhcpInfo.gateway);//獲取服務器IP
        edtIP = (EditText) this.findViewById(R.id.id_edt_inputIP);
        edtIP.setText(IP+"");//

代碼2.建立連接

 //建立連接按鈕的線程
    private void connectThread() {
        if (!isConnected) {
            new Thread(new Runnable() {
                public void run() {
                    Looper.prepare();
                    Log.i(tag, "---->> connect/close server!");
                    connectServer(edtIP.getText().toString(), edtPort.getText()//獲取輸入框的IP和端口號
                            .toString());
                    isConnected=true;
                }
            }).start();
        } else {
            try {
                if (mSocket != null) {
                    mSocket.close();
                    mSocket = null;
                    Log.i(tag, "--->>重新連server.");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            btnConn.setText("斷開連接");
            edtIP.setEnabled(true);
            edtPort.setEnabled(true);
            isConnected = false;
        }
    }



    //與服務器連接
    private void connectServer(String ip, String port) {
        try {
            Log.e(tag, "--->>start connect  server !" + ip + "," + port);

            mSocket = new Socket(ip, Integer.parseInt(port));
            Log.e(tag, "--->>end connect  server!");

            OutputStream outputStream = mSocket.getOutputStream();

            printWriter = new PrintWriter(new BufferedWriter(
                    new OutputStreamWriter(outputStream,
                            Charset.forName("gb2312"))));

            in = mSocket.getInputStream();
            myHandler.sendEmptyMessage(2);

            showInfo("連接服務器成功");
        } catch (Exception e) {
            isConnected = false;
            showInfo("連接服務器失敗");
            Log.e(tag, "exception:" + e.toString());
        }

    }

代碼3.十六進制與ACSII的切換

  case R.id.buttonfasong:
                if (sendon.getText().equals("16進制發送")) {
                    sendon.setText("HEX發送");
                }
                else {
                    sendon.setText("16進制發送");
                }
                break;
            case R.id.buttonjieshou:
                if (receiveon.getText().equals("16進制接收")) {
                    receiveon.setText("HEX接收");
                }
                else {
                    receiveon.setText("16進制接收");
                }
                break;

代碼4.十六進制接收於發送代碼(難點,也是開發中最重要的,這裏主要參考藍牙十六進制而改的)

 private String getHexString() {
        String s = edtSend.getText().toString();
        StringBuilder sb = new StringBuilder();
        for ( i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (('0' <= c && c <= '9') || ('a' <= c && c <= 'f') ||
                    ('A' <= c && c <= 'F')) {
                sb.append(c);
            }
        }
        if ((sb.length() % 2) != 0) {
            sb.deleteCharAt(sb.length());
        }
        return sb.toString();
    }

    private byte[] stringToBytes(String s) {
        byte[] buf = new byte[s.length() / 2];
        for (int i = 0; i < buf.length; i++) {
            try {
                buf[i] = (byte) Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16);
            } catch (NumberFormatException e) {
                e.printStackTrace();
            }

        }
        return buf;
    }
    public String bytesToString(byte[] bytes) {
        try {
            final char[] hexArray = "0123456789ABCDEF".toCharArray();
            char[] hexChars = new char[bytes.length * 2];
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < bytes.length; i++) {
                int v = bytes[i] & 0xFF;
                hexChars[i * 2] = hexArray[v >>> 4];
                hexChars[i * 2 + 1] = hexArray[v & 0x0F];

                sb.append(hexChars[i * 2]);
                sb.append(hexChars[i * 2 + 1]);
                sb.append(' ');
            }

            return sb.toString();
        }catch (Exception e) {
            Log.e(tag, "--->> send failure!" + e.toString());

        }
        return null;
    }
    public String asciiToString(byte[] bytes) {
        char[] buf = new char[bytes.length];
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < buf.length; i++) {
            buf[i] = (char) bytes[i];
            sb.append(buf[i]);
        }
        return sb.toString();
    }

剩下的都是Button textview 的聲明瞭。
操作分析如下:
1.PC端測試
1.PC連接手機的熱點:

2.PC上輸入cmd指令:
在這裏插入圖片描述
2.接着輸入ipconfig 查看網絡信息
在這裏插入圖片描述
3.找WiFi的網絡 192.168.43.161
在這裏插入圖片描述
4.點擊窗口調試工具
在這裏插入圖片描述
5,配置參數
在這裏插入圖片描述
5.試驗如下
在這裏插入圖片描述
2.ESP8266 測試
1.AT+RST (復位)
2.AT+CWMODE=2 (服務器模式)
3.AT+CWSAP=“traffic”,“12345678”,11,0(“名字和密碼”)
4.AT+CWMODE=2(傳輸模式)
5.AT+CIPMUX=1
6.AT+CIPSERVER=1,9999 (9999爲端口號)
7.AT+CIFSR (查看ip)
8.AT+CIPSEND=1,6(0表示客戶端的地址,也可是其他數,主要看客戶端的數目;6表6個字節)
手機連接這個熱點,使用代碼1,獲取IP地址,再填入端口號就能使用了。

Android WIFI調試助手源碼,希望大家能支持一下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章