陳玉娥 任玉文 陳 可 黃文歡 宋鑫海 韓文龍
(蚌埠醫(yī)學(xué)院 安徽蚌埠 233030)
天氣預(yù)報(bào)不是特別準(zhǔn)確,有時候會有突如其來的雨;就算知道有雨也可能會忘記帶傘;避雨會浪費(fèi)寶貴的時間;買一把新的雨傘會導(dǎo)致家里的傘越來越多,會占地方,且出行總是帶傘也不是特別的方便。雖然酒店、商場等一些地方也提供愛心雨傘以供借用,但是用戶及時歸還到原處的限制條件,給人們帶來一定麻煩,還有些公民沒有道德規(guī)范和公共意識,隨意損壞或者不歸還,導(dǎo)致丟傘率高,不好管理。有了共享雨傘,隨時隨地人們都可以出行自如,不必時刻關(guān)注天氣,不必內(nèi)心糾結(jié)需不需要帶傘出門或者丟傘。
百度百科對共享雨傘的描述是這樣的:共享雨傘是指企業(yè)在地鐵站點(diǎn)、商業(yè)區(qū)、居民區(qū)、校園、酒店等提供雨傘的共享服務(wù),是共享經(jīng)濟(jì)的一種新形態(tài)。2017年初,國內(nèi)共享雨傘漸漸露出鋒芒,在廣州、深圳及江浙滬一帶開始試運(yùn)行。共享雨傘符合綠色出行、節(jié)省資源的環(huán)保理念,不過其商業(yè)市場目前還是處于初級和探索階段[1-2]。文章結(jié)合物聯(lián)網(wǎng)專業(yè)知識,設(shè)計(jì)了一個校園共享雨傘網(wǎng)上借還系統(tǒng),主要功能是實(shí)現(xiàn)校園教學(xué)樓、食堂、宿舍三個區(qū)域的公共雨傘共享,方便意外或惡劣天氣時未帶雨傘的情況。開發(fā)了“小蚌”共享雨傘APP,方便師生,開闊學(xué)生視野,提高學(xué)生創(chuàng)新意識,“小蚌”共享雨傘具有晴雨兩用功能,有雨則遮雨,夏季起到防曬防紫外線的作用。
物聯(lián)網(wǎng)是物物相聯(lián)的互聯(lián)網(wǎng),在系統(tǒng)中是把共享雨傘聯(lián)入網(wǎng)絡(luò)。依據(jù)物聯(lián)網(wǎng)三層架構(gòu),設(shè)計(jì)了共享雨傘的系統(tǒng)結(jié)構(gòu)圖[3],如圖1所示。

圖1 系統(tǒng)總體架構(gòu)圖
應(yīng)用層面向用戶,管理用戶和雨傘,用戶通過手機(jī)APP進(jìn)行注冊、登錄、申請開鎖取傘、還傘、繳費(fèi)、上報(bào)終端位置等等;網(wǎng)絡(luò)層是系統(tǒng)的核心,負(fù)責(zé)數(shù)據(jù)的傳輸,向客戶端發(fā)送登錄驗(yàn)證碼、開鎖指令、用傘相關(guān)提醒、天氣狀況等等信息;感知層是信息采集部分,用戶掃碼,獲取雨傘編號發(fā)給后臺服務(wù),如果滿足借傘條件就開始借傘。
軟件部分使用前端開發(fā)工具HBuilder設(shè)計(jì)了“小蚌”校園共享雨傘APP,使用簡單方便,服務(wù)器端的開發(fā)環(huán)境是Eclipse,開發(fā)語言是Java。整個系統(tǒng)采用B/S架構(gòu),實(shí)際部署Web服務(wù)器是Apache+Tomcat + 數(shù)據(jù)庫MySQL。端到端通信是C/S方式??蛻舳酸槍ndroid開發(fā)環(huán)境,目標(biāo)系統(tǒng)是Android 4.0以上,使用Java語言和js提供的Ajax異步請求技術(shù),請求后臺數(shù)據(jù)接口,解析后臺返回的json數(shù)據(jù)。手機(jī)端安裝完成打開“小蚌”APP,其主界面如圖2所示。

圖2 APP主界面
點(diǎn)擊圖2中①處可以打開用戶登錄界面,如圖3(a)所示,用戶輸入手機(jī)號,然后點(diǎn)擊“獲取驗(yàn)證碼”,可以收到類似這樣的信息“【小蚌】歡迎使用小蚌雨傘,您的驗(yàn)證碼為834903,10min內(nèi)有效,請盡快使用?!盇PP可使用阿里提供的接口實(shí)現(xiàn)發(fā)送手機(jī)驗(yàn)證碼進(jìn)行登錄系統(tǒng)的功能,免注冊,無須記憶密碼,方便快捷。部分主要代碼如下:
private static Map
private static final String product = "Dysmsapi";// 短信API產(chǎn)品名稱
private static final String domain = "dysmsapi.aliyuncs.com";// 短信API產(chǎn)品域名
private static final String accessKeyId = "LTAIw3zvXKJhMlZ7";
private static final String accessKeySecret = "eUKPy2NsCB4KUgafGQSeMIoyWbiRhU";
private static final SendSmsRequest request = new SendSmsRequest();
static {sendMap.put("15212653351", "123456");// 提供一個測試用手機(jī)號碼和驗(yàn)證碼
request.setMethod(MethodType.POST); //使用post提交組裝請求對象
request.setSignName("小蚌");//短信簽名 request.setTemplateCode("SMS_129757529");}//短信模板
將手機(jī)端收到的短信驗(yàn)證碼輸入到圖3(a)所示“驗(yàn)證碼”輸入框中,點(diǎn)擊“進(jìn)入”按鈕,即可進(jìn)入個人信息頁面,如圖3(b)所示。圖中顯示了用戶的賬戶余額,點(diǎn)擊“充值”按鈕進(jìn)入圖3(c),輸入充值的金額,點(diǎn)擊“確認(rèn)充值”,進(jìn)入圖3(d),可以看到“充值成功”的提示信息以及充值后的賬戶余額。


圖3 登錄及賬戶管理界面
用戶打開手機(jī)端的“小蚌”APP,將自動獲取用戶的地理位置并顯示在地圖上,如圖2中②處顯示“已為您切換到當(dāng)前位置”,從主界面的地圖上可以看到用戶所處的位置。首先注冊成為高德地圖開發(fā)者并申請一個秘鑰key,然后在前端頁面引入高德地圖JavaScript API,創(chuàng)建了地圖容器并給定中心坐標(biāo)和地圖級別等常見的地圖操作信息。部分代碼如下:
map.plugin('AMap.Geolocation', function () {
geolocation = new AMap.Geolocation({
enableHighAccuracy: false,//是否使用高精度定位
timeout: 1000, //超過10秒后停止定位
maximumAge: 0, //定位結(jié)果緩存0毫秒
convert: true, //自動偏移坐標(biāo),偏移后的坐標(biāo)為高德坐標(biāo)
showButton: true, //顯示定位按鈕
buttonPosition: 'LB', //定位按鈕??课恢?,默認(rèn):'LB',左下角
buttonOffset: new AMap.Pixel(10, 20),//定位按鈕與設(shè)置的??课恢玫钠屏?/p>
showMarker: true, //定位成功后在定位到的位置顯示點(diǎn)標(biāo)記
showCircle: true, //定位成功后用圓圈表示定位精度范圍
panToLocation: true, //定位成功后將定位到的位置作為地圖中心點(diǎn)
zoomToAccuracy:true}); //定位成功后調(diào)整地圖視野范圍
map.addControl(geolocation);
geolocation.getCurrentPosition();
AMap.event.addListener(geolocation, 'complete', function(position){
layer.alert('已為您切換到當(dāng)前位置', {icon: 1});
marker = new AMap.Marker({title: '你的位置'});
marker.setMap(map);});//返回定位信息
借助地圖定位功能,用戶在不同的地方打開APP,可以快速找到距離較近的共享雨傘的借還點(diǎn)。
點(diǎn)擊圖2中③所示的“解鎖”按鈕可以實(shí)現(xiàn)掃碼開鎖進(jìn)行借傘的功能。
首先通過Google的Zxing包下的工具類QRcode為每一把傘都生成一個帶小蚌雨傘Logo的二維碼圖片放入前端頁面Websocket下image文件夾中,如圖4(a)所示。


圖4 開鎖關(guān)鎖界面軟件模擬
Html5+提供了各種接口及規(guī)范,調(diào)用接口即可實(shí)現(xiàn)和硬件的交互,該項(xiàng)目APP中使用到的模塊Barcode提供打開攝像頭識別二維碼的功能。因此當(dāng)用戶點(diǎn)擊圖2中的“解鎖”按鈕時會打開手機(jī)的攝像頭。圖4(b)所示的二維碼代表一把雨傘,此時是上鎖的,手機(jī)掃描以后,后臺數(shù)據(jù)庫判斷此用戶是否滿足借傘條件:假如用戶已交押金,當(dāng)前沒有未支付的情況,并且傘也處于可借狀態(tài),就會執(zhí)行開鎖指令,如圖4(c)所示,可以看到樣式鎖被打開,完成用戶借傘操作。下面是開鎖功能的部分代碼:
public Return open(
@RequestParam(value="userId", defaultValue="", required=true) String userId,
@RequestParam(value="umbrellaId", defaultValue="", required=true)String umbrellaId) {
User user=userService.getUserInfoById(userId);
if(user == null){return new Return(false,"用戶不存在!");}
if(user.getState()==0) {return new Return(false,"未支付押金!");}
if(user.getState()==2) {return new Return(false,"正在使用中!");}
if(user.getState()==3) {return new Return(false,"有未支付的訂單");}
if(umbrellaService.getState(umbrellaId)==1){return new Return(false,"這把傘正在使用中!");}
boolean b= umbrellaService.insertOrder(userId,new Date(), umbrellaId);//插訂單
if(b) {
umbrellaService.changeUmbrellaState(1, umbrellaId);//修改雨傘狀態(tài)
userService.updateState(userId, 2);//修改用戶狀態(tài)
SocketUtil.unlock(); //解鎖
umbreallaWebSocket.sendMessage(new Gson().toJson(new Direction(Umbrella.UNLOCK, umbrellaId)));
return Return.OPERATE_SUCCESS;}
else {return Return.PARAM_WRONG;}}
如果上述借傘操作成功,再次進(jìn)入個人信息頁面,可以看到“解鎖”按鈕變成了“關(guān)鎖”按鈕如圖5(a)所示。點(diǎn)擊“關(guān)鎖”按鈕,進(jìn)入圖5(b)所示的支付界面,點(diǎn)擊“去支付”按鈕并支付相應(yīng)的租賃費(fèi)即可完成還傘操作。小蚌共享雨傘的押金設(shè)置為10元,每小時收費(fèi)0.5元(不足1小時按1小時計(jì)費(fèi))。以兩天為歸還期限,逾期后每天收取一定逾期費(fèi),直至押金扣完為止。支付完成,會返回到APP主頁面,再次進(jìn)行掃碼,“解鎖”功能又可以正常使用了。

圖5 關(guān)鎖和支付界面
關(guān)鎖功能部分代碼如下:
public Return close(
@RequestParam(value="userId", defaultValue="", required=true) String userId,
@RequestParam(value="umbrellaId", defaultValue="", required=true)String umbrellaId) {userService.updateState(userId, 3);//修改用戶狀態(tài)
umbrellaService.changeUmbrellaState(0, umbrellaId);//修改雨傘狀態(tài)
SocketUtil.lock();//雨傘關(guān)鎖
umbreallaWebSocket.sendMessage(new Gson().toJson(new Direction(Umbrella.LOCK, umbrellaId)));
int time = umbrellaService.getUseTime(userId); //計(jì)算使用雨傘時間
time = time <= 0 ? 1 : time;
umbrellaService.updateMoney(userId, time * 0.01);} //計(jì)算費(fèi)用
支付功能部分代碼如下:
public Return pay(
@RequestParam(value="userId", defaultValue="", required=true) String userId) {
int time=umbrellaService.getUseTime(userId);
System.out.println("使用時間:"+time);
double money= time * 0.01;
umbrellaService.updateMoney(userId, money);//支付成功后執(zhí)行的操作
userService.updateState(userId, 1);//更改用戶狀態(tài) 為已支付
umbrellaService.updateOrderState(userId); }//更改訂單狀態(tài)為已完成
點(diǎn)擊圖2中④處的信息標(biāo)識可以打開圖6所示的天氣預(yù)報(bào)。

圖6 天氣信息
調(diào)用高德天氣接口API,通過使用者IP定位得到信息Adcode,再結(jié)合前面提到的秘鑰key,調(diào)用weather插件便能得到最近五天的天氣實(shí)況,實(shí)時為用戶提供溫度、濕度、空氣質(zhì)量、溫馨提示等信息可以幫助了用戶做出合適的選擇。部分代碼如下:
public Return getWeatherInfo(
@RequestParam(value="city", defaultValue="蚌埠")String city){
if(res != null){ return new Return(true, res);}
String urlString = "https://www.sojson.com/open/api/weather/json.shtml?city=" + city;
RestTemplate rt = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
HttpEntity
res = rt.exchange(urlString, HttpMethod.GET, entity, Map.class);
new Thread(()->{
try {Thread.sleep(1000 * 3);res = null;}
catch (Exception e) {e.printStackTrace();}
}).start();
return new Return(true, res);}
共享雨傘分為傘樁和雨傘兩部分。傘樁的分布位置已內(nèi)嵌到后臺,用戶可直接在APP上找到附近的傘樁。分析了文獻(xiàn)[4]、[5]、[6],文章設(shè)計(jì)的傘樁的主要硬件部分為智能鎖和主控芯片,如圖7所示。

圖7 硬件系統(tǒng)圖
采用深圳倫茨科技研發(fā)的藍(lán)牙智能芯片:ST17H30,這款芯片具有以下功能:支持定位,藍(lán)牙IC可直驅(qū)馬達(dá),支持多種開鎖方式,如:通過二維碼掃描方式/藍(lán)牙連接方式開鎖等,支持空中升級OTA ,多重加密。超低功耗 1顆18650鋰電池(3000mah)可連續(xù)工作2年。
基于ARM Cortex-M4的STM32F4系列單片機(jī)(MCU)采用了意法半導(dǎo)體的NVM工藝和ART加速器,在180 MHz的工作頻率下通過閃存執(zhí)行指令時可實(shí)現(xiàn)225 DMIPS/608 CoreMark的性能。
在該硬件系統(tǒng)中,主控MCU和馬達(dá)驅(qū)動模塊作為后備開鎖模塊,在藍(lán)牙模塊開鎖失效的情況下,由MCU通過馬達(dá)驅(qū)動來開鎖并將此傘樁的故障鎖記錄下來通過網(wǎng)絡(luò)上傳到后臺服務(wù)器。
共享雨傘弱化“擁有權(quán)”,強(qiáng)調(diào)“使用權(quán)”,輕松掃碼,一鍵借傘,隨借隨還,讓閑置的傘在行人迫切需要時,發(fā)揮它遮陽擋雨的作用。未來共享經(jīng)濟(jì)是發(fā)展的趨勢,課題組在這方面進(jìn)行了一次探索嘗試,將“共享”理念引入校園,未來可共享的絕不止于雨傘。后續(xù)進(jìn)行軟硬件的改進(jìn)和完善,以期可以推廣到人流密集的社區(qū)以及更多地方,讓公眾獲得更多的便利,具有廣泛的市場前景和社會價值。