背景介绍

DAB(Device Automation Bus)是一种基于 MQTT 通信的轻量级协议,主要用于连接客厅中的消费电子产品(如智能电视和游戏机),并实现自动化测试。由于设备认证需要支持 DAB 功能,我们面临了开发 DAB 软件的紧迫任务。时间紧、任务重,挑战巨大。


第一阶段:学习与调研

1. 学习 DAB 协议

在项目初期,我深入学习了 DAB 协议,并将其整理成文档与团队分享。通过快速学习,我对 DAB 的整体架构和功能有了全面的理解,并整理出了 28 个核心接口。在此过程中,我发现了第一版协议中缺少对通信设备的标识。第二版协议中,增加了设备标识功能。

2. 调研设备现状

根据 DAB 协议,我对当前设备的基本情况进行了详细调研,重点分析了以下问题:

  • 实现 DAB 需要哪些组件和功能?

  • 现有设备中是否有可复用的组件或功能?

  • 如何最大化复用现有资源?

通过调研,我明确了设备现状,并制定了两种实现方案。


第二阶段:方案设计与技术选型

1. 两套实现方案

我设计了两套 DAB 实现方案:

  • 方案一:在电视外部部署 MQTT 服务。

  • 方案二:复用电视内部的 MQTT 服务。

经过评估,方案二在认证场景中更具优势,因为它减少了外部依赖,简化了部署流程。然而,复用设备内部的 MQTT 服务也带来了潜在的安全风险。为此,我们采取了以下安全措施:

  • 云端授权机制。

  • 超时自动关闭功能。

2. 开发语言选择

在开发语言的选择上,我们综合考虑了以下因素:

  • DAB 开源 Demo 的语言支持。

  • 认证设备的语言兼容性。

尽管团队更熟悉 C++,但为了缩短开发周期并赶上设备认证时间点,我们最终选择了 Node.js。此外,我们将 DAB 服务集成到现有进程中,减少了服务数量并复用了设备功能。


第三阶段:Node.js 版本的开发与挑战

1. 开发过程

使用 Node.js 开发 DAB 的过程中,我们充分利用了其单元测试功能,显著提升了开发效率和质量。然而,我们也遇到了一些挑战:

  • 内存泄漏问题:由于进程内存增加导致异常,通过调整参数解决了这一问题。

  • 接口与设备功能的适配:DAB 接口需要与多个设备功能模块对接,涉及多个项目组的协作,沟通成本较高。

2. Node.js 版本的局限性

尽管 Node.js 版本成功支撑了多个设备的 DAB 认证,但仍存在以下问题:

  1. 1.

    部分设备不支持 Node.js。

  2. 2.

    安全相关处理与业务逻辑分布在不同的进程中,由不同部门负责,协调成本较高。


第四阶段:C++ 版本的重构与优化

1. 开发背景

为了解决 Node.js 版本的局限性,我们开发了第二版 DAB,采用 C++ 实现。这一版本不仅避免了部分设备不支持 Node.js 的问题,还将安全处理逻辑集成到 DAB 内部,减少了跨部门沟通的复杂性。

2. 多平台支持与灵活性

在第二版设计中,我们特别注重灵活性和多平台支持:

  • 支持在 Windows、公司开发平台以及设备上运行。

  • 既可以独立运行,也可以嵌入到其他进程中。

为了实现这一目标,我添加了一个适配层,用于屏蔽不同平台的差异。适配层提供了多种实现策略,根据运行场景动态选择,从而加快了开发和调试速度。


第五阶段:开发中的经验与反思

1. 项目管理与沟通

由于时间紧迫,我采取了以下措施确保项目顺利推进:

  • 提前与参与者沟通,明确目标、时间要求和注意事项。

  • 使用 Jira 工具进行任务分解和进度跟踪。

  • 在开发过程中及时纠偏,确保项目按计划进行。

2. 技术设计与优化

在技术实现上,我遵循了正交性原则,尽量减少模块之间的耦合。例如:

  • 使用函数对象代替接口,使每个模块独立且无依赖。

  • 为每个模块编写单元测试,提升开发质量和速度。

然而,在适配层设计中,我一度犯了过度设计的错误,尝试将 Netflix 的 C 语言面向对象实现引入项目中。经过反思,我及时调整了设计,简化了代码结构。

调整前的代码:

--
javascript
typescript
shell
bash
sql
json
html
css
c
cpp
java
ruby
python
go
rust
markdown

#include <string>
#include <vector>
#include "dab/dab_api.h" extern "C" {
struct DAB_API_IO {
DAB_Interface iface;
bool (*getKeyList)(std::vector<std::string>& list);
bool (*pressKey)(const char* key, int durationMs);
bool (*catpureImage2png)(const char* file);
};
const DAB_API_IO& getDABAPIIO();
}

调整后的代码:

--
javascript
typescript
shell
bash
sql
json
html
css
c
cpp
java
ruby
python
go
rust
markdown

#pragma once
#include <string>
#include <vector> extern "C" {
bool dab_api_getKeyList(std::vector<std::string>& list);
bool dab_api_pressKey(const char* key, int durationMs);
bool dab_api_catpureImage2png(const char* file);
}

第二版的亮点与遗憾

亮点

  1. 1.

    单元测试:摆脱环境依赖,在开发云平台、设备等环境中快速执行测试,提高开发效率。

  2. 2.

    灵活的部署:支持在 Windows、开发云平台和设备上单独运行,也可以嵌入到其他进程中运行,极大提升了灵活性。

  3. 3.

    适配层:隔离变化,使代码逻辑快速稳定。

  4. 4.

    灵活的接入策略:为各平台切换提供便利,即使在依赖项不具备的情况下也能顺利开展工作。

  5. 5.

    与实践结合:提出了许多对测试有用的应用场景和扩展。

  6. 6.

    高效的开发速度:通过合适的模式和策略,极大加快了开发速度。

  7. 7.

    文档生成代码:实践了由文档生成代码的方式,加快了开发速度并保证了准确性。

遗憾

  1. 1.

    嵌入进程的部署方式:增加了对安全性的依赖,特别是对安全性的要求更高。

  2. 2.

    与实践结合的时机:最初主要围绕认证需求开发,未能更早与实践和用户结合,导致成熟速度较慢。


总结

通过 DAB 的开发,我深刻体会到在紧迫时间内完成复杂项目的挑战与成就感。从协议学习到多平台实现,我们不仅解决了技术难题,还优化了团队协作和项目管理流程。


关键词:DAB、MQTT、Node.js、C++、多平台支持、正交性原则、单元测试、项目管理

回顾我的软件开发经历:开发DAB的更多相关文章

  1. Windows系统 为 QT5软件 搭建 OpenCV2 开发环境

    Windows系统 为 QT5软件 搭建 OpenCV2 开发环境 我们的电脑系统:Windows 10 64位 Qt5 软件:Qt 5. 7. 0 OpenCV2 版本:OpenCV2.4.10 1 ...

  2. 用做网页开发经历了三个阶段(附长篇讨论) good

    用做网页开发经历了三个阶段:第一阶:傻干阶段使用Intraweb,傻瓜型,无需知道javascript,html,css,会pascal就可以了. 第二阶:困惑阶段使用Intraweb,有很多限制,比 ...

  3. 基于Azure的软件部署和开发系列沙龙

    活动简介: Azure是一种灵活和支持互操作的平台,它可以被用来创建云中运行的应用或者通过基于云的特性来加强现有应用.它开放式的架构给开发者提供了Web应用.互联设备的应用.个人电脑.服务器.或者提供 ...

  4. Windows系统 为 Visual Studio软件 搭建 OpenCV2 开发环境

    Windows系统 为 Visual Studio软件 搭建 OpenCV2 开发环境 我们的电脑系统:Windows 10 64位 Visual Studio 软件:Visual Studio 20 ...

  5. 如何快速上手一款新的嵌入式CPU芯片(记录CC2540开发经历)

    新换了工作,需要熟悉新公司的产品开发项目,更新博客就懈怠了,不过环境的不同,也让我对嵌入式开发有了更深刻的理解.在原公司我主要负责在STM32F207芯片平台上, 利用UCOS+LWIP进行嵌入式服务 ...

  6. 【接单】找我付费定制Python工具软件或网站开发、Chrome浏览器插件、油猴脚本

    各位可付费找我定制Python工具软件或网站开发.Chrome插件.油猴脚本.自动化软件,可通过我做的软件来评判我的实力,一定要先和我沟通你的需求,做不了的我也不会接. 费用50元起,通过淘宝APP或 ...

  7. 以太网在汽车行业中的挑战——灵活的接口及软件使ECU开发不再复杂

    以太网在汽车行业中的挑战--灵活的接口及软件使ECU开发不再复杂 以太网将会在一批新车型中作为一个车载系统网络使用.因此,下一步就是以太网和现有汽车网络技术的集成,包括:CAN.FlexRay.LIN ...

  8. IDEA搭建scala开发环境开发spark应用程序

    通过IDEA搭建scala开发环境开发spark应用程序   一.idea社区版安装scala插件 因为idea默认不支持scala开发环境,所以当需要使用idea搭建scala开发环境时,首先需要安 ...

  9. Atitit 开发进度 开发效率提升解决方案

    Atitit 开发进度  开发效率提升解决方案 1.1. 使用4gl语言 dsl语言尽可能 1 1.2. Ssd+高屏幕显示器,提升硬件 1 1.3. 汉字命名规范,可以大力提升可读性与效率 1 1. ...

  10. 第二章 Odoo 12开发之开发环境准备

    在更深入了解 Odoo 开发之前,我们应配置好开发环境并学习相关的基础管理任务.本文中,我们将学习创建 Odoo 应用所需用到的工具和环境配置.这里采用 Ubuntu 系统来作为开发服务器实例的主机, ...

随机推荐

  1. 返璞归真!使用 alpinejs 开发交互式 web 应用,抛弃 node_modules 和 webpack 吧!

    前言 最近一直在使用 DjangoStarter 开发各种小项目,之前我是比较喜欢前后端分离的,后端用 Ninja API,前端 nextjs,开发起来也挺舒服的,交互体验也比较好. 不过我在网上冲浪 ...

  2. java——棋牌类游戏斗地主(webddz1.0)之二

    package com.ddz; import java.io.ObjectInputStream; import java.net.DatagramSocket; /**************** ...

  3. 一、FreeRTOS学习笔记-基础知识

    一基础知识 1.任务调度(调度器) 调度器就是使用相关的调度算法来决定当前需要执行的哪个任务 FreeRTOS三种任务调度方式: 1.抢占式调度:主要是针对优先级不同的任务,每个任务都有一个优先级,优 ...

  4. django插件之django-import-export

    文档:https://django-import-export.readthedocs.io/en/latest/getting_started.html#creating-import-export ...

  5. windows下执行Python脚本

    由于业务需要,有些python脚本需要在Windows系统上,并且支持定时执行 1) 一. 创建.bat批处理文件 新创建文件并将扩展名改为.bat 二. 写入执行python脚本的语句 @echo ...

  6. The 2023 ICPC Asia Hong Kong Regional Programming Contest

    The 2023 ICPC Asia Hong Kong Regional Programming Contest A. TreeScript 给你一个根,让你构造一棵树,每个节点被创造的时候必须知道 ...

  7. idea springboot 微服务批量启动

    概要 在使用IDEA开发微服务的时候,微服务比较多,启动起来比较麻烦,下面介绍一下使用批量启动微服务的方法. 方法 编辑当前项目根目录下的 .idea\workspace.xml 文件. 找到 < ...

  8. pdf.js 笔记

    1.介绍 官方文档,pdf.js是由mozilla开源的js库,用于在web环境中渲染和显示pdf文档 目前,绝大多数PC浏览器都已经内置了pdf阅读器,能够直接预览pdf文件(内置了pdf.js), ...

  9. iOS自动化打包输出工具

    自动化打包输出工具 做开发的小伙伴有时候会接到自动化打包的需求,公司一般是要求根据一个配置文件来实现自动化配置iOS项目,比如往Xcode工程添加或修改代码.添加Framework.library.S ...

  10. C++之OpenCV入门到提高006:图像混合

    一.介绍 今天是这个系列<C++之 Opencv 入门到提高>的第六篇文章.这篇文章也不难,介绍如何图像的混合操作.图像本质上也是数据,既然是数据,我们就可以针对两张或者多张图片进行加.减 ...