Python 중복 list와 numpy 다차원 배열 비교

이 글은 2018.06.30일에 python 프로그래밍 언어를 기반으로, tensorflow 라이브러리와 numpy라이브러리를 활용하여 딥러닝 프로그램을 제작하는 과정에서 생긴 의문들을 해결하는 과정에서 기록한다. 특히나 numpy 라이브러리에서 다차원 배열을 어떻게 다루는지에 대해 집중 탐구했다.

#1.python 중복 list와 python numpy 의 다차원 배열의 비교

 

1) 생성 방법과 표기법

 

수학을 배우다보면 vector  -> matrix -> tensor 순으로 확장되는 개념을 배운다. 그러한 수학적 개념을 python 프로그래밍 언어에서는 list라는 개념을 이용해 표현하며, numpy 라이브러리는 그러한 list개념을 참고해 vector, matrix , tensor 수학적 표현과 연산을 python프로그래밍 언어에서 쉽게 표현하고, 다룰 수 있게 만들어진 라이브러리다.  예를 들면, 이런 식으로 표기한다.

vector_list = [ 1 , 2 , 3 , 4 , 5, 6 , 7 , 8 , 9 ]

vector_array = np.array( [ 1 , 2 , 3 , 4 , 5, 6 , 7 , 8 , 9 ] )

matrix_list = [ [1 , 2 , 3 ] , [ 4 , 5 , 6] , [7 , 8 ,9 ] ]

matrix_array = np.array( [ [1 , 2 , 3 ] , [ 4 , 5 , 6] , [7 , 8 ,9 ] ] )

tensor_list = [ [ 1 , [2 , 3 ] ] , [4 , [5 , 6] , [7 , [8 , 9] ] ]

tensor_array = np.array( [ [ 1 , [2 , 3 ] ] , [4 , [5 , 6] , [7 , [8 , 9] ] ] )

즉,중복 리스트와 numpy 다차원 배열 모두 만드는 방법과 표기 방법은 거의 동일하다. 

약간의 차이가 있다면, print 결과가 조금 다르다. list의 경우 print 해보면 원소를’ , ‘로 구분하지만 numpy array는 ‘ , ‘로 구분되어있지 않다. 아래와 같이 말이다.

list:
[[1 2 3]
[4 5 6]
[7 8 9]]

array:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

 

 

2)  하나의 원소 선택 방식(원소 추출) – 차원의 낮아짐 

 

중복 리스트와 numpy 다차원 배열 모두 동일한 방식으로 하나의 원소를 선택할 수 있다.

그리고 numpy 다차원 배열은 또 다른 하나의 방식으로 하나의 원소를 선택할 수 있다.

원소 선택시 원래 변수의 차원([ ] 개수) 보다 하나씩 낮아진다.

 

vector = [ 1 , 2 , 3 , 4 , 5, 6 , 7 , 8 , 9 ]

list, np.array : vector[ 0 ] =  1  , vector[ 1 ] =  2   .

 

matrix = [ [1 , 2 , 3 ] , [ 4 , 5 , 6] , [7 , 8 ,9 ] ]

list, np.array : matrix[ 0 ] = [ 1 , 2 , 3 ] ,  matrix[ 0 ][ 0 ] =  1  ,

np.array  :  matrix [ 0 , 0 ] = matrix [ 0 ][ 0 ] =  1

 

tensor = [ [ 1 , [2 , 3 ] ] , [4 , [5 , 6] ], [7 , [8 , 9] ]

list, np.array : tensor [ 0 ] = [ 1 , [2 , 3] ] , tensor [ 0 ][ 1 ] = [2 , 3] , tensor [ 0 ][ 1 ][ 1 ] =  3

np.array : tensor [ 0 , 1 , 1 ] = tensor [ 0 ][ 1 ][ 1 ] =  3 이다.

아마 눈치 챘겠지만, tensor 의 가장 바깥쪽에 있는 대괄호[ ] 부터 가장 안쪽에 있는 대괄호[ ] 까지  순차적으로 [index]를 추가해가며 접근하게 된다.  하지만 이러한 방법은 한번에 하나씩의 원소만 접근하기에 다수의 원소를 한번에 접근 할 수 있는 방법이 필요한데, 이 방법에 대해 살펴보자. 바로 위의 예시와 마찬가지로 , numpy라이브러리를 사용하지 않은 python list와 거의 동일한 표기법과 numpy 라이브러리 고유의 표기법 두 종류가 있다.

 

 

3)다수의 원소 선택 방식(슬라이싱) – 차원의 불변

 

list의 slicing 방법부터 정리해보자.

 

list[ start index : end index+1 ] 또는 list[ start index : end index + 1 : step ].

이런 형식으로 list의 일부분을 가져올 수 있다.

예를 들면,

list = [ 1, 2, 3, 4, 5, 6, 7, 8, 9]

list [ 1 : 3 ] = [2 , 3 ]

list [ 1 : 10 : 2 ] = [2 , 4 , 6 , 8 ]

이렇게 되는 것이다.

이제 중복 리스트와 numpy array에서 이러한 slicing 방식이 어떻게 활용되는지 예시로 살펴보자. slicing만 적용한다면 원래 변수의 차원([ ] 개수)와 동일하며, 2)처럼extraction이 적용되어야 원래 변수의 차원([ ] 개수)보다 낮아진다.

vector = [ 1 , 2 , 3 , 4 , 5, 6 , 7 , 8 , 9 ]

list, np.array : vector [1 : 10] = [2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ] , vector [2 : 4 ] = [3 , 4]

 

matrix = [ [1 , 2 , 3 ] , [ 4 , 5 , 6] , [7 , 8 ,9 ] ]

list, np.array :

matrix [ 1 : 3 ] = [ [4, 5, 6] , [7, 8, 9 ] ]   matrix [ 1 : 3 ][ 0 ] = [4, 5, 6]

matrix [ 1 : 3 ][ 0 ][ 0 : 2 ] = 4, 5             matrix [ 1 : 3 ][ 0 ][ 0 : 2 ][ 0 ] = 4

(tip. matrix [ 1 : 3 ][0 : 2 ] = [ [4, 5, 6] , [7, 8, 9 ] ] )

np.array :

matrix [ 1 : 3 , 0 ] = [ [4]  , [7] ]

matrix [ 1 : 3 , 0 : 2 ] = matrix [ 1 : 3 , [0 , 1] ]= matrix [ [1, 2 ] , [0 ,1 ] ]= [ [4 , 5] , [7, 8 ] ]

 

tensor = [ [ [ 1 ] ,[ 2 ] , [3 , 4 ] ] , [ 5 ] , [ 6 ], [7 , 8] ], [ [ 9 ] , [ 10 ] , [11 , 12] ] ]

list, np.array :

tensor [ 0 : 2 ] = [ [ [ 1 ] ,[ 2 ] , [3 , 4 ] ] , [ [ 5 ] , [ 6 ], [7 , 8] ] ]

tensor [ 0 : 2 ][ 0 ] =  [ [ 1 ] , [ 2 ] , [3 , 4 ] ]

tensor [ 0 : 2 ][ 0 ][ 2 ] = [ 3, 4 ]

tensor [ 0 : 2 ][ 0 ][ 2 ][ 1 ] = 4

np.array : 

tensor [ 0 : 1 , 0 : 3 ] =tensor [ 0 : 1 , [0 , 1 , 2] ] = [ [ [ 1 ] , [ 2 ] , [3 , 4 ] ] ]

tensor [ 0 : 2 , 0 : 2 ] = [ [ [ 1 ] ,[ 2 ] ] , [ [ 5 ] , [ 6 ] ] , [ [ 9 ] , [ 10 ] ] ]

 

 

적절한 충전지 고르는 방법-BB탄 무선조종 탱크 만들기

이 글은 2017.8 월에 사촌동생들과 BB탄 쏘는 무선조종 탱크를 만들기 위한 과정 중,

비비탄 발사를 위해 구매한, 전동건 P90의 Dboys제 기어박스용 배터리를 구매하기 위해

정리하게 되었다.

Dboys제 P90용 기어박스

내가 해결하고자 하는 의문은 이것이다.

‘전동건 P90의 Dboys제 기어박스용 배터리로는 전압과 전하량과 방전율이 얼마나 되는 배터리를 사야 하며,  전압과 전하량과 방출율은 무엇이고 어떻게 확인해야 하는가?’

참고 : http://www.gunngun.net/shop/shopdetail.html?branduid=62430

 

1.배터리의 종류

 

1차 전지와 2차 전지

1차 전지(일반전지) : 한번 사용하고 버리는 전지

2차 전지(충전전지) : 여러 번 재충전하여 사용할 수 있는 전지

일반 전지와 충전지 비교
1
충전지의 종류

2
일반 전지의 종류
3
충전지의 메모리 효과

참고 : http://www.ntrexgo.com/archives/22505

 

2.배터리 스펙 파악하기

드론이건, 무선조종 자동차던, 무선조종 탱크던, 헬기던, 장난감이던 무엇이던 각각의 기계에 맞는 배터리가 있다. 제일 좋은 방법은 구매한 곳에서 해당 기기용 배터리를 구입하는 것이지만, 단종 등으로 인해 불가능한 경우도 많다. 그런 경우, 해당 기기에서 요구하는 배터리의 스펙을 알고 적절한 스펙의 배터리를 구매해 연결해야 한다. 그럴 땐 보통 3가지를 보면 되는 것 같다.

전압, 전하량, 방전율이다.

 

전압(V)

V(Volt)라는 단위로 표시된다.

 

*P90용 Dboys 기어박스에는 7.2V짜리 전압을 가진 배터리가 필요하다고 한다.

 

전하량(mAh)

mAh(milli Ampere-hour)라는 단위로 표시된다.

전하량(milli Ampere-hour)=전류(milli Ampere)*시간(hour)

으로 정의되기 때문이다.

1mAh 는 1mA의 전류를 1시간동안 방출할 수 있는 양이다.

SI unit의 전하량 단위인 C(Coulomb)과 비교해 보았을 때

1mAh = 3.6C 이라고 한다.

 

*P90용 Dboys 기어박스에는 보통1100mAh 정도의 용량을 가진 배터리를 쓰는 듯 하다.

하지만 더 큰 용량을 가진 배터리를 사용해도 상관없을 듯 하다.

그저 배터리의 사용시간이 증가될 뿐이기 때문이다.

 

참고 : https://ko.wikipedia.org/wiki/%EC%95%94%ED%8E%98%EC%96%B4%EC%8B%9C

 

방전율(C)

방전율은 배터리가 어느정도 속도로 방전되는지에 대한 기준이다. C-rate라고 부르고 C라고 그냥 표시한다. 단위는 없다.

(따라서 불완전한 기준이기 때문에 정확하게는 이를 대신한 새로운 국제기준으로 It  가 도입되었다. 새로운 기준의 단위는 (/h) 이다.)

방전율=최대 방출 전류(Ampere) / {1시간동안, 완전 충전된 배터리를 완전방전시킬 때의 평균 방출 전류(Ampere)}

로 정의된다. 식을 단순화하면,

방전율=최대 방출 전류(Ampere)/{전하량/1시간}.

쉽게 예시를 들어 보자면 , 1100mAh 2C 짜리 배터리라면 방전율 정의에 의해

2C = 최대 방출 전류(Ampere)/(1100mAh/1h) =최대 방출 전류/1100mA 가 되는 것이고 따라서 최대 방출 전류는 2200mA(2.2A) 가 되는 것이다.

여기서 전하량 보존 법칙을 이용해보면,

1100mAh = 220mA * 0.5h 가 되므로 최대 방출 전류로 방전시킬 경우 30분만에 배터리를 방전

시킬 수 있다는 것을 알 수 있다.

방전율 정의로부터 알 수 있는 유용한 성질을 요약해보겠다.

방전율 정의식을 변형해보면, 방전율*(전하량/최대방출전류)=1시간  이므로

최대 방출 전류 하에서 배터리 이용가능시간  * 방전율 = 1시간  

최대 전류= 방전율 *( 전하량/1시간)

이라는 공식이 성립한다는 것이다.

예시를 보면,

7.2V 1100mAh 20C 짜리 배터리가 있다고 할 때,

최대 전류로 사용할 때 배터리 사용 시간=1h/방전율=1h/20=3min 이 되는 것이고,

최대 전류값은 =20*1100mA = 22000mA=22A가 되는 것이다.

 

 

*전동건용 배터리가 모터에 공급해주는 파워(전력)이 80W 이상 나와주어야 하는 것으로 보인다.

P90용 배터리의 전압이 7.2V 이므로 파워가 80W 이상 나오기 위해서는

P=IV 공식을 이용해 보았을 때 전류  I=80/7.2~11.11A이상이어야 한다.

그러므로 1100mAh짜리 용량을 가진 배터리를 사용할 경우

방전율의 정의를 이용해 보면, 방전율=11.11A/1100mA~10.x

약 11C 이상의 방전율을 가진 배터리

를 찾아야 하는 것이다.

 

참고 : http://www.toyitem.com/board/free/read.html?no=99&board_no=7

https://en.wikipedia.org/wiki/Battery_(electricity)#C_rate

 

예시로 배터리 스펙 완전히 이해하기

lipo배터리에 대한 이미지 검색결과

이렇게 생긴 Li-Po 배터리가 있고

이 배터리에 17.4V 1100mAh 20C 이라고 적혀 있다면,

이 배터리는 17.4V의 전압으로 1.1A의 전류를 1시간동안 방출할 수 있으며(1100mAh의 전하량을 지니므로),

최대 22A(1100mA/20)의 전류를 3분(1100mAh/22A) 동안 방출할 수 있는 배터리인 것이다.

 

부품구입 후 탱크 개조하기

탱크 사진

몇 차례의 웹서핑을 통한 정보 습득과 몇 차례의 부품 구입, 개조를 통해 탱크가 무선조종이동뿐만 아니라 BB탄 발사까지 가능하게 개조에 성공했다. 야매로 개조한거라 연발은 불가… 반동으로 인한 기체 파손이 있어서 아쉽다. 역시 늘 새로운 걸 도전하면 몇 차례의 실패와 문제 수정 끝에야 아름다운 작품을 만들어지는 것 같다. 하지만 적절한 배터리 찾는 법을 배웠으니 개이득!

MitAppInventor Bluetooth server/client 비교

이 글은 2017년도 고등학생들이랑 IOT 우편함을 만들며 생긴 의문을 해결해보고 그 지식을 정리하고자 작성한다.

의문은 이것이다.

MitAppInventor로 아두이노의 HC-06블루투스 모듈과 android기반 스마트폰의 블루투스를 통해 arduino와 android스마트폰을 연결해주는 앱을 작성하고자 할 때, MitAppInventor에서 Bluetooth Server와 Client 중 무엇을 사용해야 하며, 왜 그런가? “

Q1개념도

따라서 이 글에서는 Bluetooth Server와 Client를 비교해보고, 위의 상황에 관련된 지식들을 정리하며 질문을 해결해보려고 한다.

1.일반적인 Server와 Client

server와 client 개념을 정리해보면,

Server

서버는 클라이언트에게 네트워크를 통해 정보나 서비스를 제공하는 컴퓨터 또는 프로그램을 말한다. 특히, 서버에서 동작하는 소프트웨어를 서버 소프트웨어라 한다. (from wikipedia)

Client

클라이언트는 네트워크를 통하여 서버라는 다른 컴퓨터 시스템 상의 원격 서비스에 접속할 수 있는 응용 프로그램이나 서비스를 말한다.(from wikipedia)

즉,Client란 정보를 보유하고 있는 Server라는 대상에게 약속된 방식으로 특정 정보를 요청하여 정보를 받은 후, 적절한 방식(보통 시각적 표현)으로 우리에게 표현해주는 대상이라고 이해하면 될 것 같고, Server란 정보를 보유하고 있다가 Client가 약속된 방식으로 특정 정보를 요청하면 자신이 가진 정보 중 특정 정보를 복사해 전달해주는 대상이라고 보면 될 것 같다.
———————————————————————————————
Server와 Client 모델의 예시로는 웹 서버와 클라이언트를 들 수 있다.

‘생활코딩’ 사이트에서 자세히 설명되어 있어 일부분을 가져왔다.

웹 서버와 클라이언트에 대한 이미지 검색결과
웹 서버와 클라이언트 개념도

웹의 경우, ‘웹 브라우저’라는 프로그램이 설치된 컴퓨터를 클라이언트, ‘웹 서버’라는 프로그램이 설치된 컴퓨터를 서버라고 한다. 작동 원리는 다음과 같다.
1)웹 브라우저에 우리가 원하는 웹페이지의 주소를 치면
2)클라이언트가 해당 주소의 웹페이지를 지닌 서버에게 그 웹페이지의 정보를 요청하게 된다.
3)그러면 서버는 그 웹페이지 정보를 다시 클라이언트에게 전달해주고
4)클라이언트는 그 정보를 기반으로 우리가 보는 시각적인 웹사이트를 만들어 보여주는 것이다.
———————————————————————————————-

2.Bluetooth의 Master/Slave

Bluetooth개념

Piconet 개념도

먼저, 블루투스에 대해 간략히 요약하자면

블루투스는 2.4GHz영역에서 무선으로 데이터를 주고받기위한 통신규약이다. 블루투스는 보안 프로토콜이며 단거리, 저전력, 저비용으로 장치들을 무선 연결할 수 있도록 해주며, 유선 통신 방식 중 serial(직렬) 통신 방식을 무선 통신으로 구현하기 위해 개발되었다고 한다.

나는 처음에 블루투스도 Server/ Client 개념을 사용하는 기술로 생각하고 있었다. 하지만,블루투스 네트워크에서는 사실 Server와 Client 모델 대신 Piconet 이라고 불리는 Master/Slave 모델을 사용한다고 한다. 이 모델에서는 하나의 마스터 장치가 최대 7개의 활동 슬레이브 장치로 연결될 수 있으며 언제든지 마스터 장치가 활성 상태로 바꿀 수 있는 최대 255개의 비활성 슬레이브 장치를 가질 수 있다고 한다. 그리고 시간이 지남에 따라 Bluetooth classic에서 Bluetooth Low energy로 기술이 발달하면서 Master/Slave 모델에서 그와 유사한 Central/Peripheral 모델로 호칭만 바뀐 듯 하다.

따라서 이번에는 블루투스를 통한 일대일 통신만 하지만, 필요에 따라 일대다 통신도 가능한 것이다. 구글링 해 본 결과 스마트폰끼리도 일대다 통신이 가능하고, 스마트폰과 여러 아두이노로도 일대다 통신이 가능한 것으로 보인다.

단, 이 모델에서 마스터 장치는 연결된 어떤 슬레이브 장치에든 데이터를 전송할 수 있고, 요청을 보낼 수도 있지만, 슬레이브 장치는 마스터와 데이터를 교환할 수만 있고 슬레이브간 통신은 할 수 없다. 블루투스에 관한 좀 더 자세한 기초정보는 참고사이트에서 확인할 수 있다.

참고
piconet개념 : http://cseric.or.kr/new_Cseric/yungoostep/content.asp?idx=892&startpage_view=886&startpage=900&page=1
블루투스 기초 : http://www.hardcopyworld.com/ngine/aduino/index.php/archives/2101
블루투스 일대다 통신 : http://m.blog.naver.com/roboholic84/220789820175
블루투스 BLE(v4.0이상)통신 : http://blog-kr.zoyi.co/bluetooth-low-energy-ble/

BLUETOOTH CLASSIC 와 BLUETOOTH LOW ENERGY

Bluetooth Classic의 연결 흐름도

 

BLE의 연결 흐름도

Bluetooth의 기초에 대해 공부하며,  추가적으로 Bluetooth Classic과 Bluetooth Low Energy 기술에 대해 간단히 적어놓으려고 한다. Bluetooth Classic기술이 먼저 나온 기술이고 Bluetooth Low Energy 기술이 그 다음으로 개발된 Bluetooth 기술(통신 규약)이다.

상기 이미지와 같이 블루투스 Classic와 BLE는 페어링 방식이 다르다고 한다.

Classic 는 Master가 주변에 요청을 날리고 Slave가 그에 응답한 뒤 페어링 절차를 가지게 된다고 한다.

BLE는 Peripheral(슬레이브/서버역할)이 주변에 일정간격으로 Advertising을 진행하게되고 Central(마스터 역할)이 Scan에 성공함으로서 Peripheral의 정보를 취득하고 페어링을 시도하게 된다고 한다.

나는 이 둘 중 Bluetooth Classic 개념을 이해하는 것이 중요했는데, HC-06모듈은 Bluetooth Classic 기술을 이용한 구식 모듈이기 때문이다.

참고 : https://help.chipsen.com/support/solutions/articles/22000207397-%EB%B8%94%EB%A3%A8%ED%88%AC%EC%8A%A4-classic-%EC%99%80-ble-bluetooth-low-energy-%EA%B2%80%EC%83%89%EB%B0%A9%EC%8B%9D-%EB%B9%84%EA%B5%90%ED%91%9C

HC-06 bluetooth module

HC-06에 대한 이미지 검색결과
HC-06모듈

HC-06은 arduino에 연결할 수 있는 블루투스 모듈이다. 해당 모듈의 블루투스 버전은 2.0이다. 기본적으로 HC-06모듈은 펌웨어 버전 1.7 미만은 마스터 또는 슬레이브로 제작되며 나중에 변경불가하고, 버전1.7이상은 마스터/슬레이브 겸용으로 제작되며, 기본적으론 슬레이브 상태이다. 필요한 경우 마스터로 펌웨어 수정이 가능하다. 나는 버전1.7이상을 기준으로 이야기해보려고 한다.

1)스마트폰이 master이고 HC-06들이 slave. <일대 다 통신 가능>

이 경우 android studio로 스마트폰 앱을 만들 때 bluetoothsocket 객체를 여러개 만들어서 앱을 구성하면 일대 다 통신이 가능하다고 한다.

참고
http://m.blog.naver.com/roboholic84/220789820175

2)HC-06이 master이고 HC-06이 slave.<일대일 통신만 가능>
이 경우는 HC-06 둘끼리 통신하고 싶을 때 사용가능한 방법으로, 한 개 초과의 HC-06모듈들을 master HC-06에서 연결하여 제어하는 것은 불가능한 것으로 보인다.

둘끼리만 통신하게 만드는 방법을 살펴보면, HC-06이 기본적으로 slave이므로 HC-06모듈들 중 하나를 master로 재설정해주어야 한다.과정은 참고사이트를 보고 따라하면 된다. 두 가지 과정이 있는데, 둘 중 하나만 따라하면 된다.

첫번째 과정을 간단히 요약해보면, ATcommand를 통해 마스터로 만들고자 한 모듈에 AT+ROLE=M, 다른 한 모듈에 AT+ROLE=S라고 문자열을 시리얼 통신을 통해 보낸 후 두 모듈의 이름과 암호를 또다시 ATcommand를 통해 같게 설정하면 마스터 쪽에서 슬레이브 쪽을 자동연결하는 방식이다.

두번째 과정을 간단히 요약해보면, 참고사이트에서 시키는대로 기초 세팅을 하고 아두이노에 참고사이트에서 준 소스코드를 업로드하면 된다. 사실 두번째 과정은 첫번째 과정을 걍 소스코드화 시켜서 원큐에 모든 과정을 끝낼 수 있게 편의성을 높인 것이다.
참고
http://blog.naver.com/PostView.nhn?blogId=roboholic84&amp;logNo=220594314436&amp;redirect=Dlog&amp;widgetTypeCall=true

Android Bluetooth(MitAppInventor)

android developer 공식 사이트에서 보았을 때, 안드로이드의 블루투스 통신의 경우 server와 client 개념을 사용하는 것 같다. 안드로이드 앱 개발 프로그램인 android studio에서 서버의 경우는 BluetoothServer라는 클래스를, 클라이언트의 경우는 BluetoothDevice라는 클래스를 사용하는 것으로 보인다.

하지만 나는 내공부족의 문제도 있고, 시간/비용/품질 문제가 있으므로 빠르고 저렴하며 저품질 앱을 만들기 위해 mitappinventor를 이용하여 앱을 제작할 것이기에 mitappinventor 의 용어에 대해 자세히 살펴보려고 한다.

appinventor에 대한 이미지 검색결과
MitAppInventor 의 모습

MitAppInventor에서는 Bluetooth server/client 두 가지 설정이 있다.각각의 설정을 이용하여 앱을 만드는 과정은 참고사이트에 잘 나와있다. 역시 제일 중요한 것은 과연 둘 중 무엇을 이용해야 HC-06과 연결할 수 있는가이다.

실험 결과, HC-06 slave 와 연결하려면 Bluetooth client를 이용해 블록을 구성하고 앱을 제작해야 한다.

Bluetooth Classic

HC-06 모듈은 기본적으로 Slave상태로 세팅되어 있고, Bluetooth Classic기술을 이용했기 때문에 위의 Bluetooth Classic 개념도와 같이 Master역할을 하는 기기가 먼저 접근을 해주어야  연결을 할 수 있는 수동적 구조이고, App Inventor에서는 Bluetooth client가 스마트폰의 블루투스로 하여금 먼저 어떤 대상에 먼저 접근요청을 하는 능동적 구조이기 때문에 둘의 통신이 성립되는 것 같다.

BTServerAcceptConnect
Bluetooth Server(수동적)
BTClientSend
Bluetooth Client(능동적)

내가 Bluetooth Client가 능동적으로 접근할 수 있는 방식이라고 하는 이유는 Client 관련 블록 중 call BluetoothClient.Connect address ‘ ‘ 같은 블록이 있어, 이 블록 사용시 스마트폰이 다른 블루투스 기기에 먼저 접근요청을 하기 때문이다.

참고
appinventor bluetooth basic : http://appinventor.pevest.com/?p=520

부디 이 정리가 다른 사람에게도 도움이 되었으면 좋겠다.