Skip to content

Instantly share code, notes, and snippets.

@goliatone
Last active November 3, 2016 20:35
Show Gist options
  • Select an option

  • Save goliatone/4010974e84fc05165e4f29d96eeb9088 to your computer and use it in GitHub Desktop.

Select an option

Save goliatone/4010974e84fc05165e4f29d96eeb9088 to your computer and use it in GitHub Desktop.
Configure RPi 3 running HypriotOS v1 to run as a beacon

Setup RPi as iBeacon HypriotOS

On a fresh HpryotOS image, bluez is already installed and running. If you run the following command:

$ sudo hciconfig dev
hci0:	Type: BR/EDR  Bus: UART
	BD Address: B8:27:EB:B0:55:A9  ACL MTU: 1021:8  SCO MTU: 64:1
	UP RUNNING 
	RX bytes:724 acl:0 sco:0 events:43 errors:0
	TX bytes:1568 acl:0 sco:0 commands:43 errors:0

Open and initialize HCI device:

sudo hciconfig hci0 up

Enable LE advertising. The 3 means non connectable undirected advertising:

sudo hciconfig hci0 leadv 3

Prevent scanning:

sudo hciconfig hci0 noscan

Start advertising:

$ sudo hcitool -i hci0 cmd 0x08 0x0008 1E 02 01 1A 1A FF 4C 00 02 15 63 6F 3F 8F 64 91 4B EE 95 F7 D8 CC 64 A8 63 B5 00 00 00 00 C8 00
< HCI Command: ogf 0x08, ocf 0x0008, plen 32
  1E 02 01 1A 1A FF 4C 00 02 15 63 6F 3F 8F 64 91 4B EE 95 F7 
  D8 CC 64 A8 63 B5 00 00 00 00 C8 00 
> HCI Event: 0x0e plen 4
  01 08 20 00

Beacon UUID:

63 6F 3F 8F 64 91 4B EE 95 F7 D8 CC 64 A8 63 B5

Which is the same as:

636F3F8F-6491-4BEE-95F7-D8CC64A863B5

Major:

00 00

Minor:

00 00

Power:

C8 00

sudo hcitool dev
Devices:
	hci0	B8:27:EB:B0:55:A9
#!/bin/sh
### BEGIN INIT INFO
# Provides: janus
# Required-Start: $network $syslog
# Required-Stop: $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: janus node ibeacon
# Description: iBeacon for janus node. This script will manage the service, providing start and stop
### END INIT INFO
# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC=janus
NAME=janus
APP_ROOT=/private/tmp
APP_GROUP=118232506
APP_USER=777482499
DAEMON=/home/pirate/CODE/janus-node/ibeacon/start
DAEMON_ARGS=""
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
export NODE_ENV=development
# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0
# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
# I like to know what is going on
VERBOSE=yes
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions
#
# Function that starts the daemon/service
#
do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
start-stop-daemon --start --quiet \
--chuid $APP_USER:$APP_GROUP --chdir $APP_ROOT --background \
--pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
|| return 1
start-stop-daemon --start --quiet \
--chuid $APP_USER:$APP_GROUP --chdir $APP_ROOT --background \
--make-pidfile --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_ARGS \
|| return 2
# Add code here, if necessary, that waits for the process to be ready
# to handle requests from services started subsequently which depend
# on this one. As a last resort, sleep for some time.
}
#
# Function that stops the daemon/service
#
do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 \
--pidfile $PIDFILE --exec $DAEMON
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
# Many daemons don't delete their pidfiles when they exit.
rm -f $PIDFILE
return "$RETVAL"
}
#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
#
# If the daemon can reload its configuration without
# restarting (for example, when it is sent a SIGHUP),
# then implement that here.
#
start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE \
--exec $DAEMON
return 0
}
case "$1" in
start)
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
status)
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
;;
reload|force-reload)
log_daemon_msg "Reloading $DESC" "$NAME"
do_reload
log_end_msg $?
;;
restart|force-reload)
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|status|restart|reload|force-reload}" >&2
exit 3
;;
esac
:
#!/bin/bash
UUID_CACHE_FILE=./.uuid
if [ ! -e "$UUID_CACHE_FILE" ] ; then
GEN_UUID=`python -c 'import sys,uuid;a=uuid.uuid4().hex;sys.stdout.write(" ".join([a[i:i+2] for i in range(0, len(a), 2)]))'`
echo $GEN_UUID > "$UUID_CACHE_FILE"
fi
export BLUETOOTH_DEVICE=hci0
echo "Setting BLUETOOTH_DEVICE=$BLUETOOTH_DEVICE"
export UUID=$(<$UUID_CACHE_FILE)
echo "Setting UUID=$UUID"
#python: int('555', 16) -> 1635
#term: echo "ibase=16; 555" | bc -> 1635
export MAJOR="00 00"
echo "Setting MAJOR=$MAJOR"
# int('4', 16) -> 13 65
export MINOR="00 00"
echo "Setting MINOR=$MINOR"
#
export POWER="c9 00"
echo "Setting POWER=$POWER"
#!/bin/bash
echo "Sourcing configuration from ibeacon.conf"
. ./ibeacon.conf
echo "Launching virtual iBeacon..."
sudo hciconfig $BLUETOOTH_DEVICE up
sudo hciconfig $BLUETOOTH_DEVICE leadv 3
sudo hciconfig $BLUETOOTH_DEVICE noscan
sudo hcitool -i hci0 cmd 0x08 0x0008 1e 02 01 1a 1a ff 4c 00 02 15 $UUID $MAJOR $MINOR $POWER
echo "Complete"
#!/bin/sh
echo "Sourcing configuration from ibeacon.conf"
. ./ibeacon.conf
echo "Disabling virtual iBeacon..."
sudo hciconfig $BLUETOOTH_DEVICE noleadv
echo "Complete"
#!/usr/bin/env python
import os, uuid
UUID=open('./.uuid').readline().rstrip()
formated = uuid.UUID(UUID.replace(' ', ''))
formated = "%s" %formated
print formated.upper()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment