快递物品远程自动接收系统设计与开发
2017-01-21刘袁梦黄文彬许小郡毋茂盛
刘袁梦++黄文彬++许小郡++毋茂盛
摘 要:随着互联网的发展,网上购物成为人们日常生活的一部分,如何远程接收快递的问题变得日益突出,文中设计了一个快递物品远程自动接收系统,介绍了系统的功能以及软件和硬件实现的方法。
关键词:快递;蓝牙;互联网;远程自动接收
中图分类号:TN919;TP31 文献标识码:A 文章编号:2095-1302(2016)12-00-03
0 引 言
目前,网购已成为亿万网民生活中不可或缺的一部分,2015年“双十一”期间,淘宝的成交额达到了912亿元。近年来,快递行业成为一个爆发式增长的行业[1],据统计,我国的快递业务量已居世界第三位。如何有效地接收快递变成了日益突出的问题。为了解决这个问题,本课题设计开发了一个物品远程接收系统,当物主在上班或出差时,可以通过互联网远程控制快递物品接收箱。当有快递物品送到物主门口时,物主可以通过办公室的电脑端程序控制快递箱上的电插锁打开或关闭,实现远程接收快递物品。
1 系统的工作原理与结构
1.1 工作原理
当有快递到达时,物主通过运行在办公室电脑上的软件以及互联网远程打开储物箱,并通过IP摄像头实时对储物箱进行远程监视,确保物品存入储物箱。物主回家时,通过手机打开储物箱取出物品。
1.2 系统整体结构
系统主要由硬件和软件两部分组成。软件部分包括运行在办公室电脑上的远程监控软件、运行在手机中的开箱软件以及储物箱电路板控制软件。系统硬件主要由电脑、IP摄像头、手机、控制电路板以及储物箱等组成。其整体结构如图1所示。
2 系统实现
2.1 硬件设计
本系统使用的硬件虽多,但真正需要开发的是储物箱的控制电路板,该电路板通过互联网接收远程开箱命令,通过驱动电路控制继电器打开储物箱电控锁,并检测电控锁是否打开。由于AT89S51单片机有许多优点[2],所以电路板将AT89S51单片机作为主控芯片,单片机和W5100网络模块、HC-06蓝牙模块、驱动电路、继电器以及电控锁共同构成储物箱的控制硬件。W5100网络模块通过SPI方式与单片机通信,其内部集成了全硬件的TCP/IP协议栈,使用方便,通过Socket编程即可实现对其的访问。储物箱控制板的电路框图如图2所示。
2.1.1 互联网接口
互联网上传送的信息有其自己的格式,单片机无法直接接收,为了方便,本系统采用W5100网络模块,将W5100与家里的路由器相连,接收到远程接收PC端程序通过互联网发送过来的命令时,通过SPI总线转发给AT89S51单片机。单片机识别收到的命令后,发送一个信号给继电器以控制电插锁的12电源,以实现开关箱的操作。此外,电插锁对外拥有5条线,2条为12 V电源线,3条为表示电插锁开关状态的线。单片机通过另外3条线可以了解电插锁的开关状态。
2.1.2 蓝牙接口
随着通信技术和电子技术的快速发展,目前手机已成为生活中必备的工具,几乎人手一机。手机的应用已扩展到控制领域,如用于门禁系统[3]。为了节省成本和便于操作,储物箱省去了键盘以及LED或LCD显示器,直接用手机来充当储物箱的外设。手机具有蓝牙通信功能,本系统通过手机和储物箱电路控制板上的HC-06蓝牙模块直接交换信息,以打开储物箱的电插锁。
为了方便用户随时查看快递箱的状况,系统还增加了一个IP摄像头,这样用户就可以在电脑前实时了解快递箱动态。
2.2 软件开发
本系统的软件主要包括运行在办公室电脑上的远程计算机监控软件、运行在手机中的开箱软件以及储物箱电路板控制软件。
2.2.1 计算机监控软件的开发
计算机监控软件主要有远程打开储物箱与实时采集监视图像的功能,确保物品能存入储物箱中。软件运行界面如图3所示。
2.2.1.1 网络远程控制编程
网络编程主要用到Socket通信技术,桌面程序作为Socket服务器端,单片机作为Socket客户端。控制命令见表1所列。
服务端核心代码如下:
try (ServerSocket s = new ServerSocket(8189)) {// 等待 Socket 连接
try (Socket incomming = s.accept()) {
InputStream inStream = incomming.getInputStream();
OutputStream outStream = incomming.getOutputStream();
try (Scanner in = new Scanner(inStream)) {
PrintWriter out = new PrintWriter(outStream, true);
while (in.hasNext()) {
String line = in.nextLine();
if ("STATUS_OPEN".equals(line.trim())) {
// 控制程序界面显示电控锁状态为开
} else if ("STATUS_CLOSE".equals(line.trim())) {
// 控制程序界面显示电控锁状态为关
}
}
}
}
}
2.2.1.2 图像采集编程
实时监视的图像采集主要通过远程连接IP Camera并调用其二次开发API来实现。本系统中图像采集是借助于海康威视的IP Camera网络摄像机实现的,此网络摄像机具有实时监视,图像、视频、音频采集,云台控制,报警等多种功能。设定好IP Camera的IP地址后,客户端程序通过网络连接其IP地址并设置好端口号,登录信息即可通过API连接至摄像机。
监控程序用到的主要API:
HI_SDK_Init ();//初始化API库
HI_SDK_Login (const HI_CHAR*, const H_CHAR*, const H_CHAR*, HI_U16, HI_S32);//连接摄像机
HI_SDK_RealPlay(HI_HANDLE, HI_VOID*, HI_S_STREAM_INFO*);//实时监视
HI_SDK_CaptureJPEGPicture(HI_HANDLE, HI_CHAR*);//抓拍JPEG格式图片
HI_SDK_StartRecord(HI_HANDLE,HI_CHAR*,FILE_FORMAT_E,MEDIA_TYPE_E,HI_S32);//录制视频
HI_SDK_StopRecord(HI_HANDLE);//停止录制
HI_SDK_Playback(HI_CHAR*, HI_VOID);//录像回放等
部分功能实现程序段如下:
(1)连接IP Camera程序段
BYTE f1, f2, f3, f4;
((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(f1,f2,f3,f4);//获取IP地址
adrr.Format(_T("%d.%d.%d.%d"), f1, f2, f3, f4);
USES_CONVERSION;
m_Handle=HI_SDK_Login(T2A(adrr),T2A(userName),T2A(passWord),80);//连接摄像机
(2)实时监视程序段
HI_S_STREAM_INFO info;//设置图像显示参数
info.u32Channel = HI_CHANNEL_1;
info.blFlag = HI_TRUE;
info.u32Mode = HI_STREAM_MODE_TCP;
info.u8Type = HI_STREAM_ALL;
HI_SDK_RealPlay(m_Handle,GetDlgItem(IDC_STATIC_Camera)->m_hWnd,&info);//图像采集并显示
(3)抓拍图像程序段
CString FileName = CTime::GetCurrentTime().Format
("picture_%y_%m_%d_%H_%M_%S.bmp") ;//文件名
CString a;
a.Format(_T("%s\\picture\\%s"), s, FileName);//文件路径
USES_CONVERSION;
char *path = T2A(a);
HI_SDK_CapturePicture(m_Handle,path);//抓拍
(4)录像程序段
CString FileName = CTime::GetCurrentTime().Format(
"video_%y_%m_%d_%H_%M_%S.avi");//文件名
CString a;
a.Format(_T("%s\\record\\%s"), s, FileName);//文件路径
char *path = T2A(a);
e = MEDIA_VIDEO;
HI_SDK_StartRecord(m_Handle, path, FILE_FORMAT_AVI, e, 0);//录像
2.2.1.3 手机开箱软件开发
开箱软件通过蓝牙技术和储物箱电路板控制软件交换信息,进行现场开箱;本系统开发的手机开箱软件基于Android系统。蓝牙通信程序的基本流程为蓝牙设备搜索、蓝牙设备连接和蓝牙通信三个部分。程序中主要用到了BluetoothAdapter类、BluetoothDevice类、BluetoothServerSocket类以及BluetoothSoc ket类等。
(1)蓝牙设备搜索
需要先在AndroidManifest.xml中声明权限:
然后调用BluetoothAdapter类的getDefaultAdapter()方法获取蓝牙设备。
BluetoothAdapter bAdapter = BluetoothAdapter.getDefaultAdapter();
if(bAdapter == null) {
//设备不支持蓝牙功能
}
最后使用BluetoothAdapter的startDiscovery()方法搜索蓝牙设备。
(2)蓝牙设备连接
只有当客户端程序的通用唯一识别码(Universally Unique Identifier,UUID)和服务器端的UUID相同时才能连接。本系统通过BluetoothSocket来创建蓝牙连接,该过程要使用两个类,分别为BluetoothServerSocket和BluetoothSocket。
服务器端蓝牙连接方法是:
①启动服务器
BluetoothAdapter bAdapter = BluetoothAdapter.getDefaultAdapter();
BluetoothServerSocket serverSocket =
bAdapter.listenUsingRfcommWithServiceRecord(YOUR ERVER NAME, YOUR UUID);
②服务器监听客户端连接
serverSocket.accept();
客户端蓝牙连接方法:
a.获取服务器端蓝牙设备BluetoothDevice。
b.客户端与服务器连接
BluetoothSocket socket = device.createRfcommSocketToServiceRecord(YOUR UUID);
socket.connect();
由于服务器端进行监听客户端连接(BluetoothServerSocket.accept())和客户端对服务器的连接(BluetoothSocket.connect())都会阻塞线程,因此都使用新的线程。
③蓝牙通信
当两台蓝牙设备建立好连接之后,就可以进行数据传输。蓝牙通信采用流形式进行数据传输,为此使用以下两个方法分别获得输入流和输出流:
BluetoothSocket:BluetoothSocket.getInptuStream();//获取输入流:
BluetoothSocket.getOutputStream();//获取输出流
使用下列程序段实现数据的读、写:
读数据(InptuStream)
InputStream reader = socket.getInputStream();
byte[] buffer = new byte[1024];
int n = reader.read(buffer); //监听输入流
写数据(OutputStream)
BluetoothDevice device; //连接的蓝牙设备
BluetoothSocket socket = device.createRfcommSocketToServiceRecord(YOUR UUID);
socket.connect(); //线程阻塞
OutputStream writer = socket.getOutputStream(); //获取蓝牙连接输出流
writer.write((YOUR DATA).getBytes()); //发送数据到服务器
(3)控制软件开发
控制软件的功能主要是接收开锁命令,实现开关电插锁。控制软件Vision4由C51编写,W5100网络模块带有SDK,编程十分方便。
3 结 语
本文运用多种技术设计开发了快递远程接收系统,有较高的技术含量和实际意义,特别是用手机作为储物箱输入和输出设备这一想法为业界提供了一种全新的产品设计思路,对以后产品的设计有一定的指导意义。设计的接收系统经实验室运行,稳定可靠,完全可以满足用户远程接收物品的需要。
参考文献
[1] 路宏伟.快递信息推送技术设计及实现[J].物联网技术,2016,6(1):54-55.
[2] 毋茂盛,张建平,张素群,等.单片机原理与开发[M].北京:高等教育出版社,2015.
(下转第页)
(上接第页)
[3] 惠春阳,陈志浩,胡婷婷,等.基于WiFi与智能手机的门禁系统[J].物联网技术,2016,6(3):7,9.
[4]胡越,周腾鹤,梁东升.基于蓝牙的安卓平台智能灯控制系统设计与实现[J].物联网技术,2016,6(5):14-16.
[5]张贵彬,赵子恒.“互联网+”在物流业发展中的应用[J].环球市场信息导报,2016(6):87.
[6]付宝玉.基于NFC技术的自助收发快递系统应用研究[J].物联网技术,2016,6(10):59-62.
[7]靳世杰.企业物流管理系统设计与开发[D].北京:北京工业大学,2014.
[8]张哲瑞.快递物流管理系统的设计与开发[D].秦皇岛:燕山大学,2015.