#include #include #include #include #include #include #include #include "../src/util.h" 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, void *buf, uint16_t size, uint16_t id, void *context) { const uint32_t flags = SKIPSTONE_SYSTEM_CLIENT_TELEPHONY | SKIPSTONE_SYSTEM_CLIENT_SMS | SKIPSTONE_SYSTEM_CLIENT_ANDROID; return skipstone_system_send_client_version(service, flags); } static int answer_music_message(skipstone_message_service *service, void *buf, uint16_t size, uint16_t id, void *context) { 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); 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); 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); } else { printf("Got playback command %02x\n", ((uint8_t *)buf)[0]); } return 0; } static int answer_phone_message(skipstone_message_service *service, void *buf, uint16_t size, uint16_t id, void *context) { printf("Got phone command %02x\n", ((uint8_t *)buf)[0]); 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) { perror("skipstone_link_open_serial()"); goto error_link_open; } if ((service = skipstone_message_service_new()) == NULL) { perror("skipstone_message_service_new()"); goto error_message_service_new; } skipstone_message_service_register(service, 17, answer_phone_version_message, NULL); skipstone_message_service_register(service, 32, answer_music_message, NULL); skipstone_message_service_register(service, 33, answer_phone_message, NULL); time_t start = time(NULL); int done = 0; while (1) { struct timeval timeout = { .tv_sec = 0, .tv_usec = 50000 }; if (skipstone_message_service_next_event(service, link, &timeout) < 0) { perror("skipstone_message_service_next_event()"); goto error_io; } 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, "+19005556969", 12); skipstone_message_append_string(message, "XANTRONIX ehf", 13); skipstone_message_service_queue(service, message, 0x21); skipstone_message_destroy(message); done = 1; } } skipstone_link_close(link); return 0; error_io: error_message_service_new: skipstone_link_close(link); error_link_open: return 1; }