物联网 云端java架构_基于java的物联网架构实现
基于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)題。
- 上一篇: 【百度地图API】如何获取行政区域的边界
- 下一篇: 微信小程序云开发用户身份登录_微信小程序