This is an old revision of the document!
The MP2.0 when available will have 16MB FLASH and 64MB RAM, 11 GPIO lines, and a USB port, making it ideal for prototyping the mesh helper.
But it isn't available yet …
In the meantime, we have some TP-LINK TL-WR703Ns (version 1.2 models according to their labels), which use the same Atheros 9331 chipset, but have only 4MB FLASH and 32MB RAM, a USB port and no 12v in capability – but still better than the Dragino.
The concept is to connect an Arduino-UNO or compatible board to the USB port, and connect the radio to that. We will then use the usual serial port interface on the Arduino to talk to it.
The TL-WR703N is well supported by OpenWRT: http://wiki.openwrt.org/toh/tp-link/tl-wr703n
WARNING: The following can brick newer WR703Ns (Firmware 1.7, Ver:1.6 or Ver:1.7 etc on the bottom of the unit. Ver:1.2 is known to be safe). This is an issue with the OpenWRT firmware listed below. You can safely use these instruction with your own built OpenWRT distro, provided it is new enough. We will do that later.
Some more info on getting OpenWRT onto the WR703n can be found here:
http://daviddarts.com/piratebox-diy-openwrt/
This more or less boils down to:
You should now have OpenWRT on your WR703N.
Then login with telnet 192.168.1.1
and use passwd root
to set a root password (just use root
as the password to keep things easy while experimenting). Once you have set a root password, telnet
will be disabled, and ssh
will be enabled. Log in using ssh root@192.168.1.1
after that.
The WR703N only has 4MB of flash, which is too small for a Serval or Commotion build. We use the USB port to solve this problem by connecting a USB memory stick. We are using 16GB ones.
You will need to install the following OpenWRT packages:
Because of the small flash size, you will need to scp them into /tmp/ which is a RAMfs. Note that there are some interdependencies here, so the order of installation will be different.
Install these packages, and if required reboot the 703. Then plug a USB memory stick in. Typing dmesg
should show that it has been recognised, e.g., as sda
:
45503.970000] USB Mass Storage support registered. [45504.960000] scsi 0:0:0:0: Direct-Access SanDisk Cruzer Switch 1.26 PQ: 0 ANSI: 5 [45504.970000] sd 0:0:0:0: [sda] 31266816 512-byte logical blocks: (16.0 GB/14.9 GiB) [45504.970000] sd 0:0:0:0: [sda] Write Protect is off [45504.980000] sd 0:0:0:0: [sda] Mode Sense: 43 00 00 00 [45504.980000] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA [45505.000000] sda: sda1 [45505.010000] sd 0:0:0:0: [sda] Attached SCSI removable disk''
Next, use fdisk
to partition the USB memory stick. Note that fsck requires about 1MB of RAM for every 1GB of partition size, so I recommend making a 1GB partition that will be used to replace /overlay on the router, and dividing the remaining space into partitions of a few GB each.
On our 16GB sticks I used 1GiB+7GiB+7GiB, the other GiB being missing due to the “marketing GB” differing from the binary GB. You might also like to make a partition for swap and/or /tmp
Then use mkfs.ext4 to create the file system(s), e.g. mkfs.ext4 /dev/sda1
Then uninstall the following packages to make space for the ext4 kernel module (yes, the space is that tight, but don't worry, we can put it back later):
opkg remove e2fsprogs
Now that you have enough space, install the following packages:
You should now be able to mount your 1GB partition that we will use for /overlay:
mount /dev/sda1 /mnt
Now run the following commands on the router (taken from http://blog.night-shade.org.uk/2013/01/more-storage-on-openwrt/):
tar -C /overlay -cvf - . | tar -C /mnt -xf - uci add fstab mount uci set fstab.@mount[-1].device=/dev/sda1 uci set fstab.@mount[-1].options=$options uci set fstab.@mount[-1].enabled_fsck=0 uci set fstab.@mount[-1].enabled=1 uci set fstab.@mount[-1].target=/overlay uci set fstab.@mount[-1].fstype=$fstype mkdir /home uci add fstab mount uci set fstab.@mount[-1].device=/dev/sda2 uci set fstab.@mount[-1].options=$options uci set fstab.@mount[-1].enabled_fsck=0 uci set fstab.@mount[-1].enabled=1 uci set fstab.@mount[-1].target=/home uci set fstab.@mount[-1].fstype=$fstype mkdir /serval uci add fstab mount uci set fstab.@mount[-1].device=/dev/sda3 uci set fstab.@mount[-1].options=$options uci set fstab.@mount[-1].enabled_fsck=0 uci set fstab.@mount[-1].enabled=1 uci set fstab.@mount[-1].target=/serval uci set fstab.@mount[-1].fstype=$fstype uci commit fstab /etc/init.d/fstab enable
Reboot and you should have 1GB in /overlay, mounted from USB, as well as large /home and /serval partitions.
In the short preparation time we have for KiwiEx, we have not had time to configure a single OpenWRT package that includes all setup, so the following recipe is required:
menuconfig
to enable building of Serval as a module and then build it).librt_0.9.33.2-1_ar71xx.ipk
serval-*.ipk
you built in step 1Change the IP address in this file from 29.167.164.237 to something random between 28.0.0.0 and 29.255.255.255
config interface 'loopback' option ifname 'lo' option proto 'static' option ipaddr '127.0.0.1' option netmask '255.0.0.0' config interface 'lan' option ifname 'eth0' # option type 'bridge' option proto 'static' option ipaddr '192.168.1.1' option netmask '255.255.255.0' config interface public option proto static option ipaddr 192.168.100.1 option netmask 255.255.255.0 config interface mesh option ifname wlan0-1 option proto static option ipaddr 29.167.164.237 option netmask 254.0.0.0
Change the mac address 5c:63:bf:bb:41:90 to something random, but keep the 5c: at the front.
config wifi-device radio0 option type mac80211 option channel 6 option hwmode 11ng option macaddr 5c:63:bf:bb:41:90 option htmode HT20 list ht_capab SHORT-GI-20 list ht_capab SHORT-GI-40 list ht_capab RX-STBC1 list ht_capab DSSS_CCK-40 config wifi-iface mesh option device radio0 option ssid mesh.servalproject.org option network mesh option mode adhoc option bssid 02:ca:ff:dd:ca:ce option bgscan 0 config wifi-iface public option device radio0 option network public option mode ap option isolate 0 option ssid public.servalproject.org option hidden 0 option encryption none
Don't forget to chmod 755 this file once you have installed it
#!/bin/sh /etc/rc.common # Copyright (C) 2006 OpenWrt.org START=41 start() { # Start servald export SERVALINSTANCE_PATH=/etc/serval mkdir -p $SERVALINSTANCE_PATH servald start } stop() { export SERVALINSTANCE_PATH=/etc/serval servald stop }
CP2012 datasheet is at http://www.silabs.com/products/interface/usbtouart/Pages/usb-to-uart-bridge.aspx
Follow that, and install the CP210x USB serial adapter drivers from http://downloads.openwrt.org/attitude_adjustment/12.09-beta2/ar71xx/generic/packages/
You will need kmod-usb-serial-cp210x_3.3.8-1_ar71xx.ipk and kmod-usb-serial_3.3.8-1_ar71xx.ipk or similar. Use scp to copy these onto your 703, and then use:
opkg install kmod-usb-serial_3.3.8-1_ar71xx.ipk opkg install kmod-usb-serial-cp210x_3.3.8-1_ar71xx.ipk
Yet to be explored.
On OSX to use the SiLabs CP2012 USB adapters on mac, you need to install the drivers from http://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx
Install those, and the USB to serial adapter works on the mac.
Drivers from http://www.ftdichip.com/Drivers/VCP.htm
Whether using the TL-WR703N, we should use a better voltage regulator to tolerate the 12v - 15v we can expect to see on the LiFePO4 batteries. Jaycar sell such a kit for AUD$7.95 that can provide 5V @ 1A, which should be enough, and is quite easy to build: http://www.jaycar.com.au/productView.asp?ID=KA1797
The TL-WR703N itself uses <1W with nothing connected to the USB port, leaving 4W for the radio and USB memory stick for Rhizome mass storage, which should be enough. Once we get the MP2.0's, they will power themselves and the USB mass storage, leaving all 1A for the Arduino and radio.
The RFD900 radio can use 4W on its' own, so a separate 5v 1A supply is probably a good idea. Our solution for now is to use two of the KA1797 kits.
For the Arduino, we want one that can plug in the USB port, because that is easiest. However, the availability of radio hardware that supports TTL serial with nice firmware, we can skip the Arduino for now. See below for discussion of the radio hardware.
Talking with Tridge @ #LCA2013, there is a nice radio that he has already written point-to-point firmware for, that could be easily integrated with the TL-WR703N via a USB to TTL serial adapter.
The radio units are the http://rfdesign.com.au/index.php/rfd900
At Make.Hack.Void in Canberra started testing this with some of Tridge's gear.
We now have a convenient way to test the radios on both Mac and on the WR703N itself, which will allow fairly easy development and integration with servald.
Have ordered an RFD900 bundle from rfdesign.com.au, with a couple of the FTDI brand USB/TTL converters that they supply, just to get things started smoothly. Then once the CP2012s arrive (probably in 3 - 5 weeks), we can use those on future units.
For ease of development, we will plug the RFD900 into a USB port on a mac, where it will appear as a serial port. On my mac, my first RFD900 shows up as /dev/tty.usbserial-A1011UQN
We can talk to the radio module using something like:
sudo cu -l /dev/tty.usbserial-A1011UQN -s 57600
And then entering +++ to drop to the AT command prompt of the modem. AT commands are the same as listed at http://code.google.com/p/ardupilot-mega/wiki/3DRadio
After plugging both radios in, they synchonised in a few seconds, and I was able to use the AT&T=RSSI to get a running report on the RSSI output from the radio.
With the radio TX power set to +20dbm and +2.1db stub antennae RSSI results were 217 for both left and right antennae, and the noise floor was usually in the range 50 – 60 in my house in suburban Adelaide.
These units are are approximately 0.5dB, where 25 probably somewhere around -121dBm. In my case, the link budget is about 157 RSSI. Using the more accurate formula from the 3Dradio, the RSSI corresponds to -12.8dBm, and the noise floor to -95.4dBm, for a link budget of 82.6dBm.
As the radios are about 30cm apart on my desk, and each 6.02dB allows a doubling of range, this suggests a maximum range of about 30cm x 2^13.7 = 30cm x 13300, or about 4km. The antenna gain is only +2.1dB, so we could increase TX power by another 7dB, which should double the range to around 8km, assuming clear line of sight – which is pretty good for a 1W radio in a suburban area. A lower noise floor could easily increase range to a few tens of kilometres. This is pretty exciting for enabling long-range mesh communications, especially when compared with WiFi's suburban range of <160m.
So the next step is to modify servald to be able to use the radios as a link, and then get it working on the 703N.
For servald, it will be fairly easy to patch the dummynet driver that already reads and writes to an ordinary file. We will just need to implement flow control/throttling, and packet encapsulation in case of communications errors.