Created
August 12, 2015 12:11
-
-
Save smarthall/875301eb5a6b35378aec to your computer and use it in GitHub Desktop.
LIFX Packet Sending Example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include "lifx.h" | |
#include <arpa/inet.h> | |
#include <sys/socket.h> | |
#include <sys/types.h> | |
#include <unistd.h> | |
#include <stdio.h> | |
#include <string.h> | |
int main(int argc, char** argv) | |
{ | |
int sockaddr_len; | |
int status; | |
struct sockaddr_in listen_addr, broadcast_addr, recv_addr; | |
lifx_header header; | |
sockaddr_len = sizeof(struct sockaddr_in); | |
memset(&listen_addr, 0, sockaddr_len); | |
memset(&broadcast_addr, 0, sockaddr_len); | |
memset(&recv_addr, 0, sockaddr_len); | |
int client_socket = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); | |
listen_addr.sin_addr.s_addr = htonl(INADDR_ANY); | |
listen_addr.sin_port = htons(0); | |
listen_addr.sin_family = AF_INET; | |
status = bind(client_socket, (struct sockaddr*)&listen_addr, sockaddr_len); | |
printf("Client Bind Status: %d\n", status); | |
int yes = 1; | |
status = setsockopt(client_socket, SOL_SOCKET, SO_BROADCAST, (const char*)&yes, sizeof(int)); | |
printf("Setsockopt Status: %d\n", status); | |
// Send a packet | |
broadcast_addr.sin_addr.s_addr = htonl(INADDR_BROADCAST); // broadcast | |
broadcast_addr.sin_port = htons(56700); | |
broadcast_addr.sin_family = AF_INET; | |
memset(&header, 0, sizeof(lifx_header)); | |
header.size = sizeof(lifx_header); | |
header.origin = 0; | |
header.tagged = 1; | |
header.addressable = 1; | |
header.protocol = 1024; | |
header.source = 123; | |
header.target[0] = 0; | |
header.target[1] = 0; | |
header.target[2] = 0; | |
header.target[3] = 0; | |
header.target[4] = 0; | |
header.target[5] = 0; | |
header.target[6] = 0; | |
header.target[7] = 0; | |
header.ack_required = 0; | |
header.res_required = 1; | |
header.sequence = 100; | |
header.type = 2; // GetService | |
status = sendto(client_socket, (const char*)&header, sizeof(lifx_header), 0, (struct sockaddr*)&broadcast_addr, sockaddr_len); | |
printf("Client Sendto Status: %d\n", status); | |
// Receive a packet - should be the broadcast message | |
lifx_header recv_header; | |
status = recvfrom(client_socket, (char*)&recv_header, sizeof(lifx_header), 0, (struct sockaddr*)&recv_addr, (int*)(&sockaddr_len)); | |
printf("Server recvfrom: %d\n", status); | |
if (status > 0) | |
{ | |
printf("Received message of type %d\n", recv_header.type); | |
printf("Sequence is %d\n", recv_header.sequence); | |
} | |
close(client_socket); | |
return 0; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#pragma once | |
#include <stdint.h> | |
#pragma pack(push, 1) | |
typedef struct { | |
/* frame */ | |
uint16_t size; | |
uint16_t protocol:12; | |
uint8_t addressable:1; | |
uint8_t tagged:1; | |
uint8_t origin:2; | |
uint32_t source; | |
/* frame address */ | |
uint8_t target[8]; | |
uint8_t reserved[6]; | |
uint8_t res_required:1; | |
uint8_t ack_required:1; | |
uint8_t :6; | |
uint8_t sequence; | |
/* protocol header */ | |
uint64_t :64; | |
uint16_t type; | |
uint16_t :16; | |
/* variable length payload follows */ | |
} lifx_header; | |
#pragma pack(pop) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Compile with:
Run with: