]>
cvs.zerfleddert.de Git - hmcfgusb/blob - hmsniff.c
1936d5bd0d53dbd306cb983084bf3d1cb5dc4070
   1 /* HM-sniffer for HM-CFG-USB 
   3  * Copyright (c) 2013 Michael Gernoth <michael@gernoth.net> 
   5  * Permission is hereby granted, free of charge, to any person obtaining a copy 
   6  * of this software and associated documentation files (the "Software"), to 
   7  * deal in the Software without restriction, including without limitation the 
   8  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 
   9  * sell copies of the Software, and to permit persons to whom the Software is 
  10  * furnished to do so, subject to the following conditions: 
  12  * The above copyright notice and this permission notice shall be included in 
  13  * all copies or substantial portions of the Software. 
  15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
  16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
  17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
  18  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
  19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
  20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 
  33 #include <libusb-1.0/libusb.h> 
  39 char *hm_message_types(uint8_t type
) 
  46                         return "Configuration"; 
  79                         return "Water sensor"; 
  82                         return "Climate event"; 
  85                         return "Weather event"; 
  93 static void dissect_hm(uint8_t *buf
, int len
) 
 100         gettimeofday(&tv
, NULL
); 
 101         tmp 
= localtime(&tv
.tv_sec
); 
 102         memset(ts
, 0, sizeof(ts
)); 
 103         strftime(ts
, sizeof(ts
)-1, "%Y-%m-%d %H:%M:%S", tmp
); 
 104         printf("%s.%06ld: ", ts
, tv
.tv_usec
); 
 106         for (i 
= 0; i 
< len
; i
++) { 
 107                 printf("%02X", buf
[i
]); 
 110         printf("Packet information:\n"); 
 111         printf("\tLength: %u\n", buf
[0]); 
 112         printf("\tMessage ID: %u\n", buf
[1]); 
 113         printf("\tSender: %02x%02x%02x\n", buf
[4], buf
[5], buf
[6]); 
 114         printf("\tReceiver: %02x%02x%02x\n", buf
[7], buf
[8], buf
[9]); 
 115         printf("\tControl Byte: 0x%02x\n", buf
[2]); 
 116         printf("\t\tFlags: "); 
 117         if (buf
[2] & (1 << 0)) printf("WAKEUP "); 
 118         if (buf
[2] & (1 << 1)) printf("WAKEMEUP "); 
 119         if (buf
[2] & (1 << 2)) printf("CFG "); 
 120         if (buf
[2] & (1 << 3)) printf("? "); 
 121         if (buf
[2] & (1 << 4)) printf("BURST "); 
 122         if (buf
[2] & (1 << 5)) printf("BIDI "); 
 123         if (buf
[2] & (1 << 6)) printf("RPTED "); 
 124         if (buf
[2] & (1 << 7)) printf("RPTEN "); 
 126         printf("\tMessage type: %s (0x%02x)\n", hm_message_types(buf
[3]), buf
[3]); 
 127         printf("\tMesage: "); 
 128         for (i 
= 10; i 
< len
; i
++) { 
 129                 printf("%02X", buf
[i
]); 
 141 static int parse_hmcfgusb(uint8_t *buf
, int buf_len
, void *data
) 
 143         struct recv_data 
*rdata 
= data
; 
 150                         dissect_hm(buf 
+ 13, buf
[13] + 1); 
 153                         if ((buf
[27] != 0x00) || 
 156                                 printf("hmId is currently set to: %02x%02x%02x\n", buf
[27], buf
[28], buf
[29]); 
 157                                 rdata
->wrong_hmid 
= 1; 
 164                         hexdump(buf
, buf_len
, "Unknown> "); 
 171 int main(int argc
, char **argv
) 
 173         struct hmcfgusb_dev 
*dev
; 
 174         struct recv_data rdata
; 
 177         hmcfgusb_set_debug(0); 
 180                 memset(&rdata
, 0, sizeof(rdata
)); 
 181                 rdata
.wrong_hmid 
= 0; 
 183                 dev 
= hmcfgusb_init(parse_hmcfgusb
, &rdata
); 
 185                         fprintf(stderr
, "Can't initialize HM-CFG-USB, retrying in 1s...\n"); 
 189                 printf("HM-CFG-USB opened!\n"); 
 191                 hmcfgusb_send_null_frame(dev
, 1); 
 192                 hmcfgusb_send(dev
, (unsigned char*)"K", 1, 1); 
 197                         if (rdata
.wrong_hmid
) { 
 198                                 printf("changing hmId to 000000, this might reboot the device!\n"); 
 199                                 hmcfgusb_send(dev
, (unsigned char*)"A\00\00\00", 4, 1); 
 200                                 rdata
.wrong_hmid 
= 0; 
 201                                 hmcfgusb_send(dev
, (unsigned char*)"K", 1, 1); 
 203                         fd 
= hmcfgusb_poll(dev
, 1); 
 205                                 fprintf(stderr
, "activity on unknown fd %d!\n", fd
); 
 207                         } else if (fd 
== -1) { 
 209                                         perror("hmcfgusb_poll"); 
 212                                         /* periodically wakeup the device */ 
 213                                         hmcfgusb_send_null_frame(dev
, 1);