QConsole is an utility which allows you to login in any Symbian devices and perform certain operations in a more easy and fast way than the standard GUI. Running applications (especially gdbstub) with parameters was especially what drove with to write QConsole. It is a Syambian executable (exe) that listen to the next available RFCOMM channel and serves only one connection at a time. While it is possible to have multiple connections served at the same time, given the nature of Symbian devices, such feature can be skipped (at least for the very first releases, and you can always run multiple copies of QConsole). The QConsole client is available for Linux and Windows.
In order to use QConsole, you need the QTTY console client (valid for QConsole and WmConsole), and the qconsole server EXE. Please take a look at the QTTY home page for a description about how to build it and use it (no need to build the Windows version if you don't want to - a pre-built binary is availble inside the package). About the qconsole EXE, you have the .mmp file, so you can use your preferred tools to build an ARMI binary for your device. I personally use an all-native-Linux SDK that allows me to run the full development cycle on my Linux workstation (if I will find time to polish it, I will probably publish my Perl scripts and modified tools somewhere on this site). Once you built the qconsole EXE (you can also use the ready-to-use SIS install package available for download below, in case you're unwilling or unable to make a build), you need to upload it on the device. I personally find the NFS connection very handy for this (even though YMMV using p3nfs):
Through QConsole get and put commands you can still upload and download files on and from your device though.
First off, setup you kernel to have BlueTooth modules available for load, of directly linked inside the kernel. If you use a modern distro they already are in the correct plane for you. If you're using an old distro that doesn't have them, I'm assuming you can figure it out by yourself how to compile a new kernel with the required features (BlueTooth support). The you need to install BlueZ Linux packages to set up the userspace infrastructure for BlueTooth. In my current setup:
# apt-cache search bluez
bluez-bluefw - Bluetooth firmware loader
bluez-hcidump - Bluetooth HCI protocol analyzer
bluez-libs - Bluetooth libraries
bluez-libs-devel - Development libraries for Bluetooth applications
bluez-pan - Bluetooth PAN
bluez-pin - D-BUS Bluetooth PIN helper
bluez-sdp - Bluetooth SDP libraries and utilities
bluez-sdp-devel - Development headers and libraries for Bluetooth SDP
bluez-utils - Bluetooth utilities
If you're planning to play with Linux BlueTooth, I suggest you to install them all. Then you can activate the BlueTooth stack. You can use this simple script, that if all goes well should bring you BT stack up in place:
/usr/sbin/hciconfig hci0 up
# HCI needs some time to "stabilize" before it starts accepting commands (/me think)
/usr/sbin/hciconfig hci0 noauth
/usr/sbin/hciconfig hci0 name MYDEV
You can find out if everything went fine by doig:
# /usr/sbin/hciconfig -a
This is the output in my machine (will be different on yours, depending mainly on the BT device you have):
hci0: Type: USB
BD Address: 00:04:61:80:77:0F ACL MTU: 192:8 SCO MTU: 64:8
UP RUNNING PSCAN ISCAN ENCRYPT
RX bytes:3521272 acl:126808 sco:0 events:30041 errors:0
TX bytes:4021524 acl:35060 sco:0 commands:1562 errors:0
Features: 0xff 0xff 0x0b 0x00
Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
Link policy: HOLD SNIFF PARK
Link mode: SLAVE ACCEPT
Service Classes: Networking, Object Transfer
Device Class: Computer, Desktop workstation
HCI Ver: 1.1 (0x1) HCI Rev: 0x1bb LMP Ver: 1.1 (0x1) LMP Subver: 0x1bb
Manufacturer: Cambridge Silicon Radio (10)
The next step is to edit your /etc/bluetooth/pin file to set a PIN different from "BlueZ". Then you can start by activating the BlueTooth stack on your device. In my Nokia 6600 is inside the "Connections" folder inside the main menu. Then, it is time to pair your device with your PC BlueTooth link. Somewhere inside your device's BlueTooth menus there is the option to pair your device with other ones. Select that and let your portable device to scan for available devices in your piconet. It should fine your PC node with the name you set in your BT startup script (MYDEV in the example above). Select it and input the PIN you set in your /etc/bluetooth/pin file. If it doesn't accept it, you likely changed the /etc/bluetooth/pin after you started the BT stack on your machine. Stop the BT stack with something like:
/usr/bin/killall -TERM sdpd
/usr/bin/killall -TERM hcid
/usr/sbin/hciconfig hci0 down
Then restart it again using the same script you used before. This time you should be able to successfully pair you portable device with your Linux box. It's not over on that side, since you will need to set you Linux box BT node (that you just paired) as authorized. The qtty client accepts either BlueTooth device names or BlueTooth device addresses to be specified with the "--qc-addr BTADDR" command line directive. You can use 'hcitool' to find out all reachable device in your area. In my case it will show:
# hcitool scan
Here "Dudi6600" is the name I gave to my BT device, and "00:0E:6D:20:3E:ED" is the BT device address (BTADDR) we were searching for. The next step involves editing the c:systemdataqconsole.txt file to change/add users. The file lists many lines in the "USERNAME PASSWORD" format. It's time to start the QConsole binary on your device, that, if nothing really wrong happen, will display:
QConsole ready on channel NN
At this point you can finally run qtty to connect with your device QConsole server:
$ qtty --qc-addr BTADDR --qc-channel NN --user USER --pass PASS
In my case it will end up to:
$ qtty --qc-addr Dudi6600 --qc-channel 4 --user USER --pass PASS
If you use BlueTooth device names instead of addresses, it can happen that, if the BlueTooth name is not cached inside the qtty device cache file, it can take ten to fitheen seconds for the name lookup (once the name is cached, it will be instantaneous). You should see the QConsole welcome message and its prompt ("$ "). The default USER as installed by the .SIS file supplied with the tarbal is "qconsole", while the default PASS is "server" (and you are suggested to change them).
Prints the QConsole help screen.
Prints the current working directory. File names that are not prepended by drive names or backslash are assumed from the current directory (pwd).
Quits the QConsole session.
Quits the QConsole session and tells the QConsole server to shutdown.
Quits the QConsole session and reboot the remote device.
Usage: cd DIR
Change the current directory to DIR. The DIR parameter can be the string "..", that will make the current directory to go up one level.
Usage: ls [DIR/FILE]
Lists the current directory or the specified path.
Lists currently running processes. The format of the output lines is:
PID PPID FLG PRI UID2 UID3 NAME
PID = Process Id
PPID = Owner process Id
FLG = Flags:
P = Protected
R = Loaded from ROM
PRI = Priority
UID2 = Second UID of the application
UID3 = Third UID of the application
NAME = Process name
Usage: kill PID
Terminates the process identified by PID.
Usage: prio PID PRIO
Adjust process PID priority to PRIO. the priority PRIO can be one of:
L = Low
B = Background
F = Foreground
H = High
Usage: prot PID PROT
Set/unset process PID protected state. The PROT parameters can be one of:
P = Protected
U = Unprotected
Usage: pinf PID
Display process PID informations.
Usage: pren PID NAM
Change process PID name to NAME.
Usage: run APP/EXE ...
Starts the application or exe with the specified parameters.
Lists available drives and associated information. The output of the command is composed by many lines with the format:
DR FST SIZE FREE
DR = Drive name
FST = File system type
SIZE = Drive size in Kb
FREE = Drive's free space in Kb
Usage: mkdir DIR
Creates the directory specified by DIR.
Usage: rmdir DIR
Removes the directory specified by DIR.
Usage: rmtree DIR
Removes the whole tree underneath DIR. Note that no confirmation is asked, so the command can result pretty dangerous.
Usage: rm FILE
Removes the file specified by FILE.
Usage: chmod MODE FILE
Change the access mode of FILE applying MODE changes. The MODE paremeter is composed by a first character either '+' (add mode) or '-' (remove mode), and one or more mode characters:
h = Hidden
w = Write
s = System
Usage: mv OLD NEW
Renames files or directories from OLD to NEW. The two file names must be on the same drive for the `mv` command to succeed.
Usage: cp SRC DST
Copy SRC file onto DST file.
Usage: cat FILE
Dump the content of remote file FILE on screen.
Usage: lsthr [PID]
Lists threads of process PID, or all existing threads if PID is not specified. The output of the command is composed by multiple lines with the format:
TID PID FLG PRI HSIZ SSIZ PH TH NAME
TID = Thread Id
PID = Process Id
FLG = Thread flags:
P = Protected
R = Loaded from ROM
PRI = Thread priority
HSIZ = Heap size in Kb
SSIZ = Stack size in Kb
PH = Process handle count
TH = Thread handle count
NAME = Thread name
Lists all global semaphores available on the system. The output of the command is composed by multiple lines with the format:
CNT = Semaphore internal count value
NAME = Semaphore name
Lists all global memory chunks available on the system. The output of the command is composed by multiple lines with the format:
CSIZ MSIZ FLG MADDR NAME
CSIZ = RChunk current size in Kb
MSIZ = RChunk maximum size in Kb
FLG = RChunk flags:
R = Readable
W = Writable
MADDR = Mapping address seen by the QConsole process
NAME = RChunk name
Lists all physical devices available on the system. The output of the command is composed by multiple lines with the format:
NAME = Physical device name
Lists all logical devices available on the system. The output of the command is composed by multiple lines with the format:
NAME = Logical device name
Lists all loaded DLLs available on the system. The output of the command is composed by multiple lines with the format:
NAME UID2 UID3 FILENAME
NAME = DLL internal name
UID2 = Seconds UID of the DLL
UID3 = Third UID of the DLL
FILENAME = Full path of the executable from where the DLL was loaded from
Dumps all the device infromation available on the system.
Usage: find PATH MATCH
Recursively searches inside PATH for MATCH file or directory name (wildcards are allowed in MATCH).
Usage: getchk CHK LOC
Dumps the content of the remote chunk (on device) CHK to local file LOC.
Usage: get [-R] REM LOC
Copies the remote file(s) (on device) REM to local file/path LOC. Wildcards allowed in REM. Allowed flags for the command are:
R = Recurse to subdirectories
Usage: put [-fR] REM LOC
Copies the local file(s) LOC to the remote file/path (on device) REM. Wildcards allowed in LOC. Allowed flags for the command are:
R = Recurse to subdirectories
f = Force the missing subdirectories creation