Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
IndRA
0 / 0 / 0
Регистрация: 12.09.2017
Сообщений: 5
1

Передача данных по Bluetooth

21.11.2017, 09:53. Просмотров 421. Ответов 3
Метки нет (Все метки)

Добрый день!
Нужна помощь. Я относительно недавно начал изучать программирование под Android, да и программирование на Java всецело.
Почитав книг и посмотрев различные статьи по данной теме сделал простенькое приложение для отправки данных по синезубу из андроида на ардуино.
После этого захотел сделать чтоб сервопривод управлялся не кнопками, а джойстиком. Поискав на GitHub взял там исходники джойстика, так как сам еще не способен реализовать, и добавил туда передачу данных по синезубу.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.widget.Toast;
 
 
import java.io.IOException;
import java.io.OutputStream;
import java.util.UUID;
 
import io.github.controlwear.virtual.joystick.android.JoystickView;
 
public class MainActivity extends Activity {
 
    public static final String TAG = "bluetooth";
 
    private TextView mTextViewAngleLeft;
    private TextView mTextViewStrengthLeft;
 
    private TextView mTextViewAngleRight;
    private TextView mTextViewStrengthRight;
 
    int y;
 
    private static final int REQUEST_ENABLE_BT = 1;
    private BluetoothAdapter btAdapter = null;
    private BluetoothSocket btSocket = null;
 
    private ConnectedThread wdt;
    
    // SPP UUID сервиса
    private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
 
    // MAC-адрес Bluetooth модуля
    private static String address = "20:16:06:12:98:22";
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        btAdapter = BluetoothAdapter.getDefaultAdapter();      
        checkBTState();
 
        mTextViewAngleLeft = (TextView) findViewById(R.id.textView_angle_left);
        mTextViewStrengthLeft = (TextView) findViewById(R.id.textView_strength_left);
 
        JoystickView joystickLeft = (JoystickView) findViewById(R.id.joystickView_left);
 
        joystickLeft.setOnMoveListener(new JoystickView.OnMoveListener() {
            @Override
            public void onMove(int angle, int strength) {
                mTextViewAngleLeft.setText(angle + "°");
                mTextViewStrengthLeft.setText(strength + "%");
 
                if (angle > 180) {
                    y = 360-angle;
                } else {
                    y = angle;
                }
                wdt.write("S3:"+ y +"/");
            }
        });
        
        mTextViewAngleRight = (TextView) findViewById(R.id.textView_angle_right);
        mTextViewStrengthRight = (TextView) findViewById(R.id.textView_strength_right);
 
        JoystickView joystickRight = (JoystickView) findViewById(R.id.joystickView_right);
        joystickRight.setOnMoveListener(new JoystickView.OnMoveListener() {
            @Override
            public void onMove(int angle, int strength) {
                mTextViewAngleRight.setText(angle + "°");
                mTextViewStrengthRight.setText(strength + "%");
 
                if (angle > 180) {
                    y = 360-angle;
                } else {
                    y = angle;
                }
                wdt.write("S2:"+ y +"/");
            }
        });
    }
 
    @Override
    public void onResume() {
        super.onResume();
 
        Log.d(TAG, "...onResume - попытка соединения...");
        
        BluetoothDevice device = btAdapter.getRemoteDevice(address);
        
        try {
            btSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
        } catch (IOException e) {
            errorExit("Fatal Error", "In onResume() and socket create failed: " + e.getMessage() + ".");
        }
        
        btAdapter.cancelDiscovery();
        
        Log.d(TAG, "...Соединяемся...");
        try {
            btSocket.connect();
            Log.d(TAG, "...Соединение установлено и готово к передачи данных...");
        } catch (IOException e) {
            try {
                btSocket.close();
            } catch (IOException e2) {
                errorExit("Fatal Error", "In onResume() and unable to close socket during connection failure" + e2.getMessage() + ".");
            }
        }
        
        Log.d(TAG, "...Создание Socket...");
 
        wdt = new ConnectedThread(btSocket);
        wdt.start();
    }
 
    @Override
    public void onPause() {
        super.onPause();
 
        Log.d(TAG, "...In onPause()...");
 
        try     {
            btSocket.close();
        } catch (IOException e2) {
            errorExit("Fatal Error", "In onPause() and failed to close socket." + e2.getMessage() + ".");
        }
    }
 
    private void checkBTState() {
        if(btAdapter==null) {
            errorExit("Fatal Error", "Bluetooth не поддерживается");
        } else {
            if (btAdapter.isEnabled()) {
                Log.d(TAG, "...Bluetooth включен...");
            } else {
                Intent enableBtIntent = new Intent(btAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
            }
        }
    }
 
    private void errorExit(String title, String message){
        Toast.makeText(getBaseContext(), title + " - " + message, Toast.LENGTH_LONG).show();
        finish();
    }
 
    private class ConnectedThread extends Thread {
 
        private final BluetoothSocket mmSocket;
        private final OutputStream mmOutStream;
 
        public ConnectedThread(BluetoothSocket socket) {
            mmSocket = socket;
            OutputStream tmpOut = null;
            
            try {
                tmpOut = socket.getOutputStream();
            } catch (IOException e) { }
 
            mmOutStream = tmpOut;
        }
 
        public void run() {
 
        }
 
        /* Call this from the main activity to send data to the remote device */
        public void write(String message) {
            Log.d(TAG, "...Данные для отправки: " + message + "...");
            byte[] msgBuffer = message.getBytes();
            try {
                mmOutStream.write(msgBuffer);
            } catch (IOException e) {
                Log.d(TAG, "...Ошибка отправки данных: " + e.getMessage() + "...");
            }
        }
 
        /* Call this from the main activity to shutdown the connection */
        public void cancel() {
            try {
                mmSocket.close();
            } catch (IOException e) { }
        }
    }
}
И собственно проблема в том, что приложение работает секунд 10 и после этого передача обрывается. Я так понимаю проблема в переполнении буфера данных, но как реализовать его очистку не нашел...
Прошу помочь разобраться в данной проблеме. Буду рад любой помощи.
Извиняюсь если не правильно оформил тему.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.11.2017, 09:53
Ответы с готовыми решениями:

Передача данных по Bluetooth
Проблема в следующем, после определенного количества переданных байт(зависит от...

Передача данных через bluetooth
сразу скажу я новичок в программировании так что не судите строго о моем...

Передача данных Android устр. - stm по bluetooth
Здравствуйте, есть задача передавать данные с android планшета на на плату с...

Передача файлов через BlueTooth OPP / ContentResolver
Друзья, помогите пожалуйста!!! Уже второй день пляшу с бубном. :( Передаю...

Приём данных по Bluetooth
Из Arduino посылается строка xx|xx|xx|xx|xx,xxxx|\n, где х-любое число. На...

3
IndRA
0 / 0 / 0
Регистрация: 12.09.2017
Сообщений: 5
23.11.2017, 08:25  [ТС] 2
Видимо ни у кого похожего не было, печально...
Пока ответов нет изложу другую идею.
Пытался провернуть отправку с паузами Threed.sleep и TimeUnit.SECOND.sleep.
Если ставлю паузу в 3 секунды именно на отправку из public void write то подвисает, причем значительно, само приложение...Однако отправка хоть и криво но идет.
Исходя из этого возник еще вопрос: не знаю как точно, но возможно ли через Handler реализовать отправку и сделать паузу именно на отправку из Handler'a?
0
ILNAR_93
Android
243 / 240 / 52
Регистрация: 19.01.2013
Сообщений: 1,895
Записей в блоге: 3
23.11.2017, 10:06 3
может стоит синхронизировать методы работающие с RfcommSocket?

Добавлено через 1 минуту
Java
1
public synchronized  void write(String message) {
0
IndRA
0 / 0 / 0
Регистрация: 12.09.2017
Сообщений: 5
12.12.2017, 09:38  [ТС] 4
Вопрос можно закрыть. Проблему давно исправил, сделал через Handler.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2017, 09:38

Получение данных от Bluetooth
Доброго времени суток, помогите разобраться, не получается отделить мух от...

Получение и разбор данных по Bluetooth
Всем привет. Очень нужна помощь, не могу найти решение. Задача такова, что с...

Как сделать передачу данных по bluetooth
Создал приложение на телефон, которые отправляет на моего домашнего робота "1",...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru