基于物联网的校园共享雨伞系统设计与实现*
2019-01-22陈玉娥任玉文黄文欢宋鑫海韩文龙
陈玉娥 任玉文 陈 可 黄文欢 宋鑫海 韩文龙
(蚌埠医学院 安徽蚌埠 233030)
1 研究背景
天气预报不是特别准确,有时候会有突如其来的雨;就算知道有雨也可能会忘记带伞;避雨会浪费宝贵的时间;买一把新的雨伞会导致家里的伞越来越多,会占地方,且出行总是带伞也不是特别的方便。虽然酒店、商场等一些地方也提供爱心雨伞以供借用,但是用户及时归还到原处的限制条件,给人们带来一定麻烦,还有些公民没有道德规范和公共意识,随意损坏或者不归还,导致丢伞率高,不好管理。有了共享雨伞,随时随地人们都可以出行自如,不必时刻关注天气,不必内心纠结需不需要带伞出门或者丢伞。
百度百科对共享雨伞的描述是这样的:共享雨伞是指企业在地铁站点、商业区、居民区、校园、酒店等提供雨伞的共享服务,是共享经济的一种新形态。2017年初,国内共享雨伞渐渐露出锋芒,在广州、深圳及江浙沪一带开始试运行。共享雨伞符合绿色出行、节省资源的环保理念,不过其商业市场目前还是处于初级和探索阶段[1-2]。文章结合物联网专业知识,设计了一个校园共享雨伞网上借还系统,主要功能是实现校园教学楼、食堂、宿舍三个区域的公共雨伞共享,方便意外或恶劣天气时未带雨伞的情况。开发了“小蚌”共享雨伞APP,方便师生,开阔学生视野,提高学生创新意识,“小蚌”共享雨伞具有晴雨两用功能,有雨则遮雨,夏季起到防晒防紫外线的作用。
2 系统总体设计
物联网是物物相联的互联网,在系统中是把共享雨伞联入网络。依据物联网三层架构,设计了共享雨伞的系统结构图[3],如图1所示。
图1 系统总体架构图
应用层面向用户,管理用户和雨伞,用户通过手机APP进行注册、登录、申请开锁取伞、还伞、缴费、上报终端位置等等;网络层是系统的核心,负责数据的传输,向客户端发送登录验证码、开锁指令、用伞相关提醒、天气状况等等信息;感知层是信息采集部分,用户扫码,获取雨伞编号发给后台服务,如果满足借伞条件就开始借伞。
3 软件系统
软件部分使用前端开发工具HBuilder设计了“小蚌”校园共享雨伞APP,使用简单方便,服务器端的开发环境是Eclipse,开发语言是Java。整个系统采用B/S架构,实际部署Web服务器是Apache+Tomcat + 数据库MySQL。端到端通信是C/S方式。客户端针对Android开发环境,目标系统是Android 4.0以上,使用Java语言和js提供的Ajax异步请求技术,请求后台数据接口,解析后台返回的json数据。手机端安装完成打开“小蚌”APP,其主界面如图2所示。
图2 APP主界面
3.1 登录及账户管理
点击图2中①处可以打开用户登录界面,如图3(a)所示,用户输入手机号,然后点击“获取验证码”,可以收到类似这样的信息“【小蚌】欢迎使用小蚌雨伞,您的验证码为834903,10min内有效,请尽快使用。”APP可使用阿里提供的接口实现发送手机验证码进行登录系统的功能,免注册,无须记忆密码,方便快捷。部分主要代码如下:
private static Map
private static final String product = "Dysmsapi";// 短信API产品名称
private static final String domain = "dysmsapi.aliyuncs.com";// 短信API产品域名
private static final String accessKeyId = "LTAIw3zvXKJhMlZ7";
private static final String accessKeySecret = "eUKPy2NsCB4KUgafGQSeMIoyWbiRhU";
private static final SendSmsRequest request = new SendSmsRequest();
static {sendMap.put("15212653351", "123456");// 提供一个测试用手机号码和验证码
request.setMethod(MethodType.POST); //使用post提交组装请求对象
request.setSignName("小蚌");//短信签名 request.setTemplateCode("SMS_129757529");}//短信模板
将手机端收到的短信验证码输入到图3(a)所示“验证码”输入框中,点击“进入”按钮,即可进入个人信息页面,如图3(b)所示。图中显示了用户的账户余额,点击“充值”按钮进入图3(c),输入充值的金额,点击“确认充值”,进入图3(d),可以看到“充值成功”的提示信息以及充值后的账户余额。
图3 登录及账户管理界面
3.2 地图定位
用户打开手机端的“小蚌”APP,将自动获取用户的地理位置并显示在地图上,如图2中②处显示“已为您切换到当前位置”,从主界面的地图上可以看到用户所处的位置。首先注册成为高德地图开发者并申请一个秘钥key,然后在前端页面引入高德地图JavaScript API,创建了地图容器并给定中心坐标和地图级别等常见的地图操作信息。部分代码如下:
map.plugin('AMap.Geolocation', function () {
geolocation = new AMap.Geolocation({
enableHighAccuracy: false,//是否使用高精度定位
timeout: 1000, //超过10秒后停止定位
maximumAge: 0, //定位结果缓存0毫秒
convert: true, //自动偏移坐标,偏移后的坐标为高德坐标
showButton: true, //显示定位按钮
buttonPosition: 'LB', //定位按钮停靠位置,默认:'LB',左下角
buttonOffset: new AMap.Pixel(10, 20),//定位按钮与设置的停靠位置的偏移量
showMarker: true, //定位成功后在定位到的位置显示点标记
showCircle: true, //定位成功后用圆圈表示定位精度范围
panToLocation: true, //定位成功后将定位到的位置作为地图中心点
zoomToAccuracy:true}); //定位成功后调整地图视野范围
map.addControl(geolocation);
geolocation.getCurrentPosition();
AMap.event.addListener(geolocation, 'complete', function(position){
layer.alert('已为您切换到当前位置', {icon: 1});
marker = new AMap.Marker({title: '你的位置'});
marker.setMap(map);});//返回定位信息
借助地图定位功能,用户在不同的地方打开APP,可以快速找到距离较近的共享雨伞的借还点。
3.3 扫码解锁
点击图2中③所示的“解锁”按钮可以实现扫码开锁进行借伞的功能。
首先通过Google的Zxing包下的工具类QRcode为每一把伞都生成一个带小蚌雨伞Logo的二维码图片放入前端页面Websocket下image文件夹中,如图4(a)所示。
图4 开锁关锁界面软件模拟
Html5+提供了各种接口及规范,调用接口即可实现和硬件的交互,该项目APP中使用到的模块Barcode提供打开摄像头识别二维码的功能。因此当用户点击图2中的“解锁”按钮时会打开手机的摄像头。图4(b)所示的二维码代表一把雨伞,此时是上锁的,手机扫描以后,后台数据库判断此用户是否满足借伞条件:假如用户已交押金,当前没有未支付的情况,并且伞也处于可借状态,就会执行开锁指令,如图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);//修改雨伞状态
userService.updateState(userId, 2);//修改用户状态
SocketUtil.unlock(); //解锁
umbreallaWebSocket.sendMessage(new Gson().toJson(new Direction(Umbrella.UNLOCK, umbrellaId)));
return Return.OPERATE_SUCCESS;}
else {return Return.PARAM_WRONG;}}
3.4 关锁支付
如果上述借伞操作成功,再次进入个人信息页面,可以看到“解锁”按钮变成了“关锁”按钮如图5(a)所示。点击“关锁”按钮,进入图5(b)所示的支付界面,点击“去支付”按钮并支付相应的租赁费即可完成还伞操作。小蚌共享雨伞的押金设置为10元,每小时收费0.5元(不足1小时按1小时计费)。以两天为归还期限,逾期后每天收取一定逾期费,直至押金扣完为止。支付完成,会返回到APP主页面,再次进行扫码,“解锁”功能又可以正常使用了。
图5 关锁和支付界面
关锁功能部分代码如下:
public Return close(
@RequestParam(value="userId", defaultValue="", required=true) String userId,
@RequestParam(value="umbrellaId", defaultValue="", required=true)String umbrellaId) {userService.updateState(userId, 3);//修改用户状态
umbrellaService.changeUmbrellaState(0, umbrellaId);//修改雨伞状态
SocketUtil.lock();//雨伞关锁
umbreallaWebSocket.sendMessage(new Gson().toJson(new Direction(Umbrella.LOCK, umbrellaId)));
int time = umbrellaService.getUseTime(userId); //计算使用雨伞时间
time = time <= 0 ? 1 : time;
umbrellaService.updateMoney(userId, time * 0.01);} //计算费用
支付功能部分代码如下:
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);//支付成功后执行的操作
userService.updateState(userId, 1);//更改用户状态 为已支付
umbrellaService.updateOrderState(userId); }//更改订单状态为已完成
3.5 天气信息
点击图2中④处的信息标识可以打开图6所示的天气预报。
图6 天气信息
调用高德天气接口API,通过使用者IP定位得到信息Adcode,再结合前面提到的秘钥key,调用weather插件便能得到最近五天的天气实况,实时为用户提供温度、湿度、空气质量、温馨提示等信息可以帮助了用户做出合适的选择。部分代码如下:
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);}
4 硬件系统
共享雨伞分为伞桩和雨伞两部分。伞桩的分布位置已内嵌到后台,用户可直接在APP上找到附近的伞桩。分析了文献[4]、[5]、[6],文章设计的伞桩的主要硬件部分为智能锁和主控芯片,如图7所示。
图7 硬件系统图
4.1 蓝牙模块
采用深圳伦茨科技研发的蓝牙智能芯片:ST17H30,这款芯片具有以下功能:支持定位,蓝牙IC可直驱马达,支持多种开锁方式,如:通过二维码扫描方式/蓝牙连接方式开锁等,支持空中升级OTA ,多重加密。超低功耗 1颗18650锂电池(3000mah)可连续工作2年。
4.2 主控芯片
基于ARM Cortex-M4的STM32F4系列单片机(MCU)采用了意法半导体的NVM工艺和ART加速器,在180 MHz的工作频率下通过闪存执行指令时可实现225 DMIPS/608 CoreMark的性能。
在该硬件系统中,主控MCU和马达驱动模块作为后备开锁模块,在蓝牙模块开锁失效的情况下,由MCU通过马达驱动来开锁并将此伞桩的故障锁记录下来通过网络上传到后台服务器。
5 结语
共享雨伞弱化“拥有权”,强调“使用权”,轻松扫码,一键借伞,随借随还,让闲置的伞在行人迫切需要时,发挥它遮阳挡雨的作用。未来共享经济是发展的趋势,课题组在这方面进行了一次探索尝试,将“共享”理念引入校园,未来可共享的绝不止于雨伞。后续进行软硬件的改进和完善,以期可以推广到人流密集的社区以及更多地方,让公众获得更多的便利,具有广泛的市场前景和社会价值。