由于公司是做自動(dòng)售賣機(jī)系統(tǒng)的,所以最近在做Java的過程中接觸到了后臺(tái)與機(jī)臺(tái)端的一系列的通訊,想記錄下自己的一點(diǎn)心得和想法,拋磚引玉,有相關(guān)技術(shù)的牛人還請(qǐng)多多指教。
10年積累的網(wǎng)站設(shè)計(jì)制作、網(wǎng)站制作經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先做網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有德惠免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
首先我先介紹一下DTU這個(gè)概念,DTU是專門用于將串口數(shù)據(jù)轉(zhuǎn)換為IP數(shù)據(jù)或?qū)P數(shù)據(jù)轉(zhuǎn)換為串口數(shù)據(jù)通過無線通信網(wǎng)絡(luò)進(jìn)行傳送的無線終端設(shè)備,可能這個(gè)概念有點(diǎn)籠統(tǒng),我理解的是將機(jī)器端的指令通過DTU轉(zhuǎn)化為相應(yīng)的數(shù)據(jù)發(fā)送給服務(wù)器端,相應(yīng)的后臺(tái)發(fā)送相應(yīng)信息,DTU負(fù)責(zé)接收轉(zhuǎn)化并傳輸?shù)綑C(jī)臺(tái)端進(jìn)行處理。
介紹了DTU的概念之后,接下來來說一下我們后臺(tái)與機(jī)器端的通訊的相關(guān)流程。
舉個(gè)例子來說,后臺(tái)想要發(fā)送一個(gè)指令給機(jī)臺(tái)端讓機(jī)臺(tái)端出貨。
1.首先,后臺(tái)與機(jī)臺(tái)端開發(fā)人員商定好一個(gè)通訊規(guī)則并且按照DTU協(xié)議封裝,然后后臺(tái)發(fā)送消息將其遞交給TCP服務(wù)。
2.將消息發(fā)送到TCP服務(wù)后,TCP封裝數(shù)據(jù)。
3.TCP服務(wù)將封裝好的數(shù)據(jù)推送給DTU。
4.DTU再根據(jù)DTU協(xié)議來解析數(shù)據(jù)。
5.設(shè)備接收到指令,找到相對(duì)應(yīng)的指令,然后執(zhí)行相應(yīng)的操作。
在設(shè)備收到相應(yīng)消息之后這整個(gè)流程并沒有結(jié)束,機(jī)臺(tái)端還要向后臺(tái)發(fā)送一個(gè)反饋,反饋是否出貨成功的指令。具體流程如下:
1.設(shè)備返回響應(yīng)結(jié)果給DTU。
2.DTU根據(jù)相應(yīng)協(xié)議封裝數(shù)據(jù)信息。
3.DTU將封裝好的數(shù)據(jù)信息發(fā)送到TCP服務(wù)。
4.TCP服務(wù)收到反饋信息后,然后根據(jù)協(xié)議解析相應(yīng)數(shù)據(jù)。
5.最后將解析后的數(shù)據(jù)發(fā)送給后臺(tái)。
可以參照下圖進(jìn)行理解。
后臺(tái)與機(jī)臺(tái)端的通訊流程大致就是這樣,畢竟初學(xué)者,可能有一些地方理解的不到位,望大家海涵。
一切安好,便是晴天。
Tank
樓主說的意思是不是要用JAVA實(shí)現(xiàn)一個(gè)開關(guān)門的硬件操作,如果是這樣你應(yīng)該知道java雖然是一門高級(jí)語言,但是他是基于虛擬機(jī)運(yùn)行 是不能直接操作硬件的,對(duì)于操作底層的硬件一般都是通過C/C++實(shí)現(xiàn)。但是java可以通過 java native interface---JNI來實(shí)現(xiàn),用java通過接口調(diào)用C/C++完成。前提是你要會(huì)C/C++
先不說公司的保密協(xié)議
一個(gè)項(xiàng)目的代碼能在這里全貼出來,還給你講解的清楚?
、不過整個(gè)取款機(jī)流程是很簡(jiǎn)單的,就是用戶進(jìn)行不同的操作,
java 調(diào)用 JNI驅(qū)動(dòng)硬件執(zhí)行相應(yīng)的操作,關(guān)鍵就是組織各種類型的報(bào)文,
通過DTU發(fā)送到銀聯(lián)那邊,比如說支付報(bào)文,沖正報(bào)文,日結(jié)報(bào)文……
這些報(bào)文的組織一般java 也只管傳入JNI 中C++組裝好以后再調(diào)用 DTU驅(qū)動(dòng)發(fā)送
java 這一塊就是處理一些邏輯或者頁面流轉(zhuǎn)之類的、
代碼是不可能貼的,保密協(xié)議還是有一定的約束力的
MyView myView = new MyView();
myView.anyView = this;
this.remove(this.xxPanel);
this.add(myView.getPanel());
this.repaint();
串口是數(shù)據(jù)透?jìng)鹘涌?,一般使用串口調(diào)試軟件的默認(rèn) 8n11模式就可以,高能的來了:第一點(diǎn):modbus就是一次用串口連續(xù)發(fā)多個(gè)字節(jié)!?。。?!就這么簡(jiǎn)單?。。。?/p>
如果想在深入一些,那我再告訴你,第二點(diǎn):連續(xù)發(fā)出的多個(gè)字節(jié)是按順序排好的就可以了
如果想要完成一個(gè)雙向通信,那你還要再了解一點(diǎn)就是第三點(diǎn):發(fā)多少個(gè)字節(jié)?字節(jié)順序如何排列?
本篇只講主站讀,子站發(fā),看明白之后,再點(diǎn)擊我的用戶名,查看主站寫,子站接的經(jīng)驗(yàn)
先說一下DTU RTU區(qū)別:modbus dtu是數(shù)字?jǐn)?shù)據(jù)傳輸協(xié)議,gsm ,gps可以用,但是如果需要采集模擬量,比如我要詢問gsm設(shè)備的電池電壓,那就要用rtu,,他可以采集模擬量信息,其實(shí)對(duì)于自己做產(chǎn)品,你都用rtu也可以。也就是說就這點(diǎn)兒區(qū)別
知道了dtu rtu的區(qū)別,可以嘗試分析和編寫通信協(xié)議了,不需要了解太多,你只需要知道上面提到的第三點(diǎn)就可以了!
先說第三點(diǎn),從機(jī)應(yīng)該發(fā)多少數(shù)據(jù)給主機(jī)?答案是:主機(jī)請(qǐng)求N個(gè)寄存器,從站就發(fā)2N個(gè)字節(jié)(特別注意,一個(gè)寄存器是16位的,而且這個(gè)數(shù)據(jù)長(zhǎng)度是不算報(bào)文頭,不算crc,不算功能碼的,下面有圖說明)下面看一下真實(shí)的通信情況此處主機(jī)請(qǐng)求一個(gè)寄存器,主機(jī)發(fā)出10 03 00 00 00 02 c7 4a?注意數(shù)據(jù)高位在前,crc是低位在前
這是一條完整的從機(jī)正常相應(yīng)命令
返回一個(gè)寄存器的數(shù)據(jù)
好了,通信協(xié)議,就這樣的,你可以使用modscan和usb轉(zhuǎn)串口設(shè)備測(cè)試一下
modscan設(shè)置如下
現(xiàn)在開始實(shí)測(cè)一下,先確定電腦至少有兩個(gè)串口,一個(gè)串口作為modscan的發(fā)送,一個(gè)串口用串口調(diào)試助手發(fā)數(shù)據(jù)
波特率都一樣就可以,其他默認(rèn)
然后modscan 點(diǎn)擊連接后,自動(dòng)下發(fā)數(shù)據(jù)
串口調(diào)試軟件,收到數(shù)據(jù)后,點(diǎn)一下發(fā)送就可以了,可以觀看到modscan已經(jīng)成功收到并顯示數(shù)據(jù)了
END
經(jīng)驗(yàn)內(nèi)容僅供參考,如果您需解決具體問題(尤其法律、醫(yī)學(xué)等領(lǐng)域),建議您詳細(xì)咨詢相關(guān)領(lǐng)域?qū)I(yè)人士