1

彼は、Android でデータを受信する Arduino からの Bluetooth 接続を問題なく実装しました。売り手アマリノはリスナーを着ていました。とても素敵で、完璧に機能しました。問題は、apk Amarino が必要であり、アプリケーション サービスとして機能していることに気付いたときに始まりました。これは明らかに、外部アプリケーションをインストールしなければならない苦痛なので、解決策を見つけるために作業を開始しました。

最初に行ったのは、アプリケーション apk を実行する必要がないはずの Amarino Embed というライブラリを探すことでした。ウェブサイトはあまり最新ではなく、何千もの例や物事がうまくいかなかった. とにかく、アマリノのようにブルートゥース通知を上げて、その間にとても面白くてうまくいかなかったので、プランBに行きました.

プラン B は、Android のドキュメントに従って実装することでした。これを読んで広範囲にテストした結果、メイン スレッドの実行を分離し、ハンドラを使用するスレッドを教えてくれました。最初は、それが機能し、すべてがソートされ、これを実装する場合、オンラインで見たと思いました(緩い部品を置きました):

private BluetoothAdapter btAdapter = null;
private BluetoothSocket btSocket = null;
private StringBuilder sb = new StringBuilder();  
private ConnectedThread mConnectedThread;
private static String address = "00:12:10:17:02:24";
private Handler h;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);
    txtArduino = (TextView) findViewById(R.id.textView1);   // for display the received data from the Arduino

    h = new Handler() {
        public void handleMessage(android.os.Message msg) {
        switch (msg.what) {
           case RECIEVE_MESSAGE:    // if receive massage
            byte[] readBuf = (byte[]) msg.obj;
            String strIncom = new String(readBuf, 0, msg.arg1); // create string from bytes array
            sb.append(strIncom);    // append string
            int endOfLineIndex = sb.indexOf("\r\n");    // determine the end-of-line
            // Log.d("CADENA: ", "SB:  " + sb);
            if (endOfLineIndex > 0) { // if end-of-line,
            String sbprint = sb.substring(0, endOfLineIndex);   // extract string
                   sb.delete(0, sb.length());   
                   //Log.d("CADENA MAXIMA: ", "CM: " + sbprint);// and clear
                   String[] cadenaSepara = sbprint.split(",");
                   if(cadenaSepara != null) {
                    Log.d("TAMAÑO: ", "TAM: " + cadenaSepara.length);
                   }
                txtArduino.setText("Data from Arduino: " + sbprint);        // update TextView
               }
            //Log.d(TAG, "...String:"+ sb.toString() +  "Byte:" + msg.arg1 + "...");
            break;
    }
       };
};     
   btAdapter = BluetoothAdapter.getDefaultAdapter();    // get Bluetooth adapter
   checkBTState();
}

 @Override
public void onResume() {
       BluetoothDevice device = btAdapter.getRemoteDevice(address);
       btSocket = device.createRfcommSocketToServiceRecord(UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
       btAdapter.cancelDiscovery();
       btSocket.connect();
       mConnectedThread = new ConnectedThread(btSocket);
       mConnectedThread.start();
}

private class ConnectedThread extends Thread {
      private final InputStream mmInStream;
      private final OutputStream mmOutStream;

public ConnectedThread(BluetoothSocket socket) {
InputStream tmpIn = null;
OutputStream tmpOut = null;

// Get the input and output streams, using temp objects because
// member streams are final
try {
     tmpIn = socket.getInputStream();
     tmpOut = socket.getOutputStream();
 } catch (IOException e) { }

mmInStream = tmpIn;
mmOutStream = tmpOut;

//Log.d("THREAAAAAAAAD: ", "THREAAAAAAAAD: ");
}

public void run() {
       byte[] buffer = new byte[256];  // buffer store for the stream
       int bytes; // bytes returned from read()

       // Keep listening to the InputStream until an exception occurs
       while (true) {
            try {
                // Read from the InputStream
                bytes = mmInStream.read(buffer);
                // Log.d("BYTEEEES: ", "BIITES: " + bytes);// Get number of bytes and message in "buffer"
                h.obtainMessage(RECIEVE_MESSAGE, bytes, -1, buffer).sendToTarget(); // Send to message queue Handler
            } catch (IOException e) {
                break;
            }
        }
}
<code>

これは一種の BROADCAST で、内部インターフェイス MindListenerTWO を省略して簡略化したものです。

<pre> public class MindInterfaceTWO extends BroadcastReceiver { private static BluetoothDevice dispositivo; private static List<MindListenerTWO> listeners = new ArrayList<MindListenerTWO>(); public void addListener(MindListenerTWO mindListener) { listeners.add(mindListener); if (listeners != null && !listeners.isEmpty()) //context.registerReceiver(this, new IntentFilter(BluetoothDevice.ACTION_FOUND)); context.registerReceiver(this, new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED)); } @Override public void onReceive(Context context, Intent intent) { //String accion = intent.getAction(); //Log.d("DEBUG:", "LLEGAAAAAA AQUIIIII"); //dispositivo = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); //dispositivo.getAddress(); Log.d("LLEGA: ", "AQUIIIIIIIIIII"); // Here's what it did with AMARINO String data = null; // Esta cadena (que no se usa) simplemente muestra la direccion del // Bluetooth desde que se ha // enviado la informacion // final String address = // intent.getStringExtra(AmarinoIntent.EXTRA_DEVICE_ADDRESS); // Es el tipo de dato que se ha añadido al intento final int dataType = intent.getIntExtra( AmarinoIntent.EXTRA_DATA_TYPE, -1); Log.d("DATAAAAAAS ANTES DE ENTRAR: ", "DATOS: "); // Esto comprueba que es String en Android y char[] en Arduino para // que sean correctos los datos if (dataType == AmarinoIntent.STRING_EXTRA) { data = intent.getStringExtra(AmarinoIntent.EXTRA_DATA); Log.d("DATAAAAAA: ", "DATOS: " + data); // Formato de los datos recibidos: // signal strength, attention, meditation, delta, theta, low // alpha, high alpha, low beta, high beta, low gamma, high gamma" String[] datos = data.split(","); if (data != null) { signal = Integer.valueOf(datos[0]); launchNewSignal(signal); } } <code>

最終的に、私が望むのは、ブロードキャストで信号を取得し、データをキャプチャすることです。私はそれがここですべてをコメントするのは少しロールであることを知っていますが、ねえ、私は少し夢中でした. ご挨拶、ありがとう!

(申し訳ありませんが、郵便番号では大丈夫ではありません)

4

0 に答える 0