版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/BlueCloudMatrix/article/details/24184461

摘要:

随着智能家居的普及。安全性问题的研究已成当务之急。针对物联网网关自身的易受攻击性和网络传输过程中的信息窃听,我们分别採用SHA-1和AES算法对网关中的操作系统和节点採集的信息进行验证和加密,在一定程度上实现可信。我们创造性地将可信模块与网关平台进行解耦,利于可信模块的升级和维护。

 

简单介绍:

智能家居通过物联网技术将家中的各种设备(如照明系统、空调控制、安防系统)连接到一起。智能家居最初的发展主要以灯光遥控、电器远程控制和电动窗帘控制为主,后来延伸到家庭安防报警、背景音乐、可视对讲、门禁指纹控制等领域。

可见智能家居中的中央控制系统已经担当起大管家的职责,然而随之而来的安全性问题日益突出,须要我们对大管家进行特殊的防护。

物联网网关,作为一个新的名词。在未来的物联网时代将会扮演很重要的角色。它将成为连接感知网络与传统通信网络的纽带。作为网关设备,物联网网关能够实现感知网络与通信网络。以及不同类型感知网络之间的协议转换。既能够实现广域互联.也能够实现局域互联。物联网网关在智能家居中处于核心地位,在我们的设计中网关便担当了大管家的职责,因此我们将重点针对物联网网关进行防护。

可信计算是在计算和通信系统中广泛使用基于硬件安全模块支持下的计算平台。以提高系统总体的安全性与可靠性。

可信计算包含5个完整的可信系统所必须的关键技术概念:签注密钥、安全输入输出、储存器屏蔽、密封储存、以及远程认证。因此将可信计算用于物联网网关,实现一套完毕的物联网网关可信平台模块。而眼下国内还暂无技术较成熟的基于可信计算的物联网网关平台,项目较为新颖。

 

系统设计:

将可信平台模块(TPM)用于对嵌入式物联网网关设备的安全管理。实现网关的安全信息处理及通信。我们设计并在Devkit8500平台上实现了TPM模块的主要基本功能,并搭配基于ARM9的TQ2440平台的嵌入式物联网网关以及基于Zigbee通信协议的无线传感器网络。通过TPM模块对网关启动时(包含Boot Loader以及OS Kernel)的完整性验证,能够在启动前保证网关的核心系统程序的安全性。同一时候。网关应用程序(传感器数据收集、Web Service等)对数据的处理以及同外部设备通信也将通过TPM模块进行加解密处理,以保证数据的安全性。

 

 

 

功能模块设计:

1、TPM模块:

 

1)通过RS232与网关进行通信。

2)上面运行SHA-1验证算法,当网关启动时,网关会先后将其操作系统的bootloader和kernel通过RS232串口传送到TPM。届时SHA-1算法利用传来的信息生成信息摘要并与正确摘要匹配达到开机可信验证的目的,这是针对对物联网网关系统级的攻击的防护,一旦系统发生修改,SHA-1验证算法便会检測到异常。提醒用户。

3)AES加密算法。主要针对传感网节点传来的信息,若以明文存在网关数据库中。相同面临被窃取的风险。我们借鉴https的加密策略。在TPM上集成AES加密算法,节点传来的信息经由TPM进行加密,以密文的信息存在网关上的sqlite数据库中。

 

2、网关模块:

 

1)搭载GoAhead webserver。并编写CGI程序作为逻辑与界面控制。

2)通过RS232与TPM通信,并与温湿度传感器节点组成的Zigbee网络中协调器
进行RS232通讯。

3)自己定义通信协议,实现网关与TPM通信的有序性。

当两路或多路节点信息同一时候经由TPM进行加密处理时。它们是在争用一条串口线。这时就须要定义规则,对多路信息进行惟一标识和排队等候。

 

3、用户端:

通过訪问网关上的CGI页面,用户先进行身份验证,然后可选择是否将请求信息进行AES加密处理。防止用户指令遭窃听。大规模用户訪问对可信模块的计算能力提出了严峻的挑战。而实现的TPM和网关的解耦。却不利于大规模用户訪问,也造成了性能瓶颈。

 

4、传感节点:

 

温湿度传感器配备Zigbee通信模块,组建传感网。协调器节点负责发起并维护一个无线网络。识别网络中的设备增加网络;路由器节点支撑网络链路结构,完毕数据包的转发。终端节点是网络的感知者和运行者,负责数据採集和可运行的网络动作。

 

总结:

针对智能家居。我们搭建了一个模拟环境,建立起TPM负责可信验证,实现节点信息的安全存储、用户訪问信息的加密传输以及系统级的可信验证,并对大规模訪问有所探究。同一时候涉及Zigbee网络的组建,而解耦设计能够对TPM进行单独维护和升级。我们所构建的原始模型。不仅能够用于开发智能家居,并且我们曾将这一模型用于火车站自己主动检票机的设计。这也是我们大胆的将可信计算平台应用于物联网网关设计的一次尝试。

附:

AESListen.c

  1. /*********************************************************
  2. *TPM AES jiemi
  3. *
  4. **********************************************************/
  5. #include<stdio.h>
  6. #include<stdlib.h>
  7. #include<unistd.h>
  8. #include<string.h>
  9. #include<sys/types.h>
  10. #include<sys/stat.h>
  11. #include<fcntl.h>
  12. #include<termios.h>
  13. #include<errno.h>
  14. #include<sys/time.h>
  15. #include <time.h>
  16. #include "aes.h"
  17. #define FALSE -1
  18. #define TRUE 1
  19. int speed_arr[] = {B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300,
  20. B38400, B19200, B9600, B4800, B2400, B1200, B300, };
  21. int name_arr[] = {115200,38400, 19200, 9600, 4800, 2400, 1200, 300,
  22. 38400, 19200, 9600, 4800, 2400, 1200, 300, };
  23. void set_speed(int fd, int speed);
  24. int set_Parity(int fd,int databits,int stopbits,int parity);
  25. void Print(BYTE a[])
  26. {
  27. int i;
  28. for(i=0; i<4*Nb; i++)
  29. {
  30. printf("%02X ", a[i]);
  31. }
  32. printf("\n\n");
  33. }
  34. int main(void)
  35. {
  36. char *serialport="/dev/ttyUSB0";
  37. int fd;
  38. int nread;
  39. int count;
  40. char buffer[16]={'\0'};
  41. char buffer_all[16]={'\0'};
  42. fd=open(serialport,O_RDWR|O_NOCTTY|O_NDELAY);
  43. if(fd==-1)
  44. {
  45. printf("%s open error!\n",serialport);
  46. return -1;
  47. }
  48. printf("open %s successfully !",serialport);
  49. fflush(stdout);
  50. set_speed(fd,115200);
  51. if (set_Parity(fd,8,1,'N')==FALSE)
  52. {
  53. printf("Set Parity Error\n");
  54. exit(1);
  55. }
  56. DWORD e_key[Nb*(MaxNr+1)];
  57. BYTE key[4*MaxNk]={ //miyao
  58. 0x00, 0x01, 0x02, 0x03,
  59. 0x04, 0x05, 0x06, 0x07,
  60. 0x08, 0x09, 0x0a, 0x0b,
  61. 0x0c, 0x0d, 0x0e, 0x0f,
  62. 0x10, 0x11, 0x12, 0x13,
  63. 0x14, 0x15, 0x16, 0x17};
  64. BYTE decrypted_msg[4*Nb];
  65. int filelen;
  66. int times=0;
  67. SetKey(192);
  68. KeyExpansion(key, e_key);
  69. tcflush(fd,TCIOFLUSH);
  70. count=0;
  71. while(1)
  72. {
  73. nread=read(fd,buffer,16);
  74. if(nread>0)
  75. {
  76. memcpy(buffer_all+count,buffer,nread);
  77. count +=nread;
  78. }
  79. if(count==16)
  80. {
  81. printf("total_size : %d\n",count);
  82. break;
  83. }
  84. sleep(1);
  85. printf("loop one second\n");
  86. }
  87. printf("encrypted message:\n");
  88. Print(buffer_all);
  89. AesDecrypt(buffer_all, decrypted_msg, e_key); //jiemi
  90. printf("decrypted message:\n");
  91. Print(decrypted_msg);
  92. write(fd,decrypted_msg,16);
  93. return 0;
  94. }
  95. void set_speed(int fd, int speed)
  96. {
  97. int i;
  98. int status;
  99. struct termios Opt;
  100. tcgetattr(fd, &Opt);
  101. for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++)
  102. {
  103. if (speed == name_arr[i])
  104. {
  105. tcflush(fd, TCIOFLUSH);
  106. cfsetispeed(&Opt, speed_arr[i]); /* */
  107. cfsetospeed(&Opt, speed_arr[i]);
  108. status = tcsetattr(fd, TCSANOW, &Opt); /* */
  109. if (status != 0)
  110. {
  111. perror("tcsetattr fd1");
  112. return;
  113. }
  114. }
  115. tcflush(fd,TCIOFLUSH); /* */
  116. }
  117. }
  118. int set_Parity(int fd,int databits,int stopbits,int parity)
  119. {
  120. struct termios options;
  121. if (tcgetattr( fd,&options) != 0)
  122. {
  123. printf("SetupSerial 1");
  124. return(FALSE);
  125. }
  126. options.c_cflag &= ~CSIZE; /* */
  127. switch (databits) /**/
  128. {
  129. case 7:
  130. options.c_cflag |= CS7;
  131. break;
  132. case 8:
  133. options.c_cflag |= CS8;
  134. break;
  135. default:
  136. fprintf(stderr,"Unsupported data size\n");
  137. return (FALSE);
  138. }
  139. switch (parity)
  140. {
  141. case 'n':
  142. case 'N':
  143. options.c_cflag &= ~PARENB; /* Clear parity enable */
  144. options.c_iflag &= ~INPCK; /* Enable parity checking */
  145. break;
  146. case 'o':
  147. case 'O':
  148. options.c_cflag |= (PARODD | PARENB); /* */
  149. options.c_iflag |= INPCK; /* Disnable parity checking */
  150. break;
  151. case 'e':
  152. case 'E':
  153. options.c_cflag |= PARENB; /* Enable parity */
  154. options.c_cflag &= ~PARODD; /* */
  155. options.c_iflag |= INPCK; /* Disnable parity checking */
  156. break;
  157. case 'S':
  158. case 's': /*as no parity*/
  159. options.c_cflag &= ~PARENB;
  160. options.c_cflag &= ~CSTOPB;
  161. break;
  162. default:
  163. fprintf(stderr,"Unsupported parity\n");
  164. return (FALSE);
  165. }
  166. /**/
  167. switch (stopbits)
  168. {
  169. case 1:
  170. options.c_cflag &= ~CSTOPB;
  171. break;
  172. case 2:
  173. options.c_cflag |= CSTOPB;
  174. break;
  175. default:
  176. fprintf(stderr,"Unsupported stop bits\n");
  177. return (FALSE);
  178. }
  179. /* Set input parity option */
  180. if (parity != 'n')
  181. options.c_iflag |= INPCK;
  182. options.c_cc[VTIME] = 150; // 15 seconds
  183. options.c_cc[VMIN] = 0;
  184. options.c_lflag &= ~(ICANON |ISIG);
  185. options.c_iflag &= ~(ICRNL|IGNCR);
  186. tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */
  187. if (tcsetattr(fd,TCSANOW,&options) != 0)
  188. {
  189. printf("SetupSerial 3");
  190. return (FALSE);
  191. }
  192. return (TRUE);
  193. }

Listenarm.c

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <unistd.h>
  4. #include <string.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <fcntl.h>
  8. #include <termios.h>
  9. #include <errno.h>
  10. #include <sys/time.h>
  11. #include <time.h>
  12. #include "sha1.h"
  13. #include "stdint.h"
  14. #define MAX 1024
  15. #define FALSE -1
  16. #define TRUE 1
  17. #define BUFFER_SIZE 1024
  18. typedef unsigned char TPM_TAG ;
  19. typedef unsigned int UINT32;
  20. typedef unsigned char TPM_COMMAND_CODE;
  21. int speed_arr[] = {B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300,
  22. B38400, B19200, B9600, B4800, B2400, B1200, B300, };
  23. int name_arr[] = {115200,38400, 19200, 9600, 4800, 2400, 1200, 300,
  24. 38400, 19200, 9600, 4800, 2400, 1200, 300, };
  25. void set_speed(int fd, int speed);
  26. int set_Parity(int fd,int databits,int stopbits,int parity);
  27. void itoa ( unsigned int val, char *buf, int radix );
  28. unsigned char buffer_all_bootloader[1024*1024];
  29. int buffer_len_bootloader;
  30. unsigned char buffer_all_kernel[1024*1024];
  31. int buffer_len_kernel;
  32. unsigned char Message_Digest_bootloader[SHA1HashSize];
  33. unsigned char Message_Digest_kernel[SHA1HashSize];
  34. typedef struct
  35. {
  36. TPM_TAG tag;
  37. UINT32 paramSize;
  38. TPM_COMMAND_CODE ordinal;
  39. }TPM_COMMAND;
  40. //unsigned char bootloader_sha1_checksum[20]={31,79,191,25,22,207,68,233,254,242,171,148,233,85,122,172,52,150,227,121};
  41. unsigned char bootloader_sha1_checksum[20]={0x77,0xCA,0x04,0xD2,0x41,0xA7,0xF7,0xCD,0x9F,0x69,0x11,0x06,0x68,0x28,0x95,0xE3,0x71,0x7F,0x24,0xEC};
  42. //unsigned char kernel_sha1_checksum[20]={161,76,7,206,132,245,247,137,244,45,3,48,49,98,232,213,32,219,62,17};
  43. unsigned char kernel_sha1_checksum[20]={0x70,0xD0,0x0C,0x51,0x7C,0x10,0xFB,0xCB,0x93,0x81,0x2C,0x0C,0x5C,0x8C,0xBF,0x35,0x23,0xB8,0xE5,0x99};
  44. int main(void)
  45. {
  46. char *serialport = "/dev/ttyUSB0";
  47. int fd=open(serialport,O_RDWR,O_NOCTTY);
  48. if(fd == -1)
  49. {
  50. printf("%s Open Error!\n",serialport);
  51. return -1;
  52. }
  53. printf("open %s successfully !\n",serialport);
  54. fflush(stdout);
  55. set_speed(fd,115200);
  56. if (set_Parity(fd,8,1,'N')== FALSE)
  57. {
  58. printf("Set Parity Error\n");
  59. exit(1);
  60. }
  61. /*******************************************************************************/
  62. struct timeval tpstart,tpend;
  63. float timeuse;
  64. gettimeofday(&tpstart,NULL);
  65. write(fd,"s",1);
  66. /*TPM帧格式*/
  67. TPM_COMMAND request_bootloader={'t',6,'s'};
  68. unsigned char d[5];
  69. itoa(request_bootloader.paramSize,d,10);
  70. unsigned char dest[strlen(d)+5];
  71. sprintf(dest,"%c%d%c",request_bootloader.tag,request_bootloader.paramSize,request_bootloader.ordinal);
  72. dest[3]='a';
  73. dest[4]='b';
  74. dest[5]='c';
  75. write(fd,dest,strlen(d)+5);
  76. /*******************************************************************************/
  77. //监听bootloader
  78. int nread = 1,nwrite = 0;
  79. int total_size = 0;
  80. unsigned char buffer[BUFFER_SIZE] = {'\0'};
  81. int i;
  82. buffer_len_bootloader = 0;
  83. while(1)
  84. {
  85. nread=read(fd,buffer,1024);
  86. if(nread>0)
  87. {
  88. total_size+=nread;
  89. memcpy(buffer_all_bootloader+buffer_len_bootloader,buffer,nread);
  90. buffer_len_bootloader+=nread;
  91. #if 0
  92. for(i = 0;i<nread;i++)
  93. {
  94. if(i%8==0)
  95. {
  96. printf("\n");
  97. }
  98. printf("0x%x,",buffer[i]);
  99. }
  100. #endif
  101. }
  102. if(total_size==29700)
  103. {
  104. printf("total_size:%d\n",total_size);
  105. break;
  106. }
  107. }
  108. //生成bootloader摘要值
  109. sha1_test(buffer_all_bootloader,buffer_len_bootloader,Message_Digest_bootloader);
  110. /* sha-1 */
  111. sleep(1);
  112. int count;
  113. for(count=0;count<20;count++)
  114. {
  115. if(bootloader_sha1_checksum[count]==Message_Digest_bootloader[count])
  116. continue;
  117. else
  118. goto close;
  119. }
  120. write(fd,"s",1);
  121. write(fd,"abcdef",6);
  122. gettimeofday(&tpend,NULL);
  123. timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+tpend.tv_usec-tpstart.tv_usec;
  124. timeuse/=1000000;
  125. printf("Used Time:%f\n",timeuse);
  126. /*******************************************************************************/
  127. //监听kernel0
  128. struct timeval tpstart2,tpend2;
  129. float timeuse2;
  130. gettimeofday(&tpstart2,NULL);
  131. nread = 1,nwrite = 0;
  132. total_size = 0;
  133. unsigned char buffer2[BUFFER_SIZE] = {'\0'};
  134. buffer_len_kernel = 0;
  135. while(1)
  136. {
  137. nread=read(fd,buffer2,1024);
  138. if(nread>0)
  139. {
  140. total_size+=nread;
  141. memcpy(buffer_all_kernel+buffer_len_kernel,buffer2,nread);
  142. buffer_len_kernel+=nread;
  143. #if 0
  144. for(i = 0;i<nread;i++)
  145. {
  146. if(i%8==0)
  147. {
  148. printf("\n");
  149. }
  150. //printf("0x%x,",buffer2[i]);
  151. }
  152. #endif
  153. }
  154. if(total_size==29386)
  155. {
  156. printf("total_size:%d\n",total_size);
  157. break;
  158. }
  159. }
  160. //生成kernel摘要值
  161. sha1_test(buffer_all_kernel,buffer_len_kernel,Message_Digest_kernel);
  162. sleep(1);
  163. for(count=0;count<20;count++)
  164. {
  165. if(kernel_sha1_checksum[count]==Message_Digest_kernel[count])
  166. continue;
  167. else
  168. goto close;
  169. }
  170. write(fd,"s",1);
  171. write(fd,"abcdef",6);
  172. gettimeofday(&tpend2,NULL);
  173. timeuse2=1000000*(tpend2.tv_sec-tpstart2.tv_sec)+tpend2.tv_usec-tpstart2.tv_usec;
  174. timeuse2/=1000000;
  175. printf("Used Time:%f\n",timeuse2);
  176. close:
  177. close(fd);
  178. return 0;
  179. }
  180. void set_speed(int fd, int speed)
  181. {
  182. int i;
  183. int status;
  184. struct termios Opt;
  185. tcgetattr(fd, &Opt);
  186. for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++)
  187. {
  188. if (speed == name_arr[i])
  189. {
  190. tcflush(fd, TCIOFLUSH);
  191. cfsetispeed(&Opt, speed_arr[i]); /* 指定输入波特率 */
  192. cfsetospeed(&Opt, speed_arr[i]);
  193. status = tcsetattr(fd, TCSANOW, &Opt); /* 将修改后的termios数据设置到串口中 */
  194. if (status != 0)
  195. {
  196. perror("tcsetattr fd1");
  197. return;
  198. }
  199. }
  200. tcflush(fd,TCIOFLUSH); /* */
  201. }
  202. }
  203. int set_Parity(int fd,int databits,int stopbits,int parity)
  204. {
  205. struct termios options;
  206. /*if (tcgetattr( fd,&options) != 0)
  207. {
  208. printf("SetupSerial 1");
  209. return(FALSE);
  210. } */
  211. options.c_cflag &= ~CSIZE; /* 设置数据位前必须先使用CSIZE做位屏蔽 */
  212. switch (databits) /*设置数据位数*/
  213. {
  214. case 7:
  215. options.c_cflag |= CS7;
  216. break;
  217. case 8:
  218. options.c_cflag |= CS8;
  219. break;
  220. default:
  221. fprintf(stderr,"Unsupported data size\n");
  222. return (FALSE);
  223. }
  224. switch (parity)
  225. {
  226. case 'n':
  227. case 'N':
  228. options.c_cflag &= ~PARENB; /* Clear parity enable */
  229. options.c_iflag &= ~INPCK; /* Enable parity checking */
  230. break;
  231. case 'o':
  232. case 'O':
  233. options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/
  234. options.c_iflag |= INPCK; /* Disnable parity checking */
  235. break;
  236. case 'e':
  237. case 'E':
  238. options.c_cflag |= PARENB; /* Enable parity */
  239. options.c_cflag &= ~PARODD; /* 转换为偶效验*/
  240. options.c_iflag |= INPCK; /* Disnable parity checking */
  241. break;
  242. case 'S':
  243. case 's': /*as no parity*/
  244. options.c_cflag &= ~PARENB;
  245. options.c_cflag &= ~CSTOPB;
  246. break;
  247. default:
  248. fprintf(stderr,"Unsupported parity\n");
  249. return (FALSE);
  250. }
  251. /* 设置停止位*/
  252. switch (stopbits)
  253. {
  254. case 1:
  255. options.c_cflag &= ~CSTOPB;
  256. break;
  257. case 2:
  258. options.c_cflag |= CSTOPB;
  259. break;
  260. default:
  261. fprintf(stderr,"Unsupported stop bits\n");
  262. return (FALSE);
  263. }
  264. /* Set input parity option */
  265. if (parity != 'n')
  266. options.c_iflag |= INPCK;
  267. options.c_cc[VTIME] = 150; // 15 seconds
  268. options.c_cc[VMIN] = 0;
  269. options.c_lflag &= ~(ICANON |ISIG);
  270. options.c_iflag &= ~(ICRNL|IGNCR);
  271. tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */
  272. if (tcsetattr(fd,TCSANOW,&options) != 0)
  273. {
  274. printf("SetupSerial 3");
  275. return (FALSE);
  276. }
  277. return (TRUE);
  278. }
  279. void itoa ( unsigned int val, char *buf, int radix )
  280. {
  281. char *p; /* pointer to traverse string */
  282. char *firstdig; /* pointer to first digit */
  283. char temp; /* temp char */
  284. unsigned int digval; /* value of digit */
  285. p = buf;
  286. firstdig = p; /* save pointer to first digit */
  287. do {
  288. digval = (unsigned int) (val % radix);
  289. val /= radix; /* get next digit */
  290. /* convert to ascii and store */
  291. if (digval > 9)
  292. *p++ = (char)(digval - 10 + 'a'); /* a letter */ ///////////////////////////////
  293. else
  294. *p++ = (char ) (digval + '0'); /* a digit */ ////////////////////////////////
  295. } while (val > 0);
  296. /* We now have the digit of the number in the buffer, but in reverse
  297. order. Thus we reverse them now. */
  298. *p-- = '\0'; /* terminate string; p points to last digit */ /////////////////////
  299. do {
  300. temp = *p;
  301. *p = *firstdig;
  302. *firstdig = temp; /* swap *p and *firstdig */
  303. --p;
  304. ++firstdig; /* advance to next two digits */
  305. } while (firstdig < p); /* repeat until halfway */
  306. }

CGI.c

  1. /*****************
  2. * CGI
  3. *
  4. *
  5. ******************/
  6. #include<stdio.h>
  7. #include<stdlib.h>
  8. #include<string.h>
  9. #include <unistd.h>
  10. #include <sys/types.h>
  11. #include <sys/stat.h>
  12. #include <fcntl.h>
  13. #include <termios.h>
  14. #include <errno.h>
  15. #include <sys/time.h>
  16. #include <time.h>
  17. #define MAX 1024
  18. #define FALSE -1
  19. #define TRUE 1
  20. #define BUFFER_SIZE 1024
  21. typedef unsigned char BYTE;
  22. int speed_arr[] = {B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300,
  23. B38400, B19200, B9600, B4800, B2400, B1200, B300, };
  24. int name_arr[] = {115200,38400, 19200, 9600, 4800, 2400, 1200, 300,
  25. 38400, 19200, 9600, 4800, 2400, 1200, 300, };
  26. void set_speed(int fd, int speed);
  27. int set_Parity(int fd,int databits,int stopbits,int parity);
  28. void Print(BYTE a[])
  29. {
  30. int i;
  31. for(i=0; i<4*4; i++)
  32. {
  33. printf("%02X ", a[i]);
  34. }
  35. printf("\n\n");
  36. }
  37. int main()
  38. {
  39. char *method;
  40. char *data;
  41. int count;
  42. int i;
  43. int j;
  44. char *serialport = "/dev/tq2440_serial1" ; //
  45. int fd;
  46. int nread;
  47. char buffer[16] = {'\0'};
  48. char buffer_all[16]={'\0'};
  49. FILE *fp;
  50. time_t rawtime;
  51. struct tm *timeinfo;
  52. int end=5;
  53. printf("Content-type:text/html\n\n");
  54. printf("<p>this is a cgi");
  55. if((method=getenv("REQUEST_METHOD"))==NULL) //
  56. return 1;
  57. printf("<p>method: %s",method);
  58. if((data=getenv("QUERY_STRING"))==NULL) //
  59. return 1;
  60. printf("<p>%s",data);
  61. /*if((i=sscanf(data,"command=%s",command))==0)
  62. return 1;
  63. printf("%s",command);*/
  64. /**************************
  65. *
  66. *
  67. *
  68. **************************/
  69. fd=open(serialport,O_RDWR|O_NOCTTY|O_NDELAY);
  70. if(fd == -1)
  71. {
  72. printf("%s Open Error!\n",serialport);
  73. return -1;
  74. }
  75. printf("<p>open %s successfully !",serialport);
  76. set_speed(fd,115200);
  77. if (set_Parity(fd,8,1,'N')== FALSE)
  78. {
  79. printf("Set Parity Error\n");
  80. exit(1);
  81. }
  82. tcflush(fd,TCIOFLUSH);
  83. write(fd,data,16);
  84. count=0;
  85. while(end)
  86. {
  87. end--;
  88. nread=read(fd,buffer,16);
  89. if(nread>0)
  90. {
  91. memcpy(buffer_all+count,buffer,nread);
  92. count += nread;
  93. }
  94. if(count==16)
  95. {
  96. printf("<p>receive success !");
  97. break;
  98. }
  99. sleep(1);
  100. printf("<p>loop one time");
  101. }
  102. Print(buffer_all);
  103. time(&rawtime);
  104. timeinfo=localtime(&rawtime);
  105. if((fp=fopen("/mnt/usrcommand.txt","ab+"))==NULL)
  106. return 1;
  107. fprintf(fp,"%4d-%02d-%02d %02d%02d%02d\n",1900+timeinfo->tm_year,1+timeinfo->tm_mon,timeinfo->tm_mday,timeinfo->tm_hour,timeinfo->tm_min,timeinfo->tm_sec);
  108. //fwrite(data,sizeof(char),strlen(data),fp);
  109. for(j=0; j<4*4; j++)
  110. {
  111. fprintf(fp,"%02X",buffer_all[j]);
  112. }
  113. //fwrite(buffer_all,sizeof(char),16,fp);
  114. fclose(fp);
  115. return 0;
  116. }
  117. void set_speed(int fd, int speed)
  118. {
  119. int i;
  120. int status;
  121. struct termios Opt;
  122. tcgetattr(fd, &Opt);
  123. for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++)
  124. {
  125. if (speed == name_arr[i])
  126. {
  127. tcflush(fd, TCIOFLUSH);
  128. cfsetispeed(&Opt, speed_arr[i]); /* */
  129. cfsetospeed(&Opt, speed_arr[i]);
  130. status = tcsetattr(fd, TCSANOW, &Opt); /* */
  131. if (status != 0)
  132. {
  133. perror("tcsetattr fd1");
  134. return;
  135. }
  136. }
  137. tcflush(fd,TCIOFLUSH); /* */
  138. }
  139. }
  140. int set_Parity(int fd,int databits,int stopbits,int parity)
  141. {
  142. struct termios options;
  143. if (tcgetattr( fd,&options) != 0)
  144. {
  145. printf("SetupSerial 1");
  146. return(FALSE);
  147. }
  148. options.c_cflag &= ~CSIZE; /* */
  149. switch (databits) /**/
  150. {
  151. case 7:
  152. options.c_cflag |= CS7;
  153. break;
  154. case 8:
  155. options.c_cflag |= CS8;
  156. break;
  157. default:
  158. fprintf(stderr,"Unsupported data size\n");
  159. return (FALSE);
  160. }
  161. switch (parity)
  162. {
  163. case 'n':
  164. case 'N':
  165. options.c_cflag &= ~PARENB; /* Clear parity enable */
  166. options.c_iflag &= ~INPCK; /* Enable parity checking */
  167. break;
  168. case 'o':
  169. case 'O':
  170. options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/
  171. options.c_iflag |= INPCK; /* Disnable parity checking */
  172. break;
  173. case 'e':
  174. case 'E':
  175. options.c_cflag |= PARENB; /* Enable parity */
  176. options.c_cflag &= ~PARODD; /* */
  177. options.c_iflag |= INPCK; /* Disnable parity checking */
  178. break;
  179. case 'S':
  180. case 's': /*as no parity*/
  181. options.c_cflag &= ~PARENB;
  182. options.c_cflag &= ~CSTOPB;
  183. break;
  184. default:
  185. fprintf(stderr,"Unsupported parity\n");
  186. return (FALSE);
  187. }
  188. /**/
  189. switch (stopbits)
  190. {
  191. case 1:
  192. options.c_cflag &= ~CSTOPB;
  193. break;
  194. case 2:
  195. options.c_cflag |= CSTOPB;
  196. break;
  197. default:
  198. fprintf(stderr,"Unsupported stop bits\n");
  199. return (FALSE);
  200. }
  201. /* Set input parity option */
  202. if (parity != 'n')
  203. options.c_iflag |= INPCK;
  204. options.c_cc[VTIME] = 150; // 15 seconds
  205. options.c_cc[VMIN] = 0;
  206. options.c_lflag &= ~(ICANON |ISIG);
  207. options.c_iflag &= ~(ICRNL|IGNCR);
  208. tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */
  209. if (tcsetattr(fd,TCSANOW,&options) != 0)
  210. {
  211. printf("SetupSerial 3");
  212. return (FALSE);
  213. }
  214. return (TRUE);
  215. }

智能家居中的物联网网关的可信计算平台模块(TPM)设计的更多相关文章

  1. 迅为4412开发平台Zigbee模块在物联网智能家居中的应用

      物联网智能家居的发展物联网随着互联网的发展,可以通过互联网实现物和物的互联,就有了物联网的概念.传统家居电器 有了物联网之后,在家居电器范围中,就是通过物联网技术将家中的各种设备连接到一起,家居中 ...

  2. 一款新型的智能家居WiFi选择方案——SimpleWiFi在无线智能家居中的应用

    一款新型的智能家居WiFi选择方案——SimpleWiFi在无线智能家居中的应用 先上图:     随着科学技术的不断发展,局域网也正逐渐向无线化,多网合一的方向发展,在这个多网合一快速发展过程中,带 ...

  3. 【智能家居篇】wifi在智能家居中的应用

    转载请注明出处:http://blog.csdn.net/Righthek 谢谢! 在设计智能家居系统方案时,一个很关键的point就是组网方式.组网方式关系到整个智能家居系统的稳定性.可扩展性.实时 ...

  4. 基于能量收集的智能家居-2013国家级大学生创业实践项目申报_商业计划书_V0.2

    SmartHome项目商业计划 基于能量收集的 免电池无线智能家居系统    IA-SmartHome团队    2012.12     l  基于无线的智能家居解决方案,节省施工成本: l  基于能 ...

  5. DIY智能家居——零基础入门篇

    概要 本文主要根据笔者从零开始接触硬件,以小白视角开启IoT探索,根据相关资料DIY一个温湿度传感器.后经过探索发现新大陆--Home Assistant&Homebridge,最终实现了一个 ...

  6. 物联网网关开发:基于MQTT消息总线的设计过程(上)

    道哥的第 021 篇原创 目录 一.前言 二.网关的作用 2.1 指令转发 2.2 外网通信 2.3 协议转换 2.4 设备管理 2.5 边沿计算(自动化控制) 三.网关内部进程之间的通信 3.1 网 ...

  7. 利用Socket与硬件通信(智能家居)

    前几天做一个智能家居APP,硬件段使用的是ESP8266WIFI模块,其实不管是WIFI模块还是蓝牙,通信都是同样一个道理,获取IP和端口来进行通信. 我是通过XCOM v2.0 发送信息,移动端接收 ...

  8. 入门智能家居,从 IFTTT 到 HomeKit 自动化(二)

    入门智能家居,从 IFTTT 到 HomeKit 自动化(二)   目录 0. HomeKit.HomeBridge.HomeAssistant 分别是什么?关系是什么? 1. 开始前的准备 2. 整 ...

  9. Android利用Socket与硬件通信之智能家居APP

    前几天做一个智能家居APP,硬件段使用的是ESP8266WIFI模块,其实不管是WIFI模块还是蓝牙,通信都是同样一个道理,获取IP和端口来进行通信. 我是通过XCOM v2.0 发送信息,移动端接收 ...

随机推荐

  1. MySQL 学习 --- 数据结构和索引

    本文参考了多篇文章集成的笔记,希望各位学习之前可以阅读以下参考资料先 概述 文章分几个部分 :第一部分介绍了B-Tree 和 B+Tree 这种数据结构作为索引:第二部分介绍索引的最左前缀原则和覆盖索 ...

  2. [Linux] Linux系统(用户管理)

    Linux中有三种用户 Root用户:超级管理员 系统用户:Linux运行某些程序所必需的用户,不建议修改 普通用户:一般修改这个 使用命令groupadd,添加用户组,参数:组名称 在文件/etc/ ...

  3. static关键字的内存分析

    通常情况下,Java把内存分为栈内存.堆内存和方法区 栈内存用来存放一些基本类型的变量和数组(数组也是一种引用类型)及对象的引用变量 堆内存主要是来放置对象的,即我们在程序中new出来的对象. sta ...

  4. 设置TableView section header的颜色

      - (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInte ...

  5. Hive Metastore 连接报错

    背景 项目中需要通过一些自定义的组件来操控hive的元数据,于是使用了remote方式来存储hive元数据,使用一个服务后台作为gateway,由它来控制hive元数据. 现象 在windows上连接 ...

  6. html5备忘录——张鑫旭

    by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=1544 一.前言兼图片 ...

  7. canvas框架::createjs入门

    createjs是一个轻量级的框架,稍微有点时间和耐心,就可以把全部源代码都看一遍,毕竟只有三十几个js文件.地址:http://www.createjs.com/ 开发createjs的动画或游戏, ...

  8. javaSE——字节流

    IO流:InputStream/OutputStream 字节流:         文件输出流 :内存 ——>文件 文件输入流 :内存<——文件 应用             文件输入/出 ...

  9. CentOS7.4+MongoBD3.6.4集群(Shard)部署以及大数据量入库

    前言 mongodb支持自动分片,集群自动的切分数据,做负载均衡.避免上面的分片管理难度.mongodb分片是将集合切合成小块,分散到若干片里面,每个片负责所有数据的一部分.这些块对应用程序来说是透明 ...

  10. ComboBox Style

    <SolidColorBrush x:Key="ComboBoxNormalBorderBrush" Color="#e3e9ef" /> < ...