<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>원원이의 블로그</title>
    <link>https://wowon.tistory.com/</link>
    <description>임베디드 프로그래밍 블로그</description>
    <language>ko</language>
    <pubDate>Sun, 5 Apr 2026 05:56:56 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>원원</managingEditor>
    <item>
      <title>Speaker 만들기 4편 (SD카드에있는 WAV파일을 OLED에 표시하고 재생)</title>
      <link>https://wowon.tistory.com/380</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요. 오늘은 SD카드에있는 SD카드에있는 WAV파일을 OLED에 표시하고 재생해보겠습니다.&lt;br /&gt;&lt;br /&gt;3편에서 만들었던 회로도에서 OLED와 버튼1개를 추가했습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1193&quot; data-origin-height=&quot;819&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGkFoQ/dJMcabC6TuM/Ct6dKTP9KXozSyUnmnLzu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGkFoQ/dJMcabC6TuM/Ct6dKTP9KXozSyUnmnLzu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGkFoQ/dJMcabC6TuM/Ct6dKTP9KXozSyUnmnLzu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGkFoQ%2FdJMcabC6TuM%2FCt6dKTP9KXozSyUnmnLzu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1193&quot; height=&quot;819&quot; data-origin-width=&quot;1193&quot; data-origin-height=&quot;819&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OLED는 SSD1306을 이용해서 I2C 통신을하는 2.42인치 제품이고 해상도는 128x64입니다.&lt;br /&gt;SSD1306을 사용하므로 라이브러리가 많이 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vFICQ/dJMcaioHIED/3iieLY4F2rOuXvAVkdL4e1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vFICQ/dJMcaioHIED/3iieLY4F2rOuXvAVkdL4e1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vFICQ/dJMcaioHIED/3iieLY4F2rOuXvAVkdL4e1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvFICQ%2FdJMcaioHIED%2F3iieLY4F2rOuXvAVkdL4e1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;468&quot; height=&quot;268&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;268&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 만드는 과정입니다.&lt;br /&gt;1. OLED에 글자 표시&lt;br /&gt;2. 버튼 클릭하면 화살표 이동&lt;br /&gt;3. SD카드에서 WAV파일 읽어서 화면표시하고 클릭하면 WAV파일재생&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;OLED에 글자 표시&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770540817101&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;Wire.h&amp;gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;
#include &amp;lt;Adafruit_SSD1306.h&amp;gt;

/* SD CARD */
#define SD_SCK 18
#define SD_MISO 19
#define SD_MOSI 23
#define SD_CS 5

/* BUTTON */
#define BTN1 16
#define BTN2 17
#define BTN3 21

/* OLED */
#define OLED_SDA 27
#define OLED_SCL 14
#define OLED_ADDR 0x3C
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;amp;Wire, -1);

void setup()
{
  // UART SETTING
  Serial.begin(115200);

  // BUTTON INIT
  pinMode(BTN1, INPUT_PULLUP);
  pinMode(BTN2, INPUT_PULLUP);
  pinMode(BTN3, INPUT_PULLUP);

  // OLED INIT
  Wire.begin(OLED_SDA, OLED_SCL);
  if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
    Serial.println(&quot;SSD1306 init failed!&quot;);
    while (1) { delay(10); }
  }

  // OLED DISPLAY
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.println(&quot;HELLO&quot;);

  display.setTextSize(2);
  display.setCursor(0, 0+8);
  display.println(&quot;WORLD&quot;);

  display.setTextSize(3);
  display.setCursor(0, 0+8+16);
  display.println(&quot;WOWON&quot;);
  display.display();
}

void loop()
{
  
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Adafruit SSD1306 라이브러리를 이용합니다. &lt;br /&gt;글자의 크기를 정하는 함수는 display.setTextsize()입니다. 크기가 1이면 y축의 크기가 8정도 먹습니다. 그래서 크기를 1로 사용하면 8*8=64니까 8줄정도 이용 가능합니다. 글자의크기가 2면 y축의 크기는 16정도 먹습니다.&lt;br /&gt;MCU가&amp;nbsp;OLED와&amp;nbsp;I2C&amp;nbsp;통신을&amp;nbsp;수행하는&amp;nbsp;시점은&amp;nbsp;display.display()&amp;nbsp;호출&amp;nbsp;시입니다.&amp;nbsp;그&amp;nbsp;전까지는&amp;nbsp;MCU&amp;nbsp;내부&amp;nbsp;프레임버퍼에&amp;nbsp;화면&amp;nbsp;데이터를&amp;nbsp;저장합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csW8nJ/dJMcacvgswd/LL1dKbItl6tAKtHvEWg4I0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csW8nJ/dJMcacvgswd/LL1dKbItl6tAKtHvEWg4I0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csW8nJ/dJMcacvgswd/LL1dKbItl6tAKtHvEWg4I0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsW8nJ%2FdJMcacvgswd%2FLL1dKbItl6tAKtHvEWg4I0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;379&quot; height=&quot;267&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;488&quot; data-origin-height=&quot;344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. 버튼 클릭하면 화살표 이동&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770541461141&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;Wire.h&amp;gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;
#include &amp;lt;Adafruit_SSD1306.h&amp;gt;

/* BUTTON */
#define BTN1 16
#define BTN2 17
#define BTN3 21

/* OLED */
#define OLED_SDA 27
#define OLED_SCL 14
#define OLED_ADDR 0x3C
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

int8_t oledLine = 0; // MAX : 8
uint8_t arrayBtn[3] = {BTN1,BTN2,BTN3};
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;amp;Wire, -1);


void oled_display(uint8_t btn)
{
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);

  if(btn == BTN1)
  {
    oledLine++;
  }
  else
  {
    oledLine --;
  }

  if(oledLine &amp;lt; 0)
  {
    oledLine = 0;
  }
  if(oledLine &amp;gt; 7)
  {
    oledLine = 7;
  }

  display.setCursor(0, oledLine*8);
  display.println(&quot;&amp;gt;&quot;);
  display.display();

  Serial.print(&quot;CURRENT LINE : &quot;);
  Serial.println(oledLine);
}

void setup()
{
  // UART SETTING
  Serial.begin(115200);

  // BUTTON INIT
  pinMode(BTN1, INPUT_PULLUP);
  pinMode(BTN2, INPUT_PULLUP);
  pinMode(BTN3, INPUT_PULLUP);

  // OLED INIT
  Wire.begin(OLED_SDA, OLED_SCL);
  if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
    Serial.println(&quot;SSD1306 init failed!&quot;);
    while (1) { delay(10); }
  }

  // INIT OLED DISPLAY
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println(&quot;&amp;gt;&quot;);
  display.display();
}

bool edgeFalling(bool cur, bool &amp;amp;prev)
{
  bool hit = (prev == HIGH &amp;amp;&amp;amp; cur == LOW);
  prev = cur;
  return hit;
}
bool check_btn[3];
bool buffer_btn[3] = {true, true, true};

void loop()
{
  uint8_t c;
  for(c=0; c&amp;lt;3; c++)
  {
    check_btn[c] = digitalRead(arrayBtn[c]);
    
    if(edgeFalling(check_btn[c],buffer_btn[c]))
    {
      Serial.print(&quot;CLICK BTN : &quot;);
      Serial.println(c);
      //BTN1: UP , BTN2 : DOWN
      if(arrayBtn[c] == BTN1 || arrayBtn[c] == BTN2)
      {
        oled_display(arrayBtn[c]);
      }
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼이 3개 있는데 버튼을 클릭하면 화살표 (&amp;gt;)를 화면에서 이동하게 됩니다.&lt;br /&gt;여기서 중요한건 &quot;버튼을 클릭할때&quot;를 감지해야 합니다. 인터럽트를 이용할수도 있었지만 인터럽트를 이용하지않았습니다. 클릭하지않았을때 버튼의 상태는 HIGH이고 버튼을 클릭하면 LOW가 됩니다.(falling edge)&lt;br /&gt;falling edge를 구별해주는 함수가 edgeFalling입니다. check_btn은 버튼의 현재상태가 들어가게 되고 buffer_btn은 이전에 읽은 버튼의 상태가 들어가게 됩니다. 그래서 현재 버튼의 상태가 LOW이고 이전 버튼의 상태가 HIGH이면 버튼이 클릭된 상태로 인식합니다.&lt;br /&gt;버튼이 클릭됐으면 oled_display 함수를 호출해서 oledLine을 이동시키고 화면에 &amp;gt;를 표시합니다. 글자크기가 1이므로 y축은 8씩 이동시키게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageslideblock alignLeft&quot; data-image=&quot;[{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/14Mm7/dJMcacvgs0q/DFgIbD6gLr5vsMGH4V5Oyk/img.gif&amp;quot;}]&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span class=&quot;image-wrap selected&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/14Mm7/dJMcacvgs0q/DFgIbD6gLr5vsMGH4V5Oyk/img.gif&quot; data-url=&quot;https://blog.kakaocdn.net/dn/14Mm7/dJMcacvgs0q/DFgIbD6gLr5vsMGH4V5Oyk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/14Mm7/dJMcacvgs0q/DFgIbD6gLr5vsMGH4V5Oyk/img.gif&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F14Mm7%2FdJMcacvgs0q%2FDFgIbD6gLr5vsMGH4V5Oyk%2Fimg.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; data-is-animation=&quot;true&quot; data-origin-height=&quot;228&quot; data-origin-width=&quot;362&quot;/&gt;&lt;/span&gt;&lt;button class=&quot;btn btn-prev&quot;&gt;&lt;span class=&quot;ico-prev&quot;&gt;이전&lt;/span&gt;&lt;/button&gt;&lt;button class=&quot;btn btn-next&quot;&gt;&lt;span class=&quot;ico-next&quot;&gt;다음&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;
  &lt;div class=&quot;mark&quot;&gt;&lt;span data-index=&quot;0&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;3. SD카드에서 WAV파일 읽어서 화면표시하고 클릭하면 WAV파일재생&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1770735101294&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;Wire.h&amp;gt;
#include &amp;lt;Adafruit_GFX.h&amp;gt;
#include &amp;lt;Adafruit_SSD1306.h&amp;gt;
#include &amp;lt;SD.h&amp;gt;
#include &amp;lt;SPI.h&amp;gt;
#include &amp;lt;ESP_I2S.h&amp;gt;

#define BTN1 16
#define BTN2 17
#define BTN3 21

#define OLED_SDA 27
#define OLED_SCL 14
#define OLED_ADDR 0x3C
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64

#define SD_SCK  18
#define SD_MISO 19
#define SD_MOSI 23
#define SD_CS   5

#define BCLK 26
#define LRC  25
#define DIN  22

#define MAX_WAV_FILES 80
#define OLED_LINES 8

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &amp;amp;Wire, -1);
I2SClass i2s;
File f;

uint8_t arrayBtn[3] = {BTN1, BTN2, BTN3};
bool check_btn[3];
bool buffer_btn[3] = {true, true, true};

String wavList[MAX_WAV_FILES];
int16_t wavCount = 0, wav_top = 0, wav_idx = 0;
int8_t oledLine = 0;

bool playing = false;
bool cancel_req = false;

typedef struct {
  uint16_t audioFormat;
  uint16_t numChannels;
  uint32_t sampleRate;
  uint16_t bitsPerSample;
  uint32_t dataOffset;
  uint32_t dataSize;
  uint32_t bytesPerSec;
  uint32_t totalMs;
} wav_info_t;

wav_info_t curWav = {};

bool edgeFalling(bool cur, bool &amp;amp;prev){ bool hit=(cur==LOW &amp;amp;&amp;amp; prev==HIGH); prev=cur; return hit; }
bool isWavFile(const String &amp;amp;name){ String s=name; s.toLowerCase(); return s.endsWith(&quot;.wav&quot;); }
String fitOled(const String &amp;amp;s){ const int n=18; if((int)s.length()&amp;lt;=n) return s; return s.substring(0,n-3)+&quot;...&quot;; }

void sd_scan_wav(){
  wavCount=0;
  File root=SD.open(&quot;/&quot;);
  if(!root || !root.isDirectory()) return;
  while(true){
    File e=root.openNextFile();
    if(!e) break;
    if(!e.isDirectory()){
      String n=String(e.name());
      if(isWavFile(n) &amp;amp;&amp;amp; wavCount&amp;lt;MAX_WAV_FILES) wavList[wavCount++]=n;
    }
    e.close();
  }
  root.close();
  wav_top=0; wav_idx=0; oledLine=0;
}

void oled_draw_list(){
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  if(wavCount&amp;lt;=0){
    display.setCursor(0,0); display.println(&quot;No .wav in /&quot;); display.display(); return;
  }
  for(int i=0;i&amp;lt;OLED_LINES;i++){
    int idx=wav_top+i; if(idx&amp;gt;=wavCount) break;
    display.setCursor(0,i*8); display.print((i==oledLine)?&quot;&amp;gt;&quot;:&quot; &quot;);
    display.setCursor(8,i*8); display.println(fitOled(wavList[idx]));
  }
  display.display();
}

void oled_move(uint8_t btn){
  if(wavCount&amp;lt;=0 || playing) return;
  if(btn==BTN1){ if(wav_idx&amp;lt;wavCount-1) wav_idx++; }
  else if(btn==BTN2){ if(wav_idx&amp;gt;0) wav_idx--; }
  if(wav_idx&amp;lt;wav_top) wav_top=wav_idx;
  if(wav_idx&amp;gt;=wav_top+OLED_LINES) wav_top=wav_idx-(OLED_LINES-1);
  oledLine=(int8_t)(wav_idx-wav_top);
  oled_draw_list();
}

i2s_data_bit_width_t bitWidthFrom(uint16_t bps){
  switch(bps){
    case 16: return I2S_DATA_BIT_WIDTH_16BIT;
    case 24: return I2S_DATA_BIT_WIDTH_24BIT;
    case 32: return I2S_DATA_BIT_WIDTH_32BIT;
    default: return I2S_DATA_BIT_WIDTH_16BIT;
  }
}

bool wav_open_selected(){
  if(wavCount&amp;lt;=0) return false;

  String path=&quot;/&quot;+wavList[wav_idx];
  if(f) f.close();
  f = SD.open(path.c_str(), FILE_READ);
  if(!f) return false;

  uint8_t header[44];
  if(f.read(header,44)!=44){ f.close(); return false; }

  curWav.audioFormat   = header[20] | (header[21]&amp;lt;&amp;lt;8);
  curWav.numChannels   = header[22] | (header[23]&amp;lt;&amp;lt;8);
  curWav.sampleRate    = (uint32_t)header[24] | ((uint32_t)header[25]&amp;lt;&amp;lt;8) | ((uint32_t)header[26]&amp;lt;&amp;lt;16) | ((uint32_t)header[27]&amp;lt;&amp;lt;24);
  curWav.bitsPerSample = header[34] | (header[35]&amp;lt;&amp;lt;8);

  uint32_t dataSize = (uint32_t)header[40] | ((uint32_t)header[41]&amp;lt;&amp;lt;8) | ((uint32_t)header[42]&amp;lt;&amp;lt;16) | ((uint32_t)header[43]&amp;lt;&amp;lt;24);

  curWav.dataOffset = 44;
  curWav.dataSize   = dataSize;
  curWav.bytesPerSec = curWav.sampleRate * curWav.numChannels * (curWav.bitsPerSample/8);
  curWav.totalMs = (curWav.bytesPerSec==0)?0:(uint32_t)((uint64_t)curWav.dataSize*1000ULL/curWav.bytesPerSec);

  if(curWav.audioFormat!=1) { f.close(); return false; }
  if(!(curWav.numChannels==1 || curWav.numChannels==2)) { f.close(); return false; }
  if(!(curWav.bitsPerSample==16 || curWav.bitsPerSample==24 || curWav.bitsPerSample==32)) { f.close(); return false; }

  i2s.setPins(BCLK, LRC, DIN);
  if(!i2s.begin(I2S_MODE_STD, curWav.sampleRate, bitWidthFrom(curWav.bitsPerSample),
                (curWav.numChannels==1)?I2S_SLOT_MODE_MONO:I2S_SLOT_MODE_STEREO)){
    f.close(); return false;
  }

  f.seek(curWav.dataOffset);
  return true;
}

void draw_play_ui(uint32_t rem_ms, uint32_t done_bytes){
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);

  display.setCursor(0,0);
  display.print(&quot;PLAY &quot;);
  display.println(fitOled(wavList[wav_idx]));

  uint32_t s = rem_ms/1000, m=s/60; s%=60;
  display.setCursor(0,16);
  display.print(&quot;Remain &quot;);
  if(m&amp;lt;10) display.print(&quot;0&quot;); display.print(m);
  display.print(&quot;:&quot;);
  if(s&amp;lt;10) display.print(&quot;0&quot;); display.print(s);

  int x=0,y=32,w=128,h=10;
  display.drawRect(x,y,w,h,SSD1306_WHITE);
  int fill = (curWav.dataSize==0)?0:(int)((uint64_t)done_bytes*(w-2)/curWav.dataSize);
  if(fill&amp;lt;0) fill=0; if(fill&amp;gt;w-2) fill=w-2;
  display.fillRect(x+1,y+1,fill,h-2,SSD1306_WHITE);

  display.setCursor(0,48);
  display.println(&quot;BTN3: Cancel&quot;);

  display.display();
}

void stop_play(){
  cancel_req=false;
  playing=false;
  if(f) f.close();
  i2s.end();
  oled_draw_list();
}

void start_play(){
  cancel_req=false;
  if(!wav_open_selected()){ oled_draw_list(); return; }
  playing=true;

  static uint8_t buf[4096];
  uint32_t done=0, last_ui=0;
  bool prev3=true;

  uint32_t ignore_cancel_until = millis() + 250;

  while(playing &amp;amp;&amp;amp; f.available()){
    bool cur3 = digitalRead(BTN3);
    if(millis() &amp;gt; ignore_cancel_until) {
      if(edgeFalling(cur3, prev3)) cancel_req=true;
    } else {
      prev3 = cur3;
    }
    if(cancel_req) break;

    int len = f.read(buf, sizeof(buf));
    if(len&amp;gt;0) i2s.write(buf, len);
    done += (len&amp;gt;0)?(uint32_t)len:0;

    uint32_t now=millis();
    if(now-last_ui&amp;gt;=120){
      last_ui=now;
      uint32_t rem_bytes = (done&amp;gt;=curWav.dataSize)?0:(curWav.dataSize-done);
      uint32_t rem_ms = (curWav.bytesPerSec==0)?0:(uint32_t)((uint64_t)rem_bytes*1000ULL/curWav.bytesPerSec);
      draw_play_ui(rem_ms, done);
    }
  }

  stop_play();
}

void setup(){
  Serial.begin(115200);

  pinMode(BTN1,INPUT_PULLUP);
  pinMode(BTN2,INPUT_PULLUP);
  pinMode(BTN3,INPUT_PULLUP);

  Wire.begin(OLED_SDA, OLED_SCL);
  if(!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) while(1) delay(10);

  SPI.begin(SD_SCK, SD_MISO, SD_MOSI, SD_CS);
  if(!SD.begin(SD_CS, SPI)) while(1) delay(10);

  sd_scan_wav();
  oled_draw_list();
}

void loop(){
  for(uint8_t c=0;c&amp;lt;3;c++){
    check_btn[c]=digitalRead(arrayBtn[c]);
    if(edgeFalling(check_btn[c],buffer_btn[c])){
      if(arrayBtn[c]==BTN1 || arrayBtn[c]==BTN2) oled_move(arrayBtn[c]);
      if(arrayBtn[c]==BTN3){
        if(!playing) start_play();
      }
      delay(30);
    }
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BTN3을 클릭하면 wav파일이 재생되고 남은시간이 표시되게됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageslideblock alignLeft&quot; data-image=&quot;[{&amp;quot;src&amp;quot;:&amp;quot;https://blog.kakaocdn.net/dn/W84py/dJMcafrYgPG/n7RzKeVdhpJSsErZZEnGKk/img.gif&amp;quot;}]&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span class=&quot;image-wrap selected&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W84py/dJMcafrYgPG/n7RzKeVdhpJSsErZZEnGKk/img.gif&quot; data-url=&quot;https://blog.kakaocdn.net/dn/W84py/dJMcafrYgPG/n7RzKeVdhpJSsErZZEnGKk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W84py/dJMcafrYgPG/n7RzKeVdhpJSsErZZEnGKk/img.gif&quot; loading=&quot;lazy&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW84py%2FdJMcafrYgPG%2Fn7RzKeVdhpJSsErZZEnGKk%2Fimg.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; data-origin-width=&quot;401&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;button class=&quot;btn btn-prev&quot;&gt;&lt;span class=&quot;ico-prev&quot;&gt;이전&lt;/span&gt;&lt;/button&gt;&lt;button class=&quot;btn btn-next&quot;&gt;&lt;span class=&quot;ico-next&quot;&gt;다음&lt;/span&gt;&lt;/button&gt;&lt;/div&gt;
  &lt;div class=&quot;mark&quot;&gt;&lt;span data-index=&quot;0&quot;&gt;0&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>PROJECT/Speaker</category>
      <author>원원</author>
      <guid isPermaLink="true">https://wowon.tistory.com/380</guid>
      <comments>https://wowon.tistory.com/380#entry380comment</comments>
      <pubDate>Tue, 10 Feb 2026 23:57:05 +0900</pubDate>
    </item>
    <item>
      <title>Speaker 만들기 3편 (회로도작성, SD카드에있는 WAV파일 버튼으로 재생)</title>
      <link>https://wowon.tistory.com/379</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요. 오늘은 회로도를 작성해보고 SD카드에있는 WAV파일을 버튼으로 재생해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2편에서 사용했던 회로에서 버튼2개만 추가하였습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1113&quot; data-origin-height=&quot;663&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VdCzX/dJMcacBMx2g/Z266kU5IIVbeyyMEp57fIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VdCzX/dJMcacBMx2g/Z266kU5IIVbeyyMEp57fIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VdCzX/dJMcacBMx2g/Z266kU5IIVbeyyMEp57fIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVdCzX%2FdJMcacBMx2g%2FZ266kU5IIVbeyyMEp57fIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1113&quot; height=&quot;663&quot; data-origin-width=&quot;1113&quot; data-origin-height=&quot;663&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회로도에는 SD카드소켓기준으로 작성하였는데, 실제로는 SD카드 모듈을 이용했습니다. 핀 연결 구성에는 차이가 없습니다.&lt;br /&gt;원래는&amp;nbsp;브레드보드에&amp;nbsp;연결하여&amp;nbsp;테스트를&amp;nbsp;진행하려고&amp;nbsp;했으나,&amp;nbsp;스피커&amp;nbsp;출력에서&amp;nbsp;잡음이&amp;nbsp;많이&amp;nbsp;발생하여&amp;nbsp;만능기판으로&amp;nbsp;변경하였습니다.&lt;br /&gt;GPT 의견에 따르면, 브레드보드는 접촉 구조와 배선 특성으로 인해 노이즈에 취약합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;373&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kZCKa/dJMcadN935o/HeGp2K8Cp9DA1kb8LsYtO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kZCKa/dJMcadN935o/HeGp2K8Cp9DA1kb8LsYtO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kZCKa/dJMcadN935o/HeGp2K8Cp9DA1kb8LsYtO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkZCKa%2FdJMcadN935o%2FHeGp2K8Cp9DA1kb8LsYtO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;511&quot; height=&quot;325&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;373&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버튼위의 남은공간은 OLED를 추가해서 SD카드에있는 WAV파일을 보여주고 버튼을 이용해서 클릭한 WAV파일을 재생하는 형식으로 할 예정입니다. 현재 글 에서는 버튼1개당 wav파일 1개가 매칭되어있어서 버튼을 클릭하면 정해둔 wav파일이 재생합니다.&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignLeft&quot; data-video-host=&quot;kakaotv&quot; data-video-url=&quot;https://tv.kakao.com/v/460413710&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/cZOU2t/hyZQ6Twq0f/HyZZhfUHNhMdGkubnnGTz0/img.jpg?width=1850&amp;amp;height=1080&amp;amp;face=0_0_1850_1080,https://scrap.kakaocdn.net/dn/dh7bWs/hyZQ1kng96/AcUNWotIswyJLhrqyo9bMK/img.jpg?width=1850&amp;amp;height=1080&amp;amp;face=0_0_1850_1080&quot; data-video-width=&quot;400&quot; data-video-height=&quot;233&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;502&quot; data-ke-mobilestyle=&quot;widthContent&quot; data-video-title=&quot;'원원이의 블로그'에서 업로드한 동영상&quot; data-video-play-service=&quot;daum_tistory&quot; data-original-url=&quot;&quot;&gt;&lt;iframe src=&quot;https://play-tv.kakao.com/embed/player/cliplink/460413710?service=daum_tistory&quot; width=&quot;400&quot; height=&quot;233&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption style=&quot;display: none;&quot;&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동작은&amp;nbsp;버튼의&amp;nbsp;상태를&amp;nbsp;읽어,&amp;nbsp;버튼이&amp;nbsp;클릭되면&amp;nbsp;WAV&amp;nbsp;파일을&amp;nbsp;재생하는&amp;nbsp;방식입니다. &lt;br /&gt;WAV 파일 재생 중에는 파일이 끝날 때까지 다른 동작을 수행할 수 없습니다.&lt;br /&gt;playWavOnce()&amp;nbsp;함수에서는&amp;nbsp;SD.open()이&amp;nbsp;실패할&amp;nbsp;경우&amp;nbsp;SD&amp;nbsp;카드를&amp;nbsp;다시&amp;nbsp;초기화하도록&amp;nbsp;구현하였습니다. &lt;br /&gt;이는&amp;nbsp;전원이&amp;nbsp;인가된&amp;nbsp;상태에서&amp;nbsp;SD&amp;nbsp;카드를&amp;nbsp;제거한&amp;nbsp;후&amp;nbsp;다시&amp;nbsp;삽입하는&amp;nbsp;경우,&amp;nbsp;SD.begin()을&amp;nbsp;다시&amp;nbsp;호출해야&amp;nbsp;하기&amp;nbsp;때문입니다. &lt;br /&gt;SD 카드는 초기 삽입 시 Idle 상태이며, SD.begin()을 수행하면 Transfer 상태로 전환됩니다. &lt;br /&gt;따라서&amp;nbsp;SD&amp;nbsp;카드를&amp;nbsp;제거&amp;nbsp;후&amp;nbsp;재삽입하면&amp;nbsp;다시&amp;nbsp;Idle&amp;nbsp;상태가&amp;nbsp;되므로,&amp;nbsp;정상적인&amp;nbsp;읽기&amp;nbsp;동작을&amp;nbsp;위해&amp;nbsp;SD.begin()을&amp;nbsp;재호출합니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;소스코드(COMMIT : Initial commit)&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/yhunterr/speaker_esp32&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/yhunterr/speaker_esp32&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>PROJECT/Speaker</category>
      <author>원원</author>
      <guid isPermaLink="true">https://wowon.tistory.com/379</guid>
      <comments>https://wowon.tistory.com/379#entry379comment</comments>
      <pubDate>Sun, 4 Jan 2026 22:02:14 +0900</pubDate>
    </item>
    <item>
      <title>BLE ESP32 Bluedroid_Beacon 코드 분석하기 2편-코드흐름</title>
      <link>https://wowon.tistory.com/378</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요. 오늘은 1편에 이어서 ESP32 Bluedroid_Beacon 예제코드를 분석해보겠습니다.&lt;br /&gt;1편에서는 프로젝트에서 사용한 전역변수 3개에대해 알아봤습니다.&lt;br /&gt;2편에서는 프로젝트 main문의 흐름에대해 알아보겠습니다.&lt;br /&gt;&lt;br /&gt;Bluetooth stack에는 Host랑 controller가 있습니다.&lt;br /&gt;(1) Controller는 하드웨어+저수준 펌웨어가 동작하는 영역입니다. 실제 전파를 주고받는 부분이고 Physical Layer(실제 BLE radio 신호), Link Layer(광고, 연결관리, timing, encryption)가 여기에 속합니다.&lt;br /&gt;(2) Host는 소프트웨어 스택입니다. GAP(연결/페어링/역할관리) , GATT(서비스, characteristic 읽기/쓰기) , ATT(실제 읽기/쓰기 요청 수행), L2CAP (패킷 분할/재조립+multiplexing), SMP(Pairing,Bonding, key교환)가 여기에 속합니다.&lt;br /&gt;(3) HCI(Host Controller Interface)는 Host와 Controller가 데이터를 주고받는 표준 인터페이스입니다.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;899&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/57xgg/dJMcagjDgHT/WokC7qiLn6p8qx9KtthMW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/57xgg/dJMcagjDgHT/WokC7qiLn6p8qx9KtthMW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/57xgg/dJMcagjDgHT/WokC7qiLn6p8qx9KtthMW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F57xgg%2FdJMcagjDgHT%2FWokC7qiLn6p8qx9KtthMW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;557&quot; height=&quot;899&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;899&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ESP32의 Bluetooth host에는 Bluedroid랑 Nimble이 있습니다.&lt;br /&gt;Bluedroid는 Classic Bluetooth와 BLE가 가능합니다. Nimble은 BLE만 가능합니다. 그래서 Nimble은 Bluedroid대비 코드용량이 40~60% 더 적습니다. &lt;br /&gt;이 글에서 사용하는 프로젝트는 Bluedroid 프로젝트입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYsR2G/dJMcajtPPKe/hLcZbq3QSTJl0OMMtuEJpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYsR2G/dJMcajtPPKe/hLcZbq3QSTJl0OMMtuEJpK/img.png&quot; data-alt=&quot;https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-guides/ble/overview.html&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYsR2G/dJMcajtPPKe/hLcZbq3QSTJl0OMMtuEJpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbYsR2G%2FdJMcajtPPKe%2FhLcZbq3QSTJl0OMMtuEJpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;501&quot; height=&quot;300&quot; data-origin-width=&quot;501&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-guides/ble/overview.html&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서 두가지를 말한 이유가 있습니다. app_main의 흐름은 다음과 같습니다.&lt;br /&gt;1. NVS(Non-volatile Storage) 초기화&amp;nbsp; : ESP32안에 있는 플래시메모리 초기화&lt;br /&gt;2. bt controller 초기화 : controller영역 초기화&lt;br /&gt;3. bluedroid 초기화 : host영역 초기화&lt;br /&gt;4. GAP 콜백등록 : GAP관련 이벤트 처리 준비&lt;br /&gt;5. 광고데이터/SCAN데이터 시스템에 세팅&lt;br /&gt;6. 광고시작&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;여기서 중요한게 4~5번입니다.&lt;br /&gt;코드에서 adv_config_done에 ADV_CONFIG_FLAG랑 SCAN_RSP_CONFIG_FLAG를 줍니다.&lt;br /&gt;그 이유는 esp_gap_cb에서 ADV DATA랑 SCAN DATA를 SET하고나서 광고를 시작하기 위함입니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;esp_ble_gap_config_adv_data_raw&lt;/b&gt;는 광고데이터를 설정하는 API라서 스택이 설정작업을 끝내면 ESP_GAP_BLE_ADV_DATA_RAW_SET_COMPLETE_EVT 이벤트를 esp_gap_cb로 전달합니다.&amp;nbsp;&lt;br /&gt;그럼 아래 로그메세지 (503) BLE_BEACON: Advertising data raw set. status 0가 나옵니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;esp_ble_gap_get_local_used_addr&lt;/b&gt;는 local address를 얻어외서 local_addr 변수에 값을 넣습니다.&lt;br /&gt;그리고나서 scan_rsp_raw_data배열의 2~7번에 주소를 넣습니다. 이전에 해당배열을 선언할때 2~7번은 0x00으로 초기화했었습니다. {0x08, ESP_BLE_AD_TYPE_LE_DEV_ADDR, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ...}&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;200&quot; data-origin-height=&quot;28&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TscQd/dJMcaiodeMl/bkLYy8vDngDeGIhCqarFB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TscQd/dJMcaiodeMl/bkLYy8vDngDeGIhCqarFB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TscQd/dJMcaiodeMl/bkLYy8vDngDeGIhCqarFB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTscQd%2FdJMcaiodeMl%2FbkLYy8vDngDeGIhCqarFB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;200&quot; height=&quot;28&quot; data-origin-width=&quot;200&quot; data-origin-height=&quot;28&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게되면 scan data로 위의 그림과같이 주소가 나오게 됩니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;esp_ble_gap_config_scan_rsp_data_raw&lt;/b&gt;는 마찬가지로 작업이끝나면 ESP_GAP_BLE_SCAN_RSP_DATA_RAW_SET_COMPLETE_EVT이벤트를 esp_gap_cb로 전달하고 I (503) BLE_BEACON: Scan response data raw set, status 0 로그가 나오게됩니다.&lt;br /&gt;해당함수에서 이제 adv_config_done가 0이므로 &lt;b&gt;esp_ble_gap_start_advertising&lt;/b&gt;를 하게되고ESP_GAP_BLE_ADV_START_COMPLETE_EVT 이벤트를 호출합니다. 그럼 로그(I (513) BLE_BEACON: Advertising start successfully)가 나오고 광고가 시작됩니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; adv_config_done &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;|=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; ADV_CONFIG_FLAG;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; adv_config_done &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;|=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; SCAN_RSP_CONFIG_FLAG;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; ret &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;esp_ble_gap_config_adv_data_raw&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(adv_raw_data, &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;sizeof&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(adv_raw_data));&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; (ret) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;ESP_LOGE&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(DEMO_TAG, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;config adv data failed, error code = &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;%x&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, ret);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; ret &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;esp_ble_gap_get_local_used_addr&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(local_addr, &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;local_addr_type);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; (ret) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;ESP_LOGE&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(DEMO_TAG, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;get local used address failed, error code = &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;%x&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, ret);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;scan_rsp_raw_data&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;local_addr&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;];&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;scan_rsp_raw_data&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;local_addr&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;];&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;scan_rsp_raw_data&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;local_addr&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;];&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;scan_rsp_raw_data&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;local_addr&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;];&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;scan_rsp_raw_data&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;local_addr&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;];&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;scan_rsp_raw_data&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;7&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;local_addr&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;];&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; ret &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;esp_ble_gap_config_scan_rsp_data_raw&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(scan_rsp_raw_data, &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;sizeof&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(scan_rsp_raw_data));&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; (ret) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;ESP_LOGE&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(DEMO_TAG, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;config scan rsp data failed, error code = &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;%x&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, ret);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;static&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;esp_gap_cb&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;esp_gap_ble_cb_event_t&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;event&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;esp_ble_gap_cb_param_t&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;param&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;switch&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; (event) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;case&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; ESP_GAP_BLE_ADV_DATA_SET_COMPLETE_EVT:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;ESP_LOGI&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(DEMO_TAG, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;Advertising data set, status &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;%d&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, param&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;adv_data_cmpl.status);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; adv_config_done &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;amp;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;~&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;ADV_CONFIG_FLAG);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; (adv_config_done &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;esp_ble_gap_start_advertising&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;adv_params);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;break&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;case&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; ESP_GAP_BLE_ADV_DATA_RAW_SET_COMPLETE_EVT:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;ESP_LOGI&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(DEMO_TAG, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;Advertising data raw set, status &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;%d&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, param&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;adv_data_raw_cmpl.status);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; adv_config_done &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;amp;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;~&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;ADV_CONFIG_FLAG);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; (adv_config_done &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;esp_ble_gap_start_advertising&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;adv_params);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;break&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;case&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; ESP_GAP_BLE_SCAN_RSP_DATA_SET_COMPLETE_EVT:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;ESP_LOGI&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(DEMO_TAG, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;Scan response data set, status &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;%d&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, param&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;scan_rsp_data_cmpl.status);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; adv_config_done &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;amp;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;~&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;SCAN_RSP_CONFIG_FLAG);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; (adv_config_done &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;esp_ble_gap_start_advertising&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;adv_params);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;break&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;case&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; ESP_GAP_BLE_SCAN_RSP_DATA_RAW_SET_COMPLETE_EVT:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;ESP_LOGI&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(DEMO_TAG, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;Scan response data raw set, status &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;%d&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, param&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;scan_rsp_data_raw_cmpl.status);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; adv_config_done &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;amp;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;~&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;SCAN_RSP_CONFIG_FLAG);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; (adv_config_done &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;esp_ble_gap_start_advertising&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;adv_params);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;break&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;case&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; ESP_GAP_BLE_ADV_START_COMPLETE_EVT:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; (param&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;adv_start_cmpl.status &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; ESP_BT_STATUS_SUCCESS) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;ESP_LOGE&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(DEMO_TAG, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;Advertising start failed, status &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;%d&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;param&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;adv_start_cmpl&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;status&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;break&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;ESP_LOGI&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(DEMO_TAG, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;Advertising start successfully&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;break&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;default&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;break&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1085&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/F3PdG/dJMcafruAfK/7LL3EsbQnRHYRDUWm6Sni1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/F3PdG/dJMcafruAfK/7LL3EsbQnRHYRDUWm6Sni1/img.png&quot; data-alt=&quot;로그&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/F3PdG/dJMcafruAfK/7LL3EsbQnRHYRDUWm6Sni1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FF3PdG%2FdJMcafruAfK%2F7LL3EsbQnRHYRDUWm6Sni1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1085&quot; height=&quot;222&quot; data-origin-width=&quot;1085&quot; data-origin-height=&quot;222&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;로그&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;position: absolute;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;position: absolute;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>지식/BLE</category>
      <author>원원</author>
      <guid isPermaLink="true">https://wowon.tistory.com/378</guid>
      <comments>https://wowon.tistory.com/378#entry378comment</comments>
      <pubDate>Tue, 25 Nov 2025 00:34:32 +0900</pubDate>
    </item>
    <item>
      <title>BLE ESP32 Bluedroid_Beacon 코드 분석하기 1편-전역변수</title>
      <link>https://wowon.tistory.com/377</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요. 오늘은 ESP32 Bluedroid_Beacon 예제코드를 분석해보겠습니다.&lt;br /&gt;사용하는 소스코드는 아래의 링크입니다.&lt;br /&gt;&lt;a href=&quot;https://github.com/espressif/esp-idf/tree/master/examples/bluetooth/ble_get_started/bluedroid/Bluedroid_Beacon&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/espressif/esp-idf/tree/master/examples/bluetooth/ble_get_started/bluedroid/Bluedroid_Beacon&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;1편에서는 프로젝트에서 사용한 전역변수 3개를 알아보겠습니다.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #000000; color: #ffffff;&quot;&gt;* adv_params 구조체&lt;/span&gt;&lt;br /&gt;&amp;nbsp;- 광고를 어떻게 보낼지 설정하는 구조체입니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;static&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;esp_ble_adv_params_t&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; adv_params &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; .adv_int_min &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x20&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; .adv_int_max &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x20&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; .adv_type &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; ADV_TYPE_SCAN_IND,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; .own_addr_type &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; BLE_ADDR_TYPE_PUBLIC,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; .channel_map &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; ADV_CHNL_ALL,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; .adv_filter_policy &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;};&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 구조체의 원형은 esp_gap_ble_api.h에 있습니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;typedef&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;uint16_t&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;adv_int_min;&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/*!&amp;lt; Minimum advertising interval for&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; undirected and low duty cycle directed advertising.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Range: 0x0020 to 0x4000 Default: N = 0x0800 (1.28 second)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Time = N * 0.625 msec Time Range: 20 ms to 10.24 sec */&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;uint16_t&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;adv_int_max;&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/*!&amp;lt; Maximum advertising interval for&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; undirected and low duty cycle directed advertising.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Range: 0x0020 to 0x4000 Default: N = 0x0800 (1.28 second)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Time = N * 0.625 msec Time Range: 20 ms to 10.24 sec Advertising max interval */&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;esp_ble_adv_type_t&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;adv_type;&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; /*!&amp;lt; Advertising type */&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;esp_ble_addr_type_t&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &amp;nbsp; &amp;nbsp; own_addr_type;&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp;/*!&amp;lt; Owner bluetooth device address type */&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;esp_bd_addr_t&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; peer_addr;&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/*!&amp;lt; Peer device bluetooth device address */&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;esp_ble_addr_type_t&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &amp;nbsp; &amp;nbsp; peer_addr_type;&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; &amp;nbsp; &amp;nbsp; /*!&amp;lt; Peer device bluetooth device address type, only support public address type and random address type */&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;esp_ble_adv_channel_t&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &amp;nbsp; channel_map;&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;/*!&amp;lt; Advertising channel map */&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;esp_ble_adv_filter_t&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &amp;nbsp; &amp;nbsp;adv_filter_policy;&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; &amp;nbsp;/*!&amp;lt; Advertising filter policy */&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;esp_ble_adv_params_t&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 구조체의 선언은 모두 bluetooth 문서에 나와있습니다. (1252 page)&lt;br /&gt;&lt;br /&gt;첫번째 변수부터 알아보겠습니다.&amp;nbsp;&lt;br /&gt;&lt;b&gt;(1) adv_int_min, adv_int_max&lt;/b&gt; : 최소/최대 광고시간 간격 설정입니다.&amp;nbsp; 범위는 20ms~10.24s 입니다.&lt;br /&gt;코드에서는 min/max가 0x20이므로 32*0.625 = 20ms마다 광고하게 되어있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;332&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bicBcI/dJMcabCBVBg/zPlDFPumfzrTlcJC9ZUBj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bicBcI/dJMcabCBVBg/zPlDFPumfzrTlcJC9ZUBj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bicBcI/dJMcabCBVBg/zPlDFPumfzrTlcJC9ZUBj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbicBcI%2FdJMcabCBVBg%2FzPlDFPumfzrTlcJC9ZUBj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;484&quot; height=&quot;332&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;332&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 광고 간격을 측정해 보면 정확히 20ms로 반복되지 않고, 약 20~30ms 범위에서 랜덤하게 변화하는 것을 확인할 수 있습니다. 이 현상은 BLE 스펙에 의해 정의된 동작으로, 광고 간격(advertising interval)에 추가로 0~10ms의 랜덤 지연이 더해지기 때문입니다. 랜덤 딜레이가 필요한 이유는, BLE 광고가 단일 채널이 아닌 37, 38, 39 총 3개의 채널에서 반복적으로 브로드캐스트되기 때문입니다. 만약 여러 BLE 장치가 동일한 고정 간격(예: 20ms)으로 광고를 전송한다면, 각 장치가 동일한 타이밍에 3개의 채널에서 동시에 송신하게 되어 지속적인 패킷 충돌이 발생할 수 있습니다. 이를 방지하기 위해 BLE는 각 광고 이벤트마다 0~10ms의 랜덤 지연을 적용하여 충돌&amp;nbsp;패턴이&amp;nbsp;반복되지&amp;nbsp;않도록&amp;nbsp;하고,&amp;nbsp;결과적으로&amp;nbsp;광고&amp;nbsp;수신&amp;nbsp;성공률을&amp;nbsp;높입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;348&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCgK2l/dJMcabo4HAN/nvdeyLa0UvvE0n0pQJKgX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCgK2l/dJMcabo4HAN/nvdeyLa0UvvE0n0pQJKgX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCgK2l/dJMcabo4HAN/nvdeyLa0UvvE0n0pQJKgX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCgK2l%2FdJMcabo4HAN%2FnvdeyLa0UvvE0n0pQJKgX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;348&quot; height=&quot;254&quot; data-origin-width=&quot;348&quot; data-origin-height=&quot;254&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테스트로 min/max를 1초로 바꾸고 측정을 해보면 약 1초간격으로 광고가 찍힙니다.&lt;br /&gt;min을 0.5초, max를 1초로 바꾸고 측정해봐도 약 1초간격으로 광고가 찍혔습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cN7cpI/dJMcabP839w/aI2NL5calaOUsairp4OI9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cN7cpI/dJMcabP839w/aI2NL5calaOUsairp4OI9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cN7cpI/dJMcabP839w/aI2NL5calaOUsairp4OI9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcN7cpI%2FdJMcabP839w%2FaI2NL5calaOUsairp4OI9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;336&quot; height=&quot;154&quot; data-origin-width=&quot;336&quot; data-origin-height=&quot;154&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(2) adv_typ&lt;/b&gt; : BLE 장치가 어떤 방식으로 광고할지 정의하는 속성입니다.&lt;br /&gt;광고 타입은 총 5개가 있습니다. 데이터시트에나와있는게 소스코드에도 정의되어있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;388&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/laFIn/dJMcabWUGSB/vapx5j3Bm2zy3nSeks3EXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/laFIn/dJMcabWUGSB/vapx5j3Bm2zy3nSeks3EXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/laFIn/dJMcabWUGSB/vapx5j3Bm2zy3nSeks3EXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlaFIn%2FdJMcabWUGSB%2Fvapx5j3Bm2zy3nSeks3EXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;804&quot; height=&quot;388&quot; data-origin-width=&quot;804&quot; data-origin-height=&quot;388&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;typedef&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;enum&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;ADV_TYPE_IND&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;ADV_TYPE_DIRECT_IND_HIGH&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x01&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;ADV_TYPE_SCAN_IND&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x02&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;ADV_TYPE_NONCONN_IND&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x03&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;ADV_TYPE_DIRECT_IND_LOW&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x04&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;esp_ble_adv_type_t&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입을 나누는 기준은 두가지입니다. 실제로 어떤기준인지 알아보겠습니다.&lt;br /&gt;(1) 연결 가능?&lt;br /&gt;아래 그림을보면 왼쪽은 CONNECT버튼이 없고 오른쪽은 CONNECT 버튼이 있습니다.&amp;nbsp; 이게 연결가능? 속성입니다.&lt;br /&gt;연결이 필요없는경우는 일반적으로 데이터 교환이 필요없는 Beacon같은경우입니다. 연결이 필요한경우는 데이터교환이 필요한 온도계같은 경우입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;265&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wnUmv/dJMcahv3RB5/AOAbblDppvrrtAZVbJOFmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wnUmv/dJMcahv3RB5/AOAbblDppvrrtAZVbJOFmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wnUmv/dJMcahv3RB5/AOAbblDppvrrtAZVbJOFmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwnUmv%2FdJMcahv3RB5%2FAOAbblDppvrrtAZVbJOFmk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;602&quot; height=&quot;265&quot; data-origin-width=&quot;602&quot; data-origin-height=&quot;265&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2) 스캔요청에 응답가능?&lt;br /&gt;스캔요청은 scanner가 device에게 scan을 요청하는 기능입니다.&lt;br /&gt;사용하는 이유는 크게 3가지입니다.&lt;br /&gt;[1] Advertising data의 크기가 제한되어있기 때문입니다. Advertising data의 크기는 31바이트이고 Scan Response Data의 크기는 31바이트입니다.&lt;br /&gt;[2] Scanner가 원할때만 추가 데이터를 제공해서 전력과 채널 사용 효율을 높이기 위함입니다.&lt;br /&gt;[3] 연결전에 device 기능/정체성 확인이 필요하기때문입니다. Scan response에 Profile UUID나 Device Type같은걸 넣으면 탐색이 쉽습니다.&lt;br /&gt;&lt;br /&gt;정리하면 아래의 표와 같습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 89.187%; height: 227px;&quot; border=&quot;1&quot; width=&quot;443&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 8.74587%; height: 21px;&quot; width=&quot;72&quot; height=&quot;22&quot;&gt;No&lt;/td&gt;
&lt;td style=&quot;width: 44.3894%; height: 21px;&quot; width=&quot;227&quot;&gt;TYPE&lt;/td&gt;
&lt;td style=&quot;width: 15.5115%; height: 21px;&quot; width=&quot;72&quot;&gt;conntable&lt;/td&gt;
&lt;td style=&quot;width: 15.5115%; height: 21px;&quot; width=&quot;72&quot;&gt;scannable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 8.74587%; height: 21px;&quot; height=&quot;22&quot;&gt;0&lt;/td&gt;
&lt;td style=&quot;width: 44.3894%; height: 21px;&quot;&gt;ADV_TYPE_IND&lt;/td&gt;
&lt;td style=&quot;width: 15.5115%; height: 21px;&quot;&gt;O&lt;/td&gt;
&lt;td style=&quot;width: 15.5115%; height: 21px;&quot;&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 8.74587%; height: 21px;&quot; height=&quot;22&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 44.3894%; height: 21px;&quot;&gt;ADV_TYPE_DIRECT_IND_HIGH&lt;/td&gt;
&lt;td style=&quot;width: 15.5115%; height: 21px;&quot;&gt;O&lt;/td&gt;
&lt;td style=&quot;width: 15.5115%; height: 21px;&quot;&gt;X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 8.74587%; height: 21px;&quot; height=&quot;22&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 44.3894%; height: 21px;&quot;&gt;ADV_TYPE_SCAN_IND&lt;/td&gt;
&lt;td style=&quot;width: 15.5115%; height: 21px;&quot;&gt;X&lt;/td&gt;
&lt;td style=&quot;width: 15.5115%; height: 21px;&quot;&gt;O&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 8.74587%; height: 21px;&quot; height=&quot;22&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 44.3894%; height: 21px;&quot;&gt;ADV_TYPE_NONCONN_IND&lt;/td&gt;
&lt;td style=&quot;width: 15.5115%; height: 21px;&quot;&gt;X&lt;/td&gt;
&lt;td style=&quot;width: 15.5115%; height: 21px;&quot;&gt;X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 21px;&quot;&gt;
&lt;td style=&quot;width: 8.74587%; height: 21px;&quot; height=&quot;22&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 44.3894%; height: 21px;&quot;&gt;ADV_TYPE_DIRECT_IND_LOW&lt;/td&gt;
&lt;td style=&quot;width: 15.5115%; height: 21px;&quot;&gt;O&lt;/td&gt;
&lt;td style=&quot;width: 15.5115%; height: 21px;&quot;&gt;X&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1,4번은 옵션이 같은데 HIGH/LOW라고 적혀있습니다.&lt;br /&gt;Direct&amp;nbsp;Advertising이란&amp;nbsp;특정&amp;nbsp;장치만&amp;nbsp;연결을&amp;nbsp;허용하는&amp;nbsp;기능입니다. &lt;br /&gt;예를 들어 무선 이어폰이 마지막으로 연결된 스마트폰을 다시 찾을 때나, 스마트워치가 사용자의 스마트폰 근처에 있는지 확인할 때 사용됩니다. 이때 광고 패킷 안에는 Target Device Address(연결 대상 장치의 MAC 주소)가 포함되며, 따라서 이 MAC 주소가 일치하는 장치만 연결을 시도할 수 있습니다. Direct Advertising은 다시 두 가지 유형으로 나뉩니다.&lt;br /&gt;HIGH&amp;nbsp;Duty&amp;nbsp;Direct&amp;nbsp;Advertising은&amp;nbsp;매우&amp;nbsp;짧은&amp;nbsp;간격(약&amp;nbsp;3.75ms~10ms)으로&amp;nbsp;빠르게&amp;nbsp;광고하여, &lt;br /&gt;가능한&amp;nbsp;한&amp;nbsp;빠른&amp;nbsp;재연결을&amp;nbsp;목표로&amp;nbsp;합니다.&amp;nbsp;Fast&amp;nbsp;Pairing이나&amp;nbsp;자동&amp;nbsp;재연결&amp;nbsp;기능을&amp;nbsp;구현할&amp;nbsp;때&amp;nbsp;사용되며, &lt;br /&gt;사용자가&amp;nbsp;이어폰&amp;nbsp;케이스를&amp;nbsp;열자마자&amp;nbsp;폰과&amp;nbsp;즉시&amp;nbsp;연결되는&amp;nbsp;경험을&amp;nbsp;제공하기&amp;nbsp;위한&amp;nbsp;방식입니다. &lt;br /&gt;다만 소비 전력이 크기 때문에 스펙상 최대 1.28초까지만 사용이 허용됩니다.&lt;br /&gt;반면,&amp;nbsp;LOW&amp;nbsp;Duty&amp;nbsp;Direct&amp;nbsp;Advertising은&amp;nbsp;이러한&amp;nbsp;빠른&amp;nbsp;연결보다는&amp;nbsp;배터리&amp;nbsp;활용&amp;nbsp;효율을&amp;nbsp;우선합니다. &lt;br /&gt;간격이&amp;nbsp;더&amp;nbsp;길고&amp;nbsp;전력&amp;nbsp;소모가&amp;nbsp;적으며&amp;nbsp;HIGH&amp;nbsp;Duty&amp;nbsp;모드&amp;nbsp;실패&amp;nbsp;후&amp;nbsp;이어서&amp;nbsp;동작하는&amp;nbsp;경우가&amp;nbsp;일반적입니다. &lt;br /&gt;즉&amp;nbsp;HIGH&amp;nbsp;Duty로&amp;nbsp;빠르게&amp;nbsp;재연결을&amp;nbsp;시도하고,&amp;nbsp;실패하면&amp;nbsp;LOW&amp;nbsp;Duty&amp;nbsp;모드로&amp;nbsp;전환하여 &lt;br /&gt;장시간 동안 연결 가능 상태를 유지하는 구조입니다.&lt;br /&gt;정리하면&amp;nbsp;HIGH&amp;nbsp;Duty는&amp;nbsp;'빠른&amp;nbsp;연결&amp;nbsp;우선',&amp;nbsp;LOW&amp;nbsp;Duty는&amp;nbsp;'배터리&amp;nbsp;효율과&amp;nbsp;지속성&amp;nbsp;우선'이라는&amp;nbsp;차이가&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. own_addr_type&lt;/b&gt; :BLE장치가 광고하거나 연결할때 어떤종류의 Bluetooth 주소 형식을 사용할지 정의하는 속성입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRsnPp/dJMcafLMriz/tLtCGkOkRkTPDY9g1PcQ9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRsnPp/dJMcafLMriz/tLtCGkOkRkTPDY9g1PcQ9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRsnPp/dJMcafLMriz/tLtCGkOkRkTPDY9g1PcQ9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRsnPp%2FdJMcafLMriz%2FtLtCGkOkRkTPDY9g1PcQ9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;808&quot; height=&quot;374&quot; data-origin-width=&quot;808&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;typedef&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;enum&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;BLE_ADDR_TYPE_PUBLIC&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; &amp;nbsp; &amp;nbsp; /*!&amp;lt; Public Device Address */&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;BLE_ADDR_TYPE_RANDOM&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x01&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; &amp;nbsp; &amp;nbsp; /*!&amp;lt; Random Device Address. To set this address, use the function esp_ble_gap_set_rand_addr(esp_bd_addr_t rand_addr) */&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;BLE_ADDR_TYPE_RPA_PUBLIC&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x02&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; &amp;nbsp; &amp;nbsp; /*!&amp;lt; Resolvable Private Address (RPA) with public identity address */&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;BLE_ADDR_TYPE_RPA_RANDOM&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x03&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; &amp;nbsp; &amp;nbsp; /*!&amp;lt; Resolvable Private Address (RPA) with random identity address. To set this address, use the function esp_ble_gap_set_rand_addr(esp_bd_addr_t rand_addr) */&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;esp_ble_addr_type_t&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;4. channel_map&lt;/b&gt; : BLE 광고가 어떤 채널에서 송출될지 결정하는 속성입니다.&lt;br /&gt;BLE 광고는 37,38,39광고에서 송출됩니다. 3개의 채널을 사용하는 이유는 스캔되고 발견될 확률증가, WI-FI 간섭 회피, 패킷손실감소 목적입니다. BLE장비 대부분 37,38,39모두를 사용합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;281&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btFoDo/dJMcab3GxsD/pA6dLiVAXo1Y23K9M7bLy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btFoDo/dJMcab3GxsD/pA6dLiVAXo1Y23K9M7bLy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btFoDo/dJMcab3GxsD/pA6dLiVAXo1Y23K9M7bLy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtFoDo%2FdJMcab3GxsD%2FpA6dLiVAXo1Y23K9M7bLy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;814&quot; height=&quot;281&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;281&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;typedef&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;enum&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;ADV_CHNL_37&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x01&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;ADV_CHNL_38&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x02&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;ADV_CHNL_39&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x04&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;ADV_CHNL_ALL&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x07&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;esp_ble_adv_channel_t&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5. esp_ble_adv_filter_t&lt;/b&gt; : BLE 광고가 어떤 디바이스의 스캔/연결 요청을 허용할지 정하는 보안/동작 정책입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;810&quot; data-origin-height=&quot;340&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XDxaE/dJMcagDVIgN/dz5ooUGCjMRM92QPXGbDMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XDxaE/dJMcagDVIgN/dz5ooUGCjMRM92QPXGbDMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XDxaE/dJMcagDVIgN/dz5ooUGCjMRM92QPXGbDMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXDxaE%2FdJMcagDVIgN%2Fdz5ooUGCjMRM92QPXGbDMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;810&quot; height=&quot;340&quot; data-origin-width=&quot;810&quot; data-origin-height=&quot;340&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;typedef&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;enum&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;&amp;nbsp; &amp;nbsp; ///Allow both scan and connection requests from anyone&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;&amp;nbsp; &amp;nbsp; ///Allow both scan req from White List devices only and connection req from anyone&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;ADV_FILTER_ALLOW_SCAN_WLST_CON_ANY&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;&amp;nbsp; &amp;nbsp; ///Allow both scan req from anyone and connection req from White List devices only&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;ADV_FILTER_ALLOW_SCAN_ANY_CON_WLST&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;&amp;nbsp; &amp;nbsp; ///Allow scan and connection requests from White List devices only&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;ADV_FILTER_ALLOW_SCAN_WLST_CON_WLST&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;&amp;nbsp; &amp;nbsp; ///Enumeration end value for advertising filter policy value check&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;} &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;esp_ble_adv_filter_t&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결론적으로 이 프로젝트에서 광고방식은 광고를 20ms마다 하고, 누구나 스캔할 수 있지만 연결은 불가능한(Scannable Undirected) 방식으로 송출되며, 모든 광고 채널을 사용해 자신의 존재를 알리도록 설정되어 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #000000; color: #ffffff;&quot;&gt;*adv_raw_data, scan_rsp_raw_data 변수&lt;/span&gt;&lt;br /&gt;AD types의 기본 포맷은 length,&amp;nbsp;AD&amp;nbsp;Type,&amp;nbsp;AD&amp;nbsp;Data입니다.&lt;br /&gt;AD types에 대해서는 이전 글에 설명이 있습니다.&lt;br /&gt;&lt;a href=&quot;https://wowon.tistory.com/373&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://wowon.tistory.com/373&lt;/a&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;//configure raw data for advertising packet&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;static&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;uint8_t&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; adv_raw_data&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;[]&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x02&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, ESP_BLE_AD_TYPE_FLAG, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x06&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x11&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, ESP_BLE_AD_TYPE_NAME_CMPL, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'B'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'l'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'u'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'e'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'d'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'r'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'o'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'i'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'d'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'_'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'B'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'e'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'a'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'c'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'o'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'n'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x02&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, ESP_BLE_AD_TYPE_TX_PWR, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x09&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x03&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, ESP_BLE_AD_TYPE_APPEARANCE, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x02&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x02&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, ESP_BLE_AD_TYPE_LE_ROLE, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;};&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;static&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;uint8_t&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; scan_rsp_raw_data&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;[]&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x08&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, ESP_BLE_AD_TYPE_LE_DEV_ADDR, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x11&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, ESP_BLE_AD_TYPE_URI, URI_PREFIX_HTTPS, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'/'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'/'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'e'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'s'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'p'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'r'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'e'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'s'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'s'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'i'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'f'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'.'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'c'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'o'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'m'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;};&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ADV_TYPE_SCAN_IND 타입이므로 스캔요청에 응답이 가능한 타입입니다.&lt;br /&gt;그래서 앱을보면 BT 주소, URI이 나와있습니다. 스캔요청이 불가능한 ADV_TYPE_NONCONN_IND타입으로 바꿔서 확인해보겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6dtPv/dJMb99Ly4sW/jwAOmBuYuTqtycmpKsnxl0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6dtPv/dJMb99Ly4sW/jwAOmBuYuTqtycmpKsnxl0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6dtPv/dJMb99Ly4sW/jwAOmBuYuTqtycmpKsnxl0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6dtPv%2FdJMb99Ly4sW%2FjwAOmBuYuTqtycmpKsnxl0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;637&quot; height=&quot;224&quot; data-origin-width=&quot;637&quot; data-origin-height=&quot;224&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ADV_TYPE_NONCONN_IND&amp;nbsp;타입은&amp;nbsp;스캔&amp;nbsp;데이터가&amp;nbsp;없는&amp;nbsp;것을&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있습니다.&lt;br /&gt;&lt;br /&gt;다음글에서는 BLE가 광고되는 흐름에대해 알아보겠습니다.&lt;/p&gt;</description>
      <category>지식/BLE</category>
      <author>원원</author>
      <guid isPermaLink="true">https://wowon.tistory.com/377</guid>
      <comments>https://wowon.tistory.com/377#entry377comment</comments>
      <pubDate>Sat, 22 Nov 2025 20:26:06 +0900</pubDate>
    </item>
    <item>
      <title>BLE GATT를 Ble Sniffer로 측정하기</title>
      <link>https://wowon.tistory.com/376</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요. 오늘은 이전에 알아봤던 BLE GATT를 BLE Sniffer로 측정해보겠습니다.&lt;br /&gt;측정하는 방식과 알아보는 방식은 이전에 BLE GAP을&amp;nbsp; BLE Sniffer로 측정했던 방식과 동일합니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;301&quot; data-origin-height=&quot;195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CrmuV/dJMcaa4JnpT/d1nmpytq48Ik3HjGumbYC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CrmuV/dJMcaa4JnpT/d1nmpytq48Ik3HjGumbYC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CrmuV/dJMcaa4JnpT/d1nmpytq48Ik3HjGumbYC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCrmuV%2FdJMcaa4JnpT%2Fd1nmpytq48Ik3HjGumbYC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;301&quot; height=&quot;195&quot; data-origin-width=&quot;301&quot; data-origin-height=&quot;195&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스마트폰&amp;nbsp;앱에서&amp;nbsp;CONNECT&amp;nbsp;버튼을&amp;nbsp;확인할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnkWkg/dJMcah3Raqu/CIEY6Ck8Z9xLL41TzKhHP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnkWkg/dJMcah3Raqu/CIEY6Ck8Z9xLL41TzKhHP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnkWkg/dJMcah3Raqu/CIEY6Ck8Z9xLL41TzKhHP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnkWkg%2FdJMcah3Raqu%2FCIEY6Ck8Z9xLL41TzKhHP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;837&quot; height=&quot;182&quot; data-origin-width=&quot;837&quot; data-origin-height=&quot;182&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;b&gt;(1)&lt;/b&gt;&lt;span&gt;&lt;b&gt;&amp;nbsp; ADV_IND&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;- CONNECT를 하기전에는 ESP32가 advertising 하고있습니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(2) CONNECT_IND&lt;/b&gt;&lt;br /&gt;- 스마트폰에서 CONNECT를하면 연결시도를 합니다.&amp;nbsp;&lt;br /&gt;CONNECT_IND 패킷 안에 설정정보를 만듭니다. 이중에 Access Address가 있는데, 데이터 채널에서 사용되는 32bit 주소입니다. 이 주소로 LL/ATT/GATT 패킷이 전송됩니다. CONNECT_IND 이후부터는 데이터채널로 전환됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;419&quot; data-origin-height=&quot;294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WrGxB/dJMcacuH7tO/t2dNwpSOxP3yAUijQPhaO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WrGxB/dJMcacuH7tO/t2dNwpSOxP3yAUijQPhaO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WrGxB/dJMcacuH7tO/t2dNwpSOxP3yAUijQPhaO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWrGxB%2FdJMcacuH7tO%2Ft2dNwpSOxP3yAUijQPhaO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;343&quot; height=&quot;241&quot; data-origin-width=&quot;419&quot; data-origin-height=&quot;294&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(3) Control Opcode: LL_VERSION_IND&lt;/b&gt; &lt;br /&gt;- 연결시도 이후에 BLE 버전정보를 교환하게 됩니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(4) Empty PDU&lt;/b&gt;&lt;br /&gt;- 연결을 유지하려고 스마트폰과 ESP32는 서로 패킷을 보냅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1204&quot; data-origin-height=&quot;743&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4dd1r/dJMcagKD1As/jAWcBY8M6Y1k25dvflQBxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4dd1r/dJMcagKD1As/jAWcBY8M6Y1k25dvflQBxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4dd1r/dJMcagKD1As/jAWcBY8M6Y1k25dvflQBxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4dd1r%2FdJMcagKD1As%2FjAWcBY8M6Y1k25dvflQBxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1204&quot; height=&quot;743&quot; data-origin-width=&quot;1204&quot; data-origin-height=&quot;743&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;(5) LL_FEATURE_REQ/LL_FEATURE_RSP&lt;/b&gt;&lt;br /&gt;- 지원 기능(Encrption, DLE, PHY등) 동기화 과정입니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(6) LL_LENGTH_REQ/LL_LENGTH_RSP&lt;/b&gt;&lt;br /&gt;- 데이터 길이 협상입니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(7) Sent Read By Group Type Request, Primary Service, Handles : 0x0001..0xffff (No.26662)&lt;/b&gt;&lt;br /&gt;- 스마트폰이 ESP32의 GATT Primary Service(0x2800) 목옥을 요청하는 패킷입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;338&quot; data-origin-height=&quot;99&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOAvZt/dJMcagw6RMv/HlYPXv2K8gAIZC4Ky6kuCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOAvZt/dJMcagw6RMv/HlYPXv2K8gAIZC4Ky6kuCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOAvZt/dJMcagw6RMv/HlYPXv2K8gAIZC4Ky6kuCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOAvZt%2FdJMcagw6RMv%2FHlYPXv2K8gAIZC4Ky6kuCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;338&quot; height=&quot;99&quot; data-origin-width=&quot;338&quot; data-origin-height=&quot;99&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(8) Rcvd Read By Group Type Response, Attribute List Length: 3, GATT, GAP, Heart Rate (No.26669)&lt;/b&gt;&lt;br /&gt;- ESP32가 Primary Service목록 3개 (GAP,GATT,Heart Rate)를 가지고있다고 답변한 패킷입니다.&lt;br /&gt;마지막 Attribute Data의 Group End Handle을 보면 0x002b입니다. 그 의미는 Attribute Data가 더 있다는 말입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;553&quot; data-origin-height=&quot;349&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brUa8n/dJMcagqllpB/kICq7ff89B8le7nodxqwHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brUa8n/dJMcagqllpB/kICq7ff89B8le7nodxqwHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brUa8n/dJMcagqllpB/kICq7ff89B8le7nodxqwHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrUa8n%2FdJMcagqllpB%2FkICq7ff89B8le7nodxqwHK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;553&quot; height=&quot;349&quot; data-origin-width=&quot;553&quot; data-origin-height=&quot;349&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(9) Sent Read By Group Type Request, Primary Service, Handles: 0x002c..0xffff(No. 26676)&lt;/b&gt;&lt;br /&gt;- GATT Primary Service 목록을 다시 요청합니다. Group End Handle가 0x002b였으므로 0x002b+1부터 시작합니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(10) Rcvd Read By Group Type Response, Attribute List Length: 1, Automation IO (No.26679)&lt;/b&gt;&lt;br /&gt;- 응답입니다. Group end Handle가 0xffff이므로 서비스의 끝을 의미합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;205&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZK5hz/dJMb99Lwlqj/I4rimbsIFkFyMpa4ieRYDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZK5hz/dJMb99Lwlqj/I4rimbsIFkFyMpa4ieRYDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZK5hz/dJMb99Lwlqj/I4rimbsIFkFyMpa4ieRYDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZK5hz%2FdJMb99Lwlqj%2FI4rimbsIFkFyMpa4ieRYDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;575&quot; height=&quot;205&quot; data-origin-width=&quot;575&quot; data-origin-height=&quot;205&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(11) 그 다음에는 각각의 UUID들의 Include Service와 Characteristic을 요청합니다.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;여기까지 했으면 스마트폰에서는 아래의 UI들이 보입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;3153&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lvfkp/dJMcafycBBn/5F6khO2mbF0P1An4PTsK60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lvfkp/dJMcafycBBn/5F6khO2mbF0P1An4PTsK60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lvfkp/dJMcafycBBn/5F6khO2mbF0P1An4PTsK60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLvfkp%2FdJMcafycBBn%2F5F6khO2mbF0P1An4PTsK60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;242&quot; height=&quot;707&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;3153&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 상태에서는 스마트폰과 ESP32는 Empty PDU 패킷을 교환하고있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;217&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J67SN/dJMcabWSb5P/VkaANI6DHcFD8EjgyYfkbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J67SN/dJMcabWSb5P/VkaANI6DHcFD8EjgyYfkbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J67SN/dJMcabWSb5P/VkaANI6DHcFD8EjgyYfkbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ67SN%2FdJMcabWSb5P%2FVkaANI6DHcFD8EjgyYfkbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;672&quot; height=&quot;217&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;217&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[테스트]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;325&quot; data-origin-height=&quot;138&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lIiAg/dJMcacuH8D4/KKNo5OZwlFyHqUUIVw8iF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lIiAg/dJMcacuH8D4/KKNo5OZwlFyHqUUIVw8iF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lIiAg/dJMcacuH8D4/KKNo5OZwlFyHqUUIVw8iF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlIiAg%2FdJMcacuH8D4%2FKKNo5OZwlFyHqUUIVw8iF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;325&quot; height=&quot;138&quot; data-origin-width=&quot;325&quot; data-origin-height=&quot;138&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Generic Access의 Device Name을 얻으면 ESP32가 읽힙니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;73&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcENWl/dJMcabWScct/vQhxDpi1MJcQbLEKhNmBo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcENWl/dJMcabWScct/vQhxDpi1MJcQbLEKhNmBo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcENWl/dJMcabWScct/vQhxDpi1MJcQbLEKhNmBo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcENWl%2FdJMcabWScct%2FvQhxDpi1MJcQbLEKhNmBo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;978&quot; height=&quot;73&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;73&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(1) Sent Read Request, Handle: 0x0016 (GAP: Device Name)&lt;/b&gt;&lt;br /&gt;- 스마트폰에서 Handle 0x0016을 Read Request합니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;144&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgONpF/dJMcabvNNsL/4KtcbtEod8oTzqKMAxMxFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgONpF/dJMcabvNNsL/4KtcbtEod8oTzqKMAxMxFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgONpF/dJMcabvNNsL/4KtcbtEod8oTzqKMAxMxFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgONpF%2FdJMcabvNNsL%2F4KtcbtEod8oTzqKMAxMxFk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;360&quot; height=&quot;144&quot; data-origin-width=&quot;360&quot; data-origin-height=&quot;144&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(2) Rcvd Read Response, Handle: 0x0016 (GAP: Device Name)&lt;/b&gt;&lt;br /&gt;- ESP32가 Request에 대해서 응답을 합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zblvG/dJMcabigHkY/MFOBJpXCZUq0Ok7fWEnyiK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zblvG/dJMcabigHkY/MFOBJpXCZUq0Ok7fWEnyiK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zblvG/dJMcabigHkY/MFOBJpXCZUq0Ok7fWEnyiK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzblvG%2FdJMcabigHkY%2FMFOBJpXCZUq0Ok7fWEnyiK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;361&quot; height=&quot;184&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;184&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>지식/BLE</category>
      <author>원원</author>
      <guid isPermaLink="true">https://wowon.tistory.com/376</guid>
      <comments>https://wowon.tistory.com/376#entry376comment</comments>
      <pubDate>Sun, 16 Nov 2025 13:21:08 +0900</pubDate>
    </item>
    <item>
      <title>BLE GATT 예시를 통해서 알아보기</title>
      <link>https://wowon.tistory.com/375</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요. 오늘은 BLE GATT에 대해 알아보겠습니다.&lt;br /&gt;&lt;br /&gt;GATT(Generic Attribute Profile)는&amp;nbsp; BLE에서 장치 간 데이터를 교환하기 위해 '서비스'와 '특성'구조로 정의된 통신프로토콜입니다.&lt;br /&gt;&lt;br /&gt;GATT가 실제로 어떻게 사용하는지 ESP32와 스마트폰앱(nRF Connect)를 이용해서 알아보겠습니다.&lt;br /&gt;ESP32에 넣은 예제는 &quot;Bluedroid_GATT_Server&quot; 입니다.&amp;nbsp;&lt;br /&gt;&lt;a href=&quot;https://github.com/espressif/esp-idf/tree/master/examples/bluetooth/ble_get_started/bluedroid/Bluedroid_GATT_Server&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/espressif/esp-idf/tree/master/examples/bluetooth/ble_get_started/bluedroid/Bluedroid_GATT_Server&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스마트폰 앱으로 연결해서 GATT 서비스를 확인한 사진입니다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;313&quot; data-origin-height=&quot;367&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Un4FB/dJMcaaQ9BYD/w6wkuyeoCkIfMzrwOBqkH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Un4FB/dJMcaaQ9BYD/w6wkuyeoCkIfMzrwOBqkH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Un4FB/dJMcaaQ9BYD/w6wkuyeoCkIfMzrwOBqkH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUn4FB%2FdJMcaaQ9BYD%2Fw6wkuyeoCkIfMzrwOBqkH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;313&quot; height=&quot;367&quot; data-origin-width=&quot;313&quot; data-origin-height=&quot;367&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 서비스는 UUID(Universally Unique Identifier)로 구분이 됩니다. UUID의 역할은 데이터가 무엇인지 구분하기 위함입니다.&lt;br /&gt;UUID는 아래의 문서에 정의되어있습니다.&lt;br /&gt;&lt;a href=&quot;https://www.bluetooth.com/wp-content/uploads/Files/Specification/HTML/Assigned_Numbers/out/en/Assigned_Numbers.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.bluetooth.com/wp-content/uploads/Files/Specification/HTML/Assigned_Numbers/out/en/Assigned_Numbers.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시로,&amp;nbsp;앱에서&amp;nbsp;0x180D가&amp;nbsp;Heart&amp;nbsp;Rate로&amp;nbsp;표시되어&amp;nbsp;있고,&amp;nbsp;문서에서도&amp;nbsp;동일하게&amp;nbsp;Heart&amp;nbsp;Rate&amp;nbsp;Service로&amp;nbsp;명시되어&amp;nbsp;있습니다. &lt;br /&gt;UUID는&amp;nbsp;원래&amp;nbsp;128비트(16바이트)&amp;nbsp;이지만,&amp;nbsp;표준&amp;nbsp;UUID는&amp;nbsp;16비트로&amp;nbsp;축약하여&amp;nbsp;표현할&amp;nbsp;수&amp;nbsp;있습니다. &lt;br /&gt;따라서 0x180D를 128비트 형식으로 확장하면, Bluetooth&amp;nbsp;SIG에서&amp;nbsp;정의한&amp;nbsp;기본&amp;nbsp;포맷인 &lt;br /&gt;0000XXXX-0000-1000-8000-00805F9B34FB에 대입하여 최종적으로&amp;nbsp;0000&lt;span style=&quot;color: #ee2323;&quot;&gt;180D&lt;/span&gt;-0000-1000-8000-00805F9B34FB가&amp;nbsp;됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;131&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0SWdr/dJMcafLG52x/Wnme6zF4XAxRQfoizXgTJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0SWdr/dJMcafLG52x/Wnme6zF4XAxRQfoizXgTJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0SWdr/dJMcafLG52x/Wnme6zF4XAxRQfoizXgTJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0SWdr%2FdJMcafLG52x%2FWnme6zF4XAxRQfoizXgTJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;484&quot; height=&quot;131&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;131&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자정의 UUID도 있습니다. Bluetooth SIG가 정해놓은 UUID외에 회사가 직접 만들어서 사용하는 128비트 UUID입니다. 해당 UUID는 정해진 포맷이 없습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;0x1801 UUID부터 알아보겠습니다.&lt;br /&gt;BLE의 GATT구조(서비스/특성)를 관리하는 서비스입니다.&lt;br /&gt;내부 데이터베이스가 바뀌면 Service Changed 특성으로 클라이언트에게 알립니다.&lt;br /&gt;BLE 스택이 자동으로 추가하기때문에 FW에 명시적으로 넣지 않아도 거의 항상 존재합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;183&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GhgbB/dJMcaest3Zf/vRd7kjAp8qZbaelLsQHj81/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GhgbB/dJMcaest3Zf/vRd7kjAp8qZbaelLsQHj81/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GhgbB/dJMcaest3Zf/vRd7kjAp8qZbaelLsQHj81/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGhgbB%2FdJMcaest3Zf%2FvRd7kjAp8qZbaelLsQHj81%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;308&quot; height=&quot;183&quot; data-origin-width=&quot;308&quot; data-origin-height=&quot;183&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Service Changed는 GATT 구조 자체가 바뀔 때만&amp;nbsp; 발생합니다.&lt;br /&gt;&lt;br /&gt;여기서 나온 Service의 의미입니다. &lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;485&quot; data-origin-height=&quot;518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlXZ1h/dJMcaacx2t7/8UxsRzckKL2e408Bp1SGvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlXZ1h/dJMcaacx2t7/8UxsRzckKL2e408Bp1SGvk/img.png&quot; data-alt=&quot;Core_v5.0.pdf / 2229page&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlXZ1h/dJMcaacx2t7/8UxsRzckKL2e408Bp1SGvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlXZ1h%2FdJMcaacx2t7%2F8UxsRzckKL2e408Bp1SGvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;485&quot; height=&quot;518&quot; data-origin-width=&quot;485&quot; data-origin-height=&quot;518&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Core_v5.0.pdf / 2229page&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Profile : BLE의 최상위 개념입니다. 한 기기의 기능묶음 전체 입니다.&lt;br /&gt;Service : 실제 기능 단위입니다. 하나의 profile안에 여러 서비스가 있을 수 있습니다.(예:0x180D,0x1815)&lt;br /&gt;Include : 한 서비스 안에 다른 서비스를 참조해서 같이 쓰는 기 능입니다.&lt;br /&gt;Characteristic : 데이터 정의(틀)입니다.&amp;nbsp;&lt;br /&gt;Properties : 값에 대해 가능한 동작입니다. (Read/Write/Notify/Indicate등)&lt;br /&gt;Value : 실제 데이터타 값입니다.&lt;br /&gt;Descriptor : 부가정보입니다. (설명, Notify설정, 포맷 등)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;0x1800은 Generic Access이고 BLE 장치의 기본 정보를 나타내는 서비스입니다.&lt;br /&gt;장치이름, apperance, 연결방식 등 광고.연결 단계에서 필요한 기본 데이터를 제공합니다.&lt;br /&gt;BLE기기라면 거의 무조건 포함됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;307&quot; data-origin-height=&quot;276&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C8gdR/dJMcacOYffy/sYnQvFEB1ZkVlHw0qmg50K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C8gdR/dJMcacOYffy/sYnQvFEB1ZkVlHw0qmg50K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C8gdR/dJMcacOYffy/sYnQvFEB1ZkVlHw0qmg50K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC8gdR%2FdJMcacOYffy%2FsYnQvFEB1ZkVlHw0qmg50K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;307&quot; height=&quot;276&quot; data-origin-width=&quot;307&quot; data-origin-height=&quot;276&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;0x2A00: 장치이름&lt;br /&gt;0x2A01 : 장치의 외형 타입입니다. 해당기기가 어떤 종류인지 나타내는 코드입니다.&lt;br /&gt;(ex : 0: unknow, 64: phone, 128: computer .....)&lt;br /&gt;0x2AA6 : BLE장치가 랜덤주소를 실주소로 변환(해석)할 수 있는지 여부를 나타냅니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;0x180D, 0x1815는 Heart Rate와 Automation IO를 나타냅니다.&lt;br /&gt;Heart Rate는 앱에서 심박수관련 정보를 Read할수있고, Automation IO는 앱에서 OFF/ON를 write 할 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;311&quot; data-origin-height=&quot;334&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bn1F3Y/dJMcajAyMzA/tEv4qrJnaXu47gBbcUk9z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bn1F3Y/dJMcajAyMzA/tEv4qrJnaXu47gBbcUk9z0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bn1F3Y/dJMcajAyMzA/tEv4qrJnaXu47gBbcUk9z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbn1F3Y%2FdJMcajAyMzA%2FtEv4qrJnaXu47gBbcUk9z0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;311&quot; height=&quot;334&quot; data-origin-width=&quot;311&quot; data-origin-height=&quot;334&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱에서&amp;nbsp;특정&amp;nbsp;동작이&amp;nbsp;수행될&amp;nbsp;경우,&amp;nbsp;BLE&amp;nbsp;장비&amp;nbsp;측에서&amp;nbsp;해당&amp;nbsp;이벤트&amp;nbsp;로그가&amp;nbsp;발생하도록&amp;nbsp;구성되어&amp;nbsp;있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;287&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Uam1U/dJMcaajjIGm/1kMCT2bKTsLOWKusViu8Ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Uam1U/dJMcaajjIGm/1kMCT2bKTsLOWKusViu8Ek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Uam1U/dJMcaajjIGm/1kMCT2bKTsLOWKusViu8Ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUam1U%2FdJMcaajjIGm%2F1kMCT2bKTsLOWKusViu8Ek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;633&quot; height=&quot;287&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;287&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>지식/BLE</category>
      <author>원원</author>
      <guid isPermaLink="true">https://wowon.tistory.com/375</guid>
      <comments>https://wowon.tistory.com/375#entry375comment</comments>
      <pubDate>Mon, 10 Nov 2025 00:30:58 +0900</pubDate>
    </item>
    <item>
      <title>BLE GAP을 BLE Sniffer로 측정하기</title>
      <link>https://wowon.tistory.com/374</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요. 오늘은 이전에 알아봤던 BLE GAP를 BLE&amp;nbsp; Sniffer로 측정해보겠습니다.&lt;br /&gt;측정 할&amp;nbsp; 장비는 이전글에서 사용했었던 ESP32 beacon 프로젝트입니다.&lt;br /&gt;(&lt;a href=&quot;https://wowon.tistory.com/373&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://wowon.tistory.com/373&lt;/a&gt;)&lt;br /&gt;측정장비는 NRF52832 USB이고 wireshark를 사용합니다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;(A) 스마트폰 nRF 앱으로 측정한 데이터입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caY6Ew/dJMcai9tYnK/rr5Tg7TRSdBLaAYfDQf3Xk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caY6Ew/dJMcai9tYnK/rr5Tg7TRSdBLaAYfDQf3Xk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caY6Ew/dJMcai9tYnK/rr5Tg7TRSdBLaAYfDQf3Xk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaY6Ew%2FdJMcai9tYnK%2Frr5Tg7TRSdBLaAYfDQf3Xk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;584&quot; height=&quot;376&quot; data-origin-width=&quot;584&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;(B) sniffer장비로 측정한 데이터입니다.&lt;/b&gt;&lt;br /&gt;로그에서 찍히는 데이터는 크게 두 부분으로 나뉩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;35&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TkaVp/dJMcafEU4GL/KSuyJktmmZQY6wwR0X37n1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TkaVp/dJMcafEU4GL/KSuyJktmmZQY6wwR0X37n1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TkaVp/dJMcafEU4GL/KSuyJktmmZQY6wwR0X37n1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTkaVp%2FdJMcafEU4GL%2FKSuyJktmmZQY6wwR0X37n1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;225&quot; height=&quot;35&quot; data-origin-width=&quot;225&quot; data-origin-height=&quot;35&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- nRF Sniffer for Bluetooth LE&lt;/b&gt;&lt;br /&gt;Sniffer 장비가 BLE 기기가 보낸 무선 신호(RF) 를 수신하고, 그 신호로부터 신호 세기(RSSI), 채널 번호, 타임스탬프 등의 물리 계층(PHY) 정보를 계산하여 Wireshark로&amp;nbsp;전달한&amp;nbsp;데이터 &lt;br /&gt;&lt;br /&gt;&lt;b&gt;- Bluetooth Low Energy Link Layer&lt;/b&gt;&lt;br /&gt;Sniffer 장비가 수신한 RF 신호를 Wireshark가 BLE 프로토콜 구조에 따라 해석한 데이터로, 패킷의 형식(ADV_IND, SCAN_REQ 등), 송신 주소(AdvA), UUID, 페이로드 내용 등 링크&amp;nbsp;계층(LL)의&amp;nbsp;논리적인&amp;nbsp;통신&amp;nbsp;정보를&amp;nbsp;나타냄&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;파랑색부분이 nRF Sniffer for Bluetooth LE이고 흰색부분이 Bluetooth Low Energy Link Layer입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;71&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKwkNG/dJMcaeF0NP1/fQk74t29V46BElK6kkgBg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKwkNG/dJMcaeF0NP1/fQk74t29V46BElK6kkgBg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKwkNG/dJMcaeF0NP1/fQk74t29V46BElK6kkgBg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKwkNG%2FdJMcaeF0NP1%2FfQk74t29V46BElK6kkgBg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;493&quot; height=&quot;71&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;71&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;nRF Sniffer for Bluetooth LE에서 RSSI와 채널이 있는것을 확인할수있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/87z1g/dJMcafSsjbv/0XiUzhMODrKlX05Y7xUar0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/87z1g/dJMcafSsjbv/0XiUzhMODrKlX05Y7xUar0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/87z1g/dJMcafSsjbv/0XiUzhMODrKlX05Y7xUar0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F87z1g%2FdJMcafSsjbv%2F0XiUzhMODrKlX05Y7xUar0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;233&quot; height=&quot;249&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;Bluetooth Low Energy Link Layer은 자세히 알아보겠습니다. (ADV_SCAN_IND)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;347&quot; data-origin-height=&quot;66&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zL3Y9/dJMcahCJIMh/s8OjwA7IxDFCGV5487a8zk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zL3Y9/dJMcahCJIMh/s8OjwA7IxDFCGV5487a8zk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zL3Y9/dJMcahCJIMh/s8OjwA7IxDFCGV5487a8zk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzL3Y9%2FdJMcahCJIMh%2Fs8OjwA7IxDFCGV5487a8zk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;347&quot; height=&quot;66&quot; data-origin-width=&quot;347&quot; data-origin-height=&quot;66&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;-Access Address(빨강네모)&lt;/b&gt;&lt;br /&gt;계층 : PHY(물리계층)&amp;nbsp;&lt;br /&gt;역할 : 패킷의 시작을 식별하기 위한 고유 32비트 패턴입니다. 광고 채널 (37,38,39)에서는 항상 고정값 0x8e89bed6을 사용합니다. sniffer는 이 패턴을 보고 BLE 패킷이 시작인것을 인지합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;193&quot; data-origin-height=&quot;19&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/I2PgF/dJMcacuE3p3/hkgX96ZmVwU820Jg3N3hq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/I2PgF/dJMcacuE3p3/hkgX96ZmVwU820Jg3N3hq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/I2PgF/dJMcacuE3p3/hkgX96ZmVwU820Jg3N3hq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FI2PgF%2FdJMcacuE3p3%2FhkgX96ZmVwU820Jg3N3hq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;193&quot; height=&quot;19&quot; data-origin-width=&quot;193&quot; data-origin-height=&quot;19&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Packey Header(주황네모)&lt;/b&gt;&lt;br /&gt;계층 : Link Layer(논리 계층)&lt;br /&gt;역할 : 패킷이 어떤 종류인지, 길이가 얼마나 되는지를 알려주는 메타데이터&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 69.0697%; height: 232px;&quot; border=&quot;1&quot; width=&quot;434&quot; data-end=&quot;1034&quot; data-start=&quot;780&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr data-end=&quot;798&quot; data-start=&quot;780&quot;&gt;
&lt;td style=&quot;width: 14.7955%;&quot; width=&quot;80&quot; height=&quot;22&quot;&gt;필드&lt;/td&gt;
&lt;td style=&quot;width: 15.6483%;&quot; width=&quot;64&quot;&gt;비트 수&lt;/td&gt;
&lt;td style=&quot;width: 69.4092%;&quot; width=&quot;290&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;892&quot; data-start=&quot;826&quot;&gt;
&lt;td style=&quot;width: 14.7955%;&quot; width=&quot;80&quot; height=&quot;44&quot; data-col-size=&quot;sm&quot; data-end=&quot;837&quot; data-start=&quot;826&quot;&gt;PDU Type&lt;/td&gt;
&lt;td style=&quot;width: 15.6483%;&quot; width=&quot;64&quot; data-end=&quot;844&quot; data-start=&quot;837&quot; data-col-size=&quot;sm&quot;&gt;4bit&lt;/td&gt;
&lt;td style=&quot;width: 69.4092%;&quot; width=&quot;290&quot; data-end=&quot;892&quot; data-start=&quot;844&quot; data-col-size=&quot;md&quot;&gt;패킷 종류 (ADV_IND, ADV_SCAN_IND, CONNECT_REQ 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;912&quot; data-start=&quot;893&quot;&gt;
&lt;td style=&quot;width: 14.7955%;&quot; width=&quot;80&quot; height=&quot;22&quot; data-col-size=&quot;sm&quot; data-end=&quot;899&quot; data-start=&quot;893&quot;&gt;RFU&lt;/td&gt;
&lt;td style=&quot;width: 15.6483%;&quot; width=&quot;64&quot; data-end=&quot;906&quot; data-start=&quot;899&quot; data-col-size=&quot;sm&quot;&gt;1bit&lt;/td&gt;
&lt;td style=&quot;width: 69.4092%;&quot; width=&quot;290&quot; data-end=&quot;912&quot; data-start=&quot;906&quot; data-col-size=&quot;md&quot;&gt;예약&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;963&quot; data-start=&quot;913&quot;&gt;
&lt;td style=&quot;width: 14.7955%;&quot; width=&quot;80&quot; height=&quot;22&quot; data-col-size=&quot;sm&quot; data-end=&quot;921&quot; data-start=&quot;913&quot;&gt;TxAdd&lt;/td&gt;
&lt;td style=&quot;width: 15.6483%;&quot; width=&quot;64&quot; data-end=&quot;928&quot; data-start=&quot;921&quot; data-col-size=&quot;sm&quot;&gt;1bit&lt;/td&gt;
&lt;td style=&quot;width: 69.4092%;&quot; width=&quot;290&quot; data-end=&quot;963&quot; data-start=&quot;928&quot; data-col-size=&quot;md&quot;&gt;송신 주소 형식 (0: Public, 1: Random)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;991&quot; data-start=&quot;964&quot;&gt;
&lt;td style=&quot;width: 14.7955%;&quot; width=&quot;80&quot; height=&quot;44&quot; data-col-size=&quot;sm&quot; data-end=&quot;972&quot; data-start=&quot;964&quot;&gt;RxAdd&lt;/td&gt;
&lt;td style=&quot;width: 15.6483%;&quot; width=&quot;64&quot; data-end=&quot;979&quot; data-start=&quot;972&quot; data-col-size=&quot;sm&quot;&gt;1bit&lt;/td&gt;
&lt;td style=&quot;width: 69.4092%;&quot; width=&quot;290&quot; data-end=&quot;991&quot; data-start=&quot;979&quot; data-col-size=&quot;md&quot;&gt;수신 주소 형식&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;1034&quot; data-start=&quot;992&quot;&gt;
&lt;td style=&quot;width: 14.7955%;&quot; width=&quot;80&quot; height=&quot;22&quot; data-col-size=&quot;sm&quot; data-end=&quot;1001&quot; data-start=&quot;992&quot;&gt;Length&lt;/td&gt;
&lt;td style=&quot;width: 15.6483%;&quot; width=&quot;64&quot; data-end=&quot;1008&quot; data-start=&quot;1001&quot; data-col-size=&quot;sm&quot;&gt;8bit&lt;/td&gt;
&lt;td style=&quot;width: 69.4092%;&quot; width=&quot;290&quot; data-end=&quot;1034&quot; data-start=&quot;1008&quot; data-col-size=&quot;md&quot;&gt;Payload 길이 (0~37 byte)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;img style=&quot;caret-color: transparent; letter-spacing: 0px;&quot; src=&quot;https://blog.kakaocdn.net/dna/brJIiA/dJMcajHjWK6/AAAAAAAAAAAAAAAAAAAAAIYEyTI_K8qFTJKNLqrdtzWdjPGyM6dgSuP9_R9Yy-ZE/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&amp;amp;expires=1764514799&amp;amp;allow_ip=&amp;amp;allow_referer=&amp;amp;signature=jZlWVhBAYeu4166tq1cJXogrmBg%3D&quot; data-origin-width=&quot;431&quot; data-origin-height=&quot;119&quot; data-is-animation=&quot;false&quot; /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Advertising Address(노랑네모)&lt;/b&gt;&lt;br /&gt;계층 : Link Layer&lt;br /&gt;역할 : BLE 기기의 송신자 주소(MAC Adress 또는 랜덤 주소)입니다. 실제로 패킷을 보낸 BLE장치의 주소입니다. 이 값을 보고 누가 광고 패킷을 보냈는지 식별합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;419&quot; data-origin-height=&quot;17&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S9tvP/dJMcabWO5lr/a9N7F2Lx3HpL03DglvXK0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S9tvP/dJMcabWO5lr/a9N7F2Lx3HpL03DglvXK0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S9tvP/dJMcabWO5lr/a9N7F2Lx3HpL03DglvXK0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS9tvP%2FdJMcabWO5lr%2Fa9N7F2Lx3HpL03DglvXK0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;419&quot; height=&quot;17&quot; data-origin-width=&quot;419&quot; data-origin-height=&quot;17&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;- Advertising Data (초록네모)&lt;br /&gt;&lt;/b&gt;계층 : GAP&lt;br /&gt;역할 : 실제로 전달하려는 정보가 들어있는 영역입니다.&lt;br /&gt;구조는 길이+타입+값 형태로 반복됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMomDg/dJMcafLGFmj/xZbcBemDRhlmypufd99S6k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMomDg/dJMcafLGFmj/xZbcBemDRhlmypufd99S6k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMomDg/dJMcafLGFmj/xZbcBemDRhlmypufd99S6k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMomDg%2FdJMcafLGFmj%2FxZbcBemDRhlmypufd99S6k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;659&quot; height=&quot;438&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;438&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;- CRC (파랑네모)&lt;/b&gt;&lt;br /&gt;계층 : PHY(물리 계층)&lt;br /&gt;역할 : 패킷에 오류가 생겼는지 확인하는 에러 검출 코드입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;101&quot; data-origin-height=&quot;21&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGRjIF/dJMcabidALr/3ivNDmxWkrBDrqJXt0klm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGRjIF/dJMcabidALr/3ivNDmxWkrBDrqJXt0klm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGRjIF/dJMcabidALr/3ivNDmxWkrBDrqJXt0klm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGRjIF%2FdJMcabidALr%2F3ivNDmxWkrBDrqJXt0klm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;101&quot; height=&quot;21&quot; data-origin-width=&quot;101&quot; data-origin-height=&quot;21&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;* 앱 vs sniffer 데이터 비교&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앱에서 봤던 데이터랑 sniffer의 Advertising Data를 보면 같고 코드에 적혀있는 데이터랑 매칭이 됩니다.(주황)&lt;br /&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;&lt;span style=&quot;background-color: #f89009;&quot;&gt;0x0201061109426C756564726F69645F426561636F6E020A0903190002021C00&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;static&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;uint8_t&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; adv_raw_data&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;[]&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x02&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x01&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x06&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Flags&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x11&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x09&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'B'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'l'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'u'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'e'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'d'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'r'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'o'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'i'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'d'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'_'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'B'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'e'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'a'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'c'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'o'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'n'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; // Complete Local Name&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x02&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x0A&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x09&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // TX Power Level = +9 dBm&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x03&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x19&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x02&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Appearance = 0x0200&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x02&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x1C&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // LE Role = Only Peripheral role supported&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;};&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;&lt;br /&gt;앱에서는 이 데이터가 있는데 sniffer에서는 이 데이터가 없습니다. (초록)&lt;br /&gt;&lt;span style=&quot;background-color: #409d00;&quot;&gt;081BD2A4220CDADC001124172F2F6573707265737369662E636F6E&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;static&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;uint8_t&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; scan_rsp_raw_data&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;[]&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x08&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x1B&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x11&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x24&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x17&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'/'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'/'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'e'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'s'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'p'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'r'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'e'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'s'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'s'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'i'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'f'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'.'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'c'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'o'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'n'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;};&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #ffffff;&quot;&gt;&lt;i&gt;※ 코드는 081B0000..인데 실제 데이터는 081BDA4..인 이유는 ESP32 FW에서&amp;nbsp; local_addr을 읽어서 넣기때문입니다.&lt;/i&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; ret&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;esp_ble_gap_get_local_used_addr&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(local_addr,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;local_addr_type);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(ret) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;ESP_LOGE&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(DEMO_TAG,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;get local used address failed, error code =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;%x&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, ret);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;scan_rsp_raw_data&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;local_addr&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;];&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;scan_rsp_raw_data&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;local_addr&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;];&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;scan_rsp_raw_data&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;local_addr&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;3&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;];&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;scan_rsp_raw_data&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;local_addr&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;];&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;scan_rsp_raw_data&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;6&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;local_addr&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;];&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;scan_rsp_raw_data&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;7&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;local_addr&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;];&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;제가 봤던 sniffer 데이터는 ESP가 주기적으로 광고하는 ADV_SCAN_IND타입이기때문입니다.&lt;br /&gt;scan_rsp데이터는 SCAN_RSP타입의 데이터를 봐야합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;153&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cveOiX/dJMcaiIpDBT/v4SiaGwRawoNfjszE2Vkwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cveOiX/dJMcaiIpDBT/v4SiaGwRawoNfjszE2Vkwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cveOiX/dJMcaiIpDBT/v4SiaGwRawoNfjszE2Vkwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcveOiX%2FdJMcaiIpDBT%2Fv4SiaGwRawoNfjszE2Vkwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;694&quot; height=&quot;153&quot; data-origin-width=&quot;694&quot; data-origin-height=&quot;153&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타입은 Packet Header에 나와있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;52&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnwC9d/dJMcaa4Gnf4/XF0Ih4Gv0qRp9k5BDSlPV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnwC9d/dJMcaa4Gnf4/XF0Ih4Gv0qRp9k5BDSlPV1/img.png&quot; data-alt=&quot;ADV_SCAN_IND&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnwC9d/dJMcaa4Gnf4/XF0Ih4Gv0qRp9k5BDSlPV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnwC9d%2FdJMcaa4Gnf4%2FXF0Ih4Gv0qRp9k5BDSlPV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;460&quot; height=&quot;52&quot; data-origin-width=&quot;460&quot; data-origin-height=&quot;52&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ADV_SCAN_IND&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;53&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAyHyk/dJMcabCwgGM/QEt2YIdchrdtUkZeIj1LN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAyHyk/dJMcabCwgGM/QEt2YIdchrdtUkZeIj1LN0/img.png&quot; data-alt=&quot;SCAN_REQ&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAyHyk/dJMcabCwgGM/QEt2YIdchrdtUkZeIj1LN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAyHyk%2FdJMcabCwgGM%2FQEt2YIdchrdtUkZeIj1LN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;462&quot; height=&quot;46&quot; data-origin-width=&quot;532&quot; data-origin-height=&quot;53&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SCAN_REQ&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;429&quot; data-origin-height=&quot;55&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FQdRp/dJMcaf5ZuMM/MhGL1gOosb2IcwnEypKOq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FQdRp/dJMcaf5ZuMM/MhGL1gOosb2IcwnEypKOq0/img.png&quot; data-alt=&quot;SCAN_RSP&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FQdRp/dJMcaf5ZuMM/MhGL1gOosb2IcwnEypKOq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFQdRp%2FdJMcaf5ZuMM%2FMhGL1gOosb2IcwnEypKOq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;429&quot; height=&quot;55&quot; data-origin-width=&quot;429&quot; data-origin-height=&quot;55&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SCAN_RSP&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ADV_SCAN_IND는 ESP가 광고하는데이터이고, SCAN_REQ는 스캐너가 SCAN을 요청하는 데이터입니다. SCAN_RSP는 ESP가 SCAN에 응답하는 데이터입니다.&lt;br /&gt;&lt;br /&gt;SCAN_RSQ 데이터입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C4kGP/dJMcaestETI/LbLI9BaEsao1L1kWpOc0N0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C4kGP/dJMcaestETI/LbLI9BaEsao1L1kWpOc0N0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C4kGP/dJMcaestETI/LbLI9BaEsao1L1kWpOc0N0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC4kGP%2FdJMcaestETI%2FLbLI9BaEsao1L1kWpOc0N0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;556&quot; height=&quot;554&quot; data-origin-width=&quot;556&quot; data-origin-height=&quot;554&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;SCAN_RSP 데이터입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;567&quot; data-origin-height=&quot;736&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzQN1n/dJMcaiuSuHN/gIDaBWFwFLKErldXZMEdkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzQN1n/dJMcaiuSuHN/gIDaBWFwFLKErldXZMEdkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzQN1n/dJMcaiuSuHN/gIDaBWFwFLKErldXZMEdkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzQN1n%2FdJMcaiuSuHN%2FgIDaBWFwFLKErldXZMEdkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;567&quot; height=&quot;736&quot; data-origin-width=&quot;567&quot; data-origin-height=&quot;736&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uTr1P/dJMcafx9yyB/hDIFAGAX4Owxp0zsVkfHH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uTr1P/dJMcafx9yyB/hDIFAGAX4Owxp0zsVkfHH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uTr1P/dJMcafx9yyB/hDIFAGAX4Owxp0zsVkfHH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuTr1P%2FdJMcafx9yyB%2FhDIFAGAX4Owxp0zsVkfHH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;389&quot; height=&quot;82&quot; data-origin-width=&quot;389&quot; data-origin-height=&quot;82&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빨강색부분이 Advertising Data이고 앱에있는 데이터랑 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 글에서는 GAPP에 대해 알아보겠습니다.&lt;/p&gt;</description>
      <category>지식/BLE</category>
      <author>원원</author>
      <guid isPermaLink="true">https://wowon.tistory.com/374</guid>
      <comments>https://wowon.tistory.com/374#entry374comment</comments>
      <pubDate>Sat, 8 Nov 2025 14:17:00 +0900</pubDate>
    </item>
    <item>
      <title>BLE GAP 예시를 통해서 알아보기</title>
      <link>https://wowon.tistory.com/373</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요. 오늘은 BLE GAP에 대해 알아보겠습니다.&lt;br /&gt;&lt;br /&gt;GAP(Generic Access Profile)은 기기가 서로 어떻게 찾고 연결하는지 관리를 합니다.&lt;br /&gt;GAP는 프로파일 계층에서 최상위에 존재합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byAisX/dJMcae63yht/pNp8WZB13yUlOmiw5OTDD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byAisX/dJMcae63yht/pNp8WZB13yUlOmiw5OTDD0/img.png&quot; data-alt=&quot;Core_v5.0.pdf / 1981page&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byAisX/dJMcae63yht/pNp8WZB13yUlOmiw5OTDD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyAisX%2FdJMcae63yht%2FpNp8WZB13yUlOmiw5OTDD0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;436&quot; height=&quot;220&quot; data-origin-width=&quot;436&quot; data-origin-height=&quot;220&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Core_v5.0.pdf / 1981page&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GAP가 실제로 어떻게 사용하는지 ESP32와 스마트폰앱(nRF Connect)를 이용해서 알아보겠습니다.&lt;br /&gt;ESP32에 넣은 예제는 &quot;Bluedroid_Beacon&quot; 입니다. 비콘으로 동작하는 펌웨어입니다.&lt;br /&gt;FW : &lt;a href=&quot;https://github.com/espressif/esp-idf/tree/master/examples/bluetooth/ble_get_started/bluedroid/Bluedroid_Beacon&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://github.com/espressif/esp-idf/tree/master/examples/bluetooth/ble_get_started/bluedroid/Bluedroid_Beacon&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;292&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DAv7a/dJMcah3MshS/qNHM09x06AkP0wWVVO4snk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DAv7a/dJMcah3MshS/qNHM09x06AkP0wWVVO4snk/img.png&quot; data-alt=&quot;OPEN 버튼을 클릭하면 해당사이트로 가집니다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DAv7a/dJMcah3MshS/qNHM09x06AkP0wWVVO4snk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDAv7a%2FdJMcah3MshS%2FqNHM09x06AkP0wWVVO4snk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;292&quot; height=&quot;254&quot; data-origin-width=&quot;292&quot; data-origin-height=&quot;254&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;OPEN 버튼을 클릭하면 해당사이트로 가집니다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;스마트폰앱으로 보면 위의 그림처럼 나와있습니다.&lt;br /&gt;- Device type : esp_bt_controller_mem_release결과와 Flags비트를 조합해서 표시&lt;br /&gt;- Advertising type : 광고 PDU형식과 Controller PHY 설정으로 판단됨&lt;br /&gt;&lt;br /&gt;앱에서 표시된 데이터들이 코드에서 어느부분이 매칭되는지 확인해보겠습니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; width=&quot;993&quot; data-end=&quot;944&quot; data-start=&quot;187&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr data-end=&quot;205&quot; data-start=&quot;187&quot;&gt;
&lt;td style=&quot;width: 18.3721%;&quot; width=&quot;172&quot; height=&quot;22&quot;&gt;표시 항목&lt;/td&gt;
&lt;td style=&quot;width: 40.5814%;&quot; width=&quot;371&quot;&gt;값&lt;/td&gt;
&lt;td style=&quot;width: 40.9302%;&quot; width=&quot;450&quot;&gt;설명&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;279&quot; data-start=&quot;233&quot;&gt;
&lt;td style=&quot;width: 18.3721%;&quot; width=&quot;172&quot; height=&quot;22&quot; data-col-size=&quot;sm&quot; data-end=&quot;247&quot; data-start=&quot;233&quot;&gt;Device type&lt;/td&gt;
&lt;td style=&quot;width: 40.5814%;&quot; width=&quot;371&quot; data-end=&quot;257&quot; data-start=&quot;247&quot; data-col-size=&quot;md&quot;&gt;LE only&lt;/td&gt;
&lt;td style=&quot;width: 40.9302%;&quot; width=&quot;450&quot; data-end=&quot;279&quot; data-start=&quot;257&quot; data-col-size=&quot;md&quot;&gt;esp_bt_controller_mem_release(ESP_BT_MODE_CLASSIC_BT)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;328&quot; data-start=&quot;280&quot;&gt;
&lt;td style=&quot;width: 18.3721%;&quot; width=&quot;172&quot; height=&quot;22&quot; data-col-size=&quot;sm&quot; data-end=&quot;299&quot; data-start=&quot;280&quot;&gt;Advertising type&lt;/td&gt;
&lt;td style=&quot;width: 40.5814%;&quot; width=&quot;371&quot; data-end=&quot;308&quot; data-start=&quot;299&quot; data-col-size=&quot;md&quot;&gt;Legacy&lt;/td&gt;
&lt;td style=&quot;width: 40.9302%;&quot; width=&quot;450&quot; data-end=&quot;328&quot; data-start=&quot;308&quot; data-col-size=&quot;md&quot;&gt;esp_ble_gap_start_advertising(&amp;amp;adv_params);&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;427&quot; data-start=&quot;329&quot;&gt;
&lt;td style=&quot;width: 18.3721%;&quot; width=&quot;172&quot; height=&quot;22&quot; data-col-size=&quot;sm&quot; data-end=&quot;337&quot; data-start=&quot;329&quot;&gt;Flags&lt;/td&gt;
&lt;td style=&quot;width: 40.5814%;&quot; width=&quot;371&quot; data-end=&quot;385&quot; data-start=&quot;337&quot; data-col-size=&quot;md&quot;&gt;LE General Discoverable, BR/EDR Not Supported&lt;/td&gt;
&lt;td style=&quot;width: 40.9302%;&quot; width=&quot;450&quot; data-end=&quot;427&quot; data-start=&quot;385&quot; data-col-size=&quot;md&quot;&gt;ESP_BLE_AD_TYPE_FLAG (0x01) = 0x06&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;507&quot; data-start=&quot;428&quot;&gt;
&lt;td style=&quot;width: 18.3721%;&quot; width=&quot;172&quot; height=&quot;22&quot; data-col-size=&quot;sm&quot; data-end=&quot;450&quot; data-start=&quot;428&quot;&gt;Complete Local Name&lt;/td&gt;
&lt;td style=&quot;width: 40.5814%;&quot; width=&quot;371&quot; data-end=&quot;469&quot; data-start=&quot;450&quot; data-col-size=&quot;md&quot;&gt;Bluedroid_Beacon&lt;/td&gt;
&lt;td style=&quot;width: 40.9302%;&quot; width=&quot;450&quot; data-end=&quot;507&quot; data-start=&quot;469&quot; data-col-size=&quot;md&quot;&gt;ESP_BLE_AD_TYPE_NAME_CMPL (0x09)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;577&quot; data-start=&quot;508&quot;&gt;
&lt;td style=&quot;width: 18.3721%;&quot; width=&quot;172&quot; height=&quot;22&quot; data-col-size=&quot;sm&quot; data-end=&quot;525&quot; data-start=&quot;508&quot;&gt;Tx Power Level&lt;/td&gt;
&lt;td style=&quot;width: 40.5814%;&quot; width=&quot;371&quot; data-end=&quot;533&quot; data-start=&quot;525&quot; data-col-size=&quot;md&quot;&gt;9 dBm&lt;/td&gt;
&lt;td style=&quot;width: 40.9302%;&quot; width=&quot;450&quot; data-end=&quot;577&quot; data-start=&quot;533&quot; data-col-size=&quot;md&quot;&gt;ESP_BLE_AD_TYPE_TX_PWR (0x0A) = 0x09&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;661&quot; data-start=&quot;578&quot;&gt;
&lt;td style=&quot;width: 18.3721%;&quot; width=&quot;172&quot; height=&quot;22&quot; data-col-size=&quot;sm&quot; data-end=&quot;591&quot; data-start=&quot;578&quot;&gt;Appearance&lt;/td&gt;
&lt;td style=&quot;width: 40.5814%;&quot; width=&quot;371&quot; data-end=&quot;611&quot; data-start=&quot;591&quot; data-col-size=&quot;md&quot;&gt;[512] Generic Tag&lt;/td&gt;
&lt;td style=&quot;width: 40.9302%;&quot; width=&quot;450&quot; data-end=&quot;661&quot; data-start=&quot;611&quot; data-col-size=&quot;md&quot;&gt;ESP_BLE_AD_TYPE_APPEARANCE (0x19) = 0x0200&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;750&quot; data-start=&quot;662&quot;&gt;
&lt;td style=&quot;width: 18.3721%;&quot; width=&quot;172&quot; height=&quot;22&quot; data-col-size=&quot;sm&quot; data-end=&quot;672&quot; data-start=&quot;662&quot;&gt;LE Role&lt;/td&gt;
&lt;td style=&quot;width: 40.5814%;&quot; width=&quot;371&quot; data-end=&quot;705&quot; data-start=&quot;672&quot; data-col-size=&quot;md&quot;&gt;Only Peripheral Role supported&lt;/td&gt;
&lt;td style=&quot;width: 40.9302%;&quot; width=&quot;450&quot; data-end=&quot;750&quot; data-start=&quot;705&quot; data-col-size=&quot;md&quot;&gt;ESP_BLE_AD_TYPE_LE_ROLE (0x1C) = 0x00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;831&quot; data-start=&quot;751&quot;&gt;
&lt;td style=&quot;width: 18.3721%;&quot; width=&quot;172&quot; height=&quot;22&quot; data-col-size=&quot;sm&quot; data-end=&quot;765&quot; data-start=&quot;751&quot;&gt;BLE Address&lt;/td&gt;
&lt;td style=&quot;width: 40.5814%;&quot; width=&quot;371&quot; data-end=&quot;785&quot; data-start=&quot;765&quot; data-col-size=&quot;md&quot;&gt;DC:DA:0C:22:A4:D2&lt;/td&gt;
&lt;td style=&quot;width: 40.9302%;&quot; width=&quot;450&quot; data-end=&quot;831&quot; data-start=&quot;785&quot; data-col-size=&quot;md&quot;&gt;esp_ble_gap_get_local_used_addr() 에서 가져옴&lt;/td&gt;
&lt;/tr&gt;
&lt;tr data-end=&quot;944&quot; data-start=&quot;832&quot;&gt;
&lt;td style=&quot;width: 18.3721%;&quot; width=&quot;172&quot; height=&quot;39&quot; data-col-size=&quot;sm&quot; data-end=&quot;838&quot; data-start=&quot;832&quot;&gt;URI&lt;/td&gt;
&lt;td style=&quot;width: 40.5814%;&quot; width=&quot;371&quot; data-end=&quot;862&quot; data-start=&quot;838&quot; data-col-size=&quot;md&quot;&gt;&lt;a href=&quot;https://espressif.com&quot;&gt;https://espressif.com&lt;/a&gt;&lt;/td&gt;
&lt;td style=&quot;width: 40.9302%;&quot; width=&quot;450&quot; data-end=&quot;944&quot; data-start=&quot;862&quot; data-col-size=&quot;md&quot;&gt;ESP_BLE_AD_TYPE_URI (0x24) = URI_PREFIX_HTTPS (0x17) + &quot;//espressif.com&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;가장 직관적인&amp;nbsp; Tx Power Level을 보겠습니다. 값은 9입니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt;//configure raw data for advertising packet&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;static&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;uint8_t&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; adv_raw_data&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;[]&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x02&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, ESP_BLE_AD_TYPE_FLAG, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x06&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x11&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, ESP_BLE_AD_TYPE_NAME_CMPL, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'B'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'l'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'u'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'e'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'d'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'r'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'o'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'i'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'d'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'_'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'B'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'e'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'a'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'c'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'o'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'n'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x02&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, ESP_BLE_AD_TYPE_TX_PWR, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x09&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x03&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, ESP_BLE_AD_TYPE_APPEARANCE, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x02&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x02&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, ESP_BLE_AD_TYPE_LE_ROLE, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;};&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;static&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;uint8_t&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; scan_rsp_raw_data&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;[]&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x08&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, ESP_BLE_AD_TYPE_LE_DEV_ADDR, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x00&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x11&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, ESP_BLE_AD_TYPE_URI, URI_PREFIX_HTTPS, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'/'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'/'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'e'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'s'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'p'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'r'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'e'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'s'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'s'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'i'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'f'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'.'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'c'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'o'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;'m'&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;};&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;AD types의 기본 포맷은 아래의 그림과 같습니다.&lt;br /&gt;length, AD Type, AD Data입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKGR8Q/dJMcacuDpdA/9cfguIbEWM9H8jUc6CgvYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKGR8Q/dJMcacuDpdA/9cfguIbEWM9H8jUc6CgvYk/img.png&quot; data-alt=&quot;Core_v5.0.pdf / 2086page&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKGR8Q/dJMcacuDpdA/9cfguIbEWM9H8jUc6CgvYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKGR8Q%2FdJMcacuDpdA%2F9cfguIbEWM9H8jUc6CgvYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;659&quot; height=&quot;336&quot; data-origin-width=&quot;659&quot; data-origin-height=&quot;336&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Core_v5.0.pdf / 2086page&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TX Power Level을 보면 아래와 같고 길이가 0x02이고 AD Type은 ESP_BLE_AD_TYPE_TX_PWR이고 데이터는 0x09입니다.&lt;br /&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x02&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, ESP_BLE_AD_TYPE_TX_PWR,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x09&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt; &lt;br /&gt;ESP_BLE_AD_TYPE_TX_PWR은 0x0A입니다.&lt;br /&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;ESP_BLE_AD_TYPE_TX_PWR&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x0A&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; &lt;br /&gt;&lt;/span&gt;AD Type은 아래의 문서에 정의되어있습니다.&lt;br /&gt;&lt;a href=&quot;https://www.bluetooth.com/wp-content/uploads/Files/Specification/HTML/Assigned_Numbers/out/en/Assigned_Numbers.pdf&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.bluetooth.com/wp-content/uploads/Files/Specification/HTML/Assigned_Numbers/out/en/Assigned_Numbers.pdf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;691&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xJOrx/dJMcai2GKBB/sVF283nHT5B1xRf0SYQwhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xJOrx/dJMcai2GKBB/sVF283nHT5B1xRf0SYQwhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xJOrx/dJMcai2GKBB/sVF283nHT5B1xRf0SYQwhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxJOrx%2FdJMcai2GKBB%2FsVF283nHT5B1xRf0SYQwhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;610&quot; height=&quot;691&quot; data-origin-width=&quot;610&quot; data-origin-height=&quot;691&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 GAP 데이터들도 찾아보면 해당문서에 나와있것과 일치합니다.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;////&lt;br /&gt;&lt;br /&gt;BLE 이므로 광고를 계속하는데 아래의 데이터로 설정합니다.&lt;br /&gt;20ms 주기로 광고를 합니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;static&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;esp_ble_adv_params_t&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; adv_params &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; .adv_int_min &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x20&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; &amp;nbsp;// 20ms&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; .adv_int_max &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0x20&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; &amp;nbsp;// 20ms&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; .adv_type &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; ADV_TYPE_SCAN_IND,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; .own_addr_type &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; BLE_ADDR_TYPE_PUBLIC,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; .channel_map &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; ADV_CHNL_ALL,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; .adv_filter_policy &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; ADV_FILTER_ALLOW_SCAN_ANY_CON_ANY,&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;};&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당데이터도 문서에 정의되어있습니다. 해당 adv type 설명은 아래의 링크에 나와있습니다.&lt;br /&gt;&lt;a href=&quot;https://wowon.tistory.com/377&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://wowon.tistory.com/377&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oUJF1/dJMcain5eVt/O2uswVmUGCOL8a0AdKhSyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oUJF1/dJMcain5eVt/O2uswVmUGCOL8a0AdKhSyk/img.png&quot; data-alt=&quot;Core_v5.0.pdf 1251 page&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oUJF1/dJMcain5eVt/O2uswVmUGCOL8a0AdKhSyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoUJF1%2FdJMcain5eVt%2FO2uswVmUGCOL8a0AdKhSyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;650&quot; height=&quot;272&quot; data-origin-width=&quot;650&quot; data-origin-height=&quot;272&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Core_v5.0.pdf 1251 page&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;다음글에서는 GAP를 Sniffer로 측정해보겠습니다.&lt;/p&gt;</description>
      <category>지식/BLE</category>
      <author>원원</author>
      <guid isPermaLink="true">https://wowon.tistory.com/373</guid>
      <comments>https://wowon.tistory.com/373#entry373comment</comments>
      <pubDate>Sun, 2 Nov 2025 23:05:43 +0900</pubDate>
    </item>
    <item>
      <title>ESP32 Command Line 개발환경</title>
      <link>https://wowon.tistory.com/372</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요. ESP32 커맨드라인 컴파일을 해보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 아래의 사이트에 들어가서 컴파일에 필요한 파일을 다운로드받습니다.&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://dl.espressif.com/dl/esp-idf/?idf=4.4&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://dl.espressif.com/dl/esp-idf/?idf=4.4&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;307&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S1Vus/dJMb9dArrnG/zBNsgHqRpWlpLm7UTKI1n0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S1Vus/dJMb9dArrnG/zBNsgHqRpWlpLm7UTKI1n0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S1Vus/dJMb9dArrnG/zBNsgHqRpWlpLm7UTKI1n0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS1Vus%2FdJMb9dArrnG%2FzBNsgHqRpWlpLm7UTKI1n0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;548&quot; height=&quot;241&quot; data-origin-width=&quot;698&quot; data-origin-height=&quot;307&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;119&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sc8jU/dJMcahCMXJ8/2hpxnEKOl1qzpUGO2HDiC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sc8jU/dJMcahCMXJ8/2hpxnEKOl1qzpUGO2HDiC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sc8jU/dJMcahCMXJ8/2hpxnEKOl1qzpUGO2HDiC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fsc8jU%2FdJMcahCMXJ8%2F2hpxnEKOl1qzpUGO2HDiC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;407&quot; height=&quot;119&quot; data-origin-width=&quot;407&quot; data-origin-height=&quot;119&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;br /&gt;2. 설치된 커맨드 프로그램을 킵니다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;114&quot; data-origin-height=&quot;117&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBHFAR/dJMb9MbQnnx/dVKkErLJ03h4K7xNjlkiqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBHFAR/dJMb9MbQnnx/dVKkErLJ03h4K7xNjlkiqK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBHFAR/dJMb9MbQnnx/dVKkErLJ03h4K7xNjlkiqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBHFAR%2FdJMb9MbQnnx%2FdVKkErLJ03h4K7xNjlkiqK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;114&quot; height=&quot;117&quot; data-origin-width=&quot;114&quot; data-origin-height=&quot;117&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;br /&gt;3. SDK에 들어가서 example을 다른곳으로 옮깁니다. (다운받은경로\frameworks\esp-idf-v5.2.6\examples\get-started\hello_world)&lt;br /&gt;&lt;/b&gt;&lt;span style=&quot;color: #000000; letter-spacing: 0px;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4. 프로젝트의 경로에가서 아래의 커맨드를 하나씩 입력합니다.&lt;/b&gt;&lt;br /&gt;&lt;u&gt;1. 타겟보드 설정 : idf.py set-target &quot;target&quot;&lt;/u&gt;&lt;br /&gt;&quot;target&quot;에 자신의 ESP32정보를 넣습니다.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;esp32, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;esp32s2, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;esp32c3, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;esp32s3, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;esp32c2, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;esp32c6, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;esp32h2, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;linux, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;esp32p4&lt;br /&gt;&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;u&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 옵션설정 : idf.py &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;menuconfig&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. 빌드 : idf.py build&lt;br /&gt;&lt;/span&gt;&lt;/u&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;u&gt;4. 플래시: idf.py &amp;ndash;p &quot;COM PORT&quot; flash&amp;nbsp;&lt;/u&gt;&lt;br /&gt;&quot;COM PORT&quot;에 연결된 comport 정보를 넣습니다. (예시 : COM12 =&amp;gt; idf.py -p com12 flash)&lt;br /&gt;idf.py flash를 하면 자동으로 comport를 찾아서 fw를 넣어줍니다.&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;u&gt;5. 모니터 : Idf.py &amp;ndash;p &quot;COM PORT&quot; monitor&lt;/u&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&quot;COM PORT&quot;에 연결된 comport 정보를 넣습니다. (예시 : COM12 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;=&amp;gt; idf.py -p com12 flash)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;u&gt;6. 플래시 + 빌드 동시에하기 : idf.py build flash&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;5. monitor를하면 커맨드프로그램에서 로그를 볼 수 있습니다.&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czc8ay/dJMb9VzLZ86/pGwM2z0aKRcWjWRp7XVzMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czc8ay/dJMb9VzLZ86/pGwM2z0aKRcWjWRp7XVzMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czc8ay/dJMb9VzLZ86/pGwM2z0aKRcWjWRp7XVzMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fczc8ay%2FdJMb9VzLZ86%2FpGwM2z0aKRcWjWRp7XVzMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;745&quot; height=&quot;150&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;</description>
      <category>ESP32/ESP32_RTOS</category>
      <author>원원</author>
      <guid isPermaLink="true">https://wowon.tistory.com/372</guid>
      <comments>https://wowon.tistory.com/372#entry372comment</comments>
      <pubDate>Sun, 26 Oct 2025 20:08:31 +0900</pubDate>
    </item>
    <item>
      <title>ESP32 vscode개발환경 만들기(ESP-IDF)</title>
      <link>https://wowon.tistory.com/371</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요. 오늘은 ESP32 vscode로 개발환경을 만들어보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;1. vscode를 설치합니다.&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://code.visualstudio.com/download&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://code.visualstudio.com/download&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. EXTENSIONS에서 ESP-IDF를 설치합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7zFFt/dJMb9Xj3i3D/M6lrFPWTSn3WmsyvUagey1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7zFFt/dJMb9Xj3i3D/M6lrFPWTSn3WmsyvUagey1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7zFFt/dJMb9Xj3i3D/M6lrFPWTSn3WmsyvUagey1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7zFFt%2FdJMb9Xj3i3D%2FM6lrFPWTSn3WmsyvUagey1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;620&quot; height=&quot;118&quot; data-origin-width=&quot;620&quot; data-origin-height=&quot;118&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3.좌측에 ESP-IDF 아이콘을 클릭 후 Configure ESP-IDF Extension을 클릭하고 ADVANCE를 클릭합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1521&quot; data-origin-height=&quot;361&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X0WO9/dJMb9QFjFCB/YnT2A4V7YuGnX3fk9dyPG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X0WO9/dJMb9QFjFCB/YnT2A4V7YuGnX3fk9dyPG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X0WO9/dJMb9QFjFCB/YnT2A4V7YuGnX3fk9dyPG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX0WO9%2FdJMb9QFjFCB%2FYnT2A4V7YuGnX3fk9dyPG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1521&quot; height=&quot;361&quot; data-origin-width=&quot;1521&quot; data-origin-height=&quot;361&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. ESP-IDF container directory는 SDK이고 ESP-IDF Tools directory는 개발도구입니다. 경로를 정하고 Configure Tools를 클릭합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;959&quot; data-origin-height=&quot;451&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9HTkk/dJMb9OtX3da/gP40K8B8zVbPc5P5xQxRDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9HTkk/dJMb9OtX3da/gP40K8B8zVbPc5P5xQxRDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9HTkk/dJMb9OtX3da/gP40K8B8zVbPc5P5xQxRDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9HTkk%2FdJMb9OtX3da%2FgP40K8B8zVbPc5P5xQxRDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;959&quot; height=&quot;451&quot; data-origin-width=&quot;959&quot; data-origin-height=&quot;451&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. 그 다음 또 툴을 설치하는게 나오는데 Donwload Tools를 클릭합니다.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;158&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHt8Or/dJMb9Lxe90E/T0OEMvnmk1pe0djO55QFUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHt8Or/dJMb9Lxe90E/T0OEMvnmk1pe0djO55QFUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHt8Or/dJMb9Lxe90E/T0OEMvnmk1pe0djO55QFUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHt8Or%2FdJMb9Lxe90E%2FT0OEMvnmk1pe0djO55QFUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;901&quot; height=&quot;158&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;158&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6.설치가 완료되면 이제 예제를 불러와봅니다. ESP-IDF:Show Example Projects를 클릭합니다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;52&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/R6fh1/dJMb9j1I4c3/j8VVbKvJHY0NGjiuoacuc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/R6fh1/dJMb9j1I4c3/j8VVbKvJHY0NGjiuoacuc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/R6fh1/dJMb9j1I4c3/j8VVbKvJHY0NGjiuoacuc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FR6fh1%2FdJMb9j1I4c3%2Fj8VVbKvJHY0NGjiuoacuc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;579&quot; height=&quot;52&quot; data-origin-width=&quot;579&quot; data-origin-height=&quot;52&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;7.hello_world를 클릭하고 Select location for creating hellow_world project를 클릭합니다.&lt;/b&gt;&lt;br /&gt;사실 이 예제는 아까 설치했던 SDK에서 불러오는것입니다.&lt;br /&gt;(v5.5\esp-idf\examples\get-started\hello_world\main)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;214&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dL4vQB/dJMb9QrMCf5/ekNhloOVsgW9J5QM86rfS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dL4vQB/dJMb9QrMCf5/ekNhloOVsgW9J5QM86rfS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dL4vQB/dJMb9QrMCf5/ekNhloOVsgW9J5QM86rfS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdL4vQB%2FdJMb9QrMCf5%2FekNhloOVsgW9J5QM86rfS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;941&quot; height=&quot;214&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;214&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;8. 아래의 아이콘에서 COM포트와 사용중인 MCU를 클릭합니다.&lt;/b&gt;&lt;br /&gt;스패너 버튼은 build버튼이고, 번개 버튼은 flash 버튼입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;557&quot; data-origin-height=&quot;38&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WESNL/dJMb9VNi07F/HnFF2CvDukRBlhzSqDgyEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WESNL/dJMb9VNi07F/HnFF2CvDukRBlhzSqDgyEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WESNL/dJMb9VNi07F/HnFF2CvDukRBlhzSqDgyEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWESNL%2FdJMb9VNi07F%2FHnFF2CvDukRBlhzSqDgyEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;557&quot; height=&quot;38&quot; data-origin-width=&quot;557&quot; data-origin-height=&quot;38&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;9. UART를 연결해서 보면 Hello world! 로그가 찍힙니다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;344&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/stiqQ/dJMb9PTWCaC/Vw1rCbXQTxa3X7fYQyM0Y1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/stiqQ/dJMb9PTWCaC/Vw1rCbXQTxa3X7fYQyM0Y1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/stiqQ/dJMb9PTWCaC/Vw1rCbXQTxa3X7fYQyM0Y1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FstiqQ%2FdJMb9PTWCaC%2FVw1rCbXQTxa3X7fYQyM0Y1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;936&quot; height=&quot;344&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;344&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>ESP32/ESP32_RTOS</category>
      <author>원원</author>
      <guid isPermaLink="true">https://wowon.tistory.com/371</guid>
      <comments>https://wowon.tistory.com/371#entry371comment</comments>
      <pubDate>Sun, 26 Oct 2025 15:34:07 +0900</pubDate>
    </item>
  </channel>
</rss>