物联网仓储系统

上传人:痛*** 文档编号:131328766 上传时间:2022-08-06 格式:PPTX 页数:42 大小:781.98KB
收藏 版权申诉 举报 下载
物联网仓储系统_第1页
第1页 / 共42页
物联网仓储系统_第2页
第2页 / 共42页
物联网仓储系统_第3页
第3页 / 共42页
资源描述:

《物联网仓储系统》由会员分享,可在线阅读,更多相关《物联网仓储系统(42页珍藏版)》请在装配图网上搜索。

1、物联网仓储系统项目组员:董亚军 郝贤森 赵星达 姜兆勇 张超 刘继琛 张立东汇报人:董亚军项目分工:主线程:董亚军郝贤森系统移植:赵星达M0:张立东姜兆勇Web、CGI:刘继琛 张超物联网介绍物联网是新一代信息技术的重要组成部分。其英文名称是“The Internet of things”。由此,顾名思义,“物联网就是物物相连的互联网”。这有两层意思:第一,物联网的核心和基础仍然是互联网,是在互联网基础上的延伸和扩展的网络;第二,其用户端延伸和扩展到了任何物品与物品之间,进行信息交换和通信。物联网就是“物物相连的互联网”。物联网通过智能感知、识别技术与普适计算、泛在网络的融合应用,被称为继计算

2、机、互联网之后世界信息产业发展的第三次浪潮。物联网是互联网的应用拓展,与其说物联网是网络,不如说物联网是业务和应用。因此,应用创新是物联网发展的核心,以用户体验为核心的创新2.0是物联网发展的灵魂。物联网定义最初在1999年提出:即通过射频识别(RFID)、红外感应器、全球定位系统、激光扫描器、气体感应器等信息传感设备,按约定的协议,把任何物品与互联网连接起来,进行信息交换和通讯,以实现智能化识别、定位、跟踪、监控和管理的一种网络。简而言之,物联网就是“物物相连的互联网”。物联网定义 中国物联网校企联盟将物联网的定义为当下几乎所有技术与计算机、互联网技术的结合,实现物体与物体之间:环境以及状态

3、信息实时的实时共享以及智能化的收集、传递、处理、执行。广义上说,当下涉及到信息技术的应用,都可以纳入物联网的范畴。项目总流程项目简介 通过web端远程访问服务器,达到对数据的采集,查看实时的仓库信息。发生异常时进行报警、做出相应的处理。通过web端远程控制,当货物的进出仓库时进行记录。这个方案主要用到了下面的技术:物联网仓储系统设计的技术 Linux设备驱动 Zigbee无线技术与RFID技术 传感器技术(温度、光线、湿度、重力感应等)Cortex-M0 ARM 微控制器技术 I2C、SPI、中断、单总线、A/D、PWM、UART等多种接口技术 监控及视频流处理技术 GPRS远程报警技术(未完

4、成)嵌入式Web服务器技术 处理客户请求(CGI)技术 数据库技术(sqlite3)wifi技术(sqlite3)(未完成)html页面显示技术全局结构体定义/仓库货物信息struct storage_goods_infounsigned char goods_type;/货物类型,用数字表示unsigned int goods_count;/货物数量;全局结构体定义/某个仓库的全部信息struct storage_infounsigned char storage_status;unsigned char led_status;unsigned char buzzer_status;unsi

5、gned char fan_status;unsigned char seg_status;signed char x;signed char y;signed char z;float temperature;float temperatureMIN;全局结构体定义float temperatureMAX;float humidity;float humidityMIN;float humidityMAX;float illumination;float illuminationMIN;float illuminationMAX;float battery;float adc;struct

6、storage_goods_info goods_infoGOODS_NUM;全局结构体定义/所有仓库的信息结构体struct env_info_clien_addrstruct storage_info storage_noSTORAGE_NUM;/消息队列结构体struct msglong type;/从消息队列接收消息时用于判断的消息类型long msgtype;/具体的消息类型unsigned char textQUEUE_MSG_LEN;/消息正文;用到的线程其中用到的线程如下:pthread_client_request():处理消息队列里请求的线程.pthread_refresh

7、():更新共享内存里的实时数据.pthread_sqlite():数据库线程.pthread_transfer():接收M0数据线程.pthread_analysis():M0数据分析线程.pthread_sms():短信模块控制线程.(未使用)pthread_buzzer():A9蜂鸣器控制线程.pthread_led():A9LED模块线程.pthread_camera():摄像头模块控制线程.线程和进程的区别:线程:是一种轻量级进程,线程存在于进程中。线程和进程一样都会被操作系统调度(时间片)通常线程指的是共享相同地址空间的多个任务。线程优势:线程运行时,相互切换效率高;线程之间共享数据

8、很方便。进程拥有独立的运行空间,一个进程崩溃后,在保护模式下并不会影响其他的进程。一个进程中可以包含有多个线程,而一个线程只能包含在进程中。一个线程拥有自己独有的局部变量栈,但是没有独立的空间,一个进程中多个线程共同共享一块资源,因此当一个线程崩溃后此进程也会崩溃。因此多进程要比多线程健壮性要好,但是,多进程效率比较低。当需要并行操作和共享某些变量最好使用多线程的模式。线程创建:创建一个线程int pthread_create(pthread_t*thread,const pthread_attr_t *attr,void*(*routine)(void*),void*arg)参数:threa

9、d,线程的标识符(类似于进程的pid号)attr,用于指定创建的线程的属性,通常为NULL(不需要设置)routine,函数指针,该函数就是线程主体 arg,就是传递给函数的参数。返回值:成功返回0,失败返回非负的错误号线程 int pthread_exit(void*value_ptr)功能:只会导致当前线程的退出函数 参数:就是传递的退出状态(指针)通常使用:pthread_exit(0);返回值:成功返回0,失败返回非负的错误号进程对已经退出的线程必须要做回收线程资源的操作(否则会产生僵尸线程)int pthread_join(pthread_t thread,void*value_pt

10、r)功能:阻塞等待回收退出的线程的资源参数:thread,就是指定要回收的线程资源 value_ptr,就是接收到线程的退出状态。返回值:成功返回0,失败返回非负的错误号 线程的控制控制线程:互斥锁:主要用来保护临界资源(可是变量,后者是代码段)任何时刻最多只能有一个线程能访问该资源相关函数接口:int pthread_mutex_init(pthread_mutex_t *mutex,pthread_mutexattr_t*attr)功能:锁的初始化函数,即生成一把锁参数:mutex,是锁的标识符 attr,设置锁的属性,通常为NULL。返回值:返回值:成功返回0,失败返回非负的错误号 线程

11、控制int pthread_mutex_lock(pthread_mutex_t*mutex)功能:阻塞等待直到这把锁申请成功为止,对临界资源进行上锁操作参数:mutex,就是指定的一把锁 返回值:成功返回0,失败返回非负的错误号int pthread_mutex_unlock(pthread_mutex_t*mutex)功能:对临界资源进行解锁操作参数:mutex,就是指定要解开的锁 返回值:成功返回0,失败返回非负的错误号 int pthread_mutex_destroy(pthread_mutex_t*mutex);功能:销毁一把指定的锁参数:mutex,就是指定要销毁的锁 返回值:成

12、功返回0,失败返回非负的错误号注意:为了避免死锁:在申请多把锁时,所有的线程都按照同样的顺序去申请。线程之间的通信-条件变量 int pthread_cond_init(pthread_cond_t*restrict cond,const pthread_condattr_t*restrict attr);功能:初始化一个条件变量 参数:cond,就是条件变量的标识符 attr,通常为NULL即可 返回值:成功返回0,失败返回非负的错误号 int pthread_cond_wait(pthread_cond_t*restrict cond,pthread_mutex_t*restrict mu

13、tex);功能:条件睡眠,直到被指定的条件唤醒为止参数:cond,就是指定睡眠 条件,将来被唤醒时也必须满足该条件 mutex,该函数睡眠时必须提前加上一把锁 注意:该睡眠函数调用之前必须先加上一把锁,然后进入睡眠,然后该函数内部 将锁解开;当该函数被唤醒时,需要重新加上这把锁,如果发现这把锁被其他线程 占用,那么该函数的唤醒操作就失败了,继续睡眠。返回值:成功返回0,失败返回非负的错误号 线程之间的通信-条件变量int pthread_cond_signal(pthread_cond_t*cond);功能:就是唤醒睡眠在cond条件上的线程,但是只能唤醒一个线程参数:cond,就是指定要唤醒

14、的条件返回值:成功返回0,失败返回非负的错误号 int pthread_cond_broadcast(pthread_cond_t*cond);功能:唤醒所有睡眠这个条件上的线程int pthread_cond_destroy(pthread_cond_t*cond);功能:就是销毁条件变量 处理消息队列请求线程消息对列创建/打开消息队列对象int msgget(key_t key,int flag);参数:key,ftok()函数的返回值,用于确保多个进程操作同一个消息队列 flag,IPC_CREAT IPC_EXCL 和共享内存一样返回值:成功返回消息队列的标识符,失败-1比如:msgg

15、et(key,IPC_CREAT|IPC_EXCL|0666);消息对列int msgsnd(int msqid,const void*msgp,size_t msgsz,int msgflg);参数:msgid,msgget的返回值 msgp,要发送的数据的指针,有指定的数据格式。struct msgbuf long mtype;/*message type,must be 0*/数据类型,可以自定义;/*message data*/int a;char b;float f;msgsz,发送的消息的正文的长度=sizeof(struct msgbuf)-sizeof(long)msgflg,

16、IPC_NOWAIT 以非阻塞方式发送消息,如果发送不成功,那么不会阻塞,立刻返回。0(常用),以阻塞方式发送消息,如果发送不成功,那么阻塞等待,直到发送成功为止。返回值:成功0,失败-1消息队列ssize_t msgrcv(int msqid,void*msgp,size_t msgsz,long msgtyp,int msgflg);参数:msqid,msgget的返回值 msgp,用于接收读取到的消息,固定格式,必须和发送的类型保持一致。msgsz,仍然要接收的消息的正文长度 msgtyp,0,表示读取第一条消息 0,表示读取指定类型消息(最常用)0,接收消息队列中类型值不小于msgty

17、p的绝对值且类型值又最小的消息 msgflg,IPC_NOWAIT 以非阻塞方式接收消息,如果接收不成功,那么不会阻塞,立刻返回。0(常用),以阻塞方式接收消息,如果接收不成功,那么阻塞等待,直到接收成功为止。返回值:实际接收到的消息的正文的字节个数,失败-1.消息对列消息队列的控制函数int msgctl(int msgqid,int cmd,struct msqid_ds*buf);参数:msgqid,就是控制的消息队列 cmd:IPC_STAT (获取对象属性),属性保存在第三个参数上 IPC_SET(设置对象属性),第三个参数保存的是要修改的属性 IPC_RMID(删除对象),此时第三

18、个参数为NULL即可返回值:返回值和cmd有关系,失败-1.共享内存共享内存共享内存:是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝注意:由于多个进程共享一段内存,因此也需要依靠某种同步机制来控制对它的写操作,如互斥锁和信号量等#include key_t ftok(const char*pathname,int proj_id);功能:就是生成key值。参数:pathname,任意一个存在的路径都可以 proj_id,只要低8位(二进制)不全为0的数都可以返回值:成功key值,失败-1.比如:key=ftok(.,a);共享内存创建/打开共享内存:创建于当前系统

19、上,保存到系统关闭为止。int shmget(key_t key,int size,int shmflg);参数:key,用于唯一的标识一块共享内存,将来其他进程需要使用一样的key值。IPC_PRIVATE,表示该物理空间只能自己用,无法和其他进程共享。ftok()函数的返回值 size,要申请的共享内存物理空间,/usr/inclue/linux/shm.h中包含限制 shmflg,IPC_CREAT IPC_EXCLIPC_CREAT 如果共享内存不存在,则创建一个共享内存,否则打开操作。IPC_EXCL 只有在共享内存不存在的时候,新的共享内存才建立,否则就产生错误。返回值:就是共享内

20、存的标识符(大于0),失败-1.比如:key=ftok(.,a);int shmid;shmid=shmget(key,512,IPC_CREAT|IPC_EXCL|0666);共享内存映射共享内存,即把指定的共享内存映射到进程的地址空间用于访问void*shmat(int shmid,const void*shmaddr,int shmflg);参数:shmid,就是shmget的返回值 shmaddr,用于指定共享内存映射到当前进程的那个起始地址上 如果为NULL,那么系统帮助进程分配(最常用)如果非NULL,那么就是自己指定(必须保证这块空间没有被使用)shmflg,指定进程对该内存区域

21、的读写权限 如果为SHM_RDONLY,那么当前进程只读 如果为0,那么当前进程可读可写(最常用)返回值:返回当前进程和共享内存映射后的起始地址 失败返回的为(void*)(-1)共享内存撤销共享内存映射int shmdt(const void*shmaddr);参数:shmaddr,就是shmat的返回值返回值:成功0,失败-1操作共享内存对象int shmctl(int shmid,int cmd,struct shmid_ds *buf);/获取共享内存的状态,并把相关的属性赋值给buf功能:控制共享内存对象参数:shmid,shmget的返回值 cmd:IPC_STAT (获取对象属性

22、),属性保存在第三个参数上 IPC_SET(设置对象属性),第三个参数保存的是要修改的属性 IPC_RMID(删除对象),此时第三个参数为NULL即可返回值:返回值和cmd有关系,失败-1.比如:shmctl(shmid,IPC_RMID,NULL);访问共享内存创建/打开信号量集合int semget(key_t key,int nsems,int semflg);参数:key,ftok()返回值 nsems,指定的信号量集合中的信号量个数 semflg,IPC_CREAT IPC_EXCLIPC_CREAT 如果共享内存不存在,则创建一个共享内存,否则打开操作。IPC_EXCL 只有在共享

23、内存不存在的时候,新的共享内存才建立,否则就产生错误。返回值:返回该集合的标识符,失败-1.int semctl(int semid,int semnum,int cmd,.);功能:信号量集合的控制参数:semid,指定要操作的集合 semnum,要操作的信号量的编号,编号从0开始 cmd,GETVAL:获取信号灯的值,返回值是获得值。比如:value=semctl(semid,0,GETVAL);SETVAL:设置信号灯的值,需要用到第四个参数。因此在设置信号灯的值时应该及时的设置共用体semun的值 第四个参数类型如下:union semun int val;/*Value for SE

24、TVAL*/struct semid_ds*buf;/*Buffer for IPC_STAT,IPC_SET*/unsigned short *array;/*Array for GETALL,SETALL*/struct seminfo *_buf;/*Buffer for IPC_INFO (Linux-specific)*/;int semop(int semid,struct sembuf *opsptr,unsigned nops);功能:就是对信号量集合中的信号量进行PV操作参数:semid,指定要操作的集合 opsptr,struct sembuf unsigned short

25、 sem_num;/*semaphore number*/short sem_op;/*semaphore operation*/short sem_flg;/*operation flags*/;成员分析:sem_num 表示要操作的信号量的编号 sem_op,表示进行P或者V操作,比如:sem_op=10(+10)sem_op=-10(-10)sem_op=0,那么semop函数会等到该信号量的值变为0为止。sem_flg,0(最常用的),表示semop函数的操作是阻塞的,直到成功为止。IPC_NOWAIT,表示semop函数的操作是非阻塞的,如果操作没有成功,立刻返回。SEM_UNDO(

26、不常用),设置只对当前进程有效,不会保存到系统的信号量集合中。nops,调用一次semop要操作的信号量的个数返回值:成功0,失败-1 linux 管道、消息队列、共享内存的对比 管道的优点是不需要加锁,缺点是默认缓冲区太小,只有4K,同时只适合父子进程间通信,而且一个管道只适合单向通信,如果要双向通信需要建立两个。而且不适合多个子进程,因为消息会乱,它的发送接收机制是用read/write这种适用流的,缺点是数据本身没有边界,需要应用程序自己解释,而一般消息大多是一个固定长的消息头,和一个变长的消息体,一个子进程从管道read到消息头后,消息体可能被别的子进程接收到linux 管道、消息队列

27、、共享内存的对比 消息队列也不要加锁,默认缓冲区和单消息上限都要大一些,在我的suse10上是64K,它并不局限于父子进程间通信,只要一个相同的key,就可以让不同的进程定位到同一个消息队列上,它也可以用来给双向通信,不过稍微加个标识,可以通过消息中的type进行区分,比如一个任务分派进程,创建了若干个执行子进程,不管是父进程发送分派任务的消息,还是子进程发送任务执行的消息,都将type设置为目标进程的pid,因为msgrcv可以指定只接收消息类型为type的消息,这样就实现了子进程只接收自己的任务,父进程只接收任务结果linux 管道、消息队列、共享内存的对比 共享内存的几乎可以认为没有上限

28、,它也是不局限与父子进程,采用跟消息队列类似的定位方式,因为内存是共享的,不存在任何单向的限制,最大的问题就是需要应用程序自己做互斥,有如下几种方案1 只适用两个进程共享,在内存中放一个标志位,一定要声明为volatile,大家基于标志位来互斥,例如为0时第一个可以写,第二个就等待,为1时第一个等待,第二个可以写/读2 也只适用两个进程,是用信号,大家等待不同的信号,第一个写完了发送信号2,等待信号1,第二个等待信号2,收到后读取/写入完,发送信号1,它不是用更多进程是因为虽然父进程可以向不同子进程分别发送信号,但是子进程收到信号会同时访问共享内存,产生不同子进程间的竞态条件,如果用多块共享内

29、存,又存在子进程发送结果通知信号时,父进程收到信号后,不知道是谁发送,也意味着不知道该访问哪块共享内存,即使子进程发送不同的结果通知信号,因为等待信号的一定是阻塞的,如果某个子进程意外终止,父进程将永远阻塞下去,而不能超时处理3 采用信号量或者msgctl自己的加锁、解锁功能,不过后者只适用于linuxlinux 管道、消息队列、共享内存的对比 总结:管道是最弱的,只适合有限场景;消息队列能适合大部分场景,缺点是默认缓冲也比较小,不过这个可以调整,前提是你有管理员权限;共享内存是最强大的,只是要做互斥遇见问题1.线程之间的通信采用的条件变量的形式(注意加锁)2.信号量的使用注意初始化时不能多次

30、初始化的。3.不能通讯:ipcs-m 查看当前系统上的共享内存 ipcrm-m shmid 删除共享内存标识符shmid的共享内存 在程序中可以使用system(“ipcs-m”),注意system不可传参数 ipcs-q 查看当前系统上存在的消息队列对象 ipcrm-q msgid 删除当前系统上指定的消息队列对象 ipcs-s 查看当前系统上存在信号量集合 ipcrm-s semid 删除当前系统上指定id的信号量集合总结物联网仓储系统基本上郎阔了嵌入式的大部分知识,通过自己编写对一个实例化的项目对嵌入式有了比较清晰地认识。对自己的认知和以后的学习起到了引领作用。感谢各位老师在这段时间的教导,同时感谢各位同学,这段时间相处的非常愉快。演讲完毕,谢谢观看!

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!