From 5bf5793898e5c0cb9e739c6e6b32b2058ba1283c Mon Sep 17 00:00:00 2001 From: Lan Anh Date: Fri, 20 Oct 2017 20:01:53 +0700 Subject: [PATCH 1/3] TBA --- NguyenLanAnh/TBA.md | 84 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 NguyenLanAnh/TBA.md diff --git a/NguyenLanAnh/TBA.md b/NguyenLanAnh/TBA.md new file mode 100644 index 00000000..d73a82b9 --- /dev/null +++ b/NguyenLanAnh/TBA.md @@ -0,0 +1,84 @@ +# TBA + +## 1. 4 mô hình truyền thông trong hệ thống IOT + +Truyền thông trong 1 hệ thống IOT chủ yếu liên quan đến việc truyền thông giữa 3 nhóm: Thiết bị, gateways, cloud. Việc truyền thông này chủ yếu liên quan đến trao đổi thông điệp( message). Dựa vào cách thức trao đổi message, có thể chia mô hình truyền thông IOT thành 4 nhóm là: + +- Telemetry: Message di chuyển 1 chiều, từ thiết bị đến hệ thống. Mục đích là gửi trạng thái của thiết bị lên hệ thống. +Giao thức triển khai mô hình này phổ biến nhất là: MQTT, MQTT implements luôn cả mô hình publish/subscribe. Với MQTT, các thiết bị được xem như publisher - người xuất bản. Nội dung xuất bản là các dữ liệu mà thiết bị đó thu thập hoặc xử lý được. Đích đến của các dữ liệu đó là các brokers. Để gom nhóm các dữ liệu thành 1 "kênh", MQTT sử dụng khái niệm topic. Các hệ thống/thiết bị khác muốn lấy thông tin thì sẽ hoạt động như subscriber - người theo dõi. Hành động theo dõi này và các message tương ứng được giới hạn theo từng topic. +Đồng thời, MQTT cũng được hỗ trợ đầy đủ các QoS level. + + Một giao thức đáng chú ý khác cũng implement mô hình này, đó là AMQP. AMQP cung cấp cả 2 phương pháp trao đổi message là request/reply và publish/subscribe. + So với MQTT, AMQP có một lợi thế lớn. Đó là khả năng thiết đặt một luồng logic điều khiển cho 2 mức khác nhau: mức byte và mức message. + + Nói về nhược điểm, MQTT không hỗ trợ xử lý logic. Vì không hỗ trợ xử lý logic nên một broker có thể bị quá tải (flooded) bởi các messages mà không làm cách nào để dừng nhận các messages này. +- Inquiry: Gửi các requests từ thiết bị lên hệ thống. Các requests này liên quan đến việc thu thập các thông tin mà thiết bị hiện tại không thu thập được. Và hệ thống lại gửi trả lại response. + + Việc implement MQTT theo mô hình Inquiry khó khăn hơn vì ta sẽ phải define các ngữ nghĩa mới ở tầng ứng dụng để đảm bảo việc truyền thông giữa device và hệ thống tuân thủ đúng mô hình Inquiry. + + Khác với MQTT và HTTP, AMQP đáp ứng tốt yêu cầu của việc implement mô hình Inquiry. + + Một điểm mạnh của AMQP khi implements mô hình Inquiry là tính asynchronous của giao thức này. Nhờ đặc tính asynch vốn có, các thông điệp hồi đáp từ phía hệ thống có thể đến thiết bị theo bất kỳ thứ tự nào mà không làm mất đi sự tương quan của message hồi đáp với request yêu cầu nó. + +- Command: Hệ thống gửi message tới thiết bị. + + Với giao thức MQTT, nếu muốn implements theo mô hình Command, ta cũng phải đưa ra một số ngữ nghĩa mới ở tầng ứng dụng. + + Bản thân MQTT không hỗ trợ kiểu truyền thông request/reply nên ta cần đưa ra một số ngữ nghĩa mới như: thiết bị subscribe một topic để nhận command, hệ thông sẽ gửi command vào topic đó. Phần payload của command (từ phía hệ thống) sẽ phải chứa request ID. Sau khi thực thi mệnh lệnh, thiết bị publish kết quả kèm theo request ID tương ứng. + + Nếu thiết bị offline, ta có thể dùng "retain" flag, nhờ đó, mệnh lệnh cuối cùng từ phía hệ thống sẽ được chuyển đến khi device online trở lại. + + ![anh1](https://i.imgur.com/xiFPqvZ.png) + + Một lần nữa, AMQP lại tỏ ra vượt trội hơn khi implements mô hình Command. + + Hệ thống có thể gửi message chứa mệnh lệnh, kèm theo message ID và thuộc tính reply-to. Sau khi thực thi mệnh lệnh, thiết bị gửi kết quả trong một message khác, kèm theo ID tương ứng với message ID của mệnh lệnh từ phía hệ thống. Message từ phía thiết bị sẽ được gửi đúng về địa chỉ mà hệ thống mong muốn nhờ thuộc tính reply-to. Việc truyền thông này cũng diễn ra không đồng bộ (asynchronous), do đó hệ thống có thể gửi hàng loạt mệnh lệnh mà vẫn nhận được response tương ứng của từng mệnh lệnh đã gửi. + + Nếu thiết bị offline và ta chỉ muốn nó thực thi mệnh lệnh mới nhất từ phía hệ thống? Để giải quyết tình huống này, sử dụng thuộc tính TTL (Time To Live) cho các mệnh lệnh gửi đi từ hệ thống. + + ![anh2](https://i.imgur.com/ErMe2Nt.png) + +- Notification: + + Với giao thức MQTT, thiết bị sẽ subscribe một topic. Server publish notification vào topic đó. Mọi thứ diễn ra suôn sẻ vì mô hình Notification này rất gần với cơ chế publish/subscribe của MQTT. Tuy nhiên, nếu không define thêm phần logic xử lý ở tầng ứng dụng, thiết bị có thể bị quá tải do liên tục nhận các notification từ topic đang subscribe. + + Cuối cùng, với AMQP, thiết bị vừa có thể nhận notificaiton vừa có thêm phần logic xử lý giúp thiết bị ngừng nhận notification khi không đủ khả năng xử lý. + +## 2. MQTT protocol(Message Queuing Telemetry Transport) + +- MQTT là một giao thức publish/subscribe thông điệp, được thiết kế cho công nghệ M2M (Machine to Machine) 1 cách gọn nhẹ. + +- Kiến trúc: + + MQTT có mô hình client/server, các cảm biến là clients và kết nối đến một máy chủ, có thể hiểu như một nhà môi giới (broker), thông qua giao thức TCP (Transmission Control Protocol) + + MQTT là giao thức định hướng thông điệp. Mỗi thông điệp là một đoạn rời rạc của tín hiệu và broker không thể nhìn thấy. + + Mỗi thông điệp được publish một địa chỉ, có thể hiểu như một kênh. Client đăng kí vào một vài kênh để nhận/gửi dữ liệu, gọi là subscribe. Client có thể subscribe vào nhiều kênh. Mỗi client sẽ nhận được dữ liệu khi bất kì trạm nào khác gửi dữ liệu vào kênh đã đăng kí. Khi một client gửi một thông điệp đến một kênh vào đó, gọi là publish. + + Ví dụ: + + ![anh3](https://i.imgur.com/8h5boBg.png) + + Bên trên là hình ảnh ví dụ về 3 clients A,B,C kết nối tới broker. 2 kênh B và C cùng đăng kí kênh temperature. + + ![anh4](https://i.imgur.com/ZPgMjsD.png) + + Khi clientA gửi tới broker giá trị mới tới topic temperature, thì lúc này broker sẽ chuyển message tới tất cả clients đã đăng kí kênh temperature. + +## 3. MQTT brokers + +- MQTT brokers rất đa dạng: mosquitto, HiveMQ, Apache Apollo, Apache ActiveMQ, RabbitMQ, MQTT.js,... + +- Thực hành với Apache ActiveMQ: + + Sử dụng JMS(Java Message Service) cho phép gửi, nhận tin nhắn giữa 1 hay nhiều client. Ví dụ A và B gửi thông điệp cho nhau. Với JMS, chúng sẽ không cần kết nối trực tiếp với nhau, mà thông điệp được gửi tới JMS provider và được đặt vào 1 hàng đợi cho đến khi client khác nhận thông điệp. + + ![hinh5](https://i.imgur.com/pJ4A8fD.png) + + message producer là 1 chương trình java gửi JMS message tới hàng đợi trên JMS provider, message consumer là 1 chương trình Java khác cái mà có nhiệm vụ nhận message. 2 chương trình này có thể nằm tại 2 máy riêng biệt nhưng để giao tiếp được chúng phải có được URL của JMS provider. Provider giống như 1 server (như JBoss, Glassfish), ActiveMQ broker sẽ giữ vai trò tương tự thế (1 broker trung gian hay còn gọi là MOM_Message Oriented Middleware). + + [install ActiveMQ](http://activemq.apache.org/getting-started.html) + + +# end. From f1a9f44a26108d8ace99ddca18b6e9a86ac02e95 Mon Sep 17 00:00:00 2001 From: lahu Date: Sat, 9 Dec 2017 00:02:06 +0700 Subject: [PATCH 2/3] microservice --- NguyenLanAnh/Microservice/Microservice.md | 19 ++++++++ .../Microservice/filterdata/Dockerfile | 12 +++++ .../Microservice/filterdata/config/config.cfg | 4 ++ .../filterdata/filterdata/filterdata.py | 47 +++++++++++++++++++ 4 files changed, 82 insertions(+) create mode 100644 NguyenLanAnh/Microservice/Microservice.md create mode 100644 NguyenLanAnh/Microservice/filterdata/Dockerfile create mode 100644 NguyenLanAnh/Microservice/filterdata/config/config.cfg create mode 100644 NguyenLanAnh/Microservice/filterdata/filterdata/filterdata.py diff --git a/NguyenLanAnh/Microservice/Microservice.md b/NguyenLanAnh/Microservice/Microservice.md new file mode 100644 index 00000000..eccc451b --- /dev/null +++ b/NguyenLanAnh/Microservice/Microservice.md @@ -0,0 +1,19 @@ +## Microservice giữa hai tầng fog và cloud +### 1. Mô hình +Microservice trong hệ thống có nhiệm vụ như một bộ lọc(filter), lọc dữ liệu từ tầng fog gửi lên và chuyển lên tầng cloud. +Mô hình như dưới đây: + +![mohinh](http://imageshack.com/a/img924/1986/h1yTcH.png) + +Dữ liệu sẽ được chuyển dưới dạng message queue, qua 1 mqtt broker( như trong mô hình sử dụng Rabbitmq). Dữ liệu được lọc tại Filter, qua mqtt broker tiếp đó, và được gửi tới Cloud. + +### 2. Thực hiện +Bước 1: Tạo 2 container Rabbitmq trên Docker + +Bước 2: Tạo Filter, Filter vừa có khả năng nhận message từ Rabbitmq1, xử lí dữ liệu, vừa gửi dữ liệu tới Rabbitmq2. Tức nó sẽ vừa là consumer, vừa là producer. Nó phải biết cả hai địa chỉ của 2 broker để thực hiện nhiệm vụ. +Sử dụng thư viện Pika của Python. + +Bước 3: Build image filterdata, +Tạo một file config.cfg để chứa địa chỉ các broker, file config này mount với image filterdata, để cập nhật những thay đổi. Build image filterdata sử dụng chương trình lọc tạo ở bước 2, và file config.cfg. + +### End. diff --git a/NguyenLanAnh/Microservice/filterdata/Dockerfile b/NguyenLanAnh/Microservice/filterdata/Dockerfile new file mode 100644 index 00000000..79af580e --- /dev/null +++ b/NguyenLanAnh/Microservice/filterdata/Dockerfile @@ -0,0 +1,12 @@ +FROM python:2.7 +MAINTAINER lananh loglamo@gmail.com +RUN apt-get update +RUN mkdir /filterdata +RUN mkdir /config +ADD ./filterdata/filterdata.py /filterdata +ADD ./config/config.cfg /config +RUN apt-get install -y python python-pip +RUN pip install pika +WORKDIR /filterdata +VOLUME /config +CMD [ "python", "./filterdata.py"] \ No newline at end of file diff --git a/NguyenLanAnh/Microservice/filterdata/config/config.cfg b/NguyenLanAnh/Microservice/filterdata/config/config.cfg new file mode 100644 index 00000000..18cb3f5e --- /dev/null +++ b/NguyenLanAnh/Microservice/filterdata/config/config.cfg @@ -0,0 +1,4 @@ +#dia chi rabbitmq1 +r1="172.17.0.2" +#dia chi rabbitmq2 +r2="172.17.0.3" diff --git a/NguyenLanAnh/Microservice/filterdata/filterdata/filterdata.py b/NguyenLanAnh/Microservice/filterdata/filterdata/filterdata.py new file mode 100644 index 00000000..e25fe286 --- /dev/null +++ b/NguyenLanAnh/Microservice/filterdata/filterdata/filterdata.py @@ -0,0 +1,47 @@ +import os, os.path +#!/usr/bin/env python +import pika + +url = "/config/config.cfg" +openFile = open(url) +lines = openFile.readlines() +lineUrl1 = lines[1] +lineUrl2 = lines[3] +strLineUrl1 = str(lineUrl1) +strLineUrl2 = str(lineUrl2) +url1 = strLineUrl1[4:14] +url2 = strLineUrl2[4:14] +#url1 = "'" + url1 + "'" +#url2 = "'" + url2 + "'" +print url1 +print url2 + +connection1 = pika.BlockingConnection(pika.connection.ConnectionParameters(host= url1)) +channel1 = connection1.channel() +connection2 = pika.BlockingConnection(pika.connection.ConnectionParameters(host= url2)) +channel2 = connection2.channel() +def callback(ch, method, properties, body): + print("Received %r" % body) + print "filtering continuously ...",body + newstr = "" + for i in body: + if i == "1": + newstr += "1" + else: + continue + print "du lieu sau khi loc: ",newstr + print "-----------" + channel2.basic_publish(exchange='test1.exchange', + routing_key='111', + body= newstr) + + # loc du lieu tu body, duoi, not done + # tiep +channel1.basic_consume(callback, + queue='test', + no_ack=True) + +print('Waiting for messages. To exit press CTRL+C') +channel1.start_consuming() + + From af64a55fab92376f65f339614def2c1eeff90780 Mon Sep 17 00:00:00 2001 From: nguyenlananh Date: Fri, 30 Mar 2018 23:36:01 +0700 Subject: [PATCH 3/3] grafana docs --- NguyenLanAnh/Grafana.md | 92 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 NguyenLanAnh/Grafana.md diff --git a/NguyenLanAnh/Grafana.md b/NguyenLanAnh/Grafana.md new file mode 100644 index 00000000..6e0ee0a4 --- /dev/null +++ b/NguyenLanAnh/Grafana.md @@ -0,0 +1,92 @@ +# Grafana + +### 1. Cài đặt, cấu hình Grafana với Docker + +- Cài đặt: Grafana dễ dàng được cài đặt bằng Docker với câu lệnh: + + $ docker run -d -p 3000:3000 grafana/grafana + +- Cấu hình: Các thay đổi cấu hình được thiết lập thông qua các biến môi trường ENV. Đồng thời cũng có 2 volumns, sqlite3 database trong /var/lib/grafana, file cấu hình trong /etc/grafana, có thể map những volumns này vời folders tại máy host bằng cách chạy container với câu lệnh: + + $ docker run -d -p 3000:3000 \ + -v /var/lib/grafana:/var/lib/grafana \ + -e "GF_SECURITY_ADMIN_PASSWORD=secret" \ + grafana/grafana + + Theo như câu lệnh trên, biến ENV đã được sử dụng để cấu hình Grafana. Các lựa chọn cấu hình được định nghĩa trong file conf/grafana.ini. Thay đổi cấu hình thông qua biến ENV bằng cách dử dụng theo cú pháp: + + GF__ + + Chi tiết các options của cấu hình có tại: [options](http://docs.grafana.org/installation/configuration/) + +- Plugins: + + Grafana là một công cụ với mục đích chính là "visualize" dữ liệu ( phần lớn là dữ liệu time series). Cơ bản Grafana không hỗ trợ lưu trữ dữ liệu như Graphite có thể làm, hay cũng không thể thu thập dữ liệu như Prometheus, nhưng Grafana lại có nhiều plugins để mở rộng thêm tính năng. Gồm những plugins data sources: CloudWatch, Elasticsearch, Graphite, Prometheus, InfuxDB,...; plugins applications: Zabbix, Clock,...; hay những plugins dashboard editing. + + Cài đặt plugin cho Grafana bằng cách sử dụng biến môi trường GF_INSTALL_PLUGINS, như ví dụ dưới đây: + + $ docker run \ + -d \ + -p 3000:3000 \ + --name=grafana \ + -e "GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-simple-json-datasource" \ + grafana/grafana + + + +### 2. Các quyền người dùng trong Grafana + + - Người sử dụng Grafana có các quyền (Permission) được xác định thông qua 4 yếu tố sau: + + - Vai trò tổ chức (Organization Role): Admin, Editor, Viewer + - Thông quá các thành viên trong nhóm đã được xác định quyền cụ thể + - Thông qua các quyền đã được chỉ định trực tiếp đến người dùng ( sử dụng trên folder hoặc dashboard) + - Sử dụng cờ Grafana Admin ( ví dụ: Super Admin) + + - Một người dùng có thể thuộc về 1 hay nhiều tổ chức (organization), có những vai trò (role) riêng trong mỗi tổ chức, mà trong đó: + + - Admin: + Có thể làm mọi thứ như : Thêm, sửa data sources; Thêm, sửa người sử dụng trong tổ chức, nhóm; Cấu hình các plugins hay thiết lập các cài đặt. + - Editor: + Có thể khởi tạo, sửa đổi dashboards hoặc các luật cảnh báo (Có thể bị disabled trên những folders hay dashboards đặc biệt; Không thể khởi tạo hay sửa đổi data sources cũng như không thể thêm người dùng. + - Viewer: + Có thể xem các dashboards ( Có thể bị disabled trên những folders hay dashboards đặc biệt); Không thể khởi tạo hay sửa đổi dashboards hay data sources. Trong một vài trường hợp, Viewer cũng có thể sửa đổi dashboards những không thể lưu thay đổi. + + - Đối với trường hợp khi sử dụng cờ Grafana Admin, người dùng sẽ trở thành Super Admin, có thể truy cập Server Admin, nơi mà có thể thấy danh sách người dùng, tổ chức được quản trị. + - Có một trang cấp quyền cho các folders, dashboards, có thể thay đổi các vai trò mặc định cho Editor và Viewer. + - Sử dụng cơ chế hạn chế truy cập (Restricting Access) bằng cách thay đổi ACL (Access Control List ). + + +### 3. Các thành phần cơ bản + + + Các thành phần có thể kể đến của Grafana như: Data sources, dashboards, panels, alerting. Trong đó: + +- Data sources: + + Đó là những storage backends như: Graphite, InfluxDB, OpenTSDB, Prometheus, Elasticsearch, CloudWatch. Mỗi data source sẽ có những query editor riêng biệt. + +- Panel: + + Là phần hiển thì cơ bản trong Grafana. Mỗi Panel cung cấp 1 Query Editor (tùy thuộc vào data sources) cho phép trích xuất thông tin để hiển thị trên panel. + Các loại panels là: Graph, Singlestat, Dashlist, Table,and Text, có thể được sắp xếp, kéo thả cho phù hợp trên dashboard. Chi tiết về các loại panels tại [panels](http://docs.grafana.org/features/panels/) + + Dưới đây là hình ảnh về 1 graph panel: + + ![graph](https://i.imgur.com/AMt5Ts3.png) + + +- Dashboards: + + Một dashboards có thể hiểu đơn giản là tập hợp của tất cả các panels, có thể chia thành 1 hay 2 dòng,... chứa các panels tùy ý. Chi tiết tại [dashboards](http://docs.grafana.org/reference/templating/) + + + + + + + + + + +