ODROID C0 블루투스 커넥트

Post Reply
sjclover
Posts: 15
Joined: Fri May 08, 2020 9:28 am
languages_spoken: english
Has thanked: 1 time
Been thanked: 0
Contact:

ODROID C0 블루투스 커넥트

Post by sjclover » Fri May 15, 2020 11:22 am

블루투스 2.0 우분투16.04 오드로이드 C0사용

BLUETOOTHCTL 사용하여 어플에 페어링 하려는데 접근이안되네요

해결법부탁요

User avatar
odroid
Site Admin
Posts: 34162
Joined: Fri Feb 22, 2013 11:14 pm
languages_spoken: English, Korean, Japanese
ODROIDs: ODROID
Has thanked: 683 times
Been thanked: 619 times
Contact:

Re: ODROID C0 블루투스 커넥트

Post by odroid » Fri May 15, 2020 11:53 am

어떤 장치를 어떤 프로토콜 스택을 사용하여 연결하시려는지요?

그리고 scan on 명령을 실행하면 어떤 출력이 나오는 점검해 보시길 바랍니다.
https://wiki.odroid.com/odroid-xu4/appl ... h_settings

sjclover
Posts: 15
Joined: Fri May 08, 2020 9:28 am
languages_spoken: english
Has thanked: 1 time
Been thanked: 0
Contact:

Re: ODROID C0 블루투스 커넥트

Post by sjclover » Fri May 15, 2020 3:34 pm

외부에서 serial로 받은 데이터를 bluetooth를 통해 App단에 전송하려고합니다.

serial 확인용 어플에서 커넥트가 안되서 데이터 전송을 못 하고있는 상황입니다.

Errno111 Connection Refused 오류 나오면서 커넥션이안됨

scan on사용시 해당장치 검색가능

trust pair 명령어 사용시 적용가능

connect 사용시 적용가능

어플이용하여 connect사용할 시 동작불가

어플은 상용에서 대부분 사용하는 시리얼 블루투스용 어플 다른장비 정상동작확인

User avatar
odroid
Site Admin
Posts: 34162
Joined: Fri Feb 22, 2013 11:14 pm
languages_spoken: English, Korean, Japanese
ODROIDs: ODROID
Has thanked: 683 times
Been thanked: 619 times
Contact:

Re: ODROID C0 블루투스 커넥트

Post by odroid » Fri May 15, 2020 3:41 pm

용어가 생소하여 잘 이해를 못하겠습니다.
App은 우분투에서 실행되는 프로그램인지요? 아니면 안드로이드 장치에서 실행되는 프로그램인지요?
안드로이드 장치를 RFCOMM 프로토콜을 이용하여 C0의 우분투 OS와 연동하려는 것인지요?

C0가 시리얼 블루투스 장치처럼 동작시켜야만 하는지요?
일반 PC의 블루투스 통신으로도 어플은 동일한 접속이 가능한지요?

sjclover
Posts: 15
Joined: Fri May 08, 2020 9:28 am
languages_spoken: english
Has thanked: 1 time
Been thanked: 0
Contact:

Re: ODROID C0 블루투스 커넥트

Post by sjclover » Fri May 15, 2020 3:57 pm

APP은 안드로이드에서 실행되는 어플입니다. (스마트폰)

네. RFCOMM을 이용하여 연동합니다

C0가 시리얼 블루투스 장치처럼 동작시켜야만 하는지요?

-> 이해가되지않습니다. ODROID C0에 블루투스 동글을 연결하고 사용합니다


일반PC의 블루투스 통신으로 어플접속가능합니다.

User avatar
odroid
Site Admin
Posts: 34162
Joined: Fri Feb 22, 2013 11:14 pm
languages_spoken: English, Korean, Japanese
ODROIDs: ODROID
Has thanked: 683 times
Been thanked: 619 times
Contact:

Re: ODROID C0 블루투스 커넥트

Post by odroid » Fri May 15, 2020 4:39 pm

동일한 조건으로 사용해본 경험이 전혀 없어, 현재 어떤 부분에 문제가 있는지는 알기 어렵습니다.

일반 PC도 우분투 OS를 구동하였는지요?
그렇다면 RFCOMM 시리얼 스택이나 서비스가 구동되고 있을텐데, 동일한 서비스를 찾아서 ODROID의 Ubuntu에 설치를 하면 해결될것 같습니다.

그리고 우분투(리눅스)에서 RFCOMM 기능 활성화 방법은 아래 링크를 참고해 보시길 바랍니다.
https://askubuntu.com/questions/248817/ ... connection

sjclover
Posts: 15
Joined: Fri May 08, 2020 9:28 am
languages_spoken: english
Has thanked: 1 time
Been thanked: 0
Contact:

Re: ODROID C0 블루투스 커넥트

Post by sjclover » Fri May 15, 2020 5:05 pm

답변감사합니다.

기본적으로 Python 사용하여 sudo apt-get bluez 커맨드로 관련 라이브러리 설치 후

bluetoothctl 접속, agent scan trust 등 기타 작업 수행 수

어플에서 연동 시 추가로 작업해줘야할 부분없이 바로 연동이 되느지요?

다른부분을설치(라이브러리나 기타셋팅 추가)를 해줘야하는부분이 있느지요??

User avatar
odroid
Site Admin
Posts: 34162
Joined: Fri Feb 22, 2013 11:14 pm
languages_spoken: English, Korean, Japanese
ODROIDs: ODROID
Has thanked: 683 times
Been thanked: 619 times
Contact:

Re: ODROID C0 블루투스 커넥트

Post by odroid » Fri May 15, 2020 5:30 pm

우분투에서 RFCOMM 스택이 동작한다면, C나 Python으로 작성한 응용 프로그램은 /dev/rfcomm0 노드를 열어서 사용면 됩니다.
우선 해당 디바이스 노드가 정상적으로 생성되었는지 확인해 보시길 바랍니다.

sjclover
Posts: 15
Joined: Fri May 08, 2020 9:28 am
languages_spoken: english
Has thanked: 1 time
Been thanked: 0
Contact:

Re: ODROID C0 블루투스 커넥트

Post by sjclover » Mon May 18, 2020 10:45 am

감사합니다.

구체적으로 알수있나요

/dev/rfcomm 포트 여는법

그 후 실행법

User avatar
odroid
Site Admin
Posts: 34162
Joined: Fri Feb 22, 2013 11:14 pm
languages_spoken: English, Korean, Japanese
ODROIDs: ODROID
Has thanked: 683 times
Been thanked: 619 times
Contact:

Re: ODROID C0 블루투스 커넥트

Post by odroid » Mon May 18, 2020 12:30 pm

아래 Thread를 참고해 보세요.
https://www.raspberrypi.org/forums/view ... p?t=210881

그런데 rfcomm 노드는 생성 되었나요?

User avatar
tony.hong
Posts: 120
Joined: Tue Jun 04, 2019 1:49 pm
languages_spoken: korean
ODROIDs: All
Location: korea
Has thanked: 26 times
Been thanked: 35 times
Contact:

Re: ODROID C0 블루투스 커넥트

Post by tony.hong » Mon May 18, 2020 2:51 pm

예전에 bluetooth classic으로 테스트했던 내용인데 지금도 되는지 모르겠네요.

Code: Select all

sudo apt install -y bluez bluetooth libbluetooth-dev python3-pip\
&& python3 -m pip install pybluez

Code: Select all

sudo apt install -y pkg-config libboost-python-dev \
    libboost-thread-dev libglib2.0-dev python3-dev \
&& python3 -m pip install pybluez\[ble\]
블루투스 동글 삽입 후 lsusb로 삽입되었는지 확인, hcitool dev 명령어로 장치 이름 확인

Code: Select all

hcitool dev

Devices:
	hci0	00:1A:7D:DA:71:13
실행 옵션으로 -C(--compat)를 추가합니다.

Code: Select all

sudo vim /lib/systemd/system/bluetooth.service

...
ExecStart=/usr/lib/bluetooth/bluetoothd -C
...
SDP: Service Discovery Protocol

Code: Select all

echo -e '\nsudo chmod 777 /var/run/sdp' >> ~/.bashrc

Code: Select all

sudo reboot
아래 명령을 통해 블루투스 장치인 hci0의 스캔을 허용할 수 있습니다.

Code: Select all

sudo hciconfig hci0 piscan
bluetoothctl 명령어를 통해 블루투스 장치를 제어할 수 있습니다.

정보가 안나오면 sudo bluetoothctl 명령어를 통해 블루투스 장치를 제어할 수 있습니다.

Code: Select all

bluetoothctl
Command

Code: Select all

[NEW] Controller 18:1D:EA:36:DA:89 hhk7734 [default]
Agent registered
[bluetooth]# help
Menu main:
Available commands:
-------------------
advertise                   Advertise Options Submenu
scan                        Scan Options Submenu
gatt                        Generic Attribute Submenu
list                        List available controllers
show [ctrl]                 Controller information
select <ctrl>               Select default controller
devices                     List available devices
paired-devices              List paired devices
system-alias <name>         Set controller alias
reset-alias                 Reset controller alias
power <on/off>              Set controller power
pairable <on/off>           Set controller pairable mode
discoverable <on/off>       Set controller discoverable mode
agent <on/off/capability>   Enable/disable agent with given capability
default-agent               Set agent as the default one
advertise <on/off/type>     Enable/disable advertising with given type
set-alias <alias>           Set device alias
scan <on/off>               Scan for devices
info [dev]                  Device information
pair [dev]                  Pair with device
trust [dev]                 Trust device
untrust [dev]               Untrust device
block [dev]                 Block device
unblock [dev]               Unblock device
remove <dev>                Remove device
connect <dev>               Connect device
disconnect [dev]            Disconnect device
menu <name>                 Select submenu
version                     Display version
quit                        Quit program
exit                        Quit program
help                        Display help about this program
[bluetooth]#
Example

server

Code: Select all

import bluetooth
import signal
import sys

HOST = ''  # '블루투스 컨트롤러 맥 주소'를 직접 입력해도 됨
PORT = bluetooth.PORT_ANY
UUID = "94f39d29-7d6d-437d-973b-fba39e49d4ee"

def signal_handler(sig, frame):
    try:
        connected_socket.close()

    except:
        pass

    server_socket.close()
    sys.exit()

signal.signal(signal.SIGINT, signal_handler)

# 블루투스 서버 소켓 생성
server_socket = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
server_socket.bind((HOST, PORT))
server_socket.listen(1)

port = server_socket.getsockname()[1]
print("포트 :", port)

# 블루투스 서비스 advertise
bluetooth.advertise_service(server_socket, name="server",
                            service_id=UUID,
                            service_classes=[
                                UUID, bluetooth.SERIAL_PORT_CLASS],
                            profiles=[bluetooth.SERIAL_PORT_PROFILE])

# 클라이언트 접속 대기
connected_socket, client_address = server_socket.accept()

try:
    while True:
        data = connected_socket.recv(1024)
        print("client : ", data)
        connected_socket.send(data)

except:
    pass

connected_socket.close()
server_socket.close()
쓰레드를 이용한 송수신

Code: Select all

import bluetooth
import threading
import queue

class Bluetooth_socket(threading.Thread):
    def __init__(self):
        super().__init__()
        self._host = ''
        self._port = bluetooth.PORT_ANY
        self._uuid = "00000001-0000-1000-8000-00805F9B34FB"

        # 수신 데이터 저장용 큐
        self._recv_queue = queue.Queue()
        self.daemon = True

        # 블루투스 서버 소켓 생성
        self._socket = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
        self._socket.bind((self._host, self._port))
        self._socket.listen(1)
        bluetooth.advertise_service(self._socket, name="bluetooth_server",
                                    service_id=self._uuid,
                                    service_classes=[
                                        self._uuid, bluetooth.SERIAL_PORT_CLASS],
                                    profiles=[bluetooth.SERIAL_PORT_PROFILE])

        self._connection_start_callback = None
        self._connection_stop_callback = None

        self._is_connected = False

    def run(self):
        while True:
            # 블루투스 연결 대기
            self._connected_socket, client_address = self._socket.accept()
            self._is_connected = True

            self._start_callback()

            try:
                while True:
                    data = self._connected_socket.recv(1024)
                    self._recv_queue.put(data)

            except:
                pass

            self._stop_callback()

            self._is_connected = False
            self._connected_socket.close()

    def close(self):
        self._connected_socket.close()
        self._socket.close()

    # 수신 데이터
    def recv(self):
        try:
            data = self._recv_queue.get(block=False)

        except queue.Empty:
            return None

        return data

    # 송신 데이터
    def send(self, data):
        if self._is_connected:
            self._connected_socket.send(data)

    # 연결 시작 시 호출되는 콜백 설정
    def set_connection_start_callback(self, callback=None, args=()):
        self._connection_start_callback = callback
        self._connection_start_callback_args = args

    def _start_callback(self):
        if self._connection_start_callback is not None:
            self._connection_start_callback(
                *self._connection_start_callback_args)

    # 연결 종료 시 호출되는 콜백 설정
    def set_connection_stop_callback(self, callback=None, args=()):
        self._connection_stop_callback = callback
        self._connection_stop_callback_args = args

    def _stop_callback(self):
        if self._connection_stop_callback is not None:
            self._connection_stop_callback(
                *self._connection_stop_callback_args)

    def is_connected(self):
        return self._is_connected
Last edited by tony.hong on Tue May 19, 2020 11:59 am, edited 1 time in total.

sjclover
Posts: 15
Joined: Fri May 08, 2020 9:28 am
languages_spoken: english
Has thanked: 1 time
Been thanked: 0
Contact:

Re: ODROID C0 블루투스 커넥트

Post by sjclover » Tue May 19, 2020 9:42 am

안녕하세요

rfcomm 노드확인법 부탁드립니다

User avatar
odroid
Site Admin
Posts: 34162
Joined: Fri Feb 22, 2013 11:14 pm
languages_spoken: English, Korean, Japanese
ODROIDs: ODROID
Has thanked: 683 times
Been thanked: 619 times
Contact:

Re: ODROID C0 블루투스 커넥트

Post by odroid » Tue May 19, 2020 9:52 am

sudo ls /dev/rfcomm* 명령어를 실행해 보세요.

sjclover
Posts: 15
Joined: Fri May 08, 2020 9:28 am
languages_spoken: english
Has thanked: 1 time
Been thanked: 0
Contact:

Re: ODROID C0 블루투스 커넥트

Post by sjclover » Tue May 19, 2020 11:09 am

command not found ㅜ-ㅜ

I typied on my odroid c0 "sudo ls/dev/rfcomm/" or "sudo ls/dev/rfcomm0"

User avatar
tobetter
Posts: 5101
Joined: Mon Feb 25, 2013 10:55 am
languages_spoken: Korean, English
ODROIDs: X, X2, U2, U3, XU3, C1
Location: Paju, South Korea
Has thanked: 160 times
Been thanked: 494 times
Contact:

Re: ODROID C0 블루투스 커넥트

Post by tobetter » Tue May 19, 2020 11:37 am

sjclover wrote:
Tue May 19, 2020 11:09 am
command not found ㅜ-ㅜ

I typied on my odroid c0 "sudo ls/dev/rfcomm/" or "sudo ls/dev/rfcomm0"
명령어 잘못 입력했는지 확인 바랍니다. 그리고, sudo없이 "ls /dev/rfcomm"으로 확인 바랍니다.

User avatar
tony.hong
Posts: 120
Joined: Tue Jun 04, 2019 1:49 pm
languages_spoken: korean
ODROIDs: All
Location: korea
Has thanked: 26 times
Been thanked: 35 times
Contact:

Re: ODROID C0 블루투스 커넥트

Post by tony.hong » Tue May 19, 2020 12:22 pm

asdf.jpg
asdf.jpg (37.73 KiB) Viewed 289 times
이렇게 폰 어플리케이션이랑 오드로이드랑 통신하는게 목적이라면 위에 올려드린 코드 동작합니다. C0가 지금 안보여서 N2에서 확인했는데 통신에 문제 없네요

sjclover
Posts: 15
Joined: Fri May 08, 2020 9:28 am
languages_spoken: english
Has thanked: 1 time
Been thanked: 0
Contact:

Re: ODROID C0 블루투스 커넥트

Post by sjclover » Tue May 19, 2020 2:27 pm

안녕하세요 ODROID C0는 PYTHON3 실행시 어려움이있습니다

PYTHON2.7로 구동되는것같은데 unicode error

python3에서 실행하려고하는데 파일명으로 안되어이네요
어디에 .py를 만들어서 python3 명령어를 떄려야할지??

User avatar
tony.hong
Posts: 120
Joined: Tue Jun 04, 2019 1:49 pm
languages_spoken: korean
ODROIDs: All
Location: korea
Has thanked: 26 times
Been thanked: 35 times
Contact:

Re: ODROID C0 블루투스 커넥트

Post by tony.hong » Tue May 19, 2020 2:44 pm

프로그램 설치는 다 하셨다면

Code: Select all

hcitool dev
명령으로 디바이스 맥 주소 확인하시고 아래 코드를 복사해서 원하시는 파일명으로 저장하신 후
self._host 에 위에서 확인한 맥 주소를 입력하고 실행하면 됩니다.

Code: Select all

import bluetooth
import threading
import queue


class Bluetooth_socket(threading.Thread):
    def __init__(self):
        super().__init__()
        self._host = "00:1A:7D:DA:71:13"
        self._port = bluetooth.PORT_ANY
        self._uuid = "00000001-0000-1000-8000-00805F9B34FB"

        self._recv_queue = queue.Queue()
        self.daemon = True

        self._socket = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
        self._socket.bind((self._host, self._port))
        self._socket.listen(1)
        bluetooth.advertise_service(
            self._socket,
            name="bluetooth_server",
            service_id=self._uuid,
            service_classes=[self._uuid, bluetooth.SERIAL_PORT_CLASS],
            profiles=[bluetooth.SERIAL_PORT_PROFILE],
        )

        self._connection_start_callback = None
        self._connection_stop_callback = None

        self._is_connected = False

    def run(self):
        while True:
            self._connected_socket, client_address = self._socket.accept()
            self._is_connected = True

            self._start_callback()

            try:
                while True:
                    data = self._connected_socket.recv(1024)
                    self._recv_queue.put(data)

            except:
                pass

            self._stop_callback()

            self._is_connected = False
            self._connected_socket.close()

    def close(self):
        self._connected_socket.close()
        self._socket.close()

    def recv(self):
        try:
            data = self._recv_queue.get(block=False)

        except queue.Empty:
            return None

        return data

    def send(self, data):
        if self._is_connected:
            self._connected_socket.send(data)

    def set_connection_start_callback(self, callback=None, args=()):
        self._connection_start_callback = callback
        self._connection_start_callback_args = args

    def _start_callback(self):
        if self._connection_start_callback is not None:
            self._connection_start_callback(
                *self._connection_start_callback_args
            )

    def set_connection_stop_callback(self, callback=None, args=()):
        self._connection_stop_callback = callback
        self._connection_stop_callback_args = args

    def _stop_callback(self):
        if self._connection_stop_callback is not None:
            self._connection_stop_callback(*self._connection_stop_callback_args)

    def is_connected(self):
        return self._is_connected


blue = Bluetooth_socket()
blue.set_connection_start_callback(print, ("Start",))
blue.set_connection_stop_callback(print, ("Stop",))
blue.start()

import time

while True:
    if blue.is_connected():
        data = blue.recv()
        if data is not None:
            print(data)

    time.sleep(0.01)

User avatar
tony.hong
Posts: 120
Joined: Tue Jun 04, 2019 1:49 pm
languages_spoken: korean
ODROIDs: All
Location: korea
Has thanked: 26 times
Been thanked: 35 times
Contact:

Re: ODROID C0 블루투스 커넥트

Post by tony.hong » Tue May 19, 2020 2:54 pm

아 그리고 python2.7은 안써봐서 호환성 문제에 대해서는 저도 어떻게 할지 모릅니다 ;;

sjclover
Posts: 15
Joined: Fri May 08, 2020 9:28 am
languages_spoken: english
Has thanked: 1 time
Been thanked: 0
Contact:

Re: ODROID C0 블루투스 커넥트

Post by sjclover » Tue May 19, 2020 2:58 pm

Image

안녕하세용 그대로했는데 python bluetooth errror

bluez 모듈은설치완료해습니다

User avatar
tony.hong
Posts: 120
Joined: Tue Jun 04, 2019 1:49 pm
languages_spoken: korean
ODROIDs: All
Location: korea
Has thanked: 26 times
Been thanked: 35 times
Contact:

Re: ODROID C0 블루투스 커넥트

Post by tony.hong » Tue May 19, 2020 3:07 pm

python2와 python3 print 사용법이 달라서 생기는 문제같은데

blue.set_connection_start_callback(print, ("Start",))
blue.set_connection_stop_callback(print, ("Stop",))

이 두 줄은 지우셔도 됩니다.

sjclover
Posts: 15
Joined: Fri May 08, 2020 9:28 am
languages_spoken: english
Has thanked: 1 time
Been thanked: 0
Contact:

Re: ODROID C0 블루투스 커넥트

Post by sjclover » Tue May 19, 2020 3:13 pm

네 감사합니다

제가 너무힘이드네요 구조를살펴보니 python 경로자체에 파일을 만들지않아 빌드자체가 안되고있는데

제가 어떻게생성해야하는지요 /usr/bin/python3 로 생성되어있는데

python3 라는 폴더가있는것이아니고 실행파일로 되어있어서

어느경로에 제가만든 파일을넣어야할지....

User avatar
tony.hong
Posts: 120
Joined: Tue Jun 04, 2019 1:49 pm
languages_spoken: korean
ODROIDs: All
Location: korea
Has thanked: 26 times
Been thanked: 35 times
Contact:

Re: ODROID C0 블루투스 커넥트

Post by tony.hong » Tue May 19, 2020 3:16 pm

파이썬은 빌드라는 개념이 없는데 어떤 말씀이신지?

sjclover
Posts: 15
Joined: Fri May 08, 2020 9:28 am
languages_spoken: english
Has thanked: 1 time
Been thanked: 0
Contact:

Re: ODROID C0 블루투스 커넥트

Post by sjclover » Tue May 19, 2020 3:17 pm

Image

no such file or directory

User avatar
tony.hong
Posts: 120
Joined: Tue Jun 04, 2019 1:49 pm
languages_spoken: korean
ODROIDs: All
Location: korea
Has thanked: 26 times
Been thanked: 35 times
Contact:

Re: ODROID C0 블루투스 커넥트

Post by tony.hong » Tue May 19, 2020 3:22 pm

혹시 제가 가이드 해드린거 처음부터 끝까지 다 따라하신거 맞나요?

sjclover
Posts: 15
Joined: Fri May 08, 2020 9:28 am
languages_spoken: english
Has thanked: 1 time
Been thanked: 0
Contact:

Re: ODROID C0 블루투스 커넥트

Post by sjclover » Tue May 19, 2020 3:25 pm

Image

아니요 설치 시 get lock 오류 나오면서 설치가불가

하지만 기존에 pybluez 설치한 이력있읍니다

sjclover
Posts: 15
Joined: Fri May 08, 2020 9:28 am
languages_spoken: english
Has thanked: 1 time
Been thanked: 0
Contact:

Re: ODROID C0 블루투스 커넥트

Post by sjclover » Tue May 19, 2020 5:19 pm

코드를 bluetoothctl scan on 하고 실행시켜야하느지용

순서부탁드립니다

User avatar
tony.hong
Posts: 120
Joined: Tue Jun 04, 2019 1:49 pm
languages_spoken: korean
ODROIDs: All
Location: korea
Has thanked: 26 times
Been thanked: 35 times
Contact:

Re: ODROID C0 블루투스 커넥트

Post by tony.hong » Tue May 19, 2020 5:33 pm

죄송하지만 프로그래밍이나 리눅스 자체를 잘 못다루는 부분은 도와드리기 어렵습니다.

lock은 업데이트 중이거나 다른 프로그램을 설치중인거라, 기다리시거나 재부팅하시고 재시도 하시면 됩니다.
These users thanked the author tony.hong for the post:
sjclover (Wed May 20, 2020 10:05 am)

sjclover
Posts: 15
Joined: Fri May 08, 2020 9:28 am
languages_spoken: english
Has thanked: 1 time
Been thanked: 0
Contact:

Re: ODROID C0 블루투스 커넥트

Post by sjclover » Wed May 20, 2020 10:05 am

Thanks 4 u r help tony.hong , Sincerly.

해결하여읍니다. back up 후

1. 명시된 lib 설치

2. sudo hciconfig hci0 piscan

3. .py 실행

* ODROID-C0 에 PYTHON 3.X Version 이 설치되어있어 lib 이용가능합니다.

많은도움감사합니다.

Post Reply

Return to “C0/C1/C1+/C2/C4”

Who is online

Users browsing this forum: No registered users and 1 guest