Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/share/examples/rump Add an example/test program for rump blu...
details: https://anonhg.NetBSD.org/src/rev/ef02598c7e8e
branches: trunk
changeset: 753287:ef02598c7e8e
user: pooka <pooka%NetBSD.org@localhost>
date: Mon Mar 22 12:21:37 2010 +0000
description:
Add an example/test program for rump bluetooth. This does discovery
and prints the address and name of the first peer encountered (if any):
ubt0 at uhub0 port 1
ubt0: Cambridge Silicon Radio Bluetooth USB Adapter, rev 2.00/19.15, addr 2
device ubt0, addr xx:xx:xx:xx:xx:xx
my peer: yy:yy:yy:yy:yy:yy, major class: 2 (phone)
peer name: Mokia maailmalta
diffstat:
share/examples/rump/Makefile | 4 +-
share/examples/rump/btplay/Makefile | 16 +++
share/examples/rump/btplay/btplay.c | 191 ++++++++++++++++++++++++++++++++++++
3 files changed, 209 insertions(+), 2 deletions(-)
diffs (228 lines):
diff -r febb25b989fc -r ef02598c7e8e share/examples/rump/Makefile
--- a/share/examples/rump/Makefile Mon Mar 22 12:14:51 2010 +0000
+++ b/share/examples/rump/Makefile Mon Mar 22 12:21:37 2010 +0000
@@ -1,7 +1,7 @@
-# $NetBSD: Makefile,v 1.3 2010/03/07 23:28:14 pooka Exp $
+# $NetBSD: Makefile,v 1.4 2010/03/22 12:21:37 pooka Exp $
#
-SUBDIR= img2cgd sdread swwdog_arm tipsy ttyserv ulptprint umserv \
+SUBDIR= btplay img2cgd sdread swwdog_arm tipsy ttyserv ulptprint umserv \
ukbd_read ums_draw wirelessconf
.include <bsd.subdir.mk>
diff -r febb25b989fc -r ef02598c7e8e share/examples/rump/btplay/Makefile
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/share/examples/rump/btplay/Makefile Mon Mar 22 12:21:37 2010 +0000
@@ -0,0 +1,16 @@
+# $NetBSD: Makefile,v 1.1 2010/03/22 12:21:37 pooka Exp $
+#
+
+PROG= btplay
+
+LDADD+= -lrumpdev_ubt -lrumpdev_usb -lrumpdev_ugenhc -lrumpdev
+LDADD+= -lrumpnet_netbt -lrumpnet
+LDADD+= -lrump
+LDADD+= -lrumpuser -lpthread
+LDADD+= -lbluetooth
+
+DBG= -g
+NOMAN=
+WARNS= 4
+
+.include <bsd.prog.mk>
diff -r febb25b989fc -r ef02598c7e8e share/examples/rump/btplay/btplay.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/share/examples/rump/btplay/btplay.c Mon Mar 22 12:21:37 2010 +0000
@@ -0,0 +1,191 @@
+/* $NetBSD: btplay.c,v 1.1 2010/03/22 12:21:37 pooka Exp $ */
+
+/*
+ * Copyright (c) 2010 Antti Kantee. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * Little demo showing how to use bluetooth stack in rump. Searches
+ * for a peer and prints a little info for it.
+ */
+
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+
+#include <rump/rump.h>
+#include <rump/rump_syscalls.h>
+
+#include <netbt/bluetooth.h>
+#include <netbt/hci.h>
+
+#include <bluetooth.h>
+#include <err.h>
+#include <paths.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+const char *btclasses[] = {
+ "misc.",
+ "computer",
+ "phone",
+ "LAN",
+ "audio-video",
+ "peripheral",
+ "imaging",
+ "wearable",
+ "toy",
+};
+
+int
+main(int argc, char *argv[])
+{
+ struct sockaddr_bt sbt;
+ bdaddr_t peeraddr;
+ uint8_t msg[1024];
+ hci_inquiry_cp inq;
+ hci_cmd_hdr_t *cmd;
+ hci_event_hdr_t *evp;
+ struct hci_filter filt;
+ struct btreq btr;
+ int s, gotpeer = 0;
+
+ rump_boot_sethowto(RUMP_AB_VERBOSE);
+ rump_init();
+
+ s = rump_sys_socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI);
+ if (s == -1)
+ err(1, "socket");
+
+ /* enable first device, print name and address */
+ memset(&btr, 0, sizeof(btr));
+ if (rump_sys_ioctl(s, SIOCNBTINFO, &btr) == -1)
+ err(1, "no bt device?");
+
+ btr.btr_flags |= BTF_UP;
+ if (rump_sys_ioctl(s, SIOCSBTFLAGS, &btr) == -1)
+ err(1, "raise interface");
+ if (rump_sys_ioctl(s, SIOCGBTINFO, &btr) == -1)
+ err(1, "reget info");
+
+ memset(&sbt, 0, sizeof(sbt));
+ sbt.bt_len = sizeof(sbt);
+ sbt.bt_family = AF_BLUETOOTH;
+ bdaddr_copy(&sbt.bt_bdaddr, &btr.btr_bdaddr);
+
+ if (rump_sys_bind(s, (struct sockaddr *)&sbt, sizeof(sbt)) == -1)
+ err(1, "bind");
+ if (rump_sys_connect(s, (struct sockaddr *)&sbt, sizeof(sbt)) == -1)
+ err(1, "connect");
+
+ printf("device %s, addr %s\n",
+ btr.btr_name, bt_ntoa(&btr.btr_bdaddr, NULL));
+
+ /* allow to receive various messages we need later */
+ memset(&filt, 0, sizeof(filt));
+ hci_filter_set(HCI_EVENT_COMMAND_COMPL, &filt);
+ hci_filter_set(HCI_EVENT_INQUIRY_RESULT, &filt);
+ hci_filter_set(HCI_EVENT_INQUIRY_COMPL, &filt);
+ hci_filter_set(HCI_EVENT_REMOTE_NAME_REQ_COMPL, &filt);
+ if (rump_sys_setsockopt(s, BTPROTO_HCI, SO_HCI_EVT_FILTER,
+ &filt, sizeof(filt)) == -1)
+ err(1, "setsockopt");
+
+ cmd = (void *)msg;
+ evp = (void *)msg;
+
+ /* discover peer. first, send local access profile general inquiry */
+ inq.lap[0] = 0x33;
+ inq.lap[1] = 0x8b;
+ inq.lap[2] = 0x9e;
+ inq.inquiry_length = 4;
+ inq.num_responses = 1;
+
+ cmd->type = HCI_CMD_PKT;
+ cmd->opcode = htole16(HCI_CMD_INQUIRY);
+ cmd->length = sizeof(inq);
+ memcpy(cmd+1, &inq, sizeof(inq));
+
+ if (rump_sys_sendto(s, msg, sizeof(*cmd)+sizeof(inq), 0, NULL, 0) == -1)
+ err(1, "send inquiry");
+ memset(msg, 0, sizeof(msg));
+ if (rump_sys_recvfrom(s, msg, sizeof(msg), 0, NULL, NULL) == -1)
+ err(1, "recv inq response");
+ if (evp->event != HCI_EVENT_COMMAND_COMPL)
+ errx(1, "excepted command compl");
+
+ /* then, wait for response */
+ for (;;) {
+ if (rump_sys_recvfrom(s, msg, sizeof(msg), 0, NULL, NULL) == -1)
+ err(1, "recv inq result");
+
+ if (evp->event == HCI_EVENT_INQUIRY_COMPL)
+ break;
+ if (evp->event == HCI_EVENT_INQUIRY_RESULT) {
+ hci_inquiry_response *r;
+ unsigned class;
+
+ r = (void *)(msg + sizeof(hci_event_hdr_t)
+ + sizeof(hci_inquiry_result_ep));
+ bdaddr_copy(&peeraddr, &r[0]. bdaddr);
+ printf("my peer: %s, ", bt_ntoa(&peeraddr, NULL));
+ class = r[0].uclass[1] & 0x1f;
+ printf("major class: %d (%s)\n", class,
+ class < __arraycount(btclasses)
+ ? btclasses[class] : "unknown");
+ gotpeer = 1;
+ }
+ }
+
+ /* found peer. ask for its name */
+ if (gotpeer) {
+ hci_remote_name_req_cp nreq;
+ hci_remote_name_req_compl_ep *nresp;
+
+ memset(&nreq, 0, sizeof(nreq));
+ bdaddr_copy(&nreq.bdaddr, &peeraddr);
+
+ cmd->type = HCI_CMD_PKT;
+ cmd->opcode = htole16(HCI_CMD_REMOTE_NAME_REQ);
+ cmd->length = sizeof(nreq);
+ memcpy(cmd+1, &nreq, sizeof(nreq));
+
+ if (rump_sys_sendto(s, msg, sizeof(*cmd)+sizeof(nreq), 0,
+ NULL, 0) == -1)
+ err(1, "send name req");
+ memset(msg, 0, sizeof(msg));
+ if (rump_sys_recvfrom(s, msg, sizeof(msg), 0, NULL, NULL) == -1)
+ err(1, "recv inq response");
+ if (evp->event != HCI_EVENT_REMOTE_NAME_REQ_COMPL)
+ errx(1, "excepted nreq compl");
+
+ nresp = (void *)(evp+1);
+ printf("peer name: %s\n", nresp->name);
+ }
+
+ return 0;
+}
Home |
Main Index |
Thread Index |
Old Index