物联网 云端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的物联网架构实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【百度地图API】如何获取行政区域的边界
- 下一篇: 微信小程序云开发用户身份登录_微信小程序