① 、準備一個8G以上的micro SD卡和讀卡器,推薦使用class4以上的卡java
② 、登陸https://www.raspberrypi.org/downloads/獲取系統安裝。python
③ 、將下載下來的zip壓縮包進行解壓shell
④ 、在Windows上使用etcher軟件燒錄,下載網站https://www.balena.io/etcher。服務器
⑤ 、將TF卡插入到讀卡器裏面,插到電腦USB上,打開etcher進行燒錄,若是失敗,能夠對TF卡進行格式化,在進行燒錄。網絡
① 、在TF燒寫的系統的boot目錄下,新建一個ssh文件。ssh
② 、用網線將樹莓派和電腦鏈接起來,打開電源,啓動樹莓派。socket
③ 、筆記本鏈接上無線網絡,在電腦上右鍵wifi圖標打開網絡和共享中心>更改適配器設置,共享無線網絡,以下圖所示。 ide
④ 、打開電腦cmd,輸入ipconfig查看以太網配置器的IP。 函數
⑤ 、輸入arp -a查看樹莓派IP地址,以下圖所示。工具
⑥ 、打開安裝好putty軟件,界面以下,輸入樹莓派IP地址,點擊確認。
⑦ 、進入如下界面,輸入用戶:pi,密碼:raspberry,證實成功鏈接上樹莓派
① 、在TF燒寫的系統的boot目錄下,新建一個ssh文件和一個wpa_supplicant.conf文件,wpa_supplicant.conf文件內容以下:
1 country=CN 2 3 ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev 4 5 update_config=1 6 7 8 9 network={ 10 11 ssid="WiFi-A" 12 13 psk="12345678" 14 15 key_mgmt=WPA-PSK 16 17 priority=1 18 19 } 20 21 22 23 network={ 24 25 ssid="WiFi-B" 26 27 psk="12345678" 28 29 key_mgmt=WPA-PSK 30 31 priority=2 32 33 scan_ssid=1 34 35 }
#ssid:網絡的ssid
#psk:密碼
#priority:鏈接優先級,數字越大優先級越高(不能夠是負數)
#scan_ssid:鏈接隱藏WiFi時須要指定該值爲1
② 、將TF燒寫插入到樹莓派上面,啓動樹莓派,自動鏈接上無線WiFi,同時電腦也鏈接上該WiFi。
③ 、經過手機熱點鏈接的設備,查看樹莓派IP地址或者直接在路由器後臺中找到樹莓派的IP地址或使用Advanced IP Scanner獲取。
④ 、遠程登陸樹莓派客戶端不少,putty、xshell、手機端juiceSSH。以putty爲例,安裝好putty軟件,打開,界面以下,輸入樹莓派IP地址,點擊確認。
⑤ 、進入如下界面,證實成功鏈接上樹莓派
① 、樹莓派和電腦必須鏈接同一網段,無線或者有線鏈接均可以
② 、打開電腦,win+r打開運行窗口,輸入mstsc進入遠程桌面鏈接,輸入樹莓派IP地址。以下圖所示。
③ 、點擊確認,輸入樹莓派用戶名:pi,密碼:raspberry,點擊OK。以下圖所示。
④ 、點擊OK,進入樹莓派桌面,以下圖所示。
注:須要有安裝好系統的TF卡,下載win32DiskImager軟件
① 、創建一個空白的.img文件。
② 、打開win32磁盤映像工具,選擇含系統的TF卡
③ 、選擇剛剛創建好的空.img文件,點擊讀取。
④ 、系統恢復,選擇新的TF卡或格式化的TF卡,選擇以前備份的.img鏡像文件,點擊寫入。
① 、有屏幕,打開樹莓派右上角選擇WiFi鏈接
② 、無屏幕,使用命令sudo nano /etc/wpa_supplicant/wpa_supplicant.conf,進入配置。
③ 、在TF的boot目錄中創建一個新的wpa_supplicant.conf文件,裏面按照②中的方法進行設置。
① 、在SD卡boot目錄中新建ssh
② 、開啓系統,輸入命令:sudo /etc/init.d/ssh start,回車
③ 、點擊首選項
點擊Interface欄,選擇SSH爲enable
④ 、輸入命令:sudo raspi-config回車,選擇5 interfacing options回車,再選擇SSH,點擊是,回車,點擊finish。
VNC是一款使用RFB協定的屏幕畫面分享及遠程操做軟件
① 、開啓系統,輸入命令:vncserver回車,只能臨時用,重啓一次開一次。
② 、輸入命令:sudo raspi-config,回車,選擇5 Interfacing Options,回車,選擇VNC,enable。
③ 、使用VNC-Viewer客戶端,打開,輸入樹莓派IP地址,進入界面輸入用戶名和密碼登陸。
① 、斷電接上攝像頭以後,啓動樹莓派,系統使能攝像頭。執行命令:sudo raspi-config,界面以下:
② 、使用raspistill -o new.jpg拍照,查看命令xdg-open new.jpg。使用raspivid -o vv.h264 -t 10000s命令錄製視頻。
③ 、實現遠程拍照控制及照片獲取
簡單網絡獲取實時照片實現,創建socket通訊,樹莓派用python寫socket服務器,線程監聽端口,Windows用java寫socket客戶端。客戶端鏈接服務器後發送相關指令調用樹莓派拍照程序進行拍照,而後把照片數據用byte格式傳遞給客戶端,客戶端進行有效接收,並顯示。
其中啓動按鈕爲啓動socket客戶端,測試按鈕爲測試鏈接狀態,獲取按鈕爲調用拍照指令,程序總體實現較簡單,java客戶端沒有使用線程,因此會有卡頓現象。後續進會進一步調優。
樹莓派python代碼:
1 import os 2 3 import socketserver 4 5 class Sok(socketserver.BaseRequestHandler): 6 7 def handle(self): 8 9 while True: 10 11 try: 12 13 self.datax=self.request.recv(1024).decode("gbk") 14 15 if(self.datax==""):break 16 17 print(self.client_address,"-------",self.datax) 18 19 if self.datax=="1": 20 21 self.request.send("#start take a picture...".encode("gbk")) 22 23 os.system("raspistill -o new.jpg") 24 25 os.system("xdg-open new.jpg") 26 27 self.request.send("#finish,transmitting...".encode("gbk")) 28 29 f=open("new.jpg","rb") 30 31 f_size=os.stat("new.jpg").st_size 32 33 self.request.send(("#size:"+str(f_size)).encode("gbk")) 34 35 self.request.recv(100) 36 37 for lin in f: 38 39 self.request.send(lin) 40 41 if self.datax=="0": 42 43 self.request.send("#communication success...".encode("gbk")) 44 45 except Exception as e: 46 47 print("-----exception-----",e) 48 49 break 50 51 sock=socketserver.ThreadingTCPServer(("0.0.0.0",2351),Sok) 52 53 sock.serve_forever()
客戶端使用java:
1 package camera; 2 import java.awt.Graphics; 3 import java.awt.Image; 4 import java.awt.Toolkit; 5 import java.awt.event.ActionEvent; 6 import java.awt.event.ActionListener; 7 import java.awt.event.WindowAdapter; 8 import java.awt.event.WindowEvent; 9 import java.io.DataInputStream; 10 import java.io.FileNotFoundException; 11 import java.io.FileOutputStream; 12 import java.io.IOException; 13 import java.io.InputStream; 14 import java.io.OutputStream; 15 import java.io.UnsupportedEncodingException; 16 import java.net.Socket; 17 import java.net.UnknownHostException; 18 import javax.swing.ImageIcon; 19 import javax.swing.JButton; 20 import javax.swing.JFrame; 21 import javax.swing.JLabel; 22 import javax.swing.JPanel; 23 24 25 class Main2 extends JFrame{ 26 JLabel jlde; 27 private Image image; //獲取的圖像 28 private Toolkit toolKit; //Toolkit對象,用於獲取圖像 29 private Socket sock; 30 private InputStream reader; 31 private OutputStream writer; 32 private boolean booxie; 33 private DataInputStream dis; 34 JLabel zt; 35 int sizex=0; 36 public Main2(){//構造函數 37 super("圖片獲取實現");//標題顯示內容 38 this.setSize(600, 400);//頁面大小 39 this.setResizable(false);//不可縮放 40 this.setLocationRelativeTo(null);//全屏居中居中顯示 41 jlde=new JLabel(); 42 jlde.setBounds(0, 0,this.getWidth(), this.getWidth()); 43 this.add(jlde); 44 JButton qd=new JButton("啓動"); 45 JButton cs=new JButton("測試"); 46 JButton hq=new JButton("獲取"); 47 JPanel jp=new JPanel(); 48 zt = new JLabel(); 49 jp.add(qd); 50 jp.add(cs); 51 jp.add(hq); 52 jp.add(zt); 53 Imgben("lala.png");//初始圖片顯示 54 this.setIconImage(new ImageIcon("lala.png").getImage());//圖標圖片文件 55 this.add(jp,"South"); 56 this.setVisible(true);//顯示界面 57 qd.addActionListener(new ActionListener(){//-------------------啓動按鈕監聽,開啓socket 58 @Override 59 public void actionPerformed(ActionEvent e) { 60 zt.setText("正在啓動......."); 61 try { 62 63 64 sock=new Socket("192.168.43.243",2351); 65 writer=sock.getOutputStream();//獲取輸出流 66 reader=sock.getInputStream();//獲取輸入流 67 dis = new DataInputStream(sock.getInputStream());//包裝輸入流, 容許應用程序以與機器無關方式從底層輸入流中讀取基本 Java 數據類型。 68 writer.write(("0").getBytes("GBK"));//發送確認信息 69 reads();//讀數據 70 71 72 } catch (UnknownHostException e1) { 73 e1.printStackTrace(); 74 } catch (IOException e1) { 75 e1.printStackTrace(); 76 }}}); 77 cs.addActionListener(new ActionListener(){//------------------------測試是否鏈接成功 78 79 @Override 80 public void actionPerformed(ActionEvent e) { 81 try { 82 83 writer.write(("0").getBytes("GBK")); 84 reads(); 85 86 } catch (UnsupportedEncodingException e1) { 87 e1.printStackTrace(); 88 } catch (IOException e1) { 89 e1.printStackTrace(); 90 }}}); 91 hq.addActionListener(new ActionListener(){//-------------------獲取圖片按鈕,點擊可顯示實時圖片 92 @Override 93 public void actionPerformed(ActionEvent e) { 94 try { 95 zt.setText("開始獲取......"); 96 writer.write(("1").getBytes("GBK"));//發送獲取圖片指令 97 reads(); 98 reads(); 99 writer.write(("3").getBytes("GBK"));//發送空的確認獲取指令 100 String str= reads(); 101 sizex=Integer.parseInt(str.substring(str.indexOf("e")+2));//獲得圖片大小 102 reads();//讀取圖片數據 103 zt.setText(" 成功獲取 *-* "); 104 Imgben("new.jpg");//顯示獲取的圖片 105 106 } catch (UnsupportedEncodingException e1) { 107 e1.printStackTrace(); 108 } catch (IOException e1) { 109 e1.printStackTrace(); 110 }}}); 111 this.addWindowListener(new WindowAdapter() {//點擊叉監聽,徹底退出程序 112 public void windowClosing(WindowEvent arg0) { 113 System.exit(0); 114 } 115 });} 116 public String reads() throws FileNotFoundException{ 117 String strread=""; 118 FileOutputStream fos=null; 119 if(sizex>0){//【 開始接收文件 】 120 fos = new FileOutputStream("new.jpg"); 121 byte[] bytes = new byte[1024]; 122 int length = 0; 123 int bensizej=0; 124 try { 125 while(( length = dis.read(bytes, 0, bytes.length)) != -1) { 126 bensizej+=length; 127 try { 128 fos.write(bytes, 0, length);//以追加的方式寫數據 129 fos.flush(); 130 if(sizex<=bensizej) break;//獲取完成 131 } catch (IOException e) { 132 e.printStackTrace(); 133 } }} catch (IOException e) { 134 e.printStackTrace();} 135 sizex=0; 136 bensizej=0; //清零計數 137 }else{ //【 開始接收普通數據 】 138 byte[] bu=new byte[1024]; 139 try { 140 reader.read(bu); 141 strread=(new String(bu,"GBK")).trim(); 142 System.out.println(strread); 143 zt.setText(strread); 144 } catch (Exception e) { 145 e.printStackTrace(); 146 }} 147 return strread;//返回讀取的普通數據 148 } 149 150 //加載本地圖片 151 public void Imgben(String imagePath){ 152 toolKit = Toolkit.getDefaultToolkit(); 153 repaint(); //重繪屏幕 154 image= toolKit.getImage(imagePath); 155 } 156 public void paint(Graphics g){ 157 super.paint(g); 158 if (image!=null){ 159 image.getScaledInstance(500, 500, Image.SCALE_DEFAULT); 160 ImageIcon ico=new ImageIcon(image); 161 ico.setImage(ico.getImage().getScaledInstance(600,370, Image.SCALE_DEFAULT)); 162 jlde.setIcon(ico); 163 }}} 164 165 public class Camera { 166 public static void main(String[] args) { 167 new Main2(); 168 } 169 170 }
10、使用Cron在啓動時運行Python腳本
①、建立一個python腳本,使用命令cat /home/pi/Desktop/get.py來檢查路徑是否正確
② 、添加一個新的Cron,使用命令sudo crontab –e,以下圖所示。
③ 、在底部添加@reboot python /home/pi/Desktop/get.py &
④ 、要保存這些更改,請單擊「CTRL-X」,而後單擊「Y」,最後單擊「Return」。
⑤ 、重啓樹莓派,輸入sudo reboot,這樣腳本就隨着樹莓派啓動而啓動
⑥ 、要中止該腳本運行,須要使用ps aux | grep /home/pi/Desktop/get.py命令,獲得以「root」開頭的一個進程號,再使用sudo kill 1863命令結束該進程。
① 、使用「 systemd」,由於這彷佛是啓動自定義功能的推薦方式,許多Linux發行版都在採用它。
② 、在home/pi/創建一個python腳本,使用sudo nano /lib/systemd/system/myscript.service命令一個配置文件。添加內容以下:
1 [Unit] 2 Description=My Script Service 3 After=multi-user.target 4 5 [Service] 6 Type=idle 7 ExecStart=/usr/bin/python /home/pi/myscript.py 8 9 [Install] 10 WantedBy=multi-user.target
1 [Unit] 2 Description=My Script Service 3 After=multi-user.target 4 5 [Service] 6 Type=idle 7 ExecStart=/usr/bin/python /home/pi/myscript.py 8 9 [Install] 10 WantedBy=multi-user.target
使用using [CTRL-X], [Y] then [ENTER]保存退出。
③ 、爲了將腳本的文本輸出存儲在日誌文件中,您能夠將ExecStart行更改成:
1 ExecStart=/usr/bin/python /home/pi/myscript.py > /home/pi/myscript.log 2>&1
④ 須要將單元文件上的權限設置爲644,如:
1 sudo chmod 644 /lib/systemd/system/myscript.service
⑤ 、配置systemd,systemd在引導序列中啓動它
1 sudo systemctl daemon-reload 2 sudo systemctl enable myscript.service
⑥ 、重啓樹莓派
1 sudo reboot
⑦ 、檢查服務狀態
1 sudo systemctl status myscript.service