0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

SIMBOSS:物聯(lián)網(wǎng)業(yè)務如何應用領域驅動設計

電子設計 ? 來源:電子設計 ? 作者:電子設計 ? 2020-12-25 18:31 ? 次閱讀

在這個萬物互聯(lián)的時代,物聯(lián)網(wǎng)業(yè)務蓬勃發(fā)展,但也瞬息萬變,對于開發(fā)人員來說,這是一種挑戰(zhàn),但也是一種“折磨”。

在業(yè)務發(fā)展初期,因為時間有限,我們一般會遵循“小步快跑,迭代試錯”的原則進行業(yè)務開發(fā),用通俗的話來說就是“no bb,先上了再說”,對于開發(fā)人員的具體實現(xiàn),就是“腳本式”的開發(fā)方式,或者說是數(shù)據(jù)的 CURD,這樣的開發(fā)方式,在項目早期沒什么問題,但隨著新業(yè)務的不斷加入,業(yè)務迭代的頻繁,我們會發(fā)現(xiàn),現(xiàn)在的業(yè)務系統(tǒng)變得越來越冗雜,新加一個需求或者改一個業(yè)務,變得無比困難,因為業(yè)務實現(xiàn)彼此之間模糊不清,業(yè)務規(guī)則在代碼中無處不在,開發(fā)人員也就無從下手。

那怎么解決上面的問題呢?可能很多人會說“你這代碼不行,重構呀”,是的,我們發(fā)現(xiàn)了項目中的“壞代碼”,比如一個類上千行,一個方法幾百行,于是我們把一些代碼抽離出來,做一些內(nèi)聚的實現(xiàn),代碼規(guī)范做一些調(diào)整,但這樣只是解決現(xiàn)在項目代碼中的問題,下次項目迭代的時候,你并不能保證寫的新代碼是符合規(guī)范的,而且最重要的是,重構并不能在業(yè)務代碼上給一個定義,什么意思呢?比如你重構一個方法,你只能從技術的角度去重構它,并不能從業(yè)務的角度去重構,因為在整個業(yè)務系統(tǒng)“混亂”的情況下,你無法保證自己的“清白”。另外還有一點,即使你重構了它,但對于新加入的開發(fā)人員來說,他并不能理解你重構的目的,換句話說,就是如果他要使用或改這個方法,他完全不知道能不能使用或者使用了會不會影響其他業(yè)務,說白了就是,業(yè)務的邊界不明確。

那如何定義業(yè)務的邊界呢?答案就是運用 Eric Evans 提出的領域驅動設計(Domain Driven Design,簡稱 DDD),關于 DDD 的相關概念,這邊就不敘述了,網(wǎng)上有很多資料,需要注意的是,DDD 關注的是業(yè)務設計,并非技術實現(xiàn)。

物聯(lián)網(wǎng)業(yè)務如何應用領域驅動設計?這其實是個大命題,該怎么實現(xiàn)?如何下手呢?我找了我之前做的一個業(yè)務需求,來做示例,看看“腳本式”的實現(xiàn),和 DDD 的實現(xiàn),前后有什么不太一樣的地方。

腳本式的開發(fā)

業(yè)務需求:針對物聯(lián)網(wǎng)卡的當前套餐使用量,根據(jù)一定的規(guī)則,進行特定的限速設置。

需求看起來很簡單,下面要具體實現(xiàn)了,首先,我創(chuàng)建了三張表:

speed_limit:限速表,包含用戶 ID、套餐 ID 等。

speed_limit_config:限速配置表,包含限速檔位,也就是套餐使用量在什么區(qū)間,限速多少的配置。

speed_limit_level:限速級別表,包含限速的單位和具體值,主要界面選擇使用。

然后再創(chuàng)建對應“貧血”的模型對象(沒有任何行為,并且屬性和數(shù)據(jù)庫字段一一對應):

public class SpeedLimit {

private Long id;

private Integer orgId;

private Long priceOfferId;

//getter setter....

public class SpeedLimitConfig {

private Long id;

private Long speedLimitId;

private Double usageStart;

private Double usageEnd;

//getter setter....

public class SpeedLimitLevel {

private Long id;

private String unit;

private Double value;

//getter setter....

好,數(shù)據(jù)庫表和模型對象都創(chuàng)建好了,接下來做什么呢?CURD 啊,界面需要對這些數(shù)據(jù)進行查看和維護,所以,我創(chuàng)建了:

SpeedLimitMapper.xml:數(shù)據(jù)庫訪問 SQL。

SpeedLimitService.java:調(diào)用 Mapper,并返回數(shù)據(jù)。

SpeedLimitController.java:接受前端傳遞參數(shù),并調(diào)用 Service,封裝返回數(shù)據(jù)。

簡單看下SpeedLimitService.java中的代碼:

public interface SpeedLimitService {

List<SpeedLimit> listAll();

SpeedLimitVO getById(Long id);

Boolean insert(Integer orgId, Long priceOfferId, List<SpeedLimitConfig> speedLimitConfigs);

//...

CURD 流程沒啥問題吧,數(shù)據(jù)維護好了,接下來要進行限速檢查了,我們目前的實現(xiàn)方式是:有一個定時任務,每間隔一段時間批量執(zhí)行,查詢所有的限速配置(上面的speed_limit),然后根據(jù)用戶 ID 和套餐 ID,查詢出符合條件的物聯(lián)網(wǎng)卡,然后將卡號丟到 MQ 中異步處理,MQ 接受到卡號,再查詢對應的限速配置(speed_limit以及speed_limit_config),然后再查詢此卡的套餐使用量,最后根據(jù)規(guī)則匹配,進行限速設置等操作。

MQ 中的處理代碼(阿里插件都已經(jīng)提醒我,這個方法代碼太長了):

為什么代碼不貼出來?因為里面的代碼慘不忍睹啊,if..else..的各種嵌套,所以,還是眼不看為凈。

好,到此為止,這個需求已經(jīng)“腳本式”的開發(fā)完了,我們來總結一把:

條理清晰,開發(fā)效率賊高,完全符合“先上了再說”的開發(fā)原則。

數(shù)據(jù)的 CURD 和業(yè)務邏輯處理隔離開,用到的地方_x001D_“單獨處理”,似乎沒啥問題。

沒啥問題對吧?好,現(xiàn)在業(yè)務迭代來了,產(chǎn)品經(jīng)理發(fā)話了,說除了批量限速檢查,還需要對單卡的限速同步處理(瞎掰的),因為是同步處理,所以我沒辦法發(fā)消息到 MQ 處理,只能對 MQ 中的那一坨代碼進行重構,代碼抽離的過程中發(fā)現(xiàn),并不能兼容新的需求,怎么搞呢?只能又重載了一個方法,把里面能抽離的抽離出來,改好之后,需求完美上線。

過了一天,產(chǎn)品經(jīng)理又發(fā)話了。

然后,我把產(chǎn)品經(jīng)理打死了。

領域驅動設計

為了避免我和產(chǎn)品經(jīng)理打架,我需要做一些改變,就事論事,畢竟問題出在開發(fā)這邊,面對“一鍋亂粥”的代碼,我決定用 DDD 這把“武器”進行改造它。

我們知道,DDD 分為戰(zhàn)略設計和戰(zhàn)術設計,戰(zhàn)略設計就是把限界上下文和核心領域搞出來,然后針對某個限界上下文,再利用戰(zhàn)術設計進行具體的實現(xiàn),這個過程一般是針對一個完整復雜的業(yè)務系統(tǒng),涉及的東西很多,你可能需要和領域專家進行深入溝通,如有必要還需畫出業(yè)務領域圖、限界上下文圖、限界上下文映射圖等等,以便理解。

針對限速設置的業(yè)務需求,我簡單畫了下所涉及的上下文映射圖:

可以看到,我們關注的只有一個限速上下文,物聯(lián)網(wǎng)卡上下文、套餐流量上下文和運營商 API 上下文,我們并不需要關心,ACL 的意思是防腐層(Anticorruption Layer),它的作用就是隔離各個上下文,以及協(xié)調(diào)上下文之間的通信

限速上下文內(nèi)部的實現(xiàn)(如聚合根和實體等),其實就是戰(zhàn)術設計的具體實現(xiàn),關于概念這邊就不多說了,這里說下具體的設計:

SpeedLimit聚合根:毫無疑問,限速上下文的聚合根是限速聚合根,也可以稱之為聚合根實體,這里的SpeedLimit并不是上面貧血的模型對象,而是包含限速業(yè)務邏輯的聚合對象。

SpeedLimitConfig實體:限速配置實體,在生命周期內(nèi)有唯一的標識,并且依附于限速聚合根。

SpeedLimitLevel實體:其實限速級別應該設計成值對象,因為它并沒有生命周期和唯一標識的概念,只是一個具體的值。

SpeedLimitContext值對象:限速上下文,只包含具體的值,作用就是從應用層發(fā)起調(diào)用到領域層,可以看做是傳輸對象。

SpeedLimitService領域服務:因為涉及到多個上下文的協(xié)調(diào)和交互,限速聚合根并不能獨立完成,所以這些聚合根完成不了的操作,可以放到領域服務中去處理。

SpeedLimitRepository倉儲:限速聚合對象的管理中心,可以數(shù)據(jù)庫存儲,也可以其他方式存儲,不要把Mapper接口定義為Repository接口。

以上因為不好在現(xiàn)有項目中做改造,我就用 Spring Boot 做了一個項目示例(Spring Boot 用起來真的很爽,簡潔高效,做微服務非常好),大致的項目結構:

├── src

│ ├── main

│ │ ├── java

│ │ │ └── com

│ │ │ └── qipeng

│ │ │ └── simboss

│ │ │ └── speedlimit

│ │ │ ├── SpeedLimitApplication.java

│ │ │ ├── application

│ │ │ │ ├── dto

│ │ │ │ └── service

│ │ │ │ ├── SpeedLimitApplicationService.java

│ │ │ │ └── impl

│ │ │ │ └── SpeedLimitApplicationServiceImpl.java

│ │ │ ├── domain

│ │ │ │ ├── aggregate

│ │ │ │ │ └── SpeedLimit.java

│ │ │ │ ├── entity

│ │ │ │ │ ├── SpeedLimitConfig.java

│ │ │ │ │ └── SpeedLimitLevel.java

│ │ │ │ ├── service

│ │ │ │ │ ├── SpeedLimitService.java

│ │ │ │ │ └── impl

│ │ │ │ │ └── SpeedLimitServiceImpl.java

│ │ │ │ └── valobj

│ │ │ │ └── SpeedLimitCheckContext.java

│ │ │ ├── facade

│ │ │ │ ├── CarrierApiFacade.java

│ │ │ │ ├── DeviceRatePlanFacade.java

│ │ │ │ ├── IotCardFacade.java

│ │ │ │ └── model

│ │ │ │ ├── CarrierConstants.java

│ │ │ │ ├── DeviceRatePlan.java

│ │ │ │ ├── EnumTemplate.java

│ │ │ │ ├── IotCard.java

│ │ │ │ └── SpeedLimitAction.java

│ │ │ └── repo

│ │ │ ├── dao

│ │ │ │ └── SpeedLimitDao.java

│ │ │ └── repository

│ │ │ └── SpeedLimitRepository.java

│ │ └── resources

│ │ ├── application.yml

│ │ ├── mybatis

│ │ │ ├── mapper

│ │ │ │ └── SpeedLimitMapper.xml

│ │ │ └── mybatis-config.xml

│ └── test

│ └── java

│ └── com

│ └── qipeng

│ └── simboss

│ └── speedlimit

│ ├── SpeedLimitApplicationTests.java

│ ├── application

│ │ └── SpeedLimitApplicationServiceTest.java

│ └── domain

│ └── SpeedLimitServiceTest.java

包路徑:

import com.qipeng.simboss.speedlimit.domain.a(chǎn)ggregate.SpeedLimit;//聚合根import com.qipeng.simboss.speedlimit.domain.entity.*;//實體import com.qipeng.simboss.speedlimit.domain.valobj.*;//值對象import com.qipeng.simboss.speedlimit.domain.service.*;//領域服務import com.qipeng.simboss.speedlimit.domain.repo.repository.*;//倉儲import com.qipeng.simboss.speedlimit.repo.dao.*;//mapper接口import com.qipeng.simboss.speedlimit.a(chǎn)pplication.service.*;//應用層服務

好,基本上這個項目設計的差不多了,需要注意的是,上面核心是com.qipeng.simboss.speedlimit.domain包,里面包含了最重要的業(yè)務邏輯處理,其他都是為此服務的,另外,在領域模型不斷完善的過程中,需要持續(xù)對領域模型進行單元測試,以保證其健壯性,并且,設計SpeedLimit聚合根的時候,不要先考慮數(shù)據(jù)庫的實現(xiàn),如果需要數(shù)據(jù)進行測試,可以在SpeedLimitRepository中 Mock 對應的數(shù)據(jù)。

看下SpeedLimit聚合根中的代碼:

package com.qipeng.simboss.speedlimit.domain.a(chǎn)ggregate;

import com.qipeng.simboss.speedlimit.domain.entity.SpeedLimitConfig;import com.qipeng.simboss.speedlimit.facade.model.IotCard;import lombok.Data;import java.util.Date;import java.util.List;

/**

* 限速聚合根

*/@Datapublic class SpeedLimit {

/**

* 限速

*/

private Long id;

/**

* 組織ID

*/

private Integer orgId;

/**

* 套餐ID

*/

private Long priceOfferId;

/**

* 限速配置集合

*/

private List<SpeedLimitConfig> configs;

/**

* 是否刪除當前限速,不持久化

*/

private Boolean isDel = false;

/**

* 卡的限速值,不持久化

*/

private Double cardSpeedLimit;

/**

* 獲取限速值

*/

public Double chooseSpeedLimit(Double usageDataVolume, Double totalDataVolume, Long cardPoolId,

Boolean isRealnamePassed, Double currentSpeedLimit) {

//todo this...

/**

* 設置是否刪除當前限速

*/

private void setIsDelSpeedLimit(Double currentSpeedLimit) {

//判斷當前限速是否存在,如果存在,則刪除現(xiàn)有的限速配置

//todo this...

上面注釋寫的比較多(方便理解),SpeedLimit聚合根和之前的SpeedLimit貧血對象相比,主要有以下改動:

SpeedLimit聚合根并不只是包含getter和setter,還包含了業(yè)務行為,并且也不和數(shù)據(jù)庫表一一對應。

SpeedLimit聚合根中包含configs對象(限速配置集合),因為限速配置實體依附于SpeedLimit聚合根。

SpeedLimit聚合根中的chooseSpeedLimit方法,意思是根據(jù)某種規(guī)則從限速配置中,選取當前要限速的值,這是限速的核心業(yè)務邏輯。

那為什么不把整個限速設置的邏輯寫在SpeedLimit聚合根中?而只是實現(xiàn)選取要限速的值呢?為什么?為什么?為什么?

答案很簡單,因為限速設置的整個邏輯需要涉及到多個上下文的協(xié)作,SpeedLimit聚合根完全 Hold 不住呀,所以要把這些邏輯寫到限速領域服務中,還有最重要的是,SpeedLimit聚合根只關注它邊界內(nèi)的業(yè)務邏輯,像限速設置的具體后續(xù)操作,它不需要關心,那是業(yè)務流程需要關心的,也就是限速_x001D_領域服務需要去協(xié)作的。

好,那我們就看下限速領域服務的具體實現(xiàn):

package com.qipeng.simboss.speedlimit.domain.service.impl;

/**

* 限速領域服務

*/@Servicepublic class SpeedLimitServiceImpl implements SpeedLimitService {

@Autowired

private SpeedLimitRepository speedLimitRepo;

@Autowired

private IotCardFacade iotCardFacade;

@Autowired

private DeviceRatePlanFacade deviceRatePlanFacade;

@Autowired

private CarrierApiFacade carrierApiFacade;

/**

* 批量限速檢查

*/

@Override

public void batchSpeedLimitCheck() {

List<SpeedLimit> speedLimits = speedLimitRepo.listAll();

for (SpeedLimit speedLimit : speedLimits) {

List<IotCard> iotCards = iotCardFacade.listByByOrgId(speedLimit.getOrgId(), speedLimit.getPriceOfferId());

for (IotCard iotCard : iotCards) {

doSpeedLimitCheck(iotCard, speedLimit);

/**

* 單個限速檢查

*/

@Override

public void doSpeedLimitCheck(SpeedLimitCheckContext context) {

String iccid = context.getIccid();

IotCard iotCard = iotCardFacade.get(iccid);

if (iotCard ?。?null) {

SpeedLimit speedLimit = speedLimitRepo.get(iotCard.getOrgId(), iotCard.getPriceOfferId());

if (speedLimit ?。?null) {

this.doSpeedLimitCheck(iotCard, speedLimit);

/**

* 執(zhí)行限速邏輯

* @param iotCard

* @param speedLimit

*/

private void doSpeedLimitCheck(IotCard iotCard, SpeedLimit speedLimit) {

//todo this...

notify(iccid, speedLimit.getCardSpeedLimit());

/**

* 修改卡的限速值,并通知用戶

*/

private void notify(String iccid, Double speedLimit) {

if (speedLimit ?。?null) {

//todo this...

System.out.println("update iotCard SpeedLimit to: " + speedLimit);

System.out.println("notify...");

上面的代碼看起來很多,其實干的事并不復雜,主要是業(yè)務流程:

通過SpeedLimitCheckContext上下文獲取iccid,然后獲取對應的限速對象和套餐流量對象。

通過限速聚合根獲取需要設置的限速值(核心業(yè)務)。

調(diào)用相關接口進行添加/刪除限速。

修改卡的限速值,并通知用戶。

以上限速領域模型基本上比較豐富了,后面的業(yè)務迭代只需要改里面的代碼即可。

好,我們再來看下應用服務中的代碼:

package com.qipeng.simboss.speedlimit.a(chǎn)pplication.service.impl;

@Servicepublic class SpeedLimitApplicationServiceImpl implements SpeedLimitApplicationService {

@Autowired

private SpeedLimitService speedLimitService;

@Override

public void batchSpeedLimitCheck() {

speedLimitService.batchSpeedLimitCheck();

@Override

public void doSpeedLimitCheck(String iccid) {

SpeedLimitCheckContext context = new SpeedLimitCheckContext();

context.setIccid(iccid);

speedLimitService.doSpeedLimitCheck(context);

應用服務不應包含任何的業(yè)務邏輯,只是工作流程的處理,比如接受參數(shù),然后調(diào)用相關服務,封裝返回等,如果需要持久化聚合根對象,調(diào)用倉儲服務即可(可能會涉及到 UnitOfWork),另外,像限速聚合根對象的維護,也是實現(xiàn)在應用服務(因為不包含任何業(yè)務邏輯),比如創(chuàng)建限速聚合根,過程大概是這樣:

應用服務接受參數(shù),然后調(diào)用創(chuàng)建限速聚合根工廠(如SpeedLimitFactory),或者通過構造函數(shù)創(chuàng)建(包含業(yè)務規(guī)則,不符合則拋出錯誤),當然創(chuàng)建還包含聚合根附屬的實體。

限速聚合根創(chuàng)建好了,調(diào)用倉儲服務持久化對象。

返回操作結果。

那如何改善之前 MQ 中處理的一坨代碼呢?答案就是一行代碼:

@Testpublic void doSpeedLimitCheckTest() {

System.out.println("start....");

speedLimitApplicationService.doSpeedLimitCheck("1111");

System.out.println("end");

沒錯,調(diào)用下應用層的doSpeedLimitCheck服務即可,調(diào)用方完全不需要關心里面的業(yè)務邏輯,業(yè)務隔離。

單元測試執(zhí)行結果:

結語

關于領域驅動設計的分層架構:

其實,我個人覺得 DDD 的首要核心是確定業(yè)務的邊界(領域邊界),接著把各個邊界之間的關系整理清晰(上下文映射圖),然后再針對具體的邊界具體設計(戰(zhàn)術設計),最后就是工作流程的處理,就像上面圖中所表達一樣。

好,改造完了,又可以和產(chǎn)品經(jīng)理一起愉快的玩耍了。

作者:岳中新

審核編輯:符乾江
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
收藏 人收藏

    評論

    相關推薦

    聯(lián)網(wǎng)學習路線來啦!

    聯(lián)網(wǎng)學習路線來啦! 聯(lián)網(wǎng)方向作為目前一個熱門的技術發(fā)展方向,有大量的人才需求,小白的學習入門路線推薦以下步驟。 1.了解
    發(fā)表于 11-11 16:03

    全面講解聯(lián)網(wǎng)應用的設計技巧和方法

    本文要點了解不同的聯(lián)網(wǎng)領域和應用了解聯(lián)網(wǎng)設計的基本組成部分
    的頭像 發(fā)表于 11-02 08:04 ?620次閱讀
    全面講解<b class='flag-5'>物</b><b class='flag-5'>聯(lián)網(wǎng)</b>應用的設計技巧和方法

    聯(lián)網(wǎng)nb水表的應用領域有哪些?

    的主要應用領域。一、居民用水管理-家庭用戶:在居民小區(qū)中,聯(lián)網(wǎng)NB水表可以實現(xiàn)自動抄表,減少人工成本,提高抄表效率。-實時監(jiān)控:用戶可以通過手機應用程序隨時查看用水
    的頭像 發(fā)表于 10-09 17:54 ?298次閱讀
    <b class='flag-5'>物</b><b class='flag-5'>聯(lián)網(wǎng)</b>nb水表的<b class='flag-5'>應用領域</b>有哪些?

    光耦的應用領域

    光耦的應用領域 光耦是一種特殊的電子組件,具有很多特性。它可以用來取代傳統(tǒng)的電阻器,如電池、電感器和電容器等。在半導體工業(yè)中,使用光耦能夠減少工藝步驟,提高生產(chǎn)效率。 一.光耦的特性 1.隔離性好
    發(fā)表于 08-26 16:59

    什么是聯(lián)網(wǎng)技術?

    構成了完整的聯(lián)網(wǎng)技術體系。 聯(lián)網(wǎng)技術具有重要的意義,它突破了傳統(tǒng)思維,將物理設施和 IT 設施整合為統(tǒng)一的“整合網(wǎng)絡”,對經(jīng)濟管理、生產(chǎn)運行、社會管理乃至個人生活都產(chǎn)生深遠影響。
    發(fā)表于 08-19 14:08

    【新品上線】星閃派聯(lián)網(wǎng)開發(fā)套件免費試用

    星閃派聯(lián)網(wǎng)開發(fā)套件具有豐富的通信接口、開放性、模塊化、集成化等多個亮點;可基于星閃派聯(lián)網(wǎng)開發(fā)套件開發(fā)實現(xiàn)設備的遠程監(jiān)控和控制、數(shù)據(jù)的實時采集和分析、預測性維護、人體出沒檢測等功能。
    發(fā)表于 08-16 09:34

    【xG24 Matter開發(fā)套件試用體驗】聯(lián)網(wǎng)密碼柜之驅動矩陣鍵盤和OLED顯示器

    簡介 筆者在提交試用申請時填寫的項目計劃是制作一個聯(lián)網(wǎng)密碼柜,本階段的主要目標是驅動矩陣鍵盤和Oled顯示器,為后續(xù)完整的聯(lián)網(wǎng)密碼柜項目
    發(fā)表于 08-04 23:04

    電流驅動型器件的應用領域

    電子器件。它們通常具有較高的開關速度、較低的導通損耗和較高的可靠性。電流驅動型器件在電力電子領域中被廣泛應用于電機驅動、電源管理、電力傳輸和能量存儲等領域。 二、電流
    的頭像 發(fā)表于 07-17 15:44 ?1489次閱讀

    嵌入式熱門領域有哪些?

    嵌入式熱門領域有哪些? 當前,嵌入式行業(yè)正處于快速發(fā)展階段,并在多個領域呈現(xiàn)出蓬勃的熱度。 聯(lián)網(wǎng)
    發(fā)表于 07-16 09:23

    聯(lián)網(wǎng)技術在軍事領域的應用有哪些

    智慧華盛恒輝聯(lián)網(wǎng)技術在軍事領域的應用廣泛而深入,以下是清晰分點表示和歸納的聯(lián)網(wǎng)技術在軍事領域
    的頭像 發(fā)表于 06-23 10:35 ?1745次閱讀

    工業(yè)聯(lián)網(wǎng)應用領域有多少

    近幾年,工業(yè)聯(lián)網(wǎng)解決方案因為工作效率高、可以降低成本,被越來越多的工業(yè)企業(yè)所使用。正以其獨特的優(yōu)勢推動著工業(yè)生產(chǎn)的智能化、高效化轉型。隨著5G、大數(shù)據(jù)、云計算等技術的快速發(fā)展,工業(yè)聯(lián)網(wǎng)
    的頭像 發(fā)表于 05-31 17:00 ?661次閱讀

    工業(yè)聯(lián)網(wǎng)平臺在智慧水務領域的智能應用

    隨著科技的不斷發(fā)展,工業(yè)聯(lián)網(wǎng)平臺在各個領域的應用越來越廣泛,其中智慧水務領域更是得到了大力的推廣與應用,對于企業(yè)提升運營效率、降低成本、優(yōu)化管理等方面具有重要作用。數(shù)之能推出的工業(yè)
    的頭像 發(fā)表于 03-13 13:44 ?341次閱讀
    工業(yè)<b class='flag-5'>物</b><b class='flag-5'>聯(lián)網(wǎng)</b>平臺在智慧水務<b class='flag-5'>領域</b>的智能應用

    薄膜開關有哪些應用領域?

    薄膜開關有哪些應用領域
    的頭像 發(fā)表于 03-06 15:01 ?963次閱讀

    聯(lián)網(wǎng)IOT芯片是什么?聯(lián)網(wǎng)芯片的作用 聯(lián)網(wǎng)芯片的應用領域

    聯(lián)網(wǎng)IOT芯片是什么?聯(lián)網(wǎng)芯片的作用 聯(lián)網(wǎng)芯片的應用領
    的頭像 發(fā)表于 02-01 11:38 ?3883次閱讀

    什么是窄帶聯(lián)網(wǎng)(NB-IoT)?應用領域有哪些?

    什么是窄帶聯(lián)網(wǎng)(NB-IoT)?應用領域有哪些? 窄帶聯(lián)網(wǎng)(NB-IoT)是一種低功耗、廣覆蓋、低成本的無線通信技術,專為
    的頭像 發(fā)表于 02-01 10:13 ?4320次閱讀