PDA

View Full Version : اتصال از طریق بلوتوث به وسیله ای با mac ثابت (bluetoothSocket)



Saeed.MD
چهارشنبه 19 شهریور 1393, 00:09 صبح
سلام
همانطور که از عنوان پیداس میخوام یه اپ داشته باشم که یک دکمه داره و وقتی اون دکمه رو فشار میدیم به وسیله مورد نظرم کانکت بشه و پیام مورد نظرم مثلا "ok" رو بفرسته و دیسکانکت بشه

الان من از این کد استفاده میکنم و به خوبی کار میکنه اما چند تا سوال داشتم که پایین میپرسم

public class Main extends Activity {
private static Button bSend;
private static String currentMAC = "yy:xx:zz:xx:zz:xx";
private static BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();
private static BluetoothSocket btSocket = null;
private static OutputStream btOutputStream =null;
private static Context context=null;



@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bSend = (Button) findViewById(R.id.bSend);
bSend.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
String content = "ok";
connectBT();
try {
btOutputStream.write(content.getBytes());
cancelBT();
} catch (Exception ex) {
Toast.makeText(context, "Error", Toast.LENGTH_SHORT).show();
cancelBT();
}

}
});
}

void connectBT(){
if (btAdapter.isEnabled()){
try {
BluetoothDevice device = btAdapter.getRemoteDevice(currentMAC);
Method m = device.getClass().getMethod("createRfcommSocket", new Class[] {int.class});
btSocket = (BluetoothSocket) m.invoke(device, 1);
btAdapter.cancelDiscovery();
btSocket.connect();
btOutputStream = btSocket.getOutputStream();
} catch (Exception e1){
Toast.makeText(context, "Can’t connect to device", Toast.LENGTH_LONG).show();
cancelBT();
return;
}}

}
private void cancelBT() {
if (btOutputStream!=null) {
try {
btOutputStream.close();
} catch (Exception ex){};
btOutputStream=null;
}
if (btSocket!=null){
try {
btSocket.close();
} catch (Exception ex){};
btSocket=null;
}
}
}


سوالام:
یک: وفتی بلوتوث گوشی خاموشه و من اون دکمه رو میزنم برنامه کرش میکنه و خارج میشه . چیکار کنم که وقتی بلوتوث خاموشه از برنامه بیرونن نیاد و فقط یه تُست بیاد و یه چیزی بگه ؟؟؟

دو: آیا راه ساده تر با کد کمتر برای اتصال به وسلیه بولوتوثی هست ؟؟؟

سه: وقتی بلوتوث گوشی روشنه اما مثلا دستگاه دوم خیلی دوره یا خاموشه با زدن دکمه بعد 3-4 ثانیه اپ کرش میکنه و خارج میشه
سه1 : میشه اون مقدار زمان رو کمتر کرد ؟
سه2: چطوری از کرش کردن جلوگیری کنم مثل سوال یک

نکته: این کد ها رو من ایجاد نکردم واز یک پروژه opensource نگاه کردم و بعضی خط هاشو کپی کردم

saeed_g21
چهارشنبه 19 شهریور 1393, 00:16 صبح
1- در Logcat ببین خطاش چیه بزارش تو Catch

Saeed.MD
چهارشنبه 19 شهریور 1393, 00:24 صبح
1- در Logcat ببین خطاش چیه بزارش تو Catch

اوف چه سریع !! :قلب:
والا من تقریبا هیچی نمیدونم ، logcat کجاس ؟

در مورد سوال دوم چطور ؟ راه غیر از این هست ؟

saeed_g21
چهارشنبه 19 شهریور 1393, 00:30 صبح
خوب دیگه ما اینیم :بامزه:

Logcat همون جایی هست که هر گونه رخ دادی در دستگاه رو نشان میده و اگه هنگام کار در برنامه خطایی رخ بده رو کل متن خطا رو با قرمز رنگ مشخص میکنه که برای دسترسی به این گزینه بایستی از قسمت DDMS استفاده نمایید

برید قسمت DDMS لاگ خطا رو بزارید تا بگیه مراحل طی بشه

در مورد بگیه سوالت شرمنده تا حالا با BlueTooth کار نکردم

Saeed.MD
چهارشنبه 19 شهریور 1393, 03:33 صبح
توی logcat اینا قرمز هستن :

09-10 03:03:42.523 13572-13572/md.saeed.controller E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: md.saeed.controller, PID: 13572
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference
at android.widget.Toast.<init>(Toast.java:93)
at android.widget.Toast.makeText(Toast.java:241)
at md.saeed.controller.Main$1.onClick(Main.java:41)
at android.view.View.performClick(View.java:4438)
at android.view.View$PerformClick.run(View.java:18422 )
at android.os.Handler.handleCallback(Handler.java:733 )
at android.os.Handler.dispatchMessage(Handler.java:95 )
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.jav a:5001)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCa ller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit .java:601)

یه توضیحی مختصر میشه بدید ؟

pbm_soy
چهارشنبه 19 شهریور 1393, 06:17 صبح
اولین خطای شما بخاطر این است که با دستور زیر خواستی داده بفرستی بدون اینکه چک کنی شئء ایجاد شده یا خیر
btOutputStream.write(content.getBytes());

تقریبا تمام خطاهای که شما عنوان کردید بخاطر همین دلیل می تواند باشد یعنی قبل از اینکه بررسی کنی که آیا میتوانی فلان کار را انجام دهی بعد انجامش میدادی!
مثلا
همچین کدی باید می نوشتی


if(btOutputStream != null)
{
btOutputStream.write(content.getBytes());
cancelBT();
}

Saeed.MD
جمعه 21 شهریور 1393, 22:16 عصر
نصف مشکلم حل شد الان وقتی بلوتوث خاموشه دیگه از برنامه خارج نمیشه
اما وقتی بولوتوث روشنه ولی ارتباط (به هر دلیلی) برقرار نمیشه باز برنامه کرش میکنه و همون خطا ها توی CATLOG ظاهر میشوند
توی این حالت به خاطر اینکه بولوتوث روشنه
btOutputStream != null هست
و مقدار شرط true میشه
چیکار کنم به نظرتون ؟

saeed_g21
جمعه 21 شهریور 1393, 23:46 عصر
در دو پست قبل خطای معروف NullPointerException رو داشتی ولی اگه بازم همین خطا رو در Logcat خود میبینید کافیست کدی که در زیر دادم رو به try مورد نظر اضافه کنید
اگه بعد از افزودن کد خطا گرفت به یک شرط بالاتر اضافه کن
catch(NullPointerException e){ Toast.makeText(getApplicationContext(), "متن مورد نظر", 1).show();
}

Saeed.MD
شنبه 22 شهریور 1393, 02:43 صبح
مشکل کلا از جای دیگه بود ( الکی سر کار بودم ) :لبخند:

Catch ها همشون درست عمل میکردند اما موقع اجرای دستورات
Toast.makeText(context, "Can’t connect to device", Toast.LENGTH_LONG).show();
و چون context=null بود ارور میداد :))
context=this کردم الان همه چی ایده‌ال

با تشکر از همه دوستان

Shut Down
شنبه 22 شهریور 1393, 03:06 صبح
مشکل کلا از جای دیگه بود ( الکی سر کار بودم ) :لبخند:

Catch ها همشون درست عمل میکردند اما موقع اجرای دستورات
Toast.makeText(context, "Can’t connect to device", Toast.LENGTH_LONG).show();
و چون context=null بود ارور میداد :))
context=this کردم الان همه چی ایده‌ال

با تشکر از همه دوستان
کانتسک رو برابر این قرار بدی بهتره = getApplicationContext(); اینو الان دستی نوشتم ممکنه غلط املایی داشته باشه :D بعضی جاها هم ممکنه باعث کرش پروژه بشه :|