首页 > 其他分享 >Odoo集成MQTT

Odoo集成MQTT

时间:2023-06-06 14:00:14浏览次数:37  
标签:集成 string fields self mqtt MQTT client Odoo name

  1. 文件结构
  2. MQTT 客户端
import paho.mqtt.client as mqtt

client_dict = {}
import logging

_logger = logging.getLogger(__name__)


class MQTTClient(object):
    def __init__(self, client_id, protocol, broker, port, username, password):
        self.client_id = client_id
        self.protocol = protocol
        self.broker = broker
        self.port = port
        self.username = username
        self.password = password
        self.client = mqtt.Client(client_id, protocol)
        self.client.username_pw_set(self.username, self.password)

    def connect(self, keepalive=60):
        self.client.connect(self.broker, self.port, keepalive)
        self.client.loop_start()

    def is_connected(self):
        return self.client.is_connected()

    def disconnect(self):
        self.client.disconnect()
        self.client.loop_stop()

    def subscribe(self, topic, qos):
        self.client.subscribe(topic, qos)

    def publish(self, topic, data, qos):
        _logger.debug(f"{topic}>>>>>>>>>>   发送消息      >>>>>>> {data}")
        self.client.publish(topic=topic, payload=data, qos=qos)

    def on_message(self, client, userdata, msg):
        print("收到消息:", msg.topic, msg.payload.decode()
  1. MQTT客户端模型
# -*- coding: utf-8 -*-
# &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
# DTCloud360
# 邮箱: 200570059@qq.com
# 作者:'ZYF.Yan'
# 公司网址: http://www.dtcloud360.com/
# Copyright 中亿丰数字科技集团有限公司
# 日期:2023/5/31 11:11
# &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
# -*- coding: utf-8 -*-
from . import mqtt
from ...system_base import datetime_tools
from dtcloud import models, fields


class MqttClient(models.Model):
    _name = "mqtt.client"
    _rec_name = "name"
    _description = "Mqtt客户端"
    _order = "id"

    # string 名称  copy 是否可复制 required 是否必须  default 默认值  False 或 字段对应类型  readonly 是否只读  store 是否存储数据库
    name = fields.Char(string="客户端名称")
    broker = fields.Char(string="主机名", default="10.201.97.11")
    port = fields.Integer(string="端口号", default=1390)
    path = fields.Char(string="路由", default="/mqtt")
    user_name = fields.Char(string="用户")
    password = fields.Char(string="密码")
    keepalive = fields.Integer(string="生命周期", default=60)
    clean_start = fields.Boolean(string="是否清除会话", default=True)
    timeout = fields.Integer(string="话过期时间", help="会话过期时间,单位(秒)", default=0)
    tls = fields.Boolean(string="TLS", default=False)
    state = fields.Selection([("1", "正在连接"), ("2", "断开连接")], string="链接状态", help="True:链接成功 False:未连接")
    date = fields.Datetime(string="时间", default=datetime_tools.now())

    mqtt_pub_ids = fields.One2many(comodel_name="mqtt.pub", inverse_name="client_id", string="发布")
    mqtt_sub_ids = fields.One2many(comodel_name="mqtt.sub", inverse_name="client_id", string="订阅")

    # 获取MQTT客户端
    def get_mqtt_client(self):
        mqtt_client = mqtt.client_dict.get(self.name)
        if mqtt_client and mqtt_client.is_connected():
            return mqtt_client
        mqtt_client = mqtt.MQTTClient(self.name, 5, self.broker, self.port, self.user_name, self.password)
        mqtt_client.connect(keepalive=self.keepalive)
        return mqtt_client

    # 关闭客户端
    def disconnect(self):
        mqtt_client = self.get_mqtt_client()
        mqtt_client.disconnect()
        mqtt_client.loop_stop()
  1. MQTT消息发布
# -*- coding: utf-8 -*-
# &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
# DTCloud360
# 邮箱: 200570059@qq.com
# 作者:'ZYF.Yan'
# 公司网址: http://www.dtcloud360.com/
# Copyright 中亿丰数字科技集团有限公司
# 日期:2023/5/31 11:11
# &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
# -*- coding: utf-8 -*-

from ...system_base import datetime_tools
from dtcloud import models, fields


class MqttPub(models.Model):
    _name = "mqtt.pub"
    _rec_name = "name"
    _description = "Mqtt发布"
    _order = "id"

    # string 名称
    client_id = fields.Many2one("mqtt.client", "客户端")
    name = fields.Char(string="主题", default="testtopic/1")
    qos = fields.Integer(string="QoS", default=0)
    text = fields.Text(string="发布消息", default='{"msg": "hello"}')
    retain = fields.Boolean(string="保留", default=False)
    date = fields.Datetime(string="时间", default=datetime_tools.now())
    mqtt_pub_lines = fields.One2many(comodel_name="mqtt.pub.line", inverse_name="mqtt_pub_id", )

    # 消息发布
    def publish(self, topic_append=None):
        mqtt_client = self.client_id.get_mqtt_client()
        topic = self.name
        if topic_append:
            topic = self.name + topic_append
        mqtt_client.publish(topic=topic, data=self.text, qos=self.qos)
        self.mqtt_pub_lines.create({
            "name": topic,
            "qos": self.qos,
            "text": self.text,
            "retain": self.retain,
            "date": self.date,
            "mqtt_pub_id": self.id,
        })


class MqttPubLine(models.Model):
    _name = "mqtt.pub.line"
    _rec_name = "name"
    _description = "Mqtt发布明细"
    _order = "id"

    mqtt_pub_id = fields.Many2one("mqtt.pub", "Mqtt发布")
    name = fields.Char(string="主题", default="testtopic/1")
    qos = fields.Integer(string="QoS", default=0)
    text = fields.Text(string="发布消息", default='{"msg": "hello"}')
    retain = fields.Boolean(string="保留", default=False)
    date = fields.Datetime(string="时间", default=datesstime_tools.now())

作者:燕春

标签:集成,string,fields,self,mqtt,MQTT,client,Odoo,name
From: https://www.cnblogs.com/DTCLOUD/p/17460356.html

相关文章

  • 饶派杯 XCTF 车联网挑战赛 mqttsvr 复现
    前言IDA和Ghidra对mips64架构的识别貌似不是很友好,赛场上由于反编译实在难看,所以很难静下心来去逆,于是赛后在期末考试前稍微花点时间做了一下复现。准备checksec一下,发现是mips64大端,没开CanaryRELRO,可以溢出,可以覆写got表,这里开了NX和PIE,NX对mips64这种异架构来说好像并不会......
  • 单片机+WiFi模块和主流物联网平台实现MQTT协议通信视频教程
    单片机+WiFi模块和主流物联网平台实现MQTT协议通信视频教程1、单片机+WiFi模块和阿里云物联网平台实现MQTT协议通信视频教程单片机+WiFi模块和阿里云物联网平台实现MQTT协议通信,阿里云物联网平台可以对单片机数字量输出、保持寄存器进行设置操作,单片机可以实时上报数字量输入、数......
  • 看看Angular有啥新玩法!手把手教你在Angular15中集成报表插件
    摘要:本文由葡萄城技术团队于博客园原创并首发。葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。Angular15新特性Angular框架(以下简称“Angular”)作为一款由谷歌开发的Web应用程序框架,其强大的依赖注入系统、可重复使用的模块化开发理念和响应式编程模式等特点......
  • sa-token集成jwt
    向spring容器中加入一下类:用于重写:<!--https://mvnrepository.com/artifact/cn.dev33/sa-token-spring-boot-starter--><dependency><groupId>cn.dev33</groupId><artifactId>sa-token-spring-boot-starter</arti......
  • springboot集成Knife4j
    1.springboot我用的2.7.X引入maven<!--整合Knife4j--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.3</version></dependency>......
  • 持续集成工具hudson
    [url]http://www.blogjava.net/xiaodu/archive/2008/07/08/213298.html[/url]持续集成hudson入门:[url]http://somebody-hjh.iteye.com/blog/636182[/url]Hudson邮件配置&构建bash项目[url]http://www.blogjava.net/Man/archive/2012/12/26/393520.html[/url][b][color=red]详细......
  • 为什么我们迫切需要持续集成(Continuous Integration)
    持续集成(ContinuousIntegration),也就是我们经常说的CI,是现代软件开发技术的基础。本文论述了当前软件开发过程中存在的问题,讲解了持续集成、持续集成服务器的概念,最终探讨了为什么我们需要持续集成来解决这些问题。当前软件开发过程存在的问题在没有应用持续集成之前,传统的开发模......
  • odoo 定时任务
    <recordid="schedule_statistic_num_sum"model="ir.cron"><fieldname="name">加载发票</field><fieldname="model_id"ref="model_hr_expense_invoicesource_head"/>......
  • odoo中对X2many的操作
    many2many(0,_,({'field':value})创建一个新的记录并将其链接到这个记录(1,id,({'field':value})更新已链接的记录上的值(2,id,_)取消链接并删除相关记录(3,id,_)取消链接,但不删除相关记录(4,id,_)链接一个已经存在的记录(5,_,_)取消链接,但不会删除所有链接的记录(6......
  • odoo14 使用ir.actions.client 自定义弹窗内容
    ir.actions.client介绍ir.actions.client是odooactions事件的一种,触发一个在客户端实现(即js文件中定义的函数,通过core.action_registry.add(tag,函数名)注册到odoo中)动作tag--action在客户端的标识符,一般是一个专用的字符串,在js文件中注册该动作时指定。params(可......