Informatique & Geeks

Unbrick tenda A6 router

I've been buying Tenda A6 wifi router for object/arduino connection to internet : it's very litlle, chip, wifi, ethernet and usb powering enable.


Interesting option for "internet of things".


Two versions : one has only three modes, and chinese only, the other has 5 modes and is in english.

If you have chinese one, here is the firmware to transform in english 5 modes version .A5S-to-A6_EN.jpg

Rename this file .bin


After changing to last version, 20.ENG , Tenda A6 has brick.

Still don't know why....

I had to find a solution to unbrick it.


After opening the box, you can see an unpopulated USB connector.

This was not useful (i tried soldering usb connector, but this didn't give acess to console mode).

I had to search for Tx / RX /GND.


I am using FTDI connector you can see here : FTDI 2303 for ATMEGA sketch upload : some problems resolved.

I have been wiring + 5V and GND to USB connector, and founded RX and TX on PCB.

Here is power connection : GND and 5V :




Here is the RX pad soldered , TX pad is just below






After this i used FTDI to connect to my computer.

Using putty to open terminal/console ; baud rate is 56700.


Now you are logged in , Tenda A6 is speaking to you ;-)  


Capture d’écran 2014-05-27 à 21.12.30.png


After that you have to run TFTP server on your computer, connect via Ethernet, and configure option for uploading firmware.


Anything is well explained  here :


Next setup your computer ip address to and install a tftp server (I used the one provided by TENDA) you can find it here -> 

Regarding the tftp server: 
Create a folder called "tftp" to your c:\ partition and extract into the "tftp" folder the content of the archive "TENDA" (TENDA TFTP.exe file), than move into the "tftp" folder the firmware that you want to upload (let`s call it "new_firmware.bin") and run "TENDA TFTP.exe", click the "browse" button and select "c:\tftp" and hit "ok". The tftp server it runs on port 69. 

Now download "putty" from here -> 
Run "putty.exe", setup -> on "Connection type" select "Serial", on "Host name" enter "COM3" (note I have COM3 but it might be any number you can check it in Device Manager) and click OPEN. 

Now, using a UTP Cable connect your computer to the switch port 1-4 of the router, next connect the serial cable (level converter...etc) to the router and the power cable to the router (power led of the router will turn green). 

Back to putty window: 
As soon as you see in your putty window this output press 2 (key 2) you have 1 second to do that: 

U-Boot 1.1.3 (Feb 13 2009 - 09:48:32) 

Board: Ralink APSoC DRAM:  32 MB 
relocate_code Pointer at: 81fac000 
flash_protect ON: from 0xBF000000 to 0xBF01FFAF 
protect on 0 
protect on 1 
protect on 2 
protect on 3 
protect on 4 
protect on 5 
protect on 6 
protect on 7 
protect on 8 
flash_protect ON: from 0xBF030000 to 0xBF03FFFF 
protect on 10 
*** Warning - bad CRC, using default environment 

Ralink UBoot Version: 3.2 
ASIC 3052_MP2 (Port5<->None) 
Total memory: 32 MBytes 
Date:Feb 13 2009  Time:09:48:32 
icache: sets:256, ways:4, linesz:32 ,total:32768 
dcache: sets:128, ways:4, linesz:32 ,total:16384 

 ##### The CPU freq = 384 MHZ #### 

 SDRAM bus set to 32 bit 
 SDRAM size =32 Mbytes 

Please choose the operation: 
   1: Load system code to SDRAM via TFTP. 
   2: Load system code then write to Flash via TFTP. 
   3: Boot system code via Flash (default). 
   4: Entr boot command line interface. 
   9: Load Boot Loader code then write to Flash via TFTP.

Press 2 fast (max 1 second to do need to be fast) 

If you got it you will see this: 

You choosed 2 

Eth0 (10/100-M) 
 enetvar=ethaddr,Eth addr:00:AA:BB:CC:DD:10 

 eth_current->name = Eth0 (10/100-M) 

2: System Load Linux Kernel then write to Flash via TFTP. 
 Warning!! Erase Linux in Flash then burn new one. Are you sure?(Y/N)

Hit Y (key Y) and you will see this: 

 Please Input new ones /or Ctrl-C to discard 
        Input device IP ( ==: 

Write the ip of the W311R ( like this and hit enter: 

       Input device IP ( ==: 

Next you will see: 

        Input server IP ( ==:

Write the ip of your computer (where the tftp server is running like this and hit enter: 

        Input server IP ( ==:

Next you will see: 

        Input Linux Kernel filename () ==:

Write the firmware name that you want to upload (and it is located under c:\tftp folder ... in our case new_firmware.bin) like this and hit enter 

        Input Linux Kernel filename () ==:new_firmware.bin

Now, if you did all that I said and not other things you will see this: 

... netboot_common, argc= 3 
 *************buf = 0x81fcc120 
 **********NexTxPacket = 81fe4200 

 NetTxPacket = 0x81FE4200 

 NetRxPackets[0] = 0x81FE4800 

 NetRxPackets[1] = 0x81FE4E00 

 NetRxPackets[2] = 0x81FE5400 

 NetRxPackets[3] = 0x81FE5A00 

 NetRxPackets[4] = 0x81FE6000 

 NetRxPackets[5] = 0x81FE6600 

 NetRxPackets[6] = 0x81FE6C00 

 NetRxPackets[7] = 0x81FE7200 

 NetRxPackets[8] = 0x81FE7800 

 NetRxPackets[9] = 0x81FE7E00 

 NetRxPackets[10] = 0x81FE8400 

 NetRxPackets[11] = 0x81FE8A00 

 NetRxPackets[12] = 0x81FE9000 

 NetRxPackets[13] = 0x81FE9600 

 NetRxPackets[14] = 0x81FE9C00 

 NetRxPackets[15] = 0x81FEA200 

 NetRxPackets[16] = 0x81FEA800 

 NetRxPackets[17] = 0x81FEAE00 

 NetRxPackets[18] = 0x81FEB400 

 NetRxPackets[19] = 0x81FEBA00 

 KSEG1ADDR(NetTxPacket) = 0xA1FE4200 

 NetLoop,call eth_halt ! 

 NetLoop,call eth_init ! 
Trying Eth0 (10/100-M) 

 Waitting for RX_DMA_BUSY status Start... done 

 Header Payload scatter function is Disable !! 

Using Eth0 (10/100-M) device 
TFTP from server; our IP address is 
Filename 'new_firmware.bin'. 

 TIMEOUT_COUNT=10,Load address: 0x80100000 
Loading: Got ARP REPLY, set server/gtwy eth addr (xx:xx:xx:xx:xx:xx) 
Got it 
T # 
 first block received 
Bytes transferred = 2263332 (228924 hex) 
NetBootFileXferSize= 00228924 
Erase linux kernel block !! 
From 0xBF050000 To 0xBF27FFFF 

 b_end =BF3FFFFF 
Erase Flash from 0xbf050000 to 0xbf27ffff in Bank # 1 

 erase sector  = 12 
sect = 12,s_last = 46,erase poll = 1162313 

 erase sector  = 13 
*sect = 13,s_last = 46,erase poll = 1129504 

 erase sector  = 14 
sect = 14,s_last = 46,erase poll = 1140228 

 erase sector  = 15 
*sect = 15,s_last = 46,erase poll = 1157035 

 erase sector  = 16 
sect = 16,s_last = 46,erase poll = 1139250 

 erase sector  = 17 
*sect = 17,s_last = 46,erase poll = 1129126 

 erase sector  = 18 
sect = 18,s_last = 46,erase poll = 1139748 

 erase sector  = 19 
*sect = 19,s_last = 46,erase poll = 1129480 

 erase sector  = 20 
sect = 20,s_last = 46,erase poll = 1139490 

 erase sector  = 21 
*sect = 21,s_last = 46,erase poll = 1143826 

 erase sector  = 22 
*sect = 22,s_last = 46,erase poll = 1162855 

 erase sector  = 23 
sect = 23,s_last = 46,erase poll = 1128879 

 erase sector  = 24 
*sect = 24,s_last = 46,erase poll = 1139675 

 erase sector  = 25 
sect = 25,s_last = 46,erase poll = 1129157 

 erase sector  = 26 
*sect = 26,s_last = 46,erase poll = 1139747 

 erase sector  = 27 
sect = 27,s_last = 46,erase poll = 1129426 

 erase sector  = 28 
*sect = 28,s_last = 46,erase poll = 1166804 

 erase sector  = 29 
sect = 29,s_last = 46,erase poll = 1129289 

 erase sector  = 30 
*sect = 30,s_last = 46,erase poll = 1139221 

 erase sector  = 31 
sect = 31,s_last = 46,erase poll = 1129088 

 erase sector  = 32 
*sect = 32,s_last = 46,erase poll = 1139862 

 erase sector  = 33 
*sect = 33,s_last = 46,erase poll = 1129024 

 erase sector  = 34 
sect = 34,s_last = 46,erase poll = 1140403 

 erase sector  = 35 
*sect = 35,s_last = 46,erase poll = 1129116 

 erase sector  = 36 
sect = 36,s_last = 46,erase poll = 1155807 

 erase sector  = 37 
*sect = 37,s_last = 46,erase poll = 1152082 

 erase sector  = 38 
sect = 38,s_last = 46,erase poll = 1157580 

 erase sector  = 39 
*sect = 39,s_last = 46,erase poll = 1134264 

 erase sector  = 40 
sect = 40,s_last = 46,erase poll = 1130220 

 erase sector  = 41 
*sect = 41,s_last = 46,erase poll = 1130296 

 erase sector  = 42 
sect = 42,s_last = 46,erase poll = 1130919 

 erase sector  = 43 
*sect = 43,s_last = 46,erase poll = 1118854 

 erase sector  = 44 
*sect = 44,s_last = 46,erase poll = 1130192 

 erase sector  = 45 
sect = 45,s_last = 46,erase poll = 1118694 

 erase sector  = 46 
*sect = 46,s_last = 46,erase poll = 1185088 
Erased 35 sectors 
 Copy linux image[2263332 byte] to Flash[0xBF050000].... 
Copy to Flash... 
 Copy 2263332 byte to Flash... 
 addr = 0xBF0A33B6 ,cnt=1922414 
 addr = 0xBF0F6762 ,cnt=1581506 
 addr = 0xBF149AE6 ,cnt=1240638 
 addr = 0xBF19CE7E ,cnt=899750 
 addr = 0xBF1F01F8 ,cnt=558892 
 addr = 0xBF243588 ,cnt=218012 done 
## Booting image at bf050000 ... 
   Image Name:   linkn Kernel Image 
   Created:      2009-02-09  13:26:01 UTC 

 System Control Status = 0x20440000 
   Image Type:   MIPS Linux Kernel Image (lzma compressed) 
   Data Size:    2263268 Bytes =  2.2 MB 
   Load Address: 80000000 
   Entry Point:  803cd000 
   Verifying Checksum ... OK 
   Uncompressing Kernel Image ... OK 
No initrd 
## Transferring control to Linux (at address 803cd000) ... 
## Giving linux memsize in MB, 32 

Starting kernel ... 

LINUX started... 

Linux version 2.6.21 (root@linux-6091) (gcc version 3.4.2) #452 Mon Feb 9 21:25:31 CST 2009 

 The CPU feqenuce set to 384 MHz 
CPU revision is: 0001964c 
Determined physical RAM map: 
 memory: 02000000 @ 00000000 (usable) 
Initrd not found or empty - disabling initrd 
Built 1 zonelists.  Total pages: 8128 
Kernel command line: console=ttyS1,57600n8 root=/dev/ram0 
Primary instruction cache 32kB, physically tagged, 4-way, linesize 32 bytes. 
Primary data cache 16kB, 4-way, linesize 32 bytes. 
Synthesized TLB refill handler (20 instructions). 
Synthesized TLB load handler fastpath (32 instructions). 
Synthesized TLB store handler fastpath (32 instructions). 
Synthesized TLB modify handler fastpath (31 instructions). 
Cache parity protection disabled 
cause = 800068, status = 1100ff00 
PID hash table entries: 128 (order: 7, 512 bytes) 
calculating r4koff... 00177000(1536000) 
CPU frequency 384.00 MHz 
Using 192.000 MHz high precision timer. 
Console: colour dummy device 80x25 
Dentry cache hash table entries: 4096 (order: 2, 16384 bytes) 
Inode-cache hash table entries: 2048 (order: 1, 8192 bytes) 
Memory: 27328k/32768k available (3378k kernel code, 5440k reserved, 510k data, 1116k init, 0k highmem)
Mount-cache hash table entries: 512 
NET: Registered protocol family 16 
NET: Registered protocol family 2 
Time: MIPS clocksource has been installed. 
IP route cache hash table entries: 1024 (order: 0, 4096 bytes) 
TCP established hash table entries: 1024 (order: 1, 8192 bytes) 
TCP bind hash table entries: 1024 (order: 0, 4096 bytes) 
TCP: Hash tables configured (established 1024 bind 1024) 
TCP reno registered 
detected lzma initramfs 
detected lzma initramfs 
initramfs: LZMA lc=3,lp=0,pb=2,dictSize=1048576,origSize=3976704 
LZMA initramfs by Ming-Ching Tiew <>.............................................................Load RT2880 Timer Module(Wdg/Soft) 
squashfs: version 3.2-r2 (2007/01/15) Phillip Lougher 
squashfs: LZMA suppport for by jro 
io scheduler noop registered (default) 
Ralink gpio driver initialized 
HDLC line discipline: version $Revision: $, maxframe=4096 
N_HDLC line discipline registered. 
Serial: 8250/16550 driver $Revision: 1.3 $ 2 ports, IRQ sharing disabled 
serial8250: ttyS0 at I/O 0xb0000500 (irq = 37) is a 16550A 
serial8250: ttyS1 at I/O 0xb0000c00 (irq = 12) is a 16550A 
RAMDISK driver initialized: 16 RAM disks of 8192K size 1024 blocksize 
loop: loaded (max 8 devices) 
rdm_major = 254 
GDMA1_MAC_ADRH -- : 0x00000000 
GDMA1_MAC_ADRL -- : 0x00000000 
Ralink APSoC Ethernet Driver Initilization. v1.60  256 rx/tx descriptors allocated, mtu = 1500! 
NAPI enable, weight = 0, Tx Ring = 256, Rx Ring = 256 
GDMA1_MAC_ADRH -- : 0x00000100 
GDMA1_MAC_ADRL -- : 0x000c4330 
PPP generic driver version 2.4.2 
PPP BSD Compression module registered 
NET: Registered protocol family 24 
2860 version : (Feb  9 2009) 

=== pAd = c0000000, size = 485320 === 

<-- RTMPAllocAdapterBlock, Status=0 
ralink flash device: 0x1000000 at 0xbf000000 
Ralink SoC physically mapped flash: Found 1 x16 devices at 0x0 in 16-bit bank 
 Amd/Fujitsu Extended Query Table at 0x0040 
number of CFI chips: 1 
cfi_cmdset_0002: Disabling erase-suspend-program due to code brokenness. 
Creating 4 MTD partitions on "Ralink SoC physically mapped flash": 
0x00000000-0x00030000 : "Bootloader" 
0x00030000-0x00040000 : "Config" 
0x00040000-0x00050000 : "Factory" 
0x00050000-0x00400000 : "Kernel" 
block2mtd: version $Revision: $ 
nf_conntrack version 0.5.0 (256 buckets, 2048 max) 
arp_tables: (C) 2002 David S. Miller 
IPv4 over IPv4 tunneling driver 
GRE over IPv4 tunneling driver 
ip_tables: (C) 2000-2006 Netfilter Core Team, Type=Fully Cone 
TCP cubic registered 
NET: Registered protocol family 1 
NET: Registered protocol family 10 
NET: Registered protocol family 17 
802.1Q VLAN Support v1.8 Ben Greear <> 
All bugs added by David S. Miller <> 
Freeing unused kernel memory: 1116k freed 
init started: BusyBox v1.12.1 (2009-02-09 21:19Algorithmics/MIPS FPU Emulator v1.5 
:29 CST) 
starting pid 14, tty '': '/etc_ro/rcS' 
devpts: called with bogus options 
mount: mounting none on /proc/bus/usb failed: No such file or directory 
Welcome to 
     _______  _______  ___     __  ____   _kernel reg pid 21 success . 
  _   ___ 
    |  ___  \|   __  ||   |   |__||    \ | || | /  / 
    | |___| ||  |__| ||   |__  __ |     \| || |/  / 
    |   _   /|   _   ||      ||  || |\     ||     \ 
    |__| \__\|__| |__||______||__||_| \____||_|\___\ 

                     =System Architecture Department= 


      ****** WeLoveLinux ****** 

 Welcome to ... 
httpd Reg gpio hook success . 
starting pid 25, tty '/dev/ttyS1': '/bin/sh' 

BusyBox v1.12.1 (2009-02-09 21:19:29 RX DESC a04ad000  size = 2048 
CST) built-in shell (ash) 
Enter<-- RTMPAllocTxRxRingMemory, Status=0 
 'help' for a list of built-in commands. 

# 1. Phy Mode = 9 
2. Phy Mode = 9 
3. Phy Mode = 9 
MCS Set = ff 00 00 00 01 
Main bssid = 00:b0:0c:01:45:78 
The UUID Hex string is:2880288028801880a88000b00c014578 
The UUID ASCII string is:28802880-2880-1880-a880-00b00c014578! 
<==== RTMPInitialize, Status=0 
0x1300 = 00064380 
getIfLive: device eth2.1 not found. 
Commit crc = d253c90f 
Wan[00:B0:0C:GDMA1_MAC_ADRH -- : 0x00000100 
GDMA1_MAC_ADRL -- : 0x00b00c01 

phy_tx_ring = 0x01d81000, tx_ring = 0xa1d81000, size: 16 bytes 

phy_rx_ring = 0x01d82000, rx_ring = 0xa1d82000, size: 16 bytes 
GDMA1_FWD_CFG = 10000 
eth2.1: Setting MAC address to  xx xx xx xx xx xx. 
VLAN (eth2.1):  Underlying device (eth2) has same MAC, not checking promiscious mode. 
eth2.2: Setting MAC address to  xx xx xx xx xx xx. 
device eth2 entered promiscuous mode 
VLAN (eth2.2):  Setting underlying device (eth2) to promiscious mode. 
getIfLive: device br0 not found. 
eth2.1: dev_set_promiscuity(master, 1) 
device eth2.1 entered promiscuous mode 
Router ip address config success. 
br0: port 1(eth2.1) entering learning state 
device ra0 entered promiscuous mode 
br0: port 2(ra0) entering learning state 
libupnp: using UDP SSDP_PORT = 1900 
br0: topology change detected, propagating 
br0: port 1(eth2.1) entering forwarding state 
br0: topology change detected, propagating 
br0: port 2(ra0) entering forwarding state 
killall: udhcpd: no process killed 
ND -> Bad_Sig_entry [18]... 
httpd listen ip = port = 80 
MfgThread start loop. 
TendaLog -> ok rtn. 
macBcast uses obsolete (PF_INET,SOCK_PACKET) 
IsSameNET [][] 
sntp: host not found 
killall: dnrd: no process killed 
iptables: Bad rule (does a matching rule exist in that chain?) 
iptables: Bad rule (does a matching rule exist in that chain?) 
route: ioctl 0x890b failed: File exists 
libupnp: using UDP SSDP_PORT = 1900 
upnpd[289]: UPnP SDK Successfully Initialized. 
Mar 29 09:36:22 upnpd[289]: UPnP SDK Successfully Initialized. 
upnpd[289]: Succesfully set the Web Server Root Directory. 
Mar 29 09:36:22 upnpd[289]: Succesfully set the Web Server Root Directory. 
upnpd[289]: IGD root device successfully registered. 
Mar 29 09:36:23 upnpd[289]: IGD root device successfully registered. 
iptables: No chain/target/match by that name 
iptables: No chain/target/match by that name 
iptables: No chain/target/match by that name 
Startnat end. 
upnpd[289]: Advertisements Sent.  Listening for requests ... 
Mar 29 09:36:25 upnpd[289]: Advertisements Sent.  Listening for requests ... 
............ wan unlink ..4. 
............ wan unlink ..5. 

Now your router is back on track and it can be accessed from with user: admin and password: admin . Don`t forget to do a "reset to default" to be sure that all settings are set to default. 



Same thing for other routers : you have to find RX/TX/ground, and have a firmware/bootloader if you want.

Don't know if DDWRT is compatible, A6 hardware is interesting (16MB) wifi, RX / TX and baudrate are public, hope it's help.


2 Poster un commentaire

Internet of things : Cablage et config Arduino promini/FTDI/Ethernet ENC28J60

Plutôt que de gérer mes documents du moment par des bookmarks, je publie ici des notes sur une réflexion technique en cours concernant "l'internet of things" ou internet des objets.


Le monde tel que nous l 'avons connu se métamorphose sous nos yeux, et après la connexion des ordinateurs, puis des mobiles et tablettes vient maintenant le temps de la connexion des objets.


Ce qui est ici intéressant est l'utilisation possible de l'open source et de l'open hardware pour que nous apprivoisions ces objets, et qu'ils puissent échanger des données que nous maitrisons.


Dans cette optique , j ai commencé un projet d'interface web/arduino, basé sur des composants ultra low cost : arduino, et interface ENC28J60. Je compte vérifier la faisabilité avec les versions miniaturisées pro mini.


Ceci permet d'échanger des données avec le web, donc de fabriquer des objets du quotidien qui nous renvoient ces données de façon ergonomique, agréable (plutôt qu 'en consultant une page web).


Et inversement, les capteurs peuvent remonter des données vers le web, le cloud, un serveur déporté....


Le premier projet est un truc de bord de mer : une horloge a marée qui fonctionne !

En effet celles du commerce ne sont jamais à l'heure , puisque les marées changent.

Récupération des données sur internet, formatage , puis affichage....


Capture d’écran 2014-05-10 à 11.24.28.png



Récupération des données web :


Récupérer des données web, c'est faire du scraping ou "harvesting", et c'est déjà un métier en soi : les moteurs de recherche le font, et beaucoup de banques de données sont alimentées par des algorithmes de scraping.


Ici toutefois nous n'allons pas faire "lourd" donc pas de serveur pour le data mining ou le formatage des données, on va faire au plus court.


Après avoir cherché les fonctionnalités des librairies dispo avec l'ENC28J60, Ether a récemment mis a disposition une fonction permettant de prolonger une connexion TCP/IP : ether.persistTcpConnection(true) ; un lien vers un exemple d'utilisation se trouve en bas de page.


Il y a dans ce cas nécessité de réduire la page au maximum, afin de ne pas avoir trop de données en entrée, et ceci peut se faire en ligne : plusieurs moteurs de flux RSS permettent la création de flux a partir de pages web , dont feed43 et yahoo pipes.


Capture d’écran 2014-05-10 à 13.18.28.png


Ils nécessitent un apprentissage, mais sont intéressants, et peuvent être combinés et utilisés de façon concomitante.

En pointant la librairie Ether vers la page du flux rss, on récupère des données bien formatées, avec éventuellement des arguments et balises ("fabriquées" dans feed43) : ci dessous flux feed43 en entrée de yahoo pipes.


Capture d’écran 2014-05-10 à 13.21.28.png




Ceci a toutefois quelques inconvénients : le délai de mise a jour du flux RSS est de 6 heures pour une utilisation gratuite (feed43) , et un maillon supplémentaire dans la chaine est un risque technique supplémentaire.

J 'ai donc basculé vers l'utilisation de la lib UIPEthernet, qui gère bien mieux la pile TCP/IP et permet de gober d'un coup une grosse page web avec une carte arduino ; ne pas oublier de reconfigurer le pinout (CS sur pin 10 au lieu de 8).


Exemple de code ci dessous, j ai passé le baudrate à 115200, ça va plus vite ;-) 





Après avoir regardé du coté de, une librairie qui permet de parser les données, j ai décidé de reprendre les choses avec feed43 et yahoo pipes, afin de formater et baliser les données issues de la page web.


- ici la page web d origine des données :

- ici le flux rss sortant de :

- ici le flux sortant de yahoo pipes, en provenance de feed43 avec les balises permettant le parsing. (HH avant les heures, MM avant les hauteurs d'eau, CO avant les coefficients).

les fonctions regex de yahoo pipes sont très puissantes et permettent une mise en forme et l'intégration de balises au flux rss.


Capture d’écran 2014-05-10 à 16.39.14.png



Seul le dernier coefficient de marée n'a pas été tagué, car il ne m'est pas utile.


Ne reste plus qu'a récupérer le flux yahoo pipes rss avec l arduino, utiliser la méthode PHP proposée par pipes, ce qui nous donne un lien utilisable par notre lib Arduino ;  code Arduino :


#include <SPI.h>
#include <UIPEthernet.h>

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// if you don't want to use DNS (and reduce your sketch size)
// use the numeric IP instead of the name for the server:
//IPAddress server(74,125,232,128); // numeric IP for Google (no DNS)
char server[] = ""; // name address for Google (using DNS)

// Set the static IP address to use if the DHCP fails to assign
IPAddress ip(192,168,0,177);

// Initialize the Ethernet client library
// with the IP address and port of the server
// that you want to connect to (port 80 is default for HTTP):
EthernetClient client;

void setup() {
// Open serial communications and wait for port to open:
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only

// start the Ethernet connection:
if (Ethernet.begin(mac) == 0) {
Serial.println("Failed to configure Ethernet using DHCP");
// no point in carrying on, so do nothing forevermore:
// try to congifure using IP address instead of DHCP:
Ethernet.begin(mac, ip);
// give the Ethernet shield a second to initialize:

// if you get a connection, report back via serial:
if (client.connect(server, 80)) {
// Make a HTTP request:
client.println("GET /pipes/ HTTP/1.1");
client.println("Connection: close");
else {
// kf you didn't get a connection to the server:
Serial.println("connection failed");

void loop()
// if there are incoming bytes available
// from the server, read them and print them:
if (client.available()) {
char c =;

// if the server's disconnected, stop the client:
if (!client.connected()) {

// do nothing forevermore:



Ce qui nous envoie sur la console série de l'arduino :


HTTP/1.1 200 OK
Date: Sat, 10 May 2014 15:26:28 GMT
Access-Control-Allow-Origin: *
Cache-Control: public, max-age=900
Content-Type: text/php; charset=utf-8
Age: 0
Connection: close
Via: http/1.1 (ApacheTrafficServer/4.0.2 [cMsSfW])
Server: ATS

a:2:{s:5:"count";i:1;s:5:"value";a:6:{s:5:"title";s:7:"marées";s:11:"description";s:12:"Pipes Output";s:4:"link";s:75:"";s:7:"pubDate";s:31:"Sat, 10 May 2014 15:26:28 +0000";s:9:"generator";s:29:"";s:5:"items";a:1:{i:0;a:4:{s:5:"title";s:152:"Sam. 10 HH04h21 HH11h00 HH16h56 HH23h26 MM8,75m MM3,75m MM9,00m MM3,55m CO46 CO52 Dim. 11 HH05h17 HH11h54 HH17h46 MM9,30m MM3,20m MM9,55m CO57 63";s:7:"y:title";s:152:"Sam. 10 HH04h21 HH11h00 HH16h56 HH23h26 MM8,75m MM3,75m MM9,00m MM3,55m CO46 CO52 Dim. 11 HH05h17 HH11h54 HH17h46 MM9,30m MM3,20m MM9,55m CO57 63";s:7:"content";s:152:"Sam. 10 HH04h21 HH11h00 HH16h56 HH23h26 MM8,75m MM3,75m MM9,00m MM3,55m CO46 CO52 Dim. 11 HH05h17 HH11h54 HH17h46 MM9,30m MM3,20m MM9,55m CO57 63";s:11:"description";N;}}}}


Voilà, les horaires de marées + coef + marnages sont formatés et balisés et a disposition dans l arduino, reste plus qu'à les parser, ce qui va être easy.


La suite bientôt....











Aide mémoire de configuration

Promini alimentée en 3v3 pour compatibilité modules RF / éthernet / RFID

Pro mini tourne sous voltée sans aucun problème ; finalement si : le port série ne suuit pas les instructions console et se cale sur un baudrate différent

FTDI reconnu en dev/tty/usbserial sous mac OS

Carte configurée en arduino pro ou pro mini (3,3V 8MHZ) w ATmega 328 dans le log Arduino

Connection FTDI :  RX au TX carte et RX au TX carte.






Cablage du shield ethernet ENC28J60

Capture d’écran 2014-05-08 à 19.36.54.png




La lib compatible avec ENC28J60 :  Ethercard


Cablage d'apres la lib : pas de pin reset ni de int/D2

Capture d’écran 2014-05-09 à 13.42.20.png



Difficultés de gestion de la pile TCP/IP > non gestion de la pile / buffer avec la lib Ether deux solutions :

fonction ether.persistTcpConnection(true) de  Clark, un peu sport.


ou mieux utiliser la lib UIPethernet, qui implémente la gestion de TCP/IP  pile d’Adam Dunkels et gère la persistance.

Cablage de pin : attention CS sur pin dix pour cette lib.

Gros avantage : compatible avec la lib Ethernet "stock" arduino.




 sraping page Web sur lib UIPEthernet : juste modifier le nom de la lib en UIPEthernet, et ça roule


  Web client
 This sketch connects to a website (
 using an Arduino Wiznet Ethernet shield. 
 * Ethernet shield attached to pins 10, 11, 12, 13
 created 18 Dec 2009
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe, based on work by Adrian McEwen

#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
// if you don't want to use DNS (and reduce your sketch size)
// use the numeric IP instead of the name for the server:
//IPAddress server(74,125,232,128);  // numeric IP for Google (no DNS)
char server[] = "";    // name address for Google (using DNS)

// Set the static IP address to use if the DHCP fails to assign
IPAddress ip(192,168,0,177);

// Initialize the Ethernet client library
// with the IP address and port of the server 
// that you want to connect to (port 80 is default for HTTP):
EthernetClient client;

void setup() {
 // Open serial communications and wait for port to open:
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only

  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    // try to congifure using IP address instead of DHCP:
    Ethernet.begin(mac, ip);
  // give the Ethernet shield a second to initialize:

  // if you get a connection, report back via serial:
  if (client.connect(server, 80)) {
    // Make a HTTP request:
    client.println("GET /search?q=arduino HTTP/1.1");
    client.println("Connection: close");
  else {
    // kf you didn't get a connection to the server:
    Serial.println("connection failed");

void loop()
  // if there are incoming bytes available 
  // from the server, read them and print them:
  if (client.available()) {
    char c =;

  // if the server's disconnected, stop the client:
  if (!client.connected()) {

    // do nothing forevermore:




2 Poster un commentaire

Arduino, Lecteur RFID CPS3 à 15 euros

En décembre 2008, la société Oberthur remportait pour un peu plus de 5 ME le marché de fourniture de la nouvelle carte vitale professionelle.


A l'époque , le NFC (near field contact), le RFID, étaient totalement "hype" : à la mode, un truc qui allait emmener notre médecine dans le 21 ème siècle.


LE RFID permet de transmettre des informations sans contact, technologie utilisée pour la cartes de métro par exemple.


Cinq années plus tard nous y sommes, j ai bien ma carte CPS3, mais le RFID payé par mes (nos) impôts ne me sert à rien.


Vu que je ne vois rien venir qui m'intéresse ( des lecteurs RFID pour la cantine des hopitaux...), j ai monté un petit lecteur RFID compatible avec la CPS3.


Son cout est de moins de 15 euros, et il est totalement modulable, puisqu'on a accès au code ; les fonctions d'écriture n'ont pas été testées (il faut éviter les intrusions dans des systêmes de traitement de données) et la CPS3 ne peut aparement pas "prendre du code" en RFID (protection bas niveau embarquée?).


La consultation de documents CPS m'a fait penser que le NXP RC522 serait un bon candidat pour causer à notre CPS3 : la fréquence de travail est le 13.56MHZ, comme d'ailleurs les Skylanders, des jouets RFID.


L'utilisation d'une carte arduino "toute faite" n'est pas top, la tension de travail étant de 5,5v et ne correspondant pas a la carte RFID : mieux vaut repartir des composants.


Le matériel nécessaire comporte un ATMEGA, une bredboard, une carte RFID mifare NXP RC522, et une interface USB que j 'ai un peu bidouillé afin d'y ajouter un reset (hacker un composant CMS, c'est aussi possible avec la datasheet du composant et c’est en fait très simple avec la bonne méthode).

Ce reset permet l'upload sans reset manuel sur l'atmega ; autre solution : bien faire vos courses, et prendre un loader usb avec un pin reset....


Le total des achats doit avoisiner les 15 euros.


Ce qui est ensuite un peu compliqué, c est que la carte RFID tourne en 3,3v, y compris sur le port I2C/SPI ; le mieux est donc de se fabriquer une arduino qui tourne en 3,3v pour ne pas se fader la conversion de voltage des signaux logiques.


Le premier montage est donc une arduino très basique sur bredboard, tournant en 5,5v, à 12MHZ, avec un quartz + 2 condensateurs de 22pf. (ou un résonateur).


Tout est très bien expliqué ici.


Une fois ce montage fonctionnel, on peut uploader un bootloader en 8MHZ, qui ne nécessitera pas de quartz (utilisation de l'horloge "interne" de l atmega) , et passer en 3,3v ; on peut ensuite enlever quartz et condos.


Ne pas oublier de changer le type de carte dans les préférences logicielles (lilypad@8MHZ) , pour pouvoir loader du code.


Il ne reste ensuite qu'à  cabler la carte RFID, trouver un bout de code avec les bibliothèques qui vont bien, et le retravailler, et le tour est joué.


Je peux lire ma carte CPS , son numéro de série (dans un premier temps), et jouer starwars sur un buzzer (que j ai recupéré sur une manette WII cassée) ; vous remarquerez que c 'est le code d'identification de la CPS3 qui déclenche la musique, et pas le Skylander.


Voici donc une Oraison pour le départ de M. Jean Yves Robin de la diection de l ASIP, jouée avec ma CPS3 en mode RFID.

La carte arduino permet ensuite tous types de développements : intégrer des relais par exemple (controle d accès).


Et bien entendu, on peut utiliser des tags RFID, pour tous types de dev.























0 Poster un commentaire

FTDI 2303 for ATMEGA sketch upload : some problems resolved

I've been using FDTI 2303 usb link for ATMEGA sketch upload.

Here is a very good HOWTO.


But some informations may be useful :


About FTDI USB  PL2303 , i've been buying in HK, it's possible to add a reset pin, soldering a capacitor on pin 2 : low cost ftdi don't have reset pin for arduino/ATmega.





You have to solder a ceramic capacitor (104 / 0.1uF) on pin 2 : DTR.

I've been using superglue to stick capacitor on the 2303 chip ; after that it was easy to place capacitor leg on pin DTR and just heat with the welding iron. (i had put solder on capacitor leg before this step).


I didn't think it was possible to hack CMS component before that.





Now with this 2303 USB FTDI, it's possible to auto reset ATMEGA while uploading.


For testing FTDI 2303 installation and drivers, a very simple way is to put a jumper on TX/RX pin and to open a terminal : every information you send on rx will be forwarded to tx, and will echo in terminal, if anything goes right.


Second thing : i have been making a breduino, using his own power supply.


After testing, you have to connect GND from FTDI GND to ATMEGA GND, or sketch will not upload.


Last thing : txd pin from FTDI is connected to ATMEGA RXD pin2 thru a 10k resistor.


And RXD pin from FTDI is connected to TXD ATMEGA pin 3.


Using this configuration, sketchs now upload to atmega.


FINALLY : FTDI on my MBA, blink led sketch on pin 12, Breduino DIY with ATMEGA, and very nice power supply for breadboards. Many parts coming from Ebay Seller HK : czb6721960





0 Poster un commentaire

Carte Vitale, la plus grande mystification de la sécurité informatique ?

Depuis de nombreuses années, la France se distingue par une innovation assez datée, la carte vitale et la carte professionnelle de santé, qui "sécurisent" les informations et transactions concernant les patients ; c'est dumoins ce qui nous a été vendu.


Un peu d'historique et début des soupçons :


IL y a trois ans, lors d'un formatage de lot avant la télétransmission des actes effectués au cours de la journée, une erreur s'est glissée dans un lot (microcoupure?) et ce lot altéré n'était donc plus en état d'être télétransmis.


La cpam locale me dit de prendre contact avec mon éditeur de logiciel, auquel j'ai donc envoyé ce lot corrompu, et qui me le répara ; une fois reçu je l'ai retélétransmis.


Et puis je réalise alors que ce lot a été lu, réparé, et remis en forme sans ma carte vitale professionelle et sans la carte vitale des patients, j'interroge mon éditeur, ses explications sont "confuses".

Armé de mon éditeur de texte, je vais donc à la recherche d'un fichier B2 à télétransmettre et l'ouvre, je découvre alors que rien (ou presque) n'est crypté - chiffré plus exactement.


Il est donc possible à cette époque de fabriquer ou réparer des factures FSE non rejetées par la sécurité sociale sans CPS, sans lecteur de carte vitale, avec un simple éditeur de texte.


Quelques années passent, nouveau cahier des charges CPS 1.40, nouvelle carte CPS (appel d'offre initial de fabrication à 3 millions d euros.....) , je me dis que le progrès est passé par là.



Et puis à la suite d'une discussion le doute m'amène à reprendre quelques investigations :


je découvre que rien (ou pas grand chose) n'a changé : les fichiers de télétransmission ne sont quasi pas chiffrés , et contiennent les informations d'identification : du médecin, mais aussi du patient (numéro de sécurité sociale et date de naissance), acte en tiers payant, bénéfice de la CMU, grossesse avec date de début, accident de travail, et codage des actes en ATM (qui semble une simple translation et non pas un chiffrement des actes).


Depuis la version 1.40 certains éléments sont chiffrés, le cahier des charges n'indique pas les quels, et je me demande finalement ce qui l'est vraiment : les codes des actes semblent simplement "translatés", et non pas chiffrés : le codage des actes CCAM indique précisément ce qui a été fait au patient (tumorectomie du sein...) mais ne figure pas en l'état, est utilisé un codage dit ATM, qui est une description précise de ce qui qui a été réalisé, mais la liste ATM des actes est "confidentielle" (disponible dans tous les organismes de sécurité sociale).


Toutes ces informations non chiffrées sont lisibles plus facilement avec un utilitaire B2viewer.exe qui permet une remise en forme, et cet utilitaire se trouve sur internet en trois click (avec les versions d'essai des logiciels médicaux).


Pour ceux qui s'intéressent à la totalité des informations transitant ainsi par internet le cahier des charges de la norme B2 est disponible ici et n'a pas évolué depuis 2007.


Pourquoi s'émouvoir de cette situation ?


Tout d'abord par ce que le ministère, l'ASIP et les industriels nous ont toujours vendu de la sécurité et du cryptage, du chiffrement et s'apercevoir qu'aucune des sécurité promise n'a été activée est tout de même déstabilisant : le lecteur CPS, les certificats de sécurité, les fonctions de cryptage, quasi rien n'est fonctionnel, et tout ce bazar ne sert qu'a mettre en forme des fichiers ASCII lisibles et modifiables avec un simple éditeur notepad. (quelques éléments sont chiffrés mais je ne sais pas à quoi ils correspondent, peut être des vérifications d'intégrité).


Ce qui nous est vendu ne correspond pas à la réalité : aucune des clefs publiques de la carte cps ne me semble utilisée (sauf peut être pour le chiffrement très discret visible dans les fichiers B2 mais en tout cas pas pour le transport des flux)  et les documents contractuels précisant le niveau de chiffrement et la technologie employée n'existent pas : on nous vend du marketing, pas de la sécurité.


A l'heure de la privatisation de la sécurité sociale par les complémentaires, qu'en est t'il du secret médical lorsque le codage des actes ATM permet de connaitre par la "banqueassurance" du patient, ce qui a été fait, à quelle date, et par qui (généraliste, psychiatre, cancérologue...) ?


Et enfin dernier élément : ces informations transitent par des relais mails SMTP, et par les dorsales et backbones du net, et sont aussi enregistrés, captés et stockés, si l'on en croit les récentes révélations concernant le programme PRISM et ses équivalents nationaux.


Quitte a payer un lecteur CPS, et tout le pseudo attirail de sécurité qui va avec , serait t'il possible de le faire fonctionner, de l'activer en quelque sorte ?


J avais publié cet article il y a une quinzaine de jours, et l ai dépublié


Suite à un échange twitter avec un collègue geek , qui m'a indiqué que, peut être, le chiffrement était ultérieur à la génération des fichiers B2 par le logiciel médical + CPS + code porteur.


A défaut de sécurité "de base" lors de la fabrication des lots de factures, un chiffrement de transport rendrait les informations non captables sur internet.


J'ai donc fortement douté et j ai vérifié : j ai dans un premier temps appelé le Réseau Santé Social, et Orange Santé, qui m 'ont assuré du chiffrement de transport et de la sécurité des informations véhiculées.


On se dit qu'au minimum un simple SSL permettant de tunneliser est forcément utilisé, surtout quand on a acheté tout ce matériel, migré en 1.4, installé le kit de connexion et j'en passe..... ; puisqu 'un simple provider lambda propose cette option sans avoir besoin de l'attirail CPS....


Je leur ai demandé de me fournir un document contractuel décrivant leur offre de service : ce document n'existe pas ! et je me suis donc mis à douter encore plus.


Tout ce systême est très bien organisé pour ne pas être transparent : en effet les factures télétransmises ne sont pas consultables car les mails envoyés ne sont pas visibles, d'ou l'impossibilité pour l'utilisateur médecin ou professionnel de santé de se faire une idée de ce qu 'il envoie sur le réseau internet.


Le webmail n'est pas disponible, qui permettrait de voir ces envois et de connaitre l'étendue du chiffrement.


Deux solutions pour savoir : un proxy SMTP entre mon poste et mon FAI, ou l'analyse des trames réseaux avec Wireshark, j ai utilisé cette deuxième solution.


Sur le port SMTP après filtrage on obtient ceci lors de l'envoi d une FSE :





Avouez que ça a une bonne tête  : les mails sortants de chez moi semblaient bien chiffrés.


Sauf que c'est marqué dessus, c'est en fait un simple encodage base64 permettant une vérification d 'intégrité, et non un chiffrement ( cf la RFC 4648 ) et là encore, la CPS reste inutilisée, alors qu'elle contient les clefs publiques nécessaires et suffisantes pour faire le job de chiffrement.


Après opération de décodage Base 64 ( qui peut se faire en ligne ici), je retrouve bien mon fichier B2 non chiffré, avec les données d 'identification en clair (nom du médecin, identifiant Adeli, numero SS et date de naissance du patient) et tout celà sort de mon ordinateur depuis 10 ans sans que je sois au courant.


Au final, la télétransmission des actes de médecine se décompose en deux opérations qui laissent les données personnelles et d'identification du patient et du médecin circuler en clair sur internet :


- l'une consistant en la fabrication des lots à télétransmettre dits B2


- l'autre consistant en l'envoi de cette facture B2 par internet sous forme d'un mail, pour lequel la CNIL préconisait déjà en 2007 un chiffrement de transport, qui n'est pas effectif dans la très grande majorité des cas (voire la totalité des cas, mais je n ai pu tester tous les FAI, seulement les "plus sécurisés") : ni VPN hardware qui partirait du modem routeur , ni même une petite cession SSL (et je ne sais pas ce qu'il en est pour les factures des cliniques, hôpitaux, laboratoires....).


Quelle conclusions à tout ceci et qu'exiger ?


- tout d'abord de la transparence et des engagements contractuels et écrits envers les professionnels de santé de la part des éditeurs, des transporteurs de flux, et du GIE sésam vitale,  qui se foutent quand même un peu de notre poire quand ils nous causent chiffrement et sécurité avec la haute bénédiction ministérielle et la participation de tout ce monde à ce qui ressemble grandement à une mystification.


- les experts, le ministère, la CNIL n 'auraient t'ils rien vu ? un peu hilarant ou désolant, au choix.


- cette transparence doit pouvoir se matérialiser dans la visibilité des informations transmises sur le réseau par le professionnel de santé, ce qui n'est pas le cas aujourd'hui : je veux voir ce qui sort de mon ordinateur et qui va transiter sur internet.


Je suis au final un peu ébahi par ce systême, son coût, et son mode de fonctionnement totalement dégradé par rapport à ce qui nous est promis et vendu à l'heure ou n'importe quel provider SMTP est en mesure de fournir du SSL. (orange le fait avec les offres de base depuis le 5 mai 2011 par exemple).


Bien sûr un chiffrement intégral des FSE poserait de grands défis techniques, et il faut certainement un statu quo raisonnable (sans doute un layer SSL de transport, n'utilisant pas forcément les clefs publiques CPS) ; en passant je remarque que le prochain appel d 'offre CPS pourrait faire l'économie en deniers publics de toutes les fonctions non activées de la carte CPS.


Mais l'opacité, les inexactitudes et dans certains cas les mensonges qui entourent l'épopée sésam vitale, son obsolescence programmée en raison de l 'arrivée des technologies NFC sont tout de même extrêmement problématiques, et posent la question de la confiance que professionnels de santé et citoyens-patients-contribuables peuvent accorder aux discours rassurant et lénifiants des organisateurs de cette drôle de mystification collective.


On retombe sur les problématiques de l'expertise technique et de la démocratie, ou plus exactement de sa confiscation : chacune des organisations, éditeur de logiciel médical, GIE sésam vitale, ministère, industriel, organisme de normalisation (CNDA) a l'impression de faire au mieux et de ne pouvoir bouger le systême (qui nécessiterait des modifications techniques sur l ensemble de la chaîne) ; chacun a aussi de très bons arguments pour expliquer que rien n'est possible et que la responsabilité est celle d'un autre acteur de la chaine ; mais au final, le produit livré ne correspond absolument pas à ce qu'on est en droit d'en attendre ; si on interpelle les individus, chacun reconnait que le résultat final ne correspond pas à la communication réalisée par les organisations.


Se pose aussi bien évidemment la question de la confidentialité de notre travail, du secret dû au patient, d'un vieux truc qui ne semble plus d'actualité : le secret médical, et plus globalement du BigData et de la confidentialité des données personnelles. 





Ci dessus un fichier B2 reconstitué : il s 'agit d'une trame réseau whireshark du port 25, décodée en base64 (car non chiffrée) et simplement copiée collée dans un wordpad.

En l ouvrant avec B2 viewer, on constate l'étendue des informations d 'identifications qui partent en clair sur internet : quel médecin a été consulté, quel jour, son numéro adeli, le numéro de SS et la DDN du patient, le montant facturé, entre autres.













11 Poster un commentaire