当前位置: 首页 > news >正文

DuodooBMS源码解读之 odoo_phoenix_alarm模块

Odoo18 扩展模块声光报警器用户使用手册

一、模块概述

本扩展模块是基于 Odoo18 原生系统进行开发的,主要用于实现与上位声光报警设备的通讯功能。通过该模块,用户可以方便地向设备发送指令,控制设备的声音、灯光等操作。本手册将详细介绍该扩展模块的功能及使用方法。

二、模块功能介绍

(一)设备连接功能

模块提供了连接到指定上位声光报警设备的功能,用户需要输入设备的 IP 地址和端口号,模块将尝试与设备建立连接。

(二)指令发送功能

模块预设了一些指令,如打开声音和灯光、关闭声光、音量调为 1 级等,用户可以根据需要选择相应的指令发送给设备,并且可以接收到设备的响应信息。

(三)界面显示功能

在 Odoo 的看板视图中,用户可以清晰地看到指令的相关信息,包括指令名称、操作代码等,方便用户进行操作。

三、操作步骤

(一)设备信息配置

  1. 进入设备信息配置页面
    • 登录 Odoo18 系统,进入相关模块的主界面。
    • 在左侧导航栏中找到“Phoenix Audible Address”(上位声光报警设备地址)模块。
  2. 配置设备信息
    • 在设备信息列表中,找到“指定声光设备地址”对应的记录,如果没有则点击“创建”按钮新建一条记录。
    • 在记录的编辑页面中,填写或确认以下信息:
      • 设备名称:默认为“指定声光设备地址”,可根据实际情况修改。
      • 设备地址(IP):输入上位声光报警设备的 IP 地址,默认为“192.168.0.100”。
      • 接口端口:输入设备的端口号,默认为“8101”。
      • 启用:勾选该选项表示启用该设备记录。
      • 公司:选择该设备所属的公司。
    • 点击“保存”按钮保存配置信息。

(二)查看指令信息

  1. 进入指令看板视图
    • 在左侧导航栏中找到“485 通讯协议指令集”对应的看板视图。
  2. 查看指令信息
    • 在看板视图中,会显示一系列的指令卡片,每个卡片包含指令的相关信息,如指令名称、操作代码等。
    • 将鼠标悬停在卡片上,可以查看更详细的信息。

(三)发送指令

  1. 选择要发送的指令
    • 在指令看板视图中,找到需要发送的指令卡片。
  2. 点击“下发指令”按钮
    • 在指令卡片上,点击“下发指令”按钮,该按钮图标为“fa-tags”。
  3. 指令发送过程及结果
    • 点击按钮后,系统会自动获取之前配置的设备信息,尝试与设备建立连接。
    • 如果连接成功,系统将发送相应的指令给设备,并在控制台输出“已发送指令: [指令代码]”的信息。
    • 设备接收到指令后会返回响应信息,系统会接收并在控制台输出“接收到设备的响应:[响应代码]”的信息。
    • 如果在发送指令过程中出现异常,系统会在控制台输出“发送指令时发生异常: [异常信息]”的信息。
    • 无论指令发送是否成功,最终系统都会关闭与设备的连接,并在控制台输出“连接已关闭”的信息。

(四)代码实现原理(供开发者参考)

1. 连接设备

connect_to_device 函数中实现了与设备的连接功能,代码如下:

def connect_to_device(ip, port):
    """
    连接到设备
    :param ip: 设备的 IP 地址
    :param port: 设备的端口号
    :return: 连接对象或 None
    """
    try:
        # 创建 Socket 对象
        socket_server = socket.socket()
        # 绑定 IP 地址和端口
        socket_server.bind((ip, port))
        # 监听端口
        socket_server.listen(1)
        print(f"正在监听 {ip}:{port}...")
        # 等待客户端连接
        conn, address = socket_server.accept()
        print(f"接收到了客户端的连接,客户端的信息是:{address}")
        return conn, socket_server
    except Exception as e:
        print(f"连接设备时发生异常: {e}")
        return None, None

该函数首先创建一个 Socket 对象,然后绑定指定的 IP 地址和端口号,开始监听该端口,等待客户端连接。如果连接成功,返回连接对象和 Socket 服务器对象;如果出现异常,返回 None

2. 发送指令

send_command_to_device 函数中实现了向设备发送指令的功能,代码如下:

def send_command_to_device(conn, command):
    """
    向设备发送指令
    :param conn: 连接对象
    :param command: 要发送的指令
    """
    try:
        # 发送指令
        conn.send(command)
        print(f"已发送指令: {command.hex()}")
        # 接收设备的响应
        response = conn.recv(1024)
        if response:
            print(f"接收到设备的响应:{response.hex()}")
    except Exception as e:
        print(f"发送指令时发生异常: {e}")

该函数接收一个连接对象和要发送的指令作为参数,首先将指令发送给设备,然后接收设备的响应信息并输出。如果发送或接收过程中出现异常,会输出异常信息。

3. 发送指令的主函数

send_value_to_socket 函数中实现了获取设备信息、连接设备、发送指令的完整流程,代码如下:

def send_value_to_socket(self):
    # 设备的 IP 地址和端口号
    device_obj = self.env['phoenix.audible.address']
    device_record = device_obj.search([('name', '=', '指定声光设备地址')])
    ip = device_record.ip
    port = int(device_record.port)

    # 连接到设备
    conn, socket_server = self.connect_to_device(ip, port)
    if conn and socket_server:
        try:
            # 发送指令
            self.send_command_to_device(conn, bytes.fromhex(self.name))
        except KeyboardInterrupt:
            print("用户手动中断程序")
        finally:
            # 关闭连接
            conn.close()
            socket_server.close()
            print("连接已关闭")

该函数首先从数据库中获取设备的 IP 地址和端口号,然后调用 connect_to_device 函数连接设备,如果连接成功,调用 send_command_to_device 函数发送指令,最后关闭连接。

四、注意事项

  1. 确保设备的 IP 地址和端口号配置正确,否则无法与设备建立连接。
  2. 在发送指令时,要确保设备处于正常工作状态,否则可能无法接收到设备的响应信息。
  3. 如果在使用过程中出现异常信息,可根据控制台输出的异常信息进行排查和解决。

五、常见问题及解决方法

(一)无法连接到设备

  • 问题描述:点击“下发指令”按钮后,控制台输出“连接设备时发生异常”的信息。
  • 可能原因
    • 设备的 IP 地址或端口号配置错误。
    • 设备未开启或网络不通。
  • 解决方法
    • 检查设备的 IP 地址和端口号是否正确,可通过设备的管理界面或相关文档获取正确信息。
    • 检查设备是否开启,网络是否正常。

(二)发送指令无响应

  • 问题描述:控制台输出“已发送指令”信息,但没有接收到设备的响应信息。
  • 可能原因
    • 设备未正确配置或出现故障。
    • 指令格式错误。
  • 解决方法
    • 检查设备的配置是否正确,可参考设备的说明书进行配置。
    • 检查指令格式是否正确,确保发送的指令符合设备的要求。

六、总结

本扩展模块为用户提供了方便的上位声光报警设备控制功能,通过简单的配置和操作,用户可以轻松地向设备发送指令,实现对设备的控制。在使用过程中,用户需要注意设备信息的配置和设备的状态,遇到问题时可根据本手册中的常见问题及解决方法进行排查和解决。

相关文章:

  • AI Agent实战:打造京东广告主的超级助手 | 京东零售技术实践
  • ICRA2024:CoLRIO,用于机器人群体的激光雷达测距-惯性集中状态估计
  • 虚拟机中ffplay播放RTSP流,不能播放交换机的设备,能播放虚拟机流
  • 冯·诺依曼体系结构、理解操作系统管理
  • 助力DeepSeek私有化部署服务:让企业AI落地更简单、更安全
  • TiDB 是一个分布式 NewSQL 数据库
  • 基于LangGraph和Ollama实现可调用AI搜索引擎Tavily的Agentic RAG问答机器人
  • 小程序的分包
  • Ubuntu 22.04 Install deepseek
  • 【HeadFirst系列之HeadFirst设计模式】第7天之命令模式:封装请求,轻松实现解耦!
  • Windows 下 Ollama 安装deepseek本地模型
  • Java集合框架大师课:从青铜到王者的数据结构指南(一)
  • 大白话React第一章基础入门
  • 纷析云开源版- Vue2-增加字典存储到localStorage
  • 若依按照时间段查询
  • 开源且免费的CMS系统有哪几个可以放心用?
  • 自动化之ansible(二)
  • 【反馈-建立负反馈,警惕正反馈-关键字摘要】
  • 【详细讲解在STM32的UART通信中使用DMA机制】
  • 23.4 MSHTML组件
  • 不止是生态优势,“浙江绿谷”丽水有活力
  • 王毅同丹麦外交大臣会谈,表示在格陵兰问题充分尊重丹麦主权和领土完整
  • 4名中学生同服处方药后身体不适,一心堂一药店未凭处方售药被罚1万元
  • 牛市早报|年内首次存款利率下调启动,5月LPR今公布
  • 夜驾遇东北虎隔窗对视?延吉林业局:村里有牛被咬死,保险公司会理赔
  • 上千螺母引发的枪支散件案:五金厂老板的儿子被诉,律师作无罪辩护