专栏首页腾讯云IoT【IoT应用创新大赛】基于腾讯云的智能停车平台
原创

【IoT应用创新大赛】基于腾讯云的智能停车平台

项目背景:

都说科技改变生活,今天来聊的这个作品可以真实的改变生活相信有车的朋友最头疼的莫过于停车问题,其他小城市还好,像深圳这样的大城市,停车问题一直困扰着有车一族:- 不知道哪里有车位可以停- 好不容易找到停车场因为方向错误或者技术不好车位被别人占了- 随意停路边容易吃罚单对于其他地方,停车场多于车辆的,停车场主面临收入问题:- 怎么让更多的车停到我这里增加收入- 我的停车场到底收入如何,如何简化做账流程- 我新建了一个停车场怎么让别人知道呢...基于以上几个痛点本人设计了一款基于腾讯云以及TencentOS Tiny实时系统打造的智能停车平台,依靠智能车位锁,智能抬杆,以及平台的管理能力,解决以上几个生活中的问题,并具有一定及广阔的商业价值

作品构成:

作品由设备,服务器及小程序组成:

  • 设备:设备采用STM32高性能MCU搭载TencentOS tiny系统,实现云服务及外围设备搭建,支持本地控制和远程控制双通道
  • 服务器:服务器有云开发和本地服务器,本地服务器采用Go语言+MongoDB,开发快速高效
  • 小程序:微信小程序有用户端和商家端两种界面展示,真正构成平台的作用,商家发布停车场,用户使用停车场

具体系统框架图可以看下图:

智能停车平台架构设计图

项目商业价值:

  1. 解决传统停车场停车难问题:传统停车场用户停车凭运气,有了预约平台线上查看附近哪里有停车场和车位后提前预约好车位,由于有车位锁的加持别人没法抢占,用户也不用兜兜转转找停车位浪费时间,随意停在路边还有爱车被破坏或者罚款等风险
  2. 帮助商家更好的管理:传统停车场依靠人力手动管理,现在依靠平台的能力商家可以随时随地进行管理,并且根据后台数据商家可以灵活调整自己的宣传,收费策略,
  3. 设备厂家新出路:传统的设备厂家靠卖产品盈利,新型停车平台厂家可以依靠服务,比如免费给商家安装设备,然后从停车收益中进行抽成来进行二次获利

商业价值展望:

  1. 增加盈利:商家可以跟周围其他品类商家合作,比如小吃,车行,休闲场所合作推广,比如用户停好车后可以在小程序上发布某些吃喝玩乐的信息,用户通过推荐的链接进行消费商家会有分成
  2. 构建生态:从停车平台出发,可以构建关于车相关的一系列生态,比如车辆美容,汽车保养,买车建议等等内容,打造汽车业内生态圈

具体实现:

设备端:

设备端采用TencentOS Tiny驱动,利用SDK里的demo程序可以快速上云,代码片段如下:

系统启动,上云:

int data_template_light_thread(void) {
    int rc;
	sReplyPara replyPara;
	DeviceProperty *pReportDataList[TOTAL_PROPERTY_COUNT];
	int ReportCont;
	
	registerPole();
	registerLock();

    //init log level
    IOT_Log_Set_Level(eLOG_INFO);

    //init connection
    TemplateInitParams init_params = DEFAULT_TEMPLATE_INIT_PARAMS;
    rc = _setup_connect_init_params(&init_params);
    if (rc != QCLOUD_RET_SUCCESS) {
		Log_e("init params err,rc=%d", rc);
		return rc;
	}

    void *client = IOT_Template_Construct(&init_params);
    if (client != NULL) {
        Log_i("Cloud Device Construct Success");
    } else {
        Log_e("Cloud Device Construct Failed");
        return QCLOUD_ERR_FAILURE;
    }

///////////////////////////////////

    int first_time_report = 1;
    light_power_off();

///////////////////////////////////

    //init data template
    _init_data_template();

	//register data template propertys here
    rc = _register_data_template_property(client);
    if (rc == QCLOUD_RET_SUCCESS) {
        Log_i("Register data template propertys Success");
    } else {
        Log_e("Register data template propertys Failed: %d", rc);
        return rc;
    }

	//register data template actions here
#ifdef ACTION_ENABLED
    rc = _register_data_template_action(client);
    if (rc == QCLOUD_RET_SUCCESS) {
        Log_i("Register data template actions Success");
    } else {
        Log_e("Register data template actions Failed: %d", rc);
        return rc;
    }
#endif

	//report device info, then you can manager your product by these info, like position
	rc = _get_sys_info(client, sg_data_report_buffer, sg_data_report_buffersize);
	if(QCLOUD_RET_SUCCESS == rc){
		rc = IOT_Template_Report_SysInfo_Sync(client, sg_data_report_buffer, sg_data_report_buffersize, QCLOUD_IOT_MQTT_COMMAND_TIMEOUT);
		if (rc != QCLOUD_RET_SUCCESS) {
			Log_e("Report system info fail, err: %d", rc);
			goto exit;
		}
	}else{
		Log_e("Get system info fail, err: %d", rc);
	}

	//get the property changed during offline
	rc = IOT_Template_GetStatus_sync(client, QCLOUD_IOT_MQTT_COMMAND_TIMEOUT);
	if (rc != QCLOUD_RET_SUCCESS) {
		Log_e("Get data status fail, err: %d", rc);
		//goto exit;
	}else{
		Log_d("Get data status success");
	}

    while (IOT_Template_IsConnected(client) || rc == QCLOUD_ERR_MQTT_ATTEMPTING_RECONNECT
		|| rc == QCLOUD_RET_MQTT_RECONNECTED || QCLOUD_RET_SUCCESS == rc) {
//		...
		
		
#ifdef EVENT_POST_ENABLED
		eventPostCheck(client);
#endif

         HAL_SleepMs(3000);
    }
exit:
    rc = IOT_Template_Destroy(client);

    return rc;
}

其中车锁和抬杆的注册:

static pole m_pole={
	.motor={.motor_pins={
		
	{GPIOB,	GPIO_PIN_5},
	{GPIOB,	GPIO_PIN_6},
	{GPIOB,	GPIO_PIN_7},
	{GPIOB,	GPIO_PIN_8},	
}
	}
};



int registerPole(){
	smotor_init(&m_pole.motor);
		return 0;
	
}

lock m_lock[]={

	{
	.motor={
		.motor_pins={
		
	{GPIOB,	GPIO_PIN_12},
	{GPIOB,	GPIO_PIN_13},

			},
		.limit_pins={
	{GPIOB,	GPIO_PIN_14},
	{GPIOB,	GPIO_PIN_15},
	},
		.light_pin={GPIOC,	GPIO_PIN_6},
	
	},
		},
	
		{
	.motor={.motor_pins={
		
	{GPIOB,	GPIO_PIN_9},
	{GPIOC,	GPIO_PIN_0},

			},
	.limit_pins={
	{GPIOC,	GPIO_PIN_1},
	{GPIOC,	GPIO_PIN_2},
	},
		.light_pin={GPIOC,	GPIO_PIN_3},
	
	},
		
	},

};

uint8_t lock_num=sizeof(m_lock)/sizeof(m_lock[0]);



int registerLock(){
	printf("lock_num = %d\n",lock_num);
	for(int i=0;i<lock_num;i++){
		printf("init %d start\n",i);
		motor_init(&(m_lock[i].motor));
		printf("init %d end\n",i);
	}
	
	return 0;
	
}

下发指令操作设备行为:


#ifdef ACTION_ENABLED
#include "action_config.c"

static void OnControlLockActionCallback(void *pClient, const char *pClientToken, DeviceAction *pAction){
	int i;
	sReplyPara replyPara;
	printf("__%s__\n",__func__);

	//do something base on input, just print as an sample
	DeviceProperty *pActionInput = pAction->pInput;
	for (i = 0; i < pAction->input_num; i++) {
		if (JSTRING == pActionInput[i].type) {
			Log_i("Input:[%s], data:[%s]",  pActionInput[i].key, pActionInput[i].data);
			HAL_Free(pActionInput[i].data);
		} else {
			if(JINT32 == pActionInput[i].type) {
				Log_i("Input:[%s], data:[%d]",  pActionInput[i].key, *((int*)pActionInput[i].data));
			} else if( JFLOAT == pActionInput[i].type) {
				Log_i("Input:[%s], data:[%f]",  pActionInput[i].key, *((float*)pActionInput[i].data));
			} else if( JUINT32 == pActionInput[i].type) {
				Log_i("Input:[%s], data:[%u]",  pActionInput[i].key, *((uint32_t*)pActionInput[i].data));
			}
		}
		
	//	sg_action_msg_arrived = true;
	}

	// construct output
	memset((char *)&replyPara, 0, sizeof(sReplyPara));
	replyPara.code = eDEAL_SUCCESS;
	replyPara.timeout_ms = QCLOUD_IOT_MQTT_COMMAND_TIMEOUT;
	strcpy(replyPara.status_msg, "action execute success!"); //add the message about the action resault


	DeviceProperty *pActionOutnput = pAction->pOutput;
	//(void)pActionOutnput; //elimate warning
	//TO DO: add your aciont logic here and set output properties which will be reported by action_reply
//	pole *p=getPole();
//	if(p == NULL){
//		sg_control_pole_out_result = 1;
//	}
	
	int road=*(int *)(pActionInput[0].data);
	int direction=*(int *)(pActionInput[1].data);
	printf("control %dth lock direction=%s\n",road,direction?"up":"down");
	
	lock *l=getLock(road);
	printf("get lock  %p\n",l);
	if(l == NULL){
		
		sg_control_lock_out_result = 1;
	}

	IOT_ACTION_REPLY(pClient, pClientToken, sg_data_report_buffer, sg_data_report_buffersize, pAction, &replyPara);
//	DeviceProperty *actionInput_control_pole=&pAction->pInput[0];
//	int direction=*(int *)actionInput_control_pole->data;
//	printf("control pole direction=%s\n",direction?"up":"down");
	
	
//	if(p){
//		poleAction(direction,p);
//	}
	if(l){
		lockAction(direction,l);
	}
	//smotor_start(direction);
}

static void OnControlPoleActionCallback(void *pClient, const char *pClientToken, DeviceAction *pAction)
{
	int i;
	sReplyPara replyPara;
	printf("__%s__\n",__func__);

	//do something base on input, just print as an sample
	DeviceProperty *pActionInput = pAction->pInput;
	for (i = 0; i < pAction->input_num; i++) {
		if (JSTRING == pActionInput[i].type) {
			Log_i("Input:[%s], data:[%s]",  pActionInput[i].key, pActionInput[i].data);
			HAL_Free(pActionInput[i].data);
		} else {
			if(JINT32 == pActionInput[i].type) {
				Log_i("Input:[%s], data:[%d]",  pActionInput[i].key, *((int*)pActionInput[i].data));
			} else if( JFLOAT == pActionInput[i].type) {
				Log_i("Input:[%s], data:[%f]",  pActionInput[i].key, *((float*)pActionInput[i].data));
			} else if( JUINT32 == pActionInput[i].type) {
				Log_i("Input:[%s], data:[%u]",  pActionInput[i].key, *((uint32_t*)pActionInput[i].data));
			}
		}
		
	//	sg_action_msg_arrived = true;
	}

	// construct output
	memset((char *)&replyPara, 0, sizeof(sReplyPara));
	replyPara.code = eDEAL_SUCCESS;
	replyPara.timeout_ms = QCLOUD_IOT_MQTT_COMMAND_TIMEOUT;
	strcpy(replyPara.status_msg, "action execute success!"); //add the message about the action resault


	DeviceProperty *pActionOutnput = pAction->pOutput;
	//(void)pActionOutnput; //elimate warning
	//TO DO: add your aciont logic here and set output properties which will be reported by action_reply
	
	pole *p=getPole();
	printf("get pole  %p\n",p);
	if(p == NULL){
		sg_control_pole_out_result = 1;
	}
	


	IOT_ACTION_REPLY(pClient, pClientToken, sg_data_report_buffer, sg_data_report_buffersize, pAction, &replyPara);
	DeviceProperty *actionInput_control_pole=&pAction->pInput[0];
	int direction=*(int *)actionInput_control_pole->data;
	printf("control pole direction=%s\n",direction?"up":"down");
	
	
	if(p){
		poleAction(direction,p);
	}

	//smotor_start(direction);
	
}
	
static void OnLightBlinkActionCallback(void *pClient, const char *pClientToken, DeviceAction *pAction)
{
	
	int i;
	sReplyPara replyPara;
	printf("__%s__\n",__func__);

	//do something base on input, just print as an sample
	DeviceProperty *pActionInput = pAction->pInput;
	for (i = 0; i < pAction->input_num; i++) {
		if (JSTRING == pActionInput[i].type) {
			Log_i("Input:[%s], data:[%s]",  pActionInput[i].key, pActionInput[i].data);
			HAL_Free(pActionInput[i].data);
		} else {
			if(JINT32 == pActionInput[i].type) {
				Log_i("Input:[%s], data:[%d]",  pActionInput[i].key, *((int*)pActionInput[i].data));
			} else if( JFLOAT == pActionInput[i].type) {
				Log_i("Input:[%s], data:[%f]",  pActionInput[i].key, *((float*)pActionInput[i].data));
			} else if( JUINT32 == pActionInput[i].type) {
				Log_i("Input:[%s], data:[%u]",  pActionInput[i].key, *((uint32_t*)pActionInput[i].data));
			}
		}
		
		sg_action_msg_arrived = true;
	}

	// construct output
	memset((char *)&replyPara, 0, sizeof(sReplyPara));
	replyPara.code = eDEAL_SUCCESS;
	replyPara.timeout_ms = QCLOUD_IOT_MQTT_COMMAND_TIMEOUT;
	strcpy(replyPara.status_msg, "action execute success!"); //add the message about the action resault


	DeviceProperty *pActionOutnput = pAction->pOutput;
	//(void)pActionOutnput; //elimate warning
	//TO DO: add your aciont logic here and set output properties which will be reported by action_reply


	IOT_ACTION_REPLY(pClient, pClientToken, sg_data_report_buffer, sg_data_report_buffersize, pAction, &replyPara);
}

static int _register_data_template_action(void *pTemplate_client)
{
	int i,rc;

    for (i = 0; i < TOTAL_ACTION_COUNTS; i++) {
	    rc = IOT_Template_Register_Action(pTemplate_client, &g_actions[i], g_actions[i].OnActionHandleCallback);
	    if (rc != QCLOUD_RET_SUCCESS) {
	        rc = IOT_Template_Destroy(pTemplate_client);
	        Log_e("register device data template action failed, err: %d", rc);
	        return rc;
	    } else {
	        Log_i("data template action=%s registered.", g_actions[i].pActionId);
	    }
    }

	return QCLOUD_RET_SUCCESS;
}
#endif

注册的时候会把每一个adction都注册一个回调函数.

服务器端:

服务器端代码太多了,直接贴一个图片显示一下启动流程:

服务器代码启动流程

小程序端:

小程序涉及的东西比较多,这里贴几个图片代表一下,具体所以的界面可以在下方PPT和视频里看到:

个人用户首页
商家首页

PPT和视频:

PPT:

本次大赛所制作的ppt在下方,点击左右箭头可以换页

IoT应用创新大赛作品-智能停车平台.pptx

视频:视频分为两个,一个是ppt讲解,还有一个项目演示视频,不喜欢听PPT废话的童鞋可以直接看演示视频

PPT讲解视频:

PPT录像的麦克风不太好,所以导致有的地方有破音,还有的地方不清晰,建议调大音量或者戴上耳机效果最好

视频内容

项目演示视频:

视频内容

致谢:

最后感谢腾讯提供的这个机会,让我有机会能真正使用上TencentOS和腾讯云这两款优秀的产品.

感谢观看.

原创声明,本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

登录 后参与评论
0 条评论

相关文章

  • 【IoT应用创新大赛】基于TencentOS tiny的 智能 家居总控系统

    ​首先,我要先讲一下概念,在传统的生活方式中呢,我们都是手动打开电器,亲自去检查门有没有关好,亲手去拉窗帘。 而到了现在,我们有了各种各样的智能电器,例如智能电...

    黑白方圆丶
  • 【IoT应用创新大赛】基于TencentOS的智能环境监测系统

    物联网( IoT ,Internet of things )即“万物相连的互联网”,是互联网基础上的延伸和扩展的网络,将各种信息传感设备与互联网结合起来而形成的...

    yyyyyyw
  • 入围名单公布!腾讯云IoT应用创新大赛火爆进行中!

    腾讯云IoT应用创新大赛是腾讯云面向物联网领域举办的大型竞赛,通过腾讯云IoT全链路产品能力,开放平台和服务,与广大开发者共同创新,孵化优秀的IoT产品和解决方...

    腾小云
  • 开发板免费领!腾讯云IoT应用创新大赛正式启动!

    腾讯云IoT应用创新大赛是腾讯云面向物联网领域举办的大型竞赛,通过腾讯云IoT全链路产品能力,开放平台和服务,与广大开发者共同创新,孵化优秀的IoT产品和解决方...

    腾讯云物联网团队
  • 【IoT应用创新大赛】智能快递箱的设计与实现

    物联网时代的来临给生活带了科技感,让生活充满了便捷,在物流领域产生了重要的推动作用。可以说,物联网是开启物流信息化整合的时代引擎,谁抓住了物联网,谁就抓住了物流...

    吕昉
  • 【IoT应用创新大赛】基于LoRa的智慧办公场景方案

    随着物联网技术的发展,越来越多的应用需求被提及,整个物联网产业链的基础设施也得到快速发展。以腾讯、阿里为首的头部云计算企业,纷纷推出了物联网设备接入的基础设施(...

    古月瘦水
  • 【IoT应用创新大赛】基于LoRa的机房环境监控案例

    LoRa是semtech公司创建的低功耗局域网无线标准,低功耗一般很难覆盖远距离,远距离一般功耗高,LoRa的名字就是远距离无线电(Long Ra...

    极速紫韵
  • 【IoT应用创新大赛】基于LoRa与机械臂的家居系统

    物联网是一种连接各种各样的传感器的网络,与之对应的是20世纪60年代开始研究的计算机网络,后者将分散于不同地理位置的计算机连接起来。物联网传感器可以采集的信息包...

    羽翰尘
  • AIoT应用创新大赛-keil开发--(2)移植TencentOS tiny与对接腾讯云IoT

    在上一篇中,我们利用MCUXpresso Config Tools生出来一个Hello World 的裸机工程,这一篇将在Keil环境下移植TencentOS ...

    烫烫烫烫烫烫锟斤拷
  • 【IoT应用创新大赛】基于LoRa和Tiny OS的液化气智能充装系统

    目前,常见的液化气充装系统是充装人员根据开票人员提供的充值小票来给液化气罐定量的充值,这种充装方式受充装人员的操作影响较大,容易受到充装人员误操作导致的多充或少...

    用户5927942
  • 【IOT应用创新大赛】基于 EVB_MX_Plus 的盆栽土壤监测

    注:因社区编辑器限制,完整文章详见:【IOT应用创新大赛】基于 EVB_MX_Plus 的盆栽土壤监测

    远哥制造
  • AIoT应用创新大赛-基于TencentOS Tiny的智能车钥匙

    UWB数字钥匙是全新的无钥匙进入系统,在接近车辆时,根据距离车辆会自动首先开启迎宾灯,然后随着距离的接近,会自动调整座椅位置等,然后靠近车门时,则自动解锁;当远...

    大盛
  • 【腾讯连连IoT开发大赛】基于TencentOS Tiny的智能甲醛探测与云打印系统

    达特甲醛探测仪是基于英国达特公司设计开发的WZ-S型甲醛检测模组设计开发的,它可以用于检测环境中甲醛的浓度,以提示用户运用科学有效的方法降低甲醛污染,进而使环境...

    杨源鑫
  • AIoT应用创新大赛-基于TencentOS Tiny的智能车钥匙

    UWB数字钥匙是全新的无钥匙进入系统,在接近车辆时,根据距离车辆会自动首先开启迎宾灯,然后随着距离的接近,会自动调整座椅位置等,然后靠近车门时,则自动解锁;当远...

    大盛
  • AIoT应用创新大赛-基于TencentOS Tiny 的智能图书漂流箱

    基于TencentOS Tiny,实现自动登记图书漂流会员和图书,并自动绑定人物与书籍的所属关系,留存开锁取放图书的视频监控截图,登记到图书漂流网。另外,实现自...

    三宝殿
  • 【AIoT应用创新大赛-基于TencentOS Tiny 的智能取暖器】

    取暖器在我们日常生活中已经很常见了,冬天的保命法宝,但是平时浏览新闻的时候发现因取暖器使用不当造成人身财产安全问题的事件频频出现,严重的威胁到生命安全,基于此种...

    物联风景
  • AIoT应用创新大赛-基于TencentOS Tiny 的智能家居中控

    随着科技水平的不断提高,生活水平的改善,智能家居产品正在不断走进日常生活。智能家居可以让家电更智能,更能让生活更舒适。智能家居也是互联网不断深化发展的产物。互联...

    羽翰尘
  • 【IoT应用创新大赛】基于TencentOS tiny与LoRa SX1301的LoRaWAN协议分析工具

    从2013年Semtech公司发布第一代商用LoRa芯片以来,LoRa技术经受住了物联网行业的考验,凭借其低功耗远距离等技术优势,近几年在全球物联网无线通信的细...

    forest-rain

扫码关注腾讯云开发者

领取腾讯云代金券