999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于樹(shù)莓派加Python智能密碼鎖的設(shè)計(jì)與實(shí)現(xiàn)

2020-10-26 02:22:25趙宏哲王鵬

趙宏哲 王鵬

摘 要:一般的住宅或單位,為保證室內(nèi)財(cái)物的安全,通常采用門上加鎖的方法解決,而且絕大多數(shù)使用傳統(tǒng)的機(jī)械鎖。隨著科技的發(fā)展,智能電子鎖應(yīng)運(yùn)而生,系統(tǒng)由python網(wǎng)絡(luò)編程、樹(shù)莓派系統(tǒng)與手機(jī)客戶端組成。系統(tǒng)能完成遠(yuǎn)程開(kāi)鎖、智能監(jiān)控、遠(yuǎn)程呼叫、超次鎖定密碼鎖等功能,依據(jù)實(shí)際的情況還可以添加有聲提示與智能家居相關(guān)的功能。實(shí)驗(yàn)表明,此系統(tǒng)具有安全性高、成本低、保密性好、使用靈活等優(yōu)點(diǎn),可應(yīng)用于賓館、辦公大樓和家庭等場(chǎng)所。

關(guān)鍵詞:智能鎖;遠(yuǎn)程開(kāi)鎖;智能監(jiān)控;遠(yuǎn)程呼叫;智能家居;樹(shù)莓派;Python

中圖分類號(hào):TM932? 文獻(xiàn)標(biāo)識(shí)碼:A? 文章編號(hào):1673-260X(2020)09-0049-06

1 研究背景

傳統(tǒng)的門鎖通常一把鑰匙對(duì)應(yīng)一把鎖。日常生活中,每個(gè)人都會(huì)面對(duì)很多門鎖,需要隨身攜帶一大串鑰匙,而這把最關(guān)鍵的鑰匙卻時(shí)常忘帶或弄丟,被門鎖擋在外面的尷尬事情時(shí)有發(fā)生。在科技高度發(fā)達(dá)的今天,智能家居下的智能門鎖已經(jīng)誕生,但智能門鎖的應(yīng)用還不夠普及。

首先,智能門鎖不能普及的最重要原因是技術(shù)門檻比較高,大多數(shù)產(chǎn)品售價(jià)都非常高,對(duì)于普通家庭來(lái)說(shuō)較難承受。參照個(gè)人計(jì)算機(jī)、智能手機(jī)、汽車等行業(yè)的發(fā)展歷程,這些高科技產(chǎn)品問(wèn)世初期,使用此產(chǎn)品的用戶數(shù)量非常有限。隨著技術(shù)攻關(guān)、批量生產(chǎn),現(xiàn)在這些商品都已經(jīng)普及到很多家庭,這是大多數(shù)高科技產(chǎn)品普及過(guò)程的規(guī)律。相信隨著智能門鎖技術(shù)的不斷進(jìn)步,其價(jià)格也會(huì)越來(lái)越親民。

其次,我國(guó)的智能門鎖與西方發(fā)達(dá)國(guó)家的智能門鎖相比還是有一定的差距。由于技術(shù)原因,還存在開(kāi)發(fā)成本較高、功能單一的問(wèn)題。

針對(duì)以上問(wèn)題,現(xiàn)在國(guó)內(nèi)一些企業(yè)已經(jīng)開(kāi)始積極攻克技術(shù)難題,發(fā)展前景非常樂(lè)觀。本文就智能門鎖平民化、普適化為出發(fā)點(diǎn),使用性價(jià)比更高的樹(shù)莓派作主板,用python語(yǔ)言開(kāi)發(fā)智能門鎖服務(wù)器端,成本不足300元,約等于一個(gè)普通門鎖加上一個(gè)無(wú)線路由器的價(jià)格,而且這兩樣?xùn)|西幾乎每個(gè)家庭都有,相當(dāng)于花較少的錢,升級(jí)了門鎖,對(duì)于普通老百姓來(lái)說(shuō)都可以消費(fèi)得起。

2 智能密碼鎖的設(shè)計(jì)與實(shí)現(xiàn)

2.1 設(shè)計(jì)概述與原理

目前,電子技術(shù)和計(jì)算機(jī)技術(shù)發(fā)展日新月異,市場(chǎng)上出現(xiàn)了類似樹(shù)莓派這樣成本低、體積小的卡式電腦,而且具有強(qiáng)大的運(yùn)算能力。與傳統(tǒng)的單片機(jī)相比,功能更多,非常適合作為家居控制服務(wù)器,負(fù)責(zé)與互聯(lián)網(wǎng)的通訊,處理數(shù)據(jù)量大的工作,還能方便使用手機(jī)控制家具。本設(shè)計(jì)主要是利用樹(shù)莓派搭建服務(wù)器,與手機(jī)端相連接,通過(guò)快速的數(shù)據(jù)處理實(shí)現(xiàn)門鎖的開(kāi)關(guān)以及完成其他功能。與傳統(tǒng)的單片機(jī)相比,卡式電腦的樹(shù)莓派功能多,更適合作為智能家居的控制服務(wù)器。

設(shè)計(jì)原理是手機(jī)端應(yīng)用加樹(shù)莓派主板控制舵機(jī)驅(qū)動(dòng)鎖芯來(lái)實(shí)現(xiàn)開(kāi)鎖功能。本智能門鎖開(kāi)發(fā)主要是運(yùn)用了python服務(wù)端的開(kāi)發(fā)與java安卓應(yīng)用的綜合示例。為了降低成本,使用了當(dāng)前性價(jià)比較高的樹(shù)莓派主板,通過(guò)樹(shù)莓派主板控制舵機(jī)驅(qū)動(dòng)鎖芯,達(dá)到開(kāi)鎖的目的。通過(guò)網(wǎng)絡(luò)連接手機(jī)與門鎖設(shè)備,輸入開(kāi)鎖賬號(hào)及密碼,實(shí)現(xiàn)遠(yuǎn)程操控門鎖開(kāi)與關(guān)。智能門鎖與移動(dòng)端的連接,如圖1所示。

2.2 服務(wù)器端代碼

2.2.1 建立socket鏈接

本系統(tǒng)是利用socket網(wǎng)絡(luò)編程實(shí)現(xiàn)的,第一步需要?jiǎng)?chuàng)建socket服務(wù)。為了提高效率與并發(fā)量,這里采取了即用即創(chuàng)建即銷毀的概念。即每一次App向服務(wù)器端發(fā)送信息,都會(huì)創(chuàng)建一次連接,服務(wù)器端接收到信息馬上處理,做出響應(yīng)后立即斷開(kāi)連接,提高系統(tǒng)使用效率。這里的做法是通過(guò)while循環(huán)接受App端發(fā)來(lái)的消息,每次創(chuàng)建新的scoket_tcp來(lái)準(zhǔn)備接受用戶傳遞的信息。

一般監(jiān)聽(tīng)個(gè)數(shù)只能是一個(gè),如果增加監(jiān)聽(tīng)數(shù)量,會(huì)降低安全性,比如兩個(gè)人同時(shí)到家,沒(méi)有必要兩個(gè)人都同時(shí)連接這個(gè)設(shè)備,一個(gè)人開(kāi)門即可。如果出現(xiàn)監(jiān)聽(tīng)數(shù)量大于1,則可能有人破解門鎖,要及時(shí)發(fā)出預(yù)警。

以下為部分相關(guān)源代碼:

while True:

print ( "服務(wù)準(zhǔn)備完畢,等待創(chuàng)建 . . . " )

socket_tcp = socket . socket ( socket . AF_INET, socket . SOCK_STREAM ) #創(chuàng)建socket

print ( "監(jiān)聽(tīng)I(yíng)P以及端口 @ %s:%d!" % ( HOST_IP, HOST_PORT ) )

#程序會(huì)在這里停止,當(dāng)有設(shè)備進(jìn)行連接的時(shí)候,才繼續(xù)運(yùn)行下面的代碼。

host_addr = ( HOST_IP, HOST_PORT )

socket_tcp . bind ( host_addr )? #綁定用戶樹(shù)莓派的ip地址和端口號(hào)。

socket_tcp . listen( 1 )? #listen函數(shù)的參數(shù)是監(jiān)聽(tīng)客戶端的個(gè)數(shù),這里只監(jiān)聽(tīng)一個(gè)增加安全性能。

2.2.2 客戶端連接并接收客戶端發(fā)送數(shù)據(jù)

接下來(lái)客戶端連接本服務(wù),并發(fā)送客戶端傳送過(guò)來(lái)的信息,通過(guò)每一個(gè)命令創(chuàng)建一次連接,同時(shí)斷開(kāi)連接,達(dá)到多用戶同時(shí)使用開(kāi)鎖系統(tǒng)。用戶創(chuàng)建連接成功之后,可以接收客戶端發(fā)送的信息,將接收的信息定義為data保存起來(lái)。

以下為部分相關(guān)源代碼:

while True:

print ( '等待信號(hào) . . . ')

#等待接收客戶端的請(qǐng)求。

socket_con, ( client_ip, client_port ) = socket_tcp . accept ( )

#這里顯示發(fā)送命令的用戶。

print ( "連接成功 客戶ip為:%s . " %client_ip )

data=socket_con . recv ( 1024 )? #接收數(shù)據(jù)。

2.2.3 通過(guò)正則表達(dá)式轉(zhuǎn)化接收數(shù)據(jù)

App客戶端傳輸過(guò)來(lái)的信息數(shù)據(jù)是一串有著特殊含義的字節(jié)流轉(zhuǎn)化的字符串,要從中獲取到需要的信息,就需要使用正則表達(dá)式將這一串特殊的字符串轉(zhuǎn)化為指定字符串。例如,App端傳輸?shù)氖亲止?jié)流文件,字符串格式為“b功能選擇$事件選擇#密碼”,顯而易見(jiàn)這個(gè)b是沒(méi)有實(shí)際作用的,只是字節(jié)流轉(zhuǎn)化為字符串的時(shí)候產(chǎn)生的沒(méi)用信息,于是需要將b去除,得到后面有用的信息。如下文,得到的data_s就是通過(guò)正則表達(dá)式過(guò)濾的特定字符串功能選擇$事件選擇#密碼。

以下為部分相關(guān)源代碼:

#這里通過(guò)定義string來(lái)定義篩選規(guī)則,過(guò)濾出傳輸過(guò)程中沒(méi)用的信息。

string = "b' ( . * ) '"

#這里將之前得到的客戶端信息進(jìn)行字符串轉(zhuǎn)化,通過(guò)string自定義的規(guī)則來(lái)分離data。

data_s = re . compile ( string ) . findall ( str ( data ) ) [0]

接下來(lái)依次分離出各個(gè)字符串。之前分離出來(lái)了密碼字符串,接下來(lái)將密碼字符串去掉,如下文第一第二行,現(xiàn)在的data_s就是功能選擇$事件選擇這樣的字符串。接下來(lái)將功能選擇提取出來(lái)賦值給data_g,再將事件選擇提取出來(lái)賦值給data_j。

以下為部分相關(guān)源代碼:

#這里通過(guò)定義string來(lái)定義篩選規(guī)則,python新的賦值將會(huì)替換之前的復(fù)制。

string = " ( . * ) #"

#這里使用之前分離出來(lái)的data_s,通過(guò)替換之后的string自定義的規(guī)則來(lái)分離data_s。

data_s = re . compile ( string ) . findall? ? ?( data_s ) [0]

#以下代碼原理同上,這里不作過(guò)多的闡述。

string = " ( . * ) \$"

data_g = re . compile ( string ) . findall? ? ( str ( data_s ) ) [ 0 ]#功能選擇字符

string = "\$ ( . * ) "

data_j = re . compile ( string ) . findall ( str ( data_s ) ) [0]#事件選擇字符

2.2.4 身份認(rèn)證

為了門鎖的安全使用,傳輸過(guò)程中,字符串中包含的密碼是通過(guò)base64編碼進(jìn)行加密,并且在服務(wù)器端進(jìn)行密碼還原。需要再一次使用正則表達(dá)式提取出字符串功能選擇$事件選擇#密碼其中的加密密碼信息,下一步將密碼通過(guò)base64算法進(jìn)行解密,將App客戶端傳輸過(guò)來(lái)解密后的密碼與服務(wù)器端密碼比較,判斷是否一致,不一致直接斷開(kāi)連接,提示App客戶端密碼輸入錯(cuò)誤。密碼正確繼續(xù)執(zhí)行命令的語(yǔ)句。

以下為部分相關(guān)源代碼:

string = "# ( . * ) "

data_p = re . compile ( string ) . findall ( data_s ) [0]

#此語(yǔ)句為對(duì)data_p密碼進(jìn)行解密,解密之后與原密碼進(jìn)行比較

data_p = base64 . b64decode ( data_p )

if data_p ! = password:

#此語(yǔ)句為服務(wù)器反饋給用戶的信息

socket_con . send ( bytes ( '密碼錯(cuò)誤!請(qǐng)重新輸入', 'utf-8' ) )

break

2.2.5 開(kāi)鎖樣例

上面確定了密碼正確可以執(zhí)行開(kāi)鎖操作。通過(guò)功能選擇和事件選擇執(zhí)行下方的語(yǔ)句,服務(wù)器系統(tǒng)即可回應(yīng)用戶響應(yīng)的開(kāi)鎖操作。

以下為部分相關(guān)源代碼:

if data_g = = '1':

if data_j = = '1':

#此語(yǔ)句為服務(wù)器反饋給用戶的信息

socket_con . send ( bytes ('開(kāi)鎖成功,5s后自動(dòng)上鎖', 'utf-8' ) )

#服務(wù)器開(kāi)閉鎖動(dòng)作,此動(dòng)作開(kāi)鎖5秒鐘之后自動(dòng)閉鎖。

#參數(shù)open_close為開(kāi)閉鎖動(dòng)作,1為執(zhí)行一遍。

SSR . thread_runActing (' open_close ', 1 )

elif data_j = = '2':

if ( ppz ! = data_j ) :

ppz = data_j

#此語(yǔ)句為服務(wù)器反饋給用戶的信息

socket_con . send ( bytes ('開(kāi)鎖成功,別忘記上鎖', 'utf-8' ) )

#服務(wù)器開(kāi)鎖動(dòng)作,此動(dòng)作開(kāi)鎖之后不自動(dòng)閉鎖。

#參數(shù)open為開(kāi)鎖動(dòng)作,1為執(zhí)行一遍。

SSR . thread_runActing ( ' open', 1 )

else:

#此語(yǔ)句為服務(wù)器反饋給用戶的信息

socket_con . send ( bytes ( '主人,已經(jīng)開(kāi)鎖啦,別點(diǎn)我啦', 'utf-8' ) )

……

2.2.6 其他附屬功能

一些其他的輔助功能,需要識(shí)別符data_g進(jìn)行選擇。如需修改門鎖密碼,只需要發(fā)送data_g的值為2,服務(wù)器端即可識(shí)別需要操作的動(dòng)作是修改密碼。

以下為部分相關(guān)源代碼:

elif data_g = = '2':

string = " ( . * ) #"

data_j1 = re . compile ( string ) . findall? ? ( data_s ) [0]

string = "# ( . * ) "

data_j2 = re . compile ( string ) . findall? ? ( data_s ) [0]

if ( data_j1 = = password ) :

password = data_j2

socket_con . send ( bytes ( '密碼修改成功,請(qǐng)妥善保存密碼', 'utf-8' ) )

else:

socket_con . send ( bytes ( '與原密碼不一致,修改失敗', 'utf-8' ) )

2.3 App端數(shù)據(jù)收發(fā)核心代碼

App客戶端核心代碼主要為與服務(wù)器之間的交互,在加載頁(yè)面主頁(yè)的時(shí)候,需要加載一下內(nèi)容。第一步需要聲明成員變量,通過(guò)initView( )方法并且對(duì)調(diào)用send( )點(diǎn)擊事件進(jìn)行監(jiān)聽(tīng)。

2.3.1 部分相關(guān)源代碼

private EditText et_send ;

private Button bt_send1 ;

private Button bt_send2 ;

private Button bt_send3 ;

private Button bt_send4 ;

private Button bt_send5 ;

private TextView tv_recv ;

protected void onCreate ( Bundle savedInstanceState ) {

super . onCreate ( savedInstanceState ) ;

setContentView ( R . layout . activity_main);

initView ( ) ;

handler = new Handler ( ) ;

send ( ) ;? }

private void initView ( ) {

et_send = ( EditText ) findViewById ( R . id . et_send ) ;

bt_send1 = ( Button ) findViewById ( R . id . bt_send1 ) ;

bt_send2 = ( Button ) findViewById ( R . id . bt_send2 ) ;

bt_send3 = ( Button ) findViewById ( R . id . bt_send3 ) ;

bt_send4 = ( Button ) findViewById ( R . id . bt_send4 ) ;

bt_send5 = ( Button ) findViewById ( R . id . bt_send5 ) ;

tv_recv = ( TextView ) findViewById ( R . id . tv_recv ) ;? }

2.3.2 向服務(wù)器端發(fā)送消息

本代碼片段為send( )方法的部分片段。當(dāng)需要開(kāi)鎖操作,可觸發(fā)send( )事件,首先要?jiǎng)?chuàng)建與服務(wù)器之間的socket連接,將指定的信息與用戶輸入的密碼一起以一個(gè)特殊的字符串格式發(fā)送給服務(wù)器,但是在發(fā)送之前需要先將字符串轉(zhuǎn)化為字節(jié)流,在通過(guò)OutputStream將數(shù)據(jù)發(fā)送到服務(wù)器端。為了保證用戶密碼信息安全,在發(fā)送密碼的時(shí)候采用的base64加密,將加密后的信息發(fā)送到服務(wù)器端,如下文第七行,將密碼進(jìn)行加密。執(zhí)行完一次操作之后,調(diào)用recv( )接收方法,來(lái)接收服務(wù)器返回的數(shù)據(jù)。

以下為部分相關(guān)源代碼:(這里只舉例bt_send1方法)

private void send ( ) {

bt_send1 . setOnClickListener ( new View . OnClickListener ( ) {

public void onClick ( View v ) {

new Thread ( new Runnable ( ) {

public void run ( ) {? try {? socket = new Socket ( host , port ) ;

} catch ( Exception e ) {? e . printStackTrace ( ) ;? }

send_buff = et_send . getText ( ) . toString ( ) ;

//向服務(wù)器端發(fā)送消息

OutputStream outputStream=null ;

Reader read = null ;

try { outputStream = socket . getOutputStream ( ) ;

} catch ( IOException e ) { e . printStackTrace ( ) ;? }

if ( outputStream! =null ) { try {

outputStream . write ( ( "1$1#" + send_buff ) . getBytes ( ) ) ;

outputStream . flush ( ) ;

} catch ( IOException e ) { e . printStackTrace ( ) ;? } }

recv ( ) ;? }? } ) . start ( ) ;? }? } ) ;

bt_send2 . setOnClickListener ( new View . OnClickListener ( ) {…} ) ;

bt_send3 . setOnClickListener ( new View . OnClickListener ( ) {…} ) ;

bt_send4 . setOnClickListener ( new View . OnClickListener ( ) {…} ) ;

bt_send5 . setOnClickListener ( new View . OnClickListener ( ) {…} ) ;? }

2.3.3 接收來(lái)自服務(wù)器端的消息

首先定義一個(gè)方法名叫recv用來(lái)接收數(shù)據(jù)。創(chuàng)建一個(gè)InputStream字節(jié)流對(duì)象,來(lái)接收服務(wù)器端socket發(fā)送的數(shù)據(jù)。

socket通信傳輸?shù)氖莃yte類型,需要轉(zhuǎn)為String類型,將接收到的數(shù)據(jù)顯示在TextView上。因?yàn)閠extView是主線程建立的,所以可以在子線程中刷新UI。

執(zhí)行完畢跳轉(zhuǎn)到監(jiān)聽(tīng)端口,以此來(lái)反復(fù)循環(huán)地向服務(wù)器發(fā)送數(shù)據(jù)。

以下為部分相關(guān)源代碼:

private void recv ( ) {

//單開(kāi)一個(gè)線程循環(huán)接收來(lái)自服務(wù)器端的消息

InputStream inputStream = null ;

try {? inputStream = socket . getInputStream ( ) ;

} catch ( IOException e ) {? e . printStackTrace ( ) ;? }

if ( inputStream! =null ) {? try {

byte[] buffer = new byte[1024] ;

int count = inputStream . read ( buffer);? //count是傳輸?shù)淖止?jié)數(shù)

System . out . println ( buffer ) ;

recv_buff = new String ( buffer ) ; //socket通信傳輸?shù)氖莃yte類型

} catch ( IOException e ) {? e . printStackTrace ( ) ;? }? }

//將受到的數(shù)據(jù)顯示在TextView上

if ( recv_buff! =null ) {? handler . post ( runnableUi ) ;? ?}? send ( ) ;? }

//不能在子線程中刷新UI,應(yīng)為textView是主線程建立的

Runnable runnableUi = new Runnable ( ) {

public void run ( ) { tv_recv . setText ( recv_buff ) ;? }? } ;

2.4 測(cè)試

測(cè)試過(guò)程是配置一套簡(jiǎn)單的智能門鎖。為了保證實(shí)驗(yàn)的準(zhǔn)確性,通過(guò)手機(jī)遠(yuǎn)程對(duì)智能門鎖的開(kāi)關(guān)進(jìn)行了上百次的開(kāi)鎖測(cè)試。測(cè)試結(jié)果表明開(kāi)鎖信息可以準(zhǔn)確、穩(wěn)定的傳輸,并且測(cè)試其他附加功能如:修改密碼、完成指定的事件動(dòng)作等功能,全部可以正常完成。通過(guò)測(cè)試,可以達(dá)到出門只帶手機(jī),不帶鑰匙,方便出行的預(yù)期效果,而且具有較好的實(shí)時(shí)性和穩(wěn)定性。

3 智能門鎖的功能及使用說(shuō)明

(1)遠(yuǎn)程解鎖。通過(guò)網(wǎng)絡(luò)編程,可以用手機(jī)遠(yuǎn)程控制家里門鎖的開(kāi)關(guān)。出門在外,能做到一個(gè)手機(jī)就淘汰了錢包和鑰匙。還可以處理一些突發(fā)情況,比如家里沒(méi)人的時(shí)候發(fā)生意外事件時(shí),可以操控遠(yuǎn)程開(kāi)鎖,方便緊急事件處理。

(2)防盜拍照。高配版智能門鎖配有攝像頭人臉識(shí)別功能,攝像頭可以檢測(cè)長(zhǎng)較時(shí)間停留在家門口觀望的人,拍照后可發(fā)送到主人的手機(jī)端,同時(shí)還可以檢測(cè)到陌生人是否觸碰大門,未開(kāi)鎖觸碰大門時(shí)攝像頭同樣會(huì)拍下照片,實(shí)現(xiàn)門鎖監(jiān)控功能,增強(qiáng)安全性。

(3)門鈴呼叫。門上置有智能門鈴,例如當(dāng)家中孩子放學(xué)回家,但是家里沒(méi)有人進(jìn)不去屋,也沒(méi)有手機(jī),不能呼叫家長(zhǎng),這時(shí)可以按動(dòng)智能門鈴,可以將按門鈴人的現(xiàn)場(chǎng)照片發(fā)送到主人手機(jī),由主人決定是否遠(yuǎn)程開(kāi)門。

(4)超次鎖定。為了提高系統(tǒng)安全性,本系統(tǒng)增加了超次鎖定功能。當(dāng)密碼輸入錯(cuò)誤超過(guò)一定次數(shù),門鎖將會(huì)死鎖,并且記錄手機(jī)標(biāo)識(shí)碼,本手機(jī)永遠(yuǎn)不能打開(kāi)此門鎖,防止他人惡意破解。在配置門鎖時(shí),可設(shè)置超級(jí)管理員,其手機(jī)號(hào)碼不會(huì)被超次鎖定,同時(shí)可以解除其他手機(jī)的超次鎖定。如果本人忘記密碼,可通過(guò)超級(jí)管理員手機(jī)進(jìn)行密碼重置,恢復(fù)為系統(tǒng)默認(rèn)密碼。

(5)智能家居。在為家庭設(shè)置智能門鎖的同時(shí),還可以將傳統(tǒng)家居升級(jí)至智能家居系統(tǒng),利用智能門鎖的服務(wù)器功能,關(guān)聯(lián)房間的其他家具,實(shí)現(xiàn)智能窗簾,智能冰箱,智能LED燈等功能。

4 結(jié)束語(yǔ)

本文介紹的智能門鎖是在傳統(tǒng)門鎖的基礎(chǔ)上通過(guò)互聯(lián)網(wǎng)與傳統(tǒng)門鎖的結(jié)合,設(shè)計(jì)出一款新型的智能門鎖。充分利用智能手機(jī)客戶端加智能門鎖服務(wù)端的系統(tǒng)設(shè)計(jì),解決了出門不用帶一大串鑰匙的問(wèn)題。利用手機(jī)開(kāi)鎖和閉鎖,代替?zhèn)鹘y(tǒng)鑰匙開(kāi)鎖,既增加安全性,又方便了出行,最后在實(shí)物系統(tǒng)測(cè)試中取得成功。

——————————

參考文獻(xiàn):

〔1〕孫松林.5G時(shí)代[M].北京:中信出版集團(tuán),2019.

〔2〕趙大偉.互聯(lián)網(wǎng)思維獨(dú)孤九劍[M].北京:機(jī)械工業(yè)出版社,2015.

〔3〕趙英杰.完美圖解物聯(lián)網(wǎng)loT實(shí)操[M].北京:電子工業(yè)出版社,2018.

〔4〕Wolfram Donate. Python樹(shù)莓派編程[M].北京:機(jī)械工業(yè)出版社,2016.

〔5〕劉耕,蘇郁.5G賦能行業(yè)應(yīng)用與創(chuàng)新[M].北京:人民郵電出版社,2020.

〔6〕羅建標(biāo),陳岳武.通信線路工程設(shè)計(jì)、施工與維護(hù)[M].北京:人民郵電出版社,2018.

〔7〕廖建尚.面向物聯(lián)網(wǎng)的CC2530與傳感器應(yīng)用開(kāi)發(fā)[M].北京:電子工業(yè)出版社,2018.

〔8〕中國(guó)移動(dòng)通信有限公司政企客戶分公司.5G落地應(yīng)用融合與創(chuàng)新[M].北京:機(jī)械工業(yè)出版社,2019.

〔9〕Rushi Gajjar.樹(shù)莓派+傳感器:創(chuàng)建智能交互項(xiàng)目的實(shí)用方法、工具及最佳實(shí)踐[M].北京:機(jī)械工業(yè)出版社,2016.

〔10〕吳軍.智能時(shí)代大數(shù)據(jù)與智能革命重新定義未來(lái)[M].北京:中信出版社集團(tuán)股份有限公司,2016.

主站蜘蛛池模板: 国产免费人成视频网| 日韩国产欧美精品在线| 亚洲视频在线青青| jizz亚洲高清在线观看| 国产二级毛片| 久久精品国产精品国产一区| 国产成人成人一区二区| 中文字幕乱码中文乱码51精品| 日韩国产综合精选| 国产精品人成在线播放| 欧美日韩国产综合视频在线观看| 免费一级α片在线观看| 亚洲精品无码人妻无码| 午夜无码一区二区三区| 精品少妇人妻av无码久久| 香蕉国产精品视频| 国产剧情一区二区| 欧美综合区自拍亚洲综合天堂| 九色视频在线免费观看| 日韩国产 在线| 成年人国产视频| 一级毛片无毒不卡直接观看| 久久综合色88| 色综合天天综合| 国产精品免费久久久久影院无码| 国产成本人片免费a∨短片| 国产一级片网址| 国产一级二级在线观看| 女高中生自慰污污网站| 日本爱爱精品一区二区| 天天做天天爱夜夜爽毛片毛片| 亚洲无码高清视频在线观看 | 伊人成人在线视频| 日韩成人高清无码| 国产综合色在线视频播放线视| 狠狠五月天中文字幕| 色偷偷一区| 亚洲婷婷在线视频| 最新国产麻豆aⅴ精品无| 青青草综合网| 国产丝袜啪啪| 日韩精品一区二区三区中文无码| 欧美日韩导航| www.youjizz.com久久| 国产精品成人观看视频国产| 黄色网址手机国内免费在线观看| 亚洲成A人V欧美综合| 九九热精品视频在线| 亚洲中文字幕久久无码精品A| 美女一级免费毛片| 国产天天色| 欧美精品成人一区二区在线观看| 免费毛片网站在线观看| 欧美a级在线| 97亚洲色综久久精品| 97在线视频免费观看| 日本免费精品| 日韩第八页| 色一情一乱一伦一区二区三区小说| 国内丰满少妇猛烈精品播 | 国产精品久久久免费视频| 国产香蕉在线| 日韩高清欧美| 曰AV在线无码| 久久久久久久蜜桃| 在线视频一区二区三区不卡| 欧美午夜视频在线| 九月婷婷亚洲综合在线| 天天综合网在线| 精品一区国产精品| 色男人的天堂久久综合| 国产91麻豆视频| AV老司机AV天堂| 伊在人亚洲香蕉精品播放| 一本一道波多野结衣一区二区| 亚洲美女一级毛片| 日本不卡在线视频| 毛片免费在线| 中文字幕人妻av一区二区| 国产精品偷伦在线观看| 亚洲美女一区二区三区| 精品久久久久成人码免费动漫|