Skip to content
View in the app

A better way to browse. Learn more.

Armbian Community Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

OPi Zero - Hybrid wifi mode or switched mode

Featured Replies

Hello,

 

I'm try to setup my OPiZero as mediaplyer, and I need to use it sometimes as WiFi Client - Managed mode and sometimes as WiFi AP - Master mode.

 

Scenario 1

Work in "dual mode", I mean, when my wifi network within reach, then OPiZ start as "client", and connect to my preferred wifi network

when wifi network not in range, it start as AP+DHCP (hostapd and dnsmasq)

 

Scenario 2

Switched mode, Make any push button on gpio, and then make scripts "to do the job" ..

disconnect from wifi, stop wpa_supplicant, run hostapd an dnsmasq.

 

Has anybody something like "scenrio1" or "scenario2" .. ??

 

(or my ideas are totally bad ... :) )

  • Author

So ... for some time ...

 

Here is my python script, for switching one wifi intreface  ...

It is first "one-way" version ...

The OPi.GPIO library for python is needed.   https://opi-gpio.readthedocs.io/en/latest/install.html

 

#!/usr/bin/env python

import os
#import sys
import OPi.GPIO as GPIO
import time
# Set your pins
button = (7)
led = (26)

cmd_dnsmasq_stop = "systemctl stop dnsmasq.service"
cmd_dnsmasq_start = "systemctl start dnsmasq.service"
cmd_wpa_supplicant_stop = "systemctl stop wpa_supplicant.service"
cmd_wpa_supplicant_start = "systemctl start wpa_supplicant.service"
cmd_wifi_off = "nmcli con down WiFi"
cmd_wifi_on = "nmcli con up WiFi"
cmd_hostap = "hostapd /etc/hostapd.conf -B"
cmd_bridge_on = "nmcli con up Bridge"
cmd_bridge_off = "nmcli con down Bridge"
cmd_dnsmasq_ap = "dnsmasq -C /etc/dnsmasq_ap.conf"


# Placeholder variable
GPIO.setmode(GPIO.BOARD)
GPIO.setup(led, GPIO.OUT, initial=GPIO.LOW, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(button, GPIO.IN, initial=GPIO.LOW, pull_up_down=GPIO.PUD_DOWN)

#def my_callback():
#    print('This is a edge event callback function!')
#    print('Edge detected on channel %s'%button)
#    print('This is run in a different thread to your main program')

#GPIO.add_event_detect(button, GPIO.RISING, callback=my_callback, bouncetime=200)
#GPIO.add_event_callback(button, my_callback)
GPIO.wait_for_edge(button, GPIO.RISING)  # add rising edge detection on a channel
print('Button pressed')

print('Wifi Off')
os.system(cmd_wifi_off)
time.sleep(2)
print('Stop DNSMASQ')
os.system(cmd_dnsmasq_stop)
time.sleep(5)
print('Stop WPA Supplicant')
os.system(cmd_wpa_supplicant_stop)
time.sleep(2)
print('Start Bridge')
os.system(cmd_bridge_on)
time.sleep(2)
print('Start DNSMASQ AP')
os.system(cmd_dnsmasq_ap)
time.sleep(5)
print('Start HostAP')
os.system(cmd_hostap)
time.sleep(5)

GPIO.output(led, GPIO.HIGH)

#GPIO.cleanup()

 

  • Author

Final version.....

 

Anybody can use their own commands for start-stop processes or for bring up-down interfaces...

#!/usr/bin/env python3

# Set your pins
button = (5)
led = (26)

#Set your commands
cmd_dnsmasq_stop = "systemctl stop dnsmasq.service"
cmd_dnsmasq_start = "systemctl start dnsmasq.service"
cmd_wpa_supplicant_stop = "systemctl stop wpa_supplicant.service"
cmd_wpa_supplicant_start = "systemctl start wpa_supplicant.service"
cmd_wifi_off = "nmcli con down WiFi"
cmd_wifi_on = "nmcli con up WiFi"
cmd_hostap_on = "hostapd /etc/hostapd.conf -B"
cmd_hostap_off = "killall hostapd"
cmd_bridge_on = "nmcli con up Bridge"
cmd_bridge_off = "nmcli con down Bridge"
cmd_dnsmasq_ap_on = "dnsmasq -C /etc/dnsmasq_ap.conf"
cmd_dnsmasq_ap_off = "killall dnsmasq"

# Main script
import os
import sys
import OPi.GPIO as GPIO
import time

client = 0
ap = 1

# Placeholder variable
GPIO.setwarnings(False) # Ignore warning for now
GPIO.setmode(GPIO.BOARD)
GPIO.setup(led, GPIO.OUT, initial=GPIO.LOW, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(button, GPIO.IN, initial=GPIO.LOW, pull_up_down=GPIO.PUD_DOWN)

state = client
while True:
   GPIO.wait_for_edge(button, GPIO.RISING) # This is a function
   os.system(cmd_wifi_off)
   time.sleep(3)
   os.system(cmd_dnsmasq_stop)
   time.sleep(5)
   os.system(cmd_wpa_supplicant_stop)
   time.sleep(5)
   os.system(cmd_bridge_on)
   time.sleep(15)
   os.system(cmd_dnsmasq_ap_on)
   time.sleep(10)
   os.system(cmd_hostap_on)
   time.sleep(5)
   GPIO.output(led, GPIO.HIGH)
   print("AP mode is started")
   state = ap
   time.sleep(5)

   if state == ap:
      GPIO.wait_for_edge(button, GPIO.RISING) # This is a function
      os.system(cmd_hostap_off)
      time.sleep(3)
      os.system(cmd_dnsmasq_ap_off)
      time.sleep(3)
      os.system(cmd_bridge_off)
      time.sleep(5)
      os.system(cmd_wpa_supplicant_start)
      time.sleep(5)
      os.system(cmd_dnsmasq_start)
      time.sleep(7)
      os.system(cmd_wifi_on)
      time.sleep(3)
      GPIO.output(led, GPIO.LOW)
      print("Client mode is strted")
      state = client
      time.sleep(5)

 

put 2 wifi dongles in cause xradio 819 on opi zero (if it's the original zero) is prob. the worst onboard wifi you can have prone to hang the kernel with it when it fails (I don't think that everybody ever took an effort to fix that)..

  • Author

OK ..

but, if you can use another board ... (OPIZero Plus or OPIZero Plus2 or anything else)

this is useful ...

Guest
This topic is now closed to further replies.

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.