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_connection
vàdevice_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)