Sử dụng AWS IoT

 

logo-iot

 

Trước đây tôi thường tận dụng mã nguồn mở để thiết lập MQTT broker để kết nối đến các thiết bị. Một số dự án mà tôi đã sử dụng có thể kể đến như Mosquitto, hay Mosca.

Với prototype, các chương trình này thực hiện rất tốt công việc của mình: thiết lập nhanh, và miễn phí😀.

Và đến mức độ nào đó, tôi gặp phải điểm yếu của chúng: Mosquitto không scale tốt, dù ai đó nói với tôi rằng hãy dùng chức năng bridge, tôi vẫn cho rằng nó không phải là các thức để scale. Mosquitto không cung cấp cơ chế authen/author rõ ràng. Mosca là một dự án khá nối tiếng về broker trên nền Node.js. Hình thức bảo mật của Mosca là thông qua username/pass cho mỗi kết nối. Vì viết bằng JS, nên khả năng mở rộng để tôi có thể hook function này quản lý mỗi kết nối khá tiện. Tuy nhiên Mosca như Mosquitto không thể cluster được.

Cuối năm 2015, AWS bổ sung gói IoT trong menu của họ, dưới dạng SaaS. Một số đặc điểm của AWS IoT có thể kể đến như:

  • scale, scale, scale.
  • bảo mật
  • liên kết dịch vụ khác, như lambda, dynamodb.

Thấy rằng AWS IoT đáp ứng được các nhu cầu cho một broker trong hệ thống kết nối, tôi viết lên vài dòng ở đây, xem như ghi chú của cá nhân vậy.

AWS IoT cung cấp gì

Bản thân là một SaaS broker, tôi sẽ sử dụng nó để kết nối đến các thiết bị thông qua MQTT. Vì nó cung cấp bởi AWS, broker này kỳ vọng sẽ ổn định, và hiện hữu trong một thời gian không ngắn.

AWS IoT định nghĩa một số thuật ngữ như:

  • Thing: là một đối tượng, tương đương với thiết bị nào đấy. Thing được kết nối với các principal thông qua policy.
  • Certificate: chứng chỉ X.509 mà các thực thể (principal) sử dụng để kết nối đến broker thông qua giao thức MQTT. Do đó, các client phải hỗ trợ SSL layer để làm việc với AWS IoT, tạo lớp bảo mật đầu tiên.
  • Policy: chính sách được áp dụng vào các Certificate tương ứng. Policy cung cấp cơ chế bảo mật tiếp theo, bằng cách quy định ai (mqtt client id) có thể connect được, và hình thức (pub/sub topic) làm việc.
  • Rule: để kết nối AWS IoT này với các dịch vụ khác, như đẩy dữ liệu qua Lambda hay lưu vào DynamoDB.

Có thể hình dung qúa trình tôi cần làm để kết nối một đối tượng (gọi D) của tôi vào AWS IoT, và sử dụng điện thoại (gọi A) để kết nối đến client này thông qua MQTT, trong đó tất cả các thông điệp đều được chuyển đến DynamoDB như sau:

  • Tạo hai Certificate, một cho A, một cho D.
  • Tạo một Thing, tôi đặt tên là doi-tuong-D.
  • Attach A và D vào thing doi-tuong-D.
  • Tạo hai policy. Bên dưới (*) là một ví dụ của policy cho phép mọi quyền kết nối và topic làm việc, gọi là policyA, policyD tương ứng. Attach policyA vào A, policyD vào D.

Lúc này nếu app A gởi (pub) lên command/req, thì thiết bị D sẽ nhận được khi nó đăng ký (sub) cũng trên cùng một chủ đề command/req.

Tôi muốn lưu các command này vào DB để xử lý về sau, tôi sẽ thiết lập một rule, gọi là ruleD. Rule được sử dụng để kích hoạt kết nối giua IoT và dịch vụ khác của AWS.

Đưới đây là mô hình diễn tả mối quan hệ của A và D.

blog-aws-iot-example

Tích hợp AWS IoT vào hệ thống

AWS cung cấp dashboard để tôi có thể thực hiện các bước trên, nhưng dĩ nhiên tôi không thể tiến hành bằng tay những công đoạn trên cho mỗi thiết bị/app được thêm vào. AWS cung cấp SDK (https://github.com/aws) để kết nối đến API của tất cả các dịch vụ của họ. Tôi sẽ xem AWS IoT như một serivce có nhiệm vụ làm broker.

Cuối cùng, tôi cần viết một microservice khác để quản lý các thing, cert, rule, và tạo các policy tương ứng với mức logic của ứng dụng.

Thay cho lời kết, cần lưu ý rằng Microsoft hay IBM đều cung cấp nhánh IoT trong dịch vụ đám mây của họ. Với nhiều sự lựa chọn như vậy, tôi nghĩ mình không nên nghĩ đến việc tự xây dựng lấy một broker trong hoàn cảnh hiện này.

(*) Một policy đơn giản cho phép hết các quyền kết nối và các chủ để pub/sub.


{
    "Version": "2012-10-17",
    "Statement": [{
        "Effect": "Allow",
        "Action": [
            "iot:*"
        ],
        "Resource": ["*"]
    }]
}

 

 

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s