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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/31 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 物联网 云端java架构_基于java的物联网架构实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基于java的多設備類型物聯網架構實現

前言:19年11月開始從 【金融】行業轉 【物聯網】,路途坎坷,一個人摸索前進,不過也學到了很多新的東西,交了很多好朋友,在此感謝各位!

以下是一些經驗分享,希望能幫到有需要的朋友。

1、架構思路

考慮了很久打算用springboot + mysql 去實現,因為熟悉這個框架,而且能減輕70%的機械性開發工作量,以后改springcloud也方便(注意邏輯實現不然工作量很大)。

物聯網和互聯網可以說是有共同點的,但是也有很多的不一樣。

先說協議,互聯網很多都是https或者http,但是物聯網這塊就不僅僅是這兩種協議,會有UDP協議,TCP協議。

上干貨:

環境:java+mysql+redis+rabbitMQ+Mqtt

圖解:

這個是比較簡單的邏輯圖,里面的復雜邏輯還是不能說的。

這里面涉及到幾個問題,好多物聯網設備終端會有心跳,事件數據上來,怎么保證并發?入庫的數據唯一?多種設備的數據上行,怎么存儲?怎么管理?有多個第三方服務怎么分發數據?

咱們一點點說:

1、根據協議解析數據

終端上行的數據有433協議,有藍牙的,有zigbee的,還有tcp、http的,還分1代、2代、3代等協議。我用了一個笨方法:根據協議的不同解析,存入不同的表

我整了個枚舉類來存放不同的類型,在解析方法里面通過唯一性的一段上行數據去區分(為什么這么做?以為上行數據是16進制的)

HH0F22AEBB8200011100020001BB23AABB8637

“HH0F”就是A協議的特有字符,那這個就入A協議庫。

A協議是A設備專用的,那建表就是這樣的

A_tag —————— 設備表

A_data ——————設備數據表

A_gateway ——————網關表

那么問題來了,要是10種設備不得30個表了?

做過物聯網的都知道,不同類型的設備可能帶的屬性都是不一樣的,有的設備可能就3個:

電量、包序、特征值

但是有的設備可能就不止了,比方說:

電量、包序、心跳、呼吸、體溫、動態值。。。。

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

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

2、怎么保證數據不會重復并快速入庫

上圖我采用了兩個服務,一個接受服務,一個處理服務,具體處理方法:

接受服務將受到的數據轉base64編碼后直接發到消息隊列(rabbitMQ),處理服務監聽rabbitMQ消息,走解析服務。就是這么簡單!

但是,有一點,rabbitMQ要開啟ack模式!!!而且可以用負載來做這步!

問題二:設備一多,并發問題就來了,怎么搞?

Semaphore 這可是個好東西

如果來一條數據就insert,哪個數據庫都受不了,后來采用批量方式插入:

// ----------------------數據批量入庫開始-------------------------

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("=================入庫數據條數:" + countSend);

}

// ----------------------數據批量入庫結束-------------------------

我做過測試,這樣的方式遠超2000條/秒,有眼尖的朋友看出來了:

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

暫時就到這兒,后續想到我再補充!

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。