一、應用場景
在做嵌入式開發中,比如我們通過開發板控制電機從而驅動小車前進和轉向,希望能通過手機安卓app控制小車,這時我們可以引入安卓的Socket編程,
實作思路:假設小車前進和轉向的訊息獲取是經過串口通信完成的,要實作安卓app的控制,可以先在開發板上開啟socket服務端,當在安卓app界面上點擊按鈕時,按鈕實作客戶端的創建并與服務端建立連接,客戶端對服務端發送訊息,這時,服務端接收訊息后,剩下的步驟便可由串口通信完成,
二、界面簡單布局代碼
activity_main.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<Button
android:id="@+id/button1"
android:layout_centerHorizontal="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="70dp"
android:onClick="ButtonHandler"
android:text="前進" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/button1"
android:layout_below="@+id/button1"
android:layout_marginTop="50dp"
android:onClick="ButtonHandler"
android:text="后退" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/button1"
android:layout_toLeftOf="@+id/button1"
android:layout_marginRight="10dp"
android:onClick="ButtonHandler"
android:text="左轉" />
<Button
android:id="@+id/button4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/button1"
android:layout_toRightOf="@+id/button1"
android:layout_marginLeft="10dp"
android:onClick="ButtonHandler"
android:text="右轉" />
</RelativeLayout>
界面布局如下:

三、Socket服務端
安卓的Socket服務端是基于java的Socket編程實作的,java的Socket編程可參考基于java的socket編程
但值得注意的是:網路訪問不能在主執行緒(UI執行緒)中進行,否則程式會崩潰!!!
MainActivity.java
package com.example.heavysea.l;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void sendMessage(final String message) {
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
Socket client = new Socket("192.168.43.241", 8080);
OutputStream out = client.getOutputStream();
// 寫入資料
out.write(message.getBytes());
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace(); }
}
}).start();
}
public void ButtonHandler(View v) {
switch (v.getId()) {
case R.id.button1:
sendMessage("go ahead");
break;
case R.id.button2:
sendMessage("go behind");
break;
case R.id.button3:
sendMessage("turn left");
break;
case R.id.button4:
sendMessage("turn right");
break;
}
}
}
開啟網路除錯助手,開啟TCP 客戶端,運行安卓程式,此時點擊按鈕"前進",便會與客戶端建立一次連接,發送"go ahead"到客戶端,客戶端便能正常獲取訊息了,
四、Socket服務端代碼結構的優化
按照開發的習慣,可在src底下再建立一個包,在新建立的包下建立新的Net.java檔案,然后把服務端的代碼剪切到新的java檔案中,從而使代碼結構更加清晰明了,

MainActivity.java
package com.example.heavysea.l;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
// 匯入新建立的包
import com.example.net.Net;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void ButtonHandler(View v) {
switch (v.getId()) {
case R.id.button1:
Net.sendMessage("go ahead");
break;
case R.id.button2:
Net.sendMessage("go behind");
break;
case R.id.button3:
Net.sendMessage("turn left");
break;
case R.id.button4:
Net.sendMessage("turn right");
break;
}
}
}
注意:把sendMessage方法放到類中,需要把方法定義成靜態方法,以方便MainActivity.java中對該方法的運用,
Net.java:
package com.example.net;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
public class Net {
// 類中的靜態方法
public static void sendMessage(final String message) {
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
Socket client = new Socket("192.168.43.241", 8080);
OutputStream out = client.getOutputStream();
// 寫入資料
out.write(message.getBytes());
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/286413.html
標籤:其他
上一篇:【Makefile】宏控
