我正在創建一個使用 Handler 和 Runnable 每 20 毫秒發送一次包含 IMU 資料的 http 請求的 Android 應用程式。
public void onClickLogData(View view){
Log.d(TAG,"onClickLogData");
final OkHttpClient client = new OkHttpClient();
Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
if (Running) {
handler.postDelayed(this, 20);
String url = "http://192.168.86.43:5000/server";
Log.d(TAG, String.valueOf(time));
RequestBody body = new FormBody.Builder()
.add("Timestamp", String.valueOf(time))
.add("accx", String.valueOf(accx))
.add("accy", String.valueOf(accy))
.add("accz", String.valueOf(accz))
.add("gyrox", String.valueOf(gyrox))
.add("gyroy", String.valueOf(gyroy))
.add("gyroz", String.valueOf(gyroz))
.add("magx", String.valueOf(magx))
.add("magy", String.valueOf(magy))
.add("magz", String.valueOf(magz))
.build();
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
final Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NonNull Call call, @NonNull IOException e) {
Log.i("onFailure", e.getMessage());
}
@Override
public void onResponse(@NonNull Call call, @NonNull Response response)
throws IOException {
assert response.body() != null;
String result = response.body().string();
Log.i("result", result);
}
});
} else {
handler.removeCallbacks(this);
}
}
};
handler.postDelayed(runnable, 1000);
}
資料被接收并存盤在我的筆記本電腦上。
with open('imu.csv','w') as csv_file:
writer = csv.writer(csv_file)
writer.writerow(['Timestamp','accx','accy','accz','gyrox','gyroy','gyroz','magx','magy','magz'])
app = Flask(__name__)
@app.route('/server', methods=['GET','POST'])
def server():
r = request.form
data = r.to_dict(flat=False)
t = int(str(data['Timestamp'])[2:-2])
print(t)
accx = float(str(data['accx'])[2:-2])
accy = float(str(data['accy'])[2:-2])
accz = float(str(data['accz'])[2:-2])
gyrox = float(str(data['gyrox'])[2:-2])
gyroy = float(str(data['gyroy'])[2:-2])
gyroz = float(str(data['gyroz'])[2:-2])
magx = float(str(data['magx'])[2:-2])
magy = float(str(data['magy'])[2:-2])
magz = float(str(data['magz'])[2:-2])
imu_data = [t,accx,accy,accz,gyrox,gyroy,gyroz,magx,magy,magz]
with open('imu.csv','a ') as csv_file:
writer = csv.writer(csv_file)
writer.writerow(imu_data)
return("ok")
if __name__ == '__main__':
app.run(host='0.0.0.0')
如 Log 所示,請求在 Android 端按時間順序發送,但在接收端,許多請求以錯誤的時間順序接收。在此處輸入影像描述
隨著時間的推移,這種情況似乎更頻繁地發生。這可能是什么原因,我應該在哪里看?
uj5u.com熱心網友回復:
各種各樣的事情。請求通過網路發送。他們每次可以采取不同的路徑到達那里。請求甚至會丟失。使用 TCP,您會自動重新發送丟失的請求,但它會更加混亂。它們可以在網路中的不同網橋和路由器中延遲。互聯網上沒有承諾將按順序接收不同的請求。這只是對使用 TCP 的單個套接字的承諾,并且只有通過大量作業才能實作(基本上跟蹤發送和接收的每個資料包并等待直到您擁有它們以便將其發送到應用程式)。如果您的架構要求您按順序接收它們,那么您的架構不可能在 Internet 上運行。
如果您確實需要在服務器上進行排序,請嵌入單調遞增的請求編號,或在請求中嵌入時間戳。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/439527.html
