日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

物联网 云端java架构_基于java的物联网架构实现

發(fā)布時(shí)間:2023/12/31 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 物联网 云端java架构_基于java的物联网架构实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

基于java的多設(shè)備類型物聯(lián)網(wǎng)架構(gòu)實(shí)現(xiàn)

前言:19年11月開始從 【金融】行業(yè)轉(zhuǎn) 【物聯(lián)網(wǎng)】,路途坎坷,一個(gè)人摸索前進(jìn),不過(guò)也學(xué)到了很多新的東西,交了很多好朋友,在此感謝各位!

以下是一些經(jīng)驗(yàn)分享,希望能幫到有需要的朋友。

1、架構(gòu)思路

考慮了很久打算用springboot + mysql 去實(shí)現(xiàn),因?yàn)槭煜み@個(gè)框架,而且能減輕70%的機(jī)械性開發(fā)工作量,以后改springcloud也方便(注意邏輯實(shí)現(xiàn)不然工作量很大)。

物聯(lián)網(wǎng)和互聯(lián)網(wǎng)可以說(shuō)是有共同點(diǎn)的,但是也有很多的不一樣。

先說(shuō)協(xié)議,互聯(lián)網(wǎng)很多都是https或者h(yuǎn)ttp,但是物聯(lián)網(wǎng)這塊就不僅僅是這兩種協(xié)議,會(huì)有UDP協(xié)議,TCP協(xié)議。

上干貨:

環(huán)境:java+mysql+redis+rabbitMQ+Mqtt

圖解:

這個(gè)是比較簡(jiǎn)單的邏輯圖,里面的復(fù)雜邏輯還是不能說(shuō)的。

這里面涉及到幾個(gè)問(wèn)題,好多物聯(lián)網(wǎng)設(shè)備終端會(huì)有心跳,事件數(shù)據(jù)上來(lái),怎么保證并發(fā)?入庫(kù)的數(shù)據(jù)唯一?多種設(shè)備的數(shù)據(jù)上行,怎么存儲(chǔ)?怎么管理?有多個(gè)第三方服務(wù)怎么分發(fā)數(shù)據(jù)?

咱們一點(diǎn)點(diǎn)說(shuō):

1、根據(jù)協(xié)議解析數(shù)據(jù)

終端上行的數(shù)據(jù)有433協(xié)議,有藍(lán)牙的,有zigbee的,還有tcp、http的,還分1代、2代、3代等協(xié)議。我用了一個(gè)笨方法:根據(jù)協(xié)議的不同解析,存入不同的表

我整了個(gè)枚舉類來(lái)存放不同的類型,在解析方法里面通過(guò)唯一性的一段上行數(shù)據(jù)去區(qū)分(為什么這么做?以為上行數(shù)據(jù)是16進(jìn)制的)

HH0F22AEBB8200011100020001BB23AABB8637

“HH0F”就是A協(xié)議的特有字符,那這個(gè)就入A協(xié)議庫(kù)。

A協(xié)議是A設(shè)備專用的,那建表就是這樣的

A_tag —————— 設(shè)備表

A_data ——————設(shè)備數(shù)據(jù)表

A_gateway ——————網(wǎng)關(guān)表

那么問(wèn)題來(lái)了,要是10種設(shè)備不得30個(gè)表了?

做過(guò)物聯(lián)網(wǎng)的都知道,不同類型的設(shè)備可能帶的屬性都是不一樣的,有的設(shè)備可能就3個(gè):

電量、包序、特征值

但是有的設(shè)備可能就不止了,比方說(shuō):

電量、包序、心跳、呼吸、體溫、動(dòng)態(tài)值。。。。

data表中數(shù)據(jù)不得爆掉?——我深思熟慮也只是想到通用字段存儲(chǔ),data1~data20

多設(shè)備類型的暫時(shí)解決了,后面怎么具體操作呢?

2、怎么保證數(shù)據(jù)不會(huì)重復(fù)并快速入庫(kù)

上圖我采用了兩個(gè)服務(wù),一個(gè)接受服務(wù),一個(gè)處理服務(wù),具體處理方法:

接受服務(wù)將受到的數(shù)據(jù)轉(zhuǎn)base64編碼后直接發(fā)到消息隊(duì)列(rabbitMQ),處理服務(wù)監(jiān)聽(tīng)rabbitMQ消息,走解析服務(wù)。就是這么簡(jiǎn)單!

但是,有一點(diǎn),rabbitMQ要開啟ack模式!!!而且可以用負(fù)載來(lái)做這步!

問(wèn)題二:設(shè)備一多,并發(fā)問(wèn)題就來(lái)了,怎么搞?

Semaphore 這可是個(gè)好東西

如果來(lái)一條數(shù)據(jù)就insert,哪個(gè)數(shù)據(jù)庫(kù)都受不了,后來(lái)采用批量方式插入:

// ----------------------數(shù)據(jù)批量入庫(kù)開始-------------------------

private static ListlistNnObjectSaveDO = new ArrayList();

private static Long startTimeNnData = 0L;

//private static int countSend = 0;

private static Semaphore semaphoreNnData = new Semaphore(1);

@Override

public void saveDO(NnData nnData) {

try {

semaphoreNnData.acquire();

if (startTimeNnData == 0L) {

startTimeNnData = System.currentTimeMillis();

}

listNnObjectSaveDO.add(nnData);

if (System.currentTimeMillis() - startTimeNnData > 2000) {

ListlistSaveDOOne = new ArrayList();

listSaveDOOne.addAll(listNnObjectSaveDO);

asyncInsertBatch(listSaveDOOne);

listNnObjectSaveDO.clear();

startTimeNnData = 0L;

}

} catch (Exception e) {

e.printStackTrace();

} finally {

semaphoreNnData.release();

}

}

@Async

private void asyncInsertBatch(Listlist) {

this.insertBatch(list);

//countSend = countSend + list.size();

//System.out.println("=================入庫(kù)數(shù)據(jù)條數(shù):" + countSend);

}

// ----------------------數(shù)據(jù)批量入庫(kù)結(jié)束-------------------------

我做過(guò)測(cè)試,這樣的方式遠(yuǎn)超2000條/秒,有眼尖的朋友看出來(lái)了:

System.currentTimeMillis() - startTimeNnData > 2000 //2秒批量入庫(kù)一次

暫時(shí)就到這兒,后續(xù)想到我再補(bǔ)充!

總結(jié)

以上是生活随笔為你收集整理的物联网 云端java架构_基于java的物联网架构实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。