Chuyện kể rằng, có 02 sinh viên Việt Nam, trong lúc làm đồ án đại học kết nối điều khiển từ xa qua Internet. Một người thì chọn phương án truyền thống sử dụng máy tính làm máy chủ và demo các tính năng theo yêu cầu đồ án. Người còn lại biết đến iNut Sensor và tìm cách tối ưu hóa phần mềm và phần cứng nhằm chau chuốt cho đồ án của mình trở nên "xịn" và "nhiều tính năng bá đạo". Đến lúc bảo vệ đồ án, cậu sinh viên 01 cảm thấy choáng ván với muôn vàn vấn đề từ việc nơi trình bày đồ án không có wifi, mạng chập chờn, máy tính mở không lên, đứt cáp biển,... Cuối cùng cũng bảo vệ được với điểm số không ưng ý lắm dù tốn rất nhiều thời gian và công sức. Cậu còn lại nhờ vào việc chau chuốt phần mềm, tối ưu hóa và comment kĩ từng lệnh trong dòng code, viết báo cáo bài bản chuẩn bị slide như ý, dùng điện thoại cài wifi, quét mã QRcode để chia sẻ quyền truy cập đến phần mềm rất chuyên nghiệp, mọi thứ cậu chủ động hoàn toàn mà không bị các vấn đề "học tài thi phận" bủa vây mà kết quả hết sức mĩ mãn, điểm số mĩ miều, kiến thức IoT được chuẩn hóa. Thực vậy, các dự án, đồ án sử dụng nền tảng iNut Platform bên dưới cho phép các bạn sinh viên làm các dự án hết sức hoàn hảo: từ xe điều khiển, bãi giữ xe thông minh, hệ thống máy lạnh, máy bơm, điều hòa thông minh,... do chinh các bạn tự làm nên đã đạt được những điểm số tốt và tuyệt đối. Cũng chính vì thế, iNut JSC (công ty chủ quản của iNut Platform) đã kết hợp với Khu Công nghệ phần mềm - ĐHQGHCM để tổ chức những khóa đào tạo ngắn hạn cho sinh viên Việt Nam sử dụng nền tảng IoT do iNut JSC phát triển. Và để mở con đường tri thức tiếp cận IoT trong nháy mắt, iNut JSC đã tạo ra một phiên bản firmware trị giá 50.000 đồng sử dụng clouding của CloudMQTT và tài trợ 1000 firmware cho tất cả các bạn học sinh, sinh viên Việt Nam có thể tiếp cận IoT một cách dễ dàng và nhanh chóng nhất!
I. ESP8266 trong mô hình có thể mở rộng hơn hay không?
Socket Server là một ông trùm (server), nơi mà mọi client (ESP8266) hay Webapp phải kết nối đến. Như vậy, theo mô hình này, nếu ta có nhiều ESP8266 thì sẽ như thế nào nhỉ? Em hèm, thật sự là phức tạp phải không nào? Vì nó mâu thuẫn với mô hình này vì chỉ có một con ESP8266. Như vậy, để làm thêm một con ESP8266 nữa thì phải sửa lại mô hình hay sao?
Nếu các bạn đã đọc qua phần 2, phần 3 thì lúc này bạn sẽ biết đến khái niệm namespace thì việc thêm một con ESP8266 bằng cách phá vỡ mô hình thì không có chuyện gì khó. Tuy nhiên, nếu chỉ mới đọc phần 1, thì để giải quyết vấn đề có 2, 3 hay nhiều con ESP8266 ta phải làm quen với khái niệm room.
Room: tức là phòng. Như vậy để dễ hiểu, các bạn cứ xem Socket Server là một khách điếm (hotel - khách sạn). Ở khách điếm này nếu một bé ESP8266 đến thuê phòng thì khách điếm này cấp cho ESP8266 một phòng riêng theo chính id duy nhất (gọi là socket id)cho kết nối từ ESP8266 (lưu ý id này khác với id của ESP8266). Theo như hình dưới, mỗi khi thực hiện (2) Tạo ra một socket mới rồi đưa vào sự quản lý của IO thì ESP8266 sẽ được vào một Room mà Room này có mã là socket id. Về bản chất khái niệm Room đã tồn tại sẵn, tức là mỗi con ESP8266 sẽ ở một phòng riêng mà không ai ở chung với nhau hết. Nhưng những phòng này sẽ cùng thực hiện những lệnh khi nó nghe được vì nó cùng một loại, mà loại này là ESP8266 (tức là khái niệm namespace trong phần 2 và phần 3).
Vậy để phân biệt giữa các ESP8266 với nhau, chúng ta cần biết được socket id của con ESP8266 còn lại và bạn sẽ định tuyến dữ liệu đến dữ liệu ESP8266 đó. Thành ra, nếu bạn muốn có sự truyền tin giữa các bé ESP8266 lẫn nhau, chúng ta phải giải quyết được vấn đề định tuyến giữa những bé ESP8266 này.
Để đơn giản hóa hơn nữa, trong bài viết này, mình sẽ thu hẹp lại phạm vi bài toán thành như sau:
Vậy quay lại câu hỏi đề bài. Để trả lời nó, chúng ta sẽ trả lời cho bài toán trên.
II. Phân biệt giữa các ESP8266
Để phân biệt giữa các ESP8266 với nhau, cách duy nhất là ta phân biệt dựa theo Room (số phòng). Vậy để transmitter gửi được dữ liệu tới receiver, ta cần cho transmitter biết địa chỉ phòng của receiver. Tức là receiver phải gửi được địa chỉ socket id của nó (tức là phòng mặc định) đến cho transmitter. Ối trời ơi, vậy thì rơi vào vòng loop mất tiêu rồi, A muốn tới B, nhưng B phải gửi thông tin cho A. Có thần cũng không gửi được dữ liệu. Ok, đặt vào trường hợp thực tế, bạn shipper muốn gửi hàng đến địa chỉ cho bạn nhận đồ thì bạn shipper sẽ phải biết địa chỉ của bạn nhận đồ. Thật vậy, nếu receiver cố định một địa chỉ chứ không phải thay đổi địa chỉ liên tục mỗi lần kết nối tới socket server thì có phải ngon lành không? Như thế thì phá vỡ được vòng loop, từ đấy mới thấy mọi thứ thực tế luôn có thể ứng dụng trong lập trình đó mà. Nếu receiver cố định được địa chỉ thì thôi thì làm transmitter cố định luôn cho rồi *ahihi*. Okie, vấn đề sẽ được giải quyết nếu chúng ta có thể sét được một Room cố định cho mỗi em ESP8266.
Okie, theo như thư viện Socket.io thì mỗi socket client có thể tham gia vào nhiều phòng và mỗi phòng có thể nhiều socket client.
Vậy, câu hỏi đầu bài đã được giải quyết. Chỉ cần sét Room cố định (thực ra là socket client ở thêm một phòng nữa mà cái id phòng đó cố định thôi à) là xong thôi. Nhưng nãy giờ mình vòng vo giải thích là để giúp cho các bạn hiểu từ một vấn đề thực tế và liên kết đến tài liệu hướng dẫn thôi á.
III. Giải quyết bài toán
1. Socket Server
Đầu tiên, các bạn clone project của mình về
Sau đó để cài đặt project socket server
Chạy lệnh sau để khởi động Socket Server.
Đây là phần code trong Socket Server
2. Code Transmitter
Mình có bình luận trong code, bạn xem và sáng tạo nhé!
2. Code Receiver
Mình có bình luận trong code, bạn xem và sáng tạo nhé!
IV. Kết
Chúc các bạn thành công và ngày càng sáng tạo với thư viện của mình và module ESP8266.