aboutsummaryrefslogtreecommitdiff
path: root/nimbluez/bluetoothnet.nim
blob: ac794fa832c496b3430bdd0f967f6a56dfbe1578 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# Copyright (c) 2016, Maxim V. Abramov
# All rights reserved.
# Look at license.txt for more info.

## This module implements a high-level cross-platform sockets interface for
## Bluetooth.
## This module is just a draft yet.

import os
import bluetoothnativesockets

proc bindAddr*(socket: SocketHandle, port = RfcommPort(0), address = ""): cint =
  ## Binds a Bluetooth RFCOMM socket.
  var name = getRfcommAddr(port, address)
  result = bindAddr(socket,
                    cast[ptr SockAddr](addr(name)),
                    sizeof(name).SockLen)


proc bindAddr*(socket: SocketHandle, port: L2capPort, address = ""): cint =
  ## Binds a Bluetooth L2CAP socket.
  var name = getL2capAddr(port, address)
  result = bindAddr(socket,
                    cast[ptr SockAddr](addr(name)),
                    sizeof(name).SockLen)


proc acceptRfcommAddr*(server: SocketHandle,
                       address: var string): SocketHandle =
  ## Enables incoming connection attempts on a Bluetooth RFCOMM socket.
  var sockAddr = getRfcommAddr()
  var addrLen = sizeof(sockAddr).SockLen
  result = accept(server, cast[ptr SockAddr](addr(sockAddr)), addr(addrLen))
  address = getAddrString(sockAddr)


proc acceptL2capAddr*(server: SocketHandle, address: var string): SocketHandle =
  ## Enables incoming connection attempts on a Bluetooth L2CAP socket.
  var sockAddr = getL2capAddr()
  var addrLen = sizeof(sockAddr).SockLen
  result = accept(server, cast[ptr SockAddr](addr(sockAddr)), addr(addrLen))
  address = getAddrString(sockAddr)


proc connect*(socket: SocketHandle, port: RfcommPort, address: string): cint =
  ## Connects to a target Bluetooth device, using a previously created Bluetooth RFCOMM socket.
  var name = getRfcommAddr(port, address)
  result = connect(socket, cast[ptr SockAddr](addr(name)), sizeof(name).SockLen)


proc connect*(socket: SocketHandle, port: L2capPort, address: string): cint =
  ## Connects to a target Bluetooth device, using a previously created Bluetooth L2CAP socket.
  var name = getL2capAddr(port, address)
  result = connect(socket, cast[ptr SockAddr](addr(name)), sizeof(name).SockLen)


proc send*(socket: SocketHandle, message: string): cint =
  ## Sends data on a connected socket.
  result = send(socket, cstring(message), cint(message.len), cint(0)).cint


proc recv*(socket: SocketHandle): string =
  ## Receives data from a connected socket.
  result = ""
  result.setLen(1000)
  let recvLen = recv(socket, cstring(result), cint(result.len), cint(0))
  if recvLen < 0'i32:
    raiseOSError(osLastError())
  result.setLen(recvLen)