Appendix A — Deployment Details

This appendix documents the two sensing deployments used throughout this toolkit: a university campus and a commercial district. Both were conducted in Ulsan, South Korea.

A.1 UNIST Campus

Site

The Ulsan National Institute of Science and Technology (UNIST) campus occupies approximately 238,000 m² in a suburban area of Ulsan. The campus has a compact layout with dormitories, academic buildings, a library, a cafeteria, a gym, and a bus station connected by pedestrian paths. Most students live on campus, creating predictable daily circulation patterns between residential and academic areas.

Sensor Network

Forty-one sensors were initially built (25 outdoors, 16 indoors). Of the 25 outdoor sensors, 24 positions enter the toolkit’s main analyses. Sensors were placed at major intersections, building entrances, and along primary pedestrian routes, a median of ~85 meters apart (nearest-neighbor distances of 63–147 m), covering the main circulation areas of the campus. The validation analysis in Chapter 7 shows that detection holds near this density (~96% detection with ~25 m median error in the ~100 m spacing scenario) and degrades sharply beyond ~150 m.

Show code
sensors_unist <- st_read("../workflow/unist19_main/data/sensors.gpkg", quiet = TRUE) |>
  filter(sensor_name != "comm_center") |>
  st_transform(4326)

coords_unist <- st_coordinates(sensors_unist) |>
  as_tibble() |>
  bind_cols(sensors_unist |> st_drop_geometry())

leaflet(coords_unist, width = "100%", height = 400) |>
  addProviderTiles(providers$Esri.WorldImagery,
                   options = providerTileOptions(className = "bw-tiles")) |>
  addCircleMarkers(
    lng = ~X, lat = ~Y,
    radius = 6, color = "white", weight = 1.5,
    fillColor = "#FF5722", fillOpacity = 0.9,
    label = ~sensor_name,
    popup = ~paste0("<b>", sensor_name, "</b>")
  )
Figure A.1: Interactive sensor map of the UNIST campus. Click markers for sensor names.

Deployment Period

The deployment ran for 26 days, from October 21 to November 15, 2019. The first week (Oct 21–25) coincided with midterm examinations, when outdoor pedestrian movement was noticeably reduced. Regular classes resumed from October 28, establishing baseline weekday patterns. Two short events punctuated this baseline: campus admissions interviews on November 1–2 brought an influx of high-school students and parents, and the school festival on November 3–5 generated higher evening and weekend activity with food trucks and outdoor events. The final ten days (Nov 6–15) returned to regular class schedules.

Ground Truth

To validate the sensing methods, 107 student volunteers were recruited from campus dormitories. Each participant installed a GPS logger application on their smartphone, which recorded GPS points at fixed intervals and uploaded them to a server. Participants also provided their smartphone’s MAC address for matching. They were not informed of the experiment’s specific purpose to avoid behavioral changes.

Participant demographics: mean age 24.3 years (SD = 2.3), 86% undergraduate, 14% graduate; 76 Android users (71%), 31 iOS users (29%); 71 male (66%), 36 female (33%). Each participant signed a consent form for personal information collection under Korea’s Personal Information Protection Act. The study was approved by UNIST Central Research Facilities.

Dataset Summary

After preprocessing (removing randomized MACs, stationary devices, and devices with fewer than 5 detections), the campus dataset contains approximately 15 million detection records from 25,603 unique non-randomized devices, aggregated into 20-second windows. Randomized addresses, identified by the locally-administered bit check and excluded during preprocessing, accounted for 4.6% of detection events but 92.4% of unique MAC addresses (Section B.3).

A.2 Commercial District near the University of Ulsan

Site

The study area is a mixed-use commercial district adjacent to the University of Ulsan, approximately 34,000 m² in size. It includes restaurants, cafes, retail shops, and services catering primarily to university students. The district features a designated pedestrian-priority street (approximately 400 meters) where vehicle access is restricted during certain hours, alongside conventional streets with mixed vehicle and pedestrian traffic.

Sensor Network

Nineteen sensors were deployed at street intersections throughout the district. After excluding two dual-channel sensors co-located at the same positions (collecting 2.4 GHz and 5 GHz simultaneously), 17 unique sensor positions were used for analysis. Eight sensors were placed along the pedestrian-priority street and nine on surrounding conventional streets. Nearest-neighbor distances between sensors ranged from 46 to 95 meters, tighter than the campus deployment to match the denser urban fabric.

Show code
sensors_uou <- read_csv("../workflow/uou20/output/sensors_coords.csv",
                        show_col_types = FALSE) |>
  transmute(
    sensor_name = id_sensor,
    street_type = case_match(
      street_type,
      "Pedestrian" ~ "Ped-priority",
      "Regular"    ~ "Conventional"
    ),
    lng = x, lat = y
  )

pal <- colorFactor(c("#FF5722", "#999999"), domain = c("Ped-priority", "Conventional"))

leaflet(sensors_uou, width = "100%", height = 400) |>
  addProviderTiles(providers$Esri.WorldImagery,
                   options = providerTileOptions(className = "bw-tiles")) |>
  addCircleMarkers(
    lng = ~lng, lat = ~lat,
    radius = 6, color = "white", weight = 1.5,
    fillColor = ~pal(street_type), fillOpacity = 0.9,
    label = ~paste0(sensor_name, " (", street_type, ")"),
    popup = ~paste0("<b>", sensor_name, "</b><br>", street_type)
  ) |>
  addLegend(
    position = "bottomright", pal = pal,
    values = ~street_type, title = "Street type",
    opacity = 0.9
  )
Figure A.2: Interactive sensor map of the commercial district near the University of Ulsan. Orange = ped-priority street, gray = conventional street.

Deployment Period

The deployment ran for 9 valid days from July 11 (Saturday) to July 20 (Monday), 2020, including four weekend days and five weekdays. One day was excluded due to insufficient sensor uptime (below 80% coverage threshold). This deployment occurred after the rollout of Android 10 but before iOS 14 (released September 2020), during the transition to more widespread MAC randomization.

Dataset Summary

The dataset contains approximately 17.9 million probe-level records at 1-second resolution from over 75,000 unique non-randomized devices. After removing residential devices (detected between 0:00–4:00 AM on 3 or more days), the remaining devices were classified by visit frequency: 57.7% single-day visitors and 42.3% returning visitors (detected on 2 or more days).

A smaller pilot deployment of 10 sensors was conducted at the same site in July 2019 for 3 days (2 weekdays and 1 weekend day). The 2020 deployment expanded the sensor network to cover a wider area and included the pedestrian-priority street, which was the focus of the activity analysis in Chapter 12.

A.3 Hardware Summary

Both deployments used identical sensor hardware. Each unit was built around a Raspberry Pi 3 Model B+ fitted with three Ralink RT5370 USB WiFi adapters, one per non-overlapping 2.4 GHz channel (1, 6, and 11), so that probe requests across the entire band could be captured simultaneously in monitor mode. A 32 GB micro SD card stored the operating system and data, and a 20,000 mAh portable power bank provided roughly eight hours of continuous operation. All components were housed in a weatherproof plastic case for outdoor installation.

A Python capture script ran as a systemd service, starting automatically at boot. Captured packets were stored locally in an SQLite database, with each record containing: timestamp, hashed MAC address (SHA-256), signal strength (RSSI), frame type, and sensor identifier. See Part I: Building the Sensor for detailed assembly and configuration instructions.