質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

980閲覧

アンドロイドとPC間での通信のプログラムで通信データが途中で止まってしまいます。

yutainoue

総合スコア5

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2019/09/30 10:43

前提・実現したいこと

アンドロイドで加速度センサのデータを取得し、
PCへ送信後、CSVファイルへ書き込むことを実現したいと考えております。

よろしくお願いいたします。

###エラー
実際に取得、送受信、書き込みは実現していますが、CSVファイルを確認するとデータ数が
最初に取得した値から51個までしか書き込まれていません。

備考
PCでの受信では受信ごとにコンソールへデータを出力するようにプログラムしておりますが、
送信側のアプリを止めるまでデータ出力せず、この理由も理解できてません。

ソースコード

アンドロイドアプリケーション

java

1public class MainActivity extends Activity 2 implements SensorEventListener, View.OnClickListener{ 3 4 5 public String sendingStr[] = new String[4]; 6// 7 //-- --// 8 private SensorManager sensorManager; 9 private Sensor accel; 10 11 public float linear_acceleration[] = new float[3]; 12 13 14 @Override 15 protected void onCreate(Bundle savedInstanceState) { 16 17 super.onCreate(savedInstanceState); 18 setContentView(R.layout.activity_main); 19 20 // Get an instance of the SensorManager 21 sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 22 } 23 24 @Override 25 protected void onResume() { 26 super.onResume(); 27 // Listenerの登録 28 accel = sensorManager.getDefaultSensor( 29 Sensor.TYPE_ACCELEROMETER); 30 31 sensorManager.registerListener(this, accel, 32 SensorManager.SENSOR_DELAY_NORMAL); 33 34 } 35 36 // 解除するコードも入れる! 37 @Override 38 protected void onPause() { 39 super.onPause(); 40 // Listenerを解除 41 sensorManager.unregisterListener(this); 42 } 43 44 @Override 45 public void onSensorChanged(SensorEvent event) { 46 47 if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { 48 49 50 linear_acceleration[0] = event.values[0]; 51 linear_acceleration[1] = event.values[1]; 52 linear_acceleration[2] = event.values[2]; 53 } 54 DateFormat format = new SimpleDateFormat("yyyy MM ddhh:mm:ss.SSS"); 55 String date = format.format(new Date()); 56 sendingStr[0] =date; 57 sendingStr[1] = Float.toString(linear_acceleration[0]); 58 sendingStr[2] = Float.toString(linear_acceleration[1]); 59 sendingStr[3] = Float.toString(linear_acceleration[2]); 60 TCPsocket cl = new TCPsocket(sendingStr); 61 cl.start(); 62 } 63 @Override 64 public void onAccuracyChanged(Sensor sensor, int accuracy) { 65 } 66} 67public class TCPsocket extends Thread { 68 private String Ip = "-------"; //アクセス先IP 69 private int Port = ----; //アクセス先ポート 70 public String date; 71 public String acceldataX, acceldataY, acceldataZ; 72 73 74 public TCPsocket(String str[]) { 75 this.date =str[0]; 76 this.acceldataX = str[1]; 77 this.acceldataY = str[2]; 78 this.acceldataZ = str[3]; 79 } 80 81 @Override 82 public void run() { 83 try { 84//通信用ソケット作成 85 Socket socket = new Socket(Ip, Port); 86 InputStream in = socket.getInputStream(); 87 OutputStream out = socket.getOutputStream(); 88 BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8")); 89 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out, "UTF-8")); 90 91 92//テキストを送る 93 94 bw.write(this.date+","+this.acceldataX + "," + this.acceldataY + "," + this.acceldataZ 95 96//データを確定させて通信処理を起こさせる 97 bw.flush(); 98//後処理 99 in.close(); 100 out.close(); 101 socket.close(); 102 } catch (Exception e) { 103 e.printStackTrace(); 104 } 105 } 106}

PC側 受信プログラム

java

1public class Server{ 2 public static final int PORT =----; 3 static final String INPUT_DIR = "/Users/---/---/example.csv"; 4 public String stopStr = null; 5 public static void main(String args[]) { 6 Server sm =new Server(); 7 8 try { 9 ServerSocket ss = new ServerSocket(PORT); 10 BufferedReader br; 11 12 //ファイルを開く 13 FileWriter f = new FileWriter(INPUT_DIR,false); 14 PrintWriter p = new PrintWriter(new BufferedWriter(f)); 15 p.println("時間,加速度X,加速度Y,加速度Z"); 16 System.out.println("待機します"); 17 18 Socket sc; 19 20 while(true){ 21 try { 22 23 ss.setSoTimeout(20000); 24 sc= ss.accept(); 25 26 br = new BufferedReader( 27 new InputStreamReader( 28 sc.getInputStream() 29 ) 30 ); 31 String str = br.readLine(); 32 System.out.println(str); 33 p.println(str); 34 35 } 36 catch(Exception e) { 37 e.printStackTrace(); 38 System.out.println("お疲れ様でした"); 39 p.close(); 40 } 41 } 42 } 43 catch(Exception e) { 44 e.printStackTrace(); 45 } 46 } 47} 48

CSVファイルでの結果
1 2019 09 30 06:51:01.129 -0.09453266 0.20342097 9.94607
2 2019 09 30 06:51:01.268 -0.07694965 0.19186173 9.90667
3 2019 09 30 06:51:01.469 -0.068598665 0.19453368 9.895572
4 2019 09 30 06:51:01.669 -0.06703765 0.21001938 9.888551
5 2019 09 30 06:51:01.869 -0.07821378 0.20364122 9.887718
6 2019 09 30 06:51:02.068 -0.064461485 0.21603361 9.852897
7 2019 09 30 06:51:02.278 -0.059088897 0.21865766 9.86099
8 2019 09 30 06:51:02.471 -0.075953655 0.21085255 9.855588
9 2019 09 30 06:51:02.675 -0.060429648 0.21003853 9.831597
10 2019 09 30 06:51:02.875 -0.06442318 0.21770956 9.829414
11 2019 09 30 06:51:03.087 -0.06366661 0.19936039 9.818918
12 2019 09 30 06:51:03.288 -0.07372226 0.20634188 9.83041
13 2019 09 30 06:51:03.481 -0.06743987 0.20283677 9.828178
14 2019 09 30 06:51:03.675 -0.07095456 0.21268173 9.841481
15 2019 09 30 06:51:03.874 -0.068091094 0.20891805 9.836655
16 2019 09 30 06:51:04.074 -0.08297346 0.20617908 9.8278055
17 2019 09 30 06:51:04.274 -0.073023155 0.21091002 9.8492
18 2019 09 30 06:51:04.474 -0.06694188 0.20304745 9.860874
19 2019 09 30 06:51:04.677 -0.06944143 0.21055567 9.841434
20 2019 09 30 06:51:04.876 -0.07716991 0.19967642 9.842851
21 2019 09 30 06:51:05.077 -0.06413587 0.21682848 9.848942
22 2019 09 30 06:51:05.284 -0.07720821 0.19935082 9.862579
23 2019 09 30 06:51:05.485 -0.077533826 0.20142896 9.857598
24 2019 09 30 06:51:05.676 -0.07358818 0.21320845 9.877317
25 2019 09 30 06:51:05.874 -0.065256365 0.20117041 9.874157
26 2019 09 30 06:51:06.073 -0.075857885 0.20486705 9.882106
27 2019 09 30 06:51:06.273 -0.067401566 0.20511605 9.904553
28 2019 09 30 06:51:06.473 -0.069259465 0.21232738 9.901489
29 2019 09 30 06:51:06.673 -0.0656107 0.20650469 9.916975
30 2019 09 30 06:51:06.883 -0.081785925 0.20138109 9.911947
31 2019 09 30 06:51:07.074 -0.070561916 0.19083704 9.901403
32 2019 09 30 06:51:07.276 -0.07145255 0.20350714 9.917406
33 2019 09 30 06:51:07.476 -0.07807013 0.20208979 9.916601
34 2019 09 30 06:51:07.676 -0.07410533 0.20069157 9.922529
35 2019 09 30 06:51:07.876 -0.08459193 0.20482875 9.918086
36 2019 09 30 06:51:08.076 -0.06543832 0.1931163 9.914973
37 2019 09 30 06:51:08.277 -0.09329725 0.19994457 9.936187
38 2019 09 30 06:51:08.483 -0.07222828 0.2018312 9.95532
39 2019 09 30 06:51:08.683 -0.07405745 0.20212808 9.935056
40 2019 09 30 06:51:08.884 -0.0632165 0.21986434 9.910836
41 2019 09 30 06:51:09.084 -0.067526065 0.2029038 9.939969
42 2019 09 30 06:51:09.278 -0.08234139 0.1995998 9.923526
43 2019 09 30 06:51:09.477 -0.08055052 0.20737618 9.925566
44 2019 09 30 06:51:09.684 -0.0910467 0.19755995 9.933639
45 2019 09 30 06:51:09.883 -0.08817366 0.1986134 9.928486
46 2019 09 30 06:51:10.083 -0.08515697 0.20134279 9.932537
47 2019 09 30 06:51:10.277 -0.07458418 0.19936039 9.928582
48 2019 09 30 06:51:10.476 -0.07863516 0.19714814 9.944135
49 2019 09 30 06:51:10.675 -0.07528328 0.20905212 9.944393
50 2019 09 30 06:51:10.883 -0.07761044 0.20027019 9.943914
51 2019 09 30 06:51:11.073 -0.07634631 0.20024146 9.94174

試したこと

センサのデータ時間数を変更など行いましたが、常に50個で止まってしまいます。

補足情報(FW/ツールのバージョンなど)

アンドロイドの端末はファーウェイ Mate 10 Pro
アンドロイドはAndroid Studio
PCの受信プログラムはeclipseで動かしております。
ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

あくまでご提示のコードからの推測ですが:

実際に取得、送受信、書き込みは実現していますが、CSVファイルを確認するとデータ数が最初に取得した値から51個までしか書き込まれていません。

ServerSocketの接続要求キューの最大数に達しているのではないでしょうか。

JavaのServerSocketクラスのリファレンスを見ると、
クラスServerSocket

受信する接続 (接続要求) のキューの最大長は、50 に設定されます。キューが埋まっているときに接続要求があると、接続は拒否されます。

とあります。

コードを拝見すると、Androidのクライアント側はセンサーデータが発生するたびにスレッドを起動してTCPコネクションを生成しています。サーバー側はsc= ss.accept();で作られたTCPコネクションである scを、処理の終了後にクローズしていません。これだとすぐ枯渇してしまうと思います。少なくともこれは問題があるので、処理が終わったら正しくクローズしましょう。

PCでの受信では受信ごとにコンソールへデータを出力するようにプログラムしておりますが、
送信側のアプリを止めるまでデータ出力せず、この理由も理解できてません。

提示されたAndroid側クライアントの以下のコードの末端が切れているので不確かですが、
bw.write(this.date+","+this.acceldataX + "," + this.acceldataY + "," + this.acceldataZ
クライアント側からは改行コード\nを送っていないのではないでしょうか?

サーバーではString str = br.readLine();とのように「行」データの意識で受けています。改行コードを受信するかまたは内部のバッファーがいっぱいになるまで
は恐らくreadLineから抜けてこないので、その次に進みません。クライアントのAndroidアプリを終了することでTCPのコネクションが切断され、readLineから抜け、やっと出力されることになります。Exceptionがthrowされていないのであれば、クライアント側の切断で受信データ0バイトで終了し、readLineを抜けてきているものと思われます。

投稿2019/09/30 11:55

dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yutainoue

2019/10/01 01:21

ご返答ありがとうございます。 ご指摘通り、要求キューの問題でsc.closeで解決しました。 バッファの方も改行することでコンソールに逐一表示することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問