mirror of
				https://github.com/taigrr/tplinkController
				synced 2025-01-18 04:43:13 -08:00 
			
		
		
		
	Initial commit
This commit is contained in:
		
						commit
						ff94868a65
					
				
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | ||||
| hs100 | ||||
| *.o | ||||
| *.swp | ||||
							
								
								
									
										12
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								Makefile
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | ||||
| target  ?= hs100 | ||||
| objects := $(patsubst %.c,%.o,$(wildcard *.c)) | ||||
| CFLAGS=-Wall -Werror -std=c99 -ggdb -Os | ||||
| 
 | ||||
| .PHONY: all | ||||
| all:	$(target) | ||||
| 
 | ||||
| .PHONY: clean | ||||
| clean: | ||||
| 	rm -f $(target) $(objects) | ||||
| 
 | ||||
| $(target): $(objects) | ||||
							
								
								
									
										118
									
								
								comms.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								comms.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,118 @@ | ||||
| #include <stddef.h> | ||||
| #include <inttypes.h> | ||||
| #include <stdbool.h> | ||||
| #include <string.h> | ||||
| #include <stdlib.h> | ||||
| #include <arpa/inet.h> | ||||
| #include <sys/socket.h> | ||||
| #include <unistd.h> | ||||
| #include "comms.h" | ||||
| 
 | ||||
| bool hs100_encrypt(uint8_t *d, uint8_t *s, size_t len) | ||||
| { | ||||
| 	if(d == NULL) | ||||
| 		return false; | ||||
| 	if(s == NULL) | ||||
| 		return false; | ||||
| 	if(len == 0) | ||||
| 		return false; | ||||
| 	 | ||||
| 	uint8_t key = 0xab; | ||||
| 	for(size_t i=0; i<len; i++) { | ||||
| 		uint8_t temp = key ^ s[i]; | ||||
| 		key = temp; | ||||
| 		d[i] = temp; | ||||
| 	} | ||||
| 	return true; | ||||
| } | ||||
| 
 | ||||
| bool hs100_decrypt(uint8_t *d, uint8_t *s, size_t len) | ||||
| { | ||||
| 	if(d == NULL) | ||||
| 		return false; | ||||
| 	if(s == NULL) | ||||
| 		return false; | ||||
| 	if(len == 0) | ||||
| 		return false; | ||||
| 	 | ||||
| 	uint8_t key = 0xab; | ||||
| 	for(size_t i=0; i<len; i++) { | ||||
| 		uint8_t temp = key ^ s[i]; | ||||
| 		key = s[i]; | ||||
| 		d[i] = temp; | ||||
| 	} | ||||
| 	return true; | ||||
| } | ||||
| 
 | ||||
| uint8_t *hs100_encode(size_t *outlen, char *srcmsg) | ||||
| { | ||||
| 	if(srcmsg == NULL) return NULL; | ||||
| 
 | ||||
| 	size_t srcmsg_len = strlen(srcmsg); | ||||
| 	*outlen = srcmsg_len + 4; | ||||
| 	uint8_t *d = calloc(1, *outlen); | ||||
| 	if(d == NULL) return NULL; | ||||
| 	if(!hs100_encrypt(d+4, (uint8_t *)srcmsg, srcmsg_len)) { | ||||
| 		free(d); | ||||
| 		return NULL; | ||||
| 	} | ||||
| 	uint32_t temp = htonl(srcmsg_len); | ||||
| 	memcpy(d, &temp, 4); | ||||
| 
 | ||||
| 	return d; | ||||
| } | ||||
| 
 | ||||
| char *hs100_decode(uint8_t *s, size_t s_len) | ||||
| { | ||||
| 	if(s == NULL) return NULL; | ||||
| 	if(s_len <= 4) return NULL; | ||||
| 	 | ||||
| 	uint32_t in_s_len; | ||||
| 	memcpy(&in_s_len, s, 4); | ||||
| 	in_s_len = ntohl(in_s_len); | ||||
| 
 | ||||
| 	char *outbuf = calloc(1,in_s_len+1); | ||||
| 
 | ||||
| 	if(!hs100_decrypt((uint8_t*)outbuf, s+4, in_s_len)) { | ||||
| 		free(outbuf); | ||||
| 		return NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	return outbuf; | ||||
| } | ||||
| 
 | ||||
| char *hs100_send(char *servaddr, char *msg) | ||||
| { | ||||
| 	size_t s_len; | ||||
| 	uint8_t *s = hs100_encode(&s_len, msg); | ||||
| 	if(s == NULL) | ||||
| 		return NULL; | ||||
| 
 | ||||
| 	int sock = socket(AF_INET, SOCK_STREAM, 0); | ||||
| 	if(sock < 0) return NULL; | ||||
| 	 | ||||
| 	struct sockaddr_in address; | ||||
| 	memset(&address, '0', sizeof(struct sockaddr_in)); | ||||
| 
 | ||||
| 	address.sin_family = AF_INET; | ||||
| 	address.sin_port = htons(9999); | ||||
| 
 | ||||
| 	if(inet_pton(AF_INET, servaddr, &address.sin_addr)<=0) | ||||
| 		return NULL; | ||||
| 	 | ||||
| 	if(connect(sock, (struct sockaddr *)&address, | ||||
| 		sizeof(struct sockaddr_in)) < 0) | ||||
| 		return NULL; | ||||
| 
 | ||||
| 	send(sock, s, s_len, 0); | ||||
| 	uint8_t recvbuf[1024]; | ||||
| 	recv(sock, recvbuf, 1023, 0); | ||||
| 	char *recvmsg = hs100_decode(recvbuf, 1023); | ||||
| 	close(sock); | ||||
| 	if(recvmsg == NULL) { | ||||
| 		free(s); | ||||
| 		return NULL; | ||||
| 	} | ||||
| 
 | ||||
| 	return recvmsg; | ||||
| } | ||||
							
								
								
									
										5
									
								
								comms.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								comms.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,5 @@ | ||||
| #ifndef __COMMS_H__ | ||||
| #define __COMMS_H__ | ||||
| 
 | ||||
| char *hs100_send(char *servaddr, char *msg); | ||||
| #endif /* __COMMS_H__ */ | ||||
							
								
								
									
										56
									
								
								hs100.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								hs100.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,56 @@ | ||||
| #include <stdio.h> | ||||
| #include <inttypes.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include "comms.h" | ||||
| 
 | ||||
| struct cmd_alias_s { | ||||
| 	char *alias; | ||||
| 	char *command; | ||||
| 	int end; | ||||
| }; | ||||
| struct cmd_alias_s cmd_aliases[] = { | ||||
| 	{ | ||||
| 		.alias = "off", | ||||
| 		.command = "{\"system\":{\"set_relay_state\":{\"state\":0}}}", | ||||
| 	}, | ||||
| 	{ | ||||
| 		.alias = "on", | ||||
| 		.command = "{\"system\":{\"set_relay_state\":{\"state\":1}}}", | ||||
| 	}, | ||||
| 	{ | ||||
| 		.end = 1, | ||||
| 	}, | ||||
| }; | ||||
| 
 | ||||
| char *get_cmd(char *needle) | ||||
| { | ||||
| 	int cmds_index = 0; | ||||
| 	while(!cmd_aliases[cmds_index].end) | ||||
| 	{ | ||||
| 		if(!strcmp(cmd_aliases[cmds_index].alias, needle)) | ||||
| 			return cmd_aliases[cmds_index].command; | ||||
| 		cmds_index++; | ||||
| 	} | ||||
| 	return needle; | ||||
| } | ||||
| 
 | ||||
| int main(int argc, char *argv[]) | ||||
| { | ||||
| 	char *plug_addr = argv[1]; | ||||
| 	char *cmd = argv[2]; | ||||
| 
 | ||||
| 	cmd = get_cmd(cmd); | ||||
| 	 | ||||
| 	char *response = hs100_send(plug_addr, cmd); | ||||
| 	 | ||||
| 	if(response == NULL) { | ||||
| 		fprintf(stderr, "failed to send command\n"); | ||||
| 		return 1; | ||||
| 	} | ||||
| 
 | ||||
| 	printf("%s\n", response); | ||||
| 
 | ||||
| 	free(response); | ||||
| 	return 0; | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user