物聯網倉儲系統課件_第1頁
物聯網倉儲系統課件_第2頁
物聯網倉儲系統課件_第3頁
物聯網倉儲系統課件_第4頁
物聯網倉儲系統課件_第5頁
已閱讀5頁,還剩35頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

4、等) Cortex-M0 ARM 微控制器技術 I2C、SPI、中斷、單總線、A/D、PWM、UART等多種接口技術 監控及視頻流處理技術 GPRS遠程報警技術(未完成) 嵌入式Web服務器技術 處理客戶請求(CGI)技術 數據庫技術(sqlite3) wifi技術(sqlite3)(未完成) html頁面顯示技術全局結構體定義全局結構體定義n/倉庫貨物信息nstruct storage_goods_infonnunsigned char goods_type;/貨物類型,用數字表示nunsigned int goods_count;/貨物數量n;全局結構體定義全局結構體定義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;全局結構體定義全局結構體定義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;全局結構體定義全局結構體定義n/所有倉庫的信息結構體nstruct env_info_clien_addrnnstruct storage_info storage_noSTORAGE_NUM;n;n/消息隊列結構體nstruct msgnnl

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

26、設置信號燈的值時應該及時的設置共用體semun的值n 第四個參數類型如下: 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參數: 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函數會等到該信號量的值變為0為止。n sem_flg, 0(最常用的),表示semop函數的操作是阻塞的,直到成功為止。n IPC_NOWAIT,表示semop函數的操作是非阻塞的,如果操作沒有成功,立刻返回。n SEM_UNDO(不常用),設置只對當前進程有效,不會保存到系統的信號量集合中。n nops, 調用一次semop要操作的信號量的個數n返回值:成功0, 失敗-1 linux 管道、消息隊列、共享內存的對比管道、消息隊列、共享內存的對比 n管道的優點是不需要加鎖,缺點是默認緩沖區太小,只有4K,同時只適合父子進

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

溫馨提示

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

最新文檔

評論

0/150

提交評論