< 라즈베리파이의 BLE를 이용하여 소니 A7(sM3/7600)

     

    BLE 관련 자료를 찾아봐도 필요한 자료는 없어도 너무 없다.

     

    Bluez가 나온지가 언젠데, 필자도 초창기 임베디드를 시작하고 얼마 되지 않아서 BlueZ를 알게 되었다. 당시에는 포티만하고 커넥션 까지만 하는게 시스템 개발자의 일이라 애플리케이션 개발자의 영역까지 침범하지는 않았다.

     

    근데 이제 해야되는 상황에 이르렀고... 아..효.. 모든 내용은 공개하기 힘들어서 프로그래밍 카테고리가 아니라 오퍼레이팅 카테고리에 일주일동안 자료 수집및 테스트를 진행한 내용위주로 설명하고자 한다. 팔지도 이제 프로그래밍 해야되는 시점이라 말이다.  

     

    우선 현재까지 테스트 해본 내용을 기반으로 가장 그럴싸한 방법은 2가지가 있다. 

    첫번째, bluetoothctl 소스를 분석 후 필요한 부분만 빼내서 원하는 소프트웨어를 개발하는 방법.

    다음으로는, 연결은 bluetooth를 이용하고 실제 프로그램은 getttool 소스를 기반으로 필요한 부분만 빼서 만드는 방법.

    (그리고 다른 방법도 인터넷에서는 많이들 이야기된다. 특히 파이선을 이용하는 방법들 말이다...)

     

     우선 소스코드는 내버려두고, bluetoothctl은 제어하는 것 자체가 상당히 복잡하다. 특해 세부 attribute에 대한 값을 읽거나 쓰는 방법에 있어서 몇번의 절차를 거쳐서 내려가야 한다. 반대로 gettool의 경우 connection 이후에는 쉽게 상세 속성값을 읽고 쓸수 있다. 다만, Pairing(Bonding)기능이 없는 듯하다. 따라서, 처음 사용하는 경우라면 getttool 만 가지고 어떻게 해보기는 어려울것 같고, 이 둘을 합치는건 대공사라 필자에게 주어진 3주라는 시간 내에 완성이라는 결과를 얻어낼 수 없게 된다. 3주안에 해달랬으니 3주 정도의 퀄리티로 해야된다는 의미이다. 분석하고 이리저리 제대로 하려면 3개월은 필요할듯한데 말이다. 어쨋든 급하니까...

     

    자 리눅스에서 소니 카메라 제어하는 방법. 사진 없이 커맨드로 신속히 알려드린다. 

     

    1. 라즈베리파이 설치 내용

      bluez 개발 이전이므로, 개발 패키지는 별도로 설명하지 않는다.  

    $ sudo apt update
    $ sudo apt upgrade
    $ sudo apt install bluetooth blueman bluez

      

    2. 블루투스 확인

    2.1. 카메라 설정

      소니카메라 필자의 경우 A7S-M3 (ILCE-7SM3) 기준으로 설정할 메뉴는 다음과 같다. 

      (1) Menu > Network > Ctrl w/ Smartphone

           - Ctrl W/ Smartphone : On

           - Always Connect : On

     

       (2) 리모컨 관련 설정 

           - Bluetooth Rmt Ctrl : On

     

       (3) Menu > Network > Bluetooth 

           - Bluetooth Function : On

           - Ble Mac Check (혹시나 스캔에서 장치 이름이 안나오면 확인해야되니까 봐둔다.)

           - Pairing (연결이 필요할 때 설정)

     

    2.2. 스캔

      스캔은 여러방법으로 가능하다. 우선 bluez가 제대로 설치되었을테니 hcitool을 이용하여 장치를 한번확인해 보자. 이때 카메라 전원도 켜두도록 하고 페어링 가능한 상태로 카메라를 설정한다.  (맥어드레스는 보안을 위해서 당연히 마구마구 변경 해서 엉망으로 만들어뒀다. 참고만 하기 위함이다.)

     

    $ sudo hcitool lescan
    LE Scan ...
    34:38:10:74:21:4C (unknown)
    6A:B9:5B:8B:72:07 (unknown)
    6B:F9:5A:8C:73:03 (unknown)
    51:A6:61:D0:64:6A (unknown)
    53:B6:62:D0:64:66 (ILCE-7SM3)
    70:C6:9D:0D:D7:E7 (unknown)
    <* 카메라의 MAC 이 표시되어야 함. 안되는경우 카메라 설정 다시 확인>

     

    2.3. 본딩

      앞서 카메라 스캔은 그냥 한번 해본건고 아래와 같이 bluetoothctl을 이용하여 본딩을 할때 scan을 반드시 해주어야 한다. 이때 표시되면 만사오케이 되겠다. 

     

    1) 블루투스 컨트롤 시작

      블루투스 컨트롤 앱을 실행한다. 프롬프트가 Bluetooth로 변경됨을 확인할 수 있다. 

    $ sudo bluetoothctl
    [Bluetooth]#

     

    2) 장치 스캔

     블루투스 프롬프트에서 scan on을 눌러서 카메라 멕어드레스가 나오는지 확인한다.  안나오면 설정확인.

    [bluetooth]# scan on
    Discovery started
    [CHG] Controller AC:A6:EC:02:18:C8 Discovering: yes
    [NEW] Device 53:B6:62:D0:64:66 ILCE-7SM3
    [NEW] Device 41:4A:73:C1:CA:A3 41-4A-73-C1-CA-A3
    [bluetooth]# scan off

      

    3) 페어링

      piar 명령으로 페어링을 시도한다. 먼저, 카메를 Pair 설정화면으로 이동한다. 그리고 아래와 같이 명령을 입력하면, 카메라에서 페어링 할것인지를 확인하는 화면이 표시된다. 이때 OK를 눌러서 확인해야, 아래의 예시와 같이 Pairing Successfull을 확인할 수 있다. 

    [bluetooth]# pair 53:B6:62:D0:64:66
    Attempting to pair with 53:B6:62:D0:64:66
    [CHG] Device 53:B6:62:D0:64:66 Connected: yes
    [NEW] Primary Service (Handle 0x3894)
            /org/bluez/hci0/dev_ 53 _ B6 _ 62 _ D0 _ 64 _ 66/service0001
            00001801-0000-1000-8000-00805f9b34fb
            Generic Attribute Profile
    [NEW] Characteristic (Handle 0x2b88)
            /org/bluez/hci0/dev_ 53 _ B6 _ 62 _ D0 _ 64 _ 66/service0001/char0002
            00002a05-0000-1000-8000-00805f9b34fb
            Service Changed
    …. 생략….
    [CHG] Device 53:B6:62:D0:64:66 UUIDs: 00001800-0000-1000-8000-00805f9b34fb
    [CHG] Device 53:B6:62:D0:64:66 UUIDs: 00001801-0000-1000-8000-00805f9b34fb
    [CHG] Device 53:B6:62:D0:64:66 UUIDs: 8000cc00-cc00-ffff-ffff-ffffffffffff
    [CHG] Device 53:B6:62:D0:64:66 UUIDs: 8000dd00-dd00-ffff-ffff-ffffffffffff
    [CHG] Device 53:B6:62:D0:64:66 UUIDs: 8000ee00-ee00-ffff-ffff-ffffffffffff
    [CHG] Device 53:B6:62:D0:64:66 UUIDs: 8000ff00-ff00-ffff-ffff-ffffffffffff
    [CHG] Device 53:B6:62:D0:64:66 ServicesResolved: yes
    [CHG] Device 53:B6:62:D0:64:66 Paired: yes
    Pairing successful
    [ILCE-7SM3]#

     

    2.4. 신뢰할수 있는 연결

      다음은 신뢰할 수 있는 연결임을 설정한다.  다음과 같이 입력하여 설정할 수 있으며, 안해도 크게 문제는 없어보인다. 

    [ILCE-7SM3]# trust 53:B6:62:D0:64:66
    [CHG] Device 53:B6:62:D0:64:66 Trusted: yes
    Changing 53:B6:62:D0:64:66 trust succeeded

      

    2.5. 연결해제

      다음은 연결을 해제한다. 이후에는 getttool을 사용할 것이기 때문이다.  

    [ILCE-7SM3]# disconnect
    Attempting to disconnect from 53:B6:62:D0:64:66
    [CHG] Device 53:B6:62:D0:64:66 ServicesResolved: no
    Successful disconnected
    [CHG] Device 53:B6:62:D0:64:66 Connected: no

      

      테스트를 해보니 이렇게 한번만 설정되면, 이후에는 getttool에서 연결하면 바로 사용이 가능하였다. 물론, 카메라와 라즈베라피아의 전원을 모두 껏다 켰을 때도 말이다. 안해본거는 카메라 배터리를 분리했을 때 정도인데.. 이건 나중에 별도로 메모해두도록 하겠다.

     

    3. 카메라 제어

      필자는 셔터 제어만 예시로 들도록 하겠다. 프로토콜이라고 하긴 그런데 인터넷에 공개되어있는 것들이 있으니 본인의 카메라에 관련된 커맨드 자료를 찾길 바란다. 필자는 아래의 링크에서 확인하였다.

     

      https://gethypoxic.com/blogs/technical/sony-camera-ble-control-protocol-di-remote-control

     

    3.1. Gatttool 사용하여 장치 연결 

      아래의 명령으로 카메라와 연결한다. 

     $ sudo gatttool –b 53:B6:62:D0:64:66 -I

     

    3.2. 카메라 연결

      앞에서 MAC을 입력하면 connect 명령만으로 연결이 가능하다. 

    [53:B6:62:D0:64:66][LE] > connect  
    또는
    [53:B6:62:D0:64:66][LE] > connect 53:B6:62:D0:64:66
    Attempting to connect to 74:7A:90:7A:C3:B8
    Connection successful

      

    3.3. 카메라 속성정보 확인

      primary 명령으로 속성정보를 확인한다. 우리가 사용할 속성의 uuid는 ff00이녀석 되시겠다. 해당 내용은 안드로이드 폰에서 소니카메라 제어하기를 참고한다. 

    [53:B6:62:D0:64:66][LE] > primary
    attr handle: 0x0001, end grp handle: 0x0005 uuid: 00001801-0000-1000-8000-00805f9b34fb
    attr handle: 0x0014, end grp handle: 0x001c uuid: 00001800-0000-1000-8000-00805f9b34fb
    attr handle: 0x0028, end grp handle: 0x0053 uuid: 8000cc00-cc00-ffff-ffff-ffffffffffff
    attr handle: 0x0054, end grp handle: 0x005d uuid: 8000dd00-dd00-ffff-ffff-ffffffffffff
    attr handle: 0x005e, end grp handle: 0x0065 uuid: 8000ff00-ff00-ffff-ffff-ffffffffffff
    attr handle: 0x0066, end grp handle: 0xffff uuid: 8000ee00-ee00-ffff-ffff-ffffffffffff

     

    3.4. 카메라 속성값 변경을 이용한 사진촬영

      카메라에서 제공되는 레지스터의 값을 변경하여 조작을 할 수 있는 상태가 되었다. 물론 여기까지 확인하려면 여러 정보를 확인해야 하지만 생략하고, 카메라 셔터를 제어하기 위해서 다은과 같이 명령을 입력한다. 주의할 점은 명령데이터에 따른 동작은 분리되어있다. 예를들면 0x0109는 풀셔터 누름, 0x0108은 풀셔터 릴리즈이다. 따라서 동작은 누름상태가 아닐때, 0x0109 이후 0x0108이 들어가야 하나의 사이틀이된다. 0x0108이 들어가지 않은 상태에서 다른 셔터 명령은 무시됨에 주의한다.  

    [53:B6:62:D0:64:66] [LE]> char-write-req 0x0063 0109
    Characteristic value was written successfully
    Notification handle = 0x0060 value: 02 a0 20
    Notification handle = 0x0060 value: 02 3f 20
    Notification handle = 0x0060 value: 02 a0 00
    Notification handle = 0x0060 value: 02 3f 00
    Notification handle = 0x0060 value: 02 3f 40
    [53:B6:62:D0:64:66] [LE]> char-write-req 0x0063 0108
    Characteristic value was written successfully
    Notification handle = 0x0060 value: 02 3f 00
    [53:B6:62:D0:64:66][LE]>

     

      0109가 입력될 때, 셔터가 찰칵하며 영상이 촬영되고, 이후 0108을 입력하여 릴리즈 한다. 이때, 카메라의 상태는 Notification handle로 표시가 된다. 이후에라도 0x60을 읽으면 언제든 카메라의 상태중 일부를 확인할 수 있다. 프로토콜의 값으로 확인된 풀셔터의 레지스터 주소와 characteristics 명령을 입력하면 출력되는 많은 속성주소를 비교해 보면, 어째서 필자가 0x0063 주소에 명령을 입력했는지 알 수 있을 것이다. 

     

      화면 캡쳐본이랑 사진을 같이 넣으면 좋겠지만, 준비시간이나 필자가 막아야될 보안적인 부분도 많은지라 생략하였다. 이해하기 바란다.  자 그러면 앞서 필자가 이야기 했던 라즈베리파이에서 소니카메라를 제어하는 방법중 어떤게 편할지는 이제 개발자가 알아서 판단해야된다.

     

    이 글이 도움이되어서 개발했다면, 필자에게도 공유 부탁드린다. 

     

    아... 일하기 싫다..

    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기