樹莓派4B的入門操做

1、樹莓派系統燒錄

①  、準備一個8G以上的micro SD卡和讀卡器,推薦使用class4以上的卡java

②  、登陸https://www.raspberrypi.org/downloads/獲取系統安裝。python

③  、將下載下來的zip壓縮包進行解壓shell

④  、在Windows上使用etcher軟件燒錄,下載網站https://www.balena.io/etcher服務器

⑤  、將TF卡插入到讀卡器裏面,插到電腦USB上,打開etcher進行燒錄,若是失敗,能夠對TF卡進行格式化,在進行燒錄。網絡

2、無屏幕有線遠程鏈接

①  、在TF燒寫的系統的boot目錄下,新建一個ssh文件。ssh

②  、用網線將樹莓派和電腦鏈接起來,打開電源,啓動樹莓派。socket

③  、筆記本鏈接上無線網絡,在電腦上右鍵wifi圖標打開網絡和共享中心>更改適配器設置,共享無線網絡,以下圖所示。 ide

 

 

 

④  、打開電腦cmd,輸入ipconfig查看以太網配置器的IP。 函數

⑤  、輸入arp -a查看樹莓派IP地址,以下圖所示。工具

⑥  、打開安裝好putty軟件,界面以下,輸入樹莓派IP地址,點擊確認。 

⑦  、進入如下界面,輸入用戶:pi,密碼:raspberry,證實成功鏈接上樹莓派

3、無屏幕無線遠程鏈接

①  、在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地址,點擊確認。

⑤  、進入如下界面,證實成功鏈接上樹莓派

4、Windows遠程桌面鏈接

①  、樹莓派和電腦必須鏈接同一網段,無線或者有線鏈接均可以

②  、打開電腦,win+r打開運行窗口,輸入mstsc進入遠程桌面鏈接,輸入樹莓派IP地址。以下圖所示。 

③  、點擊確認,輸入樹莓派用戶名:pi,密碼:raspberry,點擊OK。以下圖所示。 

④  、點擊OK,進入樹莓派桌面,以下圖所示。

5、系統備份與恢復

注:須要有安裝好系統的TF卡,下載win32DiskImager軟件

①  、創建一個空白的.img文件。

②  、打開win32磁盤映像工具,選擇含系統的TF卡

③  、選擇剛剛創建好的空.img文件,點擊讀取。

④  、系統恢復,選擇新的TF卡或格式化的TF卡,選擇以前備份的.img鏡像文件,點擊寫入。

6、無線WiFi上網配置

①  、有屏幕,打開樹莓派右上角選擇WiFi鏈接

②  、無屏幕,使用命令sudo nano /etc/wpa_supplicant/wpa_supplicant.conf,進入配置。

③  、在TF的boot目錄中創建一個新的wpa_supplicant.conf文件,裏面按照②中的方法進行設置。

7、開啓SSH四種方法

①  、在SD卡boot目錄中新建ssh

②  、開啓系統,輸入命令:sudo /etc/init.d/ssh start,回車

③  、點擊首選項

點擊Interface欄,選擇SSH爲enable

④  、輸入命令:sudo raspi-config回車,選擇5 interfacing options回車,再選擇SSH,點擊是,回車,點擊finish。

8、開啓VNC的三種方法

VNC是一款使用RFB協定的屏幕畫面分享及遠程操做軟件

①  、開啓系統,輸入命令:vncserver回車,只能臨時用,重啓一次開一次。

②  、輸入命令:sudo raspi-config,回車,選擇5 Interfacing Options,回車,選擇VNC,enable。

③  、使用VNC-Viewer客戶端,打開,輸入樹莓派IP地址,進入界面輸入用戶名和密碼登陸。

9、樹莓派攝像頭使用

①  、斷電接上攝像頭以後,啓動樹莓派,系統使能攝像頭。執行命令: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命令結束該進程。

11、使用systemd在啓動時自動運行Python腳本

①   、使用「 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
相關文章
相關標籤/搜索