I was on the train today, needed some of the Boost manuals, and had no internet connection. So I wanted to use my phone (an old HTC Prophet with Windows Mobile 6.1) as a network access point to browse over GPRS/EDGE. As I found out, it is fairly simple with Blueman and it even provides NetworkManager integration, so all NetworkManager-capable applications can be notified about the connectivity. Windows Mobile 6.1 allows tethering over a Bluetooth PAN (Personal Area Network); but there is another method called DUN (Dial Up Networking), which I will not describe here. So here is a step-by-step tutorial what I did for my PAN approach, with a few (german) screenshots, tested on Ubuntu 10.04 Lucid:
- Since my laptop was running on Ubuntu Lucid, there was already a recent Blueman version in the Ubuntu repos available. On older systems, you may want to add the Blueman Launchpad PPA.
sudo apt-add-repository ppa:blueman/ppa # only necessary on pre-lucid systems sudo aptitude update sudo aptitude install blueman
Note that this also removes possibly installed gnome-bluetooth packages since Blueman is an adequate replacement for the GNOME Bluetooth UI.
- After the installation has finished, I had to enable the NMPANSupport plugin for NetworkManager 0.8 by right-clicking on the Blueman icon in the GNOME notification area and selecting “Plugins”. For older NetworkManager versions, there is also a plugin for NetworkManager 0.7, called NMIntegration.
- Then I activated tethering on my phone (“Programs” → “Internet Sharing” on my Windows Mobile 6.1, but YMMV). Apparently this was neccesary with my model, because without tethering enabled I could not get a Bluetooth PAN connection in the next step.
- I paired the phone and my laptop via Bluetooth, and created a PAN (Personal Area Network) by connecting to the “Network Access Point” service on the phone. In Blueman, all you have to do after pairing is right-click on the device and select “Connect To: Network Access Point”. This creates a new network device bnep0 which is automagically configured through NetworkManager (using a stateless address autoconfiguration).
- However, in my setup, though I was able to ping certain IP adresses on the internet, DNS lookups timed out for some reason. It got better when I explicily set an IP address for the Bluetooth PAN driver on my phone, and did the tethering process all over again.
- And off I went with mobile internet access. Woo-hoo! \o/
I may also add that the NetUsage plugin in Blueman is very reasonable to use 😉 After activated, the network usage can be viewed by right-clicking on the Blueman icon and selecting “Network Usage”.
The QNetworkAccessManager class is very user-friendly, but it makes asynchronous calls. I was in the need for synchronous calls to handle my HTTP communication, but I did not want the overhead of another thread, so I googled a bit and finally came up with a short call to an event loop that processed the request. Like this:
QNetworkAccessManager * pnam = new QNetworkAccessManager(this); // the slot was declared at another place connect(pnam, SIGNAL(finished(QNetworkReply *)), this, SLOT(loginFinished(QNetworkReply*))); QNetworkRequest req(QUrl("http://foo.bar")); pnam->post(req, postData); // execute an event loop to process the request (nearly-synchronous) QEventLoop eventLoop; // also dispose the event loop after the reply has arrived connect(pnam, SIGNAL(finished(QNetworkReply *)), &eventLoop, SLOT(quit())); eventLoop.exec();
This way my user-defined slot for the pnam->finished() signal was called immediately, and I could be sure to have the HTTP reply at the end of this code snippet.