danh sách này bao gồm địa chỉ MAC và độ mạnh sóng của nó, danh sách được sắp xếp theo thứ tự giảm của độ mạnh sóng để tăng hiệu năng tìm kiếm của thuật toán matching trên server. Server trả lại kết quả theo định dạng file XML như trên, nếu trong database có địa điểm này, thì trường valid sẽ set bằng 1, nếu không, giá trị của nó bằng không, đồng thời ta cũng gửi thông tin chi tiết về địa điểm này để tiện cho việc hiển thị ở client. Từ đó, client sẽ thực hiện việc đọc thông tin trong file XML này và hiển thị trên ứng dụng. Ngoài ra, trên server cũng sẽ lưu lại trạng thái của người dùng này đang ở địa điểm trong hệ thống, từ đó đưa ra những tính năng như gợi ý kết bạn, nếu có người dùng khác cũng đang ở cùng địa điểm với người dùng này. Giải pháp định vị tuy đơn giản, nhưng lại phục vụ tốt cho yêu cầu này.
1.13.2. Thiết kế cơ sở dữ liệu sampling
Location LocID bigint Lattitude nvarchar(50) Longtitude nchar(50) LocationName nchar(100) Overview nchar(1000) Address nchar(500) Description nchar(1000) Phone nchar(20) Website nchar(200) Email nchar(50)
Column Name Data Type Allow Nulls
AccessPoint MAC nchar(50) LocID bigint LowRange int HighRange int Stored int
Column Name Data Type Allow Nulls
Hình 4-36: Cơ sở dữ liệu sampling
• Bảng thứ nhất là Location bao gồm các thuộc tính: locID làm khóa chính, tọa độ địa lý (Lattitude và Longtitude) để display địa điểm, overview chứa mô tả về địa điểm, Address chứa địa chỉ của địa điểm. Bảng này có liên kết khóa ngoài đến bảng AccessPoint thông qua khóa chính LocID
• AccessPoint: có MAC address và LocID làm khóa, gồm có các thuộc tính LowRange và HighRangle chỉ sóng mạnh nhất và yếu nhất của AccessPoint này thu được ở địa điểm này. Stored chỉ sóng ổn định nhất thu được ở địa điểm này.
Như vậy, mỗi một Location sẽ có một danh sách các Access Point mà điện thoại đứng ở vị trí đó có thể bắt được cùng với thông tin về độ mạnh của sóng: sóng mạnh nhất, sóng yếu nhất và độ mạnh phổ biến nhất bắt được ở vị trí đó.
1.13.3. Thiết kế thuật toán matching a. Client side:
Người dùng mở ứng dụng foloyu, một thread chạy ngầm dò sóng wifi, khi bắt được sóng mới nó sẽ tự động nhóm các sóng theo địa chỉ MAC, rồi thực hiện tính toán độ mạnh trung bình của sóng với từng nhóm địa chỉ MAC, sau đó sắp xếp các nhóm này theo độ giảm của độ mạnh sóng (RSSI), sau đó xây dựng một String theo định dạng XML. Nếu người sử dụng yêu cầu định vị (bấm vào menu Where Am I) thì ứng dụng thực hiện xây việc gửi XML lên server định vị của Foloyu, chờ kết quả, sau đó parse file XML rồi thực hiện hiển thị lên bản đồ Gmaps và lời thông báo cho người dùng biết họ đang ở quán café nào.
Hình 4-37: Client side matching Algorithm
b.Server side
Có rất nhiều hướng tiếp cận tới thuật toán xác định vị trí người dùng, trong đó phải kể đến 2 phương pháp nổi bật nhất là:
• Range based Matching: tìm location ID dựa trên so sánh độ mạnh sóng mà client gửi lên có nằm trong khoảng LowRange và HighRange hay không? • Euclidean Matching: tính khoảng cách Euclid giữa độ mạnh sóng của các
Access Point mà phía client gửi lên với độ mạnh sóng lưu trong cột stored của bảng AccessPoint. LocationID nào cho khoảng cách Euclid nhỏ nhất, sẽ là locationID mà khả năng người sử dụng đang đứng ở đấy lớn nhất.
Thuật toán Range based Matching:
Thuật toán đơn giản như sau, duyệt toàn bộ các địa chỉ MAC gửi lên, với mỗi địa chỉ MAC, tìm trong bảng AccessPoint các hàng có địa chỉ MAC này, được một danh sách. Sau đó, trong danh sách này, những địa chỉ MAC nào có độ mạnh sóng nằm trong khoảng Low-high thì giữ lại, chọn làm địa điểm tiềm năng. Cuối
cùng, nếu chỉ thu được 1 Location ID thì trả lại LocationID đó, nếu không, ta chọn LocationID đầu tiên vì địa điểm này được xác định dựa trên MAC có sóng mạnh nhất, vì vậy nó có nhiều khả năng là địa điểm chính xác. Cụ thể:
• Đầu vào: danh sách các MAC+strength được sắp theo thứ tự giảm dần theo strength.
• Đầu ra: LocationID của địa điểm mà người dùng đang đứng. Nếu không có, trả lại -1.
int LocID RangeBasedMatching(List<MAC> MAClst){ List<AC_location> lstAClocationPossible=null; //Duyệt theo danh sách các MAC clien gửi lên
Foreach (MAC in MAClst){
// với mỗi địa chỉ MAC, tìm danh sách các AC_location có chứa MAC đó. List<AC_location> lstACLoc= searchLocByMAC(MAC); // Nếu danh sách chỉ cho ra 1 AC_location, chuyển ngay sang MAC tiếp theo.
If(lstACLoc.size==1){
lstAClocationPossible.add(lstACLoc[0]); Continue;
}
//Nếu danh sách trống, chuyển qua MAC tiếp theo.
if(lstAcLoc.size==0) {
Continue; }
// Nếu danh sách có nhiều hơn 1 địa điểm, xét các địa điểm này theo strength. Nếu //nằm trong khoảng thì add vào danh sách lstAClocationPossible.
Foreach(ac_location in LstAcLoc){
If( MAC.strength nằm trong khoảng ac_location) { lstAClocationPossible.add(ac_location); }
} }
// Trong danh sách lstAClocationPossible, ta chọn cái đầu tiên làm ứng viên tốt nhất //cho thuật toán này.
If(lstAClocationPossible!=null){
return lstAClocationPossible[0].getLocID(); }
else return -1; }
MAC là một class java bean chỉ chứa 2 thuộc tính: MAC có kiểu String chứa địa chỉ MAC của Access Point mà thiết bị thu được, và thuộc tính strength kiểu in chứa độ mạnh sóng của Access Point đó. AC_location cũng là một lớp java bean chứa dữ liệu cho bảng sau:
LocID MAC Low High stored
1 A2B 45 70 57 1 A2C 30 40 34 2 A2B 25 39 30 2 A2C 50 75 60 3 E3D 56 89 70 3 E3K 34 67 60
Bảng 4-2: Dữ liệu lấy mẫu