Arquivos da categoria: IoT

Controlando GPIO do Raspberry 3 – IoT

Configurações do VirtualHost Apache2:

1
2
3
4
5
6
7
8
9
10
11
<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/app
 
        <Directory "/var/www/app">
                Options +ExecCGI
                AddHandler cgi-script .cgi
        </Directory>
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Script para habilitar GPIO e WiFi com SSID “IoT”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/bin/bash
log="/tmp/ioT.log"
 
start(){
        /usr/sbin/hostapd -B /etc/hostapd/hostapd.conf
        if [ $? -eq 0 ]; then
                echo "hostapd run!"
        fi
        # Liga GPIO
        echo "05" > /sys/class/gpio/export
        echo "13" > /sys/class/gpio/export
        echo "21" > /sys/class/gpio/export
        echo "24" > /sys/class/gpio/export
        echo "out" > /sys/class/gpio/gpio5/direction
        echo "out" > /sys/class/gpio/gpio13/direction
        echo "out" > /sys/class/gpio/gpio21/direction
        echo "in" > /sys/class/gpio/gpio24/direction
}
stop(){
        /usr/bin/killall -9 hostapd
        if [ $? -eq 0 ]; then
                echo "hostapd stopped!"
        fi
}
case $1 in
        "start") start ;;
        "stop") stop ;;
        *) echo "Parametro incorreto" ;;
esac

API CGI que receberá as instruções para controlar as GPIOS
Os dados são passados via GET, por meio da URL correspondente ao endereço IP que se encontra a aplicação:
Exemplo: http://192.168.0.101/?gpio5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#!/bin/bash
echo "Content-type: text/html"
echo ""
#echo "<meta http-equiv='Content-Type' content='text/html; charset=UTF-8'>"
gpio[0]="gpio5"
gpio[1]="gpio13"
gpio[2]="gpio21"
# cada gpio deve ser registrada em --> /etc/init.d/gpio
dirBaseGpio="/sys/class/gpio"
stateGpio=""
statusErro=false
msg=""
ip=$REMOTE_ADDR
get=$QUERY_STRING
 
returnApi(){
        stateGpio=$1
        msg=$2
        echo "{
              \"statusErro\": \"$statusErro\",
              \"stateGpio\": \"$stateGpio\",
              \"msg\": \"$msg\"
              }"
}
 
verifyStateGpio(){
  echo -n $(head -n1 "$dirBaseGpio/$get/value")
}
 
callGpio(){
        sleep 0.1
        stateGpio=$(verifyStateGpio)
        if [ $stateGpio -eq 1 ];then
          #desliga
          stateGpio=0
          msg="Porta $get desligada!"
        else
          #liga
          stateGpio=1
          msg="Porta $get ligada!"
        fi
        # modifica o estado da gpip
        echo -n "$stateGpio" > "$dirBaseGpio/$get/value"
        if [ $? -eq 0 ]; then
          returnApi "$stateGpio" "$msg"
        else
          statusErro=true
          returnApi "$stateGpio" "Não pode modificar $dirBaseGpio/$get/value"
        fi
}
 
begin(){
  # verifica se $get contém no array gpio definido
  for i in ${gpio[@]}
  do
      if [ "$get" == "$i" ];then
        callGpio $get
        exit
      fi
  done
  # retorna se requisição não estiver definida
  statusErro=true
  returnApi "null" "$get não definida."
}
 
state(){
  num=0
  for i in ${gpio[@]}
  do
      stateGpio[$num]=\"$i\"\:$(head -n1 "$dirBaseGpio/$i/value")\,
      num=$((num+1))
          done
  echo -n \{${stateGpio[@]:0}\} | sed 's/,}/}/g'
}
 
 
case $get in
'state') state ; exit ;;
*) begin ; exit ;;
esac
 
echo ''
echo ''