An Architecture for a hardware-software system

You are to design a single camera software, various client applications, and a communication model for a family of cameras. Each camera runs the Android OS, and will be crafted to make several variants; each of which takes up different forms. Each camera has various channels and interfaces to communicate with.

Variables in the camera variants:
  • headless or on-device display
    ie, the camera may be wireless only; it may have an LED as an indicator, or it may have an OLED or LCD
  • perform on-device analytics
    not each camera is allowed to perform on-board analytics; some could do stabilization, some face detection, some motion detection, some may perform all. This is limited by what algorithms the customer buys.
  • camera sensor resolution, fps, camera lens
    every variant has a different sensor and lens specification
  • multiple camera sensors
    some cameras might have multiple sensors; thermal, near IR, or visible light
  • motor-driven PTZ
    the camera might have a pan-tilt-zoom driven by motors
  • ... and many more that we don't know yet.
Mediums/channels to communicate over:
  • wireless mediums such as Wifi, Bluetooth, Wifi Direct, Hotspot
  • wired mediums such as Ethernet, or a USB cable
  • physical touch-screen
  • physical 5 buttons keypad, or a joystick
  • voice
Interfaces to communicate through:
  • a mobile application - android and ios both
  • a browser by entering the camera's IP address
  • a desktop application running on windows, linux, and mac
  • a browser but being able to access the camera globally via the internet
  • a CLI; command line terminal interface

The different cameras that can be communicated to via various channels/mediums using different interfaces.

Remember, not each will have all of these mediums and interfaces. One variant may have a display, but another might only be accessible wirelessly. Some may have all. Each camera will also have different things it can do; some cameras perform on-device analytics, others provide for onboard stabilization whereas others don't.

Now, you are to create one camera software that fits all variants. Likewise, you are required to write only one client software per interface; an app, a browser interface, a desktop app etc that can communicate with each of these variants. You must ensure every client interface is backward compatible, and if possible, provide forward compatibility.

How do you go about designing such a system, ensuring you can communicate with any variant through any channel, with forward and backward compatibility?


Fun fact, this is my 100th blog and I'm happy it's this! I'll put up my solution in the next blogpost. I'd love to hear solutions though! Remember, when I first joined this project, the problem statement was not as structured and well defined, we figured things on the fly and kept adding things on the go. We also did not expect it to grow to these many variants then. I'm proud of what I came up with though!


Popular posts from this blog

[Breaking News] AI takes over universe to calculate Pi

Firebase Auth | The Debug vs Release Signature Problem

Cold Showers