本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页
最热资讯


作者:吴顶顶
随着科技的进步和互联网的发展,基于物联网的可拍照设备也越来越多的融入到人们的生活中来,例如在超市中,管理者利用拍照设备定时抓取货架照片,分析货物状态,并补充、优化货物摆放;在酒吧里,管理者会利用拍照设备定时抓拍酒架照片,传送到网络平台供大众浏览,以招揽更多顾客。本网络照相机基于STM32H7+RTThread平台,采集摄像头数据,并通过无线网络传送到服务器,提供SD卡配网、手动拍摄、定时拍摄、照片推送等功能,并提供windows上位机提供控制和照片显示功能。
主要功能有:
格式化sd卡:格式化sd卡,但是会保留网络配置文件,其他文件全部删除
设备重启:重启设备
实时拍照:发送指令给照相机,照相机拍照,并把照片回传
定时拍照:照相机依据下发的拍照时间,在时间到达时拍摄一张照片,并传给服务器
按键拍照:点击板上用户按钮,拍摄一张照片,并传给服务器
定时任务:可以新建/删除/查询定时拍照任务,任务存储在sd卡中,重启有效
硬件:ART-PI(STM32H750主控)+ OV2640模组
RT-Thread版本:4.0.3
SDK 版本:1.0.1
开发工具及版本:RT-Thread Studio 1.1.5, Qt5.14.0
内核部分:调度器,信号量,互斥锁,内存管理
调度器:多任务调度
信号量:用于唤醒对应任务
互斥锁:用于互斥资源独占访问
内存管理:动态内存申请与释放
组件部分:虚拟文件系统,IPC,I2C,RTC,NTP
虚拟文件系统:文件操作,sd卡、照片文件
IPC:mqtt发送数据需要
I2C:配置摄像头模块需要
RTC和NTP:同步时间
软件包部分:paho mqtt,cJSON,netutils
pahomqtt:用于和服务器通信
cJSON:解析、封装mqtt消息
netutils:NTP网络对时
其他:base64
用于将图片文件转换成字符串,便于mqtt传输
总体的硬件框架如下图所示:
本网络摄像机硬件结果较为简单,即art-pi连接一个摄像头模组,art-pi板上用到了AP6212无线模块,外部内存,led指示灯,和sd卡。其中,摄像头模块用于采集图像信号;AP6212用于和服务器进行通信;因一张图像数据量较大,片内内存不够,故而使用外部内存;led灯用于指示设备工作状态;sd卡用于保存网络、服务器、和定时任务配置。
整体的软件框架如下图所示,网络照相机内部有一个proxy线程,负责和云端进行通信,在接收到云端消息后会解析,并分发到其他的线程执行,然后将执行结果返回到云端;照相机发生了其他的事件,例如用户按键拍照,也会将数据传给proxy线程,proxy线程再将数据发送到云端。用户通过上位机终端软件连接上云服务器,实现与照相机的通信及控制。
整个系统支持接入多个照相机,如下图所示,不同的照相机通过sd卡配置文件中sn进行区分,上位机软件可以显示所有在线的照相机,但同一时间只支持操作一个。
如下图所示为用户线程创建流程
用户线程作用描述如下:
main:用于创建sd_card 线程,检测按键事件,闪灯;
sd_card:用于管理与sd卡相关的工作,包括拍照,网络配置,定时任务;
network:负责联网,根据sd卡的配置文件连接到指定的wifi网络;
proxy:负责启动mqtt,并管理与云端的通信,其他线程都需要通过proxy线程与云端交互数据;
event:定时任务和按键任务,在定时时间到达时,或者用户按键时拍摄照片并通过proxy上传云端。
设备向服务器订阅主题:
/ter/query/discovery
,用于接收设备发现消息
/ter/sn/request
,用于接收针对该设备的指令,其中sn
为设备的SN号,下同
客户端向服务器订阅主题:
/dev/response/discovery
,用于接收设备发现回复
/dev/response/will
,用于接收设备遗嘱消息
/dev/sn/response
,用于接收设备操作指令回复
/dev/sn/event
,用于接收设备的通知
所有的设备均订阅/ter/query/discovery
主题,客户端向该主题发布发现消息,所有收到消息的设备向/dev/response/discovery
回复一条消息,而客户端又订阅了/dev/response/discovery
主题,故而便可以知道哪些设备在线了。
设备连上服务器的时候,会定义一个遗嘱消息,主题为/dev/sn/will
,客户端订阅了该主题,当设备因为某些原因掉线,则超过一定时间之后,客户端便可收到该消息,进而知道该设备掉线。
/ter/query/discovery
{
"params": {
"code": "0x01",
"param": {}
},
"ecode": 0
}
/dev/response/discovery
{
"params": {
"code": "0x01",
"sn":"SN-1234",
"param": {
"ip":"192.168.1.100",
"mac":"01:0F:0A:0B"
}
},
"ecode":0
}
/dev/response/will
{
"params": {
"code": "0x11",
"sn": "SN-1234",
"param": {}
},
"ecode":0
}
客户端订阅/dev/sn/response
,并通过 /ter/sn/request
发送请求指令,设备端订阅 /ter/sn/request
,并通过/dev/sn/response
返回操作结果,进而实现客户端对设备端的操作。
客户端和设备端通过消息中的code
字段区分不同的操作。
/ter/sn/request
{
"params": {
"code": "0x21",
"param": {}
},
"ecode":0
}
/dev/sn/response
{
"params": {
"code": "0x21",
"sn": "SN-1234",
"param": {
"action":1 //1,重启;0,不重启
}
},
"ecode":0
}
/ter/sn/request
{
"params": {
"code": "0x22",
"param": {}
},
"ecode":0
}
/dev/sn/response
{
"params": {
"code": "0x22",
"sn": "SN-1234",
"param": {
"result":1 //1,成功;0,失败
}
},
"ecode":0
}
/ter/sn/request
{
"params": {
"code": "0x23",
"param": {}
},
"ecode":0
}
/dev/sn/response
{
"params":{
"code": "0x23",
"sn": "SN-1234",
"param": {
"result":1, //截图结果,1-成功,0-失败
"time":1235,
"pic":"xxxx" //base64编码后的图片字符串,成功时才有
}
},
"ecode":0
}
/ter/sn/request
{
"params":{
"code": "0x24",
"param": {
"total": 3,
"time_list":[
1234,
1244,
1254
]
}
},
"ecode":0
}
/dev/sn/response
{
"params": {
"code":"0x24",
"sn": "SN-1234",
"param":{
"result":0
}
}
"ecode":0
}
/ter/sn/request
,sn
为设备的SN号
{
"params": {
"code": "0x25",
"param":{}
}
"ecode":0
}
/dev/sn/response
{
"params": {
"code":"0x25",
"sn":"SN-1234",
"param": {
"result":1, 1--查询正常,0--查询出错
"total":3,
"time_list":[
1234,
1244,
1254
]
}
},
"ecode":0
}
/ter/sn/request
{
"params": {
"code": "0x26"
"param":{
"total":3,
"time_list":[
1234,
1244,
1254
]
}
}
"ecode":0
}
/dev/sn/response
{
"params": {
"code":"0x26",
"sn":"SN-1234",
"param": {
"result":0
}
},
"ecode":0
}
客户端订阅/dev/sn/event
主题,当设备端发生某些事件(目前只有定时拍照事件和按键拍照事件)的时候,向该主题发布一条消息,客户端进而刷新显示。
/dev/sn/event
,sn
为设备的SN号
{
"params": {
"code":"0xF0",
"sn":"SN-1234",
"param": {
"type":0, //1,定时截图; 2,按键截图
"pic":"xxx"
}
}
"ecode":0
}
演示视频:
拍照功能
定时拍照任务
实物图
本次比赛主要学习了RT-Thread嵌入式操作系统的使用方法,学习了RT-Thread线程创建以及线程通信方法,学习了stm32 dcmi接口获取摄像头图像的方法。
在项目的过程中遇到了很多困,有些解决了,典型的有一下两个:
也有一些问题没能解决,最后通过其他手段绕过去了,典型有:
本次比赛让我认识到学无止尽,开源世界需要我们每个人都添砖加瓦,才能变得更好。
电路城所有电路均源于网友上传或网上搜集,供学习和研究使用,其版权归原作者所有,对可以提供充分证据的侵权信息,本站将在确认后24小时内删除。对本电路进行投诉建议,点击 投诉本电路 反馈给电路城。
直接使用附件资料或需要对资料PCB板进行打样的买家,请先核对资料的完整性,如果出现问题,电路城不承担任何经济损失!
小而强劲,博世Bosch GO电动螺丝刀评测拆解——放手也是一种美
2017-12-29
小米米家智能摄像机云台版拆解——表里如一,良心品质
2017-06-01
小可爱,大前途?—亚马逊echo dot二代全面评测
2017-03-27
购买后评价此方案,将获电路城官方赠送的最高6折折扣码一份,可至您的个人中心-我的折扣码中查看,用于低价购买其他方案内容。