Sử dụng giao tiếp client-server theo mô hình khách-chủ để giao tiếp giữa các robot.
Hình 4.3: Mô hình client-server sử dụng
Với việc sử dụng một server chung để lưu các thông tin mà các robot cần thông báo cho các đồng nghiệp biết, số lượng kết nối cần thiết sẽ giảm đi so với trường hợp sử dụng mô hình ngang hàng. Khi triển khai trên thực tế, nếu điều kiện không cho phép, hoàn toàn có thể đặt server trên một client, tức là robot được máy tính đó điều khiển vừa chạy server, vừa chạy một thể hiện của client. Có thể hình dung việc này giống như robot đó đóng vai trò là “robot đầu đàn”,
Chức năng của server
Server tiến hành thực hiện các bước cần thiết để khởi tạo server. Sau khi khởi tạo để có thể tiếp nhận kết nối từ phía client thì server khởi tạo sẽ lưu hai biến cần thiết như biến status và old_cells. Biến status trên server lưu trạng thái của tất cả các robot. Nó nhiệm vụ quan trọng như lưu vị trí, trạng thái hay thời gian của từng robot. Biến status là một biến kiểu string, lưu lại trạng thái của toàn bộ robot đang hoạt động để biết robot đang ở đâu và trạng thái như thế nào và thời gian cập nhật. Mỗi trạng thái của từng robot cách nhau bởi dấu “;”, và chúng có dạng: tên robot, hoành độ của cell đang ở, tung độ của cell đang ở, trạng thái, thời gian cập nhật lần cập nhật cuối cùng của từng robot. Server biết các trạng thái của từng robot đó còn sống hay đã chết hay chưa dựa vào các cập nhật của từng robot trên từng thời điềm. Nếu quá 15 giây không có cập nhật của bất kỳ Client nào nó sẽ hiểu là robot đó đã chết và đưa ra trạng thái đó đến mọi robot. Dựa vào biến status để cập
nhật các old_cells. Biến old_cells để lưu các cell của tất cả robots đã đi qua. Nó được thêm vào khi mỗi robot đi vào cell mới. Dựa vào biến old_cells để tránh nhiều robot đi vào cùng một ô. Old_cells sẽ được cập nhật khi có bất kỳ robot nào chết. Server phân biệt các hành động trong tin nhắn từ client nhờ phần mã trong tin nhắn nhận được. Tin nhắn nhận được có dạng: “Mã|Dữ liệu”. Sau khi xử lý xâu, tùy vào đoạn mã nhận được mà server sẽ có hướng xử lý với đoạn dữ liệu phía sau cho thích hợp. Ý nghĩa một số tin nhắn từ client gửi lên server nói chung với mỗi thuật toán:
- [SAVE_STATUS]|Dữ liệu: Client yêu cầu lưu đoạn dữ liệu phía sau vào biến status trên server.
- [SAVE_OLD_CELLS]|Dữ liệu: Client yêu cầu lưu thêm đoạn dữ liệu phía sau vào biến old_cells trên server.
- [GIVE_ME_STATUS]|_: Client yêu cầu server trả về giá trị biến status của server
- [GIVE_ME_OLD_CELLS]|_: Client yêu cầu server trả về giá trị biến old_cells của server.
Hầu như các server trên các thuật toán là giống nhau chỉ khác thêm các công cụ hỗ trợ cho phù hợp với từng thuật toán. Ví dụ như thuật toán MSTC-Ofline thì nó chỉ cần lấy thông tin ban đầu và sau khi thực hiện xong thì nó kiểm tra con robot tiếp theo của nó trạng thái như thế nào.….
Các mã giả phía client trên các thuật toán
Sau khi áp dụng lồng ghép lập trình socket vào, thuật toán ORMSTC chạy trên mỗi robot (mỗi robot đóng vai trò là một client). Mỗi robot cũng giống như thuật toán 4 nó sẽ tạo một thuật toán để tạo các khởi tạo ban đầu. Từ thuật toán 4 có thể viết lại chính xác như sau:
Mã giả thuật toán 11 (pha khởi tạo): Thuật toán 11: Initialization()
1. Chạy hàm socket() 2. Chạy hàm connect()
3. Tính toán chia cell để biết starting_cell dựa trên starting_point
4. Khởi tạo biến status, biến current_cell và old_cells cục bộ trên mỗi robot 5. Gán current_cell = starting_cell
6. Thêm trạng thái của mình vào biến status của gửi lại lên server với yêu cầu lưu trạng thái
7. Thêm starting_cell của mình vào danh sách old_cells, sau đó gửi lên server với yêu cầu lưu old_cells
8. Lấy dữ liệu từ biến status và old_cells của các robot khác trên server xuống để đồng bộ dữ liệu cục bộ.
Giải thích mã giả thuật toán 11
Client tiến hành khởi tạo. Bước 1 và 2 gọi các hàm cần thiết để kết nối tới server. Sau đó tính toán từ vị trí ban đầu để biết cell bắt đầu của nó đang đứng. Thêm trạng thái của nó trên status của robot. Thêm các cell bắt đầu starting_cell thành cell cũ và lưu trên sever. Sau đó tiến hành lấy những giá trị mới nhất trên server về để đồng bộ với dữ liệu cục bộ. Việc trao đổi giữa Server và Client dựa trên các xâu ký tự nên từ đó ta sử dụng các xâu để lưu và xử lý. Ngoài ra, thay vì lưu mảng connection như trong thuật toán bên lý thuyết, ở phần code thử nghiệm, những kết nối này dưới dạng một biến string, đưa những xử lý về cập nhật kết nối về dạng xử lý xâu. Lý do là bởi không thể biết trước một robot có thể gặp bao nhiêu robot đồng nghiệp trong quá trình làm việc, bởi vậy việc khai báo toàn bộ các biến connection như trong lý thuyết là lãng phí và cũng không thể biết trước có bao nhiêu robot sẽ kết nối để khai báo. Bởi vậy, thay vì lưu nhiều giá trị trong mảng, khi thử nghiệm thuật toán, việc lựa chọn việc nối thêm giá trị hoặc thay đổi một phần giá trị vào biến string sau mỗi lần gặp. Như vậy có thể lưu được những kết nối cần thiết chỉ với hai biến.
Các thuật toán ở trên đã nêu trên, để thuật toán đó áp dụng trên thực tế cần áp dụng lập trình socket vào để tiến hành giao tiếp. Ý tưởng chung về lập trình trên
socket của nó đều giống nhau. Tuy nhiên, ở đây ta chỉ cần chỉ rõ ra những điểm cần thiết cần xử lý trong quá trình thực thi thuật toán:
- Thuật toán lưu trạng thái các robot lại: Khi robot đi vào các subcell trên mỗi bước đi của nó nó sẽ lưu lại trạng thái của nó. Trong đó, trạng thái được cập nhật lên server bao gồm:
ALIVE: biểu thị trạng thái robot đang hoạt động bình thường
DEAD: biểu thị trạng thái robot đã chết
DONE: biểu thị trạng thái robot đã hoàn thành công việc
Nhờ việc lưu lại các trạng thái của chúng trên biến status của server, mỗi lần một robot cần kiểm tra xem một đồng nghiệp nào đó của nó còn sống hay không trên server, server dựa vào biến status để biết được con robot đó chết hay chưa và gửi trả lời đó đến các robot đang hỏi. Khi robot có biết câu trả lời là robot đang được hỏi đó đã chết, server cũng đồng thời xóa các cell đã đi của robot chết kia, cập nhật lại trạng thái là DEAD của robot kia thành DONE để tránh các lần hỏi sau này đến server. Chính vì vậy robot phải đồng thời cập nhật biến status và cập nhật old_cells trên server. Xóa các cell kết nối với robot đã chết kia khỏi danh sách quay lui.
- Thuật toán này dựa vào biến old_cells chung trên server để xác định những cell đã đi qua. Do đặc trưng của thuật toán là dựa trên cây bao trùm STC là nếu như toàn bộ khu vực làm việc chưa được bao phủ, khu vực đó nhìn tổng quan vẫn bẩn. Do mỗi robot có thể mới đi một vài subcell của một cell chứ chưa đi hết toàn bộ cell đó. Bởi vậy, như đã nói ở trên, khi có một robot chết, toàn bộ cell mà robot đó đã đi qua cần được loại bỏ các cell của robot đó khỏi old_cells, để robot khác có thể đảm nhiệm việc bao phủ khu vực đó, nhằm đảm bảo toàn bộ khu vực được bao phủ toàn bộ.