草庐IT

想构建自己的蜂窝模块吗?这是需要做的

Blues Wireless 2023-03-28 原文

物联网工程师是专家的专家。他们知道计算机科学、硬件设计,以及如何将功能集与特定用例相结合。他们了解微控制器、固件和网络。他们知道如何将这些元素组合在一起,为用户带来真正的价值。但即使有这样的专业知识,您也不必从头开始构建物联网产品的每个元素。

例如,以蜂窝模块为例,即在蜂窝物联网设备上发送和接收数据的芯片组和软件。随着物联网专用蜂窝技术(如Cat 1、NB-IoT和LTE-M)的兴起,通过移动网络连接产品从未如此流行。事实上,预计2022年至2026年,蜂窝物联网市场将增长近一倍,预计到后一年,全球价值将达到610亿美元。

但蜂窝连接有很多变量,创建这些物联网连接的模块很复杂。有了合适的团队,你当然可以建立自己的团队。问题是,除非你大规模部署,在现场部署了数百万台设备,否则你很少会看到投资的回报。

此外,还有大量灵活、可靠的蜂窝模块可用。其中一些旨在简化虚拟即插即用,其特点是嵌入式SIM卡具有预配置的网络访问、电源管理固件,甚至可以通过移动虚拟网络运营商(MVNO)实现预付费连接。如果您正在将物联网功能添加到现有产品中或向除最大市场之外的任何市场销售,那么明智的业务举措通常是与物联网模块提供商合作,而不是尝试自己构建。

为什么?一句话:复杂性。以下是构建蜂窝物联网模块所需的步骤,以及为什么从可信合作伙伴处采购模块和支持服务通常是更好的选择。

蜂窝模块设计的四个要素

构建蜂窝模块不是一项简单的任务;这是一个广泛的设计项目,涵盖了计算机科学的多个组成部分和领域,每个领域都需要自己的深入专业知识。从本质上讲,设计蜂窝模块需要对以下四个要素进行大量工作:

1、硬件设计

让我们从蜂窝模块的物理部分开始:调制解调器、天线和处理数据流量的微控制器单元(MCU)。只有调制解调器制造商才可能从头开始制造调制解调器。这意味着您必须购买符合您使用案例技术要求的第三方调制解调器,包括区域部署、带宽需求和适当的功耗。

您需要选择天线(用于单天线蜂窝技术,如Cat 1 bis)或天线(用于双天线应用)。你需要一个与调制解调器无缝对接的MCU,处理将设备连接到用户应用程序的处理。在全球供应链中断之际,无法保证所有这三种技术都能获得或负担得起。

但选择合适的设备只是开始:

  • 要使调制解调器正常工作,必须长时间与制造商的现场应用工程师密切合作。
  • 要传输数据,您必须完美地集成天线。
  • 您需要优化各种蜂窝频段和连接选项的集成。
即使您优化了硬件,还有一个重要步骤:法规遵从性。您的硬件必须经过PTCRB认证,以确保在全球网络上的互操作性。此外,根据您部署设备的位置,您还需要获得美国联邦通信委员会(FCC)、欧盟(CE标志)和/或其他地区当局的认证。这些认证并不便宜,而且需要大量的工作才能获得。

2、固件开发

即使是经验丰富的固件开发人员,在使用蜂窝模块时也可能需要学习很多东西,这是一个充满深度专业知识的领域。为了说明复杂性,这里是一个不完整的任务列表,供在定制物联网芯片上工作的固件开发人员使用:

  • 为固件堆栈选择生态系统:(Zephyr、FreeRTOS、ThreadX、Linux等)
  • 确保生态系统完全支持您选择的调制解调器和芯片组
  • 编写一个新的调制解调器驱动程序,能够包装所有调制解调器功能的AT命令
  • 调试驱动程序中的所有AT命令
  • 为MCU设计全天候更新
  • 为设备上的物理内存选择加密技术(VPN、安全元素、TLS等)
  • 决定如何将邮件打包到设备和从设备打包邮件
  • 选择数据的结构化格式(协议缓冲区、JSON等)
当然,一旦编写了固件,您就必须对其进行维护。当您构建自定义蜂窝模块时,您可以在系统的整个生命周期内自行完成。

3、云开发

固件处理设备上的数据处理。为了实现真正的连接,您还需要支持您独特用例的云服务。这需要广泛的云开发,包括但不限于以下工作:

  • 设备服务的全面开发,能够远程安装和更新固件
  • 定义云架构,为所有微服务选择理想的技术
  • 将所有设备完全集成到云服务中(请注意,主要的云供应商只提供端点和证书,其余由您决定)
  • 创建流畅的设备入职流程
  • 定义所有潜在的故障状态,并针对每个故障状态中的正常故障和恢复实施修复
  • 传输之间数据的临时存储
对于开发人员来说,所有这些云开发可能是一种不受欢迎的干扰,他们宁愿专注于用户应用程序和设备功能,这些是客户实际体验的解决方案的一部分。

4、MVNO运营商集成

工作的蜂窝模块的最后一部分不是你能控制的:它是与MVNO的合作伙伴关系,MVNO是处理你对网络本身访问的连接提供商。根据您选择的MVNO,您的设备可能仅限于特定类型的SIM卡(多SMSI、eSIM、iSIM、本机SIM卡等)。

一旦您的SIM卡技术与MVNO的系统相一致,您就有更多的决定要做。您将需要一个平台,允许您激活和停用设备,并管理沿途的数据消耗。您必须将云应用程序与连接平台集成。您需要预测系统的数据使用情况;这对于成功与MVNO协商至关重要,MVNO可能会根据数据速率收费。

蜂窝模块竞争

在模块设计过程的每一个阶段,您都将面临竞争,除非您在市场上占有巨大的地位,否则您将无法获得规模经济。这意味着与大型竞争对手相比,您将为SIM卡和数据支付更多的费用。

这是与集成模块供应商合作而不是构建自己的物联网芯片的另一个商业理由。这些供应商利用规模经济降低连接价格。更好的是,它们为您节省了构建自己的蜂窝模块的成本和难度,请放心,本文只触及了复杂性的表面。

有关想构建自己的蜂窝模块吗?这是需要做的的更多相关文章

  1. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  2. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  3. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  4. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  5. ruby - rspec 需要 .rspec 文件中的 spec_helper - 2

    我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只

  6. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

  7. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

    我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

  8. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  9. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  10. arrays - 这是 Ruby 中 Array.fill 方法的错误吗? - 2

    这个问题在这里已经有了答案:Arraysmisbehaving(1个回答)关闭6年前。是否应该这样,即我误解了,还是错误?a=Array.new(3,Array.new(3))a[1].fill('g')=>[["g","g","g"],["g","g","g"],["g","g","g"]]它不应该导致:=>[[nil,nil,nil],["g","g","g"],[nil,nil,nil]]

随机推荐