아시다 시피 BLE 장치들은 기존 BT classic과 다르게 broadcasting 기능을 제공하고 있어서 S/W로직을 기존 BT classic과 동일하게 가져가기에는 무리가 있습니다.
BLE 장치를 어떤 목적으로 어떻게 사용할것인가를 잘 구상 해야합니다.
구성 하고자 하는 장치를 미미(mimi)라고 합시다.
1. 미미에 탑재한 센서에서 읽은 값을 broadcasting 만 목적으로 한다.
=> BLE advertizement
2. 미미에 탑재한 센서에서 읽은 값을 연결되었을때만 데이타를 읽어갈 수 있도록 한다.
=> BLE service characteristics
3. 미미에 탑제된 여러 장치들을 제어하려고 한다.
=> connect /read /write
보통 목적은 3가지 형태가 될것 같습니다.
1번의 경우는 BLE advertizement를 이용하는 방법을 사용합니다.
- connection 없이 모단말(ble에선 central이라 부름)에서 scanning을 할때 scanning 한 데이타를 활용합니다.
- 이를 위헤서 미미(ble장치)에서도 당연히 advertizement 에 데이타를 설정 해줘야합니다.
- spec이나 가이드 상으로는 advertizementdata에 service data 항목이 있어서 service id와 data를 설정할 수 있습니다.
- 그러나 이렇게 사용할 수 없다면, manufacturer data를 활용하는 방법으로 할 수 도 있습니다.
- 여러 단말에서 동시에 읽어갈 수 있습니다.
2번의 경우는 BLE service의 characteristic의 값을 읽는 방식을 취합니다.
- scan후에 scan된 기기에 connect하고 나서 data를 읽어가는 방식입니다.
- 1번의 경우에는 scan만으로 정보를 읽어갈 수 있지만, 보안상 취약합니다. 모든 기기가 값을 다 볼 수 있기 때문이죠.
- 이런 connection 방식은 1:1통신이기 때문에, 연결되고 나면 다른 기기에서는 scan이 안됩니다.
- 때문에 connect후에 data를 읽고 바로 연결을 끊어야 합니다.
3번의 경우는 2번과 유사한데 다만 scanning 과 분리해서 connect후 characteristic에 read/write를 하는 방식으로 처리합니다.
- serial 방식( classic 방식) 과 유사한 요청사항이죠.
- 하지만 serical에서는 연결후 data를 보내고 response를 받는 것만 고려 했다면, BLE에서는 특정 characteristic정하고 해당 characteristic 값에 data를 wrtie하고 notifiy 를 설정하고 read를 하는 방식이라, 단순한 기능 구현에는 번거로움이 있지만,
미미(mini, ble 장치)가 복잡하다면 각 기능 제어를 분리해서 사용할 수 있기 때문에 좋습니다.
class ResFonts{ static cosnt int t1 = 65; static cosnt int t2 = 58; static cosnt int t3 = 48; static const int m1= 24; static const int m2= 18; static const int m3= 16; static const int m4= 10;
이런 식으로 정의해서 사용했죠.
또 getTextStyle() 같은 함수를 만들어 사용해보기도 했는데요. 오히려 코딩시에 더 거슬리더군요.
최근 enum을 이용해서 간단 textStyle을 만들었는데 의외로 쓸만해서 계속 사용하게 되었습니다.
소개해드리겠습니다.
TextStyle 관리하기
제가 사용하는 textstyle 패턴은 아래와 같습니다.
텍스트와 텍스트스타일을 함께 사용하게 되는데 enum을 사용해서 쓰던 ResImage 와 유사하죠.?
Text("hello", style: ResTextStyle.t1.defStyle)
이렇게 사용하면서 상당히 코드의 시인성도 좋아지고 타이핑도 간결해져서 좋더군요.
어떻게 만들었는지 한번 보겠습니다.
enum을 정의하는 형식은 아래와 같습니다. 폰트의 크기와 기본 weight을 설정하는 형태이죠.
이유는 간단한데요. 협업이 쉽기 때문입니다. 색상표(Color code)가 R,G,B, A 4가지 값을 각각 0~255 만큼 가지고 있는데, 숫자로 되어있습니다.
때문에 소스코드에서 어떤 색상이 어디에 사용되어있는지를 검색하기 쉽지 않습니다.
또 협업을 하게 되는 경우 다른 사람이 작성한 코드에서 컬러값을 찾기는 더 힘들죠.
디자인 가이드가 바뀌는 경우에는 더 많은 작업이 필요해 집니다.
예를 들자면, 위에 현재 confirm 버튼으로 사용하고 있는 색상이 RGBO(0,0,255,1) 인데 디자이너가 색상을 좀 옅게 바꾸고 싶어서 confirm 버튼으로 디자인 된곳을 모두 RGBO(100,100, 200,1) 로 변경한다고 합시다.
그러면 개발자들은 RGBO(0,0,255,1)로 된 곳을 모두 찾아서 변경 해야 합니다.
간혹 빠진 곳이 생기겠죠? 또 개발자중 몇명은 아직 변경 사실을 모르고 있을 수도 있습니다. 그러면 어떤 화면은 적용이 늦어지겠죠.
만약 위에 설명드린것 처럼 ResColors와 같이 컬러 테이블을 관리하고 있다면 buttonBlue = Color.fromRGBO(255) 만 Color.fromRGBO(100,100,200,1)로 변경하면 어플리케이션 전체에서 색상을 찾아서 수정할 필요가 없어지겠죠.
그래서 보통 어플리케이션에서 사용하는 컬러를 상수나 enum으로 이름을 주고 관리를 하는 편입니다.
이렇게 하면 디자이너와 협업도 쉬워지는데요. 디자이너가 특정 요소의 색상을 바꾸고 싶을때 컬러테이블의 값도 같이 수정 해주고 개발자에게 알려주면, 개발자는 해당 컬러 테이블만 수정 하면 되거든요.