彼は、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>
最終的に、私が望むのは、ブロードキャストで信号を取得し、データをキャプチャすることです。私はそれがここですべてをコメントするのは少しロールであることを知っていますが、ねえ、私は少し夢中でした. ご挨拶、ありがとう!
(申し訳ありませんが、郵便番号では大丈夫ではありません)