【IoT应用创新大赛】智能快递箱的设计与实现

2020-05-21 11:08:28 浏览数 (1)

演示视频

视频内容

作品ppt

腾讯云IoT的智能快递箱设计与实现ppt

作品文章

腾讯云IoT的智能快递箱的设计与实现

作者:吕昉

一. 设计背景

物联网时代的来临给生活带了科技感,让生活充满了便捷,在物流领域产生了重要的推动作用。可以说,物联网是开启物流信息化整合的时代引擎,谁抓住了物联网,谁就抓住了物流行业的未来!面对物流快递业务量的爆发式增长,“最后100米”配送已成为制约递送效率的关键性因素。为突破物流快递中这“最后100米”障碍,根据现代物品流通更网络化、电子化、自动化的发展趋势,融合了网络购物、电子商务、物流方式等现代商业运营模式,将远程通讯、GPRS定位、自动控制等电子科技融为一体,它将以全新的商业运营模式,引领并满足人们快捷、便利、低成本的物流消费生活方式。快递终端的自助化简化了人工操作流程,提高了工作效率和准确性,可大大降低企业的运营成本。

二. 设计概述及设计思路

根据背景的需求,在物流终端,即物主与快递员间设计一款能够代替快递员完成物件交递工作的物联网设备成为了需求。在这里所设计的腾讯云IoT智能快递箱即可完成代替快递员完成物件交递工作的任务。其设计思路如图1所示。

图1 智能快递箱设计思路图1 智能快递箱设计思路

智能快递箱具体设计思路如下:

1. 快递人员通过管理员系统提供的“快递员识别码”打开智能快递箱的存放物件模式,然后存放物件,并将存放物件后获得的所用箱子对应的唯一“提货码”发送给物主,完成快递员操作。管理员系统如图2所示,是便于管理员监控和设置智能快递箱的物联网小程序。

图2 管理员系统界面图2 管理员系统界面

2.物主通过将收到“提货码”输入到物主小程序“小云箱”当中,物主小程序如图3所示,智能快递箱将识别物主发送的“提货码”,将“提货码”所对应的箱子打开,物主完成提货,这就是整个智能快递箱的设计思路。

图3 物主小程序“小云箱”图3 物主小程序“小云箱”

三. 硬件部分

1.主控制板

本次设计的主控制板采用嵌有TencentOS tiny 基础内核和 IoT 组件的开发板EVB_MX ,如图4所示。其主控芯片是STM32L431RCT6低功耗芯片,该开发板支持WiFi、NB-loT、LoRaWAN等多种通讯方式的接入。在本次设计当中,主控芯片就是来控制通信模块ESP8266成功连接上腾讯云服务器,并且能够及时向云服务器上报快递箱状态信息以及处理服务器传送的控制信息,从而完成监控和控制快递箱的功能。

图4 主控制板图4 主控制板

2.通讯模块

本次设计所采用的通信模块是乐鑫的ESP8266模块,其特点是性能稳定,高度集成,低功耗等特点,如图5所示。ESP8266在主要功能是将其设置成STA标准模式加入设备管理者的路由器,并打开自身透传模式利用MQTT协议,使得主控芯片能够通过ESP8266连接上腾讯云服务器,从而使得主控芯片与腾讯云服务器能够数据通信。

图5 ESP8266模块图5 ESP8266模块

3.智能快递箱设备

非常抱歉,因为疫情的关系以及自身条件的限制,我没有找到专用快递箱,在这里我想利用OLED显示屏能够显示我自理的内容的功能来模拟智能快递箱各个箱子的状态,以及用开发板上的四个按键(F1,F2,F3,F4)来充当功能按键(即快递人员通过按键 输入本文第二部分所说的“快递员识别码”),除此之外,还通过这四个按键来模拟快递人员“打开箱子放入物件的动作”和“关闭箱子”的动作,以及通过这四个按键来模拟物主“取走物件关闭箱子”的动作(箱子的打开是通过物联网自动打开的,故物主只有“取走物件关闭箱子”的动作)。

因为在智能快递箱中,对箱子的控制就是对箱子开关电平读取以及写入,这里的OLED显示屏显示的内容是根据我在程序中定义的一个箱子开关寄存器的高低电平内容来显示快递箱的状态,所以我认为利用OLED所显示的内容来模拟现实中智能快递箱是可行的。下面是OLED显示的内容介绍。

(1) 这是智能快递箱初始页面,此页面中对于物主则是等待物主的到来“提货码”模式,对于快递员,将是等待快递员按下F4将进入快递人员识别页面。

初始页面初始页面

(2)这是快递人员识别页面,可见已经通过F1,F2,F3功能按键输入了“快递员识别码”924,F4是确认按键,或者不知道识别码时候的退出按键。

输入快递员识别码输入快递员识别码

(3)这是快递人员输入了正确的“快递员识别码”后进入快递员存放物件模式的页面,并且可以看见箱子1,箱子2,箱子3的状态是emp(无存货状态)。这里有3个按键(F1,F2,F3),所以这里模拟箱子是3个,按下哪个按键,就表示快递员打开哪个箱子,并存放物件。F4是退出快递员放货模式。

快递员存放物件模式页面快递员存放物件模式页面

(4)这是快递员按下F1之后的页面,表示打开箱子1,并且获得箱子1所对应的“提货码”,程序设计中,它是唯一的。再按下F1表示快递员存放好物件,箱子1关闭。

箱子1打开,获得箱子1的提货码箱子1打开,获得箱子1的提货码
箱子1关闭箱子1关闭

(5)当快递人员用箱子1存好物件并关闭箱子1之后,将返回到快递员存放物件模式的页面,此时可以看见箱子1的状态是ful(有物件状态)。当按下F4后将退出快递员存放物件模式,返回到初始界面。

快递员存放物件模式的变化快递员存放物件模式的变化

(6)在初始页面中当智能快递箱接收到物主发送的正确“提货码”之后将进入这个页面,因为(4)(5)是以箱子1为例,故这里是箱子1打开,OLED并显示“东西在这里”,然后物主按下F1,表示取走东西,并关闭箱子1,然后回到初始页面。

箱子1打开,显示“东西在这”的字样箱子1打开,显示“东西在这”的字样
箱子1关闭,显示“成功带走物件”的字样箱子1关闭,显示“成功带走物件”的字样

综上所示,就是智能快递箱整个动作过程。

四. 软件部分

1.主控板程序部分

主控制板部分按照图6所示的流程执行。

图6 程序流程图图6 程序流程图

具体程序实现如下:

(1)物主模式/快递员模式判断

代码语言:javascript复制
int judge_developer_mode(void*client)
{
	int a=0,b=0,c=0;
	int temp=1;
	int temp2=33333;
	
	if(develober_mode_flag==1)//模式判断
	{
		return 0;
	}

	OLED_ShowString(0,0,"welcome smartbox",16);//初始页面
	OLED_ShowString(0,2,"F4:join courier",16);//初始页面
	switch(KEY_Scan())
	{

		case 4:		
			OLED_Clear();
			OLED_ShowString(0,0,"F4:OK/EXT secret",16);
		while(temp)
		{
			switch(KEY_Scan())
				{
					case 1:	a=a 1;
									if(a==10)
										{
										a=0;
										}
								OLED_ShowNum(0,2,a,1,16);
									break;
					case 2:
									b=b 1;
									if(b==10)
										{
										b=0;
										}
								OLED_ShowNum(13,2,b,1,16);
									break;
					case 3: 									
									c=c 1;
									if(c==10)
										{
										c=0;
										}
								OLED_ShowNum(26,2,c,1,16);
									break;
						case 4: 									
									if(sg_ProductData.m_developer_secret==a*100 b*10 c)
										{
										develober_mode_flag=1;
										}
											temp=0;
											a=0;
											b=0;
											c=0;
									return 0;
									break;
					}
		}
		default:
					IOT_Template_Yield(client, 200);
					temp2=StringToInt(sg_ProductData.m_goods_code);
				if(temp2==box1_secret_reg||temp2==box2_secret_reg||temp2==box3_secret_reg)
					{
							user_mode_flag=1;
							develober_mode_flag=0;
							OLED_Clear();
							OLED_ShowString(0, 0,"welcome to use", 16);
							return 0;
							break;
					}
	}
	return 1;

}

(2)快递员模式下提货码的获取与传输

代码语言:javascript复制
if(develober_mode_flag==1)
	   {
				OLED_Clear();
				//OLED_ShowString(0,0,"Put items ",16);
				judge_box_storage();
				OLED_ShowString(0,2,"F4 EXIT courier",16);
				while(box_on_off_and_get_secret());
				updata_sg_ProductData();
				first_time_report_construct(pReportDataList, &ReportCont);
				rc = IOT_Template_JSON_ConstructReportArray(client, sg_data_report_buffer, sg_data_report_buffersize, ReportCont, pReportDataList);
            if (rc == QCLOUD_RET_SUCCESS) {
                rc = IOT_Template_Report(client, sg_data_report_buffer, sg_data_report_buffersize,
                                            OnReportReplyCallback, NULL, QCLOUD_IOT_MQTT_COMMAND_TIMEOUT);
                if (rc == QCLOUD_RET_SUCCESS) {
                    Log_i("data template reporte success");
                } else {
                    Log_e("data template reporte failed, err: %d", rc);
                }
            } else {
                Log_e("construct reporte data failed, err: %d", rc);
                    }

		 }

唯一随机码产生,利用系统时钟作为随机因子,产生1~9999的唯一随机码

代码语言:javascript复制
int rand_num(void)
{
		int num;
		while(1)
		{
    srand(HAL_GetTick());    
    num=rand()�99 1;		
		if(num!=box1_secret_reg||num!=box2_secret_reg||num!=box3_secret_reg)
			{
				return num;
			}
		}
}

(3)物主模式下提货码开箱操作

代码语言:javascript复制
int judge_on_user_mode_goods_code(int temp)//temp物主提货码
{
	if(temp==box1_secret_reg)
	{
		if(box1_lock_state==1)
			{
				box1_lock_state=0;
					OLED_Clear();
					OLED_ShowString(0,0,"box1:ON",16);
					OLED_ShowString(0,2,"Things in this",16);
					box_open_flag=1;				
			}
	}else
	if(temp==box2_secret_reg)
	{
		if(box2_lock_state==1)
			{
				box2_lock_state=0;
					OLED_Clear();
					OLED_ShowString(0,0,"box2:ON",16);
					OLED_ShowString(0,2,"Things in this",16);
					box_open_flag=2;
			}
	}else
	if(temp==box3_secret_reg)
	{
		if(box3_lock_state==1)
			{
				box3_lock_state=0;
					OLED_Clear();
					OLED_ShowString(0,0,"box3:ON",16);
					OLED_ShowString(0,2,"Things in this",16);
					box_open_flag=3;
			}
	}	
}

2.小程序部分

(1)物主程序设计

针对于物主,只需要发送“提货码”功能,通过小程序开发工具设置能与腾讯云服务器数据交互的事件按钮“发送”,以及“发送”的数据内容“提货码”,小程序取名为“小云箱”,物主小程序界面图7所示。

图7 小云箱界面图7 小云箱界面

(2)管理者小程序设计

管理者小程序负责监控智能快递箱各个状态,需要掌控全局,故通过“腾讯连连”扫描云开发平台上的设备二维码获得对全局状态监控的小程序,所需监控的设备属性可以在开放平台中设置,如图8所示。

图8 设置属性界面图8 设置属性界面

管理者小程序界面如图9所示。

图9 管理者小程序界图9 管理者小程序界

(3)腾讯云平台部分

腾讯云平台部分是我作为开发者需要设计的部分,该部分的作用是定义智能快递箱的各项需要与腾讯云服务器进行数据交互的属性,也就是需要由腾讯云服务器进行监控的属性。设置面板如图10所示。除此之外,腾讯云平台部分也为开发这人员提供线上仿真调试,以确保智能设备的可靠性。

图10 设置面板图10 设置面板

五. 仿真

1.线上仿真

通过硬件设计与软件设计,下面进行线上仿真,通过腾讯云平台的线上调试工具对智能快递箱进行调试仿真。

(1)快递人员进入“快递员存货模式”,打开箱子1,获取箱子1的提货码2098,如下图所示,硬件显示状态,以及调试中的上报信息,可见智能快递箱设备上报各个属性信息成功。

箱子1打开,并显示箱子1的提货码箱子1打开,并显示箱子1的提货码
线上调试图线上调试图

(2)当物主发送提货码“2098”之后,箱子1打开,可见腾讯云平台的下行控制命令,以及硬件设备打开箱子1的状态,如下图所示,可见物主发送提货码命令成功,并打开了箱子1。

线上调试图线上调试图
箱子1开,显示“物件在这”的字样箱子1开,显示“物件在这”的字样

2.实物仿真

实物仿真请见作品视频展示。

六. 总结和展望

腾讯云物联网开发平台以及腾讯定制的开发板EVB_MX 让我认识和学习到一个物联网智能设备的开发流程。腾讯云物联网开发平台让我学习到如何在顶层中定义一个智能设备的各项属性,用来控制底层真实的硬件设备,并且能够通过调试来验证设备设计的可靠性。开发板EVB_MX 让我学习到STM32的基于HAL库的编程结构,以及ESP8266的STA模式下的透传工作方式,并且熟悉了物联网中通过MQTT协议的数据交互方式。

“智能物流”这一概念正是解决物流高效率而提出来的。在之后,智能快递箱运用于物流终端,在物主与快递员之间的物件交递产生重要作用,能够大大提高快递员的工作效率,在物流终端这一环节实现高效物流,并给生活带来极大便捷。所以智能快递箱这一智能设备将会成为未来物流模式当中重要的一环。

七. 感谢

在这里非常感谢腾讯云为我们参赛者提供物联网开发平台以及硬件设备,同时也非常感谢腾讯云IoT创新大赛官方群以及

TencentOS tiny官方交流群中热情的老师细心地帮助我们参赛者解答各类问题,有幸参加这次比赛感到无比荣幸,非常感谢你们。

小组成员:吕昉(负责人)

岑磊

文艺桦

负责人电话:17815335532

0 人点赞