切换到宽版
爱科技/爱创意/爱折腾/爱极致;技术知识分享平台,点击进入新版数码之家网站
  • 11631阅读
  • 56回复

[另类]有了“他”再也不怕房东多收电费了 [复制链接]

上一主题 下一主题
离线darkit
 

发帖
350
M币
2605
专家
6
粉丝
37
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2014-10-03
     题记:感谢乐为物联技术群里的小沈(QQ:371212494)赠送我这个电量模块,感谢乐为提供平台资源。迟到的任务今天总算可以校稿了。

     话说自从搬到了这个便宜的房子后,总感觉房租便宜了,但是每个月的电费确实成倍的增加了,一直就琢磨着如何查看每个月的真实用电量。想过换电表,可是房东把电箱锁住了换不了,还想过自己在房间里加装一块电表,可惜房东又不给,一直找不到方法解决这个问题,直到乐为物联群里出的这个套件。

1.  前言乐联网简介
乐联网(https://www.lewei50.com/阿里云托管,服务稳定且全国CDN加速节点速度快WEB2.0UI将用户体验发挥到了极致。我们可通过提供API接口,您轻松的将各类传感器、测量设备或工业仪器仪表接入该平台,并可以通过开发应用来监管和控制它们。并且该平台提供传感器云服务,让您无需繁琐的编程,便可以将自己的各类测量或控制设备实现网络功能,快速开启物联网应用。同时强大的数据存储、查询和分析能力可以帮助一些传统行业快速部署自己的物联网应用,实现传统企业向物联网企业转型。同时该平台官方QQ群(59162154)有大量从事嵌入式工作的大大牛级人物在里面。可以让你迅速了解该平台的使用及问题求助。

2.活动介绍
基于互感器电量模块,433无线数传连接ARDUINO485版本扩展支持)的家庭能源消耗管理,是指能够即时查看电力消耗数据,而且能够通过历史数据图表,实现能源消耗的可视化管理。国外的电力公司,一般都为用户提供丰富的可视化能源管理数据,但是,国内这方面一直还是空白,一般都是传统的电表,稍微先进一点的电力公司的抄表数据只是收费用途,并不能为用户提供具体的家庭能源消耗的数据,因此很多家庭既浪费电能资源,又产生了额外的开支费用。所以本次活动的目的就是为了清楚的掌握家庭中每一天的具体电能消耗情况,从而为节约用电提供直观的依据。

3.活动材料
1. 数据采集器底板一个(用来固定各个传感器模块模块)
2. arduino pro mini一个(解析433模块发送过来的数据)
3. 433Mhz透传模块一对(数据无线传输用)
4. 开口互感器一个(采集实时电流大小)
5. 电量采集模块一个(采集电压、功率因素及电量统计)
6. W5500模块一个(上传到物联网平台的网络通信模块)

4、安装过程
偷用别人的一张图,大致就是这样的,433无线数传版本比这个要简单,只要把开口互感器套进火线里后,然后给电量采集模块供电就完成了数据发射端的安装。这里我大致提供一下我的现场施工图(由于原始图片丢失,只能重新拆机再拍个大概,加之一个人带电作业还是有点点危险,所就只能大致说一下):
有了“他”再也不怕房东多收电费了
有了“他”再也不怕房东多收电费了
有了“他”再也不怕房东多收电费了
有了“他”再也不怕房东多收电费了
有了“他”再也不怕房东多收电费了
有了“他”再也不怕房东多收电费了
有了“他”再也不怕房东多收电费了
接下来,云端平台的配置,这里注册的过程就不做过多的介绍,大家自行注册。接下来就是在这个页面添加设备,也就是网关(https://www.lewei50.com/user/gatewayadd)。这里有网络电量表V1V2两个版本,他们的区别就是在于有没有温湿度和气压统计。


有了“他”再也不怕房东多收电费了

然后再在这个页面查看对应的传感器有没有添加成功(https://www.lewei50.com/user/sensorlist),如果这个页面有数据列表的话就说明传感器也添加完成了,接下来就是把程序代码下载到arduino pro mini主机中,程序代码如下,请自行修改设备IDUserkeyUserkey可以在乐为物联的https://www.lewei50.com/user/setting 这个页面获取。代码如下:



  1. // LeWei AC Power Meter trail success2013.06.25
  2. // LeWei AC Power Meter (ZongBiao60A)trail syccess 2013.06.30 18:50pm
  3. // 4 Parameter: watt / kwh / Amp / Voltage / Pf
  4. /* FIXME: not yet being used */
  5. unsigned long interframe_delay = 2;  /* Modbus t3.5 = 2 ms */
  6. /*
  7. * preset_multiple_registers: Modbus function 16. Write the data from an
  8. * array into the holding registers of a slave.
  9. * INPUTS
  10. * slave: modbus slave id number
  11. * start_addr: address of the slave's first register (+1)
  12. * reg_count: number of consecutive registers to preset
  13. * data: array of words (ints) with the data to write into the slave
  14. * RETURNS: the number of bytes received as response on success, or
  15. *         0 if no bytes received (i.e. response timeout)
  16. *        -1 to -4 (modbus exception code)
  17. *        -5 for other errors (port error, etc.).
  18. */
  19. int preset_multiple_registers(int slave, int start_addr,
  20. int reg_count, int *data);
  21. /*
  22. * read_holding_registers: Modbus function 3. Read the holding registers
  23. * in a slave and put the data into an array
  24. * INPUTS
  25. * slave: modbus slave id number
  26. * start_addr: address of the slave's first register (+1)
  27. * count: number of consecutive registers to read
  28. * dest: array of words (ints) on which the read data is to be stored
  29. * dest_size: size of the array, which should be at least 'count'
  30. * RETURNS: the number of bytes received as response on success, or
  31. *         0 if no valid response received (i.e. response timeout, bad crc)
  32. *        -1 to -4 (modbus exception code)
  33. *        -5 for other errors (port error, etc.).
  34. */
  35. int read_holding_registers(int slave, int start_addr, int count,
  36. int *dest, int dest_size);
  37. /*
  38.    open.lewei50.com  sensor  client
  39. */
  40. #include <SPI.h>
  41. #include <Ethernet.h>
  42. #include <LeweiClient.h>
  43. #define USERKEY          "Your API Key" // replace your key here
  44. #define LW_GATEWAY       "Your Gateway No."
  45. LeWeiClient *lwc;
  46. unsigned long lastConnectionTime = 0;          // last time you connected to the server, in milliseconds
  47. boolean lastConnected = false;                 // state of the connection last time through the main loop
  48. const unsigned long postingInterval = 30*1000; //delay between updates to cosm.com
  49. int pin = 8;
  50. unsigned long duration;
  51. unsigned long starttime;
  52. unsigned long sampletime_ms = 30000;
  53. unsigned long lowpulseoccupancy = 0;
  54. float ratio = 0;
  55. double concentration = 0;
  56. void setup() {
  57.    // start serial port:
  58.    Serial.begin(4800);
  59.    pinMode(8,INPUT);
  60.   delay(10000);              
  61.    lwc = new LeWeiClient(USERKEY, LW_GATEWAY);
  62.    starttime = millis();
  63. }
  64. /* filter program : 20130521 */
  65. #define FILTERLEN 10
  66. unsigned long Array_Average( unsigned long* Array,int length)
  67. {
  68.     int x;
  69.     unsigned long returnVal;
  70.     unsigned long result=0;
  71.     for(x=0;x<length;x++)
  72.     {
  73.       result+=Array[x];
  74.       Serial.print("result=");
  75.       Serial.println(result);
  76.     }
  77.     returnVal=result/length;
  78.     return returnVal;
  79. }
  80. unsigned long Filter1(unsigned long lowpulse)
  81. {
  82.   static unsigned long sfiterArray[FILTERLEN];
  83.   static int sindex=0;
  84.   int x;
  85.    Serial.println("filter1 begin:");
  86.   if(FILTERLEN>sindex)
  87.   {
  88.       sindex++;
  89.       Serial.println(sindex);
  90.       sfiterArray[sindex]=lowpulse;
  91.          Serial.println("filter1 END");
  92.       return lowpulse;
  93.   }
  94.   else
  95.   {
  96.       for(x=0;x<FILTERLEN-1;x++)
  97.       {
  98.         sfiterArray[x]=sfiterArray[x+1];
  99.       }
  100.       sfiterArray[FILTERLEN-1]=lowpulse;
  101.       for(x=0;x<FILTERLEN;x++)
  102.       {
  103.          Serial.println(sfiterArray[x]);
  104.       }
  105.       Serial.println("Aver:");
  106.        Serial.println(Array_Average(sfiterArray,FILTERLEN));
  107.        Serial.println("filter1 END");
  108.       return(Array_Average(sfiterArray,FILTERLEN));
  109.   }
  110. }
  111. /*END: filter program : 20130521 */
  112. int x=0; //simulated sensor output
  113. int sampling=1;
  114. int transfering=0;
  115. /* Modbus para */
  116. int retval;
  117. int data[10];
  118. int tt[30];  //int changed to unsigned int
  119. void loop() {
  120.   int i;    
  121.   /* example, this will write some data in the first 10 registers of slave 1  */
  122.   //                retval = preset_multiple_registers(1,1,10, data);
  123.   //                data[0] = retval;
  124.   //                data[1]++;
  125.   //                data[8]=0xdead;
  126.   //                data[9] = 0xbeaf;
  127.   //                delay(500);
  128.   //int read_holding_registers(int slave, int start_addr, int count,int *dest, int dest_size);              
  129.   //                retval = read_holding_registers(2,1, 1,tt,6);      
  130.   retval = read_holding_registers(1, 0x49, 6, tt, 1); // 1:5,2:7,3:9
  131.   //                delay(1000);
  132.   //                Serial.print("receve flag=");              
  133.   //                Serial.println(retval);
  134.   int     Voltage  = tt[0];
  135.           Voltage  = Voltage / 100;
  136.   float   Amp      = tt[1];
  137.           Amp      = Amp / 1000;
  138.   int     Watt     = tt[2];
  139.   //long y=x0*65536+x1;
  140.   unsigned   int Kwhh = (unsigned int)tt[3];
  141.   //unsigned int Kwhh = (unsigned int)65535; //test maximum
  142.   unsigned   int Kwhl = (unsigned int)tt[4];
  143.   unsigned   long kwhA = (unsigned long) Kwhh *65536 + Kwhl;
  144.   //    unsigned  long kwhA = Kwhh <<16 + Kwhl;
  145.   float Kwh = kwhA;
  146.   Kwh = Kwh / 3200;
  147.   //    double Kwh  = kwhA / 3200; //Kwh  = kwh / 32;
  148.   //    int Kwh     = tt[4];
  149.   float Pf = tt[5];
  150.         Pf = Pf / 1000;
  151.   float Cabon  = tt[5];
  152.         Cabon  = Cabon / 1000;
  153.   Serial.print(Voltage);
  154.   Serial.print(Amp);
  155.   Serial.print(Watt);
  156.   Serial.print(Kwh);
  157.   Serial.print(Pf);
  158.   Serial.print(Cabon);
  159. // 4 Parameter: watt / kwh / Amp / Voltage / Pf
  160.       lwc->append("T21", Kwh);
  161.       lwc->append("T22", Watt);
  162.       lwc->append("T23", Amp);
  163.       lwc->append("T24", Voltage);
  164.       lwc->append("T25", Pf);
  165. //      lwc->append("06", Cabon);
  166.         lwc->send();  
  167.         delay(15000);
  168. }
  169. // this method makes a HTTP connection to the server:
  170. /****************************************************************************
  171. * BEGIN MODBUS RTU MASTER FUNCTIONS
  172. ****************************************************************************/
  173. //#define TIMEOUT 1000          /* 1 second */
  174. #define TIMEOUT 10000          /* 10 second */
  175. #define MAX_READ_REGS 125
  176. #define MAX_WRITE_REGS 125
  177. #define MAX_RESPONSE_LENGTH 256
  178. #define PRESET_QUERY_SIZE 256
  179. /* errors */
  180. #define PORT_ERROR -5
  181. /*
  182. CRC
  183. INPUTS:
  184. buf   ->  Array containing message to be sent to controller.          
  185. start ->  Start of loop in crc counter, usually 0.
  186. cnt   ->  Amount of bytes in message being sent to controller/
  187. OUTPUTS:
  188. temp  ->  Returns crc byte for message.
  189. COMMENTS:
  190. This routine calculates the crc high and low byte of a message.
  191. Note that this crc is only used for Modbus, not Modbus+ etc.
  192. ****************************************************************************/
  193. unsigned int crc(unsigned char *buf, int start, int cnt)
  194. {
  195.   int i, j;
  196.   unsigned temp, temp2, flag;
  197.   temp = 0xFFFF;
  198.   for (i = start; i < cnt; i++) {
  199.     temp = temp ^ buf[i];
  200.     for (j = 1; j <= 8; j++) {
  201.       flag = temp & 0x0001;
  202.       temp = temp >> 1;
  203.       if (flag)
  204.         temp = temp ^ 0xA001;
  205.     }
  206.   }
  207.   /* Reverse byte order. */
  208.   temp2 = temp >> 8;
  209.   temp = (temp << 8) | temp2;
  210.   temp &= 0xFFFF;
  211.   return (temp);
  212. }
  213. /***********************************************************************
  214. *
  215. *      The following functions construct the required query into
  216. *      a modbus query packet.
  217. *
  218. ***********************************************************************/
  219. #define REQUEST_QUERY_SIZE 6     /* the following packets require          */
  220. #define CHECKSUM_SIZE 2          /* 6 unsigned chars for the packet plus   */
  221. /* 2 for the checksum.                    */
  222. void build_request_packet(int slave, int function, int start_addr,
  223. int count, unsigned char *packet)
  224. {
  225.   packet[0] = slave;
  226.   packet[1] = function;
  227.   start_addr -= 1;
  228.   packet[2] = start_addr >> 8;
  229.   packet[3] = start_addr & 0x00ff;
  230.   packet[4] = count >> 8;
  231.   packet[5] = count & 0x00ff;
  232.   //below test only
  233.   //        packet[0] =0x01;
  234.   //        packet[1] = 0x03;
  235.   //        packet[2] = 0;
  236.   //        packet[3] = 0x48;
  237.   //        packet[4] = 0;
  238.   //        packet[5] = 0x02;
  239. }
  240. /*************************************************************************
  241. *
  242. * modbus_query( packet, length)
  243. *
  244. * Function to add a checksum to the end of a packet.
  245. * Please note that the packet array must be at least 2 fields longer than
  246. * string_length.
  247. **************************************************************************/
  248. void modbus_query(unsigned char *packet, size_t string_length)
  249. {
  250.   int temp_crc;
  251.   temp_crc = crc(packet, 0, string_length);
  252.   packet[string_length++] = temp_crc >> 8;
  253.   packet[string_length++] = temp_crc & 0x00FF;
  254.   packet[string_length] = 0;
  255. }
  256. /***********************************************************************
  257. *
  258. * send_query(query_string, query_length )
  259. *
  260. * Function to send a query out to a modbus slave.
  261. ************************************************************************/
  262. int send_query(unsigned char *query, size_t string_length)
  263. {
  264.   int i;
  265.   modbus_query(query, string_length);
  266.   string_length += 2;
  267.   for (i = 0; i < string_length; i++) {
  268.     //                Serial.print(query[i], HEX); //Orginal
  269.     Serial.write(query[i]); //JingLi
  270.   }
  271.   /* without the following delay, the reading of the response might be wrong
  272.    * apparently, */
  273.   delay(200);            /* FIXME: value to use? */
  274.   return i;           /* it does not mean that the write was succesful, though */
  275. }
  276. /***********************************************************************
  277. *
  278. *      receive_response( array_for_data )
  279. *
  280. * Function to monitor for the reply from the modbus slave.
  281. * This function blocks for timeout seconds if there is no reply.
  282. *
  283. * Returns:     Total number of characters received.
  284. ***********************************************************************/
  285. int receive_response(unsigned char *received_string)
  286. {
  287.   int bytes_received = 0;
  288.   int i = 0;
  289.   /* wait for a response; this will block! */
  290.   while(Serial.available() == 0) {
  291.     delay(1);
  292.     if (i++ > TIMEOUT)
  293.       return bytes_received;
  294.   }
  295.   delay(200);
  296.   /* FIXME: does Serial.available wait 1.5T or 3.5T before exiting the loop? */
  297.   while(Serial.available()) {
  298.     received_string[bytes_received] = Serial.read();
  299.     //                Serial.print(bytes_received);                       //only test
  300.     //                Serial.print("-");                                //only test
  301.     //                Serial.println(received_string[bytes_received]);  //only test
  302.     bytes_received++;
  303.     if (bytes_received >= MAX_RESPONSE_LENGTH)
  304.       return PORT_ERROR;
  305.   }  
  306.   //Serial.print("bytes_received=");
  307.   //Serial.println(bytes_received);
  308.   return (bytes_received);
  309. }
  310. /*********************************************************************
  311. *
  312. *      modbus_response( response_data_array, query_array )
  313. *
  314. * Function to the correct response is returned and that the checksum
  315. * is correct.
  316. *
  317. * Returns:     string_length if OK
  318. *           0 if failed
  319. *           Less than 0 for exception errors
  320. *
  321. *      Note: All functions used for sending or receiving data via
  322. *            modbus return these return values.
  323. *
  324. **********************************************************************/
  325. int modbus_response(unsigned char *data, unsigned char *query)
  326. {
  327.   int response_length;
  328.   int i;
  329.   unsigned int crc_calc = 0;
  330.   unsigned int crc_received = 0;
  331.   unsigned char recv_crc_hi;
  332.   unsigned char recv_crc_lo;
  333.   do {        // repeat if unexpected slave replied
  334.     response_length = receive_response(data);
  335.   }
  336.   while ((response_length > 0) && (data[0] != query[0]));
  337.   //      for (i = 0; i <response_length; i++) {           Serial.print(data[i]);Serial.print("---");   Serial.println(query[i]);}                       //only test
  338.   if (response_length) {
  339.     crc_calc = crc(data, 0, response_length - 2);
  340.     recv_crc_hi = (unsigned) data[response_length - 2];
  341.     recv_crc_lo = (unsigned) data[response_length - 1];
  342.     crc_received = data[response_length - 2];
  343.     crc_received = (unsigned) crc_received << 8;
  344.     crc_received =
  345.       crc_received | (unsigned) data[response_length - 1];
  346.     /*********** check CRC of response ************/
  347.     if (crc_calc != crc_received) {
  348.       response_length = 0;
  349.       //                       Serial.println("CRC erro");                       //only test
  350.     }
  351.     /********** check for exception response *****/
  352.     if (response_length && data[1] != query[1]) {
  353.       response_length = 0 - data[2];
  354.     }
  355.   }
  356.   return (response_length);
  357. }
  358. /************************************************************************
  359. *
  360. *      read_reg_response
  361. *
  362. *      reads the response data from a slave and puts the data into an
  363. *      array.
  364. *
  365. ************************************************************************/
  366. int read_reg_response(int *dest, int dest_size, unsigned char *query)
  367. {
  368.   unsigned char data[MAX_RESPONSE_LENGTH];
  369.   int raw_response_length;
  370.   int temp, i;
  371.   raw_response_length = modbus_response(data, query);
  372.   if (raw_response_length > 0)
  373.     raw_response_length -= 2;
  374.   if (raw_response_length > 0) {
  375.     /* FIXME: data[2] * 2 ???!!! data[2] isn't already the byte count (number of registers * 2)?! */
  376.     for (i = 0;
  377.                i < (data[2] * 2) && i < (raw_response_length / 2);
  378.                i++) {
  379.       /* shift reg hi_byte to temp */
  380.       temp = data[3 + i * 2] << 8;
  381.       /* OR with lo_byte           */
  382.       temp = temp | data[4 + i * 2];
  383.       dest[i] = temp;
  384.     }
  385.   }
  386.   return (raw_response_length);
  387. }
  388. /***********************************************************************
  389. *
  390. *      preset_response
  391. *
  392. *      Gets the raw data from the input stream.
  393. *
  394. ***********************************************************************/
  395. int preset_response(unsigned char *query)
  396. {
  397.   unsigned char data[MAX_RESPONSE_LENGTH];
  398.   int raw_response_length;
  399.   raw_response_length = modbus_response(data, query);
  400.   return (raw_response_length);
  401. }
  402. /************************************************************************
  403. *
  404. *      read_holding_registers
  405. *
  406. *      Read the holding registers in a slave and put the data into
  407. *      an array.
  408. *
  409. *************************************************************************/
  410. int read_holding_registers(int slave, int start_addr, int count,
  411. int *dest, int dest_size)
  412. {
  413.   int function = 0x03;      /* Function: Read Holding Registers */
  414.   int ret;
  415.   unsigned char packet[REQUEST_QUERY_SIZE + CHECKSUM_SIZE];
  416.   if (count > MAX_READ_REGS) {
  417.     count = MAX_READ_REGS;
  418.   }
  419.   build_request_packet(slave, function, start_addr, count, packet);
  420.   if (send_query(packet, REQUEST_QUERY_SIZE) > -1) {
  421.     ret = read_reg_response(dest, dest_size, packet);
  422.   }
  423.   else {
  424.     ret = -1;
  425.   }
  426.   return (ret);
  427. }
  428. /************************************************************************
  429. *
  430. *      preset_multiple_registers
  431. *
  432. *      Write the data from an array into the holding registers of a
  433. *      slave.
  434. *
  435. *************************************************************************/
  436. int preset_multiple_registers(int slave, int start_addr,
  437. int reg_count, int *data)
  438. {
  439.   int function = 0x10;      /* Function 16: Write Multiple Registers */
  440.   int byte_count, i, packet_size = 6;
  441.   int ret;
  442.   unsigned char packet[PRESET_QUERY_SIZE];
  443.   if (reg_count > MAX_WRITE_REGS) {
  444.     reg_count = MAX_WRITE_REGS;
  445.   }
  446.   build_request_packet(slave, function, start_addr, reg_count, packet);
  447.   byte_count = reg_count * 2;
  448.   packet[6] = (unsigned char)byte_count;
  449.   for (i = 0; i < reg_count; i++) {
  450.     packet_size++;
  451.     packet[packet_size] = data[i] >> 8;
  452.     packet_size++;
  453.     packet[packet_size] = data[i] & 0x00FF;
  454.   }
  455.   packet_size++;
  456.   if (send_query(packet, packet_size) > -1) {
  457.     ret = preset_response(packet);
  458.   }
  459.   else {
  460.     ret = -1;
  461.   }
  462.   return (ret);
  463. }



       当然了上面还需要两个库文件,一个是以太网的网络模块W5500库,和乐为的上传库,这里自行到文章后面下载。大致就是这样的,然后设备接入网络,通电就可以了。由于我的路由上上有USB输出,所以我直接通过USB给arduino主机供电。如下图:
有了“他”再也不怕房东多收电费了

等几分钟后台就会看见上传的数据了。

有了“他”再也不怕房东多收电费了
我的电量表https://www.lewei50.com/u/g/6884
这里可以看见你实时的用电功率和每天的用电量,要是会点开发知识的话,可以根据API接口算出你每月要交多少大洋的电费。这样每个月的消费就一目了然了。



文章转载于:http://www.zishuo.net/with-it-is-not-afraid-of-the-landlord-overcharged-electricity.html

[ 此帖被darkit在2014-10-03 23:44重新编辑 ]
本帖最近打赏记录:共19条打赏M币+65专家+1
12
离线dxwyw

发帖
1101
M币
6468
专家
0
粉丝
35
只看该作者 1楼 发表于: 2014-10-03
请登录后查看
离线ookfei

发帖
1745
M币
5883
专家
-1
粉丝
36
只看该作者 2楼 发表于: 2014-10-03
请登录后查看
离线wambz

发帖
1784
M币
251
专家
1
粉丝
91
只看该作者 3楼 发表于: 2014-10-03
请登录后查看
离线448190058

发帖
1041
M币
2025
专家
2
粉丝
22
只看该作者 4楼 发表于: 2014-10-03
请登录后查看
本帖最近打赏记录:共1条打赏M币+3

发帖
540
M币
43
专家
1
粉丝
9
只看该作者 5楼 发表于: 2014-10-03
请登录后查看
离线开心的果

发帖
119265
M币
56
专家
22
粉丝
775
只看该作者 6楼 发表于: 2014-10-03
请登录后查看
本帖最近打赏记录:共4条打赏M币+12
离线myc92

发帖
6173
M币
11041
专家
3
粉丝
73
只看该作者 7楼 发表于: 2014-10-03
请登录后查看
离线bnnyygy

发帖
4189
M币
33
专家
7
粉丝
149
只看该作者 8楼 发表于: 2014-10-03
请登录后查看
本帖最近打赏记录:共1条打赏M币+3
离线shl1203
发帖
1752
M币
789
专家
0
粉丝
18
只看该作者 9楼 发表于: 2014-10-03
请登录后查看
快速回复
限80 字节
温馨提示:欢迎交流讨论,请勿发布纯表情、纯引用等灌水帖子;以免被删除
 
上一个 下一个