วันอังคารที่ 15 มีนาคม พ.ศ. 2554

การรับส่งข้อมูลทาง Bluetooth บนโทรศัพท์ระบบ Android

สวัสดีครับทุกท่าน วันนี้ผมจะมาแนะนำการเขียนโปรแกรมส่งข้อมูลผ่านทาง Bluetooth บนโทรศัพท์ Android กันนะครับ เริ่มกันที่เราจะเขียน Class ที่เป็นตัวรวมการเชื่อมต่อและส่งข้อมูล Bluetooth กันนะครับ ซึ่งโค๊ดบางส่วนได้นำมาจากตัวอย่างหลายๆตัวอย่างบนอินเตอร์เนตมารวมเป็น Class เพื่อให้เรียกใช้งานกันอย่างง่ายๆนะครับ



package com.mekameka.bluetoothsample;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.UUID;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
public class BluetoothController {
/*Private Variables*/
private BluetoothAdapter btAdapter = null;
private BluetoothSocket btSocket = null;
private BluetoothDevice btDevice = null;
private OutputStream outStream = null;
private InputStream inStream = null;
private byte[] inputBuffer = new byte[1024];

/*Global Variable*/
int inputSize = 0;
/*Status Flag*/
public boolean isInitial = false;
public boolean isConnect = false;
public boolean isEnabled = false;
public boolean isSent = false;
public boolean isRecieved = false;
public BluetoothController( )
{
/*Constructor*/
}
public void BluetoothInit(String BT_UUID, String MAC)
{
btSocket = null;
isInitial = false;
UUID LC_UUID = UUID.fromString(BT_UUID);
btAdapter = BluetoothAdapter.getDefaultAdapter();
btDevice = btAdapter.getRemoteDevice(MAC);
if (btAdapter == null) {
isInitial = false;
}
if (!btAdapter.isEnabled()) {
isInitial = false;
}
else if (btAdapter.isEnabled())
{
isEnabled = true;
try
{
btSocket = btDevice.createRfcommSocketToServiceRecord(LC_UUID);
}
catch (IOException e)
{
}
btAdapter.cancelDiscovery();
}
isInitial = true;
}
public void BluetoothConnect()
{
isConnect = false;
try
{
btSocket.connect();
}
catch (IOException e)
{
try
{
btSocket.close();
}
catch (IOException e2)
{
isConnect = false;
}
}
isConnect = true;
}
public void BluetoothSend(String message)
{
isSent = false;
byte[] outBuffer = message.getBytes();
try
{
outStream = btSocket.getOutputStream();
}
catch (IOException e)
{
isSent = false;
}
try
{
outStream.write(outBuffer);
}
catch (IOException e)
{
isSent = false;
}
if (outStream != null)
{
try
{
outStream.flush();
}
catch (IOException e)
{
isSent = false;
}
}
isSent = true;
}
public byte[] BluetoothRecieve()
{
isRecieved = false;
try
{
inStream = btSocket.getInputStream();
inputSize = inStream.read(inputBuffer);
}
catch (IOException e) {
isRecieved = false;
}
isRecieved = true;
return inputBuffer;
}


public void BluetoothDisconnect()
{
isConnect = true;
try
{
btSocket.close();
}
catch (IOException e2)
{
isConnect = true;
}
isConnect = false;
}
}
เมื่อสร้าง Class BluetoothController เรียบร้อยแล้วเราก็ไปเรียกใช้ใน Activity ของเรากันเลยครับ
โดยขั้นแรกเริ่มจากเรียกใช้เมธอด BluetoothInit(String BT_UUID, String MAC) เพื่อทำการ Initial ค่าเริ่มต้นให้บลูธูทบนโทรศัพท์ Android ก่อนนะครับ โดย BT_UUID ที่ผมใช้ทดสอบจะเป็น 00001101-0000-1000-8000-00805F9B34FB และ MAC จะเป็น Address ของ Bluetooth ของตัวที่เราจะทำการติดต่อด้วยนะครับ เช่นของผมทำการเชื่อมต่อกับ Bluetooth Module มี MAC เป็น 00:19:5D:EE:32:67 หลังจากใช้เมธอด Initial ค่าแล้วต่อไปก็ใช้เมธอด BluetoothConnect() เพื่อทำการเชื่อมต่อไปยัง Bluetooth ตัวปลายทาง ถ้าการเชื่อมต่อสำเร็จก็สามารถใช้เมธอด BluetoothSend(String sendTxt) ทำการส่งข้อมูลไปยัง Bluetooth Module ปลายทางได้เลยครับโดยจะส่งข้อมูลในรูปแบบ String ไปนะครับ ส่วนการรับข้อมูล นั้นจะรับผ่านเมธอด BluetoothRecieve() นะครับโดยจะรีเทอร์นค่ามาเป็นข้อมูลประเภท byte[] นะครับทางด้านฝั่งรับนี้เรามักจะเขียนเป็น Thread เพื่อรอรับข้อมูลตลอดเวลาครับ เมื่อเราเราต้องการจะยกเลิกการเชื่อมต่อก็เรียกใช้เมธอด BluetoothDisconnect() เพื่อทำการยกเลิกการเชื่อมต่อครับด้านล่างจะเป็นตัวอย่างการเรียกใช้งานเมธอดต่างๆใน Activity นะครับ
package com.mekameka.bluetoothsample;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener , Runnable{
private static String testUUID = "00001101-0000-1000-8000-00805F9B34FB";//Test UUID
private static String address = "00:19:5D:EE:32:67"; //Target Device MacAddress
String message = "HelloWorld!\nMekameka! \n"; //Demo Message
boolean threadRun = false;
/*Widget Declaration*/
Button sendBtn = null;
Button connectBtn = null;
Button disconnectBtn = null;
EditText sendTxtBox = null;
ListView recievedLbl = null;
TextView rxTitle = null;
private ArrayAdapter mConversationArrayAdapter;
/*Initial Object*/
BluetoothController btComm = new BluetoothController();
Thread rxThread = new Thread(this);
public static final int MESSAGE_READ = 2;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sendBtn = (Button)findViewById(R.id.sendBtn);
connectBtn = (Button)findViewById(R.id.connectBtn);
disconnectBtn = (Button)findViewById(R.id.disconnectBtn);
sendTxtBox = (EditText)findViewById(R.id.sendTextBox);
recievedLbl = (ListView) findViewById(R.id.in);
rxTitle = (TextView)findViewById(R.id.rxTitle);
mConversationArrayAdapter = new ArrayAdapter(this, R.layout.message);
recievedLbl.setAdapter(mConversationArrayAdapter);
sendBtn.setOnClickListener(this);
connectBtn.setOnClickListener(this);
disconnectBtn.setOnClickListener(this);
sendBtn.setEnabled(false);
disconnectBtn.setEnabled(false);
btComm.BluetoothInit(testUUID, address);
mConversationArrayAdapter.clear();
}
@Override
public void onClick(View wdg) {
if(wdg.getId() == R.id.connectBtn)
{
if(btComm.isInitial)
{
btComm.BluetoothConnect();
Toast.makeText(this, "Connected!", Toast.LENGTH_SHORT).show();
sendBtn.setEnabled(true);
disconnectBtn.setEnabled(true);
connectBtn.setEnabled(false);
//recievedLbl.setText("Hello World");
mConversationArrayAdapter.add("Hello World!");
/*Initial Recieved Thread*/
if (rxThread.isAlive())
{
threadRun = true;
}
else
{
threadRun = true;
rxThread.start();
}
}
else
{
Toast.makeText(this, "Cannot Connect", Toast.LENGTH_SHORT).show();
finish();
}
}
else if (wdg.getId() == R.id.sendBtn)
{
if(btComm.isConnect)
{
btComm.BluetoothSend(sendTxtBox.getText().toString());
mConversationArrayAdapter.add(sendTxtBox.getText().toString());
Toast.makeText(this, "Data Sent!", Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(this, "Cannot Send Data", Toast.LENGTH_SHORT).show();
finish();
}
}
else if (wdg.getId() == R.id.disconnectBtn)
{
threadRun = false;
//rxThread.
btComm.BluetoothDisconnect();
if (btComm.isConnect == false)
{
Toast.makeText(this, "Disconnected!", Toast.LENGTH_SHORT).show();
sendBtn.setEnabled(false);
disconnectBtn.setEnabled(false);
connectBtn.setEnabled(true);
}
else
{
Toast.makeText(this, "Cannot Disconnect", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void run() {
// TODO Auto-generated method stub
byte[] buffer = new byte[1024]; // buffer store for the stream
while (threadRun == true)
{
buffer = btComm.BluetoothRecieve();
String readMessage = new String(buffer, 0, buffer.length);
//handler.sendEmptyMessage(0);
try {
rxThread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
handler.obtainMessage(MESSAGE_READ, buffer.length, -1, readMessage).sendToTarget();
}
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch(msg.what)
{
case MESSAGE_READ:
// Read in string from message, display to mainText for user
String readMessage = (String) msg.obj;
if (msg.arg1 > 0) {
mConversationArrayAdapter.add(readMessage);
rxTitle.setText(readMessage);
}
}


}
};
}
ตามด้วย Code XML main.xml ครับ
<?xml version=”1.0″ encoding=”utf-8″?>
<LinearLayout
android:id=”@+id/widget30″
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:orientation=”vertical”
xmlns:android=”http://schemas.android.com/apk/res/android”
>
<LinearLayout
android:id=”@+id/widget52″
android:layout_width=”fill_parent”
android:layout_height=”339px”
android:orientation=”vertical”
>
<TextView
android:id=”@+id/rxTitle”
android:layout_width=”fill_parent”
android:layout_height=”18px”
android:text=”Recieved Data”
>
</TextView>
<ListView android:id=”@+id/in”
android:layout_width=”fill_parent”
android:layout_height=”fill_parent”
android:stackFromBottom=”true”
android:transcriptMode=”alwaysScroll”
android:layout_weight=”1″
/>
<TextView
android:id=”@+id/widget38″
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:text=”Send Data”
android:layout_gravity=”bottom”
>
</TextView>
<EditText
android:id=”@+id/sendTextBox”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:text=”Type Here!”
android:textSize=”18sp”
android:layout_gravity=”bottom”
>
</EditText>
</LinearLayout>
<RelativeLayout
android:id=”@+id/widget78″
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
>
<Button
android:id=”@+id/sendBtn”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”Send Data”
android:layout_alignParentTop=”true”
android:layout_centerHorizontal=”true”
>
</Button>
<Button
android:id=”@+id/connectBtn”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”Connect”
android:layout_alignParentTop=”true”
android:layout_alignParentLeft=”true”
>
</Button>
<Button
android:id=”@+id/disconnectBtn”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”Disconnect”
android:layout_alignParentTop=”true”
android:layout_alignParentRight=”true”
>
</Button>
</RelativeLayout>
</LinearLayout>
message.xml ครับ
<?xml version=”1.0″ encoding=”utf-8″?>
<!– Copyright (C) 2009 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the “License”);
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an “AS IS” BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
–>
<TextView xmlns:android=”http://schemas.android.com/apk/res/android”
android:layout_width=”fill_parent”
android:layout_height=”wrap_content”
android:textSize=”18sp”
android:padding=”5dp”
/>
ใครมีข้อสงสัยสามารถโพสข้อความไว้ได้นะครับและสามารถดาวน์โหลดโค๊ดตัวอย่างได้จากลิงค์นี้เลยครับ BluetoothSample Source Code

125 ความคิดเห็น:

  1. พี่คะ
    อยากทราบการทำงานของโค๊ดอันนิอ่าคะ
    คือ มันต้องกดเลือกไฟล์ที่จะส่ง แล้วกดเลือกเครื่องที่จะรับเหมือนปกติมั้ยคะ

    หนูสนใจเรื่องนิอยู่อ่าคะ อยากทำแบบ กดปุ่มครั้งเดียวแล้วรับส่งอัตโนมัติไม่ต้องตั้งค่าอะไรอีกอ่าคะ

    แนวคิดหนูพอเปนไปได้มั้ยคะ(หนูทำโปรเจคค่ะ KMITL#47 ค่ะ)

    ตอบลบ
  2. ถ้าจะใช้ Bluetooth สำหรับรับส่งไฟล์ต้องดูว่าใช้ profile ตัวไหนด้วยครับ โค๊ดตัวอย่างที่ผมทดสอบให้ดูนี้ใช้ profile สำหรับส่งข้อมูลแบบ serial ธรรมดาน่ะครับ

    ตอบลบ
  3. โต๊ดนี้มันจะ fix MAC ของ Bluetooth module ทั้งตัวรับและตัวส่งไว้นะครับ ทำให้เมื่อเริ่มโปรแกรมมันสามารถส่งข้อมูลไปได้เลย ซึ่งตามปกติควรจะต้อง Pair ก่อน ส่วนเรื่องการส่งข้อมูลให้กดปุ่มครั้งเดียวแล้วรับส่งอัตโนมัตินั้นก็สามารถทำได้ครับโดยซ่อนการทำงานต่างๆไว้ด้านหลังเอา และโปรเจคนี้ก็มีความเป็นไปได้สามารถทำได้ครับ

    ตอบลบ
  4. ความคิดเห็นนี้ถูกผู้เขียนลบ

    ตอบลบ
  5. private static String testUUID = "00001101-0000-1000-8000-8C7712BF9DBB";//Test UUID

    อันนิ 8C7712BF9DBB คือ บลูทูธแอดเดรส ของแอนดรอย

    private static String address = "7A:A3:C4:10:C8:C7"; //Target Device MacAddress

    อันนิ 7A:A3:C4:10:C8:C7 คือ แมคแอดเดรสของคอมพิวเตอร์

    หนูเข้าใจอย่างงิถูกต้องมั้ยคะ??

    แล้วถ้าหนูจะรันโค๊ดนิบนเครื่องหนูได้เนี่ย ก็คือ ให้แก้ 2ค่านิ อย่างงิถูกต้องมั้ยคะ

    ขอบคุณมากค่ะ

    ตอบลบ
  6. ใช่ครับ แก้แค่ 2 ค่านั้นแล้วลองใช้พวก terminal emulator จับข้อมูลจาก port serial บน pc ดูครับ

    ตอบลบ
  7. เอ่ๆ
    พี่คะ หลังหนูแก้ค่านั้นแล้ว
    พอตอนพิมอะไรลงไปแล้วส่งอ่ะค่ะ โปรแกรมมันบังคับปิด
    อันนิเกิดจากอะไรคะ

    ตอบลบ
  8. ลองดู log error ใน DDMS ครับว่าเกิด error จากอะไร

    ตอบลบ
  9. พี่คะ
    ตอนนิมันไม่ปิดโปรแกรมแล้วล่ะค่ะ >__<
    (ดีใจที่สุด)

    แต่ที่คอมพิวเตอร์ไม่แสดงการรับข้อมูลอะไรเรย หลังจากกดส่งอ่าคะ
    อันนิคือ มันไม่ได้ส่ง รึว่า ต้องมีโปรแกรมในเครื่องรองรับคะ

    หรือพี่หมายถึง "terminal emulator จับข้อมูลจาก port serial บน pc ดูครับ" อันนิหรือคะ จึงจะเหนข้อมูล??

    หนูไม่เคยได้ยิน terminal emulator มาก่อนเรยค่ะ
    พี่มีตัวแนะนำมั้ยคะ

    ตอบลบ
  10. Terminal emulator เป็นซอฟท์แวร์สำหรับจทดลองการรับส่งโดยที่เราไม่ต้องเขียนซอฟท์แวร์ขึ้นมาทดลองเพื่อความรวดเร็วในการทำงานครับที่ผมใช้ก็ใช้ http://www.hw-group.com/products/hercules/index_en.html ตัวนี้ในการจำลองเป็นตัวรับส่งข้อมูลผ่าน serial port ผ่าน rs232 หรืองานอื่นๆครับ ผมได้ลองทำตัวอย่างวีดีโอแสดงการตั้งค่า terminal emulator บน PC สำหรับเทสโค๊ดนี้ไว้ที่นี่แล้วนะครับ http://www.youtube.com/watch?v=WPf0NPHcuxk ลองดูได้ถ้ามีข้อสงสัยก็ถามมาได้ครับ

    ตอบลบ
  11. ที่เราต้องมีตัว Terminal emulator นี่เพราะว่า เรายังไม่มีโปรแกรมไว้รับข้อมูลหรือคะ?? หรือไม่จำเป็นต้องใช้ก็ได้

    หนูนึกว่า ไฟล์ที่เราส่งมันจะไปเก็บในโฟลเดอร์ในเครื่อง เหมือนกับเราส่งบูทูธธรรมดาอ่าคะ

    อีกอย่างคือ ถ้าหนูจำเป็นต้องใช้ข้อมูลที่ส่งจากมือถือไปคอมอ่าคะ หนูจะไปเรียกมาจากที่ไหนได้อ่าคะ??

    ตอบลบ
  12. ถ้าจะส่งไฟล์จากมือถือไปคอมต้องใช้ Profile Bluetooth สำหรับการส่งไฟล์ครับ Terminal Emulator จะใช้ debug ข้อมูลที่ส่งกันไปมาน่ะครับ

    ตอบลบ
  13. อืมเดี๋ยวผมจะลองเขียนตัวอย่างโค๊ดสำหรับการรับส่ง file ผ่าน bluetooth บน Android ให้ดูละกันครับ

    ตอบลบ
  14. อ่า รบกวนเรย
    ขอโทดนะคะ T^T

    ตอบลบ
  15. สวัสดีค่ะ
    ห่างหายไปนาน
    มีคำถามค่ะว่า หนูลองเทสโค๊ดตามที่พี่แสดงไว้บนยูทูปแล้วค่ะ
    ของหนูได้ PORT 5 แต่พอกดsend บนแอนดรอยแล้วไม่เหนมันแสดงบนTerminal Emulator ว่าหนูส่งอะไรเรยค่ะ ควรแก้ไขยังไงดีคะ

    ตอบลบ
  16. นัดเวลามาเดี๋ยว Remote desktop ไปดูให้

    ตอบลบ
  17. สวัสดีครับ คือ ผมกำลัง ศึกษาเรื่อง ส่งข้อมูลจากมือถือ android
    ไปยังไมโครคอนโทลเลอร์อยู่อ่ะครับ
    ผมต้องการส่งข้อมูลไปเพื่อใช้เป็นเงื่อนไข (คำสั่ง) ของการ
    สังการทำงานตัวไมโครคอนโทลเลอร์ครับ
    ผมอยากทราบว่ามันเป็นไปได้ไหม แล้วถ้าเป็นไปได้
    ผมจะส่งข้อมูลเป็นประเภทอะไรได้บ้าง
    แบบว่ากดปุ่มนี้ส่งข้อมูลชุดนี้ กดอีกปุ่มส่งข้อมูลอีกชุด
    (ส่งอย่างเดียวอ่ะครับไม่ต้องรับ)
    คือผมไม่ค่อยเก่งเรื่องเขียนโปรแกรมหน่ะครับ
    ขอรบกวนด้วยนะครับ สำคัญมาก
    ปล.อยากได้รายละเอียดมากๆ

    ตอบลบ
  18. @Mangkorn สามารถทำได้ครับสบายมากครับผมทดลองทำมาแล้วข้อมูลที่ส่งก็ส่งเป็น String ไปครับแล้วให้ Microcontroller นำ String ไปประมวลผลได้ครับ

    ตอบลบ
    คำตอบ
    1. ต้องแก้ไขตรงไหนอะครับ คือผมต้องการส่งไปที่microและรับค่าmicroอะคับ

      ลบ
  19. อ่าครับ ขอบคุณมากครับ
    แล้วมันยุ่งยากหรือเปล่าครับ พอจะมีตัวอย่างให้ดูไหมครับ

    ตอบลบ
  20. @Mangkorn ใช้ตัวอย่างของผมไปแก้ Code ได้เลยครับ

    ตอบลบ
  21. @fonthning ต้องเขียน App บน Android มารับค่านะครับแต่ไม่ยากนะครับสามารถทำได้

    ตอบลบ
  22. พี่ค่ะ ลอง โค๊ด จากพี่ดูแล้ว ไม่ทราบว่า มันเกิดข้อผิดผลาดจากตรงไหน คือ ส่งข้อความจาก android ไปแร้ว แต่ มันไม่แสดงในTerminal Emulator เรยค่ะ

    T___T

    ตอบลบ
  23. @fonthning แก้ MAC Address ของ Bluetooth ปลายทางยังครับ

    ตอบลบ
  24. ความคิดเห็นนี้ถูกผู้เขียนลบ

    ตอบลบ
  25. ผมได้โหลด code ของพี่มารันดูสามารถใช้งานได้สมบูรณ์ครับ ผลจึงลองสร้างโปรเจคใหม่แล้ว ทำตามโปรเจคพี่ทุกอย่าง ใน code ไม่มี error สามารถรันได้แต่เมื่อรันแล้วมันเด้งว่า The Application (ชื่อโปรเจค) has stopped unexpectedly.Plase try again.

    ตอบลบ
    คำตอบ
    1. ปล.1 code ของผมเหมือนที่ทุกอย่างต่างที่ชื่อโปรเจค package และ class ซื่งในส่วน code ผมก็แก้เฉพาะ ส่วนที่มีผลตอชื่อ class ครับ

      ปล.2 ผมได้ลอง debug ดูพบว่ามันเกิด error ที่ฟังชั่น BluetoothInit

      ลบ
    2. ปล.3 หากผมไม่เรียกใช้ ฟังชัน BluetoothInit จะสามารถรันได้ปกติ

      ปล.4 ผม copy ทั้ง code ไฟล์ java และ xml เหมือน เปะ ครับ

      ปล.5 รบกวนหน่อยนะครับผมไม่รู้จะแก้ยังไง หรือยังขาดอะไรอีก ขอบคุณครับ

      ลบ
    3. รบกวน zip Project ที่คุณลองรันแล้วเกิด error ส่งมาให้ผมหน่อยครับ เดี๋ยวผมช่วยดูให้

      ลบ
    4. สวัสดีครับ พี่ อ.ที่มหาลัยเพิ่งให้โปรเจคผมมาชิ้นนึงอะครับ ประมาณว่า ให้เอาค่าได้ที่ได้ จาก พวก เซ็นเซอร์ ECG มา monitor บนมือถือ โดยผ่าย Bluetooth คือผมไม่เคยทำ andriod มาก่อนเลย แต่ เคนมีประสบกาณ์มาบ้าง ในภาษา จาวา คือ เคยเขียน java application ลง PC อะครับ เคยเล่น พวก socket อยู่บ้าง และ ก็ เขียน APPs ของ Iphone เล่นๆ บ้างอะครับ

      ​ปัญหา ผมอยู่ว่า ผมไม่แน่ใจว่า ถ้าผมใช้ บลูทูธ เป็นสื่อกลางในการสื่อสาร ระหว่างมือถือ andriod กับ ECG มันจะมีทางเป็นไปได้หรือป่าวครับ และ ถ้ามีทางเป็นไปได้ผมจะ ต้องเรียนรู็อะไรบ้างครับ

      ขอบคุณมกาๆนะครับ

      ลบ
    5. ตอบคุณ Hamealone นะครับ สามารถใช้ Bluetooth ได้ครับ เขียนง่ายๆไม่ยากครับ

      ลบ
    6. สิ่งที่ต้องเรียนรู้เพิ่มเติมก้เรื่องเกี่ยวกับการส่งข้อมูลด้วย RS232 ระหว่าง Bluetooth กับ Microcontroller และ Bluetooth กับ Android Device ครับ

      ลบ
    7. ขอบคุณมากๆๆ ครับ พี่ ถ้าแบบนั้นผมจะตอบตกลง ข้อเสนอ อ. ละคัรบ ขอบคุณมกาๆครับ

      ลบ
  26. สวัสดีครับ ผมเพิ่งเริ่มหัดเขียน แอปบนแอนดรอยด์ เป็นแอปมัลติมิเตอร์ ที่รับค่าจากการวัด V ,A ,R
    แล้วมันแสดงค่าบน แอนดรอยด์ อยากจะข้อคำแนะนำ เรื่องกับรับส่งข้อมูล แบบUSB กับ bluetooth อันไหนดีกว่ากัน ขอความช่วยเหลือน่อยนะครับ ขอบคุณมากครับ

    ตอบลบ
    คำตอบ
    1. เนื่องจาก Android มี USB พอร์ตแค่ช่องเดียวดังนั้นการส่งข้อมูลควรเป็นแบบไร้สายเช่น bluetooth หรือ wifi จะดีกว่าครับ

      ลบ
    2. พี่เคยลองเขียน การส่งค่า และ รับค่า กับพวก ไมโคร ไหมครับ
      ถ้ามีช่วยแนะนำโค้ดหน่อยครับ

      ลบ
    3. ลองนำโค๊ดของผมไปประยุกต์ก็ได้ครับเพราะผมก็ใช้โค๊ดตัวนี้เทสกับ Bluetooth module แล้วส่งผ่าน microcontroller เข้า PC แล้วเหมือนกันครับ

      ลบ
    4. อ่ะครับ มันจะแตกต่างกันไหมครับ ระหว่าง PC กับ Android เพราะผมต้อง ส่งค่าและรับค่า ด้วย

      ลบ
    5. การรับส่งค่าไม่ต่างกันครับ

      ลบ
    6. อะครับ กำลังตันสุดเลยครับ

      ลบ
    7. ตันตรงไหนครับ บอกได้ครับ

      ลบ
    8. การนำค่าที่รับจาก USB มาโชว์ บน android อะครับ

      ลบ
    9. หมายถึงต่อ USB กับ android แล้วส่งค่าหากันเหรอครับ

      ลบ
    10. android ต่อ USB กับ board microcontroller ครับ มันรับส่งค่าแบบไหน
      และใช้คำสั่ง แบบไหนในการรับ การส่ง

      ลบ
    11. ถ้าต่อตรงทาง usb ต้องเขียนให้เป็น USB Host แทนนะครับ ลองดูตัวอย่างที่นี่ http://developer.android.com/guide/topics/usb/index.html

      ลบ
    12. ครับ แต่ดูแล้วผมยัง งง อยากได้ตัวอย่างโค้ด ที่มันต่อกับงานอื่นๆ พอมีไหมครับ

      ลบ
  27. พี่ครับ ถ้าผมจะลองเขียน ให้ แอนดรอยด์ส่ง TX RX จะต้องทำไงบ้างครับ พอมีตัวอย่างกัน ส่งค่าออกไหมครับ

    ตอบลบ
    คำตอบ
    1. ถ้าส่งจาก Bluetooth ก็ตามโค๊ดตัวอย่างของผมเลยครับแต่ถ้าเป็นแบบ USB ผมยังไม่เคยลองเขียนเหมือนกันครับ

      ลบ
    2. ครับผม ผมกำลังแก้ไข โค้ด ว่ามันจะไปใช้กับ USB ได้รึป่าว

      ลบ
  28. พี่ๆค่ะ นู๋ต้องทำโปรเจ็กย่อยส่งอาจารย์ ใช้แอนดรอยส่งผ่านบลูธูทไปหาคอนโทรลเลอร์นู๋เขียนcodeอย่างนี้หลังจากกดปุ่มค่ะ
    String message="11";
    byte[] outBuffer = message.getBytes();
    try
    {

    outStream = btSocket.getOutputStream();
    }
    catch (IOException e)
    {
    // TODO Auto-generated catch block
    }
    try
    {
    outStream.write(outBuffer);
    outStream.flush();
    }
    catch (IOException e)
    {
    // TODO Auto-generated catch block
    }
    นู๋ต้องการส่งอย่างเดียวส่งคำว่า "11" ไปที่คอนโทรลเลอร์แล้วให้คอนโทรลเลอร์ทำงานแต่พอrunในมือถือมันก็บังคับปิด ***มือถือนู๋จับคู้กับคอนโทรลเลอร์แล้วนะค่ะ ช่วยแนะนำทีนะค่ะ

    ตอบลบ
    คำตอบ
    1. ขอดู log ที่ error ใน logcat ของ ddms หน่อยครับ

      ลบ
  29. สวัสดีครับ ผมทำแอพส่งค่าสตริง ครับ แต่ส่งค่าไม่ได้ครับ แต่แอพก็รันในเครื่องได้นะครับจับคู่ได้ แต่ส่งค่าสตริงไม่ได้ ทำแอพ 2.3.3 แต่รันกับเครื่อง 2.3.4 มีปัญหารึป่าวครับ

    พอรันขึ้นแบบนี้อะครับ ใน console
    BluetoothChat] WARNING: Application does not specify an API level requirement!
    BluetoothChat] Device API version is 10 (Android 2.3.4)
    เลยอยากจะส่งให้อ.ช่วยดูให้หน่อยครับ จะได้หรือป่าว

    ตอบลบ
    คำตอบ
    1. ปกติการ develop จาก version ต่ำกว่าแล้วไปรันบน version สูงกว่าจะไม่มีปัญหานะครับ ลองปรับ API level เป็น Android 2.2 แล้วลองเทสดูอีกครั้งครับ

      ลบ
  30. minSdkVersion="8"
    android 2.2

    ช่ายรึป่าวครับ

    ตอบลบ
    คำตอบ
    1. ใช่ครับ ลองปรับดูครับ

      ลบ
    2. เครื่องต้องการเป็น API 10 รึป่าว ไม่ได้อะครับ

      ลบ
  31. [2012-04-27 22:22:33 - BluetoothChat] WARNING: Application does not specify an API level requirement!
    [2012-04-27 22:22:33 - BluetoothChat] Device API version is 10 (Android 2.3.4)

    ไม่ได้ครับขึ้นแบบนี้ใน console ส่งไม่ได้ หรือโค้ดผมจะผิด แต่ก็ไม่มีเออเร่อนะครับ :( ตัน

    ตอบลบ
    คำตอบ
    1. ส่งโค๊ดมาให้ผมดูก็ได้ครับ

      ลบ
    2. เมลล์อ. ดูตรงไหนหรอครับ หาไม่เจอ ^^"

      ลบ
    3. ความคิดเห็นนี้ถูกผู้เขียนลบ

      ลบ
    4. ส่งแล้วครับ ได้รับยังครับ

      ลบ
    5. ได้แล้วครับ กำลังดูให้อยู่ครับ

      ลบ
    6. ครับ ขอบคุณครับ

      ลบ
    7. ผมเทสแล้วก็เชื่อมต่อได้และมีข้อมูล ABCD ออกปกตินะครับ ผมเทสบน Huawei Mediapad Android 3.2 กับ Motorola Atrix Android 2.3.7 ข้อมูลก็ออกปกตินะครับ

      ลบ
    8. หรอครับ ใช้ได้ใช่ไหมครับ ที่ผมทำ ทำไมผมเชื่อมต่อแล้วส่งค่าไปไมโครคอนโทรลเลอร์แล้ว ไม่มีผล หมายถึงไฟไม่ติด หรือเป็นที่โปรแกรมในไมโครคอนโทรลเลอร์

      หรือเป็นที่เครื่อง samsung mini ผม มีปัญหา ผมควรลองแก้เทส จากอะไรก่อนดีครับ

      สรุปคือ ที่เขียนใช้ได้ ใช้ส่งได้จริงนะครับ ขอบคุณครับ

      ลบ
    9. คิดว่าปัญหามันเกิดจากการที่ตอน pair อุปกรณ์นั้นมันมีการเซตให้ใส่รหัสด้วย ซึ่ง module bluetooth อาจจะเซตไม่ตรงกันทำให้ pair กันไม่ได้หรือเปล่าผมไม่แน่ใจนะ คิดว่าไม่น่าจะเป็นปัญหาที่ตัวแอพแล้วละครับ

      ลบ
    10. ให้ debug ทีละส่วนนะครับ ส่วนแรกเป็นส่วนที่ส่งข้อมูงผ่าน bluetooth ลองเทสตามวิธีของผมในคลิปนี้ดูนะครับ ttp://www.youtube.com/watch?v=WPf0NPHcuxk

      ลบ
    11. ออครับ ช่ายครับ ตอนคอนเน็คครั้งแรกจะให้ใส่รหัส แต่ครั้งต่อมาคอนเน็คอีกก็ไม่มีให้ใส่แล้วนะครับ งั้นผมจะไปดูที่อุปกรณ์ ไมโครคอนโทรล ครับ ขอบคุณครับ

      ลบ
    12. ใช้โปรแกรมอะไรเทสหรอครับ เห็นเปิดขึ้นมา

      ลบ
    13. โปรแกรม hercules ครับ

      ลบ
    14. เทสยังไงครับดูแล้ว ไม่เข้าใจ ต้องต่อ usb เครื่องเข้ากับคอมหรอครับ ตอนเทส

      ลบ
    15. Mobile <-- Bluetooth --> Notebook <-- Com Port --> Hercules Serial Emulator

      ลบ
  32. toggleButton1 = (ToggleButton) findViewById(R.id.toggleButton1);
    toggleButton1.setOnClickListener(new OnClickListener() {

    String message;
    public void onClick(View v) {
    if (.....เงื่อนไข..... ) {
    message = "A";
    sendMessage(message);
    } else {

    message = "a";
    sendMessage(message);
    }
    }
    });

    ตรงเงื่อนไข จะเช็คว่า ถ้า toggle button on ให้ ส่ง A off ให้ส่ง b จะต้องใส่อะไรตรงเงื่อนไขครับหรือเช็คจาก text แนะนำบอกทีครับ ขอบคุณครับ

    ตอบลบ
    คำตอบ
    1. ตามนี้เลยครับ

      ToggleButton tg;
      if(tg.isChecked())
      //Do something
      else
      //Do something else

      ลบ
  33. toggleButton1 = (ToggleButton) findViewById(R.id.toggleButton1);
    toggleButton1.setOnClickListener(new OnClickListener() {
    //Boolean isOn = false;
    String message;
    public void onClick(View v) {

    if (toggleButton1.isChecked()) {

    message = "A";
    sendMessage(message);

    }
    else {
    message = "a";
    sendMessage(message);

    }


    }
    });

    แก้เป็นแบบนี้ถูกแล้วใช่ไหมครับ

    ตอบลบ
  34. อ.ครับ หากเราจะเปลี่ยนชื่อโปรเจค จะทำได้อย่างไรครับ เพราะว่าชื่อโปรเจคตอนสร้าง แล้วรันก็จะแสดงชื่อนั้น ผมอยากจะเปลี่ยนทำอย่างไรครับ

    ตอบลบ
  35. แก้ในไฟล์ AndroidManifest.xml เลยครับมันจะมีลิงค์ที่อ้างอิงตัวแปรที่เก็บชื่อ Application อยู่ครับ

    ตอบลบ
  36. [2012-05-09 09:58:51 - Controlblue] ActivityManager: Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.example.android.Bluetoothchat/.controlblue }
    [2012-05-09 09:58:51 - Controlblue] ActivityManager: Error type 3
    [2012-05-09 09:58:51 - Controlblue] ActivityManager: Error: Activity class {com.example.android.Bluetoothchat/com.example.android.Bluetoothchat.controlblue} does not exist.


    ผมจะแก้ชื่อให้เป็น controlblooth ตอนอยู่บนโทรศัพท์ แต่แก้ไป อ.ครับ มันขึ้นแบบนี้อะครับแก้ไป แก้มา ตอนแรกรันได้ แก้จนรันไม่ได้แล้วอะครับ อ.ช่วยดูให้ทีครับ ผมกลัวยิงแก้ยิ่งพังอะครับ ผมส่งเมลให้อ.ไปทางเมลแล้วครับ ช่วยดูให้ทีครับ ขอบคุณมากครับ

    ตอบลบ
    คำตอบ
    1. ตรงชื่อ package ไม่ต้องไปแก้นะครับ ดูจาก log มันเกิดจากหา main Activity class ไม่เจอนะครับ ผมยังไม่ได้เมลนะครับ

      ลบ
  37. แก้รันได้แล้วครับ แต่ว่าชื่อแอพที่แสดงบนโทรศัพท์ก็ยังเปลี่ยนไม่ได้อยู่ดีครับ ^^" ที่อ. บอกตรงนี้รึป่าว เปลี่ยนชื่อ แอพ
    android:label="@string/app_name"
    android:icon="@drawable/app_icon" >
    <activity android:name=".controlblue" // เปลี่ยนชื่อ
    android:label="@string/app_name"

    ตอบลบ
    คำตอบ
    1. แก้ไขครับ ไม่ใช่ตรงนั้นนะครับ จะมีไฟล์ resource ที่เก็บ String app_name อยู่ครับไปแก้ตรงนั้นแทน

      ลบ
    2. ดูตัวอย่างตามภาพนะครับ https://picasaweb.google.com/lh/photo/NtKAjomwitTxsM5oDPX8g9MTjNZETYmyPJy0liipFm0?feat=directlink

      ลบ
    3. ได้แล้วครับ ขอบคุณครับ

      ลบ
  38. ImageButton เมื่อคลิกแล้วโชว์ listview image เพื่อให้เลือกคลิกไปแทน lmageButton เดิม มีตัวอย่างมั้ยครับ หรือช่วยแนะนำทีครับ

    ตอบลบ
    คำตอบ
    1. คือกด imagebutton แล้วแล้วมี list ของ image ขึ้นมาเพื่อนำภาพที่เลือกไปแทนภาพเดิมใช่ไหมครับ

      ลบ
    2. ช่ายครับ อาจารย์

      ลบ
    3. เดี๋ยวพรุ่งนี้ผมเขียนตัวอย่างไว้ให้ดูละกันครับ

      ลบ
    4. ขอบคุณมากเลยครับ

      ลบ
    5. ผมขอเป็นไฟล์โปรเจคตัวอย่างได้ไหมครับ จะได้เห็นโค๊ด+รูปในไฟล์การรัน ใน xml กับ java จะได้เข้าใจ เห็นแต่โค้ด ผมเข้าใจยาก ต้องทำความเข้าใจนานๆ น่ะครับ ขอบคุณครับ bangkkub99999@gmail.com

      ลบ
    6. ความคิดเห็นนี้ถูกผู้เขียนลบ

      ลบ
    7. ความคิดเห็นนี้ถูกผู้เขียนลบ

      ลบ
    8. ImageButton กับ ListView ผมเขียนไว้ให้แล้ว download จากลิงค์นี้ได้เลยครับ https://www.dropbox.com/s/kfzxelwh3li9c20/ImageButtonWithImageList.zip

      ลบ
    9. ตัวอย่างที่ผมเขียนให้เพื่อความรวดเร็วผมได้นำโค๊ดจากที่ http://www.mkyong.com/android/android-listview-example/ มาปรับปรุงแก้ไขนิดหน่อย

      ลบ
  39. สวัสดีครับ..พอดีผมจะทำโปรแจคที่เกี่ยวกับการรับค่าจากไมโครคอนโทลเลอร์มาเก็บไว้ที่เครื่องsever เก็บเป็นดาต้าเบส และประมวลผล และแสดงออกมาทางแอนดรอย ควรเริ่มศึกษาที่ไหนครับ .... พอมีข้อมูลที่น่าสนใจไหมครับ พอดีพึ่งเริ่มหัดทำนะครับ แต่ยังไม่เคยเขียนเชื่อมต่อกับไมโคร อาจารย์เขาอยากให้เปิดเป็นเว็ปธรรมดา ก็สามารถดูได้ด้วยนะครับ

    ตอบลบ
    คำตอบ
    1. จาก micro controller --> DB ก็เขียนให้เชื่อมต่อกันได้หลายแบบ (RS232, Bluetooth) ส่วนแสดงผลแนะนำให้เขียนเป็นเวบแล้วใช้ responsive framework ช่วยเอาครับจะได้ไม่ต้องไปเขียนหน้าเวบหลายหน้า้พื่อแยกระหว่างมือถือกับ PC

      ลบ
  40. ขออนุญาติสอบถามครับ
    code ชุดนี้สามารถนำไปควบคุมอุปกรณ์ได้หรือป่าวครับ

    ตอบลบ
    คำตอบ
    1. สามารถนำไปประยุกต์ใช้ควบคุมอุปกรณ์ได้ครับ

      ลบ
  41. ถ้าผมอยากให้เมื่อกดปุ่มค้างก็ให้ส่งข้อความนั้นออกตลอด หยุดส่งเมื่อปล่อยมือจากปุ่มทำได้ไหมครับ

    ตอบลบ
  42. สวัสดีครับ ตอนนี้ผมกำลังศึกษา การเขียนโปรแกรมแอนดรอย์ เพื่อส่งค่าไปยัง ไมโครคอลโทรลเลอร์ ผ่านบลูทูธ แต่ความรู้ทางด้าน android ผมน้อยมาก อยากให้อาจารย์ช่วยหน่อยได้ไหมครับ

    ตอบลบ
    คำตอบ
    1. ต้องลองศึกษาเองแล้วลองทำเองก่อนถ้าติดขัดตรงไหนผมจะช่วยตอบให้ครับ

      ลบ
    2. ผมสามารถเชื่อมต่อบลูทูธได้แล้วครับ
      ตอนนนี้ผมอยากเขียน คำสั่งกด switch แล้วส่งค่า digital ไปยังไมโครอะครับ มันต้องเขียนแนวไหนอะครับ

      ลบ
    3. เอาโค๊ดที่ผมเขียนในตัวอย่างไปแก้ไขนิดหน่อยก็ใช้กับโปรเจคคุณได้แล้วครับ

      ลบ
    4. import โปรเจคแล้วมัน error อะครับ
      The method onClick(View) of type MainActivity must override a superclass method

      The method onClick(View) of type MainActivity must override a superclass method

      มี 2 อันอะครับ

      ลบ
  43. สอบถามคะ มีโปรเจคเกี่ยวกับ รับค่า น้ำหนัก จากเครื่องชั่งมาแสดงผล บนโทรศัพท์ระบบ Android การรับส่งข้อมูลทาง Bluetooth ไม่ทราบว่า ทำอย่างไรคะ การติดต่อ รับค่า จากเครื่องชั่ง

    ตอบลบ
    คำตอบ
    1. ต้องดูก่อนว่าจากเครื่องชั่ง มีการส่งข้อมูลแบบใดออกมาครับแล้วจึงนำข้อมูลนั้นมาต่อกับ Bluetooth module อีกทีเพื่อส่งข้อมูลมายัง Android อีกทีหนึ่งครับ

      ลบ
    2. ตอนนี้ สามารถส่งค่า(serial)น้ำหนักที่ชั่ง ผ่านทางบลูทูธ(Bluestick)ได้คะ ใช้ Bluetooth Terminal มารับค่า .. แต่ไม่รู้ว่าจะนำค่าน้ำหนักที่ได้ มาแสดงในแอพที่เราจะสร้างได้ยังไงคะ // รบกวนด้วยแนะนำด้วยคะ เพิ่งเริ่มต้นคะ

      ลบ
    3. ลองเอาโค๊ดของแอพตัวอย่างของผมไปลองทดสอบบน Android ดูก่อนครับ แล้วก้แก้ UI ของแอพผมเอาก้น่าจะใช้ได้ครับ

      ลบ
    4. โอเคคะ .. เด่วของลองศึกษาโค๊ด แล้วยังไง จะขอมาปรึกษาเพิ่มเติมนะคะ ^^ ขอบคุณมากคะ

      ลบ
    5. ปัญหาที่พบ หลังจาก เอา app ไป ลง ที่ โทรศัพท์ 2 เครื่อง
      ไม่สามารถ ส่งข้อความกันได้ ไม่ทราบว่าต้อง แก้อย่างไรคะ

      ลบ
    6. ขอโทษนะคะ รบกวนถามเพิ่มเติม จากโค๊ดที่แจกฟรีคะ
      ส่งค่า *120.5*140.5*025.0 (ค่าติดกันทุกตัว)
      แสดงผลจาก โปรแกรมแสดงค่า (เว้นบันทัดให้เอง ไม่ได้เขียนสั่งจากโค๊ดคะ)
      *
      120.5
      *
      140.5
      *
      025.0

      แสดงผลจาก App - bluetooth terminal
      *120.5
      *140.5
      *025.0

      แสดงผลจาก ต่อกับคอม ผ่านโปรแกรม Hercules SETUP utility
      *120.5*140.5*025.0

      ลบ
    7. ลองแก้ไขการต่อกันของข้อความที่รับเข้ามาดูครับ

      ลบ
  44. ความคิดเห็นนี้ถูกผู้เขียนลบ

    ตอบลบ
  45. พอดีผมเเก้ใขเเมกเเอดเดรสทั้งสองดัวเเล้วครับ เเล้วเเอฟยังบังคับปิด อีกมันเป็นเพราะอะไร
    และ คืออะไรครับแก้ยังไงครับ

    ตอบลบ
  46. รบกวนหน่อยคับ
    พอดีผมจะหาบอร์ดไมโครคอนโทรลเลอร์ ตัวไหนคับ ที่จะติดต่อกับโทรศัพท์มือถือ โดยผ่าน wifiไร้สายนะคับ พอดีผมไม่ค่อยรู้เรื่องพวกนี้นะคับ ขอบคุณมากคับ

    ตอบลบ
    คำตอบ
    1. มีหลายตัวนะครับ ถ้าแบบง่ายๆหน่อยก็ arduino + wifi Shield ครับ

      ลบ
  47. เเล้ว เอา accelerometer ออก บลูทุธ ต้องเริ่มยังไงครับ พอดี มีโคด accelerometer เเล้ว เพียงเเต่ประสานกันกะบลูทูชไม่เป็น

    ตอบลบ
    คำตอบ
    1. เขียน Timer หรือ Thread บนแอนดรอยด์แล้วทำการอัพเดตค่าจาก accelerometer ไปยัง ฟังก์ชันส่งค่าผ่านบลูธูทครับ

      ลบ