Programming/iOS2015/01/27 17:16

실행할 디바이스가 시뮬레이터인지 아닌지를 확인하는 매크로가 있다.

이걸 확인하는 방법은

#ifndef TARGET_IPHONE_SIMULATOR

#endif

가 아니다!!!!

#if !TARGET_IPHONE_SIMULATOR

#endif

이거다....

Posted by 초보 프로그래머
TAG ios, Xcode
Programming/Android2014/09/27 02:50

빌드해서 aar을 생성했는데… 그냥 dependency에 넣어서는 추가가 안된다. 뭐지;;


일단 duplicate 오류가 나면 aar과 겹치는 리소스가 있어서 그렇다.

그래서 모듈 리소스명 앞에 prefix를 붙여서 해결함.


그후 빌드는 성공했는데 class를 찾을 수 없다!!!!!! 뭐지…

compile fileTree(dir: 'libs', include: ['*.jar','*.jar'])
compile files('libs/chope-1.0.0.aar')


이 방법 둘다 안 먹힌다.


해결 방법은 다음과 같다.

aar은 꼭 repository에서만 추가되어야 하나 보다. 그래서 일단 local repository를 추가해준다.

repositories {
    flatDir {
        dirs 'libs'
    }
}

그리고 dependency는 다음과 같이 추가 한다.

compile(name:'chope-1.0.0', ext:'aar')


이제 빌드하면 제대로 나온다!~~!!

aar에 관련된 부분을 전체적으로 보면 다음과 같다.

repositories {
    flatDir {
        dirs 'libs'
    }
}

dependencies {
    compile(name:'chope-1.0.0', ext:'aar')
}


Posted by 초보 프로그래머
Programming/Android2014/09/27 02:50

Android Module은 빌드되면 .aar (Android ARchive) 파일로 생성됩니다.

기본으로 build/outputs/aar 위치에 [module].aar 로 생성됩니다.

[module]-[version].aar 으로 변경하려면 아래와 같이 설정합시다!

android {
    .....

    buildTypes {
        release {
            project.archivesBaseName='chope'
            project.version=defaultConfig.versionName

            .....
        }
    }
}


Posted by 초보 프로그래머
Programming2014/09/12 01:55

http://blog.chopestory.net/787

Posted by 초보 프로그래머
Programming/Android2014/09/12 01:16

Mac 을 Server로 하고 Android를 Client로 하여 서로 데이터를 주고 받도록 하는 것이 1차 목표였다.

둘의 통신은 BLE가 아닌 기본 Bluetooth 이다.

Mac은 IOBluetooth를 사용하지 않고 Python LightBlue library를 사용하여 작성하였다.

아래는 기본 테스트이므로 접속이 완료되면 데이터를 주고 받고 끝난다.


Android Code

package com.yhg.bluetoothclient;

import android.annotation.TargetApi;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.os.Build;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Set;
import java.util.UUID;


public class MyActivity extends ActionBarActivity {
    private final int REQUEST_ENABLE_BT = 10;
    private final String SERVICE_UUID = "00001101-0000-1000-8000-00805F9B34FB";
    private final String TAG = "ChopeTest";
    private BluetoothAdapter mBluetoothAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        if (mBluetoothAdapter == null) {
            Toast.makeText(this, "bluetooth not supported", Toast.LENGTH_SHORT).show();
            return;
        }

        if (!mBluetoothAdapter.isEnabled()) {
            Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
        }
        else {
            connectServer();
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == REQUEST_ENABLE_BT && resultCode == RESULT_OK) {
            connectServer();
        }
    }

    private void connectServer() {
        Set pairedDevices = mBluetoothAdapter.getBondedDevices();
        BluetoothDevice pairedDevice = null;

        if (pairedDevices.size() > 0) {
            for (BluetoothDevice device : pairedDevices) {
                Log.d(TAG, device.getName() + "\n" + device.getAddress());

                // 테스트를 빠르게 하기 위해...
                pairedDevice = device;
                break;
            }
        }

        if (pairedDevice != null) {
            new ConnectThread(pairedDevice).start();
        }
    }

    private class ConnectThread extends Thread {
        private final BluetoothSocket mmSocket;
        private final BluetoothDevice mmDevice;

        @TargetApi(Build.VERSION_CODES.GINGERBREAD_MR1)
        public ConnectThread(BluetoothDevice device) {
            // Use a temporary object that is later assigned to mmSocket,
            // because mmSocket is final
            BluetoothSocket tmp = null;
            mmDevice = device;

            // Get a BluetoothSocket to connect with the given BluetoothDevice
            try {
                // MY_UUID is the app's UUID string, also used by the server code
                tmp = device.createInsecureRfcommSocketToServiceRecord(UUID.fromString(SERVICE_UUID));
            } catch (IOException e) { }
            mmSocket = tmp;
        }

        public void run() {
            // Cancel discovery because it will slow down the connection
            mBluetoothAdapter.cancelDiscovery();

            try {
                // Connect the device through the socket. This will block
                // until it succeeds or throws an exception
                mmSocket.connect();
            } catch (IOException connectException) {
                // Unable to connect; close the socket and get out
                connectException.printStackTrace();
                try {
                    mmSocket.close();
                } catch (IOException closeException) { }
                return;
            }

            // Do work to manage the connection (in a separate thread)
            ReaderThread thread = new ReaderThread(mmSocket);
            thread.start();
        }

        /** Will cancel an in-progress connection, and close the socket */
        public void cancel() {
            try {
                mmSocket.close();
            } catch (IOException e) { }
        }
    }

    private class ReaderThread extends Thread {
        private InputStreamReader mReader;

        public ReaderThread(BluetoothSocket socket) {
            try {
                mReader = new InputStreamReader(socket.getInputStream());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void run() {
            char[] buffer = new char[255];

            try {
                int len = mReader.read(buffer);
                String content = new String(buffer, 0, len);
                Log.d(TAG, "receive data : "+content);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}


Python Code

import lightblue

s = lightblue.socket()
s.bind((lightblue.gethostaddr(), 0))  # bind to 0 to bind to dynamically assigned port 
s.listen(1)
lightblue.advertise("00001101-0000-1000-8000-00805F9B34FB", s, lightblue.RFCOMM)
conn, addr = s.accept()
print "Connected by", addr
conn.send("Hi Chope!")
conn.close()
s.close()


처음에 service uuid를 uuidgen으로 생성하니 연결이 안되서 한참을 헤맸다….

기존에 존재하는 service uuid만 사용해야 할것 같다.


실행해 보면 정상적으로 연결되는 것을 확인할 수 있다.


데이터를 계속 주고받는 테스트를 해봐야지 :)



Posted by 초보 프로그래머