Kết nối với một thiết bị

Trình điều khiển IoT cho phép mọi mô-đun SoOn giao tiếp trong thời gian thực với bất kỳ thiết bị nào được kết nối với Hộp IoT. Giao tiếp với Hộp IoT được thực hiện theo cả hai cách, vì vậy ứng dụng khách SoOn có thể gửi lệnh đến và nhận thông tin từ bất kỳ thiết bị được hỗ trợ nào.

Để thêm hỗ trợ cho một thiết bị, tất cả những gì chúng ta cần là:

  • một Giao diện, để phát hiện các thiết bị được kết nối thuộc một loại cụ thể

  • một Trình điều khiển, để giao tiếp với một thiết bị riêng lẻ

Ở mỗi lần khởi động, Hộp IoT sẽ tải tất cả Giao diện và Trình điều khiển có thể có trên phiên bản SoOn được kết nối. Mỗi mô-đun có thể chứa một thư mục iot_handlers sẽ được sao chép vào Hộp IoT. Cấu trúc của thư mục này như sau

your_module
├── ...
└── iot_handlers
    ├── drivers
    │   ├── DriverName.py
    │   └── ...
    │
    └── interfaces
        ├── InterfaceName.py
        └── ...

Phát hiện thiết bị

Các thiết bị được kết nối với Hộp IoT được phát hiện thông qua Giao diện. Có Giao diện cho từng loại kết nối được hỗ trợ (USB, Bluetooth, Video, Máy in, Nối tiếp, v.v.). Giao diện duy trì danh sách các thiết bị được phát hiện và liên kết chúng với Driver phù hợp.

Các thiết bị được hỗ trợ sẽ xuất hiện cả trên Trang chủ Hộp IoT mà bạn có thể truy cập thông qua địa chỉ IP của nó và trong mô-đun IoT của phiên bản SoOn được kết nối.

Giao diện

Vai trò của Giao diện là duy trì danh sách các thiết bị được kết nối thông qua loại kết nối đã xác định. Việc tạo giao diện mới đòi hỏi

  • Mở rộng lớp Giao diện

  • Đặt thuộc tính lớp connection_type

  • Triển khai phương thức get_devices, phương thức này sẽ trả về một từ điển chứa dữ liệu về từng thiết bị được phát hiện. Dữ liệu này sẽ được cung cấp làm đối số cho các hàm tạo và phương thức được hỗ trợ của Trình điều khiển.

Ghi chú

Việc đặt thuộc tính _loop_delay sẽ sửa đổi khoảng thời gian giữa các cuộc gọi thành get_devices. Theo mặc định, khoảng thời gian này được đặt thành 3 giây.

from odoo.addons.hw_drivers.interface import Interface

class InterfaceName(Interface):
    connection_type = 'ConnectionType'

    def get_devices(self):
        return {
            'device_identifier_1': {...},
            ...
        }

Tài xế

Sau khi giao diện truy xuất danh sách các thiết bị được phát hiện, giao diện sẽ lặp qua tất cả các Trình điều khiển có cùng thuộc tính connection_type và kiểm tra phương thức được hỗ trợ tương ứng của chúng trên tất cả các thiết bị được phát hiện. Nếu phương thức được hỗ trợ của Trình điều khiển trả về True, thì một phiên bản của Trình điều khiển này sẽ được tạo cho thiết bị tương ứng.

Ghi chú

Các phương thức được hỗ trợ của trình điều khiển được sắp xếp theo thứ tự ưu tiên. Phương thức được hỗ trợ của lớp con sẽ luôn được kiểm tra trước phương thức cha của nó. Mức độ ưu tiên này có thể được điều chỉnh bằng cách sửa đổi thuộc tính priority của Trình điều khiển.

Tạo Trình điều khiển mới yêu cầu:

  • Mở rộng Trình điều khiển

  • Đặt thuộc tính lớp connection_type.

  • Đặt thuộc tính device_type, device_connectiondevice_name.

  • Xác định phương thức được hỗ trợ

from odoo.addons.hw_drivers.driver import Driver

class DriverName(Driver):
    connection_type = 'ConnectionType'

    def __init__(self, identifier, device):
        super(NewDriver, self).__init__(identifier, device)
        self.device_type = 'DeviceType'
        self.device_connection = 'DeviceConnection'
        self.device_name = 'DeviceName'

    @classmethod
    def supported(cls, device):
        ...

Giao tiếp với thiết bị

Sau khi thiết bị mới của bạn được phát hiện và xuất hiện trong mô-đun IoT, bước tiếp theo là liên lạc với thiết bị đó. Vì hộp chỉ có địa chỉ IP cục bộ nên chỉ có thể truy cập nó từ cùng một mạng cục bộ. Do đó, giao tiếp cần phải diễn ra ở phía trình duyệt, bằng JavaScript.

Quá trình này phụ thuộc vào hướng giao tiếp: - Từ trình duyệt đến hộp, thông qua Actions - Từ hộp đến trình duyệt, thông qua Longpolling

Cả hai kênh đều được truy cập từ cùng một đối tượng JS, DeviceProxy, được khởi tạo bằng IP của Hộp IoT và mã nhận dạng thiết bị.

var DeviceProxy = require('iot.DeviceProxy');

var iot_device = new DeviceProxy({
    iot_ip: iot_ip,
    identifier: device_identifier
});

Hành động

Các hành động được sử dụng để yêu cầu thiết bị được chọn thực hiện một hành động cụ thể, chẳng hạn như chụp ảnh, in biên lai, v.v.

Ghi chú

Cần lưu ý rằng không có “câu trả lời” nào được gửi qua hộp trên tuyến này, chỉ có trạng thái yêu cầu. Câu trả lời cho hành động, nếu có, phải được lấy ra thông qua việc bỏ phiếu dài.

Một hành động có thể được thực hiện trên Đối tượng DeviceProxy.

iot_device.action(data);

Trong trình điều khiển của bạn, hãy xác định phương thức action sẽ được thực thi khi được gọi từ mô-đun SoOn. Nó lấy dữ liệu được cung cấp trong cuộc gọi làm đối số.

def action(self, data):
    ...

Thăm dò ý kiến

Khi bất kỳ mô-đun nào trong SoOn muốn đọc dữ liệu từ một thiết bị cụ thể, nó sẽ tạo một trình nghe được xác định bởi IP/miền của hộp và mã nhận dạng thiết bị, đồng thời chuyển cho nó chức năng gọi lại để gọi mỗi khi trạng thái thiết bị thay đổi. Cuộc gọi lại được gọi với dữ liệu mới làm đối số.

iot_device.add_listener(this._onValueChange.bind(this));

_onValueChange: function (result) {
    ...
}

Trong Trình điều khiển, một sự kiện được giải phóng bằng cách gọi hàm device_changed từ event_manager. Sau đó, tất cả các lệnh gọi lại được đặt trên trình nghe sẽ được gọi với self.data làm đối số.

from odoo.addons.hw_drivers.event_manager import event_manager

class DriverName(Driver):
    connection_type = 'ConnectionType'

    def methodName(self):
        self.data = {
            'value': 0.5,
            ...
        }
        event_manager.device_changed(self)