任姝樂,李昱磊,楊 城,張志鑫,衛(wèi)丹丹,劉金鳳,荀亞玲,王 曉
(1.太原科技大學 計算機科學與技術學院,太原 030024;2.太原科技大學 華科學院,太原 030024)
隨著社會信息化的飛快發(fā)展,傳感器的發(fā)展也趨于微型化和智能化?;趥鹘y(tǒng)的電子和集成技術的傳感器在信息的獲取、傳輸、處理和存儲等方面已經無法滿足要求。因光子沒有靜止質量、消耗能量低、散發(fā)熱量小、運算速度快,信息存儲容量大等優(yōu)點,研究者將眾多的光子器件(如光傳感器、光濾波器、光開關、光調制器及光放大器)集成在微小的單片機上,以滿足信息技術發(fā)展的需求。但是,如何引導光子的傳輸、局域等問題是研究光子技術中非常重要的問題。人工電磁微結構材料因其特殊的物理性質,能有效的控制電磁波在其結構中傳播,為傳感器技術提供很好的解決方案[1-4]。基于人工微結構光子石墨烯特殊的光路調控機制,前期設計了光子石墨烯結構安裝于微波或紅外傳感器,便可實現(xiàn)平面內的多方位探測[5-6]。文章在已有硬件的基礎上完成了相關軟件系統(tǒng)的設計。
1 系統(tǒng)總體設計方案
本文所設計的系統(tǒng)工作流程為:將多方位探測裝置在六個方位的探測結果經過處理,通過ZigBee將數(shù)據發(fā)送給協(xié)調器,使得用戶可以通過PC、手機、平板電腦等設備訪問本地服務器,對系統(tǒng)進行遠程控制,使系統(tǒng)不只局限于局域網內[7-9]??傮w框架如圖1所示。

圖1 系統(tǒng)總體設計框圖Fig.1 The overall design block diagram of system

圖2 Zstack軟件流程圖Fig.2 Zstack software flow chart
2 軟件設計
整個Zstack的主要工作流程如圖2所示。
2.1 Web端軟件設計
Web部分的設計包括前端與后臺的設計,前端包括靜態(tài)頁面與動態(tài)頁面兩個部分,前端部分的程序流程圖如圖3所示。

圖3 前端部分程序流程圖Fig.3 The flow chart of the front-end
2.1.1 Web前端靜態(tài)頁面設計
靜態(tài)頁面共設計了三個功能模塊,包括串口選擇模塊、對射傳感器信息展示模塊以及用于串口數(shù)據展示的日志模塊。
(1)串口選擇模塊
串口選擇模塊包括協(xié)調器的串口選擇、聲光報警器的串口選擇和波特率的選擇。該模塊使用HTML的表單標簽進行實現(xiàn)。
(2)對射傳感器信息展示模塊
對射傳感器信息展示模塊的設計方案是使用每個對射傳感器占用一行,表明傳感器類型與編號,使用背景色區(qū)分是否檢測到障礙物,如果檢測到則背景色為紅色表示警告,如果無障礙物則背景色為綠色表示安全。
該模塊的設計方案是采用實時刷新的方式,不斷使用新的數(shù)據去覆蓋舊的數(shù)據,保證數(shù)據的時效性。
核心代碼如下:
if (data[i].type == '光子石墨烯紅外對射傳感器') {
if (data[i].state == '有障礙') {
zigBeeCard = zigBeeCard
+ ""
+ data[i].type + data[i].typeId + "";
} else if (data[i].state == '無障礙') {
zigBeeCard = zigBeeCard
+ ""
+ data[i].type + data[i].typeId + "";}}
$("#ZigBeeCard").html(zigBeeCard);
(3)日志模塊
日志模塊的設計方案為使用HTML的表單模塊進行實現(xiàn),表頭包括日志編號、傳感器類型、傳感器同類型編號、傳感器信息以及日志記錄的時間,核心代碼如下:
在日志展示模塊中將其設計成固定高度的表格,實時生成最新日志,不覆蓋原有日志,并保證表單滾動條總是處于底部,用來展示的最新日志內容。
2.1.2 Web前端動態(tài)頁面設計
動態(tài)頁面使用Ajax進行實現(xiàn),共有4個方法,包括提交串口選擇模塊信息并打開串口的openPort方法,用于關閉所有已經打開的串口的closePort方法,用于向后臺發(fā)送請求之后從后臺接收串口數(shù)據的readFromPort方法,還有用于檢測后臺是否已經打開串口的checkConnect方法,前端頁面所使用的重要函數(shù)的核心代碼如下:
(1)openport方法
function openPort() {
$.post("openPort",$("#commForm").serialize(),function(data) {
if (data == "success") {
//alert(data);
$("#openPortBtn").attr("disabled","disabled");
$("#closePortBtn").removeAttr("disabled");
readFromPort();} else {alert(data);});}
(2)closePort方法
function closePort() {
$.post("closePort",function(data) {
clearInterval(interval);
$("#closePortBtn").attr("disabled","disabled");
$("#openPortBtn").removeAttr("disabled");});
(3)readFromPort方法
function readFromPort() {
interval = setInterval(function() {
$.post("readFromPort",function(data) {
data = JSON.parse(data);
if (data != null) {
templateShow(data);}});},1000);}
(4)checkConnect方法
function checkConnect() {
$.post("checkConnect",function(data) {
//alert(data);
if (data == "on") {
$("#openPortBtn").attr("disabled","disabled");
$("#closePortBtn").removeAttr("disabled");}
2.2 后臺設計
后臺部分的設計包括串口通信模塊的底層實現(xiàn)以及處理頁面請求與相應的控制層模塊,后臺部分的程序流程圖如4所示。

圖4 后臺部分程序流程圖Fig.4 The flow chart of the back-end
2.2.1 串口通信
串口通信通過使用Java語言調用RXTXcomm.jar進行實現(xiàn),包括用于查找所有可用端口的findPort方法,用于將讀取到的字節(jié)數(shù)據轉換成十六進制字符串的encode方法。
(1)encode方法:
private static String hexString = "0123456789 ABCDEF";
public static String encode(byte[]str) {
if (null != str) {
// 根據默認編碼獲取字節(jié)數(shù)組
byte[]bytes = str;
StringBuilder sb = new StringBuilder(bytes. length * 2);
// 將字節(jié)數(shù)組中每個字節(jié)拆解成2位16進制整數(shù)
for (int i = 0;i < bytes.length;i++) {
sb.append(hexString.charAt((bytes[i]& 0xf0) >> 4));
sb.append(hexString.charAt((bytes[i]& 0x0f) >> 0));}}
(2)findPort方法:
// 查找所有可用端口
@SuppressWarnings("unchecked")
public static final ArrayList findPort() {
Enumeration portList = CommPortIdentifier.getPortIdentifiers();
ArrayList portNameList = new ArrayList();
while (portList.hasMoreElements()) {
String portName = portList.nextElement().getName();
portNameList.add(portName);//生成可用端口號字符串列表
}
2.2.2 控制層
用于處理頁面請求的控制層分為兩個模塊,一個是用于處理訪問首頁請求的HomeController模塊,一個是用于處理Ajax請求的SerialController模塊。
(1)HomeController模塊
@RequestMapping(value = "/",method = RequestMethod.GET)
public String index(Model model) {
ListportNameList=SerialTool.findPort();
model.addAttribute("portNameList",portNameList);
return "index";}
(2)SerialController模塊
用于從串口讀取數(shù)據的數(shù)據解析模塊,通過截取字符串的方式對串口數(shù)據進行解析,并將其轉換為可讀性更高的內容,具體設計如下:
if (null !=dataZigBee) {
for(int i=0;iid=dataZigBee.substring(i* 52+28,i* 52+28+4);
type=dataZigBee.substring(i*52+28,i*52+28+2);
typeId=dataZigBee.substring(i*52+28+2,i*52+28+4);
state=dataZigBee.substring(i*52+28+6,i*52+28+18);
sensorList.add(new Sensor(id,type,typeId,state));}}
if (null != dataAlarm) {
for (int i = 0;iid=dataAlarm.substring(i*28+4,i*28+8);
type=dataAlarm.substring(i*28+4,i*28+6);
typeId=dataAlarm.substring(i*28+6,i*28+8);
state=dataAlarm.substring(i*28+10,i*28+22);
sensorList.add(new Sensor(id,type,typeId,state));}}
for (Sensor sensor:sensorList) {
if (sensor.getType().equals("03")) {
sensor.setType("光子石墨烯紅外對射傳感器");
if (sensor.getState().equals("000000000000")) {
sensor.setState("無障礙");
} else if (sensor.getState().equals("000000000001")) {
sensor.setState("有障礙");
alarmNum++;}
} else if (sensor.getType().equals("0E")) {
sensor.setType("聲光報警傳感器");
if (sensor.getState().equals("000000000000")) {
sensor.setState("未開啟");
} else if (sensor.getState().equals("000000000001")) {
sensor.setState("已開啟");}}}
3 系統(tǒng)功能集成與測試
在完成了軟硬件的結合之后,我們對系統(tǒng)進行了集成測試,試驗環(huán)境如下:
硬件:操作系統(tǒng)Linux的PC機一臺,多方位探測傳感器一個,障礙物若干。
軟件:Java、Xshell開發(fā)環(huán)境,Eclipse、谷歌瀏覽器、AR Embedded Workbench、 Serial Tool、Zstack等開發(fā)調試工具。
燒寫完畢后將對射傳感器分別與采集端的串口連接,使采集端可以獲取傳感器獲取到的數(shù)據。打開PC端的STS工具,運行所設計的Web端程序,檢測能否成功的從后臺獲取數(shù)據并在前端網頁正確的顯示,包括六個方位的對射傳感器中每個接收端是否檢測到障礙物,每個接收端的編號用來獨特的標識所監(jiān)測的方位。聲光報警傳感器的狀態(tài)是開啟還是關閉用來證明后臺串口數(shù)據的發(fā)送是否正常以及準確,保證能夠實時接收串口發(fā)送來的數(shù)據。
左側選擇ZigBee協(xié)調器與報警傳感器所連接的串口部分,可以正確顯示PC端中所有可用串口列表,點擊“Open”按鈕后通過Ajax異步提交表單將要打開的PC端相應串口的COM號發(fā)送到服務器后臺,后臺執(zhí)行打開串口的相應程序,串口打開成功后調用Ajax異步請求后臺返回從串口接收的數(shù)據,前端頁面將接收到的JSON字符串正確解析并進行了數(shù)據的展示。

圖5 系統(tǒng)測試結果1Fig.5 The system test results 1

圖6 系統(tǒng)測試結果2Fig.6 The system test results 2

圖7 系統(tǒng)測試結果3Fig.7 The system test results 3
圖5為六個方位均有障礙時的探測結果,日志部分準確記錄了傳感器的類型、同類型傳感器的id、是否有障礙物的狀態(tài)信息以及探測的具體時間,同時ZigBeeMonitor模塊也通過顏色標識顯示出了傳感器的探測狀態(tài)。圖6和圖7則分別是個別方位有障礙物和沒有障礙物時的測試結果,均正確的顯示了紅外探測傳感器的類型、ID、探測時間以及結果等內容。
4 分析總結
系統(tǒng)測試結果表明,每個傳感器的接收端均能夠正常地感應有無障礙物,能夠將獲取到的數(shù)據經過采集端與協(xié)調器之間的ZigBee無線網絡進行準確的傳輸,協(xié)調器能夠正確處理六個采集端發(fā)來的數(shù)據,處理后的數(shù)據通過串口通信能夠正常的在PC端進行獲取與解析。同時服務器能夠正常的掃描所有可用串口,能夠正常的打開與關閉所選擇的串口,能夠準確的與選中的串口進行數(shù)據通信。聲光報警傳感器能夠通過串口連接正確的發(fā)送傳感器的狀態(tài)信息,執(zhí)行從串口發(fā)來的數(shù)據中所需要執(zhí)行的命令。
PC端網絡連接正常的情況下,本地服務器運轉正常,本地服務器保持開啟狀態(tài)后,即可保證域名與本地外網IP綁定以便DNS服務器能夠正常解析,保證在接收的來自ZigBee協(xié)調器的數(shù)據后,能夠解析到檢測到障礙物的信息,隨后能夠立刻向聲光報警傳感器所連接的串口發(fā)送打開聲光報警的命令。在所有對射傳感器均未檢測到障礙物時或原來檢測到障礙物的那個對射傳感器接收端變更為未檢測到障礙物的情況下都能夠立刻向聲光報警傳感器所連接的串口發(fā)送關閉聲光報警的命令,聲光報警傳感器從串口接收到來自上位機所發(fā)出的打開或關閉聲光報警的命令后能夠立即響應命令并正確執(zhí)行。
通過測試與分析,該系統(tǒng)已經實現(xiàn)了預期基本的功能,可以在實踐中得到應用,接下來可以進一步實現(xiàn)檢測障礙物與發(fā)射端距離的需求,更加符合生產和生活的需求。
星子县|
伊宁市|
凌海市|
余姚市|
兴安盟|
根河市|
海原县|
红河县|
镇平县|
盐山县|
洞口县|
嘉鱼县|
嘉荫县|
德钦县|
肇源县|
防城港市|
靖州|
晋江市|
台前县|
钟山县|
镇康县|
昌都县|
长武县|
腾冲县|
保康县|
公安县|
蓝山县|
新蔡县|
安泽县|
关岭|
水富县|
怀宁县|
凌海市|
万盛区|
辉南县|
搜索|
庐江县|
德昌县|
连州市|
渭南市|
南宫市|