PIC Vietnam

Go Back   PIC Vietnam > Truyền thông > MiWi, Zigbee, Ethernet

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

MiWi, Zigbee, Ethernet ZigBee có khả năng kết nối tới 65000 node, MiWi dành riêng cho Microchip chỉ kết nối được 1000 node, nhưng điều gì đang diễn ra...?

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 04-08-2011, 06:11 PM   #1
honghoan
Đệ tử 1 túi
 
Tham gia ngày: Sep 2009
Bài gửi: 11
:
Angry Giúp đỡ về mở 2 Socket chạy song song với TCPIP Stack

Chào các anh chị, em đang gặp sự cố khi mở 2 socket chạy cùng lúc với nhau, mở Socket này, thì không mở được cái còn lại.
Em dùng TCPIP Stack của Microchip cung cấp, dùng ok nếu chỉ mở 1 Socket. Mở 2 socket thì cái mở trước chạy ok, Socket còn lại không thể mở được.

Socket 1 em khai báo:
static BYTE ServerNamePC[] = "192.168.1.5";
static WORD ServerPortPC = 5000;

Socket 2:
static BYTE ServerName[] = "192.168.1.199";
static WORD ServerPort = 9100;
//Defines the port to be accessed for this application

Em mở socket 1 đầu bằng lệnh:

MySocketPC = TCPOpen((DWORD)&ServerNamePC, TCP_OPEN_RAM_HOST, ServerPortPC, TCP_PURPOSE_GENERIC_TCP_CLIENT);

Socket 2:

MySocket = TCPOpen((DWORD)&ServerName,TCP_OPEN_RAM_HOST,Serve rPort,TCP_PURPOSE_GENERIC_TCP_CLIENT);

Kết quả Socket nào mở trước thì chạy tốt, và không mở được socket thứ 2.
Nhờ anh chị nào đã từng dùng TCPIP Stack rồi, chỉ giúp em. Tìm hoài mà không ra chỗ nào để chỉnh, nản quá.
Cảm ơn các anh chị nhiều.!
honghoan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-08-2011, 12:22 AM   #2
tanbka
Đệ tử 5 túi
 
Tham gia ngày: Dec 2008
Nơi Cư Ngụ: Hà Nội
Bài gửi: 91
:
Cái này là do khi mở Socket, bạn phải khai báo địa chỉ đích,ở đây bạn mở 2 socket để kết nỗi với 2 thiết bị khác nhau &ServerNamePC và &ServerName. Trong địa chỉ đích, không những có địa chỉ IP mà còn phải có cả địa chỉ MAC nữa.
Nếu không khai báo địa chỉ MAC thì PIC sẽ lấy địa chỉ MAC mà nó thu được khi quá trình kết nối thành công với 1 PC bên ngoài. Vì thế bạn sẽ chỉ kết nối được với 1 PC bên ngoài.
Bạn dùng lệnh này để lấy địa chỉ MAC của PC tương ứng với địa chỉ IP của nó nhé
ARPResolve(&server_info.IPAddr); lệnh này để gửi yêu cầu trả về địa chỉ MAC
Sau khoảng 1s kiểm tra điều kiện
if(ARPIsResolved(&server_info.IPAddr, &server_info.MACAddr)); nếu điều kiện đúng, tức là ta đã có địa chỉ MAC.
Khi đó bạn mở Socket thì đã có thông tin chính xác của địa chỉ đích tới, thông tin dữ liệu hoàn toàn do mình điều khiển.
Chúc bạn thành công.
tanbka vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 05-08-2011, 09:34 AM   #3
honghoan
Đệ tử 1 túi
 
Tham gia ngày: Sep 2009
Bài gửi: 11
:
Cảm ơn bạn nhiều !! Để mình thử xem, mong rằng chạy được. Mấy bữa nay chỉnh quá trời mà vẫn không chạy, có hướng đi mừng quá
honghoan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 08-08-2011, 01:03 PM   #4
honghoan
Đệ tử 1 túi
 
Tham gia ngày: Sep 2009
Bài gửi: 11
:
Trích:
Nguyên văn bởi tanbka View Post
Cái này là do khi mở Socket, bạn phải khai báo địa chỉ đích,ở đây bạn mở 2 socket để kết nỗi với 2 thiết bị khác nhau &ServerNamePC và &ServerName. Trong địa chỉ đích, không những có địa chỉ IP mà còn phải có cả địa chỉ MAC nữa.
Nếu không khai báo địa chỉ MAC thì PIC sẽ lấy địa chỉ MAC mà nó thu được khi quá trình kết nối thành công với 1 PC bên ngoài. Vì thế bạn sẽ chỉ kết nối được với 1 PC bên ngoài.
Bạn dùng lệnh này để lấy địa chỉ MAC của PC tương ứng với địa chỉ IP của nó nhé
ARPResolve(&server_info.IPAddr); lệnh này để gửi yêu cầu trả về địa chỉ MAC
Sau khoảng 1s kiểm tra điều kiện
if(ARPIsResolved(&server_info.IPAddr, &server_info.MACAddr)); nếu điều kiện đúng, tức là ta đã có địa chỉ MAC.
Khi đó bạn mở Socket thì đã có thông tin chính xác của địa chỉ đích tới, thông tin dữ liệu hoàn toàn do mình điều khiển.
Chúc bạn thành công.
Mình đã nghiên cứu lại cái ARP và tiến hành thử như cách của bạn nói và thử nhiều cách khác với cái ARP nữa nhưng vẫn không thành công. Vẫn bị như lúc không sử dụng các hàm ARP. Các hàm ARP hầu như không gây ảnh hưởng gì? Có cách nào khác hay mình có làm sai chỗ nào không tanbka?
Code:

ARPResolve(&Server_info.IPAddr);
//DelayMs(1000);
if(ARPIsResolved(&Server_info.IPAddr,&Server_info. MACAddr))
{
MySocket = TCPOpen(Server_info.IPAddr.Val,TCP_OPEN_RAM_HOST,S erverPort,TCP_PURPOSE_GENERIC_TCP_CLIENT);
}

Mình có xem lại TCPIP Stack help thì hàm TCPOpen() đã làm luôn công việc hỏi địa chỉ MAC luôn, dùng hàm ARP là không cần thiết khi sử dụng các hàm TCPOpen() và UDPOpen().
Đuối quá, xin nói rõ hơn chút nữa là mình dùng cái App: GenericTCPClient.c;
+ Mình đã làm với cách là: mở Socket1=>truyền data=>đóng Socket1 =>mở Socket2=>truyền data=> đóng Socket2. Truyền nhận bình thường.
+ Nhưng mở Socket1=>mở Socket2 thì bị treo => tắt Server của Socket1 thì Socket2 truyền nhận bình thường =>mở lại Server Socket1 => Socket2 treo trở lại.
Có bạn nào hay anh chị nào đã làm với 2 Socket chạy song song như em xin chỉ bảo giúp với. Cảm ơn rất rất nhiều !!

thay đổi nội dung bởi: honghoan, 08-08-2011 lúc 03:23 PM.
honghoan vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 12:03 AM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam