PDA

View Full Version : ارتباط بین موبایل و کامپیوتر از طریق WiFi



Itist82
دوشنبه 15 خرداد 1391, 19:05 عصر
سلام
من مدت زیادی نیست که وارد دنیای برنامه نویسی آندروید شدم و هر چی هم یاد گرفتم به لطف زحمات آقای کمالان در وب سایت خوبشون بوده.
اخیرا برای پروژه ای لازم شده یه برنامه آندروید بنویسیم که از طریق شبکه محلی بیسیم بین موبایل و یه کامپیوتر اطلاعاتی رد و بدل بشه. توی اینترنت گشتم و کدی شبیه زیر پیدا کردم و برنامه ام رو نوشتم که بی خطا بود و روی گوشی نصب هم شد. توی ایمولاتور که اجرا می کردم دیدم با زدن یکی از دکمه ها هنگ می کنه و بعد پیغام میاد که می خوای منتظر بمونی یا ببندیش؟ گفتم شاید چون ایمولاتور WiFi نداره این جوری می شه اما روی گوشی واقعی هم وضع همین بود (یه برنامه ویندوز هم نوشتم با سی شارپ که قراره چیزی رو که این برنامه می فرسته بگیره). بازم سرچ کردم دیدم ظاهرا این مشکل خیلی ها هست اما راه حل درست براش پیدا نکردم. مطمئنم راه حل داره چون application هایی هست که دقیقا با همین سیستم کار می کنن، فقط من نمی دونم مشکل از کد منه یا تنظیمات خاصی توی مودم (مودم ADSL بیسیم که به تصور من باید بتونه کار روتر رو انجام بده) باید انجام بدم؟
فقط متدی رو گذاشتم که کار ایجاد سوکت و ارسال رو به عهده داره. موقع اجرا روی گوشی متوجه شدم که اجرای برنامه وارد اولین Catch این متد شده.


private void sendCommand(String message)
{

DataOutputStream OutputStrm = null;
Socket socket=null;
try {
socket = new Socket("192.168.1.20", 8080);
OutputStrm = new DataOutputStream(socket.getOutputStream());

OutputStrm.writeUTF(message);

} catch (IOException e1)
{
e1.printStackTrace();

}finally
{
if (socket != null)
{
try
{
socket.close();
} catch (IOException e)
{

e.printStackTrace();
}
}
if (OutputStrm != null){
try {
OutputStrm.close();
} catch (IOException e) {

e.printStackTrace();
}
}
}//finally

}//method

hooman.ahmadi
سه شنبه 16 خرداد 1391, 10:25 صبح
سلام،
اول اینکه پیشنهاد می کنم اگر می خواهید داده بین دو دستگاه منتقل کنید از web service استفاده کنید که البته پیشنهاد می شه اگر security اهمیت خاصی نداره از REST استفاده کنید. دوم اینکه لطفا خطایی که دریافت می کنید را و یا برنامه C# رو هم بزارید که بشه مشکل رو بررسی کرد.

Itist82
سه شنبه 16 خرداد 1391, 11:55 صبح
سلام
ممنون از پاسختون. این وب سرویس به نظرم ایده خوبیه. خودم سرچ می کنم اما اگه نمونه ای می شناسید ممنون می شم لینکشو بفرستید
امنیت اهمینتی نداره اما REST چی هست؟ نشنیده بودم
خطا فقط همونه که عرض کردم، برنامه آندروید یه مدت هنگ می کنه و بعدش پیغام میاد که می خوای بیشتر صبر کنی یا اینو ببندی چون داره خیلی طول می ده. توی برنامه سی شارپ هم Break point گذاشتم اما هیچ وقت به اونجا نرسید. بعدا سعی کردم از کامپیوتر آی پی گوشی رو ping کنم که دیدم اصلا دسترسی بهش نیست و Destination unreachable می ده.

در هر صورت اینم کد سی شارپ:


class clApplicationContext : ApplicationContext
{
private TcpListener tcpListener;
private Thread listenThread;
Form1 lampsForm;
private string _data;
string ReceivedData
{
get
{
return _data;
}
set
{
_data = value;
if (value.ToLower() == "first")
{
lampsForm.toggleFirst();
}
else
{
lampsForm.toggleSec();
}
}
}
public clApplicationContext()
{
lampsForm = new Form1();

this.tcpListener = new TcpListener(IPAddress.Any, 8080);
this.listenThread = new Thread(new ThreadStart(ListenForClients));
this.listenThread.Start();
}

private void ListenForClients()
{
this.tcpListener.Start();

while (true)
{
//blocks until a client has connected to the server
TcpClient client = this.tcpListener.AcceptTcpClient();

//create a thread to handle communication
//with connected client
Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
clientThread.Start(client);
}
}

private void HandleClientComm(object client)
{
TcpClient tcpClient = (TcpClient)client;
NetworkStream clientStream = tcpClient.GetStream();

byte[] message = new byte[4096];
int bytesRead;

while (true)
{
bytesRead = 0;

try
{
//blocks until a client sends a message
bytesRead = clientStream.Read(message, 0, 4096);
}
catch
{
//a socket error has occured
break;
}

if (bytesRead == 0)
{
//the client has disconnected from the server
break;
}

//message has successfully been received
ASCIIEncoding encoder = new ASCIIEncoding();
ReceivedData = encoder.GetString(message, 0, bytesRead);
//System.Diagnostics.Debug.WriteLine(received);

}

tcpClient.Close();
}
}

dehghanimeh
چهارشنبه 31 خرداد 1391, 23:09 عصر
با سلام
اول اینکه برنامه اندرویید شما سطح دسترسی شبکه برای اون تعریف شده؟
اگر شما نتونید از طریق کامپیوتر موبایل رو پینگ کنید مودم شما امکان روتر نداره و باید دنبال اکسس پوبنت باشید
موفق باشید

Itist82
شنبه 10 تیر 1391, 18:53 عصر
با سلام
اول اینکه برنامه اندرویید شما سطح دسترسی شبکه برای اون تعریف شده؟
اگر شما نتونید از طریق کامپیوتر موبایل رو پینگ کنید مودم شما امکان روتر نداره و باید دنبال اکسس پوبنت باشید
موفق باشید

به نظرم برای اجازه استفاده از شبکه این خطوط در مانیفست لازم بود که اضافه کردم:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>


راستش اسم مودم ما توش کلمه روتر هم داره و من بعدا تونستم ایده ی اون دوستمون رو که گفت وب سرویس استفاده کن عملی کنم. البته من وب سرویس نساختم، یه وب سایت ساختم، روی لپ تاپ خودم پابلیش کردم و تو نستیم روی موبایل اونو ببینیم. البته مسئله این بود که فایروال ویندوز اجازه اتصال موبایل و کامپیوتر رو نمی داد که مجبور شدیم غیر فعالش کنیم. حالا نمی دونم باید چه چیزی برای فایروال تعریف کرد تا موبایل رو استثنا بدونه یا در واقع اجازه متصل شدن کلاینت ها رو به IIS بده

dehghanimeh
یک شنبه 11 تیر 1391, 22:43 عصر
با سلام
من در مورد فایر وال اطلاع زیادی ندارم . ایده وب سرویس برای وقتی خوبه که شما کامل بخوای روی اینترنت کار کنی و اینو به خاطر داشته باش در وب سرویس همیشه client یا همان موبایل باید شروع کننده ارتباط باشه و یک سری اطلاعات به وب سرویس ارسال کنه تا پاسخ اون دریافت بشه یعنی ارتباط یه جورایی یک طرفه است . ولی در برنامه نویسی سوکت(مثال خودتون) ارتباط میتونه کامل دو طرفه باشه مثلا کامپیوتر در یک وضعیت خاص به پورت برنامه موبایل وصل بشه و اطلاعات را به برنامه موبایل ارسال کنه.
موفق باشید

dehghanimeh
یک شنبه 11 تیر 1391, 22:44 عصر
پست تکراری

hosein_hgh
شنبه 04 شهریور 1391, 16:43 عصر
سلام دوستان من یه مدت دارم روی همین موضوع کار میکنم ،
بنظرتون اگر با Asp یه پیج درست کرد و اون رو با web servis روی یه ip خاص گذاشت بعد توی محیط eclips فقط یه web browser بسازیم راحتر نیست ؟
من واقعا با این موضوع درگیرم ، مرسی از توجهتون...

Itist82
چهارشنبه 15 شهریور 1391, 12:27 عصر
دوست عزیز dehghanimeh، نیاز ما با همین حالت که همیشه موبایل شروع کننده باشه رفع می شد به همین خاطر این کار رو کردم. اما این که این بحث رو دارم ادامه می دم به این خاطره که ممکنه بعدا بخواهیم وجود یه کامپیوتر رو توی محیط که عرض کردم نقش وب سرور رو اجرا می کرد (البته توجه کنید که این یه وب سرور در شبکه محلیه و نه اینترنت) حذف کنیم. اون وقت احتمالا به برنامه نویسی سوکت نیاز پیدا می کنیم.

حالا یه چیز دیگه. شما فعلا همین معماری رو در نظر بگیر، یعنی یه شبکه محلی، با یه روتر، یه کامپیوتر که توی اون شبکه داره کار وب سرور رو انجام می ده (کلاینت ها بیشتر از یکی دوتا نیست) و کلاینت ها یا همون موبایل هایی که به اون وب سایت روی کامپیوتر با مرورگر خودشون دسترسی دارن. حالا آیا می شه سخت افزاری غیر از کامپیوتر داشت که بشه روش همون وب سایت رو هاست کرد که همون کارهای کامپیوتر رو انجام بده؟ من می دونم که می شه چون همه ی مودم ها دارن عملا این کار رو انجام می دن. شما صفحه تنظیمات مودم رو توی مرورگر کامپیوترتون می بینید، یعنی یه وب سایته.. فقط نمی دونم این چه سخت افزاریه و چه طور می شه تهیه اش کرد. ممنون می شم اگه اطلاعاتی دارید بگید

دوست عزیز hosein_hgh، شما اگه پست ها رو مطالعه کنید متوجه می شید که من دقیقا همین ایده شما رو پیاده کردم و شده! حتی نیازی نیست یه مرورگر برای گوشی بسازید، می تونید از مرورگر خود گوشی استفاده کنید. موفق باشید

dr_jacky_2005
شنبه 18 شهریور 1391, 10:20 صبح
https://www.google.com/#hl=en&safe=off&output=search&sclient=psy-ab&q=send+and+receive+Data+Android+and+PC&oq=send+and+receive+Data+Android+and+PC&gs_l=hp.3...729.12501.1.12627.37.29.2.6.6.3.486.10 107.3-22j5.27.0.les%3B..0.0...1c.1.BeYS2DD0fyc&bav=on.2,or.r_gc.r_pw.r_cp.r_qf.&fp=a542392d10e4b1d3&biw=1920&bih=955

ali006
جمعه 24 آذر 1391, 15:58 عصر
سلام
تا حالا کسی تونسته از طریق برنامه نویسی #c از کامپیوتر به موبایلو برعکس از طریق WIFI اطلاعات بده.
اگه کسی موفق شده یا اطلاعاتی داره ممنون میشم کمکم کنه.