版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
物聯(lián)網(wǎng)倉庫管理系統(tǒng)
詳細設(shè)計說明書
,口g登錄
◎O00
1
專業(yè)始于專注度過叁藤入式學(xué)院《3G學(xué)院
本t口涌干;元用々?華311s見線下;?,<;-1T.?,?
第一章項目簡介.........................................3
第二章系統(tǒng)概述.........................................5
第三章前端數(shù)據(jù)中心(A8)總體設(shè)計..........................5
第一節(jié):系統(tǒng)框圖,線程間關(guān)系............................5
第二節(jié):主進程模塊.....................................7
第三節(jié):數(shù)據(jù)庫模塊....................................10
第四節(jié):數(shù)據(jù)接收模塊..................................19
第五節(jié):數(shù)據(jù)處理模塊..................................22
第六節(jié):處理客戶請求模塊(設(shè)備控制)....................33
第七節(jié):紅外(按鍵模擬)模塊............................38
第八節(jié):蜂鳴器模塊....................................39
第九節(jié):LED模塊......................................40
第十節(jié):攝像頭模塊....................................41
第H-一節(jié):SMS模塊.....................................42
第十二節(jié):共享內(nèi)存刷新模塊............................54
第十三節(jié):WIFI模塊....................................58
第十四節(jié):QT進程......................................59
第十五節(jié):CGI進程.....................................72
第十六節(jié):控制M0命令發(fā)送模塊.........................89
第四章數(shù)據(jù)采集端(M0)總體設(shè)計...........................91
第一章項目簡介
1.項目背景
隨著社會經(jīng)濟的迅速發(fā)展和科學(xué)技術(shù)的全面進步,計算機事業(yè)的飛速發(fā)展,
以計算機與通信技術(shù)為基礎(chǔ)的信息系統(tǒng)正處于蓬勃發(fā)展的時期。隨著經(jīng)濟文化水
平的顯著提高,人們對于生活質(zhì)量及工作環(huán)境的要求也越來越高。與此同時為了
管理大量的物品,倉庫也大量的出現(xiàn),倉庫的管理問題也就提上了日程。隨著倉
庫大量的增加,其管理難度也越來越大,如何優(yōu)化倉庫的日常管理也就成為了
一個大眾化的課題。
傳統(tǒng)的倉庫管理,一般依賴于一個非自動化的、以紙張文件為基礎(chǔ)的系統(tǒng)來
記錄、追蹤進出的貨物,完全由人工實施倉庫內(nèi)部的管理,因此倉庫管理的效率
極其低下。對此,我們利用基于ZIGBEE無線射頻技術(shù)的倉庫智能管理系統(tǒng),
該系統(tǒng)能夠增強庫房作業(yè)的準確性和快捷性、減少整個倉庫物資出入庫中由于管
理不到位造成的非法出入庫、誤置、偷竊和庫存、出貨錯誤等損失,并最大限度
地減少儲存成本、保障倉庫物資的安全。
2.需求分析
傳統(tǒng)的倉庫管理,一般依賴于一個非自動化的、以紙張文件為基礎(chǔ)的系統(tǒng)來
記錄、追蹤進出的貨物,完全由人工實施倉庫內(nèi)部的管理,因此倉庫管理的效率
極其低下,所能管理的倉庫規(guī)模也很小。
隨著計算機的應(yīng)用普及,目前大多數(shù)企業(yè)的倉庫管理數(shù)據(jù)資料已開始采用計
算機數(shù)據(jù)系統(tǒng)管理,但數(shù)據(jù)還是采用先紙張記錄、再手工輸入計算機的方式進行
采集和統(tǒng)計整理。這不僅造成大量的人力資源浪費,而且由于人為的因素,數(shù)據(jù)
錄入速度慢、準確率低。
隨著倉庫智能化的不斷發(fā)展,倉庫管理的物資種類,數(shù)量在不斷增加、出入
庫頻率劇增,倉庫管理作業(yè)也已十分復(fù)雜和多樣化,傳統(tǒng)的人工倉庫作業(yè)模式和
數(shù)據(jù)采集方式已難以滿足倉庫管理的快速、準確要求,嚴重影響了倉庫的管理。
目前ZIGBEE技術(shù)正在為倉庫管理帶來一場巨大的變革,以識別距離遠,
快速,不易損壞,容量大等條碼無法比擬的優(yōu)勢,簡化繁雜的工作流程,有效改
善供應(yīng)鏈的效率和透明度。基于物聯(lián)網(wǎng)的智能戰(zhàn)備倉庫管理系統(tǒng)是在現(xiàn)有倉庫管
理和車輛管理中引入ZIGBEE技術(shù),對倉庫到貨檢驗、入庫、出庫、調(diào)撥、移
庫移位、庫存盤點等各個作業(yè)環(huán)節(jié)的數(shù)據(jù)進行自動化的數(shù)據(jù)采集,保證倉庫管理
各個環(huán)節(jié)數(shù)據(jù)輸入的速度和準確性,確保管理人員及時準確地掌握庫存的真實數(shù)
據(jù),合理保持和控制倉庫庫存。通過科學(xué)的編碼,還可方便地對物品的批次、保
質(zhì)期等進行管理。利用系統(tǒng)的庫位管理功能,更可以及時掌握所有庫存物資當前
所在位置,有利于提高倉庫管理的工作效率。
3.術(shù)語定義
Linux:Linux是一種自由和開放源碼的類Unix操作系統(tǒng)。目前存在著許多
不同的Linux,但它們都使用了Linux內(nèi)核。Linux口J安裝在各種計算機硬件設(shè)備
中,從手機、平板電腦、路由器和視頻游戲控制臺,到臺式計算機、大型機和超
級計算機。
RFID:射頻識別即RFID(RadioFrequencyIDentification)技術(shù),又稱
電子標簽、無線射頻識別,是一種通信技術(shù),可通過無線電訊號識別特定目標并
讀寫相關(guān)數(shù)據(jù),而無需識別系統(tǒng)與特定目標之間建立機械或光學(xué)接觸。
ZIGBEE:Zigbee是基于IEEE802.15.4標準的低功耗個域網(wǎng)協(xié)議。根據(jù)這個
協(xié)議規(guī)定的技術(shù)是一種短距離、低功耗的無線通信技術(shù)。這一名稱來源于蜜蜂的
八字舞,由于蜜蜂(bee)是靠飛翔和“嗡嗡”(zig)地抖動翅膀的“舞蹈”來與同
伴傳遞花粉所在方位信息,也就是說蜜蜂依靠這樣的方式構(gòu)成了群體中的通信網(wǎng)
絡(luò)。其特點是近距離、低復(fù)雜度、自組織、低功耗、低數(shù)據(jù)速率、低成本。主要
適合用于自動控制和遠程控制領(lǐng)域,可以嵌入各種設(shè)備。簡而言之,ZigBee就
是一種便宜的,低功耗的近距離無線組網(wǎng)通訊技術(shù)。
A8:ARMCortex-A8處理器是第一款基于ARMv7架構(gòu)的應(yīng)用處理器,并且是
有史以來ARM開發(fā)的性能最高、最具功率效率的處理器。
MO:Cortex-MO處理器,是市場上現(xiàn)有的最小、能耗最低、最節(jié)能的ARM處
理器。
WIFI:Wi-Fi是一種可以將個人電腦、手持設(shè)備(如PDA、手機)等終端以
無線方式互相連接的技術(shù)。Wi-Fi是一個無線網(wǎng)路通信技術(shù)的品牌,由Wi-Fi聯(lián)
盟(Wi-FiAlliance)所持有。目的是改善基于IEEE802.11標準的無線網(wǎng)路產(chǎn)品
之間的互通性。
第二章系統(tǒng)概述
本系統(tǒng)是基于PC,A8及M0等設(shè)備,依托在各項互聯(lián)網(wǎng),物聯(lián)網(wǎng),傳感器等
技術(shù)的基礎(chǔ)上編寫,以實現(xiàn)食品物聯(lián)網(wǎng)倉儲系統(tǒng),使用戶更方便的管理倉庫內(nèi)的
所有信息及其特殊情況。
本系統(tǒng)主要分為三大模塊:核心服務(wù)器端(PC)、前端數(shù)據(jù)中心(A8)和遠程監(jiān)控終
端(MO)o
第三章前端數(shù)據(jù)中心(A8)總體設(shè)計
第一節(jié):系統(tǒng)框架,線程間關(guān)系
1.系統(tǒng)框架:
a.通過M0進行實時采集環(huán)境參數(shù),例如溫度、濕度、光感數(shù)據(jù),進行物
品刷卡;
b.再通過ZigBee把采集到的環(huán)境參數(shù)或物品信息發(fā)送給A8;
c.由A8的M0線程負責(zé)接收環(huán)境參數(shù)或物品信息,激活數(shù)據(jù)庫線程對數(shù)
據(jù)庫進行相應(yīng)的處理,然后如果是環(huán)境參數(shù)則對環(huán)境參數(shù)進行判斷處理進行
報警。
&用攝像頭采集圖片,存儲到A8上。
e.構(gòu)建嵌入式web服務(wù)器,使用戶通過網(wǎng)絡(luò)利用pc機進行監(jiān)控。
f.在web頁面上設(shè)置控制按鈕,監(jiān)控設(shè)備識別用戶指令并進行相應(yīng)動作
g.A8通過GPRS短信息功能向用戶報警。
2.線程間關(guān)系:
pthread_client_request():處理消息隊列里請求的線程.
pthread_refresh():更新共享內(nèi)存里的實時數(shù)據(jù).
pthread_sqlite():數(shù)據(jù)庫線程.
plhread_transfer():接收M0數(shù)據(jù)線程.
pthread_analysis():MO數(shù)據(jù)分析線程.
pthread_uart_cmd():MO控制命令發(fā)送線程.
pthread_sms():短信.模塊控缶ij線程.
pthread_buzzer():A8蜂鳴器捽制線程.
pthread_infrared():紅外(按鍵模擬)監(jiān)測線程
plhread_led():A8LED模塊線程.
pthread_camera():攝像頭模塊控制線程.
第二節(jié):數(shù)據(jù)描述
1.結(jié)構(gòu)體描述
結(jié)構(gòu)體名成員類型成員名功能描述
unsignedchargoods_type物品類型
storage_goods_info
unsignedintgoods_count物品數(shù)量
storage_status倉庫開關(guān)狀態(tài)
led_status倉庫LED狀態(tài)
unsignedcharbuzzer_status倉庫Buzzer狀態(tài)
fan_status倉庫風(fēng)扇狀態(tài)
seg_status倉庫數(shù)碼管狀態(tài)
X
signedchary倉庫采集端三軸狀態(tài)
z
charsamplingTime[20]采集數(shù)據(jù)的時間
temperature倉庫當前溫度
temperatureMAX倉庫溫度上限
storagejnfo
temperatureMIN倉庫溫度下限
humidity倉庫當前濕度
humidityMAX倉庫濕度上限
humidityMIN倉庫濕度下限
float
illumination倉庫當前光照
illuminationMAX倉庫光照上限
illuminationMIN倉庫光照下限
battery倉庫采集端電池電壓
adc倉庫ADC采集電壓
adcMIN倉庫電池電壓最小值
storage_goods^infogoods_info[GOODS_NUM]采集貨物信息
storage_no[STORAGE_NU
envjnfo_clien_addrstoragejnfo所以倉庫實時信息
M]
inttable_select_mask
env_operation_mask
storage_no
table_operation_mask
goods^operatiori-mask
type消息隊列里的消息類型
long
msgmsgtype區(qū)別消息的類型
unsignedchartext[QUEU^MSG_LEN]消息正文長度
2、全局變量描述
類型變量名
cond_sqlite數(shù)據(jù)庫線程被喚醒條件變量
cond_analysis數(shù)據(jù)分析線程被喚醒條件變量
cond_uart_cmdM0控制命令發(fā)送線程被喚醒條件變量
cond_client_request處理消息隊列里請求的線程被喚醒條件變量
condjnfrared紅外(按鍵模擬)監(jiān)測線程被喚醒條件變量
pthread_cond_t
cond_buzzerA8蜂鳴器控制線程被喚醒條件變量
condjedA8LED模塊線程被喚醒條件變量
cond_camera攝像頭模塊控制線程被喚醒條件變量
cond_sms短信模塊控制線程被喚醒條件變量
cond_refresh更新共享內(nèi)存里的實時數(shù)據(jù)被喚醒條件變量
mutex_slinklist數(shù)據(jù)庫緩存互斥鎖
mutex_sqlite數(shù)據(jù)庫線程互斥鎖
mutex_analysis數(shù)據(jù)分析線程互斥鎖
mutex_uart_cmdM0控制命令發(fā)送線程互斥鎖
mutex_client_request處理消息隊列里請求的線程互斥鎖
pthread_mutex_tmutexjnfrared紅外(按鍵模擬)監(jiān)測線程互斥鎖
mutex_buzzerA8蜂鳴器控制線程互斥鎖
mutexjedA8LED模塊線程互斥鎖
mutex_camera攝像頭模塊控制線程互斥鎖
mutex_sms短信模塊控制線程互斥鎖
mutex_refresh更新共享內(nèi)存里的實時數(shù)據(jù)互斥鎖
mutex_refresh_updata
mutex_global全局變量保護互斥鎖
mutexjinklist接收數(shù)據(jù)緩存互斥鎖
storage_RT[STORAGE_
storagejnfo各倉庫實時信息
NUM]
dev_sms_maskA8短信模塊操作掩碼
devjnfrared_maskA8按鍵模塊操作掩碼
dev_buzzer_maskA8蜂鳴器模塊操作掩碼
unsignedchar
dev_led_maskA8LED模塊操作掩碼
dev_camera_maskA8攝像頭模塊操作掩碼
dev_uart_maskA8串口發(fā)送命令掩碼
dev_infrared_fdA8按鍵模塊設(shè)備節(jié)點
dev_buzzer_fdA8蜂鳴器模塊設(shè)備節(jié)點
dev_led_fdA8LED模塊設(shè)備節(jié)點
dev_camerajdA8攝像頭模塊設(shè)備節(jié)點
dev_sms_fdA8短信模塊設(shè)備節(jié)點
intdev_uart_fdA8U轉(zhuǎn)串設(shè)備節(jié)點
msgid消息隊列ID
shmid共享內(nèi)存ID
semid信號燈集ID
storageNum
goodsKinds
env_info_clien_addrenvjnfo_clien_addr_s
all_info_RT各倉庫實時信息
第三節(jié):數(shù)據(jù)庫模塊
1、sqlite3介紹
(1)sqlite3基礎(chǔ)介紹
sqlite3提供的是一些C函數(shù)接口,你可以用這些函數(shù)操作數(shù)據(jù)庫。通過
使用這些接口,傳遞一些標準sql語句(以char*類型)給sqlite函數(shù),
sqlite就會為你操作數(shù)據(jù)庫。
sqlite3跟MS的access一樣是文件型數(shù)據(jù)庫。就是說,一個數(shù)據(jù)庫就是
一個文件,此數(shù)據(jù)庫里可以建立很多的表,可以建立索引、觸發(fā)器等等,但是,
它實際上得到的就是一個文件。備份這個文件就備份了整個數(shù)據(jù)庫。
sqlite3不需要任何數(shù)據(jù)庫引擎,這意味著如果你需要sqlite來保存一些
用戶數(shù)據(jù),甚至都不需要安裝數(shù)據(jù)庫。
(2)介紹數(shù)據(jù)庫基本操作——基本流程
?關(guān)鍵數(shù)據(jù)結(jié)構(gòu)
sqlite3里最常用到的是sqlite3*類型。從數(shù)據(jù)庫打開開始,sqlite3就
要為這個類型準備好內(nèi)存,直到數(shù)據(jù)庫關(guān)閉,整個過程都需要用到這個類型。當
數(shù)據(jù)庫打開時開始,這個類型的變量就代表了你要操作的數(shù)據(jù)庫。下面再詳細介
紹。
?打開數(shù)據(jù)庫
intsqlite3_open(文件名,sqlite3**);
作用:用這個函數(shù)開始數(shù)據(jù)庫操作。
文件名:數(shù)據(jù)庫文件名,比如:c:\\warehouse.db。
注意:文件名不需要一定存在,如果此文件不存在,sqlite會自動建立它。
如果它存在,就嘗試把它當數(shù)據(jù)庫文件來打開。
sqlite3**:參數(shù)即前面提到的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)。這個結(jié)構(gòu)底層細節(jié)如何,
你不要關(guān)它。
函數(shù)返回值:表示操作是否正確,如果是SQLITE_OK則表示操作正常。反
之則不正常。
?關(guān)閉數(shù)據(jù)庫
intsqlite3_close(sqlite3*);
作用:用這個函數(shù)關(guān)閉數(shù)據(jù)庫操作。
?執(zhí)行sql語句
intsqlite3_exec(sqlite3*,constchar*sql,sqlite3_calIback,
void*,char**errmsg);
這就是執(zhí)行一條sql語句的函數(shù)。
第1個參數(shù):open函數(shù)得到的指針。是關(guān)鍵數(shù)據(jù)結(jié)構(gòu)。
第2個參數(shù):constchar*sql是條sql語句,以\0結(jié)尾。
第3個參數(shù):sqlite3_callback是回調(diào)函數(shù),當這條語句執(zhí)行之后,
sqlite3會去調(diào)用你提供的這個函數(shù)。
第4個參數(shù):void*是你所提供的指針,你可以傳遞任何一個指針參
數(shù)到這里,這個參數(shù)最終會傳到回調(diào)函數(shù)里面,如果不需要傳遞指針給回調(diào)
函數(shù),可以填NULLo第5個參數(shù):char**errmsg是錯誤信息。注意
是指針的指針。
2、數(shù)據(jù)庫模塊流程圖及結(jié)構(gòu)圖
(1)sqlite線程流程圖
主程序開始運行之后,各任務(wù)線程開始運行,其中就包括的了數(shù)據(jù)庫的
pthread_sqlite0pthread__sqlite線程開始創(chuàng)建一個用于存儲對數(shù)據(jù)庫操作的
鏈表,鏈表創(chuàng)建之后進入while(1)循環(huán)。循環(huán)中,用pthread_cond_wait函
數(shù)語句進行睡眠等待,等待其他線程的喚醒函數(shù)pthread_cond_signal發(fā)來的信
號,喚醒之后再次進入一個while(1)的循環(huán)語句,在這個循環(huán)中,我們進行
對鏈表頭的判空工作。如果鏈表頭不為空,則讀取第一個節(jié)點的內(nèi)容,把借點中
的內(nèi)容解析出來,把解析出來的內(nèi)容作為參數(shù)傳到sqlite_task函數(shù)中,完成相
應(yīng)的數(shù)據(jù)庫操作并釋放節(jié)點空間,如此循環(huán);如果鏈表頭為空,則直接跳出while
(1)循環(huán),再回到外部循環(huán)的plhread_cond_wait函數(shù)進行睡眠等待,等待下
一次被其他線程喚醒。
Sqlite線程開始
創(chuàng)建臟衣頭
while(1)
。點為空釜件變量破唉型
斯槌衣頭
否為空
。點不為空
取出旋表的
listHead->nexcsq1ite_task()見
節(jié)點估息sqlista9k能構(gòu)圖
調(diào)用sqlitjtask()
對數(shù)據(jù)向i行操作
while1IJ
釋校日點空何
(2)sqlite_task()結(jié)構(gòu)圖
在上面的pthread_sqlite線程流程圖中,提到了sqlite_task函數(shù)。它用
來完成讀取節(jié)點信息之后的數(shù)據(jù)庫操作。對數(shù)據(jù)庫的操作主要是讀取
sqlite_operation結(jié)構(gòu)中成員變量來完成的。通過sqlite_operation中的
table_select_niask來判斷是對數(shù)據(jù)庫中的哪個表進行操作,然后再分別通過
env_operation_mask>tabie_operation_mask和goods_operationmask來判斷
對選擇的表進行什么具體的操作,例如,更新、查看和插入等等。
k-4-:
sqlitc_task()
X
(able_sclect_mask-0tableselectmask-1(able_select_mask-2
表示選擇指乍sv表:衣示操作collectenv表表示操作goods表
??:?i:??:?
--T------1-------
tableoperation_mask_0table_operation_mask_0
env_operation_mask-0
表示向表插衣示操作去添加::
表示向env去標入數(shù)據(jù)collectenvgoods
入數(shù)糜貨物數(shù)量
tablc_sclcct_mask=I
envoperationmask_1表示通過而問從tableopcrationmask_1
&示從env表中取出衣示操作goods表減少::
collcct_cnv表
數(shù)據(jù)中取由數(shù)據(jù)貨物數(shù)量
—―----------紜----------
tableselectmask-2table_opcration_mask_2
表示從collect_env&表示操作goods我獲得
中取出實時密據(jù)制定倉庫某種貨物(;息
r-++?《
table_operation_mask_3
表小操作goods表獲得
+--1?制定倉庫所有貨物3息
3、數(shù)據(jù)庫模塊使用的相關(guān)結(jié)構(gòu)體
(1)結(jié)構(gòu)體一:所有倉庫的信息
structenv_info_c1ien_addr{
structstorageinfostorageno[STORAGENUM];
);
作用:用來保存所有倉庫的信息
storage_no[STORAGE_NUM]結(jié)構(gòu)體數(shù)組,分別代表不同的存庫信息。
(2)結(jié)構(gòu)體二:某個倉庫的所有信息
structstorage_info{
unsignedcharstorage_status;//0:open1:close
unsignedcharled_status;
unsignedcharbuzzer_status;
unsignedcharfan_status;
unsignedcharseg_status;
signedcharx;
signedchary;
signedcharz;
charsamplingTime[20];
floattemperature;
floattemperatureMIN;
floattemperatureMAX;
floathumidity;
floathumidityMIN;
floathumidityMAX;
floatillumination;
floatilluminationMIN;
floatilluminationMAX;
floatbattery;
floatadc;
floatadcMIN;
structstorage_goods_infogoods_info[GOODS_NUM];
);
作用:用來保存某一個倉庫的所有信息。
storagestatus
led_status上燈的開關(guān)狀態(tài)
buzzer_status蜂鳴器的開關(guān)狀態(tài)
fan_status風(fēng)扇的開關(guān)狀態(tài)
seg_status數(shù)碼管的狀態(tài)
X;三軸中X的數(shù)值
y;三軸中y的數(shù)值
z;三軸中z的數(shù)值
samplingTime[20];獲取倉庫環(huán)境信息的時間
temperature;倉庫中溫度的大小
temperatureMIN;倉庫中溫度的預(yù)警最小值
temperatureMAX;倉庫中溫度的預(yù)警最大值
humidity;倉庫中濕度的大小
humidityMIN;倉庫中濕度的預(yù)警最小值
humidityMAX;倉庫中濕度的預(yù)警最大值
illumination;倉庫中光照強度的大小
illuminationMIN;倉庫中光照強度的預(yù)警最小值
illuminationMAX;倉庫中光照強度的預(yù)警最大值
battery;剩余電池的百分比
adc;模數(shù)轉(zhuǎn)換的數(shù)值
adcMIN;模數(shù)轉(zhuǎn)換的預(yù)警最小值
goods_info[GOODS_NUM];結(jié)構(gòu)體數(shù)組,分別代表不同的貨物信息。
⑶結(jié)構(gòu)體三:某種貨物的信息
structstorage_goods_info{
unsignedchargoods_type;
unsignedintgoods_count;
);
作用:用來保存某種貨物的信息
goods_type貨物編號
goods_count貨物數(shù)量
⑷結(jié)構(gòu)體四:
structsqlite_operation{
inttabie_se1ect_mask;
intenv_operationmask;
inttabie_operation_mask;
intgoods_operationmask;
);
作用:用來保存數(shù)據(jù)庫操作信息
tabie_select_mask;標記對數(shù)據(jù)庫中的哪個表進行操作
env_operationmask;標記對數(shù)據(jù)庫中的env表進行什么操作
tableoperationmask;標記對數(shù)據(jù)庫中的collectenv表進行什么操作
goods_operationmask;標記對數(shù)據(jù)庫中的goods表進行什么操作
4、Sqlite3數(shù)據(jù)庫中數(shù)據(jù)的存儲形式
表一:倉庫環(huán)境表(environment)
temperatureMax溫度最大值當環(huán)境溫度大于最大值,需要發(fā)送報警信號
temperatureMin溫度最小值當環(huán)境溫度小于最小值,需要發(fā)送報警信號
humidityMax濕度最大值當環(huán)境濕度大于最大值,需要發(fā)送報警信號
humidityMin濕度最小值當環(huán)境濕度小于最小值,需要發(fā)送報警信號
illuminationMax光照強度最大值當環(huán)境光照強度大于最大值,需要發(fā)送報警信號
illuminationMin光照強度最小值當環(huán)境光照強度小于最小值,需要發(fā)送報警信號
telephoneNum手機號報警之后發(fā)短信給管理員
mode
Ifnocice
Interval
updatePeriod
username姓名倉庫管理者姓名
password密碼進入倉庫時的,需要密碼驗證
表二:倉庫環(huán)境溫度表(collect_env)
temperatureVal環(huán)境溫度值這個一個實時數(shù)據(jù),1秒采集一次
humidityVal環(huán)境濕度值這個一個實時數(shù)據(jù),1秒采集一次
illuminationVal環(huán)境光照強度值這個一個實時數(shù)據(jù),1秒采集一次
采集環(huán)境溫度的時候,保存采集時間,方便
envTime采集環(huán)境溫度的時間
管理者進行數(shù)據(jù)分析
表三:倉庫貨物表(goods)
goodsld貨物編號貨物編號,是貨物的唯一標識
goodsCount貨物數(shù)量倉庫中所有貨物的數(shù)量
goodsTime貨物入庫時間記錄貨物入庫的時間
5^pthread_sqlite.h文件詳解
(1)互斥鎖及條件變量部分
?externpthread_cond_tcond_sqlite;
解析:數(shù)據(jù)庫線程部分的條件變量,pthread_cond_wait之后,當其他線程使用相同
的條件變量才能喚醒數(shù)據(jù)庫線程。
程序?qū)嵗?/p>
pthreadmutexlock(&mutex_sqlite);
^)threadcondwait(Scondsqlite,&mutex_sqlite);
pthreadmutexunlock(&mutex_sqlite);
?externpthread_mutex_tmutex_sqlite;
解析:數(shù)據(jù)庫線程鎖,這個線程鎖是和條件變量一起配套使用的。這兩者在條件變量的
使用中缺一不可。
程序?qū)嵗?/p>
pthreadmutexlock(&mutex_sqlite);
^threadcondwait(Scondsqlite,&mutex_sqlite);
pthreadmutexunlock(&mutexsqlite);
?externpthrea_mutex_tmutex_slinklist;
解析:數(shù)據(jù)庫線程鎖,這個線程鎖是用來保護鏈表資源的。防止鏈表在同一時刻被多個
對象訪問。
程序?qū)嵗?/p>
while(1)
{|
pthreadmutexlock(Smutexslinklist);
if((but=sqliteGetLinknode(slinkHead))=NULL)
(一一
pthreadmutexunlock(&mutexslinklist);
break;
)
pthreadmutexunlock(&mutexslinklist);
sqlitetask(buf->datalink,buf->data,buf->storageNum,buf->goodsKinds);
free(buf);
buf=NULL;
)
(2)結(jié)構(gòu)體部分
?externstructenvinfoclienaddrenvinfoclienaddr_s;
解析:全局結(jié)構(gòu)體變量,pthread_analysis線程對數(shù)據(jù)庫進行查詢操作之后把查詢的
結(jié)果保存到該結(jié)構(gòu)體中,這樣pthread_analySis線程就可以讀取到數(shù)據(jù)庫中的數(shù)據(jù)了。
程序?qū)嵗?/p>
envinfoclien_addrs.storage_no[storage_num_t].temperature=callback_val[l];
envinfoclienaddrs.storageno[storagenumt].humidity=callbackval[2];
envinfoclien_addr_s.storage_no[storage_num_t].illumination=call.back_val[3];
strcpy(envinfoclienaddr_s.storageno[storagenumt].samplingTime,callbackstr);
?externstructenv_info_c1ien_addrall_info_RT;
解析:全局結(jié)構(gòu)體變量,plhread_analysis線程對數(shù)據(jù)庫進行查詢操作之后把查詢的
結(jié)果保存到該結(jié)構(gòu)體中,這樣pthread_analySis線程就可以讀取到數(shù)據(jù)庫中的數(shù)據(jù)了。
程序?qū)嵗?/p>
allinfo_RT.storageno[storagenumt].temperature=callback_val[l];
allinfo_RT.storage_no[storagenumt].humidity=callbackval[2];
allinfoRT.storageno[storagenumt].illumination=callbackval[3];
strcpy(allinfo_RT.storageno[storagenumt].sampling!ime,caUbackstr);
(3)函數(shù)接口部分(具體的函數(shù)參數(shù)信息見文檔《數(shù)據(jù)庫接口函數(shù)詳解》)
?intCreate_table(void);
解析:用于在數(shù)據(jù)庫中創(chuàng)建空表。在main函數(shù)開始執(zhí)行時,就要調(diào)用該函數(shù)創(chuàng)建好數(shù)
據(jù)庫表,以供后面的線程使用。
?intInit_table_env(void);
解析?:用于初始化env表的數(shù)據(jù)。在main函數(shù)開始執(zhí)行時,創(chuàng)建好數(shù)據(jù)庫表之后就對
調(diào)用該函數(shù)初始化env表。
?intupdateEnv(structenv_info_clien_addrenv_info_clien_addr_t,
intstorageNum_t);
解析:用于更新env表中的信息。
?intgetEnv(structenv_info_clien_addr*env_info_c1ien_addr_t,
intstorageNumt);
解析:用于得到env表中的信息。
?intinsertedlect_env(structenv_info_c1ien_addrenv_info_clien_addr_t,
intstorage_num);
解析:用于向collect_env中插入新的倉庫環(huán)境信息。
?intgetCollect_env(char[],intstorage_num_t);
解析:用于按指定時間獲得collect_env表中的倉庫環(huán)境信息。
?intgetCollectCurrentenv(intstoragenumt);
解析:用于獲得最新的collect_env表中的倉庫環(huán)境信息。
?intinsertGoods(structenv_info_c1ienaddrenv_info_c1ien_addr_t,
intstorageNumt,intgoodsKindst);
解析:用于向goods表總插入新的貨物信息。
?intdeletGoods(intstorageNum_t,intgoodsKinds_t);
解析:用于從goods表中刪除指定的貨物信息。
?intgetGoods(intstorageNum_t,intgoods_kinds_t);
解析:用于獲得goods表中指定的貨物信息。
?intviewGoods(intstorageNum_t,intgoodsKinds_t);
解析:用于查看goods表中是否有指定的貨物信息。
?intaddGoods(structenv_info_c1ien_addrenv_info_c1ien_addr_t,
intstorageNum_t,intgoodsKinds_t);
解析:用于貨物入倉時的goods表的更新。
?intreduceGoods(structenv_info_c1ien_addrenv_info_c1ien_addr_t,
intstorageNum_t,intgoodsKinds_t);
解析:用于貨物出倉時的goods表的更新。
?voidsqlite_task(structenv_info_clienaddrenv_info_c1ien_addr_t,
structsqlite_operationsq1ite_operation_t,
intstorageNum_t,intgoodsKinds_t);
解析?:用于專門執(zhí)行對sqlite3數(shù)據(jù)庫操作的函數(shù)接口,通過讀取函數(shù)參數(shù)來實現(xiàn)對
sqlite3數(shù)據(jù)庫中的具體表進行增、刪、改、查的操作。
第四節(jié):數(shù)據(jù)接收模塊
1.功能描述
接收M0通過Zigbee傳輸上來的消息,經(jīng)過接收端的Zigbee,再通過U轉(zhuǎn)串,此線程負責(zé)從串
□讀取消息,并交給數(shù)據(jù)處理模塊,并繼續(xù)接收消息
2.數(shù)據(jù)描述
類型名稱功能
intdev_uart_fd串口文件描述符
linklist1inkHead數(shù)據(jù)緩存鏈表頭
pthread_cond_tcond_analysis數(shù)據(jù)處理模塊喚醒條件變量
pthread_mutex_tmutex_linklist數(shù)據(jù)緩存保護互斥鎖
3.流程圖
睡眠
激活
4.詳細說明
本線程被創(chuàng)建后,先打開串口叮1;580這…設(shè)備節(jié)點,得到文件描述符
dev_uart_fd,通過調(diào)用serial_init(dev_uart_fd)來進行串口的初始化;之后線
程通過read串口進行睡眠,一旦有數(shù)據(jù),就從串口里讀取,并判斷包頭是否正確,
若正確則讀取數(shù)據(jù),加入數(shù)據(jù)鏈表緩存.
^include"linklist,h”
#include〃data_global.h〃
^defineLEN_ENV20
#defineLEN_RFTD4
externintdevuartfd;
externlinklist1inkllead;
externpthread_cond_tcond_analysis;
externpthread_mutex_tmutex_linklist;
voidserialinit(intfd)
(
structtermiosoptions;
tcgetattr(fd,&options);〃讀取終端參數(shù)
options,ccflag|=(CLOCALCREAD);〃忽略調(diào)制調(diào)解器線路狀態(tài),使用接收器
options.c_cflag&二?CSIZE;〃清目前字符長度
options.c_cflag&='CRTSCTS;〃不實用RTS/CTS流控制
options.c_cflagI=CS8;〃字符長度設(shè)置為8
options,ccflag&="CSTOPB;〃設(shè)置1個標志位
options.c_iflagI=IGNPAR;〃允許輸入奇偶校驗
options.c_iflag&="(ICRNL|IXON);〃回車不轉(zhuǎn)為換行,不允許輸入時對
XON/XOFF流進行控制
options.c_oflag=0;
options.c_lflag=0;
cfsetispeed(ftoptions,Bl15200);〃設(shè)置波特率為115200
cfsetospeed(&options,B115200);
tcsetattr(fd,TCSANOW,feoptions);〃設(shè)置終端參數(shù)
)
void*pthread_transfer(void*arg)
(
inti=0,len;
charflag=0,check;
1inkdatatypebuf;
linkHead=CreateEmptyLinklist();
if((dev_uart_fd=open(DEV_ZIGBEE,O_RDWR))<0)
perror("openttyUSBO");
exit(-1);
)
serial_init(dev_uart_fd);
printf(^pthreadtransferisok\n〃);
while(1)
(
memset(&buf,0,sizeof(linkdatatype));
read(dev_uart_fd,&check,1);
if(check=='s')
(
check=0;
read(dev_uart_fd,&check,1);
if(check=='t')
(
check=0;
read(dev_uart_fd,&check,1);
if(check==')
(
check=0;
read(dev_uart_fd,&check,1);
if(check=='e')
(
buf.msgtype='e';
usleep(l);
if((len=read(dev_uart_fd,buf.text,LEN_ENV))!=LEN_ENV)
(
for(i=len;i<LEN_ENV;i++)
(
read(dev_uart_fd,buf.text+i,1);
)
)
flag=1;
)
elseif(check='r')
(
buf.msg_type='r';
usleep(1);
if((len=read(dev_uart_fd,buf.text,LEN_RFID))!二
LEN_RFID)
for(i=len;i<LEN_RFID;i++)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 流程管理和流程優(yōu)化培訓(xùn)
- 2025年消費者權(quán)益保護年報-
- 活動策劃培訓(xùn)內(nèi)容
- 2024-2025學(xué)年江西省萍鄉(xiāng)市高一下學(xué)期期末考試歷史試題(解析版)
- 2026年電子商務(wù)運營師考試題庫及答案詳解
- 2026年文化傳承與創(chuàng)新文化傳播專業(yè)考試題
- 2026年環(huán)境法律法規(guī)知識測試題
- 2026年工程項目成本控制與設(shè)計策略討論課題測試題
- 2026年物流專員貨物運輸與倉儲管理效率測試
- 2026年生物醫(yī)藥類專業(yè)考研試題與答案詳解
- 別克英朗說明書
- 地下管線測繪課件
- 珍稀植物移栽方案
- 新人教版數(shù)學(xué)三年級下冊預(yù)習(xí)學(xué)案(全冊)
- JJG 810-1993波長色散X射線熒光光譜儀
- GB/T 34336-2017納米孔氣凝膠復(fù)合絕熱制品
- GB/T 20077-2006一次性托盤
- GB/T 1335.3-2009服裝號型兒童
- GB/T 10046-2008銀釬料
- GA 801-2019機動車查驗工作規(guī)程
- 灌注樁后注漿工藝.-演示文稿課件
評論
0/150
提交評論