import socketserver from os.path import exists import time import picamera HOST = '1.1.1.1' PORT = 9999 class MyTcpHandler(socketserver.BaseRequestHandler): def handle(self): print('[%s] 연결됨' %self.client_address[0]) while True: message = self.request.recv(1024) # 클라이언트로 부터 파일이름을 전달받음 message = str(message,encoding='utf-8').rstrip('\n') #decode('utf-8').strip('\n') if message == 'image': data_transferred = 0 filename = self.request.recv(1024) filename = str(filename,encoding='utf-8').rstrip('\n') with picamera.PiCamera() as camera: camera.start_preview() time.sleep(1) camera.capture('/home/pi/%s'%filename) camera.stop_preview() if not exists(filename): # 파일이 해당 디렉터리에 존재하지 않으면 self.request.send('파일이름이 존재하지않습니다') print('파일[%s] 전송 시작...' %filename) with open(filename, 'rb') as f: try: data = f.read(1024) # 파일을 1024바이트 읽음 while data: # 파일이 빈 문자열일때까지 반복 data_transferred += self.request.send(data) data = f.read(1024) except Exception as e: print(e) print('전송완료[%s], 전송량[%d]' %(filename,data_transferred)) else: print('[client]'+message) def runServer(): print('++++++파일 서버를 시작++++++') print("+++파일 서버를 끝내려면 'Ctrl + C'를 누르세요.") try: server = socketserver.TCPServer((HOST,PORT),MyTcpHandler) server.serve_forever() except KeyboardInterrupt: print('++++++파일 서버를 종료합니다.++++++') runServer() 위쪽이 라즈베리 파이에 들어가는 서버코드입니다. import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.EditText; import android.widget.ImageButton; import android.widget.TextView; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.Socket; public class MainActivity extends AppCompatActivity { String IP = "1.1.1.1"; int PORT = 9999; TextView text; EditText name; ImageButton btn; Socket socket; BufferedReader reader; PrintWriter writer; String filename; FileOutputStream output; String sdcard = Environment.getExternalStorageDirectory().getAbsolutePath(); File f; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text = (TextView) findViewById(R.id.text); name = (EditText) findViewById(R.id.name); btn = (ImageButton) findViewById(R.id.btnCam); Thread socket = new Thread(new TCPServer()); socket.start(); } public class TCPServer implements Runnable { @Override public void run() { try { socket = new Socket(IP,PORT); name.setText("연결완료"); reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); writer = new PrintWriter(socket.getOutputStream(),true); writer.println("image"); filename = "111.png"; writer.println(filename); name.setText("파일요청"); f = new File(filename); name.setText("1"); output = new FileOutputStream(sdcard+"/"+f,false); name.setText("파일생성완료"); byte[] buf = new byte[1024]; while (socket.getInputStream().read(buf) > 0) { output.write(buf); } output.close(); name.setText("수신완료"); } catch (Exception e) { //text.setText("서버에러"); e.printStackTrace(); } } } } 안드로이드 스튜디오 자바 코드입니다 질문내용은 이미 라즈베리파이 파이썬 서버와 PC파이썬 클라이언트로 이미지를 전송받는걸 확인했는데 자바코드로 넘어가서 name.setText("1"); output = new FileOutputStream(sdcard+"/"+f,false); 1 은 화면에 출력되는데 아래 파일이 생성이 안된건지 경로가 잘못된건지 AVD사용하는 중인데 받아오질 못합니다. 라즈베리파이에서 서버를 열어 android에게 메시지를 받는것을 해보았다. < C SERVER >
< Android Client > 안드로이드 클라이언트는 python-android_EX2 어플을 이용하였다. [activity_main.xml]
[MainActivity.java]
[AndroidManifest.xml]
※ 오류 주의 ※ C서버 컴파일 할때 기존의 [ gcc Cserver.c -o Cserver ] 하게 되면 pthread.h 를 포함했는데도 undefined reference to `pthread_create' 에러가 난다. 따라서 [ gcc -o Cserver Cserver.c -lpthread] 이런식으로 컴파일 해주면 정상적으로 실행파일이 만들어진다. 만들어진 뒤에 파일을 실행해보면 아래와 같이 뜬다. 이때 안드로이드에서 메시지를 보내주면 아래와 같이 "hello" , "junseop" 과 같이 메시지가 정상적으로 출력이 되는것을 볼 수 있다. 안드로이드에서 메시지 입력하는 부분이다. |