2017-11-23 18:24:16 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include <string.h>
|
2017-11-29 20:59:45 -06:00
|
|
|
#include <time.h>
|
2017-11-23 18:24:16 +00:00
|
|
|
|
|
|
|
#include <skipstone/link.h>
|
|
|
|
#include <skipstone/message.h>
|
2017-11-26 16:22:00 -06:00
|
|
|
#include <skipstone/system.h>
|
2017-11-23 18:24:16 +00:00
|
|
|
|
2017-11-26 18:31:13 -06:00
|
|
|
#include "../src/util.h"
|
|
|
|
|
2017-11-23 18:24:16 +00:00
|
|
|
static void usage(int argc, char **argv) {
|
|
|
|
fprintf(stderr, "usage: %s /dev/rfcommX\n", argv[0]);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
static int answer_phone_version_message(skipstone_message_service *service,
|
2017-11-24 12:28:49 -06:00
|
|
|
void *buf, uint16_t size, uint16_t id, void *context) {
|
2017-11-26 16:22:00 -06:00
|
|
|
const uint32_t flags = SKIPSTONE_SYSTEM_CLIENT_ANDROID;
|
2017-11-24 11:57:55 -06:00
|
|
|
|
2017-11-26 16:22:00 -06:00
|
|
|
return skipstone_system_send_client_version(service, flags);
|
2017-11-24 11:57:55 -06:00
|
|
|
}
|
|
|
|
|
2017-11-26 16:22:00 -06:00
|
|
|
static int answer_music_message(skipstone_message_service *service,
|
2017-11-24 12:28:49 -06:00
|
|
|
void *buf, uint16_t size, uint16_t id, void *context) {
|
2017-11-26 18:31:13 -06:00
|
|
|
skipstone_message *message;
|
|
|
|
|
|
|
|
if (((uint8_t *)buf)[0] == 0x08) {
|
|
|
|
message = skipstone_message_new();
|
|
|
|
skipstone_message_append_uint8(message, 0x10);
|
|
|
|
skipstone_message_append_string(message, "KMFDM", 5);
|
|
|
|
skipstone_message_append_string(message, "Nihil", 5);
|
|
|
|
skipstone_message_append_string(message, "Ultra", 5);
|
|
|
|
skipstone_message_append_uint32(message, htobe32(274));
|
|
|
|
skipstone_message_append_uint16(message, htobe16(10));
|
|
|
|
skipstone_message_append_uint16(message, htobe16(1));
|
|
|
|
skipstone_message_service_queue(service, message, 32);
|
|
|
|
skipstone_message_destroy(message);
|
2017-11-24 17:44:40 +00:00
|
|
|
|
2017-11-26 18:31:13 -06:00
|
|
|
message = skipstone_message_new();
|
|
|
|
skipstone_message_append_uint8(message, 0x11);
|
|
|
|
skipstone_message_append_uint8(message, 1);
|
|
|
|
skipstone_message_append_uint32(message, htobe32(120));
|
|
|
|
skipstone_message_append_uint32(message, htobe32(1));
|
|
|
|
skipstone_message_append_uint8(message, 1);
|
|
|
|
skipstone_message_append_uint8(message, 1);
|
|
|
|
skipstone_message_service_queue(service, message, 32);
|
|
|
|
skipstone_message_destroy(message);
|
2017-11-24 15:25:28 -06:00
|
|
|
|
2017-11-26 18:31:13 -06:00
|
|
|
message = skipstone_message_new();
|
|
|
|
skipstone_message_append_uint8(message, 0x13);
|
|
|
|
skipstone_message_append_string(message, "DeaDBeeF", 8);
|
|
|
|
skipstone_message_append_string(message, "DeaDBeeF", 8);
|
|
|
|
skipstone_message_service_queue(service, message, 32);
|
|
|
|
skipstone_message_destroy(message);
|
2017-11-29 20:59:45 -06:00
|
|
|
} else {
|
|
|
|
printf("Got playback command %02x\n", ((uint8_t *)buf)[0]);
|
2017-11-26 18:31:13 -06:00
|
|
|
}
|
2017-11-23 18:24:16 +00:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int main(int argc, char **argv) {
|
|
|
|
skipstone_link *link;
|
|
|
|
skipstone_message_service *service;
|
|
|
|
|
|
|
|
if (argc != 2) {
|
|
|
|
usage(argc, argv);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((link = skipstone_link_open_serial(argv[1])) == NULL) {
|
2017-11-26 19:21:35 -06:00
|
|
|
perror("skipstone_link_open_serial()");
|
2017-11-23 18:24:16 +00:00
|
|
|
goto error_link_open;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ((service = skipstone_message_service_new()) == NULL) {
|
2017-11-26 19:21:35 -06:00
|
|
|
perror("skipstone_message_service_new()");
|
2017-11-23 18:24:16 +00:00
|
|
|
goto error_message_service_new;
|
|
|
|
}
|
|
|
|
|
|
|
|
skipstone_message_service_register(service, 17, answer_phone_version_message, NULL);
|
2017-11-26 16:22:00 -06:00
|
|
|
skipstone_message_service_register(service, 32, answer_music_message, NULL);
|
2017-11-23 18:24:16 +00:00
|
|
|
|
2017-11-29 20:59:45 -06:00
|
|
|
time_t start = time(NULL);
|
|
|
|
int done = 0;
|
|
|
|
|
2017-11-29 20:33:01 -06:00
|
|
|
while (1) {
|
|
|
|
struct timeval timeout = {
|
|
|
|
.tv_sec = 0,
|
|
|
|
.tv_usec = 50000
|
|
|
|
};
|
2017-11-23 18:24:16 +00:00
|
|
|
|
2017-11-29 20:33:01 -06:00
|
|
|
if (skipstone_message_service_next_event(service, link, &timeout) < 0) {
|
|
|
|
perror("skipstone_message_service_next_event()");
|
|
|
|
|
|
|
|
goto error_io;
|
|
|
|
}
|
2017-11-29 20:59:45 -06:00
|
|
|
|
|
|
|
if (!done && time(NULL) - start >= 10) {
|
|
|
|
skipstone_message *message = skipstone_message_new();
|
|
|
|
skipstone_message_append_uint8(message, 4);
|
|
|
|
skipstone_message_append_uint32(message, htobe32(0xdeadbeef));
|
|
|
|
skipstone_message_append_string(message, "+19004206969", 12);
|
|
|
|
skipstone_message_append_string(message, "XANTRONIX ehf", 13);
|
|
|
|
skipstone_message_service_queue(service, message, 0x21);
|
|
|
|
skipstone_message_destroy(message);
|
|
|
|
|
|
|
|
done = 1;
|
|
|
|
}
|
2017-11-29 20:33:01 -06:00
|
|
|
}
|
2017-11-26 19:21:35 -06:00
|
|
|
|
2017-11-23 18:24:16 +00:00
|
|
|
skipstone_link_close(link);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
2017-11-29 20:33:01 -06:00
|
|
|
error_io:
|
2017-11-23 18:24:16 +00:00
|
|
|
error_message_service_new:
|
|
|
|
skipstone_link_close(link);
|
|
|
|
|
|
|
|
error_link_open:
|
|
|
|
return 1;
|
|
|
|
}
|