物聯(lián)網(wǎng)倉儲系統(tǒng)_第1頁
物聯(lián)網(wǎng)倉儲系統(tǒng)_第2頁
物聯(lián)網(wǎng)倉儲系統(tǒng)_第3頁
物聯(lián)網(wǎng)倉儲系統(tǒng)_第4頁
物聯(lián)網(wǎng)倉儲系統(tǒng)_第5頁
已閱讀5頁,還剩35頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、項目組員:項目組員: 董亞軍董亞軍 郝賢森郝賢森 趙星達趙星達 姜兆勇姜兆勇 張超張超 劉繼琛劉繼琛 張立東張立東匯報人:匯報人:董亞軍董亞軍項目分工:項目分工:n主線程:董亞軍郝賢森n系統(tǒng)移植:趙星達nM0:張立東 姜兆勇nWeb、CGI:劉繼琛 張超物聯(lián)網(wǎng)介紹物聯(lián)網(wǎng)介紹n物聯(lián)網(wǎng)是新一代信息技術(shù)的重要組成部分。其英文名稱是“The Internet of things”。由此,顧名思義,“物聯(lián)網(wǎng)就是物物相連的互聯(lián)網(wǎng)”。這有兩層意思:第一,物聯(lián)網(wǎng)的核心和基礎(chǔ)仍然是互聯(lián)網(wǎng),是在互聯(lián)網(wǎng)基礎(chǔ)上的延伸和擴展的網(wǎng)絡(luò);第二,其用戶端延伸和擴展到了任何物品與物品之間,進行信息交換和通信。物聯(lián)網(wǎng)就是“物物相連

2、的互聯(lián)網(wǎng)”。物聯(lián)網(wǎng)通過智能感知、識別技術(shù)與普適計算、泛在網(wǎng)絡(luò)的融合應(yīng)用,被稱為繼計算機、互聯(lián)網(wǎng)之后世界信息產(chǎn)業(yè)發(fā)展的第三次浪潮。物聯(lián)網(wǎng)是互聯(lián)網(wǎng)的應(yīng)用拓展,與其說物聯(lián)網(wǎng)是網(wǎng)絡(luò),不如說物聯(lián)網(wǎng)是業(yè)務(wù)和應(yīng)用。因此,應(yīng)用創(chuàng)新是物聯(lián)網(wǎng)發(fā)展的核心,以用戶體驗為核心的創(chuàng)新2.0是物聯(lián)網(wǎng)發(fā)展的靈魂。物聯(lián)網(wǎng)定義物聯(lián)網(wǎng)定義n最初在1999年提出:即通過射頻識別(RFID)、紅外感應(yīng)器、全球定位系統(tǒng)、激光掃描器、氣體感應(yīng)器等信息傳感設(shè)備,按約定的協(xié)議,把任何物品與互聯(lián)網(wǎng)連接起來,進行信息交換和通訊,以實現(xiàn)智能化識別、定位、跟蹤、監(jiān)控和管理的一種網(wǎng)絡(luò)。簡而言之,物聯(lián)網(wǎng)就是“物物相連的互聯(lián)網(wǎng)”。物聯(lián)網(wǎng)定義物聯(lián)網(wǎng)定義n 中

3、國物聯(lián)網(wǎng)校企聯(lián)盟將物聯(lián)網(wǎng)的定義為當下幾乎所有技術(shù)與計算機、互聯(lián)網(wǎng)技術(shù)的結(jié)合,實現(xiàn)物體與物體之間:環(huán)境以及狀態(tài)信息實時的實時共享以及智能化的收集、傳遞、處理、執(zhí)行。廣義上說,當下涉及到信息技術(shù)的應(yīng)用,都可以納入物聯(lián)網(wǎng)的范疇。項目總流程項目總流程項目簡介項目簡介n 通過web端遠程訪問服務(wù)器,達到對數(shù)據(jù)的采集,查看實時的倉庫信息。發(fā)生異常時進行報警、做出相應(yīng)的處理。n 通過web端遠程控制,當貨物的進出倉庫時進行記錄。n n 這個方案主要用到了下面的技術(shù):物聯(lián)網(wǎng)倉儲系統(tǒng)設(shè)計的技術(shù)物聯(lián)網(wǎng)倉儲系統(tǒng)設(shè)計的技術(shù) Linux設(shè)備驅(qū)動 Zigbee無線技術(shù)與RFID技術(shù) 傳感器技術(shù)(溫度、光線、濕度、重力感應(yīng)

4、等) Cortex-M0 ARM 微控制器技術(shù) I2C、SPI、中斷、單總線、A/D、PWM、UART等多種接口技術(shù) 監(jiān)控及視頻流處理技術(shù) GPRS遠程報警技術(shù)(未完成) 嵌入式Web服務(wù)器技術(shù) 處理客戶請求(CGI)技術(shù) 數(shù)據(jù)庫技術(shù)(sqlite3) wifi技術(shù)(sqlite3)(未完成) html頁面顯示技術(shù)全局結(jié)構(gòu)體定義全局結(jié)構(gòu)體定義n/倉庫貨物信息nstruct storage_goods_infonnunsigned char goods_type;/貨物類型,用數(shù)字表示nunsigned int goods_count;/貨物數(shù)量n;全局結(jié)構(gòu)體定義全局結(jié)構(gòu)體定義n/某個倉庫的全部

5、信息nstruct storage_infonnunsigned char storage_status; nunsigned char led_status;nunsigned char buzzer_status;nunsigned char fan_status;nunsigned char seg_status;nsigned char x;nsigned char y;nsigned char z;nfloat temperature;nfloat temperatureMIN;全局結(jié)構(gòu)體定義全局結(jié)構(gòu)體定義nfloat temperatureMAX;nfloat humidity;n

6、float humidityMIN;nfloat humidityMAX;nfloat illumination;nfloat illuminationMIN;nfloat illuminationMAX;nfloat battery;nfloat adc;nstruct storage_goods_info goods_infoGOODS_NUM;n;全局結(jié)構(gòu)體定義全局結(jié)構(gòu)體定義n/所有倉庫的信息結(jié)構(gòu)體nstruct env_info_clien_addrnnstruct storage_info storage_noSTORAGE_NUM;n;n/消息隊列結(jié)構(gòu)體nstruct msgnnl

7、ong type;/從消息隊列接收消息時用于判斷的消息類型nlong msgtype;/具體的消息類型nunsigned char textQUEUE_MSG_LEN;/消息正文n;用到的線程用到的線程n其中用到的線程如下:npthread_client_request():處理消息隊列里請求的線程.npthread_refresh():更新共享內(nèi)存里的實時數(shù)據(jù).npthread_sqlite():數(shù)據(jù)庫線程.npthread_transfer():接收M0數(shù)據(jù)線程.npthread_analysis():M0數(shù)據(jù)分析線程.npthread_sms():短信模塊控制線程.(未使用)npthre

8、ad_buzzer():A9蜂鳴器控制線程.npthread_led():A9LED模塊線程.npthread_camera():攝像頭模塊控制線程.線程和進程的區(qū)別:線程和進程的區(qū)別:n線程:是一種輕量級進程,線程存在于進程中。n 線程和進程一樣都會被操作系統(tǒng)調(diào)度(時間片)n 通常線程指的是共享相同地址空間的多個任務(wù)。n線程優(yōu)勢:線程運行時,相互切換效率高;線程之間共享數(shù)據(jù)很方便。n進程擁有獨立的運行空間,一個進程崩潰后,在保護模式下并不會影響其他的進程。一個進程中可以包含有多個線程,而一個線程只能包含在進程中。一個線程擁有自己獨有的局部變量棧,但是沒有獨立的空間,一個進程中多個線程共同共享

9、一塊資源,因此當一個線程崩潰后此進程也會崩潰。因此多進程要比多線程健壯性要好,但是,多進程效率比較低。當需要并行操作和共享某些變量最好使用多線程的模式。線程線程n創(chuàng)建:創(chuàng)建一個線程nint pthread_create(pthread_t *thread, const pthread_attr_t n *attr, void * (* routine)(void *), void *arg)n參數(shù):thread, 線程的標識符(類似于進程的pid號)n attr, 用于指定創(chuàng)建的線程的屬性, 通常為NULL(不需要設(shè)置)n routine, 函數(shù)指針,該函數(shù)就是線程主體n arg, 就是傳遞給

10、函數(shù)的參數(shù)。n返回值:成功返回0, 失敗返回非負的錯誤號線程線程n int pthread_exit(void *value_ptr) n 功能:只會導致當前線程的退出函數(shù)n 參數(shù):就是傳遞的退出狀態(tài)(指針)n 通常使用: pthread_exit(0); n返回值:成功返回0, 失敗返回非負的錯誤號n進程對已經(jīng)退出的線程必須要做回收線程資源的操作(否則會產(chǎn)生僵尸線程)nint pthread_join(pthread_t thread, void *value_ptr) n功能:阻塞等待回收退出的線程的資源n參數(shù): thread, 就是指定要回收的線程資源n value_ptr, 就是接收到

11、線程的退出狀態(tài)。n返回值:成功返回0, 失敗返回非負的錯誤號 線程的控制線程的控制n控制線程: n互斥鎖 :主要用來保護臨界資源(可是變量,后者是代碼段)n 任何時刻最多只能有一個線程能訪問該資源n相關(guān)函數(shù)接口:nint pthread_mutex_init(pthread_mutex_t *mutex, pthread_mutexattr_t *attr)n功能:鎖的初始化函數(shù),即生成一把鎖n參數(shù): mutex, 是鎖的標識符n attr, 設(shè)置鎖的屬性, 通常為NULL。n返回值: 返回值:成功返回0, 失敗返回非負的錯誤號 線程控制線程控制nint pthread_mutex_lock(

12、pthread_mutex_t *mutex)p功能:阻塞等待直到這把鎖申請成功為止,對臨界資源進行上鎖操作p參數(shù): mutex, 就是指定的一把鎖 p返回值:成功返回0, 失敗返回非負的錯誤號nint pthread_mutex_unlock(pthread_mutex_t *mutex) p功能:對臨界資源進行解鎖操作p參數(shù): mutex, 就是指定要解開的鎖 p返回值:成功返回0, 失敗返回非負的錯誤號 nint pthread_mutex_destroy(pthread_mutex_t *mutex);p功能:銷毀一把指定的鎖p參數(shù): mutex, 就是指定要銷毀的鎖 p返回值:成功返

13、回0, 失敗返回非負的錯誤號注意: 為了避免死鎖:在申請多把鎖時,所有的線程都按照同樣的順序去申請。線程之間的通信線程之間的通信-條件變量條件變量 int pthread_cond_init(pthread_cond_t *restrict cond,const pthread_condattr_t *restrict attr);n 功能:初始化一個條件變量n 參數(shù):cond, 就是條件變量的標識符n attr, 通常為NULL即可n 返回值:成功返回0, 失敗返回非負的錯誤號 nint pthread_cond_wait(pthread_cond_t *restrict cond, pth

14、read_mutex_t *restrict mutex);n功能:條件睡眠,直到被指定的條件喚醒為止n參數(shù): cond, 就是指定睡眠 條件,將來被喚醒時也必須滿足該條件n mutex, 該函數(shù)睡眠時必須提前加上一把鎖n 注意:該睡眠函數(shù)調(diào)用之前必須先加上一把鎖,然后進入睡眠,然后該函數(shù)內(nèi)部n 將鎖解開;當該函數(shù)被喚醒時,需要重新加上這把鎖,如果發(fā)現(xiàn)這把鎖被其他線程n 占用,那么該函數(shù)的喚醒操作就失敗了,繼續(xù)睡眠。 n返回值:成功返回0, 失敗返回非負的錯誤號 線程之間的通信線程之間的通信-條件變量條件變量nint pthread_cond_signal(pthread_cond_t *co

15、nd);n功能:就是喚醒睡眠在cond條件上的線程,但是只能喚醒一個線程n參數(shù): cond, 就是指定要喚醒的條件n返回值:成功返回0, 失敗返回非負的錯誤號 nint pthread_cond_broadcast(pthread_cond_t *cond);n功能:喚醒所有睡眠這個條件上的線程nint pthread_cond_destroy(pthread_cond_t *cond);n功能:就是銷毀條件變量 處理消息隊列請求線程處理消息隊列請求線程消息對列消息對列n創(chuàng)建/打開消息隊列對象nint msgget(key_t key, int flag);n參數(shù):key, ftok()函數(shù)的

16、返回值,用于確保多個進程操作同一個消息隊列n flag, IPC_CREAT IPC_EXCL 和共享內(nèi)存一樣n返回值:成功返回消息隊列的標識符, 失敗-1n比如:msgget(key, IPC_CREAT|IPC_EXCL|0666);消息對列消息對列nint msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);n參數(shù):msgid, msgget的返回值n msgp, 要發(fā)送的數(shù)據(jù)的指針,有指定的數(shù)據(jù)格式。n struct msgbuf n long mtype; /* message type, must be 0 *

17、/n 數(shù)據(jù)類型,可以自定義; /* message data */n int a; char b; float f;n ;n msgsz, 發(fā)送的消息的正文的長度 = sizeof(struct msgbuf) - sizeof(long)n msgflg,IPC_NOWAIT 以非阻塞方式發(fā)送消息,如果發(fā)送不成功,那么不會阻塞,立刻返回。n 0(常用), 以阻塞方式發(fā)送消息,如果發(fā)送不成功,那么阻塞等待,直到發(fā)送成功為止。n返回值:成功0, 失敗-1消息隊列消息隊列nssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp

18、, int msgflg);n參數(shù):msqid, msgget的返回值n msgp, 用于接收讀取到的消息,固定格式,必須和發(fā)送的類型保持一致。n msgsz, 仍然要接收的消息的正文長度n msgtyp, n 0, 表示讀取第一條消息n 0, 表示讀取指定類型消息(最常用)n 0, 接收消息隊列中類型值不小于msgtyp的絕對值且類型值又最小的消息n msgflg,n IPC_NOWAIT 以非阻塞方式接收消息,如果接收不成功,那么不會阻塞,立刻返回。n 0(常用), 以阻塞方式接收消息,如果接收不成功,那么阻塞等待,直到接收成功為止。n返回值:實際接收到的消息的正文的字節(jié)個數(shù) , 失敗-1

19、. 消息對列消息對列n消息隊列的控制函數(shù)nint msgctl ( int msgqid, int cmd, struct msqid_ds *buf );n參數(shù):n msgqid, 就是控制的消息隊列n cmd : n IPC_STAT (獲取對象屬性), 屬性保存在第三個參數(shù)上n IPC_SET (設(shè)置對象屬性),第三個參數(shù)保存的是要修改的屬性n IPC_RMID (刪除對象), 此時第三個參數(shù)為NULL即可n返回值:返回值和cmd有關(guān)系, 失敗-1.共享內(nèi)存共享內(nèi)存共享內(nèi)存共享內(nèi)存n共享內(nèi)存:是一種最為高效的進程間通信方式,進程可以直接讀寫內(nèi)存,而不需要任何數(shù)據(jù)的拷貝n注意:由于多個進程

20、共享一段內(nèi)存,因此也需要依靠某種同步機制來控制對它的寫操作,如互斥鎖和信號量等 n#include nkey_t ftok(const char *pathname, int proj_id);n功能:就是生成key值。n參數(shù):pathname, 任意一個存在的路徑都可以n proj_id, 只要低8位(二進制)不全為0的數(shù)都可以n返回值:成功key值, 失敗-1. n比如:key = ftok(., a);共享內(nèi)存共享內(nèi)存n創(chuàng)建/打開共享內(nèi)存:創(chuàng)建于當前系統(tǒng)上,保存到系統(tǒng)關(guān)閉為止。nint shmget(key_t key, int size, int shmflg);n參數(shù):key, 用于

21、唯一的標識一塊共享內(nèi)存,將來其他進程需要使用一樣的key值。n IPC_PRIVATE,表示該物理空間只能自己用,無法和其他進程共享。n ftok()函數(shù)的返回值n size, 要申請的共享內(nèi)存物理空間, /usr/inclue/linux/shm.h中包含限制n shmflg, IPC_CREAT IPC_EXCLnIPC_CREAT 如果共享內(nèi)存不存在,則創(chuàng)建一個共享內(nèi)存,否則打開操作。n IPC_EXCL 只有在共享內(nèi)存不存在的時候,新的共享內(nèi)存才建立,否則就產(chǎn)生錯誤。n返回值:就是共享內(nèi)存的標識符(大于0),失敗-1. n比如:key = ftok(., a);nint shmid;n

22、shmid = shmget(key, 512, IPC_CREAT|IPC_EXCL|0666);共享內(nèi)存共享內(nèi)存n映射共享內(nèi)存,即把指定的共享內(nèi)存映射到進程的地址空間用于訪問nvoid *shmat(int shmid, const void *shmaddr, int shmflg);n參數(shù):shmid, 就是shmget的返回值n shmaddr, 用于指定共享內(nèi)存映射到當前進程的那個起始地址上n 如果為NULL, 那么系統(tǒng)幫助進程分配(最常用)n 如果非NULL, 那么就是自己指定(必須保證這塊空間沒有被使用)n shmflg, 指定進程對該內(nèi)存區(qū)域的讀寫權(quán)限n 如果為SHM_RDO

23、NLY ,那么當前進程只讀n 如果為0, 那么當前進程可讀可寫(最常用)n返回值:返回當前進程和共享內(nèi)存映射后的起始地址n 失敗返回的為(void*)(-1)共享內(nèi)存共享內(nèi)存n撤銷共享內(nèi)存映射nint shmdt(const void *shmaddr);p參數(shù):shmaddr, 就是shmat的返回值p返回值:成功0, 失敗-1p操作共享內(nèi)存對象nint shmctl(int shmid, int cmd, struct shmid_ds *buf); / 獲取共享內(nèi)存的狀態(tài),并把相關(guān)的屬性賦值給bufp功能:控制共享內(nèi)存對象p參數(shù): shmid, shmget的返回值n cmd : IPC

24、_STAT (獲取對象屬性), 屬性保存在第三個參數(shù)上n IPC_SET (設(shè)置對象屬性),第三個參數(shù)保存的是要修改的屬性n IPC_RMID (刪除對象), 此時第三個參數(shù)為NULL即可p返回值:返回值和cmd有關(guān)系, 失敗-1.n比如:shmctl(shmid, IPC_RMID, NULL); 訪問共享內(nèi)存訪問共享內(nèi)存n創(chuàng)建/打開信號量集合nint semget(key_t key, int nsems, int semflg);n參數(shù):n key, ftok()返回值n nsems, 指定的信號量集合中的信號量個數(shù)n semflg, n IPC_CREATn IPC_EXCLnIPC_

25、CREAT 如果共享內(nèi)存不存在,則創(chuàng)建一個共享內(nèi)存,否則打開操作。n IPC_EXCL 只有在共享內(nèi)存不存在的時候,新的共享內(nèi)存才建立,否則就產(chǎn)生錯誤。n返回值:返回該集合的標識符,失敗-1. nint semctl(int semid, int semnum, int cmd, .);p功能:信號量集合的控制p參數(shù):semid, 指定要操作的集合n semnum, 要操作的信號量的編號,編號從0開始n cmd,GETVAL:獲取信號燈的值, 返回值是獲得值。n 比如:value = semctl(semid, 0, GETVAL);n SETVAL:設(shè)置信號燈的值,需要用到第四個參數(shù)。因此在

26、設(shè)置信號燈的值時應(yīng)該及時的設(shè)置共用體semun的值n 第四個參數(shù)類型如下: n union semun n int val; /* Value for SETVAL */n struct semid_ds *buf; /* Buffer for IPC_STAT, IPC_SET */n unsigned short *array; /* Array for GETALL, SETALL */n struct seminfo *_buf; /* Buffer for IPC_INFOn (Linux-specific) */n ;nint semop ( int semid, struct s

27、embuf *opsptr, unsigned nops);n功能:就是對信號量集合中的信號量進行PV操作n參數(shù): semid, 指定要操作的集合n opsptr,n struct sembufn unsigned short sem_num; /* semaphore number */n short sem_op; /* semaphore operation */n short sem_flg; /* operation flags */n ;n 成員分析:n sem_num 表示要操作的信號量的編號n sem_op, 表示進行P或者V操作, 比如:sem_op = 10(+10)n s

28、em_op = -10(-10)n sem_op = 0, 那么semop函數(shù)會等到該信號量的值變?yōu)?為止。n sem_flg, 0(最常用的),表示semop函數(shù)的操作是阻塞的,直到成功為止。n IPC_NOWAIT,表示semop函數(shù)的操作是非阻塞的,如果操作沒有成功,立刻返回。n SEM_UNDO(不常用),設(shè)置只對當前進程有效,不會保存到系統(tǒng)的信號量集合中。n nops, 調(diào)用一次semop要操作的信號量的個數(shù)n返回值:成功0, 失敗-1 linux 管道、消息隊列、共享內(nèi)存的對比管道、消息隊列、共享內(nèi)存的對比 n管道的優(yōu)點是不需要加鎖,缺點是默認緩沖區(qū)太小,只有4K,同時只適合父子進

29、程間通信,而且一個管道只適合單向通信,如果要雙向通信需要建立兩個。而且不適合多個子進程,因為消息會亂,它的發(fā)送接收機制是用read/write這種適用流的,缺點是數(shù)據(jù)本身沒有邊界,需要應(yīng)用程序自己解釋,而一般消息大多是一個固定長的消息頭,和一個變長的消息體,一個子進程從管道read到消息頭后,消息體可能被別的子進程接收到linux 管道、消息隊列、共享內(nèi)存的對比管道、消息隊列、共享內(nèi)存的對比 n消息隊列也不要加鎖,默認緩沖區(qū)和單消息上限都要大一些,在我的suse10上是64K,它并不局限于父子進程間通信,只要一個相同的key,就可以讓不同的進程定位到同一個消息隊列上,它也可以用來給雙向通信,不過稍微加個標識,可以通過消息中的type進行區(qū)分,比如一個任務(wù)分派進程,創(chuàng)建了若干個執(zhí)行子進程,不管是父進程發(fā)送分派任務(wù)的消息,還是子進程發(fā)送任務(wù)執(zhí)行的消息,都將type設(shè)置為目標進程的pid,因為msgrcv可以指定只接收消息類型為type的消息,這樣就實現(xiàn)了子進程只接收自己的任務(wù),父進程只接收任務(wù)結(jié)果linux 管道、消息隊列、共享內(nèi)存的對比管道、消息隊列、共享內(nèi)存的對比 n

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論